diff --git a/app/fin/constants/bill_types.go b/app/fin/constants/bill_types.go
index c3d190e8ad634d7d2ca63aae0c6f22401bcddd95..7513ff4285a40564d155d47ecb5ecea5bf1d7ac8 100644
--- a/app/fin/constants/bill_types.go
+++ b/app/fin/constants/bill_types.go
@@ -6,11 +6,11 @@ var BillTypeEnum = enum.New[struct {
 	EcsElectric string `enum:"0"` // 能耗电表计费
 	EcsWater    string `enum:"1"` // 能耗水计费
 	EcsGas      string `enum:"2"` // 能耗燃气计费
-	SElectric   string `enum:"6"` // 公摊摊电
-	SWater      string `enum:"7"` // 公摊水
-	SGas        string `enum:"8"` // 公摊燃气
-	SAtt        string `enum:"9"` // 公摊附加
-	AElectric   string `enum:"3"` // 分摊电
-	AWater      string `enum:"4"` // 分摊水
-	AGas        string `enum:"5"` // 分摊燃气
+	SElectric   string `enum:"3"` // 公摊摊电
+	SWater      string `enum:"4"` // 公摊水
+	SGas        string `enum:"5"` // 公摊燃气
+	SAtt        string `enum:"6"` // 公摊附加
+	AElectric   string `enum:"7"` // 分摊电
+	AWater      string `enum:"8"` // 分摊水
+	AGas        string `enum:"9"` // 分摊燃气
 }]()
diff --git a/app/fin/constants/ecs_types.go b/app/fin/constants/ecs_types.go
new file mode 100644
index 0000000000000000000000000000000000000000..909595e1f076f7872840723748380f3630c4534c
--- /dev/null
+++ b/app/fin/constants/ecs_types.go
@@ -0,0 +1,11 @@
+package constants
+
+var ecsTypeEnum = map[string]string{
+	"electric": "电",
+	"water":    "水",
+	"gas":      "气",
+}
+
+func GetEcsTypeName(ecsType string) string {
+	return ecsTypeEnum[ecsType]
+}
diff --git a/app/fin/constants/payment_method_types.go b/app/fin/constants/payment_method_types.go
index c1bb8f45eb785683e4539c243cf10026b8ecdddb..4e9c2e2ec28a89204d60a72411a3e51c8a825404 100644
--- a/app/fin/constants/payment_method_types.go
+++ b/app/fin/constants/payment_method_types.go
@@ -10,5 +10,5 @@ var paymentMethodEnum = map[string]string{
 }
 
 func GetPaymentMethod(paymentMethod string) string {
-	return feeNameEnum[paymentMethod]
+	return paymentMethodEnum[paymentMethod]
 }
diff --git a/app/fin/constants/task_keys.go b/app/fin/constants/task_keys.go
index 2f4bdd919cd4f0a79ce741e4272b642d0be67ed2..b53be57a10082cb24c7e3875514568daf662275e 100644
--- a/app/fin/constants/task_keys.go
+++ b/app/fin/constants/task_keys.go
@@ -1,6 +1,7 @@
 package constants
 
 const (
+	Lock_key_Precalc   = "lock:key:precalc"
 	Lock_key_Ecs       = "lock:key:ecs"
 	Lock_key_SElectric = "lock:key:secs"
 	Lock_key_SWater    = "lock:key:swater"
@@ -10,6 +11,8 @@ const (
 	Lock_key_AWater    = "lock:key:awater"
 	Lock_key_AGas      = "lock:key:agas"
 
-	Task_Fee_Que    = "task_fee_queue"
 	Dev_Control_Que = "dev:control:queue"
+	Task_Purse_Que  = "task:purse:queue"
+	Task_Bill_Que   = "task:bill:queue"
+	Task_Shared_Que = "task:shared:queue"
 )
diff --git a/app/fin/model/apportion_model.go b/app/fin/model/apportion_model.go
index b25693469622b787573b8466cf35e4282178b115..22912bc8bdf6d5ac7782b5a0a737a2a839ddc609 100644
--- a/app/fin/model/apportion_model.go
+++ b/app/fin/model/apportion_model.go
@@ -11,11 +11,11 @@ type FinApportionSchemes struct {
 	SchemeName   string `json:"schemeName" gorm:"type:varchar(100);index;comment:'方案名称'"`                                       // 方案名称
 	AreaType     string `json:"areaType" gorm:"index;comment:'面积类型(build:建筑面积,used:使用面积,fee:收费面积,share:公摊面积)';default='build'"` // 面积类型(build:建筑面积,used:使用面积,fee:收费面积,share:公摊面积)
 	SchemeType   string `json:"schemeType" gorm:"index;comment:'方案类型(water:水,electic:电,gas:气)'"`                                // 方案类型(water:水,electic:电,gas:气)
-	RoundMethod  string `json:"roundMethod" gorm:"comment:'取舍方式(round:四舍五入,up:进一法,trunc:舍尾)';default:'round'""`                 // 取舍方式
-	DecimalBit   int8   `json:"decimalBit" gorm:"comment:'小数位数'""`                                                              // 小数位数
-	SharedMethod string `json:"sharedMethod" gorm:"index;comment:'分摊方式(ratio:比例,area:面积,avg:平均)';default='ratio'"`              // 分摊方式(ratio:比例,area:面积,avg:平均)
-	SharedType   string `json:"sharedType" gorm:"index;comment:'分摊类型(qt:用量,amt:金额)';default='qt'"`                              // 分摊类型(qt:用量,amt:金额)
-	SharedUser   string `json:"sharedUser" gorm:"index;comment:'分摊人员(cust:租客,all:租客+业主)';default='cust'"`                       // 分摊人员(cust:租客,all:租客+业主)
+	RoundMethod  string `json:"roundMethod" gorm:"comment:'取舍方式(round:四舍五入,up:进一法,trunc:舍尾)';default:'round'"`                  // 取舍方式
+	DecimalBit   int8   `json:"decimalBit" gorm:"comment:'小数位数'"`                                                               // 小数位数
+	SharedMethod string `json:"sharedMethod" gorm:"comment:'分摊方式(ratio:比例,area:面积,avg:平均)';default='ratio'"`                    // 分摊方式(ratio:比例,area:面积,avg:平均)
+	SharedType   string `json:"sharedType" gorm:"comment:'分摊类型(qt:用量,amt:金额)';default='qt'"`                                    // 分摊类型(qt:用量,amt:金额)
+	SharedUser   string `json:"sharedUser" gorm:"comment:'分摊人员(cust:租客,all:租客+业主)';default='cust'"`                             // 分摊人员(cust:租客,all:租客+业主)
 	TenantId     uint   `json:"tenantId" gorm:"default:0;comment:所属租户ID;index"`
 	collection.NewModel
 }
diff --git a/app/fin/model/bill_model.go b/app/fin/model/bill_model.go
index 122581c0c53f8edc926dd4c72c32f83a7d5bc3b5..8b2c852ee3e822a9991d57136655054dc69893da 100644
--- a/app/fin/model/bill_model.go
+++ b/app/fin/model/bill_model.go
@@ -8,37 +8,39 @@ import (
 
 // FinBill [财务]-收银台-账单实体
 type FinBill struct {
-	Id              uint      `gorm:"primarykey;comment:'主键'"`                                           // 主键
-	BillType        string    `gorm:"comment:'账单类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)'"` // 账单类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
-	SchemeId        uint      `gorm:"comment:'方案ID'"`                                                    // 方案ID
-	RegionId        uint      `gorm:"comment:'顶级区域ID'"`                                                  // 顶级区域ID
-	RegionName      string    `gorm:"comment:'顶级区域名'"`                                                   // 顶级区域名
-	AreaId          uint      `gorm:"comment:'区域ID'"`                                                    // 区域ID
-	AreaName        string    `gorm:"comment:'区域名'"`                                                     // 区域名
-	HouseId         uint      `gorm:"comment:'房间ID'"`                                                    // 房间ID
-	HouseName       string    `gorm:"comment:'房间名'"`                                                     // 房间名
-	HouseArea       float64   `gorm:"comment:'房屋面积'"`                                                    // 房屋面积
-	DeviceId        uint      `gorm:"comment:'设备ID'"`                                                    // 设备ID
-	DeviceName      string    `gorm:"comment:'设备名'"`                                                     // 设备名
-	Address         string    `gorm:"comment:'设备地址'"`                                                    // 设备地址
-	OwnerId         uint      `gorm:"comment:'业主ID'"`                                                    // 业主ID
-	OwnerName       string    `gorm:"comment:'业主名'"`                                                     // 业主名
-	StartDate       time.Time `gorm:"comment:'费用起始日期'"`                                                  // 费用起始日期
-	EndDate         time.Time `gorm:"comment:'费用结束日期'"`                                                  // 费用结束日期
-	FeeName         string    `gorm:"comment:'费用名称'"`                                                    // 费用名称
-	BillAmount      float64   `gorm:"comment:'账单金额'"`                                                    // 账单金额
-	UnpaidAmount    float64   `gorm:"comment:'未缴金额'"`                                                    // 未缴金额
-	PaidAmount      float64   `gorm:"comment:'已缴金额'"`                                                    // 已缴金额
-	LateAmount      float64   `gorm:"comment:'滞纳金'"`                                                     // 滞纳金
-	ReductionAmount float64   `gorm:"comment:'减免金额'"`                                                    // 减免金额
-	UsageTotal      float64   `gorm:"comment:'用量'"`                                                      // 用量
-	UsageStart      float64   `gorm:"comment:'开始用量'"`                                                    // 开始用量
-	UsageEnd        float64   `gorm:"comment:'结束用量'"`                                                    // 结束用量
-	FinTime         time.Time `gorm:"comment:'财务时间'"`                                                    // 财务时间
-	EcsTime         time.Time `gorm:"comment:'能耗公摊时间'"`                                                  // 能耗公摊时间
-	TenantId        uint      `gorm:"comment:'租户ID'"`                                                    // 租户ID
-	PayState        string    `gorm:"comment:支付状态;not null;default:'0'"`                                 // 支付状态(0:未支付,1:已支付)
-	OnAccount       string    `gorm:"comment:是否挂账;not null;default:'0'"`                                 // 是否挂账(0:否,1:是)
+	Id              uint      `gorm:"primarykey;comment:'主键'"`                                                        // 主键
+	BillType        string    `gorm:"comment:'账单类型(0:能源电,1:能源水,2:能源气,3:公摊水,4:公摊电,5:公摊燃气,6:公摊附加,7:分摊水,8:分摊电,9:分摊燃气)'"` // 账单类型(0:能源电,1:能源水,2:能源气,3:公摊水,4:公摊电,5:公摊燃气,6:公摊附加,7:分摊水,8:分摊电,9:分摊燃气)
+	SchemeId        uint      `gorm:"comment:'方案ID'"`                                                                 // 方案ID
+	RegionId        uint      `gorm:"comment:'顶级区域ID'"`                                                               // 顶级区域ID
+	RegionName      string    `gorm:"comment:'顶级区域名'"`                                                                // 顶级区域名
+	AreaId          uint      `gorm:"comment:'区域ID'"`                                                                 // 区域ID
+	AreaName        string    `gorm:"comment:'区域名'"`                                                                  // 区域名
+	HouseId         uint      `gorm:"comment:'房间ID'"`                                                                 // 房间ID
+	HouseName       string    `gorm:"comment:'房间名'"`                                                                  // 房间名
+	HouseArea       float64   `gorm:"comment:'房屋面积'"`                                                                 // 房屋面积
+	DeviceId        uint      `gorm:"comment:'设备ID'"`                                                                 // 设备ID
+	DeviceName      string    `gorm:"comment:'设备名'"`                                                                  // 设备名
+	Address         string    `gorm:"comment:'设备地址'"`                                                                 // 设备地址
+	OwnerId         uint      `gorm:"comment:'业主ID'"`                                                                 // 业主ID
+	OwnerName       string    `gorm:"comment:'业主名'"`                                                                  // 业主名
+	StartDate       time.Time `gorm:"comment:'费用起始日期'"`                                                               // 费用起始日期
+	EndDate         time.Time `gorm:"comment:'费用结束日期'"`                                                               // 费用结束日期
+	FeeName         string    `gorm:"comment:'费用名称'"`                                                                 // 费用名称
+	BillAmount      float64   `gorm:"comment:'账单金额'"`                                                                 // 账单金额
+	UnpaidAmount    float64   `gorm:"comment:'未缴金额'"`                                                                 // 未缴金额
+	PaidAmount      float64   `gorm:"comment:'已缴金额'"`                                                                 // 已缴金额
+	LateAmount      float64   `gorm:"comment:'滞纳金'"`                                                                  // 滞纳金
+	ReductionAmount float64   `gorm:"comment:'减免金额'"`                                                                 // 减免金额
+	UsageTotal      float64   `gorm:"comment:'用量'"`                                                                   // 用量
+	UsageStart      float64   `gorm:"comment:'开始用量'"`                                                                 // 开始用量
+	UsageEnd        float64   `gorm:"comment:'结束用量'"`                                                                 // 结束用量
+	FinTime         time.Time `gorm:"comment:'财务时间'"`                                                                 // 财务时间
+	EcsTime         time.Time `gorm:"comment:'能耗公摊时间'"`                                                               // 能耗公摊时间
+	TenantId        uint      `gorm:"comment:'租户ID'"`                                                                 // 租户ID
+	PayState        string    `gorm:"comment:支付状态;not null;default:'0'"`                                              // 支付状态(0:未支付,1:已支付)
+	OnAccount       string    `gorm:"comment:是否挂账;not null;default:'0'"`                                              // 是否挂账(0:否,1:是)
+	BillingMethod   string    `json:"billingMethod" structs:"billingMethod"`                                          // 计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率)
+	StepFee         string    `json:"stepFee" structs:"stepFee"`                                                      // 阶梯费用
 	collection.NewModel
 }
 
diff --git a/app/fin/model/device_record_model.go b/app/fin/model/device_record_model.go
index a6fa318ab3d6c883343f75e4c8b0373a4f493688..39aa60e4c6cf15fe6a8bca3c9e7b7c08c33558c8 100644
--- a/app/fin/model/device_record_model.go
+++ b/app/fin/model/device_record_model.go
@@ -8,23 +8,29 @@ import (
 
 // FinDeviceRecord [财务]-收银台-设备费用实体
 type FinDeviceRecord struct {
-	Id         uint      `gorm:"primarykey;comment:'主键'"`                                             // 主键
-	BillType   string    `gorm:"comment:'设备费用类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)'"` // 设备费用类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
-	SchemeId   uint      `gorm:"comment:'方案ID'"`                                                      // 方案ID
-	RegionId   uint      `gorm:"comment:'顶级区域ID'"`                                                    // 顶级区域ID
-	RegionName string    `gorm:"comment:'顶级区域名'"`                                                     // 顶级区域名
-	AreaId     uint      `gorm:"comment:'区域ID'"`                                                      // 区域ID
-	AreaName   string    `gorm:"comment:'区域名'"`                                                       // 区域名
-	HouseId    uint      `gorm:"comment:'房间ID'"`                                                      // 房间ID
-	HouseName  string    `gorm:"comment:'房间名'"`                                                       // 房间名
-	HouseArea  float64   `gorm:"comment:'房间面积'"`                                                      // 房间面积
-	DeviceId   uint      `gorm:"comment:'设备ID'"`                                                      // 设备ID
-	DeviceName string    `gorm:"comment:'设备名'"`                                                       // 设备名
-	FeeDate    time.Time `gorm:"comment:'费用日期'"`                                                      // 费用日期
-	BillAmount float64   `gorm:"comment:'设备费用金额'"`                                                    // 设备费用金额
-	UsageTotal float64   `gorm:"comment:'用量'"`                                                        // 用量
-	UsageStart float64   `gorm:"comment:'开始用量'"`                                                      // 开始用量
-	UsageEnd   float64   `gorm:"comment:'结束用量'"`                                                      // 结束用量
+	Id             uint      `gorm:"primarykey;comment:'主键'"`                                             // 主键
+	BillType       string    `gorm:"comment:'设备费用类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)'"` // 设备费用类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
+	SchemeId       uint      `gorm:"comment:'方案ID'"`                                                      // 方案ID
+	RegionId       uint      `gorm:"comment:'顶级区域ID'"`                                                    // 顶级区域ID
+	RegionName     string    `gorm:"comment:'顶级区域名'"`                                                     // 顶级区域名
+	AreaId         uint      `gorm:"index;comment:'区域ID'"`                                                // 区域ID
+	AreaName       string    `gorm:"comment:'区域名'"`                                                       // 区域名
+	CommonAreaId   uint      `gorm:"index;comment:'公共区域ID'"`                                              // 公共区域ID
+	CommonAreaName string    `gorm:"comment:'公共区域名'"`                                                     // 公共区域名
+	HouseId        uint      `gorm:"index;comment:'房间ID'"`                                                // 房间ID
+	HouseName      string    `gorm:"comment:'房间名'"`                                                       // 房间名
+	HouseArea      float64   `gorm:"comment:'房间面积'"`                                                      // 房间面积
+	DeviceId       uint      `gorm:"index;comment:'设备ID'"`                                                // 设备ID
+	DeviceName     string    `gorm:"comment:'设备名'"`                                                       // 设备名
+	Address        string    `gorm:"comment:'设备地址'"`                                                      // 设备地址
+	FeeDate        time.Time `gorm:"comment:'费用日期'"`                                                      // 费用日期
+	BillAmount     float64   `gorm:"comment:'设备费用金额'"`                                                    // 设备费用金额
+	UsageTotal     float64   `gorm:"comment:'用量'"`                                                        // 用量
+	UsageStart     float64   `gorm:"comment:'开始用量'"`                                                      // 开始用量
+	UsageEnd       float64   `gorm:"comment:'结束用量'"`                                                      // 结束用量
+	NeedBill       string    `gorm:"default:0;comment:'是否需要账单(0:不需要,1:需要)'"`                              // 是否需要账单(0:不需要,1:需要)
+	BillingMethod  string    `gorm:"comment:'计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率)'"`                        // 计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率)
+	StepFee        string    `gorm:"comment:'阶梯费用'"`                                                      // 阶梯费用
 	collection.NewModel
 }
 
diff --git a/app/fin/model/ecs_device_model.go b/app/fin/model/ecs_device_model.go
index e0a66469bd7a7a5d7d58d143bdc4ff49e2ff4ae8..5c875cce5603c590c5e8181b1d52f884ab25fe47 100644
--- a/app/fin/model/ecs_device_model.go
+++ b/app/fin/model/ecs_device_model.go
@@ -7,18 +7,20 @@ import (
 
 // FinEcsDevice [财务]-计费方案设备绑定实体
 type FinEcsDevice struct {
-	Id         uint   `gorm:"primarykey;comment:'主键'" json:"id"`        // 主键
-	SchemeId   uint   `json:"schemeId" gorm:"index;comment:'方案ID'"`     // 方案ID
-	RegionId   uint   `json:"regionId" gorm:"index;comment:'顶级区域ID'"`   // 顶级区域ID
-	RegionName string `json:"regionName" gorm:"index;comment:'顶级区域名称'"` // 顶级区域名称
-	AreaId     uint   `json:"areaId" gorm:"index;comment:'区域ID'"`       // 区域ID
-	AreaName   string `json:"areaName" gorm:"index;comment:'区域名称'"`     // 区域名称
-	HouseId    uint   `json:"houseId" gorm:"index;comment:'房屋ID'"`      // 房屋ID
-	HouseName  string `json:"houseName" gorm:"index;comment:'房屋名'"`     // 房屋名
-	DeviceId   uint   `json:"deviceId" gorm:"index;comment:'设备ID'"`     // 设备ID
-	DeviceName string `json:"deviceName" gorm:"index;comment:'设备名'"`    // 设备名
-	Address    string `json:"address" gorm:"index;comment:'设备地址'"`      // 设备地址
-	MeterType  string `json:"meterType" gorm:"index;comment:'设备类型'"`    // 设备类型
+	Id         uint   `gorm:"primarykey;comment:'主键'" json:"id"`                                // 主键
+	SchemeId   uint   `json:"schemeId" gorm:"index;comment:'方案ID'"`                             // 方案ID
+	RegionId   uint   `json:"regionId" gorm:"index;comment:'顶级区域ID'"`                           // 顶级区域ID
+	RegionName string `json:"regionName" gorm:"index;comment:'顶级区域名称'"`                         // 顶级区域名称
+	AreaId     uint   `json:"areaId" gorm:"index;comment:'区域ID'"`                               // 区域ID
+	AreaName   string `json:"areaName" gorm:"index;comment:'区域名称'"`                             // 区域名称
+	HouseId    uint   `json:"houseId" gorm:"index;comment:'房屋ID'"`                              // 房屋ID
+	HouseName  string `json:"houseName" gorm:"index;comment:'房屋名'"`                             // 房屋名
+	HouseType  string `json:"houseType" gorm:"index;comment:'房屋类型(house:房屋,commonArea:区域)'"`    // 房屋类型(house:房屋,commonArea:区域)
+	DeviceId   uint   `json:"deviceId" gorm:"index;comment:'设备ID'"`                             // 设备ID
+	DeviceName string `json:"deviceName" gorm:"index;comment:'设备名'"`                            // 设备名
+	Address    string `json:"address" gorm:"index;comment:'设备地址'"`                              // 设备地址
+	MeterType  string `json:"meterType" gorm:"index;comment:'设备类型'"`                            // 设备类型
+	DeviceType string `json:"deviceType" gorm:"index;comment:'设备类型(electric:电,water:水,gas:气)'"` // 设备类型(electric:电,water:水,gas:气)
 	collection.NewModel
 }
 
diff --git a/app/fin/model/purse_flow_model.go b/app/fin/model/purse_flow_model.go
index 08c4cbfd54db98ebdefb603523382e1276c9f365..2236aa08af67c9d6392bb4d0fd975eb8b2720df3 100644
--- a/app/fin/model/purse_flow_model.go
+++ b/app/fin/model/purse_flow_model.go
@@ -12,15 +12,15 @@ type FinPurseFlow struct {
 	PurseId       uint    `gorm:"comment:'钱包ID';index"`    // 钱包ID
 	HouseId       uint    `gorm:"comment:'房屋ID';index"`    // 房屋ID
 	BillId        uint    `gorm:"comment:'账单ID';index"`    // 账单ID
-	EcsType       string  `gorm:"comment:'能耗类型'"`          // 能耗类型
-	FeeType       string  `gorm:"comment:'费用类型'"`          // 费用类型
+	EcsType       string  `gorm:"comment:'能耗类型'"`          // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string  `gorm:"comment:'费用类型'"`          // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	Amount        float64 `gorm:"comment:'变动后金额'"`         // 变动后金额
 	PreAmount     float64 `gorm:"comment:'变动前金额'"`         // 变动前金额
 	OperateAmount float64 `gorm:"comment:'变动金额'"`          // 变动金额
 	// LateAmount    float64   `gorm:"comment:'滞纳金'"`                                        // 滞纳金
 	PaymentSource string    `gorm:"comment:'缴费来源(0:后台,1:小程序,2:上门收款,3:扫码缴款)'"`             // 付款来源(0:后台,1:小程序,2:上门收款,3:扫码缴款)
 	PaymentMethod string    `gorm:"comment:'支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)'"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
-	FlowType      string    `gorm:"comment:'缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)'"`                 // 缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)
+	FlowType      string    `gorm:"comment:'缴费类型(0:能耗账单,1:能耗充值,2:总钱包充值,3:公摊账单)'"`         // 缴费类型(0:能耗账单,1:能耗充值,2:总钱包充值,3:公摊账单)
 	ReceiptState  string    `gorm:"comment:'收据状态(0:否,1:是)'"`                              // 收据状态(0:否,1:是)
 	TenantId      uint      `gorm:"comment:'租户ID'"`                                       // 租户ID
 	PaymentTime   time.Time `gorm:"comment:'支付时间'"`                                       // 支付时间
diff --git a/app/fin/routers/apportion_route.go b/app/fin/routers/apportion_route.go
index 6833bf5d30a9d3c6d94748722b5ccd8ebaf3da94..d41b0236c35e04f200dd661ae1ffa7064c8e4dec 100644
--- a/app/fin/routers/apportion_route.go
+++ b/app/fin/routers/apportion_route.go
@@ -229,7 +229,7 @@ func (hd apportionSchemesHandler) saveRatio(c *gin.Context) {
 		}
 	}
 
-	houseMap, err := hd.srvCommon.ListHouseMap(item.HouseId, nil, nil)
+	houseMap, err := hd.srvCommon.ListHouseMap(0, nil, item.HouseId, nil, nil)
 	if err != nil || len(houseMap) <= 0 {
 		if err = response.CheckErr(fmt.Errorf("房屋不存在"), "No House"); err != nil {
 			return
diff --git a/app/fin/routers/purse_route.go b/app/fin/routers/purse_route.go
index c92287ee8329c7f2229d74e49e77346afbb426b7..fe1c9207109a52dd7477d37e0e2fc61e6e94364a 100644
--- a/app/fin/routers/purse_route.go
+++ b/app/fin/routers/purse_route.go
@@ -153,6 +153,7 @@ func (hd purseHandler) refundFee(c *gin.Context) {
 		return
 	}
 	addReq.FeeType = "refund"
+	addReq.FlowType = constants.FlowTypeEnum.Purse
 	response.CheckAndResp(c, hd.srv.FeeChange(addReq, query.GetAuthReq(c)))
 }
 
@@ -163,6 +164,7 @@ func (hd purseHandler) subsidyFee(c *gin.Context) {
 		return
 	}
 	addReq.FeeType = "subsidy"
+	addReq.FlowType = constants.FlowTypeEnum.Purse
 	response.CheckAndResp(c, hd.srv.FeeChange(addReq, query.GetAuthReq(c)))
 }
 
diff --git a/app/fin/routers/report_router.go b/app/fin/routers/report_router.go
index 77178c6de58dd36ec70aba6de9da5530cae91f35..7bccf811c73d902f65380576d0ab5e22f92d7d9a 100644
--- a/app/fin/routers/report_router.go
+++ b/app/fin/routers/report_router.go
@@ -2,6 +2,7 @@ package routers
 
 import (
 	"energy-server-mgo/app/admin/schemas/query"
+	request "energy-server-mgo/app/admin/schemas/req"
 	finReq "energy-server-mgo/app/fin/schemas"
 	finSvr "energy-server-mgo/app/fin/service"
 	"energy-server-mgo/app/middleware"
@@ -20,7 +21,14 @@ func newReportHandler(srv finSvr.IFinReportService) *reportHandler {
 
 func regReport(rg *gin.RouterGroup, group *core.GroupBase) error {
 	return group.Reg(func(handle *reportHandler) {
-		rg.GET("/report/list", handle.list)
+		rg.GET("/report/statsEcs", handle.statsEcs)           // 能耗账单
+		rg.GET("/report/listEcs", handle.listEcs)             // 能耗账单列表(含用能费用报表)
+		rg.GET("/report/statsRecharge", handle.statsRecharge) // 能耗充值
+		rg.GET("/report/listRecharge", handle.listRecharge)   // 能耗充值列表
+		rg.GET("/report/listDeduct", handle.listDeduct)       // 能耗扣费
+		rg.GET("/report/listSubsidy", handle.listSubsidy)     // 能耗补贴
+		rg.GET("/report/listRefund", handle.listRefund)       // 能耗退费
+		rg.GET("/report/listShared", handle.listShared)       // 公摊账单列表
 	})
 }
 
@@ -28,12 +36,109 @@ type reportHandler struct {
 	srv finSvr.IFinReportService
 }
 
-// list列表
-func (hd reportHandler) list(c *gin.Context) {
-	var listReq finReq.FinCommonDeviceReq
+// statsEcs 能耗账单统计
+func (hd reportHandler) statsEcs(c *gin.Context) {
+	var listReq finReq.FinReportEcsReq
 	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
 		return
 	}
-	res, err := hd.srv.List(listReq, query.GetAuthReq(c))
+	res, err := hd.srv.InfoStatsEcs(listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listEcs  能耗账单列表(含用能费用报表)
+func (hd reportHandler) listEcs(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportEcsReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	res, err := hd.srv.ListEcs(page, listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// statsRecharge 能耗充值统计
+func (hd reportHandler) statsRecharge(c *gin.Context) {
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	res, err := hd.srv.InfoStatsPurse(listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listRecharge  能耗充值列表
+func (hd reportHandler) listRecharge(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	listReq.FeeType = "pay"
+	res, err := hd.srv.ListPurseFlow(page, listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listDeduct  能耗扣费列表
+func (hd reportHandler) listDeduct(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	res, err := hd.srv.ListPurseDeduct(page, listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listDeduct  能耗补贴列表
+func (hd reportHandler) listSubsidy(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	listReq.FeeType = "subsidy"
+	res, err := hd.srv.ListPurseFlow(page, listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listDeduct  能耗退费列表
+func (hd reportHandler) listRefund(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	listReq.FeeType = "refund"
+	res, err := hd.srv.ListPurseFlow(page, listReq, query.GetAuthReq(c))
+	response.CheckAndRespWithData(c, res, err)
+}
+
+// listShared  公摊账单列表
+func (hd reportHandler) listShared(c *gin.Context) {
+	var page request.PageReq
+	var listReq finReq.FinReportPurseReq
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &page)) {
+		return
+	}
+	if response.IsFailWithResp(c, util.VerifyUtil.VerifyQuery(c, &listReq)) {
+		return
+	}
+	res, err := hd.srv.ListPurseShared(page, listReq, query.GetAuthReq(c))
 	response.CheckAndRespWithData(c, res, err)
 }
diff --git a/app/fin/schemas/bill_schema.go b/app/fin/schemas/bill_schema.go
index 6a6a70d987f2006378eb923a8b6d5a1b00761c6e..4861cc38a17ee99b9d984dd4f952476b323c6ee4 100644
--- a/app/fin/schemas/bill_schema.go
+++ b/app/fin/schemas/bill_schema.go
@@ -6,16 +6,16 @@ import (
 
 // FinBillListReq [财务]-收银台-账单列表参数
 type FinBillListReq struct {
-	BillType     string   `form:"billType" json:"billType"`           // 账单类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
-	RegionId     uint     `form:regionId" json:"regionId"`            // 顶级区域ID
-	RegionName   string   `form:regionName" json:"regionName"`        // 顶级区域名
-	AreaId       uint     `form:areaId" json:"areaId"`                // 区域ID
+	BillType     string   `form:"billType" json:"billType"`           // 账单类型(0:能源电,1:能源水,2:能源气,3:公摊水,4:公摊电,5:公摊燃气,6:公摊附加,7:分摊水,8:分摊电,9:分摊燃气)
+	RegionId     uint     `form:"regionId" json:"regionId"`           // 顶级区域ID
+	RegionName   string   `form:"regionName" json:"regionName"`       // 顶级区域名
+	AreaId       uint     `form:"areaId" json:"areaId"`               // 区域ID
 	AreaName     string   `form:"areaName" json:"areaName"`           // 区域名
 	HouseId      uint     `form:"houseId" json:"houseId"`             // 房间ID
 	HouseName    string   `form:"houseName" json:"houseName"`         // 房间名
-	DeviceId     uint     `form:"deviceId" json:"deviceId“`           // 设备ID
-	DeviceName   string   `form:"deviceName" json:"deviceName“`       // 设备名
-	Address      string   `form:"address" json:"address“`             // 设备地址
+	DeviceId     uint     `form:"deviceId" json:"deviceId"`           // 设备ID
+	DeviceName   string   `form:"deviceName" json:"deviceName"`       // 设备名
+	Address      string   `form:"address" json:"address"`             // 设备地址
 	OwnerId      uint     `form:"ownerId" json:"ownerId"`             // 业主ID
 	OwnerName    string   `form:"ownerName" json:"ownerName"`         // 业主名
 	FeeName      string   `form:"feeName" json:"feeName"`             // 费用名称
@@ -39,46 +39,46 @@ type FinBillDetailReq struct {
 
 // FinBillAddReq [财务]-收银台-账单新增参数
 type FinBillAddReq struct {
-	BillType        string    `form:billType" json:"billType"`             // 账单类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
-	RegionId        uint      `form:regionId" json:"regionId"`             // 顶级区域ID
-	RegionName      string    `form:regionName" json:"regionName"`         // 顶级区域名
-	AreaId          uint      `form:areaId" json:"areaId“`                 // 区域ID
-	AreaName        string    `form:"areaName" json:"areaName“`            // 区域名
-	HouseId         uint      `form:"houseId" json:"houseId“`              // 房间ID
-	HouseName       string    `form:"houseName" json:"houseName“`          // 房间名
-	DeviceId        uint      `form:"deviceId" json:"deviceId“`            // 设备ID
-	DeviceName      string    `form:"deviceName" json:"deviceName“`        // 设备名
-	Address         string    `form:"address" json:"address“`              // 设备地址
-	OwnerId         uint      `form:"ownerId" json:"ownerId“`              // 业主ID
-	OwnerName       string    `form:"ownerName" json:"ownerName“`          // 业主名
-	FeeName         string    `form:"feeName" json:"feeName“`              // 费用名称
-	StartDate       time.Time `form:"startDate" json:"startDate“`          // 费用区间(开始时间)
-	EndDate         time.Time `form:"endDate" json:"endDate“`              // 费用区间(结束时间)
-	BillAmount      float64   `form:"billAmount" json:"billAmount“`        // 账单金额
-	UnpaidAmount    float64   `form:"unpaidAmount" json:"unpaidAmount“`    // 未缴金额
-	PaidAmount      float64   `form:"paidAmount" json:"paidAmount“`        // 已缴金额
-	LateAmount      float64   `form:"lateAmount" json:"lateFee“`           // 滞纳金
-	ReductionAmount float64   `form:"reductionAmount" json:"reductionFee“` // 减免金额
-	UsageTotal      float64   `form:"usageTotal" json:"usageTotal“`        // 用量
-	UsageStart      float64   `form:"usageStart" json:"usageStart“`        // 起始用量
-	UsageEnd        float64   `form:"usageEnd" json:"usageEnd“`            // 结束用量
-	FinTime         time.Time `form:"finTime" json:"finTime“`              // 财务时间
-	EcsTime         time.Time `form:"ecsTime" json:"ecsTime“`              // 能耗公摊时间
+	BillType        string    `form:"billType" json:"billType"`            // 账单类型(0:能源电,1:能源水,2:能源气,3:公摊水,4:公摊电,5:公摊燃气,6:公摊附加,7:分摊水,8:分摊电,9:分摊燃气)
+	RegionId        uint      `form:"regionId" json:"regionId"`            // 顶级区域ID
+	RegionName      string    `form:"regionName" json:"regionName"`        // 顶级区域名
+	AreaId          uint      `form:"areaId" json:"areaId"`                // 区域ID
+	AreaName        string    `form:"areaName" json:"areaName"`            // 区域名
+	HouseId         uint      `form:"houseId" json:"houseId"`              // 房间ID
+	HouseName       string    `form:"houseName" json:"houseName"`          // 房间名
+	DeviceId        uint      `form:"deviceId" json:"deviceId"`            // 设备ID
+	DeviceName      string    `form:"deviceName" json:"deviceName"`        // 设备名
+	Address         string    `form:"address" json:"address"`              // 设备地址
+	OwnerId         uint      `form:"ownerId" json:"ownerId"`              // 业主ID
+	OwnerName       string    `form:"ownerName" json:"ownerName"`          // 业主名
+	FeeName         string    `form:"feeName" json:"feeName"`              // 费用名称
+	StartDate       time.Time `form:"startDate" json:"startDate"`          // 费用区间(开始时间)
+	EndDate         time.Time `form:"endDate" json:"endDate"`              // 费用区间(结束时间)
+	BillAmount      float64   `form:"billAmount" json:"billAmount"`        // 账单金额
+	UnpaidAmount    float64   `form:"unpaidAmount" json:"unpaidAmount"`    // 未缴金额
+	PaidAmount      float64   `form:"paidAmount" json:"paidAmount"`        // 已缴金额
+	LateAmount      float64   `form:"lateAmount" json:"lateFee"`           // 滞纳金
+	ReductionAmount float64   `form:"reductionAmount" json:"reductionFee"` // 减免金额
+	UsageTotal      float64   `form:"usageTotal" json:"usageTotal"`        // 用量
+	UsageStart      float64   `form:"usageStart" json:"usageStart"`        // 起始用量
+	UsageEnd        float64   `form:"usageEnd" json:"usageEnd"`            // 结束用量
+	FinTime         time.Time `form:"finTime" json:"finTime"`              // 财务时间
+	EcsTime         time.Time `form:"ecsTime" json:"ecsTime"`              // 能耗公摊时间
 }
 
 // FinBillEditReq [财务]-收银台-账单新增参数
 type FinBillEditReq struct {
-	Id              uint    `form:"id"`                        // 主键
-	FeeName         string  `form:"feeName"`                   // 费用名称
-	UnpaidAmount    float64 `form:"unpaidAmount"`              // 未缴金额
-	PaidAmount      float64 `form:"paidAmount"`                // 已缴金额
-	LateAmount      float64 `form:"lateAmount"`                // 滞纳金
-	ReductionAmount float64 `form:"reductionAmount"`           // 减免金额
-	UsageTotal      float64 `form:"usageTotal"`                // 用量
-	UsageStart      float64 `form:"usageStart"`                // 起始用量
-	UsageEnd        float64 `form:"usageEnd"`                  // 结束用量
-	PayState        string  `form:"payState" json:"payState"`  // 支付状态(0:未支付,1:已支付)
-	OnAccount       string  `form:"onAccount" json:"payState"` // 是否挂账(0:否,1:是)
+	Id              uint    `form:"id"`                         // 主键
+	FeeName         string  `form:"feeName"`                    // 费用名称
+	UnpaidAmount    float64 `form:"unpaidAmount"`               // 未缴金额
+	PaidAmount      float64 `form:"paidAmount"`                 // 已缴金额
+	LateAmount      float64 `form:"lateAmount"`                 // 滞纳金
+	ReductionAmount float64 `form:"reductionAmount"`            // 减免金额
+	UsageTotal      float64 `form:"usageTotal"`                 // 用量
+	UsageStart      float64 `form:"usageStart"`                 // 起始用量
+	UsageEnd        float64 `form:"usageEnd"`                   // 结束用量
+	PayState        string  `form:"payState" json:"payState"`   // 支付状态(0:未支付,1:已支付)
+	OnAccount       string  `form:"onAccount" json:"onAccount"` // 是否挂账(0:否,1:是)
 }
 
 // FinBillDelReq [财务]-收银台-账单新增参数
@@ -101,8 +101,15 @@ type FinBillReductionReq struct {
 // FinBillResp [财务]-收银台-账单返回信息
 type FinBillResp struct {
 	Id              uint      `json:"id" structs:"id"`                                   // 主键
+	AreaId          uint      `json:"areaId" structs:"areaId"`                           // 区域ID
+	AreaName        string    `json:"areaName" structs:"areaName"`                       // 区域名
+	HouseId         uint      `json:"houseId" structs:"houseId"`                         // 房间ID
 	HouseName       string    `json:"houseName" structs:"houseName"`                     // 房间名
-	Address         string    `json:"-"`                                                 // 设备地址
+	HouseArea       float64   `json:"houseArea" structs:"houseArea"`                     // 房间面积
+	DeviceId        uint      `json:"deviceId" structs:"deviceId"`                       // 设备ID
+	DeviceName      string    `json:"deviceName" structs:"deviceName"`                   // 设备名
+	Address         string    `json:"address" structs:"address"`                         // 设备地址
+	MeterType       string    `json:"meterType" structs:"meterType"`                     // 设备类型
 	FeeName         string    `json:"-"`                                                 // 费用名称
 	FeeNameTip      string    `json:"feeNameTip"`                                        // 费用名称提示
 	FeeRange        string    `json:"feeRange"`                                          // 费用区间
@@ -123,10 +130,10 @@ type FinBillResp struct {
 
 // FinBillManulResp [财务]-收银台-手动账单返回信息
 type FinBillManulResp struct {
-	BillType        string    `json:"billType" structs:"billType"`                                 // 账单类型(0:能源,1:公摊水,2:公摊电,3:公摊燃气,4:公摊附加,5:分摊水,6:分摊电,7:分摊燃气)
-	RegionId        uint      `form:regionId" json:"regionId"`                                     // 顶级区域ID
-	RegionName      string    `form:regionName" json:"regionName"`                                 // 顶级区域名
-	AreaId          uint      `json:areaId" structs:"areaId"`                                      // 区域ID
+	BillType        string    `json:"billType" structs:"billType"`                                 // 账单类型(0:能源电,1:能源水,2:能源气,3:公摊水,4:公摊电,5:公摊燃气,6:公摊附加,7:分摊水,8:分摊电,9:分摊燃气)
+	RegionId        uint      `form:"regionId" json:"regionId"`                                    // 顶级区域ID
+	RegionName      string    `form:"regionName" json:"regionName"`                                // 顶级区域名
+	AreaId          uint      `json:"areaId" structs:"areaId"`                                     // 区域ID
 	AreaName        string    `json:"areaName" structs:"areaName"`                                 // 区域名
 	HouseId         uint      `json:"houseId" structs:"houseId"`                                   // 房间ID
 	HouseName       string    `json:"houseName" structs:"houseName"`                               // 房间名
@@ -135,8 +142,8 @@ type FinBillManulResp struct {
 	DeviceName      string    `json:"deviceName" structs:"deviceName"`                             // 设备名
 	Address         string    `json:"address" structs:"address"`                                   // 设备地址
 	MeterType       string    `json:"meterType" structs:"meterType"`                               // 设备类型
-	OwnerId         uint      `json:"ownerId", structs:"ownerId"`                                  // 业主ID
-	OwnerName       string    `json:"ownerName", structs:"ownerName"`                              // 业主名
+	OwnerId         uint      `json:"ownerId" structs:"ownerId"`                                   // 业主ID
+	OwnerName       string    `json:"ownerName" structs:"ownerName"`                               // 业主名
 	FeeName         string    `json:"feeName" structs:"feeName"`                                   // 费用名称
 	StartDate       time.Time `json:"startDate" form:"startDate" structs:"startDate"`              // 费用区间(开始时间)
 	EndDate         time.Time `json:"endDate" form:"endDate" structs:"endDate"`                    // 费用区间(结束时间)
@@ -149,6 +156,8 @@ type FinBillManulResp struct {
 	UsageStart      float64   `json:"usageStart,omitempty" form:"usageStart" structs:"usageStart"` // 起始用量
 	UsageEnd        float64   `json:"usageEnd,omitempty" form:"usageEnd" structs:"usageEnd"`       // 结束用量
 	FinTime         time.Time `json:"finTime,omitempty" structs:"finTime"`                         // 财务时间
+	BillingMethod   string    `json:"billingMethod" structs:"billingMethod"`                       // 计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率)
+	StepFee         string    `json:"stepFee" structs:"stepFee"`                                   // 阶梯费用
 	RetCode         string    `json:"retCode"`                                                     // 错误码
 	RetDesc         string    `json:"retDesc"`                                                     // 错误描述
 }
@@ -228,9 +237,9 @@ type FinBillNoticeResp struct {
 
 // FinBillStatsResp [财务]-业主收银台统计返回信息
 type FinBillStatsResp struct {
-	RegionId     uint              `form:regionId" json:"regionId"`             // 顶级区域ID
-	RegionName   string            `form:regionName" json:"regionName"`         // 顶级区域名
-	AreaId       uint              `json:areaId" structs:"areaId"`              // 区域ID
+	RegionId     uint              `form:"regionId" json:"regionId"`            // 顶级区域ID
+	RegionName   string            `form:"regionName" json:"regionName"`        // 顶级区域名
+	AreaId       uint              `json:"areaId" structs:"areaId"`             // 区域ID
 	AreaName     string            `json:"areaName" structs:"areaName"`         // 区域名
 	HouseId      uint              `json:"houseId" structs:"houseId"`           // 房间ID
 	HouseName    string            `json:"houseName" structs:"houseName"`       // 房间名
diff --git a/app/fin/schemas/common_scheme.go b/app/fin/schemas/common_scheme.go
index ea5349e30f560f473d73ed7dbc8ea95297e92545..c9d3c30c24ed76de2d26d5d3ec5613d39fadd992 100644
--- a/app/fin/schemas/common_scheme.go
+++ b/app/fin/schemas/common_scheme.go
@@ -138,9 +138,10 @@ type RegionDeviceItem struct {
 	RegionId     uint   `json:"regionId" structs:"regionId" label:"顶级节点ID"`
 	RegionName   string `json:"regionName" structs:"regionName" label:"顶级节点名称"`
 	AreaId       uint   `json:"areaId" structs:"areaId" label:"区域ID"`
-	AreaName     string `json:"areaName" structs:"areaName" label:"区域ID"`
+	AreaName     string `json:"areaName" structs:"areaName" label:"区域名"`
 	DeviceId     uint   `json:"deviceId" structs:"deviceId" label:"设备ID"`
 	DeviceName   string `json:"deviceName" structs:"deviceName" label:"设备名称"`
+	Address      string `json:"address" structs:"address" label:"设备地址"`
 	RelationType string `json:"relationType" structs:"relationType" label:"关系类型"`
 }
 
@@ -208,19 +209,21 @@ type HouseDeviceItem struct {
 }
 
 type HouseInfo struct {
-	RegionId   uint              `json:"regionId" structs:"regionId" label:"顶级节点ID"`
-	RegionName string            `json:"regionName" structs:"regionName" label:"顶级节点名称"`
-	AreaId     uint              `json:"areaId" structs:"areaId" label:"区域ID"`
-	AreaName   string            `json:"areaName" structs:"areaName" label:"区域名"`
-	HouseId    uint              `form:"houseId" json:"houseId" label:"房屋ID"`                // 房屋ID
-	HouseName  string            `form:"houseName" json:"houseName" label:"房屋名称"`            // 房屋名称
-	BuildArea  float64           `form:"buildArea" json:"buildArea" label:"建筑面积"`            // 建筑面积
-	UsageArea  float64           `form:"usageArea" json:"usageArea" label:"使用面积"`            // 使用面积
-	TollArea   float64           `form:"tollArea" json:"tollArea" label:"总面积"`               // 总面积
-	CommonArea float64           `form:"commonArea" json:"commonArea" label:"公共面积"`          // 公共面积
-	Content    string            `form:"content" json:"content" struct:"content" label:"参数"` // 参数
-	Devices    []HouseDeviceItem `form:"devices" json:"devices" label:"设备列表"`                // 设备列表
-	UsageTotal float64           `form:"usageTotal" json:"usageTotal" label:"设备列表"`          // 能耗
+	RegionId    uint              `json:"regionId" structs:"regionId" label:"顶级节点ID"`
+	RegionName  string            `json:"regionName" structs:"regionName" label:"顶级节点名称"`
+	AreaId      uint              `json:"areaId" structs:"areaId" label:"区域ID"`
+	AreaName    string            `json:"areaName" structs:"areaName" label:"区域名"`
+	HouseId     uint              `form:"houseId" json:"houseId" label:"房屋ID"`                // 房屋ID
+	HouseName   string            `form:"houseName" json:"houseName" label:"房屋名称"`            // 房屋名称
+	BuildArea   float64           `form:"buildArea" json:"buildArea" label:"建筑面积"`            // 建筑面积
+	UsageArea   float64           `form:"usageArea" json:"usageArea" label:"使用面积"`            // 使用面积
+	TollArea    float64           `form:"tollArea" json:"tollArea" label:"总面积"`               // 总面积
+	CommonArea  float64           `form:"commonArea" json:"commonArea" label:"公共面积"`          // 公共面积
+	Content     string            `form:"content" json:"content" struct:"content" label:"参数"` // 参数
+	Devices     []HouseDeviceItem `form:"devices" json:"devices" label:"设备列表"`                // 设备列表
+	UsageTotal  float64           `form:"usageTotal" json:"usageTotal" label:"设备列表"`          // 能耗
+	MoveInTime  int64             `form:"moveInTime" json:"moveInTime" label:"迁入日期"`          // 迁入日期
+	MoveOutTime int64             `form:"moveOutTime" json:"moveOutTime" label:"迁出日期"`        // 迁出日期
 }
 
 type GeneratedReq struct {
@@ -232,3 +235,11 @@ type GeneratedReq struct {
 	HouseIds   []uint    `form:"houseIds" json:"houseIds" structs:"houseIds"`                                      // 房屋ID
 	OwnerId    uint      `form:"ownerId" json:"ownerId" structs:"ownerId"`                                         // 业主ID
 }
+
+type PushDeviceItem struct {
+	HouseId    uint      `json:"houseId" structs:"houseId" label:"房屋ID"`
+	DeviceId   uint      `json:"deviceId" structs:"deviceId" label:"设备ID"`
+	DeviceType string    `json:"deviceType" structs:"deviceType" label:"设备类型"`
+	StartDay   time.Time `json:"startDay" form:"startDay" structs:"startDay" time_format:"2006-01-02"` // 开始时间
+	EndDay     time.Time `json:"endDay" form:"endDay" structs:"endDay" time_format:"2006-01-02"`       // 结束时间
+}
diff --git a/app/fin/schemas/ecs_device.go b/app/fin/schemas/ecs_device.go
index e83bc78f124d47939ce4df407fa8678304a67d51..94b31c0d174a95150725b0fca2c52d448bd24909 100644
--- a/app/fin/schemas/ecs_device.go
+++ b/app/fin/schemas/ecs_device.go
@@ -2,19 +2,21 @@ package schemas
 
 // FinEcsDeviceListReq [财务]-计费方案设备绑定列表参数
 type FinEcsDeviceListReq struct {
-	Id         uint   `form:"id" json:"id" label:"主键ID列表"`                                      // 主键ID列表
-	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`         // 方案ID
-	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`       // 顶级区域ID
-	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"` // 顶级区域名称
-	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`               // 区域ID
-	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`         // 区域名称
-	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                         // 房屋ID
-	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                   // 房屋名
-	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                      // 设备ID
-	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                // 设备名
-	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`            // 设备地址
-	MeterType  string `form:"meterType" json:"meterType" structs:"meterType" label:"设备类型"`      // 设备类型
-	HouseIds   []uint `form:"houseIds" json:"houseIds" structs:"houseIds"`                      // 房屋ID
+	Id         uint   `form:"id" json:"id" label:"主键ID列表"`                                                              // 主键ID列表
+	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`                                 // 方案ID
+	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`                               // 顶级区域ID
+	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"`                         // 顶级区域名称
+	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`                                       // 区域ID
+	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`                                 // 区域名称
+	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                                                 // 房屋ID
+	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                                           // 房屋名
+	HouseType  string `json:"houseType" form:"houseType" structs:"houseType"`                                           // 房屋类型
+	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                                              // 设备ID
+	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                                        // 设备名
+	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`                                    // 设备地址
+	MeterType  string `form:"meterType" json:"meterType" structs:"meterType" label:"表类型"`                               // 设备类型
+	DeviceType string `json:"deviceType" form:"deviceType" structs:"deviceType" label:"设备类型(electric:电,water:水,gas:气)"` // 设备类型(electric:电,water:水,gas:气)
+	HouseIds   []uint `form:"houseIds" json:"houseIds" structs:"houseIds"`                                              // 房屋ID
 }
 
 // FinEcsDeviceDetailReq [财务]-计费方案设备绑定详情参数
@@ -23,32 +25,36 @@ type FinEcsDeviceDetailReq struct {
 
 // FinEcsDeviceAddReq [财务]-计费方案设备绑定新增参数
 type FinEcsDeviceAddReq struct {
-	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`         // 方案ID
-	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`       // 顶级区域ID
-	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"` // 顶级区域名称
-	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`               // 区域ID
-	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`         // 区域名称
-	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                         // 房屋ID
-	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                   // 房屋名
-	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                      // 设备ID
-	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                // 设备名
-	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`            // 设备地址
-	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`          // 设备类型
+	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`                                 // 方案ID
+	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`                               // 顶级区域ID
+	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"`                         // 顶级区域名称
+	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`                                       // 区域ID
+	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`                                 // 区域名称
+	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                                                 // 房屋ID
+	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                                           // 房屋名
+	HouseType  string `json:"houseType" form:"houseType" structs:"houseType"`                                           // 房屋类型
+	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                                              // 设备ID
+	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                                        // 设备名
+	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`                                    // 设备地址
+	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`                                  // 设备类型
+	DeviceType string `json:"deviceType" form:"deviceType" structs:"deviceType" label:"设备类型(electric:电,water:水,gas:气)"` // 设备类型(electric:电,water:水,gas:气)
 }
 
 // FinEcsDeviceEditReq [财务]-计费方案设备绑定新增参数
 type FinEcsDeviceEditReq struct {
-	Id         uint   `json:"id" form:"id" structs:"id" label:"主键"`                             // 主键
-	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`       // 顶级区域ID
-	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"` // 顶级区域名称
-	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`               // 区域ID
-	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`         // 区域名称
-	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                         // 房屋ID
-	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                   // 房屋名
-	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                      // 设备ID
-	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                // 设备名
-	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`            // 设备地址
-	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`          // 设备类型
+	Id         uint   `json:"id" form:"id" structs:"id" label:"主键"`                                                     // 主键
+	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`                               // 顶级区域ID
+	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"`                         // 顶级区域名称
+	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`                                       // 区域ID
+	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`                                 // 区域名称
+	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                                                 // 房屋ID
+	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                                           // 房屋名
+	HouseType  string `json:"houseType" form:"houseType" structs:"houseType"`                                           // 房屋类型
+	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                                              // 设备ID
+	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                                        // 设备名
+	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`                                    // 设备地址
+	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`                                  // 设备类型
+	DeviceType string `json:"deviceType" form:"deviceType" structs:"deviceType" label:"设备类型(electric:电,water:水,gas:气)"` // 设备类型(electric:电,water:水,gas:气)
 }
 
 // FinEcsDeviceDelReq [财务]-计费方案设备绑定新增参数
@@ -57,37 +63,41 @@ type FinEcsDeviceDelReq struct {
 
 // FinEcsDeviceResp [财务]-计费方案设备绑定返回信息
 type FinEcsDeviceResp struct {
-	Id         uint   `json:"id" form:"id" structs:"id" label:"主键"`                             // 主键
-	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`         // 方案ID
-	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`       // 顶级区域ID
-	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"` // 顶级区域名称
-	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`               // 区域ID
-	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`         // 区域名称
-	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                         // 房屋ID
-	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                   // 房屋名
-	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                      // 设备ID
-	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                // 设备名
-	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`            // 设备地址
-	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`          // 设备类型
+	Id         uint   `json:"id" form:"id" structs:"id" label:"主键"`                                                     // 主键
+	SchemeId   uint   `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`                                 // 方案ID
+	RegionId   uint   `json:"regionId" form:"regionId" structs:"regionId" label:"顶级区域ID"`                               // 顶级区域ID
+	RegionName string `json:"regionName" form:"regionName" structs:"regionName" label:"顶级区域名称"`                         // 顶级区域名称
+	AreaId     uint   `json:"areaId" form:"areaId" structs:"areaId" label:"区域ID"`                                       // 区域ID
+	AreaName   string `json:"areaName" form:"areaName" structs:"areaName" label:"区域名称"`                                 // 区域名称
+	HouseId    uint   `json:"houseId" form:"houseId" structs:"houseId"`                                                 // 房屋ID
+	HouseName  string `json:"houseName" form:"houseName" structs:"houseName"`                                           // 房屋名
+	HouseType  string `json:"houseType" form:"houseType" structs:"houseType"`                                           // 房屋类型
+	DeviceId   uint   `json:"deviceId" form:"deviceId" structs:"deviceId"`                                              // 设备ID
+	DeviceName string `json:"deviceName" form:"deviceName" structs:"deviceName"`                                        // 设备名
+	Address    string `json:"address" form:"address" structs:"address" label:"设备地址"`                                    // 设备地址
+	MeterType  string `json:"meterType" form:"address" structs:"address" label:"设备类型"`                                  // 设备类型
+	DeviceType string `json:"deviceType" form:"deviceType" structs:"deviceType" label:"设备类型(electric:电,water:水,gas:气)"` // 设备类型(electric:电,water:水,gas:气)
 }
 
 // FinEcsDeviceResp [财务]-计费方案设备绑定返回信息
 type FinEcsSchemeDeviceResp struct {
-	SchemeId   uint    `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"` // 方案ID
-	DeviceId   uint    `json:"deviceId" label:"设备ID"`                                    // 设备ID
-	DeviceName string  `json:"deviceName" label:"设备名称"`                                  // 设备名称
-	Address    string  `json:"address" label:"设备地址"`                                     // 设备地址
-	RegionId   uint    `json:"areaId" label:"顶级区域ID"`                                    // 顶级区域ID
-	RegionName string  `json:"areaName" label:"顶级区域名称"`                                  // 顶级区域名称
-	AreaId     uint    `json:"areayId" label:"区域ID"`                                     // 区域ID
-	AreaName   string  `json:"areayName" label:"区域名称"`                                   // 区域名称
-	HouseId    uint    `json:"houseId" label:"房屋ID"`                                     // 房屋ID
-	HouseName  string  `json:"houseName" label:"房屋名称"`                                   // 房屋名称
-	BuildArea  float64 `json:"buildArea" label:"建筑面积"`                                   // 建筑面积
-	UsageArea  float64 `json:"usageArea" label:"使用面积"`                                   // 使用面积
-	TollArea   float64 `json:"tollArea" label:"收费面积"`                                    // 收费面积
-	CommonArea float64 `json:"commonArea" label:"公共面积"`                                  // 公共面积
-	MeterType  string  `json:"meterType" form:"address" structs:"address" label:"设备类型"`  // 设备类型
+	SchemeId   uint    `form:"schemeId" json:"schemeId" structs:"schemeId" label:"方案ID"`                                 // 方案ID
+	DeviceId   uint    `json:"deviceId" label:"设备ID"`                                                                    // 设备ID
+	DeviceName string  `json:"deviceName" label:"设备名称"`                                                                  // 设备名称
+	Address    string  `json:"address" label:"设备地址"`                                                                     // 设备地址
+	RegionId   uint    `json:"areaId" label:"顶级区域ID"`                                                                    // 顶级区域ID
+	RegionName string  `json:"areaName" label:"顶级区域名称"`                                                                  // 顶级区域名称
+	AreaId     uint    `json:"areayId" label:"区域ID"`                                                                     // 区域ID
+	AreaName   string  `json:"areayName" label:"区域名称"`                                                                   // 区域名称
+	HouseId    uint    `json:"houseId" label:"房屋ID"`                                                                     // 房屋ID
+	HouseName  string  `json:"houseName" label:"房屋名称"`                                                                   // 房屋名称
+	HouseType  string  `json:"houseType" form:"houseType" structs:"houseType"`                                           // 房屋类型
+	BuildArea  float64 `json:"buildArea" label:"建筑面积"`                                                                   // 建筑面积
+	UsageArea  float64 `json:"usageArea" label:"使用面积"`                                                                   // 使用面积
+	TollArea   float64 `json:"tollArea" label:"收费面积"`                                                                    // 收费面积
+	CommonArea float64 `json:"commonArea" label:"公共面积"`                                                                  // 公共面积
+	MeterType  string  `json:"meterType" form:"address" structs:"address" label:"设备类型"`                                  // 设备类型
+	DeviceType string  `json:"deviceType" form:"deviceType" structs:"deviceType" label:"设备类型(electric:电,water:水,gas:气)"` // 设备类型(electric:电,water:水,gas:气)
 }
 
 type FinEcsDeviceBindReq struct {
diff --git a/app/fin/schemas/ecs_scheme.go b/app/fin/schemas/ecs_scheme.go
index 96db1d095cc78dc9f70b8ad63065ccccd294db9e..095d5ff6f8302c4ad4f4e910fc620126bf6417d1 100644
--- a/app/fin/schemas/ecs_scheme.go
+++ b/app/fin/schemas/ecs_scheme.go
@@ -67,7 +67,7 @@ type FinEcsSchemesResp struct {
 	SchemeName     string        `json:"schemeName" structs:"schemeName"`         // 方案名称
 	PayableTime    string        `json:"payableTime" structs:"payableTime"`       // 计费方式(pre:前推)
 	PaymentDay     int           `json:"paymentDay" structs:"paymentDay"`         // 支付天数
-	BillingMethod  string        `json:"billingMethod" structs:"billingMethod"`   // 计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率
+	BillingMethod  string        `json:"billingMethod" structs:"billingMethod"`   // 计费方式(0:单一,1:月周期,2:年周期,3:四费率,4:五费率)
 	MeterType      string        `json:"meterType" structs:"meterType"`           // 仪表类型(em:电表,hw:热水表,cool:电冷水表,gas:燃气表)
 	FeeAction      string        `json:"feeAction" structs:"feeAction"`           // 费控联动
 	CommonTaxRate  float64       `json:"commonTaxRate" structs:"commonTaxRate"`   // 普通发票费率
@@ -75,3 +75,9 @@ type FinEcsSchemesResp struct {
 	Price          []interface{} `json:"price" form:"price"`                      // 价格
 	TenantId       uint          `json:"tenantId" structs:"tenantId"`             // 租户ID
 }
+
+type SchemeStepItem struct {
+	Seq         int     `json:"seq" structs:"seq"`
+	BillAmmount float64 `json:"billingAmmount" structs:"billingAmmount"`
+	UsageTotal  float64 `json:"usageTotal" structs:"usageTotal"`
+}
diff --git a/app/fin/schemas/purse_flow_schema.go b/app/fin/schemas/purse_flow_schema.go
index c8c2867952af5030a46e6fefe4898b540b089ede..653ab61a30c9c801183ed9435b9c8d609f4fe5b4 100644
--- a/app/fin/schemas/purse_flow_schema.go
+++ b/app/fin/schemas/purse_flow_schema.go
@@ -7,8 +7,8 @@ import (
 // FinPurseFlowListReq [财务]-钱包资金流水列表参数
 type FinPurseFlowListReq struct {
 	PurseId  uint   `form:"purseId" json:"purseId" structs:"purseId"`    // 钱包ID
-	EcsType  string `form:"ecsType" json:"ecsType" structs:"ecsType"`    // 能耗类型
-	FeeType  string `form:"feeType" json:"feeType" structs:"feeType"`    // 费用类型
+	EcsType  string `form:"ecsType" json:"ecsType" structs:"ecsType"`    // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType  string `form:"feeType" json:"feeType" structs:"feeType"`    // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	TenantId uint   `form:"tenantId" json:"tenantId" structs:"tenantId"` // 租户ID
 }
 
@@ -20,8 +20,8 @@ type FinPurseFlowDetailReq struct {
 // FinPurseFlowAddReq [财务]-钱包资金流水新增参数
 type FinPurseFlowAddReq struct {
 	PurseId       uint    `form:"purseId" json:"purseId" structs:"purseId"`                   // 钱包ID
-	EcsType       string  `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型
-	FeeType       string  `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型
+	EcsType       string  `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string  `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	Amount        float64 `form:"amount" json:"amount" structs:"amount"`                      // 变动后金额
 	PreAmount     float64 `form:"preAmount" json:"preAmount" structs:"preAmount"`             // 变动前金额
 	OperateAmount float64 `form:"operateAmount" json:"operateAmount" structs:"operateAmount"` // 变动金额
@@ -35,8 +35,8 @@ type FinPurseFlowAddReq struct {
 type FinPurseFlowEditReq struct {
 	Id            uint    `form:"id"`                                                         // 主键
 	PurseId       uint    `form:"purseId" json:"purseId" structs:"purseId"`                   // 钱包ID
-	EcsType       string  `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型
-	FeeType       string  `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型
+	EcsType       string  `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string  `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	Amount        float64 `form:"amount" json:"amount" structs:"amount"`                      // 变动后金额
 	PreAmount     float64 `form:"preAmount" json:"preAmount" structs:"preAmount"`             // 变动前金额
 	OperateAmount float64 `form:"operateAmount" json:"operateAmount" structs:"operateAmount"` // 变动金额
@@ -53,8 +53,8 @@ type FinPurseFlowDelReq struct {
 type FinPurseFlowResp struct {
 	Id            uint      `json:"id" structs:"id"`                                            // 主键
 	PurseId       uint      `form:"purseId" json:"purseId" structs:"purseId"`                   // 钱包ID
-	EcsType       string    `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型
-	FeeType       string    `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型
+	EcsType       string    `form:"ecsType" json:"ecsType" structs:"ecsType"`                   // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string    `form:"feeType" json:"feeType" structs:"feeType"`                   // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	Amount        float64   `form:"amount" json:"amount" structs:"amount"`                      // 变动后金额
 	PreAmount     float64   `form:"preAmount" json:"preAmount" structs:"preAmount"`             // 变动前金额
 	OperateAmount float64   `form:"operateAmount" json:"operateAmount" structs:"operateAmount"` // 变动金额
@@ -63,9 +63,9 @@ type FinPurseFlowResp struct {
 	PaymentMethod string    `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
 	TenantId      uint      `form:"tenantId" json:"tenantId" structs:"tenantId"`                // 租户ID
 	CreateTime    time.Time `form:"createTime" json:"createTime" structs:"createTime"`          // 创建时间
-	PaymentTime   time.Time `form:"paymentTime"`                                                // 支付时间
-	Payee         string    `form:"payee"`                                                      // 收款人
-	Payer         string    `form:"payer"`                                                      // 付款人
+	PaymentTime   time.Time `form:"paymentTime" json:"paymentTime"`                             // 支付时间
+	Payee         string    `form:"payee" json:"payee"`                                         // 收款人
+	Payer         string    `form:"payer" json:"payer"`                                         // 付款人
 }
 
 // FinPurseFlowInvoiceListReq [财务]-钱包收据列表参数
@@ -76,12 +76,12 @@ type FinPurseFlowInvoiceListReq struct {
 	HouseName     string `json:"houseName" form:"houseName" structs:"houseName" label:"房屋名称'"` // 房屋名称
 	OwnerId       uint   `form:"ownerId" json:"ownerId" structs:"ownerId"`                     // 客户ID
 	OwnerName     string `json:"ownerName" form:"ownerName" structs:"ownerName" label:"业主名称'"` // 业主名称
-	EcsType       string `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型
-	FeeType       string `form:"feeType" json:"feeType" structs:"feeType"`                     // 费用类型
+	EcsType       string `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string `form:"feeType" json:"feeType" structs:"feeType"`                     // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	PaymentSource string `json:"paymentSource" form:"paymentSource" structs:"paymentSource"`   // 缴费来源(0:后台,1:小程序,2:上门收款,3:扫码缴款)
 	PaymentMethod string `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"`   // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
 	TenantId      uint   `form:"tenantId" json:"tenantId" structs:"tenantId"`                  // 租户ID
-	FlowType      string `form:"flowType" json:"flowType" structs:"flowType"`                  // 缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)
+	FlowType      string `form:"flowType" json:"flowType" structs:"flowType"`                  // 缴费类型(0:能耗账单,1:能耗充值,2:总钱包充值,3:公摊账单)
 	ReceiptState  string `json:"receiptState" structs:"receiptState"`                          // 收据状态(0:否,1:是)
 }
 
@@ -95,26 +95,26 @@ type FinPurseFlowInvoiceListRes struct {
 	HouseName       string    `json:"houseName" form:"houseName" structs:"houseName" label:"房屋名称'"` // 房屋名称
 	OwnerId         uint      `form:"ownerId,omitempty" json:"ownerId" structs:"ownerId"`           // 客户ID
 	OwnerName       string    `json:"ownerName" form:"ownerName" structs:"ownerName" label:"业主名称'"` // 业主名称
-	EcsType         string    `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型
-	FeeType         string    `form:"feeType" json:"feeType" structs:"feeType"`                     // 交易类型
+	EcsType         string    `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType         string    `form:"feeType" json:"feeType" structs:"feeType"`                     // 交易类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
 	PaymentSource   string    `form:"paymentSource" json:"paymentSource" structs:"paymentSource"`   // (0:后台,1:小程序,2:上门收款,3:扫码缴款)
 	PaymentMethod   string    `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"`   // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
 	Amount          float64   `form:"amount" json:"amount" structs:"amount"`                        // 金额
 	LateAmount      float64   `json:"lateAmount" structs:"lateAmount"`                              // 滞纳金
 	ReductionAmount float64   `json:"reductionAmount" structs:"reductionAmount"`                    // 减免金额
-	UsageTotal      float64   `json:"usageTotal" structs:"usageTotal"`                              // 用量
 	CreateTime      string    `form:"createTime" json:"createTime" structs:"createTime"`            // 创建时间
 	FeeRange        string    `form:"feeRange" json:"feeRange" structs:"feeRange"`                  // 费用区间
 	OwnerNames      []string  `json:"ownerNames" structs:"ownerNames"`                              // 用户名
-	FlowType        string    `json:"flowType" structs:"flowType"`                                  // 缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)
+	FlowType        string    `json:"flowType" structs:"flowType"`                                  // 缴费类型(0:能耗账单,1:能耗充值,2:总钱包充值,3:公摊账单)
 	StartDate       time.Time `json:"startDate" structs:"startDate"`                                // 费用起始日期
 	EndDate         time.Time `json:"endDate" structs:"endDate"`                                    // 费用结束日期
 	FeeName         string    `json:"feeName" structs:"feeName"`                                    // 费用名称
 	UsageStart      float64   `json:"usageStart" structs:"usageStart"`                              // 开始用量
 	UsageEnd        float64   `json:"usageEnd" structs:"usageEnd"`                                  // 结束用量
+	UsageTotal      float64   `json:"usageTotal" structs:"usageTotal"`                              // 用量
 	PaymentTime     string    `json:"paymentTime"`                                                  // 支付时间
-	Payee           string    `form:"payee"`                                                        // 收款人
-	Payer           string    `form:"payer"`                                                        // 付款人
+	Payee           string    `json:"payee"`                                                        // 收款人
+	Payer           string    `json:"payer"`                                                        // 付款人
 }
 
 // FinInvoiceGenralReq [财务]-票据生成列表参数
diff --git a/app/fin/schemas/purse_schema.go b/app/fin/schemas/purse_schema.go
index ba0157de18077a9ff927553dea3e5b1c550a969d..caac5fbd3b6261fc929e72933aedcb6ef261c9d6 100644
--- a/app/fin/schemas/purse_schema.go
+++ b/app/fin/schemas/purse_schema.go
@@ -72,13 +72,14 @@ type FinPurseFeeEditReq struct {
 	Id            uint      `json:"id" form:"id"`                                           // 主键
 	HouseId       uint      `json:"houseId" form:"houseId" structs:"houseId" label:"房屋ID'"` // 房屋ID
 	Operate       string    `json:"-"`
-	EcsType       string    `json:"ecsType" form:"ecsType"`                                     // 能耗类型(electric:电费,water:水费,gas:气费)
-	FeeType       string    `json:"-"`                                                          // 费用类型(pay:缴费,refund:退费,subsidy:补贴)
-	Amount        float64   `json:"amount" form:"Amount"`                                       // 操作金额
-	FlowType      string    `json:"flowType" form:"flowType"`                                   // 资金流水类型(bill:收银台,purse:钱包)
-	PaymentTime   time.Time `json:"paymentTime" form:"paymentTime"`                             // 支付时间
-	PaymentMethod string    `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
-	Remark        string    `json:"remark" form:"remark"`                                       // 备注
+	EcsType       string    `json:"ecsType" form:"ecsType"`                                                                 // 能耗类型(electric:电费,water:水费,gas:气费)
+	FeeType       string    `json:"-"`                                                                                      // 费用类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
+	Amount        float64   `json:"amount" form:"Amount"`                                                                   // 操作金额
+	FlowType      string    `json:"flowType" form:"flowType"`                                                               // 资金流水类型(bill:收银台,purse:钱包)
+	PaymentTime   time.Time `json:"paymentTime" form:"paymentTime" structs:"paymentTime" time_format:"2006-01-02 15:04:05"` // 支付时间
+	PaymentSource string    `json:"paymentSource" form:"paymentSource" structs:"paymentSource"`                             // 缴费来源(0:后台,1:小程序,2:上门收款,3:扫码缴款)
+	PaymentMethod string    `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"`                             // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	Remark        string    `json:"remark" form:"remark"`                                                                   // 备注
 }
 
 // FinPurseOwnerResp [财务]-业主返回信息
diff --git a/app/fin/schemas/report_schema.go b/app/fin/schemas/report_schema.go
new file mode 100644
index 0000000000000000000000000000000000000000..05e9dd41e9c566dc1ac1d30274175fdcee66fdcb
--- /dev/null
+++ b/app/fin/schemas/report_schema.go
@@ -0,0 +1,185 @@
+package schemas
+
+import "time"
+
+// FinReportEcsReq [财务]-能耗账单请求信息
+type FinPurseIdsReq struct {
+	AreaId    uint   `form:"areaId" json:"hierarchyId" label:"区域ID"`     // 区域ID
+	AreaName  string `form:"areaName" json:"hierarchyName" label:"区域名称"` // 区域名称
+	HouseId   uint   `form:"houseId" json:"houseId" label:"房屋ID"`        // 房屋ID
+	HouseName string `form:"houseName" json:"houseName" label:"房屋名称"`    // 房屋名称
+	OwnerId   uint   `form:"ownerId" json:"ownerId" label:"业主ID"`        // 业主ID
+	OwnerName string `form:"ownerName" json:"ownerName" label:"业主名称"`    // 业主名称
+	EcsType   string `form:"ecsType" json:"ecsType" label:"能耗类型(仪表类型)"`  // 能耗类型(仪表类型)
+}
+
+// FinReportEcsReq [财务]-能耗账单请求信息
+type FinReportEcsReq struct {
+	// AreaId    uint   `form:"areaId" json:"areaId" label:"区域ID"`       // 区域ID
+	// AreaName  string `form:"areaName" json:"areaName" label:"区域名称"`   // 区域名称
+	// HouseId   uint   `form:"houseId" json:"houseId" label:"房屋ID"`     // 房屋ID
+	// HouseName string `form:"houseName" json:"houseName" label:"房屋名称"` // 房屋名称
+	// OwnerId   uint   `form:"ownerId" json:"ownerId" label:"业主ID"`     // 业主ID
+	// OwnerName string `form:"ownerName" json:"ownerName" label:"业主名称"` // 业主名称
+	OnAccount string `form:"onAccount" json:"onAccount" label:"挂账状态"` // 挂账状态
+	FinPurseIdsReq
+}
+
+// FinReportEcsStasRes [财务]-能耗账单统计返回信息
+type FinReportEcsStasRes struct {
+	BillAmount      float64 `json:"billAmount" form:"billAmount" structs:"billAmount"`       // 账单金额
+	UnpaidAmount    float64 `json:"unpaidAmount" structs:"unpaidAmount"`                     // 未缴金额
+	PaidAmount      float64 `json:"paidAmount" structs:"paidAmount"`                         // 已缴金额
+	LateAmount      float64 `json:"lateAmount" structs:"lateAmount"`                         // 滞纳金
+	ReductionAmount float64 `json:"reductionAmount" structs:"reductionAmount"`               // 减免金额
+	UsageTotal      float64 `json:"usageTotal" form:"usageTotal" structs:"usageTotal"`       // 用量
+	RefundAmount    float64 `json:"refundAmount" form:"refundAmount" structs:"refundAmount"` // 退费金额
+}
+
+// FinReportEcsStasRes [财务]-能耗账单统计列表返回信息
+type FinReportEcsListRes struct {
+	Id              uint    `json:"id" structs:"id"`                                            // 主键
+	HouseName       string  `json:"houseName" structs:"houseName"`                              // 房间名
+	AreaName        string  `form:"areaName" json:"areaName" label:"区域名称"`                      // 区域名称
+	OwnerName       string  `form:"ownerName" json:"ownerName" label:"业主名称"`                    // 业主名称
+	MeterType       string  `form:"meterType" json:"meterType" label:"设备类型"`                    // 设备类型
+	FeeName         string  `json:"-"`                                                          // 费用名称
+	FeeNameTip      string  `json:"feeNameTip"`                                                 // 费用名称提示
+	FeeRange        string  `json:"feeRange"`                                                   // 费用区间
+	StartDate       string  `json:"startDate" form:"startDate" structs:"startDate"`             // 费用区间(开始时间)
+	EndDate         string  `json:"endDate" form:"endDate" structs:"endDate"`                   // 费用区间(结束时间)
+	BillAmount      float64 `json:"billAmount" form:"billAmount" structs:"billAmount"`          // 账单金额
+	UnpaidAmount    float64 `json:"unpaidAmount" structs:"unpaidAmount"`                        // 未缴金额
+	PaidAmount      float64 `json:"paidAmount" structs:"paidAmount"`                            // 已缴金额
+	LateAmount      float64 `json:"lateAmount" structs:"lateAmount"`                            // 滞纳金
+	ReductionAmount float64 `json:"reductionAmount" structs:"reductionAmount"`                  // 减免金额
+	UsageTotal      float64 `json:"usageTotal" form:"usageTotal" structs:"usageTotal"`          // 用量
+	UsageStart      float64 `json:"usageStart" form:"usageStart" structs:"usageStart"`          // 起始用量
+	UsageEnd        float64 `json:"usageEnd" form:"usageEnd" structs:"usageEnd"`                // 结束用量
+	FinTime         string  `json:"finTime" structs:"finTime"`                                  // 财务时间
+	PayState        string  `form:"payState" json:"payState"`                                   // 支付状态(0:未支付,1:已支付)
+	OnAccount       string  `form:"onAccount" json:"onAccount"`                                 // 是否挂账(0:否,1:是)
+	PaymentMethod   string  `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	PaymentTime     string  `json:"paymentTime"`                                                // 支付时间
+	Payee           string  `json:"payee"`                                                      // 收款人
+	Payer           string  `json:"payer"`                                                      // 付款人
+}
+
+// FinReportPurseReq [财务]-能耗预充值请求信息
+type FinReportPurseReq struct {
+	// AreaId        uint      `form:"areaId" json:"hierarchyId" label:"区域ID"`                     // 区域ID
+	// AreaName      string    `form:"areaName" json:"hierarchyName" label:"区域名称"`                 // 区域名称
+	// HouseId       uint      `form:"houseId" json:"houseId" label:"房屋ID"`                        // 房屋ID
+	// HouseName     string    `form:"houseName" json:"houseName" label:"房屋名称"`                    // 房屋名称
+	PaymentMethod string `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	// EcsType       string    `json:"ecsType" form:"ecsType"`                                     // 能耗类型(electric:电费,water:水费,gas:气费)
+	StartDay time.Time `form:"startDay" json:"startDay" label:"开始日期"`                                        // 开始日期
+	EndDay   time.Time `form:"endDay" json:"endDay" label:"结束日期"`                                            // 结束日期
+	FeeType  string    `form:"feeType" json:"feeType" label:"费用进出类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)"` // 费用进出类型(pay:缴费,refund:退费,subsidy:补贴,deduct:扣费)
+	FinPurseIdsReq
+}
+
+// FinReportPurseStasRes [财务]-能耗预充值统计返回信息
+type FinReportPurseStasItemRes struct {
+	TotalAmount float64 `json:"totalAmount" form:"totalAmount" structs:"totalAmount"` // 总金额
+	PaidAmount  float64 `json:"paidAmount" structs:"paidAmount"`                      // 实际金额
+}
+
+// FinReportPurseStasRes [财务]-能耗预充值统计返回信息
+type FinReportPurseStasRes struct {
+	EcsType     string                    `json:"_"`                           // 能耗类型
+	FeeType     string                    `json:"_"`                           // 能耗类型
+	TotalAmount float64                   `json:"—" structs:"totalAmount"`     // 总金额
+	Total       FinReportPurseStasItemRes `json:"total" structs:"total"`       // 总
+	Electric    FinReportPurseStasItemRes `json:"electric" structs:"electric"` // 电
+	Water       FinReportPurseStasItemRes `json:"water" structs:"water"`       // 水
+	Gas         FinReportPurseStasItemRes `json:"gas" structs:"gas"`           // 气
+}
+
+// FinReportPurseListRes [财务]-能耗预充值统计列表返回信息
+type FinReportPurseFlowListRes struct {
+	Id            uint     `json:"id" structs:"id" label:"资金流水ID"`
+	PurseId       uint     `form:"purseId" json:"purseId,omitempty" structs:"purseId"` // 钱包ID
+	AreaName      string   `json:"areaName" structs:"areaName" label:"区域名"`
+	HouseName     string   `json:"houseName" form:"houseName" structs:"houseName" label:"房屋名称'"` // 房屋名称
+	Address       string   `json:"address" form:"address" structs:"address" label:"仪表地址'"`       // 仪表地址
+	OwnerName     string   `json:"ownerName" form:"ownerName" structs:"ownerName" label:"业主名称'"` // 业主名称
+	EcsType       string   `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型(electric:电费,water:水费,gas:气费)
+	PaymentMethod string   `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"`   // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	Amount        float64  `form:"amount" json:"amount" structs:"amount"`                        // 金额
+	OwnerNames    []string `json:"ownerNames" structs:"ownerNames"`                              // 用户名
+	FlowType      string   `json:"flowType" structs:"flowType"`                                  // 缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)
+	FeeName       string   `json:"feeName" structs:"feeName"`                                    // 费用名称
+	PaymentTime   string   `json:"paymentTime"`                                                  // 支付时间
+	Payee         string   `json:"payee"`                                                        // 收款人
+	Payer         string   `json:"payer"`                                                        // 付款人
+}
+
+// FinReportPurseDeductListRes [财务]-能耗流水记录列表返回信息
+type FinReportPurseDeductListRes struct {
+	Id            uint    `json:"id" structs:"id" label:"资金流水ID"`
+	PurseId       uint    `form:"purseId" json:"purseId,omitempty" structs:"purseId"` // 钱包ID
+	AreaName      string  `json:"areaName" structs:"areaName" label:"区域名"`
+	HouseName     string  `json:"houseName" form:"houseName" structs:"houseName" label:"房屋名称'"` // 房屋名称
+	OwnerName     string  `json:"ownerName" form:"ownerName" structs:"ownerName" label:"业主名称'"` // 业主名称
+	Address       string  `json:"address" form:"address" structs:"address" label:"仪表地址'"`       // 仪表地址
+	EcsType       string  `form:"ecsType" json:"ecsType" structs:"ecsType"`                     // 能耗类型(electric:电费,water:水费,gas:气费)
+	PaymentMethod string  `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"`   // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	Amount        float64 `form:"amount" json:"amount" structs:"amount"`                        // 金额
+	FlowType      string  `json:"flowType" structs:"flowType"`                                  // 缴费类型(0:能耗账单,1:能耗充值,2:钱包充值)
+	FeeName       string  `json:"feeName" structs:"feeName"`                                    // 费用名称
+	PaymentTime   string  `json:"paymentTime"`                                                  // 支付时间
+	Payee         string  `json:"payee"`                                                        // 收款人
+	Payer         string  `json:"payer"`                                                        // 付款人
+	UsageStart    float64 `json:"usageStart" structs:"usageStart"`                              // 开始用量
+	UsageEnd      float64 `json:"usageEnd" structs:"usageEnd"`                                  // 结束用量
+	UsageTotal    float64 `json:"usageTotal" structs:"usageTotal"`                              // 用量
+	HouseId       uint    `structs:"houseId" label:"房屋ID"`                                      // 房屋ID
+	BillId        uint    `structs:"billId" label:"账单ID"`                                       // 账单ID
+}
+
+// FinReportPurseUsageListRes [财务]-用能费用报表返回信息
+type FinReportPurseUsageListRes struct {
+	Id          uint    `json:"id" structs:"id" label:"资金流水ID"`
+	PurseId     uint    `form:"purseId" json:"purseId,omitempty" structs:"purseId"` // 钱包ID
+	AreaName    string  `json:"areaName" structs:"areaName" label:"区域名"`
+	HouseName   string  `json:"houseName" form:"houseName" structs:"houseName" label:"房屋名称'"` // 房屋名称
+	OwnerName   string  `json:"ownerName" form:"ownerName" structs:"ownerName" label:"业主名称'"` // 业主名称
+	Address     string  `json:"address" form:"address" structs:"address" label:"仪表地址'"`       // 仪表地址
+	UsageAmount float64 `form:"amount" json:"amount" structs:"amount"`                        // 金额
+	UsageTotal  float64 `json:"usageTotal" structs:"usageTotal"`                              // 用量
+	PurseAmount float64 `structs:"purseAmount" label:"电费余额"`                                  // 电费余额
+}
+
+// FinReportStepItemRes [财务]-用能阶梯费用信息
+type FinReportStepItemRes struct {
+	Id     uint    `json:"id" structs:"id" label:"资金流水ID"`
+	Amount float64 `form:"amount" json:"amount" structs:"amount"` // 金额
+	Usage  float64 `json:"usage" structs:"usage" label:"用量"`      // 用量
+}
+
+// FinReportStepListRes [财务]-用能阶梯费用报表返回信息
+type FinReportStepListRes struct {
+	Id          uint                   `json:"id" structs:"id" label:"资金流水ID"`
+	UsageAmount float64                `form:"usageAmount" json:"usageAmount" structs:"usageAmount"` // 金额
+	UsageTotal  float64                `json:"usageTotal" structs:"usageTotal"`                      // 用量
+	Details     []FinReportStepItemRes `json:"details" structs:"details"`                            // 阶梯用量
+}
+
+// FinReportSharedBillRes [财务]-能耗公摊账单列表返回信息
+type FinReportSharedBillRes struct {
+	Id            uint      `json:"id" structs:"id"`                                            // 主键
+	HouseName     string    `json:"houseName" structs:"houseName"`                              // 房间名
+	AreaName      string    `form:"areaName" json:"hierarchyName" label:"区域名称"`                 // 区域名称
+	OwnerName     string    `form:"ownerName" json:"ownerName" label:"业主名称"`                    // 业主名称
+	DeviceName    string    `form:"deviceName" json:"deviceName" label:"设备名"`                   // 设备名
+	Address       string    `json:"address" form:"address" structs:"address" label:"仪表地址'"`     // 仪表地址
+	FeeName       string    `json:"-"`                                                          // 费用名称
+	BillAmount    float64   `json:"billAmount" form:"billAmount" structs:"billAmount"`          // 账单金额
+	FinTime       time.Time `json:"finTime" structs:"finTime"`                                  // 财务时间
+	PaymentMethod string    `json:"paymentMethod" form:"paymentMethod" structs:"paymentMethod"` // 支付方式(0:现金,1:微信,2:支付宝,3:pos机,4:银行转账,5:对公转账)
+	PaymentTime   time.Time `json:"paymentTime"`                                                // 支付时间
+	Payee         string    `json:"payee"`                                                      // 收款人
+	Payer         string    `json:"payer"`                                                      // 付款人
+	BillId        uint      `json:"_" structs:"id"`                                             // 主键
+}
diff --git a/app/fin/service/common_service.go b/app/fin/service/common_service.go
index 21e7c3dd0edee3bac2b7f559ebcc97d137e804ac..b19f3a50a01be17aa0f26630b7d4b9cdf8940400 100644
--- a/app/fin/service/common_service.go
+++ b/app/fin/service/common_service.go
@@ -29,17 +29,18 @@ type IFinCommonService interface {
 	ListAllOwnerHouse(listReq finReq.FinCommonOwnerHouseReq, auth *request.AuthReq) (res []finReq.FinCommonOwnerHouseResp, e error)
 	ListAllOwner(listReq finReq.FinCommonOwnerReq, auth *request.AuthReq) (res []finReq.FinCommonOwnerResp, e error)
 	ListAllHouseOwner(listReq finReq.FinCommonOwnerHouseReq, auth *request.AuthReq) (res []finReq.FinCommonOwnerHouseResp, e error)
+	ListHouseOwnerMap(listReq finReq.FinCommonOwnerHouseReq, auth *request.AuthReq) (res map[uint][]finReq.FinCommonOwnerHouseResp, e error)
 	ListRegionOwnerTree(listReq finReq.RegionReq, auth *request.AuthReq) (res []finReq.RegionCommonTreeResp, e error)
 	ListOwnerHouseId(userId uint, userName string) (res []uint, e error)
 	ListCommonAreaDevice(areaIds []uint, meterTypes []string) (res []finReq.RegionDeviceItem, e error)
 	ListAreaDeviceIds(areaIds []uint, meterTypes []string) (rets []uint, e error)
 	ListCommonAreaHouse(areaIds []uint, auth *request.AuthReq) (res []finReq.HouseInfo, e error)
-	ListHouseMap(houseId uint, houseIds []uint, auth *request.AuthReq) (houseMap map[uint]finReq.HouseInfo, err error)
+	ListHouseMap(areaId uint, areaIds []uint, houseId uint, houseIds []uint, auth *request.AuthReq) (houseMap map[uint]finReq.HouseInfo, err error)
 	ListHouseDevice(allAreaIds []uint, areaIds []uint, deviceTypes []string) ([]finReq.HouseInfo, error)
 	GetTopRegionInfo(areaId uint) (res finReq.RegionResp)
 	ListAreaMap(auth *request.AuthReq) (areaNameMap map[uint]finReq.RegionAreaItem)
 	ListAreaHouseMap(auth *request.AuthReq) (areaNameMap map[string]finReq.RegionAreaItem)
-	ListHouseIds(areaId uint, auth *request.AuthReq) (areaIds []uint)
+	ListHouseIds(areaId uint, auth *request.AuthReq) (houseIds []uint)
 }
 
 // finCommonService 初始化
@@ -511,6 +512,85 @@ select othr.ot_id as owner_id, ot.tenant_id, ot.real_name as owner_name, ot.phon
 	return objs, nil
 }
 
+// List [通用服务]-房屋+业主列表
+func (srv finCommonService) ListHouseOwnerMap(listReq finReq.FinCommonOwnerHouseReq, auth *request.AuthReq) (res map[uint][]finReq.FinCommonOwnerHouseResp, e error) {
+	var portfolioOthr portfolio.OTHR
+	var portfolioOt portfolio.OT
+	var portfolioArea portfolio.Area
+	var portfolioHierarchy portfolio.Hierarchy
+
+	rawSql := `select house.*, owner_id, tenant_id, owner_name,  owner_phone from(select house.house_id, house.house_name, hierarchy.id as area_id, hierarchy.name as area_name from(
+SELECT id as house_id, name as house_name, hierarchy_id, tenant_id FROM {portfolioArea} WHERE type = 'house' order by sort asc,id desc
+) house left join {portfolioHierarchy} hierarchy on house.hierarchy_id = hierarchy.id and house.tenant_id = hierarchy.tenant_id
+) house left join (
+select othr.ot_id as owner_id, ot.tenant_id, ot.real_name as owner_name, ot.phone as owner_phone, othr.house_id, othr.relation_type from {portfolioOthr} othr left join {portfolioOt} ot on othr.ot_id = ot."id"
+) ot
+ on house.house_id = ot.house_id where {cond}`
+
+	rawSql = strings.Replace(rawSql, "{portfolioOthr}", portfolioOthr.TableName(), -1)
+	rawSql = strings.Replace(rawSql, "{portfolioOt}", portfolioOt.TableName(), -1)
+	rawSql = strings.Replace(rawSql, "{portfolioArea}", portfolioArea.TableName(), -1)
+	rawSql = strings.Replace(rawSql, "{portfolioHierarchy}", portfolioHierarchy.TableName(), -1)
+
+	builder := strings.Builder{}
+	builder.WriteString("1=1")
+	if auth != nil && auth.TenantId != 0 && !auth.HasFullAccess() {
+		builder.WriteString(" and house.tenant_id=")
+		builder.WriteString(strconv.FormatUint(uint64(auth.TenantId), 10))
+	}
+	if listReq.OwnerId != 0 {
+		builder.WriteString(" and owner_id=")
+		builder.WriteString(strconv.FormatUint(uint64(listReq.OwnerId), 10))
+	}
+	if len(listReq.OwnerName) > 0 {
+		builder.WriteString(" and owner_name like '%")
+		builder.WriteString(listReq.OwnerName)
+		builder.WriteString("%'")
+	}
+	if len(listReq.OwnerPhone) > 0 {
+		builder.WriteString(" and owner_phone=")
+		builder.WriteString(listReq.OwnerPhone)
+		builder.WriteString("%'")
+	}
+	if listReq.HouseId != 0 {
+		builder.WriteString(" and house.house_id=")
+		builder.WriteString(strconv.FormatUint(uint64(listReq.HouseId), 10))
+	}
+	if len(listReq.HouseName) > 0 {
+		builder.WriteString(" and house_name like '%")
+		builder.WriteString(listReq.HouseName)
+		builder.WriteString("%'")
+	}
+	if listReq.AreaId != 0 {
+		builder.WriteString(" and area_id=")
+		builder.WriteString(strconv.FormatUint(uint64(listReq.AreaId), 10))
+	}
+	if len(listReq.AreaName) > 0 {
+		builder.WriteString(" and area_name like '%")
+		builder.WriteString(listReq.AreaName)
+		builder.WriteString("%'")
+	}
+	rawSql = strings.Replace(rawSql, "{cond}", builder.String(), -1)
+	sql := rawSql
+
+	// 数据
+	var objs []finReq.FinCommonOwnerHouseResp
+	err := srv.db.Raw(sql).Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	for _, obj := range objs {
+		item, find := res[obj.HouseId]
+		if !find {
+			item = append(item, obj)
+		} else {
+			item = append(item, obj)
+		}
+		res[obj.HouseId] = item
+	}
+	return
+}
+
 func (srv finCommonService) ListRegionOwnerTree(listReq finReq.RegionReq, auth *request.AuthReq) ([]finReq.RegionCommonTreeResp, error) {
 	sql := query.AuthQuery(srv.db.Model(&portfolio.Hierarchy{}), auth).Where("pid = 0")
 	if !auth.IsSuperAdmin && !auth.SoftSuperAdmin {
@@ -641,34 +721,13 @@ select othr.ot_id as owner_id, ot.tenant_id, ot.real_name as owner_name, ot.phon
 }
 
 func (srv finCommonService) ListCommonAreaDevice(areaIds []uint, meterTypes []string) ([]finReq.RegionDeviceItem, error) {
-	sql := srv.db.Model(&portfolio.Hierarchy{}).Where("pid = 0").Where("id in (?)", areaIds)
-
-	var commonAreas []finReq.RegionCommonTreeResp
-	err := sql.Select("id, name, pid").Order("sort asc, id desc").Find(&commonAreas).Error
-	if err != nil {
-		return nil, err
-	}
-
-	sql = srv.db.Model(&portfolio.Hierarchy{})
-	var subAreas []finReq.RegionCommonTreeResp
-	err = sql.Select("id, name, pid").Where("pid > 0").Order("sort asc, id desc").Find(&subAreas).Error
-	if err != nil {
-		return nil, err
-	}
-	commonAreas = append(commonAreas, subAreas...)
-
-	var objs []resp.PortfolioHierarchyResp
-	response.Copy(&objs, commonAreas)
-	list := util.ConvertUtil.StructsToMaps(objs)
-	mapList := util.ArrayUtil.ListToTree(list, "id", "pid", "children")
-
 	var deviceObjs []finReq.RegionDeviceItem
 	var areaInstrument portfolio.AreaInstrument
 	var deviceInstrument device.Instrument
 	var portfolioArea portfolio.Area
 	rawSql := `select bind.area_id, device.* from 
 (select instrument_id, bind.area_id from {areaInstrument} bind join {portfolioArea} area on area.id = bind.area_id where type = 'commonArea' and area.is_deleted = 0 and {houseCond}) bind
-join (select id as device_id, name as device_name, flag device_type from {deviceInstrument} where {meterTypeCond}) device on bind.instrument_id = device.device_id`
+join (select id as device_id, name as device_name, address, flag device_type from {deviceInstrument} where {meterTypeCond}) device on bind.instrument_id = device.device_id`
 	rawSql = strings.Replace(rawSql, "{areaInstrument}", areaInstrument.TableName(), -1)
 	rawSql = strings.Replace(rawSql, "{deviceInstrument}", deviceInstrument.TableName(), -1)
 	rawSql = strings.Replace(rawSql, "{portfolioArea}", portfolioArea.TableName(), -1)
@@ -705,8 +764,8 @@ join (select id as device_id, name as device_name, flag device_type from {device
 	if areaIds != nil && len(areaIds) > 0 {
 		houseBuilder.WriteString("area_id in(")
 		length := len(areaIds)
-		for index, houseId := range areaIds {
-			houseBuilder.WriteString(strconv.FormatUint(uint64(houseId), 10))
+		for index, areaId := range areaIds {
+			houseBuilder.WriteString(strconv.FormatUint(uint64(areaId), 10))
 			if index < length-1 {
 				houseBuilder.WriteString(",")
 			}
@@ -715,35 +774,11 @@ join (select id as device_id, name as device_name, flag device_type from {device
 	}
 	rawSql = strings.Replace(rawSql, "{houseCond}", houseBuilder.String(), -1)
 
-	err = srv.db.Raw(rawSql).Find(&deviceObjs).Error
+	err := srv.db.Raw(rawSql).Find(&deviceObjs).Error
 	if e := response.CheckErr(err, "List Find err"); e != nil {
 		return nil, err
 	}
-	deviceMap := listToDeviceMap(deviceObjs)
-
-	var rets []finReq.RegionDeviceItem
-	for _, subData := range mapList {
-		resByre, resByteErr := json.Marshal(subData)
-		if resByteErr != nil {
-			fmt.Println(resByteErr.Error())
-			continue
-		}
-		var item finReq.RegionCommonTreeResp
-		jsonRes := json.Unmarshal(resByre, &item)
-		if jsonRes != nil {
-			fmt.Println(jsonRes.Error())
-			continue
-		}
-		curId := item.Id
-		curName := item.Name
-		children := item.Children
-		var tmpList []finReq.RegionDeviceItem
-		_, tmpList = transeMapDeviceList(children, curId, curName, tmpList, deviceMap)
-		if tmpList != nil && len(tmpList) > 0 {
-			rets = append(rets, tmpList...)
-		}
-	}
-	return rets, nil
+	return deviceObjs, nil
 }
 
 func (srv finCommonService) ListAreaDeviceIds(areaIds []uint, meterTypes []string) (rets []uint, e error) {
@@ -806,19 +841,55 @@ func (srv finCommonService) ListCommonAreaHouse(areaIds []uint, auth *request.Au
 	return houseList, nil
 }
 
-func (srv finCommonService) ListHouseMap(houseId uint, houseIds []uint, auth *request.AuthReq) (houseMap map[uint]finReq.HouseInfo, err error) {
-	sql := srv.db.Model(&portfolio.Area{}).Where("type = 'house'")
-	if houseId > 0 {
-		sql = sql.Where("id = ?", houseId)
+func (srv finCommonService) ListHouseMap(areaId uint, areaIds []uint, houseId uint, houseIds []uint, auth *request.AuthReq) (houseMap map[uint]finReq.HouseInfo, err error) {
+	var portfolioOthr portfolio.OTHR
+	var portfolioArea portfolio.Area
+	rawSql := `select house.house_id, name as house_name, content, move_in_time, move_out_time from
+(select id as house_id, name as house_name, content, hierarchy_id from {portfolioArea} where type='house' and is_deleted = 0) house
+JOIN
+(select house_id, relation_type, move_in_time, move_out_time from {portfolioOthr}) othr
+on house.house_id = othr.house_id where {cond}`
+	rawSql = strings.Replace(rawSql, "{portfolioArea}", portfolioArea.TableName(), -1)
+	rawSql = strings.Replace(rawSql, "{portfolioOthr}", portfolioOthr.TableName(), -1)
+
+	builder := strings.Builder{}
+	builder.WriteString("1=1")
+	if areaIds != nil && len(areaIds) > 0 {
+		builder.WriteString(" and hierarchy_id in(")
+		length := len(areaIds)
+		for index, areaId := range areaIds {
+			builder.WriteString(strconv.FormatUint(uint64(areaId), 10))
+			if index < length-1 {
+				builder.WriteString(",")
+			}
+		}
+		builder.WriteString(")")
 	}
-	if len(houseIds) > 0 {
-		sql = sql.Where("id in (?)", houseIds)
+	if houseIds != nil && len(houseIds) > 0 {
+		builder.WriteString(" and house.house_id in(")
+		length := len(houseIds)
+		for index, houseId := range houseIds {
+			builder.WriteString(strconv.FormatUint(uint64(houseId), 10))
+			if index < length-1 {
+				builder.WriteString(",")
+			}
+		}
+		builder.WriteString(")")
 	}
+	if areaId > 0 {
+		builder.WriteString(" and hierarchy_id=")
+		builder.WriteString(strconv.FormatUint(uint64(areaId), 10))
+	}
+	if houseId > 0 {
+		builder.WriteString(" and house.house_id=")
+		builder.WriteString(strconv.FormatUint(uint64(houseId), 10))
+	}
+	rawSql = strings.Replace(rawSql, "{cond}", builder.String(), -1)
 
 	var houseList []finReq.HouseInfo
-	err = sql.Select("id as house_id, name as house_name, content").First(&houseList).Error
-	if err != nil {
-		return
+	err = srv.db.Raw(rawSql).Find(&houseList).Error
+	if e := response.CheckErr(err, "List Find err"); e != nil {
+		return nil, err
 	}
 
 	houseMap = make(map[uint]finReq.HouseInfo)
diff --git a/app/fin/service/device_record_service.go b/app/fin/service/device_record_service.go
index bd20105dabcd61fc5ca9a33991016d7fe69f5b15..4e9780e442c28aa86f5641b604f47706f837f9b2 100644
--- a/app/fin/service/device_record_service.go
+++ b/app/fin/service/device_record_service.go
@@ -10,8 +10,8 @@ import (
 )
 
 type IFinDeviceRecordService interface {
-	ListByHouseId(houseId, deviceId uint, billType string, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error)
-	ListByHouseIds(houseIds, deviceIds []uint, billType string, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error)
+	ListByHouseId(areaId, houseId, deviceId uint, billType string, isCommon bool, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error)
+	ListByHouseIds(areaIds, houseIds, deviceIds []uint, billType string, isCommon bool, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error)
 	SaveBatch(objs []finModel.FinDeviceRecord) (e error)
 	GetRecordNum(houseId, deviceId uint, billType string, startDate, endDate time.Time) (count int64, e error)
 }
@@ -27,10 +27,13 @@ type finRecordService struct {
 }
 
 // List [任务]-任务-设备费用列表
-func (srv finRecordService) ListByHouseId(houseId, deviceId uint, billType string, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error) {
+func (srv finRecordService) ListByHouseId(areaId, houseId, deviceId uint, billType string, isCommon bool, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error) {
 	nilTime := time.Time{}
 	// 查询
 	model := srv.db.Model(&finModel.FinDeviceRecord{})
+	if areaId > 0 {
+		model = model.Where("area_id = ?", areaId)
+	}
 	if houseId > 0 {
 		model = model.Where("house_id = ?", houseId)
 	}
@@ -46,6 +49,9 @@ func (srv finRecordService) ListByHouseId(houseId, deviceId uint, billType strin
 	if endDate != nilTime {
 		model = model.Where("fee_date <= ?", endDate)
 	}
+	if isCommon {
+		model = model.Where("common_area_id is not null")
+	}
 	// 数据
 	err := model.Find(&res).Error
 	if e = response.CheckErr(err, "List Find err"); e != nil {
@@ -55,12 +61,15 @@ func (srv finRecordService) ListByHouseId(houseId, deviceId uint, billType strin
 }
 
 // List [任务]-任务-设备费用列表
-func (srv finRecordService) ListByHouseIds(houseIds, deviceIds []uint, billType string, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error) {
+func (srv finRecordService) ListByHouseIds(areaIds, houseIds, deviceIds []uint, billType string, isCommon bool, startDate, endDate time.Time) (res []finModel.FinDeviceRecord, e error) {
 	nilTime := time.Time{}
 	// 查询
 	model := srv.db.Model(&finModel.FinDeviceRecord{})
+	if len(areaIds) > 0 {
+		model = model.Where("area_id in (?)", areaIds)
+	}
 	if len(houseIds) > 0 {
-		model = model.Where("house_id in (?)", houseIds)
+		model = model.Where("area_id in (?)", houseIds)
 	}
 	if len(deviceIds) > 0 {
 		model = model.Where("device_id in (?)", deviceIds)
@@ -74,6 +83,9 @@ func (srv finRecordService) ListByHouseIds(houseIds, deviceIds []uint, billType
 	if endDate != nilTime {
 		model = model.Where("fee_date <= ?", endDate)
 	}
+	if isCommon {
+		model = model.Where("common_area_id is not null")
+	}
 	// 数据
 	err := model.Find(&res).Error
 	if e = response.CheckErr(err, "List Find err"); e != nil {
@@ -93,11 +105,16 @@ func (srv finRecordService) SaveBatch(objs []finModel.FinDeviceRecord) (e error)
 func (srv finRecordService) GetRecordNum(houseId, deviceId uint, billType string, startDate, endDate time.Time) (count int64, e error) {
 	// 查询
 	model := query.NewAuthQuery(srv.db.Model(&finModel.FinDeviceRecord{}), nil)
-	model = model.Where("house_id = ?", houseId)
+	if houseId > 0 {
+		model = model.Where("house_id = ?", houseId)
+	}
 	if deviceId > 0 {
 		model = model.Where("device_id = ?", deviceId)
 	}
-	model = model.Where("(start_date >= ? and start_date <= ?) or (start_date >= ? and start_date <= ?)", startDate, endDate, startDate, endDate)
+	if len(billType) > 0 {
+		model = model.Where("bill_type = ?", billType)
+	}
+	model = model.Where("(fee_date >= ? and fee_date <= ?) or (fee_date >= ? and fee_date <= ?)", startDate, endDate, startDate, endDate)
 	// 数据
 	err := model.Count(&count).Error
 	if e = response.CheckErr(err, "List Find err"); e != nil {
diff --git a/app/fin/service/ecs_device_service.go b/app/fin/service/ecs_device_service.go
index 73c54726419dc82e4a3591bdcc209421b7506659..2f37f319ae681ee1caded4dfb1615f41509b306d 100644
--- a/app/fin/service/ecs_device_service.go
+++ b/app/fin/service/ecs_device_service.go
@@ -17,7 +17,7 @@ import (
 )
 
 type IFinEcsDeviceService interface {
-	ListAll(ids []uint, chemeId uint, deviceIds []uint) (res []finModel.FinEcsDevice, e error)
+	ListAll(ids []uint, schemeId uint, deviceIds []uint) (res []finModel.FinEcsDevice, e error)
 	List(page request.PageReq, listReq finReq.FinEcsDeviceListReq, auth *request.AuthReq) (res response.PageResp, e error)
 	Detail(id uint, auth *request.AuthReq) (res finReq.FinEcsDeviceResp, e error)
 	Add(addReq finReq.FinEcsDeviceAddReq, auth *request.AuthReq) (e error)
@@ -50,7 +50,7 @@ type FinEcsDeviceService struct {
 // ListAll [财务]-计费方案设备绑定列表
 func (srv FinEcsDeviceService) ListAll(ids []uint, schemeId uint, deviceIds []uint) (res []finModel.FinEcsDevice, e error) {
 	// 查询
-	model := srv.db.Model(&finModel.FinEcsDevice{})
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinEcsDevice{}), nil)
 	if schemeId != 0 {
 		model.Where("scheme_id = ?", schemeId)
 	}
@@ -76,7 +76,7 @@ func (srv FinEcsDeviceService) List(page request.PageReq, listReq finReq.FinEcsD
 	limit := page.PageSize
 	offset := page.PageSize * (page.PageNo - 1)
 	// 查询
-	model := srv.db.Model(&finModel.FinEcsDevice{})
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinEcsDevice{}), auth)
 
 	// 总数
 	var count int64
@@ -399,6 +399,9 @@ func (srv FinEcsDeviceService) ListAllBindDevice(listReq finReq.FinEcsDeviceList
 	if len(listReq.AreaName) > 0 {
 		model = model.Where("area_name like '%?%'", listReq.AreaName)
 	}
+	if len(listReq.HouseType) > 0 {
+		model = model.Where("house_type like ?", listReq.HouseType)
+	}
 	if len(listReq.MeterType) > 0 {
 		meterType := listReq.MeterType
 		if listReq.MeterType == "em" {
@@ -442,7 +445,7 @@ func (srv FinEcsDeviceService) ListUnBindDevice(page request.PageReq, listReq fi
 select device.id as device_id, device.name as device_name, device.flag as meter_type, device.address, instrument.area_id as house_id  from {deviceInstrument} device left join {areaInstrument} instrument on device.id = instrument.instrument_id where device.is_deleted = 0
 ) device
 join(
-select area.id as house_id, area.name as house_name, hierarchy.id as area_id, hierarchy.name as area_name from {portfolioArea} area left join {portfolioHierarchy} hierarchy on area.hierarchy_id = "hierarchy"."id" where area.is_deleted = 0 and hierarchy.is_deleted = 0 and area.type = 'house'
+select area.id as house_id, area.name as house_name, hierarchy.id as area_id, hierarchy.name as area_name, type as house_type from {portfolioArea} area left join {portfolioHierarchy} hierarchy on area.hierarchy_id = "hierarchy"."id" where area.is_deleted = 0 and hierarchy.is_deleted = 0 and area.type = 'house'
 ) house
 on house.house_id = device.house_id
 where device_id not in(
@@ -517,7 +520,7 @@ select device_id from {schemeDevice} scheme where is_deleted = 0) {cond}`
 		return
 	}
 
-	sql = strings.Replace(rawSql, "{columns}", "device.*, house.house_name, house.area_id, house.area_name", -1)
+	sql = strings.Replace(rawSql, "{columns}", "device.*, house.house_name, house.area_id, house.area_name, house.house_type", -1)
 	// 数据
 	var objs []finReq.FinEcsDeviceResp
 	err = srv.db.Raw(sql).Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
@@ -554,11 +557,14 @@ func (srv FinEcsDeviceService) ListSchemeDevice(listReq finReq.FinEcsDeviceListR
 		model = model.Where("house_id=?", listReq.HouseId)
 	}
 	if len(listReq.HouseName) > 0 {
-		model = model.Where("house like '%?%'", listReq.HouseName)
+		model = model.Where("house_name like '%?%'", listReq.HouseName)
 	}
 	if len(listReq.HouseIds) > 0 {
 		model = model.Where("house_id in (?)", listReq.HouseIds)
 	}
+	if len(listReq.HouseType) > 0 {
+		model = model.Where("house_type like ?", listReq.HouseType)
+	}
 	if listReq.AreaId != 0 {
 		model = model.Where("area_id=?", listReq.AreaId)
 	}
diff --git a/app/fin/service/electric_service.go b/app/fin/service/electric_service.go
index 8a08d062ac50e829ccc2c7d02e8301fad8807bf0..f69ea8740de5b7e60abd85ff8c44f7d75609cb1d 100644
--- a/app/fin/service/electric_service.go
+++ b/app/fin/service/electric_service.go
@@ -24,6 +24,7 @@ type IFinSharedElectricService interface {
 	SaveBatch(commonAreaId uint, savetReqs []finReq.FinSharedElectricSaveReq, auth *request.AuthReq) (e error)
 	Del(id uint, auth *request.AuthReq) (e error)
 	InfoAreaScheme(commonAreaId uint, auth *request.AuthReq) (res interface{}, e error)
+	ListAllByExecType(execType string) (res []finModel.FinSharedElectric, e error)
 }
 
 // NewFinSharedElectricService 初始化
@@ -499,7 +500,7 @@ func (srv FinSharedElectricService) ListAllByType(listReq finReq.FinSharedScheme
 	// 查询
 	model := query.AuthQuery(srv.db.Model(&cond), auth)
 	// 数据
-	var objs []finModel.FinSharedAtt
+	var objs []finModel.FinSharedElectric
 	err := model.Order("scheme_type asc").Find(&objs).Error
 	if e = response.CheckErr(err, "List Find err"); e != nil {
 		return
@@ -711,3 +712,22 @@ func (srv FinSharedElectricService) ListAll(listReq finReq.FinSharedListReq) (re
 	}
 	return resps, nil
 }
+
+// List [财务]-公摊计费方案-执行类型方案列表
+func (srv FinSharedElectricService) ListAllByExecType(execType string) (res []finModel.FinSharedElectric, e error) {
+	var cond finModel.FinSharedElectric
+	cond.ExecType = execType
+	// 查询
+	model := query.AuthQuery(srv.db.Model(&cond), nil)
+	// 数据
+	var objs []finModel.FinSharedElectric
+	err := model.Order("id asc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	var areaIds []uint
+	for _, item := range objs {
+		areaIds = append(areaIds, item.CommonAreaId)
+	}
+	return objs, nil
+}
diff --git a/app/fin/service/purse_flow_service.go b/app/fin/service/purse_flow_service.go
index 64b28c44968dd73c018e9aebfb4e71e7ee80014b..0d0107c76370ce032a239f461ab4ce2d7573b6e5 100644
--- a/app/fin/service/purse_flow_service.go
+++ b/app/fin/service/purse_flow_service.go
@@ -24,6 +24,7 @@ type IFinPurseFlowService interface {
 	Edit(editReq finReq.FinPurseFlowEditReq, auth *request.AuthReq) (e error)
 	Del(id uint, auth *request.AuthReq) (e error)
 	ListBill(page request.PageReq, listReq finReq.FinPurseFlowInvoiceListReq, auth *request.AuthReq) (res response.PageResp, e error)
+	ListFlowByBillId(billId uint, flowType string, feeType string) (resps []finModel.FinPurseFlow, e error)
 	Generated(listReq finReq.FinInvoiceGenralReq, auth *request.AuthReq) (res []finReq.FinInvoiceResp, flowIds []uint, e error)
 	UpdateReceiptState(flowIds []uint, auth *request.AuthReq) (e error)
 }
@@ -341,7 +342,7 @@ func (srv finPurseFlowService) ListBills(flowIds []uint) (resps []finReq.FinPurs
 		}
 		item.FeeType = constants.GetFeeName(obj.FeeType)
 		item.FlowType = constants.GetFlowType(obj.FlowType)
-		if obj.FlowType == "bill" {
+		if obj.FlowType == constants.FlowTypeEnum.Bill || obj.FlowType == constants.FlowTypeEnum.Shared {
 			var bill finModel.FinBill
 			err := srv.db.Where("id = ?", obj.BillId).Where("is_deleted = 0").Limit(1).First(&bill).Error
 			if err != nil && bill.Id > 0 {
@@ -381,6 +382,25 @@ func (srv finPurseFlowService) ListBills(flowIds []uint) (resps []finReq.FinPurs
 	return resps, nil
 }
 
+// List [财务]-钱包资金流水列表
+func (srv finPurseFlowService) ListFlowByBillId(billId uint, flowType string, feeType string) (resps []finModel.FinPurseFlow, e error) {
+	// 查询
+	model := srv.db.Model(&finModel.FinPurseFlow{})
+	model = model.Where("billId = ? and flowType = ?", billId, flowType)
+	if len(feeType) > 0 {
+		model = model.Where("feeType = ?", feeType)
+	}
+
+	// 数据
+	var objs []finModel.FinPurseFlow
+	err := model.Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	return objs, nil
+}
+
 // List [财务]-发票列表生成
 func (srv finPurseFlowService) Generated(listReq finReq.FinInvoiceGenralReq, auth *request.AuthReq) (res []finReq.FinInvoiceResp, flowIds []uint, e error) {
 	book, err := srv.srvBook.Detail(listReq.BookId, nil)
diff --git a/app/fin/service/purse_service.go b/app/fin/service/purse_service.go
index 57badcdc6ebd82bfe496b9226b9a411e1b8cea63..7106ae39b7a3c51249097dae1969136eb46c07dc 100644
--- a/app/fin/service/purse_service.go
+++ b/app/fin/service/purse_service.go
@@ -27,6 +27,7 @@ type IFinPurseService interface {
 	Stats(listReq finReq.FinPurseListReq, auth *request.AuthReq) (res finReq.FinPurseStatsResp, e error)
 	FeeChange(addReq finReq.FinPurseFeeEditReq, auth *request.AuthReq) (e error)
 	GetHouseAmont(houseId uint, ecsType string) (amount float64, e error)
+	GetPurseIds(listReq finReq.FinPurseIdsReq) (purseIds []uint, e error)
 }
 
 // NewFinPurseService 初始化
@@ -438,6 +439,11 @@ func (srv finPurseService) FeeChange(addReq finReq.FinPurseFeeEditReq, auth *req
 		TenantId:      obj.TenantId,
 		PaymentTime:   addReq.PaymentTime,
 		PaymentMethod: addReq.PaymentMethod,
+		Payee:         auth.Username,
+	}
+	nilTime := time.Time{}
+	if flow.PaymentTime == nilTime {
+		flow.PaymentTime = now
 	}
 	saveObj.CreateBy = auth.Username
 	saveObj.CreateTime = now
@@ -480,3 +486,35 @@ func (srv finPurseService) GetHouseAmont(houseId uint, ecsType string) (amount f
 	}
 	return
 }
+
+// 获取指定类型费用
+func (srv finPurseService) GetPurseIds(listReq finReq.FinPurseIdsReq) (purseIds []uint, e error) {
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurse{}), nil)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like ?", "%"+listReq.AreaName+"%")
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like ?", "%"+listReq.HouseName+"%")
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like ?", "%"+listReq.OwnerName+"%")
+	}
+	if listReq.EcsType != "" {
+		model = model.Where("ecs_type = ?", listReq.EcsType)
+	}
+	err := model.Select("id").Find(&purseIds).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	return
+}
diff --git a/app/fin/service/report_service.go b/app/fin/service/report_service.go
index ff498ebd4817050cb44165d269e2b531364716b8..6ff912ac7b94fcdfbf9d42ed8c990bb35b9e4aed 100644
--- a/app/fin/service/report_service.go
+++ b/app/fin/service/report_service.go
@@ -1,27 +1,633 @@
 package service
 
 import (
+	"energy-server-mgo/app/admin/schemas/query"
 	request "energy-server-mgo/app/admin/schemas/req"
+	"energy-server-mgo/app/fin/constants"
+	finModel "energy-server-mgo/app/fin/model"
 	finReq "energy-server-mgo/app/fin/schemas"
+	"energy-server-mgo/core/response"
+	"time"
 
 	"gorm.io/gorm"
 )
 
 type IFinReportService interface {
-	List(listReq finReq.FinCommonDeviceReq, auth *request.AuthReq) (res []finReq.FinCommonDeviceResp, e error)
+	InfoStatsEcs(listReq finReq.FinReportEcsReq, auth *request.AuthReq) (res finReq.FinReportEcsStasRes, e error)
+	ListEcs(page request.PageReq, listReq finReq.FinReportEcsReq, auth *request.AuthReq) (res response.PageResp, e error)
+	InfoStatsPurse(listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res finReq.FinReportPurseStasRes, e error)
+	ListPurseFlow(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error)
+	ListPurseDeduct(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error)
+	ListPurseUsage(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error)
+	ListStepBill(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error)
+	ListPurseShared(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error)
 }
 
 // NewFinReportService 初始化
-func NewFinReportService(db *gorm.DB) IFinReportService {
-	return &finReportService{db: db}
+func NewFinReportService(db *gorm.DB, srvBill IFinBillService, srvPurse IFinPurseService, srvPurseFlow IFinPurseFlowService, srvCommon IFinCommonService) IFinReportService {
+	return &finReportService{db: db, srvBill: srvBill, srvPurse: srvPurse, srvCommon: srvCommon, srvPurseFlow: srvPurseFlow}
 }
 
 // finReportService 通用服务实现类
 type finReportService struct {
-	db *gorm.DB
+	db           *gorm.DB
+	srvBill      IFinBillService
+	srvPurse     IFinPurseService
+	srvPurseFlow IFinPurseFlowService
+	srvCommon    IFinCommonService
 }
 
-// List
-func (srv finReportService) List(listReq finReq.FinCommonDeviceReq, auth *request.AuthReq) (res []finReq.FinCommonDeviceResp, e error) {
-	return []finReq.FinCommonDeviceResp{}, nil
+// InfoStatsEcs 能耗账单
+func (srv finReportService) InfoStatsEcs(listReq finReq.FinReportEcsReq, auth *request.AuthReq) (res finReq.FinReportEcsStasRes, e error) {
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinBill{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like ?", "%"+listReq.AreaName+"%")
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like ?", "%"+listReq.HouseName+"%")
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like ?", "%"+listReq.OwnerName+"%")
+	}
+	if listReq.OnAccount != "" {
+		model = model.Where("on_account = ?", listReq.OnAccount)
+	}
+	// 数据
+	var objs []finReq.FinReportEcsStasRes
+	err := model.Select("sum(bill_amount) as bill_amount, sum(unpaid_amount) as unpaid_amount, sum(paid_amount) as paid_amount, sum(late_amount) as late_amount, sum(reduction_amount) as reduction_amount, sum(usage_total) as usage_total").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	for _, obj := range objs {
+		res.BillAmount += obj.BillAmount
+		res.LateAmount += obj.LateAmount
+		res.PaidAmount += obj.PaidAmount
+		res.UnpaidAmount += obj.UnpaidAmount
+		res.ReductionAmount += obj.ReductionAmount
+		res.UsageTotal += obj.UsageTotal
+	}
+
+	// 数据
+	purseIds, _ := srv.srvPurse.GetPurseIds(listReq.FinPurseIdsReq)
+	if len(purseIds) <= 0 {
+		return
+	}
+	// 查询
+	sql := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	sql = sql.Where("purse_id in (?)", purseIds)
+	sql = sql.Where("fee_type = 'refund'")
+	var tmpObjs []finReq.FinReportEcsStasRes
+	err = sql.Select("sum(operate_amount) as refund_amount").Find(&tmpObjs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	for _, obj := range tmpObjs {
+		res.RefundAmount += obj.RefundAmount
+	}
+
+	return
+}
+
+// ListEcs 能耗账单列表(含用能费用报表)
+func (srv finReportService) ListEcs(page request.PageReq, listReq finReq.FinReportEcsReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinBill{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like ?", "%"+listReq.AreaName+"%")
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like ?", "%"+listReq.HouseName+"%")
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like ?", "%"+listReq.OwnerName+"%")
+	}
+	if listReq.OnAccount != "" {
+		model = model.Where("on_account = ?", listReq.OnAccount)
+	}
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinBill
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	nilTime := time.Time{}
+	resps := []finReq.FinReportEcsListRes{}
+	for _, obj := range objs {
+		var item finReq.FinReportEcsListRes
+		response.Copy(&item, obj)
+		item.MeterType = constants.GetEcsTypeName(item.FeeName)
+		item.FeeNameTip = constants.GetFeeName(item.FeeName) + "-" + obj.Address
+		item.FeeRange = obj.StartDate.Format("2006-01-02") + " 至 " + obj.EndDate.Format("2006-01-02")
+		if obj.StartDate != nilTime {
+			item.StartDate = obj.StartDate.Format("2006-01-02")
+		}
+		if obj.EndDate != nilTime {
+			item.EndDate = obj.EndDate.Format("2006-01-02")
+		}
+		if obj.FinTime != nilTime {
+			item.FinTime = obj.FinTime.Format("2006-01-02 15:04:05")
+		}
+		flows, err := srv.srvPurseFlow.ListFlowByBillId(obj.Id, constants.FlowTypeEnum.Bill, "deduct")
+		if err == nil && len(flows) > 0 {
+			flow := flows[0]
+			item.PaymentMethod = constants.GetPaymentMethod(flow.PaymentMethod)
+			if flow.PaymentTime != nilTime {
+				item.PaymentTime = flow.PaymentTime.Format("2006-01-02 15:04:05")
+			}
+			item.Payee = flow.Payee
+			item.Payer = flow.Payer
+		}
+		resps = append(resps, item)
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
+}
+
+// InfoStatsPurse 钱包统计
+func (srv finReportService) InfoStatsPurse(listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res finReq.FinReportPurseStasRes, e error) {
+	// 数据
+	purseIds, _ := srv.srvPurse.GetPurseIds(listReq.FinPurseIdsReq)
+	if len(purseIds) <= 0 {
+		return
+	}
+
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like %?%", listReq.OwnerName)
+	}
+	if listReq.EcsType != "" {
+		model = model.Where("owner_name = ?", listReq.EcsType)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("payment_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("payment_time <= ?", listReq.EndDay)
+	}
+	model = model.Where("purse_id in(?)", purseIds)
+
+	var statsList []finReq.FinReportPurseStasRes
+	// 数据
+	err := model.Select("ecs_type, fee_type, sum(operate_amount) as total_amount").Group("ecs_type, fee_type").Find(&statsList).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+	for _, stats := range statsList {
+		res.Total.TotalAmount += stats.TotalAmount
+		if stats.FeeType == "pay" {
+			res.Total.PaidAmount += stats.TotalAmount
+		}
+		if stats.EcsType == "electric" {
+			res.Electric.TotalAmount += stats.TotalAmount
+			if stats.FeeType == "pay" {
+				res.Electric.PaidAmount += stats.TotalAmount
+			}
+			continue
+		}
+		if stats.EcsType == "water" {
+			res.Water.TotalAmount += stats.TotalAmount
+			if stats.FeeType == "pay" {
+				res.Water.PaidAmount += stats.TotalAmount
+			}
+			continue
+		}
+		if stats.EcsType == "gas" {
+			res.Gas.TotalAmount += stats.TotalAmount
+			if stats.FeeType == "pay" {
+				res.Gas.PaidAmount += stats.TotalAmount
+			}
+		}
+	}
+	return
+}
+
+// ListPurseFlow 钱包流水报表
+func (srv finReportService) ListPurseFlow(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	// 数据
+	purseIds, _ := srv.srvPurse.GetPurseIds(listReq.FinPurseIdsReq)
+	if len(purseIds) <= 0 {
+		return
+	}
+
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like %?%", listReq.OwnerName)
+	}
+	if listReq.EcsType != "" {
+		model = model.Where("owner_name = ?", listReq.EcsType)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("payment_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("payment_time <= ?", listReq.EndDay)
+	}
+	if len(listReq.FeeType) > 0 {
+		model = model.Where("fee_type = ?", listReq.FeeType)
+	}
+	model = model.Where("flow_type = ?", constants.FlowTypeEnum.Purse)
+	model = model.Where("purse_id in(?)", purseIds)
+
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinPurseFlow
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	resps := []finReq.FinReportPurseFlowListRes{}
+	for _, obj := range objs {
+		var item finReq.FinReportPurseFlowListRes
+		response.Copy(&item, obj)
+		if len(item.AreaName) <= 0 {
+			purse, err := srv.srvPurse.Detail(item.PurseId, auth)
+			if err == nil && purse.Id > 0 {
+				item.AreaName = purse.AreaName
+				item.HouseName = purse.HouseName
+			}
+		}
+		item.EcsType = constants.GetEcsTypeName(item.EcsType)
+		item.PaymentMethod = constants.GetPaymentMethod(item.PaymentMethod)
+		item.PaymentTime = obj.PaymentTime.Format("2006-01-02 15:04:05")
+		resps = append(resps, item)
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
+}
+
+// ListPurseDeduct 扣费报表
+func (srv finReportService) ListPurseDeduct(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	// 数据
+	purseIds, _ := srv.srvPurse.GetPurseIds(listReq.FinPurseIdsReq)
+	if len(purseIds) <= 0 {
+		return
+	}
+
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	if listReq.OwnerId != 0 {
+		model = model.Where("owner_id = ?", listReq.OwnerId)
+	}
+	if listReq.OwnerName != "" {
+		model = model.Where("owner_name like %?%", listReq.OwnerName)
+	}
+	if listReq.EcsType != "" {
+		model = model.Where("owner_name = ?", listReq.EcsType)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("payment_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("payment_time <= ?", listReq.EndDay)
+	}
+	model = model.Where("fee_type = 'deduct'")
+	model = model.Where("purse_id in(?)", purseIds)
+
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinPurseFlow
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	resps := []finReq.FinReportPurseDeductListRes{}
+	response.Copy(&resps, objs)
+	for _, obj := range objs {
+		var item finReq.FinReportPurseDeductListRes
+		response.Copy(&item, obj)
+		item.EcsType = constants.GetEcsTypeName(item.EcsType)
+		item.PaymentMethod = constants.GetPaymentMethod(item.PaymentMethod)
+		item.PaymentTime = obj.PaymentTime.Format("2006-01-02 15:04:05")
+		ownerMap, _ := srv.srvCommon.ListHouseOwnerMap(finReq.FinCommonOwnerHouseReq{HouseId: item.HouseId}, auth)
+		var ownerNames string
+		if owners, find := ownerMap[item.HouseId]; find {
+			for idx, owner := range owners {
+				if idx == 0 {
+					ownerNames = owner.OwnerName
+				} else {
+					ownerNames = ownerNames + "," + owner.OwnerName
+				}
+			}
+		}
+		item.OwnerName = ownerNames
+		if item.BillId > 0 {
+			bill, err := srv.srvBill.Detail(item.BillId, auth)
+			if err == nil && bill.Id > 0 {
+				item.UsageStart = bill.UsageStart
+				item.UsageEnd = bill.UsageEnd
+				item.UsageTotal = bill.UsageTotal
+			}
+		}
+		resps = append(resps, item)
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
+}
+
+// ListPurseUsage 用能费用报表
+func (srv finReportService) ListPurseUsage(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("fin_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("fin_time <= ?", listReq.EndDay)
+	}
+	model = model.Where("bill_type = '0'")
+
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinBill
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	resps := []finReq.FinReportPurseUsageListRes{}
+	response.Copy(&resps, objs)
+	for index, item := range resps {
+		purse, err := srv.srvPurse.Detail(item.PurseId, auth)
+		if err == nil && purse.Id > 0 {
+			item.PurseAmount = purse.ElectricAmount
+		}
+		resps[index] = item
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
+}
+
+// ListStepBill 阶梯电价列表
+func (srv finReportService) ListStepBill(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("ecs_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("ecs_time <= ?", listReq.EndDay)
+	}
+	model = model.Where("bill_type = '0'")
+
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinBill
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	resps := []finReq.FinReportStepListRes{}
+	response.Copy(&resps, objs)
+	for index, item := range resps {
+		step := finReq.FinReportStepItemRes{
+			Id:     0,
+			Usage:  100,
+			Amount: 10.23,
+		}
+		item.Details = append(item.Details, step)
+		step1 := finReq.FinReportStepItemRes{
+			Id:     1,
+			Usage:  100,
+			Amount: 10.23,
+		}
+		item.Details = append(item.Details, step1)
+		step2 := finReq.FinReportStepItemRes{
+			Id:     2,
+			Usage:  100,
+			Amount: 10.23,
+		}
+		item.Details = append(item.Details, step2)
+		step3 := finReq.FinReportStepItemRes{
+			Id:     3,
+			Usage:  100,
+			Amount: 10.23,
+		}
+		item.Details = append(item.Details, step3)
+		resps[index] = item
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
+}
+
+// ListPurseShared 公摊账单列表
+func (srv finReportService) ListPurseShared(page request.PageReq, listReq finReq.FinReportPurseReq, auth *request.AuthReq) (res response.PageResp, e error) {
+	// 分页信息
+	limit := page.PageSize
+	offset := page.PageSize * (page.PageNo - 1)
+	// 查询
+	model := query.NewAuthQuery(srv.db.Model(&finModel.FinPurseFlow{}), auth)
+	if listReq.AreaId != 0 {
+		model = model.Where("area_id = ?", listReq.AreaId)
+	}
+	if len(listReq.AreaName) > 0 {
+		model = model.Where("area_name like %?%", listReq.AreaName)
+	}
+	if listReq.HouseId != 0 {
+		model = model.Where("house_id = ?", listReq.HouseId)
+	}
+	if listReq.HouseName != "" {
+		model = model.Where("house_name like %?%", listReq.HouseName)
+	}
+	nilTime := time.Time{}
+	if listReq.StartDay != nilTime {
+		model = model.Where("payment_time >= ?", listReq.StartDay)
+	}
+	if listReq.EndDay != nilTime {
+		model = model.Where("payment_time <= ?", listReq.EndDay)
+	}
+
+	var finBill finModel.FinBill
+	billCond := "select id from " + finBill.TableName() + " where bill_type in('3','4','5','6')"
+	model = model.Where("bill_id in(" + billCond + ")")
+
+	// 总数
+	var count int64
+	err := model.Count(&count).Error
+	if e = response.CheckErr(err, "List Count err"); e != nil {
+		return
+	}
+	// 数据
+	var objs []finModel.FinPurseFlow
+	err = model.Limit(limit).Offset(offset).Order("id desc").Find(&objs).Error
+	if e = response.CheckErr(err, "List Find err"); e != nil {
+		return
+	}
+
+	resps := []finReq.FinReportSharedBillRes{}
+	response.Copy(&resps, objs)
+	for index, item := range resps {
+		bill, err := srv.srvBill.Detail(item.BillId, auth)
+		if err == nil && bill.Id > 0 {
+			item.AreaName = bill.AreaName
+			item.HouseName = bill.HouseName
+			item.DeviceName = bill.DeviceName
+			item.Address = bill.Address
+		}
+		resps[index] = item
+	}
+	return response.PageResp{
+		PageNo:   page.PageNo,
+		PageSize: page.PageSize,
+		Count:    count,
+		Lists:    resps,
+	}, nil
 }
diff --git a/app/fin/task/billing_apportion_task.go b/app/fin/task/billing_apportion_task.go
index e43c09043af05cc52a5e2d19d392ad633fc18314..4d31f3ec9069b803fb68311301e568a042d2c27d 100644
--- a/app/fin/task/billing_apportion_task.go
+++ b/app/fin/task/billing_apportion_task.go
@@ -31,6 +31,7 @@ type ApportionTaskServer struct {
 	srvPayment         finSvr.IFinPaymentService
 	srvRecord          finSvr.IFinDeviceRecordService
 	srvScheme          finSvr.IFinApportionSchemesService
+	srvElectric        finSvr.IFinSharedElectricService
 	srvSharedCommon    *SharedCommon
 }
 
@@ -77,38 +78,43 @@ func NewApportionTaskServer() *ApportionTaskServer {
 	}); err != nil {
 		panic(err)
 	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinSharedElectricService) {
+		server.srvElectric = s
+	}); err != nil {
+		panic(err)
+	}
 	server.srvSharedCommon = NewSharedCommon()
 
 	return server
 }
 
 // 启动定时任务
-func (apportion *ApportionTaskServer) Start(cron string) {
-	_, err := apportion.taskCron.AddFunc(cron, apportion.calcElectricFee)
+func (task *ApportionTaskServer) Start(cron string) {
+	_, err := task.taskCron.AddFunc(cron, task.calcElectricFee)
 	if err != nil {
 		fmt.Println("Add Billing Task error:{}", err)
 		return
 	}
-	_, err = apportion.taskCron.AddFunc(cron, apportion.calcWaterFee)
+	_, err = task.taskCron.AddFunc(cron, task.calcWaterFee)
 	if err != nil {
 		fmt.Println("Add Billing Task error:{}", err)
 		return
 	}
-	_, err = apportion.taskCron.AddFunc(cron, apportion.calcGasFee)
+	_, err = task.taskCron.AddFunc(cron, task.calcGasFee)
 	if err != nil {
 		fmt.Println("Add Billing Task error:{}", err)
 		return
 	}
-	apportion.taskCron.Start()
+	task.taskCron.Start()
 }
 
 // 停止定时任务
-func (apportion *ApportionTaskServer) Stop() {
-	apportion.taskCron.Stop()
+func (task *ApportionTaskServer) Stop() {
+	task.taskCron.Stop()
 }
 
 // 计算电力分摊费用
-func (apportion *ApportionTaskServer) calcElectricFee() {
+func (task *ApportionTaskServer) calcElectricFee() {
 	core.TryLock(constants.Lock_key_AElectric, "1", 5*time.Minute)
 	defer core.UnLock(constants.Lock_key_AElectric)
 
@@ -116,11 +122,11 @@ func (apportion *ApportionTaskServer) calcElectricFee() {
 	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
 	startDay := endDay.AddDate(0, -1, 0)
 	endDay = time.Date(endDay.Year(), endDay.Month(), 1, 0, 0, 0, 0, now.Location())
-	apportion.calcFeeAuto("electric", constants.BillTypeEnum.AElectric, startDay, endDay)
+	task.calcFeeAuto("electric", constants.BillTypeEnum.AElectric, startDay, endDay)
 }
 
 // 计算电力分摊费用
-func (apportion *ApportionTaskServer) calcWaterFee() {
+func (task *ApportionTaskServer) calcWaterFee() {
 	core.TryLock(constants.Lock_key_AWater, "1", 5*time.Minute)
 	defer core.UnLock(constants.Lock_key_AWater)
 
@@ -128,11 +134,11 @@ func (apportion *ApportionTaskServer) calcWaterFee() {
 	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
 	startDay := endDay.AddDate(0, -1, 0)
 	endDay = time.Date(endDay.Year(), endDay.Month(), 1, 0, 0, 0, 0, now.Location())
-	apportion.calcFeeAuto("water", constants.BillTypeEnum.AWater, startDay, endDay)
+	task.calcFeeAuto("water", constants.BillTypeEnum.AWater, startDay, endDay)
 }
 
 // 计算电力分摊费用
-func (apportion *ApportionTaskServer) calcGasFee() {
+func (task *ApportionTaskServer) calcGasFee() {
 	core.TryLock(constants.Lock_key_AGas, "1", 5*time.Minute)
 	defer core.UnLock(constants.Lock_key_AGas)
 
@@ -140,7 +146,7 @@ func (apportion *ApportionTaskServer) calcGasFee() {
 	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
 	startDay := endDay.AddDate(0, -1, 0)
 	endDay = time.Date(endDay.Year(), endDay.Month(), 1, 0, 0, 0, 0, now.Location())
-	apportion.calcFeeAuto("gas", constants.BillTypeEnum.AGas, startDay, endDay)
+	task.calcFeeAuto("gas", constants.BillTypeEnum.AGas, startDay, endDay)
 }
 
 // 计算电力分摊费用
@@ -152,7 +158,7 @@ func (task *ApportionTaskServer) calcFeeManual(houseIds []uint, ownerId uint,
 	if err != nil || len(ownerList) <= 0 {
 		record := finReq.FinBillManulErrResp{
 			RetCode: "101",
-			RetDesc: "该房间无分摊业主",
+			RetDesc: "该房间无分摊方案",
 		}
 		rets = append(rets, record)
 		return rets
@@ -171,7 +177,7 @@ func (task *ApportionTaskServer) calcFeeManual(houseIds []uint, ownerId uint,
 		}
 		devSchemeMap[key] = scheme
 	}
-	dataRecords, err := task.srvRecord.ListByHouseIds(nil, deviceIds, constants.BillTypeEnum.SElectric, startDay, endDay)
+	dataRecords, err := task.srvRecord.ListByHouseIds(nil, nil, deviceIds, constants.BillTypeEnum.SElectric, true, startDay, endDay)
 	if err != nil || len(dataRecords) <= 0 {
 		var cond finReq.FinCommonDeviceReq
 		cond.HouseIds = houseIds
@@ -179,7 +185,7 @@ func (task *ApportionTaskServer) calcFeeManual(houseIds []uint, ownerId uint,
 		if err != nil || len(houses) <= 0 {
 			record := finReq.FinBillManulErrResp{
 				RetCode: "101",
-				RetDesc: "无设备",
+				RetDesc: "无关联设备",
 			}
 			return append(rets, record)
 		}
@@ -219,7 +225,10 @@ func (task *ApportionTaskServer) calcFeeManual(houseIds []uint, ownerId uint,
 	}
 	for _, manual := range manualMap {
 		key := strconv.FormatUint(uint64(manual.HouseId), 10) + ":" + strconv.FormatUint(uint64(manual.DeviceId), 10)
-		scheme, _ := devSchemeMap[key]
+		scheme, find := devSchemeMap[key]
+		if !find {
+			continue
+		}
 		var arr []finReq.FinBillManulResp
 		switch scheme.SharedMethod {
 		case "area":
@@ -260,7 +269,7 @@ func (task *ApportionTaskServer) calcFeeAuto(schemeType string, billType string,
 		}
 		devSchemeMap[key] = scheme
 	}
-	dataRecords, err := task.srvRecord.ListByHouseIds(nil, deviceIds, constants.BillTypeEnum.SElectric, startDay, endDay)
+	dataRecords, err := task.srvRecord.ListByHouseIds(nil, nil, deviceIds, constants.BillTypeEnum.SElectric, true, startDay, endDay)
 	if err != nil || len(dataRecords) <= 0 {
 		return err
 	}
diff --git a/app/fin/task/billing_ecs_task.go b/app/fin/task/billing_ecs_task.go
index ff410b01310e73100c2fc3a2d892d365d6d81d24..ebc4dd8faa5203e0ad6dafa08cb2af61913e70f0 100644
--- a/app/fin/task/billing_ecs_task.go
+++ b/app/fin/task/billing_ecs_task.go
@@ -1,6 +1,7 @@
 package task
 
 import (
+	"encoding/json"
 	"errors"
 	"fmt"
 	"math"
@@ -205,6 +206,29 @@ func (task *EcsTaskServer) calcFee() {
 				default:
 					break
 				}
+				stepFee := ""
+				if scheme.BillingMethod == "4" || scheme.BillingMethod == "5" {
+					stepItemMap := make(map[int]finReq.SchemeStepItem)
+					for _, scheme := range schemeTimes {
+						item, find := stepItemMap[scheme.seq]
+						if !find {
+							item.Seq = scheme.seq
+							item.BillAmmount = 0
+							item.UsageTotal = 0
+						}
+						item.BillAmmount += scheme.billAmmount
+						item.UsageTotal += scheme.usageTotal
+						stepItemMap[scheme.seq] = item
+					}
+					var stepFeeList []finReq.SchemeStepItem
+					for _, scheme := range stepItemMap {
+						stepFeeList = append(stepFeeList, scheme)
+					}
+					tmpFee, err := json.Marshal(stepFeeList)
+					if err == nil {
+						stepFee = string(tmpFee)
+					}
+				}
 				actionReq, find := houseFeeMap[houseId]
 				if !find {
 					actionReq.DeviceId = device.DeviceId
@@ -213,48 +237,50 @@ func (task *EcsTaskServer) calcFee() {
 				houseFeeMap[houseId] = actionReq
 
 				bill := finModel.FinBill{
-					BillType:   billType,
-					RegionId:   device.RegionId,
-					RegionName: device.RegionName,
-					AreaId:     device.AreaId,
-					AreaName:   device.AreaName,
-					HouseId:    houseId,
-					HouseName:  houseName,
-					DeviceId:   device.DeviceId,
-					DeviceName: device.DeviceName,
-					StartDate:  startDay,
-					EndDate:    endDay,
-					BillAmount: math.Round(billAmount*100) / 100,
-					UsageStart: math.Round(totalUsageStart*100) / 100,
-					UsageEnd:   math.Round(totalUsageEnd*100) / 100,
-					UsageTotal: math.Round(usageTotal*100) / 100,
-					TenantId:   scheme.TenantId,
-					FinTime:    finTime,
-					EcsTime:    endDay,
+					BillType:      billType,
+					RegionId:      device.RegionId,
+					RegionName:    device.RegionName,
+					AreaId:        device.AreaId,
+					AreaName:      device.AreaName,
+					HouseId:       houseId,
+					HouseName:     houseName,
+					DeviceId:      device.DeviceId,
+					DeviceName:    device.DeviceName,
+					StartDate:     startDay,
+					EndDate:       endDay,
+					BillAmount:    math.Round(billAmount*100) / 100,
+					UsageStart:    math.Round(totalUsageStart*100) / 100,
+					UsageEnd:      math.Round(totalUsageEnd*100) / 100,
+					UsageTotal:    math.Round(usageTotal*100) / 100,
+					TenantId:      scheme.TenantId,
+					FinTime:       finTime,
+					EcsTime:       endDay,
+					BillingMethod: scheme.BillingMethod,
+					StepFee:       stepFee,
 				}
 				bill.CreateTime = createTime
 				billRecords = append(billRecords, bill)
-				record := finModel.FinPayment{
-					BillType:   billType,
-					RegionId:   device.RegionId,
-					RegionName: device.RegionName,
-					AreaId:     device.AreaId,
-					AreaName:   device.AreaName,
-					HouseId:    houseId,
-					HouseName:  houseName,
-					DeviceId:   device.DeviceId,
-					DeviceName: device.DeviceName,
-					StartDate:  startDay,
-					EndDate:    endDay,
-					BillAmount: math.Round(billAmount*100) / 100,
-					UsageStart: math.Round(totalUsageStart*100) / 100,
-					UsageEnd:   math.Round(totalUsageEnd*100) / 100,
-					UsageTotal: math.Round(usageTotal*100) / 100,
-					TenantId:   scheme.TenantId,
-					FinTime:    finTime,
-				}
-				record.CreateTime = createTime
-				records = append(records, record)
+				// record := finModel.FinPayment{
+				// 	BillType:   billType,
+				// 	RegionId:   device.RegionId,
+				// 	RegionName: device.RegionName,
+				// 	AreaId:     device.AreaId,
+				// 	AreaName:   device.AreaName,
+				// 	HouseId:    houseId,
+				// 	HouseName:  houseName,
+				// 	DeviceId:   device.DeviceId,
+				// 	DeviceName: device.DeviceName,
+				// 	StartDate:  startDay,
+				// 	EndDate:    endDay,
+				// 	BillAmount: math.Round(billAmount*100) / 100,
+				// 	UsageStart: math.Round(totalUsageStart*100) / 100,
+				// 	UsageEnd:   math.Round(totalUsageEnd*100) / 100,
+				// 	UsageTotal: math.Round(usageTotal*100) / 100,
+				// 	TenantId:   scheme.TenantId,
+				// 	FinTime:    finTime,
+				// }
+				// record.CreateTime = createTime
+				// records = append(records, record)
 			}
 		}
 		if scheme.FeeAction == "1" {
@@ -329,9 +355,6 @@ func (task *EcsTaskServer) calcFeeManual(billType string, houseIds []uint, owner
 	}
 	for _, scheme := range lists {
 		// 查询符合条件设备
-		var cond finReq.FinEcsDeviceListReq
-		cond.SchemeId = scheme.Id
-		cond.HouseIds = houseIds
 		houseToDeviceMap := make(map[uint][]finReq.FinEcsSchemeDeviceResp)
 		deviceList, _ := task.srvEcsDev.ListSchemeValidDevice(scheme.Id, 0, ownerId, 0, houseIds, "")
 		if len(deviceList) <= 0 {
@@ -446,28 +469,54 @@ func (task *EcsTaskServer) calcFeeManual(billType string, houseIds []uint, owner
 				default:
 					break
 				}
+				stepFee := ""
+				if scheme.BillingMethod == "4" || scheme.BillingMethod == "5" {
+					stepItemMap := make(map[int]finReq.SchemeStepItem)
+					for _, scheme := range schemeTimes {
+						item, find := stepItemMap[scheme.seq]
+						if !find {
+							item.Seq = scheme.seq
+							item.BillAmmount = 0
+							item.UsageTotal = 0
+						}
+						item.BillAmmount += scheme.billAmmount
+						item.UsageTotal += scheme.usageTotal
+						stepItemMap[scheme.seq] = item
+					}
+					var stepFeeList []finReq.SchemeStepItem
+					for _, scheme := range stepItemMap {
+						stepFeeList = append(stepFeeList, scheme)
+					}
+					tmpFee, err := json.Marshal(stepFeeList)
+					if err == nil {
+						stepFee = string(tmpFee)
+					}
+				}
+
 				record := finReq.FinBillManulResp{
-					BillType:   billType,
-					RegionId:   device.RegionId,
-					RegionName: device.RegionName,
-					AreaId:     device.AreaId,
-					AreaName:   device.AreaName,
-					HouseId:    houseId,
-					HouseName:  houseName,
-					HouseArea:  houseArea,
-					DeviceId:   device.DeviceId,
-					DeviceName: device.DeviceName,
-					Address:    device.Address,
-					MeterType:  device.MeterType,
-					StartDate:  startDay,
-					EndDate:    endDay,
-					FeeName:    feeName,
-					BillAmount: math.Round(billAmount*100) / 100,
-					UsageStart: math.Round(totalUsageStart*100) / 100,
-					UsageEnd:   math.Round(totalUsageEnd*100) / 100,
-					UsageTotal: math.Round(usageTotal*100) / 100,
-					FinTime:    finTime,
-					RetCode:    "200",
+					BillType:      billType,
+					RegionId:      device.RegionId,
+					RegionName:    device.RegionName,
+					AreaId:        device.AreaId,
+					AreaName:      device.AreaName,
+					HouseId:       houseId,
+					HouseName:     houseName,
+					HouseArea:     houseArea,
+					DeviceId:      device.DeviceId,
+					DeviceName:    device.DeviceName,
+					Address:       device.Address,
+					MeterType:     device.MeterType,
+					StartDate:     startDay,
+					EndDate:       endDay,
+					FeeName:       feeName,
+					BillAmount:    math.Round(billAmount*100) / 100,
+					UsageStart:    math.Round(totalUsageStart*100) / 100,
+					UsageEnd:      math.Round(totalUsageEnd*100) / 100,
+					UsageTotal:    math.Round(usageTotal*100) / 100,
+					FinTime:       finTime,
+					RetCode:       "200",
+					BillingMethod: scheme.BillingMethod,
+					StepFee:       stepFee,
 				}
 				records = append(records, record)
 			}
@@ -554,6 +603,7 @@ func (task *EcsTaskServer) calcStepFee(schemeId uint, schemeTimes []*SchemeTime)
 			price := item.(float64)
 			ammount += usageTotal * price
 		}
+		schemeTime.billAmmount = ammount
 	}
 	return ammount
 }
diff --git a/app/fin/task/billing_shared_att_task.go b/app/fin/task/billing_shared_att_task.go
index eeab502fcbcf5dc8fe78b501d86c4e1591a549d6..45ee523bb9daeb3717e5b45ed55327307eb06312 100644
--- a/app/fin/task/billing_shared_att_task.go
+++ b/app/fin/task/billing_shared_att_task.go
@@ -1,8 +1,6 @@
 package task
 
 import (
-	"strconv"
-	"strings"
 	"time"
 
 	devSvr "energy-server-mgo/app/admin/service/device"
@@ -81,32 +79,27 @@ func (task *SharedAttTask) calcFee() {
 	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
 	startDay := endDay.AddDate(0, 0, -1)
 
+	deviceTypes := []string{}
 	var cond finReq.FinSharedListReq
 	lists, _ := task.srvAtt.ListAll(cond)
 	for _, scheme := range lists {
 		var areaIds []uint
-		for _, val := range strings.Split(scheme.AreaIds, ",") {
-			tmpId, err := strconv.ParseUint(val, 10, 64)
-			if err != nil {
-				continue
-			}
-			areaIds = append(areaIds, uint(tmpId))
-		}
-		houseList, err := task.srvCommon.ListCommonAreaHouse(areaIds, nil)
-		if err != nil {
+		areaIds = append(areaIds, scheme.CommonAreaId)
+		deviceList, _ := task.srvCommon.ListCommonAreaDevice(areaIds, deviceTypes)
+		if len(deviceList) <= 0 {
 			continue
 		}
 		var deviceRecords []finModel.FinDeviceRecord
 		billAmount := float64(scheme.Price[0].(float64))
 		switch scheme.ApportionMethod {
 		case "0":
-			deviceRecords = task.srvSharedCommon.calcAttSquareFee(houseList, scheme.SquareType, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(deviceRecords, deviceTypes, scheme.MigrDate, startDay, scheme.SquareType, billAmount)
 			break
 		case "1":
-			deviceRecords = task.srvSharedCommon.calcAttHouseFee(houseList, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(deviceRecords, deviceTypes, scheme.MigrDate, startDay, billAmount)
 			break
 		case "2":
-			deviceRecords = task.srvSharedCommon.calcAttSelfFee(houseList, scheme.Price, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(deviceRecords, deviceTypes, scheme.MigrDate, scheme.Price, startDay, endDay, billAmount)
 			break
 		}
 		for idx, record := range deviceRecords {
diff --git a/app/fin/task/billing_shared_common.go b/app/fin/task/billing_shared_common.go
index fbb7af198393dfe7759ec538febd3ffd6ad8dc56..2d33fd6017d158590c2ff10e88c342b53bd7e0ab 100644
--- a/app/fin/task/billing_shared_common.go
+++ b/app/fin/task/billing_shared_common.go
@@ -1,6 +1,7 @@
 package task
 
 import (
+	"strconv"
 	"time"
 
 	devSvr "energy-server-mgo/app/admin/service/device"
@@ -40,17 +41,47 @@ func NewSharedCommon() *SharedCommon {
 }
 
 // 计算公摊分摊费用(面积)
-func (common *SharedCommon) calcSharedSquareFee(deviceList []finModel.FinDeviceRecord, squareType string, unpaid float64) []finModel.FinDeviceRecord {
-	var houseIds []uint
-	for _, device := range deviceList {
-		houseIds = append(houseIds, device.HouseId)
+func (common *SharedCommon) calcSharedSquareFee(recordList []finModel.FinDeviceRecord, deviceTypes []string, migrDate string, startDay time.Time, squareType string, unpaid float64) []finModel.FinDeviceRecord {
+	var areaIds []uint
+	for _, device := range recordList {
+		areaIds = append(areaIds, device.AreaId)
 	}
-	houseMap, err := common.srvCommon.ListHouseMap(0, houseIds, nil)
+	houseList, err := common.srvCommon.ListHouseDevice(nil, areaIds, deviceTypes)
 	if err != nil {
 		return nil
 	}
+	migrDay := 0
+	if len(migrDate) > 0 {
+		if val, err := strconv.Atoi(migrDate); err == nil {
+			migrDay = val
+		}
+	}
+
+	var houseIds []uint
+	houseMap := make(map[uint]finReq.HouseInfo)
 	totalArea := float64(0.00)
-	for _, house := range houseMap {
+	for _, house := range houseList {
+		houseId := house.HouseId
+		isVac := true
+		if migrDay > 0 {
+			if house.MoveInTime > 0 && house.MoveOutTime <= 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if day >= migrDay {
+					isVac = false
+				}
+			} else if house.MoveInTime > 0 && house.MoveOutTime > 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if startDay.Unix() > house.MoveOutTime {
+					isVac = false
+				} else if day >= migrDay {
+					isVac = false
+				}
+			}
+		}
+		if isVac {
+			houseMap[houseId] = house
+		}
+
 		var area float64
 		switch squareType {
 		case "build":
@@ -67,10 +98,11 @@ func (common *SharedCommon) calcSharedSquareFee(deviceList []finModel.FinDeviceR
 			break
 		}
 		totalArea += area
+		houseIds = append(houseIds, houseId)
 	}
-
-	for idx, device := range deviceList {
-		house, find := houseMap[device.HouseId]
+	var retrecordList []finModel.FinDeviceRecord
+	for _, record := range recordList {
+		house, find := houseMap[record.HouseId]
 		if !find {
 			continue
 		}
@@ -93,29 +125,109 @@ func (common *SharedCommon) calcSharedSquareFee(deviceList []finModel.FinDeviceR
 		if totalArea != 0.00 {
 			price = utils.RoundWithPrecision((area/totalArea)*unpaid, 2)
 		}
-		device.BillAmount = price
-		deviceList[idx] = device
+		record.BillAmount = price
+		retrecordList = append(retrecordList, record)
 	}
-	return deviceList
+	return retrecordList
 }
 
 // 计算公摊分摊费用(房屋)
-func (common *SharedCommon) calcSharedHouseFee(deviceList []finModel.FinDeviceRecord, unpaid float64) []finModel.FinDeviceRecord {
-	totalHouse := len(deviceList)
-	for idx, device := range deviceList {
+func (common *SharedCommon) calcSharedHouseFee(recordList []finModel.FinDeviceRecord, deviceTypes []string, migrDate string, startDay time.Time, unpaid float64) []finModel.FinDeviceRecord {
+	var areaIds []uint
+	for _, device := range recordList {
+		areaIds = append(areaIds, device.AreaId)
+	}
+	srcHouseMap, err := common.srvCommon.ListHouseMap(0, areaIds, 0, nil, nil)
+	if err != nil {
+		return nil
+	}
+	migrDay := 0
+	if len(migrDate) > 0 {
+		if val, err := strconv.Atoi(migrDate); err == nil {
+			migrDay = val
+		}
+	}
+	houseMap := make(map[uint]finReq.HouseInfo)
+	for houseId, house := range srcHouseMap {
+		isVac := true
+		if migrDay > 0 {
+			if house.MoveInTime > 0 && house.MoveOutTime <= 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if day >= migrDay {
+					isVac = false
+				}
+			} else if house.MoveInTime > 0 && house.MoveOutTime > 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if startDay.Unix() > house.MoveOutTime {
+					isVac = false
+				} else if day >= migrDay {
+					isVac = false
+				}
+			}
+		}
+		if !isVac {
+			continue
+		}
+		houseMap[houseId] = house
+	}
+	var retrecordList []finModel.FinDeviceRecord
+	totalHouse := len(houseMap)
+	for _, record := range recordList {
+		_, find := houseMap[record.HouseId]
+		if !find {
+			continue
+		}
 		price := utils.RoundWithPrecision((float64(1)/float64(totalHouse))*unpaid, 2)
-		device.BillAmount = price
-		deviceList[idx] = device
+		record.BillAmount = price
+		retrecordList = append(retrecordList, record)
 	}
-	return deviceList
+	return retrecordList
 }
 
 // 计算公摊费用(自定义 水、气)
-func (common *SharedCommon) calcSharedSelfFee(deviceList []finModel.FinDeviceRecord, confItem []interface{}, startDay time.Time, endDay time.Time, unpaid float64) []finModel.FinDeviceRecord {
+func (common *SharedCommon) calcSharedSelfFee(recordList []finModel.FinDeviceRecord, deviceTypes []string, migrDate string, confItem []interface{}, startDay time.Time, endDay time.Time, unpaid float64) []finModel.FinDeviceRecord {
+	var areaIds []uint
+	for _, device := range recordList {
+		areaIds = append(areaIds, device.AreaId)
+	}
+	srtcHouseMap, err := common.srvCommon.ListHouseMap(0, areaIds, 0, nil, nil)
+	if err != nil {
+		return nil
+	}
+	migrDay := 0
+	if len(migrDate) > 0 {
+		if val, err := strconv.Atoi(migrDate); err == nil {
+			migrDay = val
+		}
+	}
+	houseMap := make(map[uint]finReq.HouseInfo)
+	for houseId, house := range srtcHouseMap {
+		isVac := true
+		if migrDay > 0 {
+			if house.MoveInTime > 0 && house.MoveOutTime <= 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if day >= migrDay {
+					isVac = false
+				}
+			} else if house.MoveInTime > 0 && house.MoveOutTime > 0 {
+				day := time.Unix(house.MoveInTime, 0).Day()
+				if startDay.Unix() > house.MoveOutTime {
+					isVac = false
+				} else if day >= migrDay {
+					isVac = false
+				}
+			}
+		}
+		if !isVac {
+			continue
+		}
+		houseMap[houseId] = house
+	}
+
 	areaAmoutMap := make(map[uint]float64)
 	devNumMap := make(map[uint]int)
 	amountTotal := float64(0.00)
-	for _, device := range deviceList {
+	for _, device := range recordList {
 		amountTotal += device.BillAmount
 		num, find := devNumMap[device.AreaId]
 		if !find {
@@ -133,18 +245,23 @@ func (common *SharedCommon) calcSharedSelfFee(deviceList []finModel.FinDeviceRec
 		amount = amountTotal * item.Value
 		areaAmoutMap[item.AreaId] = amount
 	}
-	for idx, device := range deviceList {
-		amount := areaAmoutMap[device.AreaId]
-		num, _ := devNumMap[device.AreaId]
+	var retrecordList []finModel.FinDeviceRecord
+	for _, record := range recordList {
+		_, find := houseMap[record.HouseId]
+		if !find {
+			continue
+		}
+		amount := areaAmoutMap[record.AreaId]
+		num, _ := devNumMap[record.AreaId]
 		price := utils.RoundWithPrecision((amount/float64(num))*unpaid, 2)
-		device.BillAmount = price
-		deviceList[idx] = device
+		record.BillAmount = price
+		retrecordList = append(retrecordList, record)
 	}
-	return deviceList
+	return recordList
 }
 
 // 计算附加费公摊分摊费用(面积)
-func (common *SharedCommon) calcAttSquareFee(houseList []finReq.HouseInfo, squareType string, unpaid float64) []finModel.FinDeviceRecord {
+func (common *SharedCommon) calcAttSquareFee(houseList []finReq.HouseInfo, deviceTypes []string, isVac string, squareType string, unpaid float64) []finModel.FinDeviceRecord {
 	totalArea := float64(0.00)
 	areaMap := make(map[uint]float64)
 	for _, house := range houseList {
@@ -309,13 +426,13 @@ func (common *SharedCommon) calcApportionSquareFee(ratios []finModel.FinApportio
 		}
 		price := (ratio.HouseArea / area) * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
@@ -336,13 +453,13 @@ func (common *SharedCommon) calcApportionRatio(ratios []finModel.FinApportionRat
 		}
 		price := ratio.Ratio * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
@@ -361,13 +478,13 @@ func (common *SharedCommon) calcApportionAvg(ratios []finModel.FinApportionRatio
 	for _, ratio := range ratios {
 		price := (ratio.Ratio / float64(total)) * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
@@ -390,13 +507,13 @@ func (common *SharedCommon) calcAutoSquareFee(ratios []finModel.FinApportionRati
 		}
 		price := (ratio.HouseArea / area) * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
@@ -418,13 +535,13 @@ func (common *SharedCommon) calcAutoRatio(ratios []finModel.FinApportionRatio, b
 		}
 		price := ratio.Ratio * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
@@ -444,13 +561,13 @@ func (common *SharedCommon) calcAutoAvg(ratios []finModel.FinApportionRatio, bil
 	for _, ratio := range ratios {
 		price := (ratio.Ratio / float64(total)) * unpaid
 		switch roundMethod {
-		case "0":
+		case "round":
 			price = utils.RoundWithPrecision(price, decimalBit)
 			break
-		case "1":
+		case "up":
 			price = utils.RoundUpWithPrecision(price, decimalBit)
 			break
-		case "2":
+		case "trunc":
 			price = utils.DivideAndRound(price, decimalBit)
 			break
 		}
diff --git a/app/fin/task/billing_shared_electric_task.go b/app/fin/task/billing_shared_electric_task.go
index f19c7db3fb9664fca2dd43a9f71f2dbcf13f99c5..864fc1cbf07bfc249abe31f178ab0f88a14465ec 100644
--- a/app/fin/task/billing_shared_electric_task.go
+++ b/app/fin/task/billing_shared_electric_task.go
@@ -1,8 +1,8 @@
 package task
 
 import (
+	"encoding/json"
 	"strconv"
-	"strings"
 	"time"
 
 	devSvr "energy-server-mgo/app/admin/service/device"
@@ -11,6 +11,8 @@ import (
 	finReq "energy-server-mgo/app/fin/schemas"
 	finSvr "energy-server-mgo/app/fin/service"
 	"energy-server-mgo/core"
+	"energy-server-mgo/core/response"
+	"energy-server-mgo/util"
 )
 
 /**
@@ -26,6 +28,7 @@ type SharedElectricTask struct {
 	srvPayment         finSvr.IFinPaymentService
 	srvRecord          finSvr.IFinDeviceRecordService
 	srvScheme          finSvr.IFinApportionSchemesService
+	srvPurse           finSvr.IFinPurseService
 	srvSharedCommon    *SharedCommon
 }
 
@@ -77,144 +80,112 @@ func newSharedElectricTask() *SharedElectricTask {
 	}); err != nil {
 		panic(err)
 	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinPurseService) {
+		server.srvPurse = s
+	}); err != nil {
+		panic(err)
+	}
 	server.srvSharedCommon = NewSharedCommon()
 
 	return server
 }
 
 // 计算电力公摊费用
-func (task *SharedElectricTask) calcFee() {
-	core.TryLock(constants.Lock_key_SElectric, "1", 5*time.Minute)
-	defer core.UnLock(constants.Lock_key_SElectric)
-
+func (task *SharedElectricTask) calcFee(houseId uint, deviceId uint, startDay, endDay time.Time) {
 	now := time.Now()
-	// 将时间截断到当天的零点
-	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
-	startDay := endDay.AddDate(0, 0, -1)
+	deviceTypes := []string{"em"}
 
 	var cond finReq.FinSharedListReq
+	cond.CommonAreaId = houseId
 	lists, _ := task.srvElectric.ListAll(cond)
 	for _, scheme := range lists {
 		if len(scheme.AreaIds) <= 0 {
 			continue
 		}
-		var areaIds []uint
-		for _, val := range strings.Split(scheme.AreaIds, ",") {
-			tmpId, err := strconv.ParseUint(val, 10, 64)
-			if err != nil {
-				continue
+		needBill := "1"
+		if len(scheme.MigrDate) > 0 {
+			date, err := strconv.Atoi(scheme.MigrDate)
+			if err != nil && date < time.Now().Day() {
+				needBill = "0"
 			}
-			areaIds = append(areaIds, uint(tmpId))
-		}
-		deviceIds, _ := task.srvCommon.ListAreaDeviceIds(areaIds, []string{"em"})
-
-		deviceList, _ := task.srvApportionDevice.ListAllBindDevice(scheme.Id, "electric", nil, deviceIds)
-		billingMethod := scheme.BillingMethod
-		var schemeTimes []*SchemeTime
-		switch billingMethod {
-		case "1", "2":
-			schemeTimes = getDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		case "3":
-			schemeTimes = getYearDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		case "4", "5":
-			schemeTimes = getStepDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
 		}
-		if schemeTimes == nil {
+		deviceRecords, err := task.srvRecord.ListByHouseId(0, 0, deviceId, "", true, startDay, endDay)
+		if err == nil {
 			continue
 		}
-
 		usageTotal := float64(0.00)
 		billAmount := float64(0.00)
-		var deviceRecords []finModel.FinDeviceRecord
-		for i := 0; i < len(deviceList); i++ {
-			device := deviceList[i]
-			num, err := task.srvRecord.GetRecordNum(device.HouseId, device.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
+
+		var saveRecords []finModel.FinDeviceRecord
+		for _, record := range deviceRecords {
+			num, err := task.srvRecord.GetRecordNum(0, record.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
 			if err != nil || num > 0 {
 				continue
 			}
-			totalUsageStart := 0.00
-			totalUsageEnd := 0.00
-			for _, schemeTime := range schemeTimes {
-				startValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.startDay.Unix())
-				if err != nil {
-					startValue = 0.00
-				}
-				endValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.endDay.Unix())
-				if err != nil {
-					endValue, _, _ = task.srvInstrument.QueryNewDeviceValue(device.DeviceId, schemeTime.startDay.Unix(), schemeTime.endDay.Unix())
-				}
-				if endValue == 0.00 {
-					endValue = startValue
-				}
-				totalUsageStart += startValue
-				totalUsageEnd += endValue
-				usageTotal += endValue - startValue
-				schemeTime.usageTotal = endValue - startValue
-				schemeTime.regionId = device.RegionId
-				schemeTime.regionName = device.RegionName
-				schemeTime.areaId = device.AreaId
-				schemeTime.areaName = device.AreaName
-				schemeTime.houseId = device.HouseId
-				schemeTime.houseName = device.HouseName
-			}
 			if scheme.Llf != 0.00 {
 				usageTotal = usageTotal * (1.00 + scheme.Llf)
 			}
-			switch billingMethod {
-			case "1":
-				schemeTimes = calcUnitFee(schemeTimes)
-				break
-			case "2":
-				schemeTimes = calcMonthFee(schemeTimes)
-				break
-			case "3":
-				schemeTimes = calcYearFee(schemeTimes)
-				break
-			case "4", "5":
-				schemeTimes = calcStepFee(schemeTimes)
-				break
-			default:
-				break
-			}
-			for _, schemeTime := range schemeTimes {
-				billAmount += schemeTime.billAmmount
-			}
-			record := finModel.FinDeviceRecord{
-				SchemeId:   scheme.Id,
-				BillType:   constants.BillTypeEnum.SElectric,
-				RegionId:   scheme.RegionId,
-				RegionName: scheme.RegionName,
-				AreaId:     scheme.AreaId,
-				AreaName:   scheme.AreaName,
-				HouseId:    device.HouseId,
-				HouseName:  device.HouseName,
-				DeviceId:   device.DeviceId,
-				DeviceName: device.DeviceName,
-				FeeDate:    startDay,
-				BillAmount: billAmount,
-				UsageTotal: usageTotal,
-				UsageStart: totalUsageStart,
-				UsageEnd:   totalUsageEnd,
-			}
+			var item finModel.FinDeviceRecord
+			response.Copy(record, &item)
+			item.Id = 0
+			item.SchemeId = scheme.Id
+			item.BillType = constants.BillTypeEnum.SElectric
+			item.CommonAreaId = record.HouseId
+			item.CommonAreaName = record.HouseName
+			item.FeeDate = startDay
+			item.StepFee = record.StepFee
+			item.NeedBill = needBill
 			record.CreateTime = now
-			deviceRecords = append(deviceRecords, record)
+			saveRecords = append(saveRecords, item)
 		}
 		switch scheme.ApportionMethod {
 		case "0":
-			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(deviceRecords, scheme.SquareType, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, scheme.SquareType, billAmount)
 			break
 		case "1":
-			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(deviceRecords, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, billAmount)
 			break
 		case "2":
-			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(deviceRecords, scheme.Price, startDay, endDay, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(saveRecords, deviceTypes, scheme.MigrDate, scheme.Price, startDay, endDay, billAmount)
 			break
 		}
-		if len(deviceRecords) > 0 {
-			task.srvRecord.SaveBatch(deviceRecords)
+		if len(saveRecords) > 0 {
+
+			purseRecordMap := make(map[uint]finReq.FinPurseFeeEditReq)
+			if len(saveRecords) > 0 {
+				err := task.srvRecord.SaveBatch(saveRecords)
+				if err != nil {
+					continue
+				}
+				for _, record := range saveRecords {
+					feeReq, find := purseRecordMap[record.HouseId]
+					if !find {
+						purse, err := task.srvPurse.DetailByHouseId(record.HouseId, nil)
+						if err != nil && purse.Id <= 0 {
+							continue
+						}
+						feeReq = finReq.FinPurseFeeEditReq{
+							HouseId:       record.HouseId,
+							EcsType:       "electric",
+							FeeType:       "deduct",
+							FlowType:      "purse",
+							Amount:        record.BillAmount,
+							PaymentTime:   now,
+							PaymentSource: "0",
+							PaymentMethod: "0",
+						}
+					}
+					feeReq.Amount += record.BillAmount
+					purseRecordMap[record.HouseId] = feeReq
+				}
+				for _, purseReq := range purseRecordMap {
+					jsStr, err := json.Marshal(purseReq)
+					if err != nil {
+						continue
+					}
+					util.RedisUtil.LPush(constants.Task_Purse_Que, jsStr)
+				}
+			}
 		}
 	}
 }
diff --git a/app/fin/task/billing_shared_gas_task.go b/app/fin/task/billing_shared_gas_task.go
index 11c6dca028ca6bc1be7679970d948808f17515f6..0ec9be4a640a14264c96038f2e871c23454cfa28 100644
--- a/app/fin/task/billing_shared_gas_task.go
+++ b/app/fin/task/billing_shared_gas_task.go
@@ -1,8 +1,8 @@
 package task
 
 import (
+	"encoding/json"
 	"strconv"
-	"strings"
 	"time"
 
 	devSvr "energy-server-mgo/app/admin/service/device"
@@ -11,6 +11,8 @@ import (
 	finReq "energy-server-mgo/app/fin/schemas"
 	finSvr "energy-server-mgo/app/fin/service"
 	"energy-server-mgo/core"
+	"energy-server-mgo/core/response"
+	"energy-server-mgo/util"
 )
 
 /**
@@ -27,6 +29,7 @@ type SharedGasTask struct {
 	srvRecord          finSvr.IFinDeviceRecordService
 	srvApportionRatio  finSvr.IFinApportionRatioService
 	srvScheme          finSvr.IFinApportionSchemesService
+	srvPurse           finSvr.IFinPurseService
 }
 
 // NewSharedGasTask 实例化
@@ -77,135 +80,108 @@ func newSharedGasTask() *SharedGasTask {
 	}); err != nil {
 		panic(err)
 	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinPurseService) {
+		server.srvPurse = s
+	}); err != nil {
+		panic(err)
+	}
 	server.srvSharedCommon = NewSharedCommon()
 
 	return server
 }
 
 // 计算燃气公摊费用
-func (task *SharedGasTask) calcFee() {
-	core.TryLock(constants.Lock_key_SGas, "1", 5*time.Minute)
-	defer core.UnLock(constants.Lock_key_SGas)
-
+func (task *SharedGasTask) calcFee(houseId uint, deviceId uint, startDay, endDay time.Time) {
 	now := time.Now()
-	// 将时间截断到当天的零点
-	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
-	startDay := endDay.AddDate(0, 0, -1)
+	deviceTypes := []string{"gas"}
 
 	var cond finReq.FinSharedListReq
+	cond.CommonAreaId = houseId
 	lists, _ := task.srvGas.ListAll(cond)
 	for _, scheme := range lists {
 		if len(scheme.AreaIds) <= 0 {
 			continue
 		}
-		var areaIds []uint
-		for _, val := range strings.Split(scheme.AreaIds, ",") {
-			tmpId, err := strconv.ParseUint(val, 10, 64)
-			if err != nil {
-				continue
+		needBill := "1"
+		if len(scheme.MigrDate) > 0 {
+			date, err := strconv.Atoi(scheme.MigrDate)
+			if err != nil && date < time.Now().Day() {
+				needBill = "0"
 			}
-			areaIds = append(areaIds, uint(tmpId))
 		}
-		deviceIds, _ := task.srvCommon.ListAreaDeviceIds(areaIds, []string{"gas"})
-
-		deviceList, _ := task.srvApportionDevice.ListAllBindDevice(scheme.Id, "gas", nil, deviceIds)
-		billingMethod := scheme.BillingMethod
-		var schemeTimes []*SchemeTime
-		switch billingMethod {
-		case "1", "2":
-			schemeTimes = getDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		case "3":
-			schemeTimes = getYearDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		}
-		if schemeTimes == nil {
+		deviceRecords, err := task.srvRecord.ListByHouseId(0, 0, deviceId, "", true, startDay, endDay)
+		if err == nil {
 			continue
 		}
-
-		usageTotal := float64(0.00)
 		billAmount := float64(0.00)
-		var deviceRecords []finModel.FinDeviceRecord
-		for i := 0; i < len(deviceList); i++ {
-			device := deviceList[i]
-			num, err := task.srvRecord.GetRecordNum(device.HouseId, device.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
+
+		var saveRecords []finModel.FinDeviceRecord
+		for _, record := range deviceRecords {
+			num, err := task.srvRecord.GetRecordNum(0, record.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
 			if err != nil || num > 0 {
 				continue
 			}
-			totalUsageStart := 0.00
-			totalUsageEnd := 0.00
-			for _, schemeTime := range schemeTimes {
-				startValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.startDay.Unix())
-				if err != nil {
-					startValue = 0.00
-				}
-				endValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.endDay.Unix())
-				if err != nil {
-					endValue, _, _ = task.srvInstrument.QueryNewDeviceValue(device.DeviceId, schemeTime.startDay.Unix(), schemeTime.endDay.Unix())
-				}
-				if endValue == 0.00 {
-					endValue = startValue
-				}
-				totalUsageStart += startValue
-				totalUsageEnd += endValue
-				usageTotal += endValue - startValue
-				schemeTime.usageTotal = endValue - startValue
-				schemeTime.regionId = device.RegionId
-				schemeTime.regionName = device.RegionName
-				schemeTime.areaId = device.AreaId
-				schemeTime.areaName = device.AreaName
-				schemeTime.houseId = device.HouseId
-				schemeTime.houseName = device.HouseName
-			}
-			switch billingMethod {
-			case "1":
-				schemeTimes = calcUnitFee(schemeTimes)
-				break
-			case "2":
-				schemeTimes = calcMonthFee(schemeTimes)
-				break
-			case "3":
-				schemeTimes = calcYearFee(schemeTimes)
-				break
-			default:
-				break
-			}
-			for _, schemeTime := range schemeTimes {
-				billAmount += schemeTime.billAmmount
-			}
-			record := finModel.FinDeviceRecord{
-				SchemeId:   scheme.Id,
-				BillType:   constants.BillTypeEnum.SElectric,
-				RegionId:   scheme.RegionId,
-				RegionName: scheme.RegionName,
-				AreaId:     scheme.AreaId,
-				AreaName:   scheme.AreaName,
-				HouseId:    device.HouseId,
-				HouseName:  device.HouseName,
-				DeviceId:   device.DeviceId,
-				DeviceName: device.DeviceName,
-				FeeDate:    startDay,
-				BillAmount: billAmount,
-				UsageTotal: usageTotal,
-				UsageStart: totalUsageStart,
-				UsageEnd:   totalUsageEnd,
-			}
+			var item finModel.FinDeviceRecord
+			response.Copy(record, &item)
+			item.Id = 0
+			item.SchemeId = scheme.Id
+			item.BillType = constants.BillTypeEnum.SElectric
+			item.CommonAreaId = record.HouseId
+			item.CommonAreaName = record.HouseName
+			item.FeeDate = startDay
+			item.StepFee = record.StepFee
+			item.NeedBill = needBill
 			record.CreateTime = now
-			deviceRecords = append(deviceRecords, record)
+			saveRecords = append(saveRecords, item)
 		}
 		switch scheme.ApportionMethod {
 		case "0":
-			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(deviceRecords, scheme.SquareType, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, scheme.SquareType, billAmount)
 			break
 		case "1":
-			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(deviceRecords, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, billAmount)
 			break
 		case "2":
-			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(deviceRecords, scheme.Price, startDay, endDay, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(saveRecords, deviceTypes, scheme.MigrDate, scheme.Price, startDay, endDay, billAmount)
 			break
 		}
-		if len(deviceRecords) > 0 {
-			task.srvRecord.SaveBatch(deviceRecords)
+		if len(saveRecords) > 0 {
+
+			purseRecordMap := make(map[uint]finReq.FinPurseFeeEditReq)
+			if len(saveRecords) > 0 {
+				err := task.srvRecord.SaveBatch(saveRecords)
+				if err != nil {
+					continue
+				}
+				for _, record := range saveRecords {
+					feeReq, find := purseRecordMap[record.HouseId]
+					if !find {
+						purse, err := task.srvPurse.DetailByHouseId(record.HouseId, nil)
+						if err != nil && purse.Id <= 0 {
+							continue
+						}
+						feeReq = finReq.FinPurseFeeEditReq{
+							HouseId:       record.HouseId,
+							EcsType:       "gas",
+							FeeType:       "deduct",
+							FlowType:      "purse",
+							Amount:        record.BillAmount,
+							PaymentTime:   now,
+							PaymentSource: "0",
+							PaymentMethod: "0",
+						}
+					}
+					feeReq.Amount += record.BillAmount
+					purseRecordMap[record.HouseId] = feeReq
+				}
+				for _, purseReq := range purseRecordMap {
+					jsStr, err := json.Marshal(purseReq)
+					if err != nil {
+						continue
+					}
+					util.RedisUtil.LPush(constants.Task_Purse_Que, jsStr)
+				}
+			}
 		}
 	}
 }
diff --git a/app/fin/task/billing_shared_task.go b/app/fin/task/billing_shared_task.go
deleted file mode 100644
index a7aead4ef842b1a90a6e902d8af14c2873fee09e..0000000000000000000000000000000000000000
--- a/app/fin/task/billing_shared_task.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package task
-
-import (
-	"fmt"
-
-	"github.com/robfig/cron/v3"
-)
-
-/**
-* 公摊计费任务服务
- */
-type SharedTaskServer struct {
-	taskCron    *cron.Cron
-	srvElectric *SharedElectricTask
-	srvWater    *SharedWaterTask
-	srvGas      *SharedGasTask
-	srvAtt      *SharedAttTask
-}
-
-// NewSharedTaskServer 实例化
-func NewSharedTaskServer() *SharedTaskServer {
-	server := &SharedTaskServer{taskCron: cron.New()}
-	server.srvElectric = newSharedElectricTask()
-	server.srvWater = newSharedWaterTask()
-	server.srvGas = newSharedGasTask()
-	server.srvAtt = newSharedAttTask()
-	return server
-}
-
-// 启动定时任务
-func (shared *SharedTaskServer) Start(cron string) {
-	_, err := shared.taskCron.AddFunc(cron, shared.srvElectric.calcFee)
-	if err != nil {
-		fmt.Println("Add Billing Task error:{}", err)
-		return
-	}
-	_, err = shared.taskCron.AddFunc(cron, shared.srvWater.calcFee)
-	if err != nil {
-		fmt.Println("Add Billing Task error:{}", err)
-		return
-	}
-	_, err = shared.taskCron.AddFunc(cron, shared.srvGas.calcFee)
-	if err != nil {
-		fmt.Println("Add Billing Task error:{}", err)
-		return
-	}
-	_, err = shared.taskCron.AddFunc(cron, shared.srvAtt.calcFee)
-	if err != nil {
-		fmt.Println("Add Billing Task error:{}", err)
-		return
-	}
-	shared.taskCron.Start()
-}
-
-// 停止定时任务
-func (shared *SharedTaskServer) Stop() {
-	shared.taskCron.Stop()
-}
diff --git a/app/fin/task/billing_shared_water_task.go b/app/fin/task/billing_shared_water_task.go
index 4a7a9bccdb2734c0ee0b7457ed0154ee900bb0d6..0b4297a21b2e58c89c1357ae888ff2855806260e 100644
--- a/app/fin/task/billing_shared_water_task.go
+++ b/app/fin/task/billing_shared_water_task.go
@@ -1,14 +1,16 @@
 package task
 
 import (
+	"encoding/json"
 	"strconv"
-	"strings"
 	"time"
 
 	"energy-server-mgo/app/fin/constants"
 	finReq "energy-server-mgo/app/fin/schemas"
 	finSvr "energy-server-mgo/app/fin/service"
 	"energy-server-mgo/core"
+	"energy-server-mgo/core/response"
+	"energy-server-mgo/util"
 
 	devSvr "energy-server-mgo/app/admin/service/device"
 	finModel "energy-server-mgo/app/fin/model"
@@ -28,6 +30,7 @@ type SharedWaterTask struct {
 	srvRecord          finSvr.IFinDeviceRecordService
 	srvApportionRatio  finSvr.IFinApportionRatioService
 	srvScheme          finSvr.IFinApportionSchemesService
+	srvPurse           finSvr.IFinPurseService
 }
 
 // NewSharedWaterTask 实例化
@@ -78,141 +81,105 @@ func newSharedWaterTask() *SharedWaterTask {
 	}); err != nil {
 		panic(err)
 	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinPurseService) {
+		server.srvPurse = s
+	}); err != nil {
+		panic(err)
+	}
 	server.srvSharedCommon = NewSharedCommon()
 
 	return server
 }
 
 // 计算水务公摊费用
-func (task *SharedWaterTask) calcFee() {
-	core.TryLock(constants.Lock_key_SWater, "1", 5*time.Minute)
-	defer core.UnLock(constants.Lock_key_SWater)
-
+func (task *SharedWaterTask) calcFee(houseId uint, deviceId uint, startDay, endDay time.Time) {
 	now := time.Now()
-	// 将时间截断到当天的零点
-	endDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
-	startDay := endDay.AddDate(0, 0, -1)
+	deviceTypes := []string{"cool", "hw"}
 
 	var cond finReq.FinSharedListReq
+	cond.CommonAreaId = houseId
 	lists, _ := task.srvWater.ListAll(cond)
 	for _, scheme := range lists {
-		if len(scheme.AreaIds) <= 0 {
-			continue
-		}
-		var areaIds []uint
-		for _, val := range strings.Split(scheme.AreaIds, ",") {
-			tmpId, err := strconv.ParseUint(val, 10, 64)
-			if err != nil {
-				continue
+		needBill := "1"
+		if len(scheme.MigrDate) > 0 {
+			date, err := strconv.Atoi(scheme.MigrDate)
+			if err != nil && date < time.Now().Day() {
+				needBill = "0"
 			}
-			areaIds = append(areaIds, uint(tmpId))
 		}
-		deviceIds, _ := task.srvCommon.ListAreaDeviceIds(areaIds, []string{"hw", "cool"})
-
-		deviceList, _ := task.srvApportionDevice.ListAllBindDevice(scheme.Id, "water", nil, deviceIds)
-		billingMethod := scheme.BillingMethod
-		var schemeTimes []*SchemeTime
-		switch billingMethod {
-		case "1", "2":
-			schemeTimes = getDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		case "3":
-			schemeTimes = getYearDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		case "4", "5":
-			schemeTimes = getStepDateStd(0, billingMethod, startDay, endDay, scheme.Price)
-			break
-		}
-		if schemeTimes == nil {
+		deviceRecords, err := task.srvRecord.ListByHouseId(0, 0, deviceId, "", true, startDay, endDay)
+		if err == nil {
 			continue
 		}
-
-		usageTotal := float64(0.00)
 		billAmount := float64(0.00)
-		var deviceRecords []finModel.FinDeviceRecord
-		for i := 0; i < len(deviceList); i++ {
-			device := deviceList[i]
-			num, err := task.srvRecord.GetRecordNum(device.HouseId, device.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
+
+		var saveRecords []finModel.FinDeviceRecord
+		for _, record := range deviceRecords {
+			num, err := task.srvRecord.GetRecordNum(0, record.DeviceId, constants.BillTypeEnum.SElectric, startDay, endDay)
 			if err != nil || num > 0 {
 				continue
 			}
-			totalUsageStart := 0.00
-			totalUsageEnd := 0.00
-			for _, schemeTime := range schemeTimes {
-				startValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.startDay.Unix())
-				if err != nil {
-					startValue = 0.00
-				}
-				endValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.endDay.Unix())
-				if err != nil {
-					endValue, _, _ = task.srvInstrument.QueryNewDeviceValue(device.DeviceId, schemeTime.startDay.Unix(), schemeTime.endDay.Unix())
-				}
-				if endValue == 0.00 {
-					endValue = startValue
-				}
-				totalUsageStart += startValue
-				totalUsageEnd += endValue
-				usageTotal += endValue - startValue
-				schemeTime.usageTotal = endValue - startValue
-				schemeTime.regionId = device.RegionId
-				schemeTime.regionName = device.RegionName
-				schemeTime.areaId = device.AreaId
-				schemeTime.areaName = device.AreaName
-				schemeTime.houseId = device.HouseId
-				schemeTime.houseName = device.HouseName
-			}
-			switch billingMethod {
-			case "1":
-				schemeTimes = calcUnitFee(schemeTimes)
-				break
-			case "2":
-				schemeTimes = calcMonthFee(schemeTimes)
-				break
-			case "3":
-				schemeTimes = calcYearFee(schemeTimes)
-				break
-			case "4", "5":
-				schemeTimes = calcStepFee(schemeTimes)
-				break
-			default:
-				break
-			}
-			for _, schemeTime := range schemeTimes {
-				billAmount += schemeTime.billAmmount
-			}
-			record := finModel.FinDeviceRecord{
-				SchemeId:   scheme.Id,
-				BillType:   constants.BillTypeEnum.SElectric,
-				RegionId:   scheme.RegionId,
-				RegionName: scheme.RegionName,
-				AreaId:     scheme.AreaId,
-				AreaName:   scheme.AreaName,
-				HouseId:    device.HouseId,
-				HouseName:  device.HouseName,
-				DeviceId:   device.DeviceId,
-				DeviceName: device.DeviceName,
-				FeeDate:    startDay,
-				BillAmount: billAmount,
-				UsageTotal: usageTotal,
-				UsageStart: totalUsageStart,
-				UsageEnd:   totalUsageEnd,
-			}
+			var item finModel.FinDeviceRecord
+			response.Copy(record, &item)
+			item.Id = 0
+			item.SchemeId = scheme.Id
+			item.BillType = constants.BillTypeEnum.SElectric
+			item.CommonAreaId = record.HouseId
+			item.CommonAreaName = record.HouseName
+			item.FeeDate = startDay
+			item.StepFee = record.StepFee
+			item.NeedBill = needBill
 			record.CreateTime = now
-			deviceRecords = append(deviceRecords, record)
+			saveRecords = append(saveRecords, item)
 		}
 		switch scheme.ApportionMethod {
 		case "0":
-			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(deviceRecords, scheme.SquareType, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSquareFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, scheme.SquareType, billAmount)
 			break
 		case "1":
-			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(deviceRecords, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedHouseFee(saveRecords, deviceTypes, scheme.MigrDate, startDay, billAmount)
 			break
 		case "2":
-			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(deviceRecords, scheme.Price, startDay, endDay, billAmount)
+			deviceRecords = task.srvSharedCommon.calcSharedSelfFee(saveRecords, deviceTypes, scheme.MigrDate, scheme.Price, startDay, endDay, billAmount)
 			break
 		}
-		if len(deviceRecords) > 0 {
-			task.srvRecord.SaveBatch(deviceRecords)
+		if len(saveRecords) > 0 {
+
+			purseRecordMap := make(map[uint]finReq.FinPurseFeeEditReq)
+			if len(saveRecords) > 0 {
+				err := task.srvRecord.SaveBatch(saveRecords)
+				if err != nil {
+					continue
+				}
+				for _, record := range saveRecords {
+					feeReq, find := purseRecordMap[record.HouseId]
+					if !find {
+						purse, err := task.srvPurse.DetailByHouseId(record.HouseId, nil)
+						if err != nil && purse.Id <= 0 {
+							continue
+						}
+						feeReq = finReq.FinPurseFeeEditReq{
+							HouseId:       record.HouseId,
+							EcsType:       "water",
+							FeeType:       "deduct",
+							FlowType:      "purse",
+							Amount:        record.BillAmount,
+							PaymentTime:   now,
+							PaymentSource: "0",
+							PaymentMethod: "0",
+						}
+					}
+					feeReq.Amount += record.BillAmount
+					purseRecordMap[record.HouseId] = feeReq
+				}
+				for _, purseReq := range purseRecordMap {
+					jsStr, err := json.Marshal(purseReq)
+					if err != nil {
+						continue
+					}
+					util.RedisUtil.LPush(constants.Task_Purse_Que, jsStr)
+				}
+			}
 		}
 	}
 }
diff --git a/app/fin/task/general.go b/app/fin/task/general.go
index 781b4f283bd5247b8746d707a88ea926661c60ca..33f58cff1873afa0acff2a883ae7edf9c3b0a947 100644
--- a/app/fin/task/general.go
+++ b/app/fin/task/general.go
@@ -229,6 +229,7 @@ func getStepDateStd(paymentDay int, billingMethod string, startDay time.Time, en
 		for i := 0; i < int(dayNum); i++ {
 			tmpStartDay := startDay.AddDate(0, 0, i)
 			var schemeTime SchemeTime
+			schemeTime.seq, _ = strconv.Atoi(price.Seq)
 			schemeTime.startDay = time.Date(tmpStartDay.Year(), tmpStartDay.Month(), tmpStartDay.Day(), startHour, startMinute, 0, 0, now.Location())
 			schemeTime.endDay = time.Date(tmpStartDay.Year(), tmpStartDay.Month(), tmpStartDay.Day(), endHour, endMinute, 0, 0, now.Location())
 			schemeTime.prices = make([]interface{}, 1)
diff --git a/app/fin/task/pre_calc_task.go b/app/fin/task/pre_calc_task.go
new file mode 100644
index 0000000000000000000000000000000000000000..7ee20f5b66d55af49b0f2c2010f0472ee41227ad
--- /dev/null
+++ b/app/fin/task/pre_calc_task.go
@@ -0,0 +1,234 @@
+package task
+
+import (
+	"encoding/json"
+	devSvr "energy-server-mgo/app/admin/service/device"
+	"energy-server-mgo/app/fin/constants"
+	finModel "energy-server-mgo/app/fin/model"
+	finReq "energy-server-mgo/app/fin/schemas"
+	finSvr "energy-server-mgo/app/fin/service"
+	"energy-server-mgo/core"
+	"energy-server-mgo/util"
+	"fmt"
+	"time"
+
+	"github.com/robfig/cron/v3"
+)
+
+/**
+* 能耗按天计算任务服务
+ */
+type PreCalcTaskServer struct {
+	taskCron      *cron.Cron
+	srvEcs        finSvr.IFinEcsSchemesService
+	srvEcsDev     finSvr.IFinEcsDeviceService
+	srvCommon     finSvr.IFinCommonService
+	srvInstrument devSvr.InstrumentService
+	srvRecord     finSvr.IFinDeviceRecordService
+}
+
+// NewPreCalcTaskServer 实例化
+func NewPreCalcTaskServer() *PreCalcTaskServer {
+	server := &PreCalcTaskServer{taskCron: cron.New()}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinEcsSchemesService) {
+		server.srvEcs = s
+	}); err != nil {
+		panic(err)
+	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinEcsDeviceService) {
+		server.srvEcsDev = s
+	}); err != nil {
+		panic(err)
+	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinCommonService) {
+		server.srvCommon = s
+	}); err != nil {
+		panic(err)
+	}
+	if err := core.GetContainer().Invoke(func(s devSvr.InstrumentService) {
+		server.srvInstrument = s
+	}); err != nil {
+		panic(err)
+	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinDeviceRecordService) {
+		server.srvRecord = s
+	}); err != nil {
+		panic(err)
+	}
+	return server
+}
+
+// 启动定时任务
+func (task *PreCalcTaskServer) Start(cron string) {
+	_, err := task.taskCron.AddFunc(cron, task.calcTodayFee)
+	if err != nil {
+		fmt.Println("Add Billing Task error:{}", err)
+		return
+	}
+	task.taskCron.Start()
+	now := time.Now()
+	for i := 0; i < 30; i++ {
+		calcTime := time.Date(2025, 7, i, 0, 0, 0, 0, now.Location())
+		task.calcFee(&calcTime)
+	}
+}
+
+// 停止定时任务
+func (task *PreCalcTaskServer) Stop() {
+	task.taskCron.Stop()
+}
+
+func (task *PreCalcTaskServer) calcTodayFee() {
+	task.calcFee(nil)
+}
+
+// 计算电力公摊费用
+func (task *PreCalcTaskServer) calcFee(endDate *time.Time) {
+	core.TryLock(constants.Lock_key_Precalc, "1", 5*time.Minute)
+	defer core.UnLock(constants.Lock_key_Precalc)
+
+	now := time.Now()
+	var startDay, endDay time.Time
+	if endDate == nil {
+		// 将时间截断到当天的零点
+		endDay = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+		startDay = endDay.AddDate(0, 0, -1)
+	} else {
+		endDay = time.Date(endDate.Year(), endDate.Month(), endDate.Day(), 0, 0, 0, 0, now.Location())
+		startDay = endDay.AddDate(0, 0, -1)
+	}
+
+	var cond finReq.FinEcsSchemesListReq
+	lists, _ := task.srvEcs.ListAll(cond)
+	for _, scheme := range lists {
+		deviceList, _ := task.srvEcsDev.ListAll(nil, scheme.Id, nil)
+		if len(deviceList) <= 0 {
+			continue
+		}
+		billingMethod := scheme.BillingMethod
+		var schemeTimes []*SchemeTime
+		switch billingMethod {
+		case "1", "2":
+			schemeTimes = getDateStd(0, billingMethod, startDay, endDay, scheme.Price)
+			break
+		case "3":
+			schemeTimes = getYearDateStd(0, billingMethod, startDay, endDay, scheme.Price)
+			break
+		case "4", "5":
+			schemeTimes = getStepDateStd(0, billingMethod, startDay, endDay, scheme.Price)
+			break
+		}
+		if schemeTimes == nil {
+			continue
+		}
+
+		usageTotal := float64(0.00)
+		billAmount := float64(0.00)
+		var deviceRecords []finModel.FinDeviceRecord
+		for i := 0; i < len(deviceList); i++ {
+			device := deviceList[i]
+			num, err := task.srvRecord.GetRecordNum(0, device.DeviceId, "", startDay, endDay)
+			if err != nil || num > 0 {
+				continue
+			}
+			totalUsageStart := 0.00
+			totalUsageEnd := 0.00
+			for _, schemeTime := range schemeTimes {
+				startValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.startDay.Unix())
+				if err != nil {
+					startValue = 0.00
+				}
+				endValue, err := task.srvInstrument.QueryDeviceFirstValue(device.DeviceId, schemeTime.endDay.Unix())
+				if err != nil {
+					endValue, _, _ = task.srvInstrument.QueryNewDeviceValue(device.DeviceId, schemeTime.startDay.Unix(), schemeTime.endDay.Unix())
+				}
+				if endValue == 0.00 {
+					endValue = startValue
+				}
+				totalUsageStart += startValue
+				totalUsageEnd += endValue
+				usageTotal += endValue - startValue
+				schemeTime.usageTotal = endValue - startValue
+				schemeTime.regionId = device.RegionId
+				schemeTime.regionName = device.RegionName
+				schemeTime.areaId = device.AreaId
+				schemeTime.areaName = device.AreaName
+			}
+			switch billingMethod {
+			case "1":
+				schemeTimes = calcUnitFee(schemeTimes)
+				break
+			case "2":
+				schemeTimes = calcMonthFee(schemeTimes)
+				break
+			case "3":
+				schemeTimes = calcYearFee(schemeTimes)
+				break
+			case "4", "5":
+				schemeTimes = calcStepFee(schemeTimes)
+				break
+			default:
+				break
+			}
+
+			stepItemMap := make(map[int]finReq.SchemeStepItem)
+			for _, schemeTime := range schemeTimes {
+				billAmount += schemeTime.billAmmount
+				if scheme.BillingMethod == "4" || scheme.BillingMethod == "5" {
+					item, find := stepItemMap[schemeTime.seq]
+					if !find {
+						item.Seq = schemeTime.seq
+						item.BillAmmount = 0
+						item.UsageTotal = 0
+					}
+					item.BillAmmount += schemeTime.billAmmount
+					item.UsageTotal += schemeTime.usageTotal
+					stepItemMap[schemeTime.seq] = item
+				}
+			}
+			stepFee := ""
+			if scheme.BillingMethod == "4" || scheme.BillingMethod == "5" {
+				var stepFeeList []finReq.SchemeStepItem
+				for _, scheme := range stepItemMap {
+					stepFeeList = append(stepFeeList, scheme)
+				}
+				tmpFee, err := json.Marshal(stepFeeList)
+				if err == nil {
+					stepFee = string(tmpFee)
+				}
+			}
+			record := finModel.FinDeviceRecord{
+				SchemeId:      scheme.Id,
+				RegionId:      device.RegionId,
+				RegionName:    device.RegionName,
+				AreaId:        device.AreaId,
+				AreaName:      device.AreaName,
+				HouseId:       device.HouseId,
+				HouseName:     device.HouseName,
+				DeviceId:      device.DeviceId,
+				DeviceName:    device.DeviceName,
+				Address:       device.Address,
+				FeeDate:       startDay,
+				BillAmount:    billAmount,
+				UsageTotal:    usageTotal,
+				UsageStart:    totalUsageStart,
+				UsageEnd:      totalUsageEnd,
+				BillingMethod: scheme.BillingMethod,
+				StepFee:       stepFee,
+			}
+			record.CreateTime = now
+			deviceRecords = append(deviceRecords, record)
+			if device.HouseType == "commonArea" {
+				devicePush := finReq.PushDeviceItem{HouseId: device.HouseId, DeviceId: device.DeviceId, DeviceType: device.DeviceType, StartDay: startDay, EndDay: *endDate}
+				jsonStr, err := json.Marshal(devicePush)
+				if err != nil {
+					continue
+				}
+				util.RedisUtil.LPush(constants.Task_Shared_Que, jsonStr)
+			}
+		}
+		if len(deviceRecords) > 0 {
+			task.srvRecord.SaveBatch(deviceRecords)
+		}
+	}
+}
diff --git a/app/fin/task/sync_task.go b/app/fin/task/sync_task.go
index b028dfdfc6c8cefd9407e0015d835801631b4fbf..1fd16fbbf3820cdfafabe84a09a292789a6bd98e 100644
--- a/app/fin/task/sync_task.go
+++ b/app/fin/task/sync_task.go
@@ -1 +1,112 @@
 package task
+
+import (
+	"encoding/json"
+	"energy-server-mgo/app/fin/constants"
+	finReq "energy-server-mgo/app/fin/schemas"
+	finSvr "energy-server-mgo/app/fin/service"
+	"energy-server-mgo/core"
+	"energy-server-mgo/util"
+	"time"
+)
+
+/**
+* 任务同步服务
+ */
+type SyncTaskServer struct {
+	srvBill     finSvr.IFinBillService
+	srvPurse    finSvr.IFinPurseService
+	srvElectric SharedElectricTask
+	srvWater    SharedWaterTask
+	srvGas      SharedGasTask
+}
+
+// SyncTaskServer 实例化任务同步服务
+func NewSyncTaskServer() *SyncTaskServer {
+	server := &SyncTaskServer{}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinBillService) {
+		server.srvBill = s
+	}); err != nil {
+		panic(err)
+	}
+	if err := core.GetContainer().Invoke(func(s finSvr.IFinPurseService) {
+		server.srvPurse = s
+	}); err != nil {
+		panic(err)
+	}
+	server.srvElectric = *newSharedElectricTask()
+	server.srvWater = *newSharedWaterTask()
+	server.srvGas = *newSharedGasTask()
+
+	return server
+}
+
+// 启动任务同步服务
+func (task *SyncTaskServer) Start(cron string) {
+	go task.syncBill()
+	go task.syncPurse()
+}
+
+// 停止任务同步服务
+func (task *SyncTaskServer) Stop() {
+
+}
+
+func (task *SyncTaskServer) syncBill() {
+	for {
+		records := util.RedisUtil.BRPop(constants.Task_Bill_Que, 1*time.Minute)
+		if records == nil || len(records) <= 0 {
+			continue
+		}
+		// 	for _, record := range records {
+		// 		var billReq utils.FinBillActionReq
+		// 		err := json.Unmarshal([]byte(record), &billReq)
+		// 		if err != nil {
+		// 			continue
+		// 		}
+		// 		bill := finModel.FinBill{
+		// 			RegionId:        billReq.RegionId,
+		// 			RegionName:      billReq.RegionName,
+		// 			HouseName:       billReq.HouseName,
+		// 			FeeName:         constants.GetFeeName(billReq.SchemeType) + "-" + obj.Address,
+		// 			FeeRange:        obj.StartDate.Format("2006-01-02") + "至" + obj.EndDate.Format("2006-01-02"),
+		// 			UsageTotal:      obj.UsageTotal,
+		// 			UsageStart:      obj.UsageStart,
+		// 			UsageEnd:        obj.UsageEnd,
+		// 			BillAmount:      obj.BillAmount,
+		// 			UnpaidAmount:    obj.UnpaidAmount,
+		// 			ReductionAmount: obj.ReductionAmount,
+		// 			PreArrear:       preArrear,
+		// 			LateAmount:      obj.LateAmount,
+		// 			SumAmount:       obj.UnpaidAmount,
+		// 		}
+		// 	}
+	}
+}
+
+func (task *SyncTaskServer) syncPurse() {
+
+}
+
+func (task *SyncTaskServer) syncShared() {
+	for {
+		records := util.RedisUtil.BRPop(constants.Task_Shared_Que, 1*time.Minute)
+		if records == nil || len(records) <= 0 {
+			continue
+		}
+		for _, record := range records {
+			var devicePush finReq.PushDeviceItem
+			err := json.Unmarshal([]byte(record), &devicePush)
+			if err != nil {
+				continue
+			}
+			if devicePush.DeviceType == "electric" {
+				task.srvElectric.calcFee(devicePush.HouseId, devicePush.DeviceId, devicePush.StartDay, devicePush.EndDay)
+			} else if devicePush.DeviceType == "water" {
+				task.srvWater.calcFee(devicePush.HouseId, devicePush.DeviceId, devicePush.StartDay, devicePush.EndDay)
+			} else if devicePush.DeviceType == "gas" {
+				task.srvGas.calcFee(devicePush.HouseId, devicePush.DeviceId, devicePush.StartDay, devicePush.EndDay)
+			}
+		}
+	}
+}
diff --git a/app/fin/utils/public_struct.go b/app/fin/utils/public_struct.go
index 9e290b700040acc0d50914b632b4267b5959785a..3930489e6d4234487fda6c3f74c9ddf3666241b2 100644
--- a/app/fin/utils/public_struct.go
+++ b/app/fin/utils/public_struct.go
@@ -6,3 +6,17 @@ type FinDeviceActionReq struct { // 主键
 	Action     string  `json:"action"`    // 动作
 	BillAmount float64 `form:"billAmout"` // 费用
 }
+
+// FinBillActionReq 请求生成账单结果
+type FinBillActionReq struct { // 主键
+	SchemeType string    `json:"schemeType"`                    // 方案类型
+	BillType   string    `json:"billType"`                      // 账单类型
+	RegionId   uint      `form:regionId" json:"regionId"`       // 顶级区域ID
+	RegionName string    `form:regionName" json:"regionName"`   // 顶级区域名
+	AreaId     uint      `json:areaId" structs:"areaId"`        // 区域ID
+	AreaName   string    `json:"areaName" structs:"areaName"`   // 区域名
+	HouseId    uint      `json:"houseId" structs:"houseId"`     // 房间ID
+	HouseName  string    `json:"houseName" structs:"houseName"` // 房间名
+	StartDay   time.Time `json:"startDay"`                      // 开始日期
+	EndDay     time.Time `json:"endDay"`                        // 结束日期
+}
diff --git a/webapp/src/api/fin/report.ts b/webapp/src/api/fin/report.ts
new file mode 100644
index 0000000000000000000000000000000000000000..640d395d4d83aff3ee311dc888dda9de70023c63
--- /dev/null
+++ b/webapp/src/api/fin/report.ts
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+// [财务]-能耗账单统计
+export function statsEcs(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/statsEcs', params })
+}
+
+// [财务]-能耗账单列表(含用能费用报表)
+export function listEcs(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listEcs', params })
+}
+
+// [财务]-能耗充值统计
+export function statsRecharge(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/statsRecharge', params })
+}
+
+// [财务]-能耗充值统计列表
+export function listRecharge(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listRecharge', params })
+}
+
+// [财务]-能耗扣费列表
+export function listDeduct(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listDeduct', params })
+}
+
+// [财务]-能耗补贴列表
+export function listSubsidy(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listSubsidy', params })
+}
+
+// [财务]-能耗退费列表
+export function listRefund(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listRefund', params })
+}
+
+// [财务]-公摊账单列表
+export function listShared(params?: Record<string, any>) {
+    return request.get({ url: '/fin/report/listShared', params })
+}
\ No newline at end of file
diff --git a/webapp/src/views/fin/bill/sharedForm.vue b/webapp/src/views/fin/bill/sharedForm.vue
index 127d42df9ba2be7445ec380fa6fe7e4134aa4cf9..18ab780519c000647db24fe6a557d56f3f3ace55 100644
--- a/webapp/src/views/fin/bill/sharedForm.vue
+++ b/webapp/src/views/fin/bill/sharedForm.vue
@@ -68,6 +68,13 @@
         billList: []
     })
 
+    const formatRetCode = (retCode: string) => {
+        if(retCode == undefined || retCode == '') {
+            return ''
+        }
+        return retCode !== '200' ? '失败' : '成功'
+    }
+
     defineExpose({
         open,
         setFormData,
diff --git a/webapp/src/views/fin/invoiceCode/index.vue b/webapp/src/views/fin/invoiceCode/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3181cb6dce183c41c3c9597e455f5f1f659dd450
--- /dev/null
+++ b/webapp/src/views/fin/invoiceCode/index.vue
@@ -0,0 +1,126 @@
+<template>
+    <div class="index-lists">
+        <el-card class="!border-none" shadow="never">
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="票据号" prop="invoiceCode">
+                    <el-input placeholder="请输入票据号" class="w-[200px]" v-model="queryParams.invoiceCode" />
+                </el-form-item>
+                <el-form-item label="使用状态" prop="isUsed">
+                    <el-select v-model="queryParams.isUsed" :style="{ width: '150px' }" placeholder="请输入使用状态">
+                        <el-option
+                                v-for="(item, index) in options.usedOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                        />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-button v-perms="['fin:invoiceCode:add']" type="primary" @click="handleAdd">
+                <template #icon>
+                    <icon name="el-icon-Plus" />
+                </template>
+                新增
+            </el-button>
+            <el-table
+                style="height: calc(100vh - 349px)"
+                class="mt-4"
+                size="large"
+                v-loading="pager.loading"
+                :data="pager.lists"
+            >
+                <el-table-column label="票据号码" prop="invoiceCode" min-width="100" />
+                <el-table-column label="票据代码" prop="invoiceCode" min-width="100" />
+                <el-table-column label="状态" prop="isUsed" min-width="100">
+                    <template #default="{ row }">
+                        {{ usedFormat(row.isUsed) }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" width="120" fixed="right">
+                    <template #default="{ row }">
+                        <el-button
+                            v-perms="['fin:invoiceCode:edit']"
+                            type="primary"
+                            link
+                            @click="handleEdit(row)"
+                        >
+                            编辑
+                        </el-button>
+                        <el-button
+                            v-perms="['fin:invoiceCode:del']"
+                            type="danger"
+                            link
+                            @click="handleDelete(row.id)"
+                        >
+                            删除
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
+            </div>
+        </el-card>
+        <edit-drawer
+            v-if="showEdit"
+            ref="editRef"
+            @success="getLists"
+            @close="showEdit = false"
+        />
+    </div>
+</template>
+<script lang="ts" setup name="invoice">
+import { invoiceCodeDelete, invoiceCodeLists } from '@/api/fin/invoiceCode'
+import { usePaging } from '@/hooks/usePaging'
+import feedback from '@/utils/feedback'
+import EditDrawer from './edit.vue'
+
+const editRef = shallowRef<InstanceType<typeof EditDrawer>>()
+const showEdit = ref(false)
+
+const queryParams = reactive({
+    invoiceCode: '',
+    isUsed: '',
+})
+
+const { pager, getLists, resetPage, resetParams } = usePaging({
+    fetchFun: invoiceCodeLists,
+    params: queryParams
+})
+
+const handleAdd = async () => {
+    showEdit.value = true
+    await nextTick()
+    editRef.value?.open('add')
+}
+
+const handleEdit = async (data: any) => {
+    showEdit.value = true
+    await nextTick()
+    editRef.value?.open('edit')
+    editRef.value?.setFormData(data)
+}
+
+const options = reactive({
+    usedOptions: [
+        {label: "未使用", value: "0"},
+        {label: "已使用", value: "1"},
+    ],
+})
+
+const usedFormat = (isUsed: string) => {
+    if(isUsed == undefined || isUsed == '') {
+        return ''
+    }
+    let value = options.usedOptions.find(item => item.value === isUsed);
+    return value !== undefined ? value.label : ''
+}
+
+getLists()
+</script>
diff --git a/webapp/src/views/fin/purse/payFee.vue b/webapp/src/views/fin/purse/payFee.vue
index aacde594b53a72a655fe26e842d32ad03d425bbb..6f087030a377a562122094ef4fb1672da29e2189 100644
--- a/webapp/src/views/fin/purse/payFee.vue
+++ b/webapp/src/views/fin/purse/payFee.vue
@@ -46,9 +46,9 @@
                             v-loading="pager.loading"
                             :data="pager.lists"
                     >
-                        <el-table-column label="缴费时间" width="180" prop="createTime">
+                        <el-table-column label="缴费时间" width="180" prop="paymentTime">
                             <template #default="{ row }">
-                                {{formatDate(row.createTime)}}
+                                {{formatDate(row.paymentTime)}}
                             </template>
                         </el-table-column>
                         <el-table-column label="缴费类型" width="100" prop="ecsType">
@@ -65,9 +65,9 @@
                                 </el-tag>
                             </template>
                         </el-table-column>
-                        <el-table-column label="缴费来源" width="100" prop="paymentSource">
+                        <el-table-column label="缴费来源" width="100" prop="paymentMethod">
                             <template #default="{ row }">
-                                {{ paymentSourceFormat(row.paymentSource) }}
+                                {{ paymentMethodFormat(row.paymentMethod) }}
                             </template>
                         </el-table-column>
                         <el-table-column label="操作金额" width="100" prop="operateAmount"/>
@@ -197,6 +197,7 @@
         }
         formData.houseId = houseId
         queryParams.purseId = data.id
+        queryParams.ecsType = ecsType
         getLists()
         // setFormData(data)
     }
@@ -213,12 +214,12 @@
     })
 
     const {optionsData} = useDictOptions<{
-        paymentSourceOptions: any[]
+        paymentMethodOptions: any[]
     }>({
-        paymentSourceOptions: {
+        paymentMethodOptions: {
             api: dictDataByType,
             params: {
-                type: 'payment_source'
+                type: 'payment_method'
             },
         },
     })
@@ -239,11 +240,11 @@
         return value !== undefined ? value.label : ''
     }
 
-    const paymentSourceFormat = (paymentSource: string) => {
-        if (paymentSource == undefined || paymentSource == '') {
+    const paymentMethodFormat = (paymentMethod: string) => {
+        if (paymentMethod == undefined || paymentMethod == '') {
             return ''
         }
-        let value = optionsData.paymentSourceOptions.find(item => item.value === paymentSource);
+        let value = optionsData.paymentMethodOptions.find(item => item.value === paymentMethod);
         return value !== undefined ? value.label : ''
     }
 
diff --git a/webapp/src/views/fin/purse/paymentMethod.vue b/webapp/src/views/fin/purse/paymentMethod.vue
index 7d1330e9c1795f76510bdbf24a6f0d0cc1970c18..4934bfb0fcc5d78517eb9dfa7dfeee9dd2ed835d 100644
--- a/webapp/src/views/fin/purse/paymentMethod.vue
+++ b/webapp/src/views/fin/purse/paymentMethod.vue
@@ -26,10 +26,9 @@
                 <el-form-item label="支付时间" prop="paymentTime">
                     <el-date-picker
                             v-model="formData.paymentTime"
-                            format="YYYY-MM-DD"
-                            value-format="YYYY-MM-DD"
+                            format="YYYY-MM-DD HH:mm:ss"
                             type="datetime"
-                            placeholder="选择日期"
+                            placeholder="选择支付时间"
                             clearable
                     ></el-date-picker>
                 </el-form-item>
@@ -83,6 +82,13 @@
                 trigger: ['blur']
             }
         ],
+        paymentMethod: [
+            {
+                required: true,
+                message: '请选择支付方式',
+                trigger: ['blur']
+            }
+        ],
     }
 
     const handleSubmit = async () => {
diff --git a/webapp/src/views/fin/purse/refundFee.vue b/webapp/src/views/fin/purse/refundFee.vue
index 45935b779cac40443bf71a04ef6ac2a0e2f86f6e..7cfe7ec53acac8e000c2524b7211bdfe1722ccf1 100644
--- a/webapp/src/views/fin/purse/refundFee.vue
+++ b/webapp/src/views/fin/purse/refundFee.vue
@@ -68,9 +68,9 @@
                                 </el-tag>
                             </template>
                         </el-table-column>
-                        <el-table-column label="缴费来源" width="100" prop="paymentSource">
+                        <el-table-column label="缴费来源" width="100" prop="paymentMethod">
                             <template #default="{ row }">
-                                {{ paymentSourceFormat(row.paymentSource) }}
+                                {{ paymentMethodFormat(row.paymentMethod) }}
                             </template>
                         </el-table-column>
                         <el-table-column label="操作金额" width="100" prop="operateAmount"/>
@@ -86,7 +86,7 @@
 </template>
 <script lang="ts" setup>
     import type { FormInstance } from 'element-plus'
-    import {flowList, purseDetail, pursePayFee} from '@/api/fin/purse'
+    import {flowList, purseDetail, purseRefundFee} from '@/api/fin/purse'
     import Popup from '@/components/popup/index.vue'
     import feedback from '@/utils/feedback'
     import {usePaging} from '@/hooks/usePaging'
@@ -150,7 +150,7 @@
 
     const handleSubmit = async () => {
         await formRef.value?.validate()
-        await pursePayFee(formData)
+        await purseRefundFee(formData)
         popupRef.value?.close()
         feedback.msgSuccess('操作成功')
         emit('success')
@@ -204,12 +204,12 @@
     })
 
     const { optionsData } = useDictOptions<{
-        paymentSourceOptions: any[]
+        paymentMethodOptions: any[]
     }>({
-        paymentSourceOptions: {
+        paymentMethodOptions: {
             api: dictDataByType,
             params: {
-                type: 'payment_source'
+                type: 'payment_method'
             },
         },
     })
@@ -230,11 +230,11 @@
         return value !== undefined ? value.label : ''
     }
 
-    const paymentSourceFormat = (paymentSource: string) => {
-        if(paymentSource == undefined || paymentSource == '') {
+    const paymentMethodFormat = (paymentMethod: string) => {
+        if(paymentMethod == undefined || paymentMethod == '') {
             return ''
         }
-        let value = optionsData.paymentSourceOptions.find(item => item.value === paymentSource);
+        let value = optionsData.paymentMethodOptions.find(item => item.value === paymentMethod);
         return value !== undefined ? value.label : ''
     }
 
diff --git a/webapp/src/views/fin/purse/subsidyFee.vue b/webapp/src/views/fin/purse/subsidyFee.vue
index dcc3f979a20c2168d71e2e2f0a7e57b60070f0d2..ec647f1e8db6d24c4be5d7917f18cbd0d17b3973 100644
--- a/webapp/src/views/fin/purse/subsidyFee.vue
+++ b/webapp/src/views/fin/purse/subsidyFee.vue
@@ -69,9 +69,9 @@
                                 </el-tag>
                             </template>
                         </el-table-column>
-                        <el-table-column label="缴费来源" width="100" prop="paymentSource">
+                        <el-table-column label="缴费来源" width="100" prop="paymentMethod">
                             <template #default="{ row }">
-                                {{ paymentSourceFormat(row.paymentSource) }}
+                                {{ paymentMethodFormat(row.paymentMethod) }}
                             </template>
                         </el-table-column>
                         <el-table-column label="操作金额" width="100" prop="operateAmount"/>
@@ -88,7 +88,7 @@
 </template>
 <script lang="ts" setup>
     import type {FormInstance} from 'element-plus'
-    import {flowList, purseDetail, pursePayFee} from '@/api/fin/purse'
+    import {flowList, purseDetail, purseSubsidyFee} from '@/api/fin/purse'
     import Popup from '@/components/popup/index.vue'
     import feedback from '@/utils/feedback'
     import {usePaging} from '@/hooks/usePaging'
@@ -152,7 +152,7 @@
 
     const handleSubmit = async () => {
         await formRef.value?.validate()
-        await pursePayFee(formData)
+        await purseSubsidyFee(formData)
         popupRef.value?.close()
         feedback.msgSuccess('操作成功')
         emit('success')
@@ -206,12 +206,12 @@
     })
 
     const {optionsData} = useDictOptions<{
-        paymentSourceOptions: any[]
+        paymentMethodOptions: any[]
     }>({
-        paymentSourceOptions: {
+        paymentMethodOptions: {
             api: dictDataByType,
             params: {
-                type: 'payment_source'
+                type: 'payment_method'
             },
         },
     })
@@ -232,11 +232,11 @@
         return value !== undefined ? value.label : ''
     }
 
-    const paymentSourceFormat = (paymentSource: string) => {
-        if (paymentSource == undefined || paymentSource == '') {
+    const paymentMethodFormat = (paymentMethod: string) => {
+        if (paymentMethod == undefined || paymentMethod == '') {
             return ''
         }
-        let value = optionsData.paymentSourceOptions.find(item => item.value === paymentSource);
+        let value = optionsData.paymentMethodOptions.find(item => item.value === paymentMethod);
         return value !== undefined ? value.label : ''
     }
 
diff --git a/webapp/src/views/fin/shared/att.vue b/webapp/src/views/fin/shared/att.vue
index fac0aba85bec5fad5ced9286855a72c921a910ff..60394922b30ec50f68acf1994a55db777edfa8e2 100644
--- a/webapp/src/views/fin/shared/att.vue
+++ b/webapp/src/views/fin/shared/att.vue
@@ -84,20 +84,8 @@
                 </el-row>
                 <el-row :gutter="40">
                     <el-col :span="8">
-                        <el-form-item label="是否需要账单" prop="needBill" label-width="150px">
-                            <el-radio-group v-model="formData.needBill">
-                                <el-radio-button
-                                        v-for="(item, index) in isNeedOptions"
-                                        :key="index"
-                                        :label="item.value"
-                                >{{ item.label }}
-                                </el-radio-button>
-                            </el-radio-group>
-                        </el-form-item>
-                    </el-col>
-                    <el-col :span="8">
-                        <el-form-item label="迁入日期" prop="migrDate" label-width="150px">
-                            <el-select v-model="formData.migrDate" :style="{ width: '150px' }">
+                        <el-form-item label="不生成账单 迁入日期≥" prop="migrDate" label-width="180px">
+                            <el-select v-model="formData.migrDate" :style="{ width: '150px' }" clearable>
                                 <el-option
                                         v-for="(item, index) in options.dayOptions"
                                         :key="index"
@@ -110,8 +98,8 @@
                 </el-row>
                 <el-row>
                     <el-col :span="8">
-                        <el-form-item label="绑定区域" prop="areaNames" label-width="150px">
-                            <el-input v-model="formData.areaNames"
+                        <el-form-item label="绑定区域" prop="areaName" label-width="150px">
+                            <el-input v-model="formData.areaName"
                                       style="width:300px;"
                                       :disabled="true"
                                       type="textarea"
@@ -223,6 +211,7 @@
     const formData = reactive({
         id: null,
         commonAreaId: null,
+        commonAreaName: '',
         apportionMethod: '0',
         payableTime: 'pre',
         paymentDay: 0,
@@ -234,9 +223,11 @@
         commonTaxRate: '',
         specialTaxRate: '',
         regionId: '',
-        regionIds: '',
+        regionName: '',
         areaIds: '',
         areaNames: '',
+        areaId: '',
+        areaName: '',
         areaRatio: null
     })
 
@@ -316,6 +307,7 @@
     const resetFormData = () => {
         formData.id = null
         formData.commonAreaId = null
+        formData.commonAreaName = ''
         formData.apportionMethod = '0'
         formData.payableTime = 'pre'
         formData.paymentDay = 0
@@ -328,9 +320,10 @@
         formData.specialTaxRate = ''
         formData.regionId = ''
         formData.regionName = ''
-        formData.regionIds = ''
         formData.areaIds = ''
         formData.areaNames = ''
+        formData.areaId = ''
+        formData.areaName = ''
         formData.areaRatio = null
     }
 
@@ -375,13 +368,15 @@
             schemeType: 'att'
         })
 
-        toAreaConfList(row.areaIds, row.areaNames)
+        options.valueOptions = [{areaId: row.areaId, areaName: row.areaName, value: 0}]
+        // toAreaConfList(row.areaIds, row.areaNames)
         data["commonAreaId"] = row.commonAreaId
         data["regionId"] = row.regionId
         data["regionName"] = row.regionName
-        data["regionIds"] = row.regionIds
         data["areaIds"] = row.areaIds
         data["areaNames"] = row.areaNames
+        data["areaId"] = row.areaId
+        data["areaName"] = row.areaName
         if(row.apportionMethod == null || row.apportionMethod == undefined || row.apportionMethod == '') {
             data["apportionMethod"] = "0"
         }
diff --git a/webapp/src/views/fin/shared/electric.vue b/webapp/src/views/fin/shared/electric.vue
index 4dc49ed3852dec933b538f0f4b40c96932632399..01ad69c257c8b38fed2c6ba03c99f976eac81699 100644
--- a/webapp/src/views/fin/shared/electric.vue
+++ b/webapp/src/views/fin/shared/electric.vue
@@ -67,21 +67,10 @@
                         </el-radio-group>
                     </el-form-item>
                 </el-row>
-                <el-row :gutter="40">
-                    <el-form-item label="是否需要账单" prop="needBill" label-width="150px">
-                        <el-radio-group v-model="formData.needBill">
-                            <el-radio-button
-                                    v-for="(item, index) in isNeedOptions"
-                                    :key="index"
-                                    :label="item.value"
-                            >{{ item.label }}
-                            </el-radio-button>
-                        </el-radio-group>
-                    </el-form-item>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-form-item label="迁入日期" prop="migrDate" label-width="150px">
-                        <el-select v-model="formData.migrDate" :style="{ width: '150px' }">
+                <el-row :gutter="40" class="flex">
+                    <div class="lg:ml-20 mt-2">不生成账单</div>
+                    <el-form-item label="迁入日期≥" prop="migrDate" label-width="90px">
+                        <el-select v-model="formData.migrDate" :style="{ width: '150px' }" clearable>
                             <el-option
                                     v-for="(item, index) in options.dayOptions"
                                     :key="index"
@@ -123,51 +112,51 @@
                         </el-form-item>
                     </el-col>
                 </el-row>
+<!--                <el-row :gutter="40">-->
+<!--                    <el-form-item label="计费方式" prop="billingMethod" label-width="148px">-->
+<!--                        <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">-->
+<!--                            <el-radio-button-->
+<!--                                    v-for="(item, index) in optionsData.billingMethodOptions"-->
+<!--                                    :key="index"-->
+<!--                                    :label="item.value">-->
+<!--                                >{{ item.label }}-->
+<!--                            </el-radio-button>-->
+<!--                        </el-radio-group>-->
+<!--                    </el-form-item>-->
+<!--                </el-row>-->
+<!--                <el-row :gutter="40">-->
+<!--                    <el-form-item label="选择省份" prop="provinceKey" label-width="148px"-->
+<!--                                  v-if="formData.billingMethod=='4' || formData.billingMethod=='5'">-->
+<!--                        <el-select v-model="formData.provinceKey" placeholder="请选择省份" style="width: 120px"-->
+<!--                                   @change="provinceChange">-->
+<!--                            <el-option label="无" value=""/>-->
+<!--                            <el-option-->
+<!--                                    v-for="(item, index) in optionsData.provinceOptions"-->
+<!--                                    :key="index"-->
+<!--                                    :label="item.provinceName"-->
+<!--                                    :value="item.provinceKey"-->
+<!--                            />-->
+<!--                        </el-select>-->
+<!--                    </el-form-item>-->
+<!--                </el-row>-->
+<!--                <el-row :gutter="40">-->
+<!--                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">-->
+<!--                        <unit-fee ref="unitFeeRef"/>-->
+<!--                    </el-form-item>-->
+<!--                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">-->
+<!--                        <month-fee ref="monthFeeRef"/>-->
+<!--                    </el-form-item>-->
+<!--                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">-->
+<!--                        <year-fee ref="yearFeeRef"/>-->
+<!--                    </el-form-item>-->
+<!--                    <el-form-item label="价格计费" prop="price" label-width="148px"-->
+<!--                                  v-if="formData.billingMethod=='4' || formData.billingMethod=='5'">-->
+<!--                        <mult-fee ref="multFeeRef"/>-->
+<!--                    </el-form-item>-->
+<!--                </el-row>-->
                 <el-row :gutter="40">
-                    <el-form-item label="计费方式" prop="billingMethod" label-width="148px">
-                        <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">
-                            <el-radio-button
-                                    v-for="(item, index) in optionsData.billingMethodOptions"
-                                    :key="index"
-                                    :label="item.value">
-                                >{{ item.label }}
-                            </el-radio-button>
-                        </el-radio-group>
-                    </el-form-item>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-form-item label="选择省份" prop="provinceKey" label-width="148px"
-                                  v-if="formData.billingMethod=='4' || formData.billingMethod=='5'">
-                        <el-select v-model="formData.provinceKey" placeholder="请选择省份" style="width: 120px"
-                                   @change="provinceChange">
-                            <el-option label="无" value=""/>
-                            <el-option
-                                    v-for="(item, index) in optionsData.provinceOptions"
-                                    :key="index"
-                                    :label="item.provinceName"
-                                    :value="item.provinceKey"
-                            />
-                        </el-select>
-                    </el-form-item>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">
-                        <unit-fee ref="unitFeeRef"/>
-                    </el-form-item>
-                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">
-                        <month-fee ref="monthFeeRef"/>
-                    </el-form-item>
-                    <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">
-                        <year-fee ref="yearFeeRef"/>
-                    </el-form-item>
-                    <el-form-item label="价格计费" prop="price" label-width="148px"
-                                  v-if="formData.billingMethod=='4' || formData.billingMethod=='5'">
-                        <mult-fee ref="multFeeRef"/>
-                    </el-form-item>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-form-item label="绑定区域" prop="areaNames" label-width="150px">
-                        <el-input v-model="formData.areaNames"
+                    <el-form-item label="绑定区域" prop="areaName" label-width="150px">
+                        <el-input v-model="formData.areaName"
                                   style="width:300px;"
                                   :disabled="true"
                                   type="textarea"
@@ -265,6 +254,7 @@
     const formData = reactive({
         id: null,
         commonAreaId: null,
+        commonAreaName: '',
         schemeType: '1',
         isVac: '0',
         llf: '',
@@ -281,7 +271,8 @@
         price: [],
         regionId: '',
         regionName: '',
-        regionIds: '',
+        areaId: '',
+        areaName: '',
         areaIds: '',
         areaNames: '',
         areaRatio: null,
@@ -408,6 +399,7 @@
     const resetFormData = () => {
         formData.id = null
         formData.commonAreaId = null
+        formData.commonAreaName = ''
         formData.schemeType = '1'
         formData.isVac = '0'
         formData.llf = ''
@@ -424,9 +416,10 @@
         formData.price = []
         formData.regionId = ''
         formData.regionName = ''
-        formData.regionIds = ''
         formData.areaIds = ''
         formData.areaNames = ''
+        formData.areaId = ''
+        formData.areaName = ''
         formData.areaRatio = null
         formData.areaCoef = null
     }
@@ -494,13 +487,15 @@
             schemeType: 'electric'
         })
 
-        toAreaConfList(row.areaIds, row.areaNames)
+        options.valueOptions = [{areaId: row.areaId, areaName: row.areaName, value: 0}]
+        // toAreaConfList(row.areaIds, row.areaNames)
         data["commonAreaId"] = row.commonAreaId
         data["regionId"] = row.regionId
         data["regionName"] = row.regionName
-        data["regionIds"] = row.regionIds
         data["areaIds"] = row.areaIds
         data["areaNames"] = row.areaNames
+        data["areaId"] = row.areaId
+        data["areaName"] = row.areaName
         if(row.apportionMethod == null || row.apportionMethod == undefined || row.apportionMethod == '') {
             data["apportionMethod"] = "0"
         }
diff --git a/webapp/src/views/fin/shared/gas.vue b/webapp/src/views/fin/shared/gas.vue
index 518ce1d3c31370b5940f2b9d8c6850ba42ed8c5f..d08cbae45c2e05ba2230389449e58066646bf631 100644
--- a/webapp/src/views/fin/shared/gas.vue
+++ b/webapp/src/views/fin/shared/gas.vue
@@ -56,7 +56,7 @@
                 <el-row :gutter="40">
                     <el-col :span="8">
                         <el-form-item label="迁入日期" prop="migrDate">
-                            <el-select v-model="formData.migrDate" :style="{ width: '150px' }">
+                            <el-select v-model="formData.migrDate" :style="{ width: '150px' }" clearable>
                                 <el-option
                                         v-for="(item, index) in options.dayOptions"
                                         :key="index"
@@ -67,33 +67,33 @@
                         </el-form-item>
                     </el-col>
                 </el-row>
-                <el-row :gutter="40">
-                    <el-col :span="8">
-                        <el-form-item label="计费方式" prop="billingMethod" label-width="148px">
-                            <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">
-                                <el-radio-button
-                                        v-for="(item, index) in filterBillingMethodOptions"
-                                        :key="index"
-                                        :label="item.value">
-                                    >{{ item.label }}
-                                </el-radio-button>
-                            </el-radio-group>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-col :span="24">
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">
-                            <unit-fee ref="unitFeeRef"/>
-                        </el-form-item>
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">
-                            <month-fee ref="monthFeeRef"/>
-                        </el-form-item>
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">
-                            <year-fee ref="yearFeeRef"/>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
+<!--                <el-row :gutter="40">-->
+<!--                    <el-col :span="8">-->
+<!--                        <el-form-item label="计费方式" prop="billingMethod" label-width="148px">-->
+<!--                            <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">-->
+<!--                                <el-radio-button-->
+<!--                                        v-for="(item, index) in filterBillingMethodOptions"-->
+<!--                                        :key="index"-->
+<!--                                        :label="item.value">-->
+<!--                                    >{{ item.label }}-->
+<!--                                </el-radio-button>-->
+<!--                            </el-radio-group>-->
+<!--                        </el-form-item>-->
+<!--                    </el-col>-->
+<!--                </el-row>-->
+<!--                <el-row :gutter="40">-->
+<!--                    <el-col :span="24">-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">-->
+<!--                            <unit-fee ref="unitFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">-->
+<!--                            <month-fee ref="monthFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">-->
+<!--                            <year-fee ref="yearFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                    </el-col>-->
+<!--                </el-row>-->
                 <el-row :gutter="40">
                     <el-col :span="8">
                         <el-form-item label="面积类型" prop="squareType" style="width:300px" label-width="150px" v-if="formData.apportionMethod=='0'">
@@ -110,8 +110,8 @@
                 </el-row>
                 <el-row :gutter="40">
                     <el-col :span="16">
-                        <el-form-item label="绑定区域" prop="areaNames" label-width="150px">
-                            <el-input v-model="formData.areaNames"
+                        <el-form-item label="绑定区域" prop="areaName" label-width="150px">
+                            <el-input v-model="formData.areaName"
                                       style="width:300px;"
                                       :disabled="true"
                                       type="textarea"
@@ -229,6 +229,7 @@
     const formData = reactive({
         id: null,
         commonAreaId: null,
+        commonAreaName: '',
         apportionMethod: '0',
         payableTime: '',
         paymentDay: '',
@@ -240,9 +241,10 @@
         price: [],
         regionId: '',
         regionName: '',
-        regionIds: '',
         areaIds: '',
         areaNames: '',
+        areaId: '',
+        areaName: '',
         areaRatio: null
     })
 
@@ -308,6 +310,7 @@
     const resetFormData = () => {
         formData.id =null
         formData.commonAreaId = null
+        formData.commonAreaName = ''
         formData.apportionMethod ='0'
         formData.payableTime =''
         formData.paymentDay =''
@@ -319,9 +322,10 @@
         formData.price = []
         formData.regionId =''
         formData.regionName = ''
-        formData.regionIds = ''
         formData.areaIds =''
         formData.areaNames =''
+        formData.areaId = ''
+        formData.areaName = ''
         formData.areaRatio = null
     }
 
@@ -369,13 +373,15 @@
             schemeType: 'gas'
         })
 
-        toAreaConfList(row.areaIds, row.areaNames)
+        options.valueOptions = [{areaId: row.areaId, areaName: row.areaName, value: 0}]
+        // toAreaConfList(row.areaIds, row.areaNames)
         data["commonAreaId"] = row.commonAreaId
         data["regionId"] = row.regionId
         data["regionName"] = row.regionName
-        data["regionIds"] = row.regionIds
         data["areaIds"] = row.areaIds
         data["areaNames"] = row.areaNames
+        data["areaId"] = row.areaId
+        data["areaName"] = row.areaName
         if(row.apportionMethod == null || row.apportionMethod == undefined || row.apportionMethod == '') {
             data["apportionMethod"] = "0"
         }
diff --git a/webapp/src/views/fin/shared/water.vue b/webapp/src/views/fin/shared/water.vue
index 152acbd6806fed4dc37019138174601dca5dc02d..c21744a57534adbb17fd1887191633146b2147e7 100644
--- a/webapp/src/views/fin/shared/water.vue
+++ b/webapp/src/views/fin/shared/water.vue
@@ -67,33 +67,33 @@
                         </el-form-item>
                     </el-col>
                 </el-row>
-                <el-row :gutter="40">
-                    <el-col :span="8">
-                        <el-form-item label="计费方式" prop="billingMethod" label-width="148px">
-                            <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">
-                                <el-radio-button
-                                        v-for="(item, index) in filterBillingMethodOptions"
-                                        :key="index"
-                                        :label="item.value">
-                                    >{{ item.label }}
-                                </el-radio-button>
-                            </el-radio-group>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
-                <el-row :gutter="40">
-                    <el-col :span="24">
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">
-                            <unit-fee ref="unitFeeRef"/>
-                        </el-form-item>
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">
-                            <month-fee ref="monthFeeRef"/>
-                        </el-form-item>
-                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">
-                            <year-fee ref="yearFeeRef"/>
-                        </el-form-item>
-                    </el-col>
-                </el-row>
+<!--                <el-row :gutter="40">-->
+<!--                    <el-col :span="8">-->
+<!--                        <el-form-item label="计费方式" prop="billingMethod" label-width="148px">-->
+<!--                            <el-radio-group v-model="formData.billingMethod" @change="handleBillingMethodChange">-->
+<!--                                <el-radio-button-->
+<!--                                        v-for="(item, index) in filterBillingMethodOptions"-->
+<!--                                        :key="index"-->
+<!--                                        :label="item.value">-->
+<!--                                    >{{ item.label }}-->
+<!--                                </el-radio-button>-->
+<!--                            </el-radio-group>-->
+<!--                        </el-form-item>-->
+<!--                    </el-col>-->
+<!--                </el-row>-->
+<!--                <el-row :gutter="40">-->
+<!--                    <el-col :span="24">-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='1'">-->
+<!--                            <unit-fee ref="unitFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='2'">-->
+<!--                            <month-fee ref="monthFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                        <el-form-item label="价格计费" prop="price" label-width="148px" v-if="formData.billingMethod=='3'">-->
+<!--                            <year-fee ref="yearFeeRef"/>-->
+<!--                        </el-form-item>-->
+<!--                    </el-col>-->
+<!--                </el-row>-->
                 <el-row :gutter="40">
                     <el-col :span="8" v-if="formData.apportionMethod=='0'">
                         <el-form-item label="面积类型" prop="squareType" label-width="150px">
@@ -122,8 +122,8 @@
                 </el-row>
                 <el-row :gutter="40">
                     <el-col :span="16">
-                        <el-form-item label="绑定区域" prop="areaNames" label-width="150px">
-                            <el-input v-model="formData.areaNames"
+                        <el-form-item label="绑定区域" prop="areaName" label-width="150px">
+                            <el-input v-model="formData.areaName"
                                       style="width:300px;"
                                       :disabled="true"
                                       type="textarea"
@@ -239,6 +239,7 @@
     const formData = reactive({
         id: null,
         commonAreaId: null,
+        commonAreaName: '',
         apportionMethod: '0',
         payableTime: '',
         paymentDay: 0,
@@ -251,9 +252,10 @@
         price: [],
         regionId: '',
         regionName: '',
-        regionIds: '',
         areaIds: '',
         areaNames: '',
+        areaId: '',
+        areaName: '',
         areaRatio: null
     })
 
@@ -319,6 +321,7 @@
     const resetFormData = () => {
         formData.id = null
         formData.commonAreaId = null
+        formData.commonAreaName = ''
         formData.apportionMethod = '0'
         formData.payableTime = ''
         formData.paymentDay = 0
@@ -331,9 +334,10 @@
         formData.price = []
         formData.regionId = ''
         formData.regionName = ''
-        formData.regionIds = ''
         formData.areaIds = ''
         formData.areaNames = ''
+        formData.areaId = ''
+        formData.areaName = ''
         formData.areaRatio = null
     }
 
@@ -370,6 +374,7 @@
             if (ratio == undefined || ratio == null) {
                 ratio = options.valueOptions
             }
+            console.log("!!!!!!!!!!!", ratio)
             ratioRef.value?.open()
             ratioRef.value?.setFormData(ratio)
         }
@@ -381,13 +386,15 @@
             schemeType: 'water'
         })
 
-        toAreaConfList(row.areaIds, row.areaNames)
+        options.valueOptions = [{areaId: row.areaId, areaName: row.areaName, value: 0}]
+        // toAreaConfList(row.areaIds, row.areaNames)
         data["commonAreaId"] = row.commonAreaId
         data["regionId"] = row.regionId
         data["regionName"] = row.regionName
-        data["regionIds"] = row.regionIds
         data["areaIds"] = row.areaIds
         data["areaNames"] = row.areaNames
+        data["areaId"] = row.areaId
+        data["areaName"] = row.areaName
         if(row.apportionMethod == null || row.apportionMethod == undefined || row.apportionMethod == '') {
             data["apportionMethod"] = "0"
         }
diff --git a/webapp/src/views/fin/txn/apportion.vue b/webapp/src/views/fin/txn/apportion.vue
index ad1d0e909580b9fe3c9ba4b50cc1a18c939e7b96..01a173ea1d7c951fd4e210799e8cf3d3197eba44 100644
--- a/webapp/src/views/fin/txn/apportion.vue
+++ b/webapp/src/views/fin/txn/apportion.vue
@@ -1,26 +1,103 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="时间">
+                    <el-date-picker
+                            v-model="queryParams.peroid"
+                            type="daterange"
+                            range-separator="-"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                            start-placeholder="开始时间"
+                            end-placeholder="结束时间"
+                            clearable
+                            style="width:180px"
+                    ></el-date-picker>
+                </el-form-item>
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="仪表类型" prop="ownerName">
+                    <el-select class="w-[280px]" v-model="queryParams.meterType">
+                        <el-option label="电表" value="电表" />
+                        <el-option label="热水表" value="热水表" />
+                        <el-option label="冷水表" value="冷水表" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="厂房" prop="houseName" min-widtha="110" />
+                <el-table-column label="类型" prop="paymentMethod" min-width="110" />
+                <el-table-column label="金额" prop="amount" min-width="110" />
+                <el-table-column label="交易方式" prop="paymentMethod" min-width="110" />
+                <el-table-column label="交易时间" prop="payTime" min-width="110" />
+                <el-table-column label="收款人" prop="payee" min-width="110" />
+                <el-table-column label="备注" prop="remark" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnApportionment">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listShared } from '@/api/fin/report'
+    import {format} from 'date-fns';
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-import feedback from '@/utils/feedback'
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listShared,
+        params: queryParams
+    })
 
-const queryParams = reactive({
+    const options = reactive({
+        areaOptions: [],
+    })
 
-})
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/deduction.vue b/webapp/src/views/fin/txn/deduction.vue
index 4e4d0d5df33782fd1746cc4c692b91315568e5e6..3634aa77f8b34de407ac03d50eaa7c4f36e7245e 100644
--- a/webapp/src/views/fin/txn/deduction.vue
+++ b/webapp/src/views/fin/txn/deduction.vue
@@ -1,26 +1,94 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="业主">
+                    <el-input class="w-[150px]" v-model="queryParams.ownerName" clearable placeholder="请输入业主"/>
+                </el-form-item>
+                <el-form-item label="仪表地址">
+                    <el-input class="w-[150px]" v-model="queryParams.address" clearable placeholder="请输入仪表地址"/>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-widtha="110" />
+                <el-table-column label="仪表地址" prop="address" min-width="110" />
+                <el-table-column label="业主" prop="address" min-width="110" />
+                <el-table-column label="仪表类型" prop="meterType" min-width="110" />
+                <el-table-column label="上期度数" prop="meterType" min-width="110" />
+                <el-table-column label="本期度数" prop="meterType" min-width="110" />
+                <el-table-column label="本期用量" prop="meterType" min-width="110" />
+                <el-table-column label="扣费时间" prop="amount" min-width="110" />
+                <el-table-column label="单价" prop="amount" min-width="110" />
+                <el-table-column label="总金额" prop="amount" min-width="110" />
+                <el-table-column label="多费率明细" prop="amount" min-width="110" />
+                <el-table-column label="倍率" prop="paymentTime" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnDeduction">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listDeduct } from '@/api/fin/report'
+    import {format} from 'date-fns';
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-import feedback from '@/utils/feedback'
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listDeduct,
+        params: queryParams
+    })
 
-const queryParams = reactive({
+    const options = reactive({
+        areaOptions: [],
+    })
 
-})
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/ec.vue b/webapp/src/views/fin/txn/ec.vue
index 538f976c4896394de8d1a971c2d8d58ecbb09adb..da40c8fe767247ae8208202005d9b3bc4459edd5 100644
--- a/webapp/src/views/fin/txn/ec.vue
+++ b/webapp/src/views/fin/txn/ec.vue
@@ -1,26 +1,98 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="时间">
+                    <el-date-picker
+                            v-model="queryParams.peroid"
+                            type="daterange"
+                            range-separator="-"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                            start-placeholder="开始时间"
+                            end-placeholder="结束时间"
+                            clearable
+                            style="width:180px"
+                    ></el-date-picker>
+                </el-form-item>
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="仪表类型" prop="ownerName">
+                    <el-select class="w-[280px]" v-model="queryParams.meterType">
+                        <el-option label="电表" value="电表" />
+                        <el-option label="热水表" value="热水表" />
+                        <el-option label="冷水表" value="冷水表" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-widtha="110" />
+                <el-table-column label="仪表地址" prop="address" min-width="110" />
+                <el-table-column label="用能量" prop="ownerName" min-width="110" />
+                <el-table-column label="用能分析" prop="usageTotal" min-width="110" />
+                <el-table-column label="电费余额" prop="purseAmount" min-width="110" />
+<!--                <el-table-column label="单一计费余额" prop="startDate" min-width="110" />-->
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnEc">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listEcs, statsRecharge, listRecharge, listDeduct, listSubsidy, listRefund, listShared } from '@/api/fin/report'
+    import {format} from 'date-fns';
 
-import feedback from '@/utils/feedback'
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-const queryParams = reactive({
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listEcs,
+        params: queryParams
+    })
 
-})
+    const options = reactive({
+        areaOptions: [],
+    })
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/ecb.vue b/webapp/src/views/fin/txn/ecb.vue
index 05a2c5290b25233475b32bb01a2b8ce5585df682..7e80bf5de835f3227404a9f5847ecc7536f90616 100644
--- a/webapp/src/views/fin/txn/ecb.vue
+++ b/webapp/src/views/fin/txn/ecb.vue
@@ -13,8 +13,8 @@
                             node-key="id"
                     />
                 </el-form-item>
-                <el-form-item label="厂房">
-                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入厂房"/>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
                 </el-form-item>
                 <el-form-item label="客户" prop="ownerName">
                     <el-input class="w-[150px]" v-model="queryParams.ownerName" clearable placeholder="请输入客户"/>
@@ -35,54 +35,50 @@
             <div class="flex" style="justify-content: space-around">
                 <div>
                     <div>应收金额</div>
-                    <div>¥10122.60</div>
+                    <div>¥{{statsEcsData.billAmount}}</div>
                 </div>
                 <div>
                     <div>应缴金额</div>
-                    <div>¥10122.60</div>
+                    <div>¥{{statsEcsData.paidAmount}}</div>
                 </div>
                 <div>
                     <div>未缴金额</div>
-                    <div>¥10122.60</div>
+                    <div>¥{{statsEcsData.unpaidAmount}}</div>
                 </div>
                 <div>
                     <div>已退金额</div>
-                    <div>¥10122.60</div>
+                    <div>¥{{statsEcsData.refundAmount}}</div>
                 </div>
                 <div>
                     <div>减免金额</div>
-                    <div>¥10122.60</div>
-                </div>
-                <div>
-                    <div>收费率</div>
-                    <div>¥10122.60</div>
+                    <div>¥{{statsEcsData.reductionAmount}}</div>
                 </div>
                 <div>
                     <div>总用量</div>
-                    <div>¥10122.60</div>
+                    <div>{{statsEcsData.usageTotal}}</div>
                 </div>
             </div>
         </el-card>
         <el-card class="!border-none mt-4" shadow="never">
-            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleOnAccount()">
+            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleOnAccount" :disabled="multiple">
                 <template #icon>
                     <icon name="el-icon-Plus" />
                 </template>
                 挂账
             </el-button>
-            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleReliefRule()">
-                <template #icon>
-                    <icon name="el-icon-Edit" />
-                </template>
-                减免规则
-            </el-button>
-            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleCreateBill()">
+<!--            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleReliefRule()">-->
+<!--                <template #icon>-->
+<!--                    <icon name="el-icon-Edit" />-->
+<!--                </template>-->
+<!--                减免规则-->
+<!--            </el-button>-->
+            <el-button v-perms="['txn:ecb:add']" type="primary" @click="handleCreateBill" :disabled="multiple">
                 <template #icon>
                     <icon name="el-icon-Edit" />
                 </template>
                 生成能耗费用账单
             </el-button>
-            <el-button v-perms="['txn:debt:add']" type="danger" @click="handleDelete()">
+            <el-button v-perms="['txn:debt:add']" type="danger" @click="handleDelete" :disabled="multiple">
                 <template #icon>
                     <icon name="el-icon-Delete" />
                 </template>
@@ -91,33 +87,66 @@
             <el-table
                     class="mt-4"
                     size="large"
-                    style="height: calc(100vh - 349px)"
+                    style="height: calc(100vh - 459px)"
                     v-loading="pager.loading"
                     :data="pager.lists"
+                    @selection-change="handleSelectionChange"
             >
-                <el-table-column label="区域" prop="schemeName" min-width="110" />
-                <el-table-column label="房屋" prop="schemeName" min-width="110" />
-                <el-table-column label="客户" prop="schemeName" min-width="110" />
-                <el-table-column label="分笔交易方式" prop="schemeName" min-width="140" />
-                <el-table-column label="仪表类型" prop="schemeName" min-width="110" />
-                <el-table-column label="表号" prop="schemeName" min-width="110" />
-                <el-table-column label="备注" prop="schemeName" min-width="110" />
-                <el-table-column label="起始时间" prop="schemeName" min-width="110" />
-                <el-table-column label="操作" width="310" fixed="right">
+                <el-table-column type="selection" width="55" align="center" />
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-width="110" />
+                <el-table-column label="客户" prop="ownerName" min-width="110" />
+<!--                <el-table-column label="分笔交易方式" prop="schemeName" min-width="140" />-->
+                <el-table-column label="仪表类型" prop="meterType" min-width="110" />
+<!--                <el-table-column label="表号" prop="schemeName" min-width="110" />-->
+<!--                <el-table-column label="备注" prop="schemeName" min-width="110" />-->
+                <el-table-column label="起始时间" prop="startDate" min-width="110" />
+                <el-table-column label="结束时间" prop="endDate" min-width="110" />
+                <el-table-column label="账单金额" prop="billAmount" min-width="110" />
+                <el-table-column label="未支付金额" prop="unpaidAmount" min-width="110" />
+                <el-table-column label="上期数" prop="usageStart" min-width="110" />
+                <el-table-column label="本期数" prop="usageEnd" min-width="110" />
+                <el-table-column label="用量" prop="usageTotal" min-width="110" />
+                <el-table-column label="支付时间" prop="paymentTime" min-width="110" />
+                <el-table-column label="收款人" prop="payee" min-width="110" />
+                <el-table-column label="支付方式" prop="paymentMethod" min-width="110" />
+                <el-table-column label="操作" width="200" fixed="right">
                     <template #default="{ row }">
-                        <el-button
-                                v-perms="['fin:record:list']"
-                                type="primary"
-                                link
-                                @click="handleRecord(row)"
+                        <el-dropdown trigger="click" v-perms="[
+                                            'fin:record:payRecordList',
+                                            'fin:record:changeRecordList',
+                                        ]"
+                                     class="ml-2 mt-1"
                         >
-                            记录
-                        </el-button>
+                            <el-button link type="info">
+                                记录
+                                <icon name="el-icon-arrow-down" />
+                            </el-button>
+                            <template #dropdown #default="{ row }">
+                                <el-dropdown-menu>
+                                    <el-dropdown-item v-perms="['fin:bill:payRecordList']">
+                                                    <span class="el-dropdown-item__content" @click="handleFeeChange(row)">
+                                                        费用更改记录
+                                                    </span>
+                                    </el-dropdown-item>
+                                    <el-dropdown-item v-perms="['fin:bill:changeRecordList']" divided>
+                                                    <span class="el-dropdown-item__content" @click="handleFeePay(row)">
+                                                        费用缴纳记录
+                                                    </span>
+                                    </el-dropdown-item>
+                                    <el-dropdown-item v-perms="['fin:bill:changeRecordList']" divided>
+                                                    <span class="el-dropdown-item__content" @click="handleBillRefund(row)">
+                                                        账单退费记录
+                                                    </span>
+                                    </el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
                         <el-button
                                 v-perms="['fin:ecs:edit']"
                                 type="primary"
                                 link
-                                @click="handleEdit(row)"
+                                @click="handleOnAccount(row)"
                         >
                             挂账
                         </el-button>
@@ -132,24 +161,75 @@
                     </template>
                 </el-table-column>
             </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
+            </div>
         </el-card>
-        <onAccount-drawer
+        <onAccount-popup
                 v-if="showOnAccount"
                 ref="onAccountRef"
                 @success="getLists"
                 @close="showOnAccount = false"
         />
+        <create-bill-popup
+                v-if="showBill"
+                ref="createBillRef"
+                @success="getLists"
+                @close="showBill = false"
+        />
+        <fee-change-popup
+                v-if="showFeeChange"
+                ref="feeChangeRef"
+                @close="showFeeChange = false"
+        />
+        <fee-pay-popup
+                v-if="showFeePay"
+                ref="feePayRef"
+                @close="showFeePay = false"
+        />
+        <bill-refund-popup
+                v-if="showBillRefund"
+                ref="billRefundRef"
+                @close="showBillRefund = false"
+        />
     </div>
 </template>
 <script lang="ts" setup name="txnEcb">
 
 import { listAreaTree} from '@/api/fin/common'
 import { usePaging } from '@/hooks/usePaging'
-import { ecsDelete, ecsLists } from '@/api/fin/ecs'
-import OnAccountDrawer from './onAccount.vue'
+import OnAccountPopup from './ecb/onAccount.vue'
+import CreateBillPopup from './ecb/createBill.vue'
+import FeeChangePopup from './ecb/feeChange.vue'
+import FeePayPopup from './ecb/feePay.vue'
+import BillRefundPopup from './ecb/billRefund.vue'
+import { statsEcs, listEcs } from '@/api/fin/report'
+import feedback from '@/utils/feedback'
+import {format} from 'date-fns';
 
-const onAccountRef = shallowRef<InstanceType<typeof OnAccountDrawer>>()
+const onAccountRef = shallowRef<InstanceType<typeof OnAccountPopup>>()
+const createBillRef = shallowRef<InstanceType<typeof CreateBillPopup>>()
+const feeChangeRef = shallowRef<InstanceType<typeof FeeChangePopup>>()
+const feePayRef = shallowRef<InstanceType<typeof FeePayPopup>>()
+const billRefundRef = shallowRef<InstanceType<typeof BillRefundPopup>>()
 const showOnAccount = ref(false)
+const showBill = ref(false)
+const showFeePay = ref(false)
+const showFeeChange = ref(false)
+const showBillRefund = ref(false)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const statsEcsData = reactive({
+    billAmount: 0,
+    unpaidAmount: 0,
+    paidAmount: 0,
+    lateAmount: 0,
+    reductionAmount: 0,
+    usageTotal: 0,
+    refundAmount: 0
+})
+
 
 const queryParams = reactive({
     id: '',
@@ -161,7 +241,7 @@ const queryParams = reactive({
 })
 
 const { pager, getLists, resetPage, resetParams } = usePaging({
-    fetchFun: ecsLists,
+    fetchFun: listEcs,
     params: queryParams
 })
 
@@ -172,32 +252,62 @@ const options = reactive({
 const handleOnAccount = async () => {
     showOnAccount.value = true
     await nextTick()
-    onAccountRef.value?.open('add')
+    onAccountRef.value?.open(ids)
 }
 
-// const handleReliefRule = async (data: any) => {
-//     showEdit.value = true
-//     await nextTick()
-//     editRef.value?.open('edit')
-//     editRef.value?.getDetail(data)
-// }
-//
-// const handleCreateBill = async (data: any) => {
-//     showEdit.value = true
-//     await nextTick()
-//     editRef.value?.open('edit')
-//     editRef.value?.getDetail(data)
-// }
-//
-// const handleDelete = async (id: number) => {
-//     await feedback.confirm('确定要删除？')
-//     await ecsDelete({ id })
-//     feedback.msgSuccess('删除成功')
-//     getLists()
-// }
+const handleCreateBill = async()=>{
+    showBill.value = true;
+    await nextTick()
+    createBillRef.value?.open(ids)
+}
 
+const handleFeeChange = async()=>{
+    showFeeChange.value = true;
+    await nextTick()
+    feeChangeRef.value?.open(ids)
+}
+
+const handleFeePay = async()=>{
+    showFeePay.value = true;
+    await nextTick()
+    feePayRef.value?.open(ids)
+}
+
+const handleBillRefund = async()=>{
+    showBillRefund.value = true;
+    await nextTick()
+    billRefundRef.value?.open(ids)
+}
+
+// 多选框选中数据
+const handleSelectionChange = async (selection: any) => {
+    ids.value = selection.map(item => item.id);
+    single.value = selection.length!==1;
+    multiple.value = !selection.length;
+}
+
+const handleDelete = async (id: number) => {
+    await feedback.confirm('确定要删除？')
+    // await deleteHierarchy({ id })
+    feedback.msgSuccess('删除成功')
+    getLists()
+}
+
+const formatDate = (date: any) => {
+    return format(date, 'yyyy-MM-dd HH:mm:ss');
+}
 
 onMounted(() => {
+    statsEcs({}).then((res) => {
+        statsEcsData.billAmount = res.billAmount
+        statsEcsData.unpaidAmount = res.unpaidAmount
+        statsEcsData.paidAmount = res.paidAmount
+        statsEcsData.lateAmount = res.lateAmount
+        statsEcsData.reductionAmount = res.reductionAmount
+        statsEcsData.usageTotal = res.usageTotal
+        statsEcsData.refundAmount = res.refundAmount
+    })
+    getLists()
     listAreaTree({}).then((res) => {
         options.areaOptions = res
     })
diff --git a/webapp/src/views/fin/txn/ecb/billRefund.vue b/webapp/src/views/fin/txn/ecb/billRefund.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4bf5255aae212166ead297cd6d68dcaaec9c24e7
--- /dev/null
+++ b/webapp/src/views/fin/txn/ecb/billRefund.vue
@@ -0,0 +1,86 @@
+<template>
+    <div class="edit-popup">
+        <popup ref="popupRef" :title="popupTitle" :async="true" width="1000px" @confirm="handleClose" @close="handleClose">
+            <el-table :data="pager.lists" size="large">
+                <el-table-column label="退款时间" prop="id" min-width="100" />
+                <el-table-column label="退款金额" prop="address" min-width="100" />
+                <el-table-column label="操作人" prop="username" min-width="100" />
+                <el-table-column label="备注" prop="nickname" min-width="150" />
+            </el-table>
+        </popup>
+    </div>
+</template>
+<script lang="ts" setup>
+    import type {FormInstance} from 'element-plus'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listEcs } from '@/api/fin/report'
+    import Popup from '@/components/popup/index.vue'
+    import {ref} from 'vue'
+    import feedback from '@/utils/feedback'
+    import {format} from 'date-fns';
+
+    const emit = defineEmits(['success', 'close'])
+    const mode = ref('add')
+    const popupRef = shallowRef<InstanceType<typeof Popup>>()
+    const open = (type = 'add') => {
+        mode.value = type
+        popupRef.value?.open()
+    }
+
+    // 表单数据
+    const formData = ref([
+        {
+            remark: '',
+        }
+    ])
+
+    const popupTitle = computed(() => {
+        return '生成费用账单'
+    })
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
+
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listEcs,
+        params: queryParams
+    })
+
+    const handleClose = () => {
+        emit('close')
+    }
+    const handleSubmit = async () => {
+        popupRef.value?.close()
+        feedback.msgSuccess('操作成功')
+        emit('success')
+    }
+
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
+
+    defineExpose({
+        open,
+    })
+
+</script>
+<style scoped lang="scss">
+    .formTitle{
+        background-size: 128px 32px !important;
+        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAYAAADaInAlAAAAAXNSR0IArs4c6QAABWZJREFUeF7tW0Fy3EYMbJK7kpXyHnLQH/IM/8Lf0Xd8dx6Qa3TwLVUpH5Oq+JBYUSJHEkUCqcYA3CG1lFblk6ugyw6XnOGSaDQaI6B5+04V1d+7t01TH//4US9VIQB4oTQcNxBRaIyhUG3KOV7Da8FxA4FAeX2Dx8dSneN68PWbBjICyjm2ks+1+/l3dh+u7/fiWpzH+9p8P25aiI5Qbf2cP4vsf689B+fwc+B9eezz+L1UY39GFfFreL2PeY7XygBt27Ien4vj/gHadpC4VhU6COSkg4wdRPr9eT5Lu4EMI2Sj0IcO0o6QdgsZ/4N2PCfQsw4jn7M7gVzzs4d0p5CHEdrdQ7ZnkPsBuv0CebWDvD6H/HYN+eNfKN5ALppGmmMBYAYMw/p4AsDimA8XhlBxcFTzw6BLcPBavnACzsbFaAUAbqTZegShAyFAGsCLtbgGf+c4QhHrNRine4XBed8RSgM+BwADxFB+nwElxgp5cMeg0cNJbE0p78/mEDAdpO+hhwBwz2ffFKPXABgJpg2kGwoYbr5AX28hdyeQ4Z8CBAJg00N6Gv4McrKD3P0O/XMH+eEc8vMHKM4h+AlycQF9FgDvf9XL8GDxlzUxgHtczQA8NwNAMZ4ZappPT6dnHWIA98RgADM82ScA4L+BDMB1+dk6aIINZgwQ19Hz+fKdlYIBwqMNeEsAKFQWbBDgGCqj2/M5cJYA4Pxta4w0A4DNkeL9BMPEABzfF0MTAA+b8p44XgKA3n8/QHYLBticQfq/CgCubyG7HhoMMAHAGOAYAHzUS3rVMgQYBbsBzUMrcNQAMCO7waeQsACAh5YSYsJA/uLNQDROGL5iFAsB+2MDSTCAMVYAr4G0cGPW61frroWAWaiow0RF+8YC7vk1APg9wwEZoK3AFAygPdQAIB4qAgwVAG7p9aT/7yAtAUOqdwYIALQnkFOB3kUIuIKSCYIBrm4h3/dQhoCbD9BfyABfEwKeYoBaAyy9PEJIAOIYBjDPpJGdATjXqLUysP2eSgMYYEIDLBmg0gAdQ8NKCDDAucGXGoCGnRjgiBDAcHCQAdz4vbNBaITQADwmG8w0gAOAGqDblnDwkhAw0wB8xuc0wHtngBmFPyEClyGgNrKBoxJ1tQaYRGCEANcAQdGHNEAwgN9zJj6fBcAipBhYi4idiUBjgIUInGkAzvEQwPkR94/RAMEANkcgBgA3+rCBvBohxgC1CFxhgDUNECKQGmBzDvn8Yg2wAoDa0+sQsGSAiNVLDfAoQ/B47kp/ir1LABxiAFvLPfuRCPSwEiJwtr7HfYvfjanuKZaH0ZchYAJJFQJqAATt1wCYMYDPI/V3EQIOZAGHAGAaYIAwC7CMwMFgDFBnAXUIuIXcuQb4dA45jSzga0WgCT9PCQ8CwIWZUbXTcS0CTVP4fAPHSho4aYDIECLme1oXGuARAMKTuTYB4llAACBYoxaBNQMEExzSAEsGCA0QgnGZBs6ygEgfPQ2caN893fRAlQYyG5C7wgI1AGjw3rUANcBqFnALudoVDfDpb8jnG88CXqoBch9grwkIjtwHqFT/U1lA7gOUzaHcB8h9gNwHyH2AklHkPsALdgJzHyD3AYw6cx9gnvpFGsit4KeygNwHyH2A3AfIfYDcB8h6gKwHyHqArAfIeoB9QUjWA5R/AE3//VspCct6AK8JrEvCsh4g6wFWi0KzHqDUE2Q9wL7g4mBNYNYDZD1A1gNEFVBdE5j1AF7Xn30B2ReQfQHZF1AaQrIvIPsCsi8g+wJK00j2BVhjSPYFRHOodyet9gauNYZkX8CRvYHZFxBdz9YplH0B0QuQfQHzJpKq9+9b6gv4H2O/kcGcmRybAAAAAElFTkSuQmCC);
+        color: #003287;
+        font-weight: 700;
+        height: 32px;
+        line-height: 32px;
+        margin-bottom: 10px;
+        padding-left: 22px;
+        width: 128px;
+    }
+
+</style>
diff --git a/webapp/src/views/fin/txn/ecb/createBill.vue b/webapp/src/views/fin/txn/ecb/createBill.vue
new file mode 100644
index 0000000000000000000000000000000000000000..84cbce5dfef743d42151b6698684214a69b1e4dd
--- /dev/null
+++ b/webapp/src/views/fin/txn/ecb/createBill.vue
@@ -0,0 +1,157 @@
+<template>
+    <div class="edit-popup">
+        <popup ref="popupRef" :title="popupTitle" :async="true" width="1000px" @confirm="handleSubmit" @close="handleClose">
+            <el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules" label-position="top">
+                <el-row :gutter="20">
+                    <el-col :span="8">
+                        <el-form-item label="能耗类型:" prop="remark">
+                            <el-input
+                                    v-model="formData.remark"
+                                    placeholder="请输入能耗类型"
+                                    clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="8">
+                        <el-form-item label="起始时间:" prop="startTime">
+                            <el-time-picker
+                                    v-model="formData.startTime"
+                                    type="datetime"
+                                    clearable
+                                    format="YYYY-MM-DD"
+                                    value-format="YYYY-MM-DD"
+                                    placeholder="请选择起始时间"
+                                    style="width: 100%"
+                            >
+                            </el-time-picker>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="8">
+                        <el-form-item label="结束时间:" prop="remark">
+                            <el-input
+                                    v-model="formData.remark"
+                                    placeholder="请输入备注"
+                                    clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row :gutter="20">
+                    <el-col :span="8">
+                        <el-form-item label="绑定区域:" prop="remark">
+                            <el-input
+                                    v-model="formData.remark"
+                                    placeholder="请输入备注"
+                                    clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="8">
+                        <el-form-item label="绑定房屋:" prop="remark">
+                            <el-input
+                                    v-model="formData.remark"
+                                    placeholder="请输入备注"
+                                    clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="8">
+                        <el-form-item label="账单金额为0元时：" prop="remark">
+                            <el-switch v-model="formData.status" active-text="生成"  :active-value="1" :inactive-value="0"/>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-col :span="8">
+                    <el-form-item label="空房屋：" prop="remark">
+                        <el-switch v-model="formData.status" active-text="生成" :active-value="1" :inactive-value="0"/>
+                    </el-form-item>
+                </el-col>
+            </el-form>
+
+            <div class="flex justify-between">
+                <div class="formTitle">账单生成明细</div>
+                <div>共产生成功<span style="color: #3763ff">0</span>条，未成功<span style="color: #ff2848">0</span>条</div>
+            </div>
+            <el-table :data="pager.lists" size="large">
+                <el-table-column label="表类型" prop="id" min-width="100" />
+                <el-table-column label="表地址" prop="address" min-width="100" />
+                <el-table-column label="房屋" prop="username" min-width="100" />
+                <el-table-column label="生成账单数量" prop="nickname" min-width="150" />
+                <el-table-column label="金额" prop="createTime" min-width="100" />
+                <el-table-column label="上期读数" prop="lastLoginTime" min-width="100" />
+                <el-table-column label="本期读数" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="倍率" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="用量" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="结果" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="未成功原因" prop="lastLoginIp" min-width="150" />
+            </el-table>
+        </popup>
+    </div>
+</template>
+<script lang="ts" setup>
+    import type {FormInstance} from 'element-plus'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listEcs } from '@/api/fin/report'
+    import Popup from '@/components/popup/index.vue'
+    import {ref} from 'vue'
+    import feedback from '@/utils/feedback'
+    const emit = defineEmits(['success', 'close'])
+    const mode = ref('add')
+    const popupRef = shallowRef<InstanceType<typeof Popup>>()
+    const open = (type = 'add') => {
+        mode.value = type
+        popupRef.value?.open()
+    }
+
+    // 表单数据
+    const formData = ref([
+        {
+            remark: '',
+        }
+    ])
+
+    const popupTitle = computed(() => {
+        return '生成费用账单'
+    })
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
+
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listEcs,
+        params: queryParams
+    })
+
+    const handleClose = () => {
+        emit('close')
+    }
+    const handleSubmit = async () => {
+        popupRef.value?.close()
+        feedback.msgSuccess('操作成功')
+        emit('success')
+    }
+    defineExpose({
+        open,
+    })
+
+</script>
+<style scoped lang="scss">
+    .formTitle{
+        background-size: 128px 32px !important;
+        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAYAAADaInAlAAAAAXNSR0IArs4c6QAABWZJREFUeF7tW0Fy3EYMbJK7kpXyHnLQH/IM/8Lf0Xd8dx6Qa3TwLVUpH5Oq+JBYUSJHEkUCqcYA3CG1lFblk6ugyw6XnOGSaDQaI6B5+04V1d+7t01TH//4US9VIQB4oTQcNxBRaIyhUG3KOV7Da8FxA4FAeX2Dx8dSneN68PWbBjICyjm2ks+1+/l3dh+u7/fiWpzH+9p8P25aiI5Qbf2cP4vsf689B+fwc+B9eezz+L1UY39GFfFreL2PeY7XygBt27Ien4vj/gHadpC4VhU6COSkg4wdRPr9eT5Lu4EMI2Sj0IcO0o6QdgsZ/4N2PCfQsw4jn7M7gVzzs4d0p5CHEdrdQ7ZnkPsBuv0CebWDvD6H/HYN+eNfKN5ALppGmmMBYAYMw/p4AsDimA8XhlBxcFTzw6BLcPBavnACzsbFaAUAbqTZegShAyFAGsCLtbgGf+c4QhHrNRine4XBed8RSgM+BwADxFB+nwElxgp5cMeg0cNJbE0p78/mEDAdpO+hhwBwz2ffFKPXABgJpg2kGwoYbr5AX28hdyeQ4Z8CBAJg00N6Gv4McrKD3P0O/XMH+eEc8vMHKM4h+AlycQF9FgDvf9XL8GDxlzUxgHtczQA8NwNAMZ4ZappPT6dnHWIA98RgADM82ScA4L+BDMB1+dk6aIINZgwQ19Hz+fKdlYIBwqMNeEsAKFQWbBDgGCqj2/M5cJYA4Pxta4w0A4DNkeL9BMPEABzfF0MTAA+b8p44XgKA3n8/QHYLBticQfq/CgCubyG7HhoMMAHAGOAYAHzUS3rVMgQYBbsBzUMrcNQAMCO7waeQsACAh5YSYsJA/uLNQDROGL5iFAsB+2MDSTCAMVYAr4G0cGPW61frroWAWaiow0RF+8YC7vk1APg9wwEZoK3AFAygPdQAIB4qAgwVAG7p9aT/7yAtAUOqdwYIALQnkFOB3kUIuIKSCYIBrm4h3/dQhoCbD9BfyABfEwKeYoBaAyy9PEJIAOIYBjDPpJGdATjXqLUysP2eSgMYYEIDLBmg0gAdQ8NKCDDAucGXGoCGnRjgiBDAcHCQAdz4vbNBaITQADwmG8w0gAOAGqDblnDwkhAw0wB8xuc0wHtngBmFPyEClyGgNrKBoxJ1tQaYRGCEANcAQdGHNEAwgN9zJj6fBcAipBhYi4idiUBjgIUInGkAzvEQwPkR94/RAMEANkcgBgA3+rCBvBohxgC1CFxhgDUNECKQGmBzDvn8Yg2wAoDa0+sQsGSAiNVLDfAoQ/B47kp/ir1LABxiAFvLPfuRCPSwEiJwtr7HfYvfjanuKZaH0ZchYAJJFQJqAATt1wCYMYDPI/V3EQIOZAGHAGAaYIAwC7CMwMFgDFBnAXUIuIXcuQb4dA45jSzga0WgCT9PCQ8CwIWZUbXTcS0CTVP4fAPHSho4aYDIECLme1oXGuARAMKTuTYB4llAACBYoxaBNQMEExzSAEsGCA0QgnGZBs6ygEgfPQ2caN893fRAlQYyG5C7wgI1AGjw3rUANcBqFnALudoVDfDpb8jnG88CXqoBch9grwkIjtwHqFT/U1lA7gOUzaHcB8h9gNwHyH2AklHkPsALdgJzHyD3AYw6cx9gnvpFGsit4KeygNwHyH2A3AfIfYDcB8h6gKwHyHqArAfIeoB9QUjWA5R/AE3//VspCct6AK8JrEvCsh4g6wFWi0KzHqDUE2Q9wL7g4mBNYNYDZD1A1gNEFVBdE5j1AF7Xn30B2ReQfQHZF1AaQrIvIPsCsi8g+wJK00j2BVhjSPYFRHOodyet9gauNYZkX8CRvYHZFxBdz9YplH0B0QuQfQHzJpKq9+9b6gv4H2O/kcGcmRybAAAAAElFTkSuQmCC);
+        color: #003287;
+        font-weight: 700;
+        height: 32px;
+        line-height: 32px;
+        margin-bottom: 10px;
+        padding-left: 22px;
+        width: 128px;
+    }
+
+</style>
diff --git a/webapp/src/views/fin/txn/ecb/feeChange.vue b/webapp/src/views/fin/txn/ecb/feeChange.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c021750d489d2cbe1a28a342f8380a0571b53026
--- /dev/null
+++ b/webapp/src/views/fin/txn/ecb/feeChange.vue
@@ -0,0 +1,65 @@
+<template>
+    <div class="edit-popup">
+        <popup ref="popupRef" :title="popupTitle" :async="true" width="1000px" @confirm="handleClose" @close="handleClose">
+            <el-table :data="pager.lists" size="large">
+                <el-table-column label="更改前金额" prop="id" min-width="100" />
+                <el-table-column label="更改后金额" prop="address" min-width="100" />
+                <el-table-column label="更改前开始日期" prop="username" min-width="100" />
+                <el-table-column label="更改后开始日期" prop="nickname" min-width="150" />
+                <el-table-column label="更改前结束日期" prop="createTime" min-width="100" />
+                <el-table-column label="更改后结束日期" prop="lastLoginTime" min-width="100" />
+                <el-table-column label="备注" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="操作人" prop="lastLoginIp" min-width="100" />
+            </el-table>
+        </popup>
+    </div>
+</template>
+<script lang="ts" setup>
+    import type {FormInstance} from 'element-plus'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listEcs } from '@/api/fin/report'
+    import Popup from '@/components/popup/index.vue'
+    import {ref} from 'vue'
+    import feedback from '@/utils/feedback'
+    import {format} from 'date-fns';
+
+    const emit = defineEmits(['success', 'close'])
+    const mode = ref('add')
+    const popupRef = shallowRef<InstanceType<typeof Popup>>()
+    const open = (ids: any) => {
+        popupRef.value?.open()
+    }
+
+    // 表单数据
+    const formData = ref([
+        {
+            remark: '',
+        }
+    ])
+
+    const popupTitle = computed(() => {
+        return '记录'
+    })
+
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listEcs,
+    })
+
+    const handleClose = () => {
+        emit('close')
+    }
+    const handleSubmit = async () => {
+        popupRef.value?.close()
+        feedback.msgSuccess('操作成功')
+        emit('success')
+    }
+
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
+
+    defineExpose({
+        open,
+    })
+
+</script>
diff --git a/webapp/src/views/fin/txn/ecb/feePay.vue b/webapp/src/views/fin/txn/ecb/feePay.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cb228d3fc55b756769228e2ccb489fe8deb37111
--- /dev/null
+++ b/webapp/src/views/fin/txn/ecb/feePay.vue
@@ -0,0 +1,89 @@
+<template>
+    <div class="edit-popup">
+        <popup ref="popupRef" :title="popupTitle" :async="true" width="1000px" @confirm="handleClose" @close="handleClose">
+            <el-table :data="pager.lists" size="large">
+                <el-table-column label="交易方式" prop="id" min-width="100" />
+                <el-table-column label="交易时间" prop="address" min-width="100" />
+                <el-table-column label="操作时间" prop="username" min-width="100" />
+                <el-table-column label="金额" prop="createTime" min-width="100" />
+                <el-table-column label="操作人" prop="lastLoginTime" min-width="100" />
+                <el-table-column label="状态" prop="lastLoginIp" min-width="100" />
+                <el-table-column label="备注" prop="lastLoginIp" min-width="100" />
+            </el-table>
+        </popup>
+    </div>
+</template>
+<script lang="ts" setup>
+    import type {FormInstance} from 'element-plus'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listEcs } from '@/api/fin/report'
+    import Popup from '@/components/popup/index.vue'
+    import {ref} from 'vue'
+    import feedback from '@/utils/feedback'
+    import {format} from 'date-fns';
+
+    const emit = defineEmits(['success', 'close'])
+    const mode = ref('add')
+    const popupRef = shallowRef<InstanceType<typeof Popup>>()
+    const open = (type = 'add') => {
+        mode.value = type
+        popupRef.value?.open()
+    }
+
+    // 表单数据
+    const formData = ref([
+        {
+            remark: '',
+        }
+    ])
+
+    const popupTitle = computed(() => {
+        return '生成费用账单'
+    })
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
+
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listEcs,
+        params: queryParams
+    })
+
+    const handleClose = () => {
+        emit('close')
+    }
+    const handleSubmit = async () => {
+        popupRef.value?.close()
+        feedback.msgSuccess('操作成功')
+        emit('success')
+    }
+
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
+
+    defineExpose({
+        open,
+    })
+
+</script>
+<style scoped lang="scss">
+    .formTitle{
+        background-size: 128px 32px !important;
+        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAYAAADaInAlAAAAAXNSR0IArs4c6QAABWZJREFUeF7tW0Fy3EYMbJK7kpXyHnLQH/IM/8Lf0Xd8dx6Qa3TwLVUpH5Oq+JBYUSJHEkUCqcYA3CG1lFblk6ugyw6XnOGSaDQaI6B5+04V1d+7t01TH//4US9VIQB4oTQcNxBRaIyhUG3KOV7Da8FxA4FAeX2Dx8dSneN68PWbBjICyjm2ks+1+/l3dh+u7/fiWpzH+9p8P25aiI5Qbf2cP4vsf689B+fwc+B9eezz+L1UY39GFfFreL2PeY7XygBt27Ien4vj/gHadpC4VhU6COSkg4wdRPr9eT5Lu4EMI2Sj0IcO0o6QdgsZ/4N2PCfQsw4jn7M7gVzzs4d0p5CHEdrdQ7ZnkPsBuv0CebWDvD6H/HYN+eNfKN5ALppGmmMBYAYMw/p4AsDimA8XhlBxcFTzw6BLcPBavnACzsbFaAUAbqTZegShAyFAGsCLtbgGf+c4QhHrNRine4XBed8RSgM+BwADxFB+nwElxgp5cMeg0cNJbE0p78/mEDAdpO+hhwBwz2ffFKPXABgJpg2kGwoYbr5AX28hdyeQ4Z8CBAJg00N6Gv4McrKD3P0O/XMH+eEc8vMHKM4h+AlycQF9FgDvf9XL8GDxlzUxgHtczQA8NwNAMZ4ZappPT6dnHWIA98RgADM82ScA4L+BDMB1+dk6aIINZgwQ19Hz+fKdlYIBwqMNeEsAKFQWbBDgGCqj2/M5cJYA4Pxta4w0A4DNkeL9BMPEABzfF0MTAA+b8p44XgKA3n8/QHYLBticQfq/CgCubyG7HhoMMAHAGOAYAHzUS3rVMgQYBbsBzUMrcNQAMCO7waeQsACAh5YSYsJA/uLNQDROGL5iFAsB+2MDSTCAMVYAr4G0cGPW61frroWAWaiow0RF+8YC7vk1APg9wwEZoK3AFAygPdQAIB4qAgwVAG7p9aT/7yAtAUOqdwYIALQnkFOB3kUIuIKSCYIBrm4h3/dQhoCbD9BfyABfEwKeYoBaAyy9PEJIAOIYBjDPpJGdATjXqLUysP2eSgMYYEIDLBmg0gAdQ8NKCDDAucGXGoCGnRjgiBDAcHCQAdz4vbNBaITQADwmG8w0gAOAGqDblnDwkhAw0wB8xuc0wHtngBmFPyEClyGgNrKBoxJ1tQaYRGCEANcAQdGHNEAwgN9zJj6fBcAipBhYi4idiUBjgIUInGkAzvEQwPkR94/RAMEANkcgBgA3+rCBvBohxgC1CFxhgDUNECKQGmBzDvn8Yg2wAoDa0+sQsGSAiNVLDfAoQ/B47kp/ir1LABxiAFvLPfuRCPSwEiJwtr7HfYvfjanuKZaH0ZchYAJJFQJqAATt1wCYMYDPI/V3EQIOZAGHAGAaYIAwC7CMwMFgDFBnAXUIuIXcuQb4dA45jSzga0WgCT9PCQ8CwIWZUbXTcS0CTVP4fAPHSho4aYDIECLme1oXGuARAMKTuTYB4llAACBYoxaBNQMEExzSAEsGCA0QgnGZBs6ygEgfPQ2caN893fRAlQYyG5C7wgI1AGjw3rUANcBqFnALudoVDfDpb8jnG88CXqoBch9grwkIjtwHqFT/U1lA7gOUzaHcB8h9gNwHyH2AklHkPsALdgJzHyD3AYw6cx9gnvpFGsit4KeygNwHyH2A3AfIfYDcB8h6gKwHyHqArAfIeoB9QUjWA5R/AE3//VspCct6AK8JrEvCsh4g6wFWi0KzHqDUE2Q9wL7g4mBNYNYDZD1A1gNEFVBdE5j1AF7Xn30B2ReQfQHZF1AaQrIvIPsCsi8g+wJK00j2BVhjSPYFRHOodyet9gauNYZkX8CRvYHZFxBdz9YplH0B0QuQfQHzJpKq9+9b6gv4H2O/kcGcmRybAAAAAElFTkSuQmCC);
+        color: #003287;
+        font-weight: 700;
+        height: 32px;
+        line-height: 32px;
+        margin-bottom: 10px;
+        padding-left: 22px;
+        width: 128px;
+    }
+
+</style>
diff --git a/webapp/src/views/fin/txn/ecb/onAccount.vue b/webapp/src/views/fin/txn/ecb/onAccount.vue
new file mode 100644
index 0000000000000000000000000000000000000000..676683b1ce20f3d4ee3cb434972bf385dcf127e1
--- /dev/null
+++ b/webapp/src/views/fin/txn/ecb/onAccount.vue
@@ -0,0 +1,55 @@
+<template>
+    <div class="edit-popup">
+        <popup ref="popupRef" :title="popupTitle" :async="true" width="800px" @confirm="handleSubmit" @close="handleClose">
+            <el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
+                <el-form-item prop="remark">
+                    <el-input
+                            type="textarea"
+                            v-model="formData.remark"
+                            placeholder="请输入备注"
+                            clearable
+                            :rows="6"
+                    />
+                </el-form-item>
+            </el-form>
+        </popup>
+    </div>
+</template>
+<script lang="ts" setup>
+    import type {FormInstance} from 'element-plus'
+    import Popup from '@/components/popup/index.vue'
+    import {ref} from 'vue'
+    import feedback from '@/utils/feedback'
+    const emit = defineEmits(['success', 'close'])
+    const mode = ref('add')
+    const popupRef = shallowRef<InstanceType<typeof Popup>>()
+    const open = (ids: Array) => {
+        formData.ids = ids;
+        mode.value = 'add'
+        popupRef.value?.open()
+    }
+
+    // 表单数据
+    const formData = ref([
+        {
+            ids: [],
+            remark: '',
+        }
+    ])
+
+    const popupTitle = computed(() => {
+        return '挂账'
+    })
+    const handleClose = () => {
+        emit('close')
+    }
+    const handleSubmit = async () => {
+        popupRef.value?.close()
+        feedback.msgSuccess('操作成功')
+        emit('success')
+    }
+    defineExpose({
+        open,
+    })
+
+</script>
diff --git a/webapp/src/views/fin/txn/recharge.vue b/webapp/src/views/fin/txn/recharge.vue
index 2eb83edff83d341d664011ff9c999833e572f32d..1a775ece0e111bcc2e2a2a07ccc1e0f49684a488 100644
--- a/webapp/src/views/fin/txn/recharge.vue
+++ b/webapp/src/views/fin/txn/recharge.vue
@@ -1,26 +1,170 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="时间">
+                    <el-date-picker
+                            v-model="queryParams.peroid"
+                            type="daterange"
+                            range-separator="-"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                            start-placeholder="开始时间"
+                            end-placeholder="结束时间"
+                            clearable
+                            style="width:180px"
+                    ></el-date-picker>
+                </el-form-item>
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="交易方式" prop="paymentMethod">
+                    <el-select class="w-[280px]" v-model="queryParams.paymentMethod" placeholder="请选择交易方式">
+                        <el-option
+                                v-for="(item, index) in optionsData.paymentMethodOptions"
+                                :key="index"
+                                :label="item.label"
+                                :value="item.value"
+                        />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="仪表类型">
+                    <el-select class="w-[280px]" v-model="queryParams.meterType">
+                        <el-option label="电表" value="电表" />
+                        <el-option label="热水表" value="热水表" />
+                        <el-option label="冷水表" value="冷水表" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <div class="flex" style="justify-content: space-around">
+                <div>
+                    <div>总金额</div>
+                    <div>¥{{statsRechargeData.total.totalAmount}}</div>
+                </div>
+                <div>
+                    <div>电费总额</div>
+                    <div>¥{{statsRechargeData.electric.totalAmount}}</div>
+                </div>
+                <div>
+                    <div>水费总额</div>
+                    <div>¥{{statsRechargeData.water.totalAmount}}</div>
+                </div>
+                <div>
+                    <div>气费总额</div>
+                    <div>¥{{statsRechargeData.gas.totalAmount}}</div>
+                </div>
+            </div>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 429px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-width="110" />
+                <el-table-column label="交易方式" prop="paymentMethod" min-width="110" />
+                <el-table-column label="能耗类型" prop="ecsType" min-width="110" />
+                <el-table-column label="交易时间" prop="paymentTime" min-width="110" />
+                <el-table-column label="金额" prop="amount" min-width="110" />
+                <el-table-column label="收款人" prop="payee" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnRecharge">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { useDictOptions } from '@/hooks/useDictOptions'
+    import { statsEcs, listEcs, statsRecharge, listRecharge, listDeduct, listSubsidy, listRefund, listShared } from '@/api/fin/report'
+    import { dictDataByType } from '@/api/common/dictData'
+    import {format} from 'date-fns';
+
+    const showOnAccount = ref(false)
+    const statsRechargeData = reactive({
+        TotalAmount: 0,
+        total: {
+            totalAmount: 0,
+            paidAmount: 0
+        },
+        electric: {
+            totalAmount: 0,
+            paidAmount: 0
+        },
+        water: {
+            totalAmount: 0,
+            paidAmount: 0
+        },
+        gas: {
+            totalAmount: 0,
+            paidAmount: 0
+        }
+    })
+
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        paymentMethod: '',
+        meterType: '',
+    })
 
-import feedback from '@/utils/feedback'
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listRecharge,
+        params: queryParams
+    })
 
-const queryParams = reactive({
+    const options = reactive({
+        areaOptions: [],
+    })
 
-})
+    const {optionsData} = useDictOptions<{
+        paymentMethodOptions: any[]
+    }>({
+        paymentMethodOptions: {
+            api: dictDataByType,
+            params: {
+                type: 'payment_method'
+            },
+        },
+    })
 
-onMounted(() => {
-})
+    onMounted(() => {
+        statsRecharge({}).then((res) => {
+            statsRechargeData.TotalAmount = res.TotalAmount
+            statsRechargeData.total.totalAmount = res.total.totalAmount
+            statsRechargeData.electric.totalAmount = res.electric.totalAmount
+            statsRechargeData.water.totalAmount = res.water.totalAmount
+            statsRechargeData.gas.totalAmount = res.gas.totalAmount
+        })
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/refund.vue b/webapp/src/views/fin/txn/refund.vue
index 0f1520975b0f5df4523ccd5f35e32e2312ae68e0..38fa85431b072f7c0fa1e893e6bf871136603720 100644
--- a/webapp/src/views/fin/txn/refund.vue
+++ b/webapp/src/views/fin/txn/refund.vue
@@ -1,26 +1,90 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="仪表地址">
+                    <el-input class="w-[150px]" v-model="queryParams.address" clearable placeholder="请输入仪表地址"/>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-widtha="110" />
+                <el-table-column label="仪表类型" prop="meterType" min-width="110" />
+                <el-table-column label="仪表地址" prop="address" min-width="110" />
+                <el-table-column label="原单价" prop="amount" min-width="110" />
+                <el-table-column label="现单价" prop="amount" min-width="110" />
+                <el-table-column label="原金额" prop="amount" min-width="110" />
+                <el-table-column label="现金额" prop="amount" min-width="110" />
+                <el-table-column label="退补金额" prop="amount" min-width="110" />
+                <el-table-column label="支付时间" prop="paymentTime" min-width="110" />
+                <el-table-column label="扣除方式" prop="flowType" min-width="110" />
+                <el-table-column label="延期扣除时间" prop="amount" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnRefund">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listRefund } from '@/api/fin/report'
+    import {format} from 'date-fns';
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-import feedback from '@/utils/feedback'
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listRefund,
+        params: queryParams
+    })
 
-const queryParams = reactive({
+    const options = reactive({
+        areaOptions: [],
+    })
 
-})
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/sms.vue b/webapp/src/views/fin/txn/sms.vue
index 807ec28bfd27065dc2b78ba945f034fdf0f4106a..b0d898657487910ac3df1aed1ae0869efd8429e4 100644
--- a/webapp/src/views/fin/txn/sms.vue
+++ b/webapp/src/views/fin/txn/sms.vue
@@ -1,26 +1,62 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="日期">
+                    <el-date-picker
+                            v-model="queryParams.day"
+                            type="date"
+                            placeholder="选择日期"
+                            class="w-[280px]"
+                            clearable
+                            value-format="YYYY-MM-DD"
+                    />
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="充值金额" prop="areaName" min-width="110" />
+                <el-table-column label="充值条数" prop="houseName" min-widtha="110" />
+                <el-table-column label="操作人" prop="meterType" min-width="110" />
+                <el-table-column label="充值时间" prop="address" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnSms">
+<script lang="ts" setup name="txnEcb">
 
-import feedback from '@/utils/feedback'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listSubsidy } from '@/api/fin/report'
 
-const queryParams = reactive({
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-})
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listSubsidy,
+        params: queryParams
+    })
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+    })
 </script>
diff --git a/webapp/src/views/fin/txn/subsidy.vue b/webapp/src/views/fin/txn/subsidy.vue
index 0f356fee70c016ea0e77c0f8de3f9a09bfd60cf2..627cbdb1eb199cc4640a2d14c4c3a56beb9e0c87 100644
--- a/webapp/src/views/fin/txn/subsidy.vue
+++ b/webapp/src/views/fin/txn/subsidy.vue
@@ -1,26 +1,84 @@
 <template>
     <div class="index-lists">
         <el-card class="!border-none mt-4" shadow="never">
-            <div>
-                <el-button v-perms="['fin:debt:add']" type="primary" @click="handleAdd()">
-                    <template #icon>
-                        <icon name="el-icon-Plus" />
-                    </template>
-                    新增
-                </el-button>
+            <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+                <el-form-item label="区域">
+                    <el-tree-select
+                            clearable
+                            v-model="queryParams.areaId"
+                            :data="options.areaOptions"
+                            :render-after-expand="false"
+                            :check-strictly="true"
+                            :props="{ label: 'name', children: 'children' }"
+                            node-key="id"
+                    />
+                </el-form-item>
+                <el-form-item label="房屋">
+                    <el-input class="w-[150px]" v-model="queryParams.houseName" clearable placeholder="请输入房屋"/>
+                </el-form-item>
+                <el-form-item label="仪表地址">
+                <el-input class="w-[150px]" v-model="queryParams.address" clearable placeholder="请输入仪表地址"/>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="resetPage">查询</el-button>
+                    <el-button @click="resetParams">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="!border-none mt-4" shadow="never">
+            <el-table
+                    class="mt-4"
+                    size="large"
+                    style="height: calc(100vh - 339px)"
+                    v-loading="pager.loading"
+                    :data="pager.lists"
+            >
+                <el-table-column label="区域" prop="areaName" min-width="110" />
+                <el-table-column label="房屋" prop="houseName" min-widtha="110" />
+                <el-table-column label="仪表类型" prop="meterType" min-width="110" />
+                <el-table-column label="仪表地址" prop="address" min-width="110" />
+                <el-table-column label="补助金额" prop="amount" min-width="110" />
+                <el-table-column label="支付时间" prop="paymentTime" min-width="110" />
+            </el-table>
+            <div class="flex justify-end mt-4">
+                <pagination v-model="pager" @change="getLists" />
             </div>
-            {{'#####################'}}
         </el-card>
     </div>
 </template>
-<script lang="ts" setup name="txnSubsidy">
+<script lang="ts" setup name="txnEcb">
+
+    import { listAreaTree} from '@/api/fin/common'
+    import { usePaging } from '@/hooks/usePaging'
+    import { listSubsidy } from '@/api/fin/report'
+    import {format} from 'date-fns';
+
+    const queryParams = reactive({
+        id: '',
+        areaId: '',
+        houseName: '',
+        ownerName: '',
+        meterType: '',
+        feeAction: '',
+    })
 
-import feedback from '@/utils/feedback'
+    const { pager, getLists, resetPage, resetParams } = usePaging({
+        fetchFun: listSubsidy,
+        params: queryParams
+    })
 
-const queryParams = reactive({
+    const options = reactive({
+        areaOptions: [],
+    })
 
-})
+    const formatDate = (date: any) => {
+        return format(date, 'yyyy-MM-dd HH:mm:ss');
+    }
 
-onMounted(() => {
-})
+    onMounted(() => {
+        getLists()
+        listAreaTree({}).then((res) => {
+            options.areaOptions = res
+        })
+    })
 </script>
