@ -9,6 +9,7 @@ import (
"lapp_-wy/db"
"lapp_-wy/utils"
"lapp_-wy/web/middleware/glog"
"lapp_-wy/web/models/response"
"math"
"strings"
"time"
@ -39,10 +40,23 @@ type Chargetab struct {
type ChargeArrearage struct {
* Chargetab
Arrearage float64 ` json:"arrearage" `
ArrearageDate string ` json:"arrearage_date" `
Arrearage int ` json:"arrearage" `
ArrearageDate string ` json:"arrearage_date" `
}
type ChargeContactData struct {
* Chargetab
Contract string ` json:"contract" `
}
type ChargeArrearageExcelData struct {
* ChargeContactData
Arrearage int ` json:"arrearage" `
ArrearageDate string ` json:"arrearage_date" `
ChargeTypeStr string ` json:"charge_type_str" `
}
type ChargeTypeResponse struct {
Cid int ` json:"cid" `
Court string ` json:"court" `
@ -1622,7 +1636,6 @@ func (t *Chargetab) GetChargeTypeData(cid int, chargeWay string, date string, pa
totalMoney , err = engine . Table ( t . TableName ( ) ) . Where ( "cid = ? and chargeway = ? and chargetime = ?" , cid , chargeWay , date ) . Sum ( t , "chargableexpense" )
}
if err != nil {
fmt . Println ( "error here1:" , err )
return nil , err
}
offset := ( pageIndex - 1 ) * pageSize
@ -1635,7 +1648,6 @@ func (t *Chargetab) GetChargeTypeData(cid int, chargeWay string, date string, pa
}
count , err = engine . Table ( t . TableName ( ) ) . Where ( "cid = ? and (chargeway = \"扫码\" or chargeway = \"微信\" or chargeway = \"支付宝\") and chargetime = ?" , cid , date ) . Count ( )
if err != nil {
fmt . Println ( "error:" , err )
return nil , err
}
} else {
@ -1657,7 +1669,7 @@ func (t *Chargetab) GetChargeTypeData(cid int, chargeWay string, date string, pa
}
// 缴费台账接口
func ( t * Chargetab ) GetChargeArrearageData ( cid int , pageIndex , pageSize int , year int , arrearageDate string , selectType string , chargeType int , buildingId string , propertyId string ) ( result * ChargeArrearageResponse , err error ) {
func ( t * Chargetab ) GetChargeArrearageData ( cid int , pageIndex , pageSize int , year int , arrearageDate string , selectType string , chargeType int , buildingId string , propertyId string , start string , end string , currentYear int ) ( result * ChargeArrearageResponse , err error ) {
result = new ( ChargeArrearageResponse )
engine := db . MasterEngine ( )
var court Courttab
@ -1670,13 +1682,14 @@ func (t *Chargetab) GetChargeArrearageData(cid int, pageIndex, pageSize int, yea
}
var chargeLi [ ] * Chargetab
query := engine . Table ( t . TableName ( ) )
table := engine . Table ( t . TableName ( ) )
query := engine . Table ( t . TableName ( ) ) . Where ( "chargetab.cid = ?" , cid )
table := engine . Table ( t . TableName ( ) ) . Where ( "chargetab.cid = ?" , cid )
// 若搜索楼栋id则与物业表连表
if ! utils . ValueIsEmpty ( buildingId ) {
query = query . Join ( "LEFT" , "propertytab" , "propertytab.propertyid = chargetab.propertyid and propertytab.cid = chargetab.cid" ) . Where ( "chargetab.cid = ?" , cid ) . And ( "propertytab.buildingid = ?" , buildingId )
table = table . Join ( "LEFT" , "propertytab" , "propertytab.propertyid = chargetab.propertyid and propertytab.cid = chargetab.cid" ) . Where ( "chargetab.cid = ?" , cid ) . And ( "propertytab.buildingid = ?" , buildingId )
query = query . Join ( "LEFT" , "propertytab" , "propertytab.propertyid = chargetab.propertyid and propertytab.cid = chargetab.cid" ) . And ( "propertytab.buildingid = ?" , buildingId )
table = table . Join ( "LEFT" , "propertytab" , "propertytab.propertyid = chargetab.propertyid and propertytab.cid = chargetab.cid" ) . And ( "propertytab.buildingid = ?" , buildingId )
}
// arrearage 陈欠 current 当年
if selectType == "arrearage" {
query = query . Where ( "chargetab.chargetime <= ?" , arrearageDate )
@ -1693,6 +1706,17 @@ func (t *Chargetab) GetChargeArrearageData(cid int, pageIndex, pageSize int, yea
query = query . And ( "chargetab.propertyid = ?" , propertyId )
table = table . And ( "chargetab.propertyid = ?" , propertyId )
}
if start != "" {
query = query . And ( "chargetab.chargetime >= ? and chargetab.chargetime <= ?" , start , end )
table = table . And ( "chargetab.chargetime >= ? and chargetab.chargetime <= ?" , start , end )
} else {
if year != 0 {
start := fmt . Sprintf ( "%d-01-01" , year )
end := fmt . Sprintf ( "%d-01-01" , year + 1 )
query = query . And ( "chargetab.chargetime >= ? and chargetab.chargetime < ?" , start , end )
table = table . And ( "chargetab.chargetime >= ? and chargetab.chargetime < ?" , start , end )
}
}
offset := pageSize * ( pageIndex - 1 )
err = query . Limit ( pageSize , offset ) . Find ( & chargeLi )
if err != nil {
@ -1708,11 +1732,11 @@ func (t *Chargetab) GetChargeArrearageData(cid int, pageIndex, pageSize int, yea
var chargeallocation Chargeallocationtab
var chargeArrearage ChargeArrearage
chargeArrearage . Chargetab = charge
chargeCount , err := engine . Table ( chargeallocation . TableName ( ) ) . Where ( "chargenr = ? and allocateyear < ?" , charge . Chargenr , y ear) . Sum ( chargeallocation , "allocateexpense" )
chargeCount , err := engine . Table ( chargeallocation . TableName ( ) ) . Where ( "cid = ? and c hargenr = ? and allocateyear < ?" , cid , charge . Chargenr , currentY ear) . Sum ( chargeallocation , "allocateexpense" )
if err != nil {
return nil , err
}
chargeArrearage . Arrearage = chargeCount
chargeArrearage . Arrearage = utils . Round ( chargeCount )
chargeArrearage . ArrearageDate = arrearageDate
chargeArrearageLi = append ( chargeArrearageLi , & chargeArrearage )
}
@ -1722,5 +1746,303 @@ func (t *Chargetab) GetChargeArrearageData(cid int, pageIndex, pageSize int, yea
result . Total = count
result . TotalPage = int ( math . Ceil ( float64 ( count ) / float64 ( pageSize ) ) )
return result , nil
}
// 获取当年物业费和陈欠物业费统计数据
func ( t * Chargetab ) GetChargeStatisticData ( cid int , year int , selectType string , date string , currentYear int ) ( result * response . ChargeStatisticResponse , err error ) {
result = new ( response . ChargeStatisticResponse )
engine := db . MasterEngine ( )
var court Courttab
exist , err := engine . Table ( court . TableName ( ) ) . ID ( cid ) . Get ( & court )
if err != nil {
return result , err
}
if ! exist {
return result , errors . New ( "data not exist" )
}
// 获取当年物业费统计
var charge Chargetab
var chargeAllocation Chargeallocationtab
//var count float64
query := engine . Table ( charge . TableName ( ) ) . Where ( "chargetab.cid = ?" , cid )
if year != 0 || date != "" {
query = query . Join ( "LEFT" , "chargeallocationtab" , "chargetab.chargenr = chargeallocationtab.chargenr" )
if date != "" {
query = query . And ( "chargetab.chargetime = ?" , date )
} else {
start := fmt . Sprintf ( "%d-01-01" , year )
end := fmt . Sprintf ( "%d-01-01" , year + 1 )
query = query . And ( "chargetab.chargetime >= ? and chargetab.chargetime < ?" , start , end )
}
}
if selectType == "arrearage" {
query = query . And ( "chargeallocationtab.allocateyear < ?" , currentYear )
} else if selectType == "current" {
query = query . And ( "chargeallocationtab.allocateyear >= ?" , currentYear )
}
count , err := query . Sum ( chargeAllocation , "chargeallocationtab.allocateexpense" )
if err != nil {
return result , err
}
if selectType != "current" && selectType != "arrearage" {
selectType = "total"
}
result . Cid = cid
result . Court = court . Descr
result . Type = selectType
result . Count = utils . Round ( count )
return result , nil
}
func ( t * Chargetab ) GetChargeArrearageExcelData ( cid int , pageIndex , pageSize int , year int , arrearageDate string , selectType string , chargeType int , buildingId string , propertyId string , start string , end string , currentYear int ) ( result [ ] * ChargeArrearageExcelData , err error ) {
engine := db . MasterEngine ( )
var chargeLi [ ] * ChargeContactData
query := engine . Table ( t . TableName ( ) ) . Where ( "chargetab.cid = ?" , cid ) . Join ( "LEFT" , "propertytab" , "propertytab.propertyid = chargetab.propertyid and propertytab.cid = chargetab.cid" )
// 若搜索楼栋id则与物业表连表
if ! utils . ValueIsEmpty ( buildingId ) {
query = query . And ( "propertytab.buildingid = ?" , buildingId )
}
// arrearage 陈欠 current 当年
if selectType == "arrearage" {
query = query . Where ( "chargetab.chargetime <= ?" , arrearageDate )
} else if selectType == "current" {
query = query . Where ( "chargetab.chargetime > ?" , arrearageDate )
}
if chargeType != 0 {
query = query . And ( "chargetab.chargetype = ?" , chargeType )
}
if ! utils . ValueIsEmpty ( propertyId ) {
query = query . And ( "chargetab.propertyid = ?" , propertyId )
}
if start != "" {
query = query . And ( "chargetab.chargetime >= ? and chargetab.chargetime <= ?" , start , end )
} else {
if year != 0 {
start := fmt . Sprintf ( "%d-01-01" , year )
end := fmt . Sprintf ( "%d-01-01" , year + 1 )
query = query . And ( "chargetab.chargetime >= ? and chargetab.chargetime < ?" , start , end )
}
}
offset := pageSize * ( pageIndex - 1 )
err = query . Limit ( pageSize , offset ) . Find ( & chargeLi )
if err != nil {
return nil , err
}
// 在chargetab上拼接两个字段 一个陈欠日期 一个陈欠金额
var chargeArrearageExcelLi [ ] * ChargeArrearageExcelData
for _ , charge := range chargeLi {
var chargeallocation Chargeallocationtab
var chargeArrearageExcel ChargeArrearageExcelData
chargeArrearageExcel . ChargeContactData = charge
chargeCount , err := engine . Table ( chargeallocation . TableName ( ) ) . Where ( "cid = ? and chargenr = ? and allocateyear < ?" , cid , charge . Chargenr , currentYear ) . Sum ( chargeallocation , "allocateexpense" )
if err != nil {
return nil , err
}
chargeArrearageExcel . Arrearage = utils . Round ( chargeCount )
chargeArrearageExcel . ArrearageDate = arrearageDate
if chargeArrearageExcel . Chargetype == 1 {
chargeArrearageExcel . ChargeTypeStr = "物业费"
} else if chargeArrearageExcel . Chargetype == 2 {
chargeArrearageExcel . ChargeTypeStr = "电梯卡费"
} else if chargeArrearageExcel . Chargetype == 3 {
chargeArrearageExcel . ChargeTypeStr = "车位费"
}
chargeArrearageExcelLi = append ( chargeArrearageExcelLi , & chargeArrearageExcel )
}
return result , nil
}
func ( t * Chargetab ) ExportChargeArrearageExcel ( datalist [ ] * ChargeArrearageExcelData ) ( excelfile string , filename string , err error ) {
var file * xlsx . File
var sheet * xlsx . Sheet
var row * xlsx . Row
var cell * xlsx . Cell
file = xlsx . NewFile ( )
sheet , err = file . AddSheet ( "缴费台账" )
if err != nil {
return "" , "" , err
}
tableHead := true
fieldList := [ ] string {
"项目号" ,
"缴费类型" ,
"物业编号" ,
"业主" ,
"收费起始日期" ,
"收费结束日期" ,
"收费方式" ,
"应收费用" ,
"实收费用" ,
"收费时间" ,
"陈欠金额" ,
"陈欠日期" ,
}
var courtName string
for _ , val := range datalist {
if tableHead {
//添加表头
row = sheet . AddRow ( )
for _ , field := range fieldList {
cell = row . AddCell ( )
cell . Value = field
}
tableHead = false
//continue
}
row = sheet . AddRow ( )
if courtName == "" {
engine := db . MasterEngine ( )
var court Courttab
exist , err := engine . Table ( court . TableName ( ) ) . ID ( val . Cid ) . Get ( & court )
if err != nil {
return "" , "" , err
}
if ! exist {
return "" , "" , errors . New ( "data not exist" )
}
courtName = court . Descr
}
cell = row . AddCell ( )
cell . Value = courtName
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . ChargeTypeStr , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Propertyid , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Contract , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargestartdate , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargeenddate , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargeway , "" )
cell = row . AddCell ( )
cell . Value = fmt . Sprintf ( "%0.0f" , val . Chargableexpense )
cell = row . AddCell ( )
cell . Value = fmt . Sprintf ( "%0.0f" , val . Chargedexpense )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargetime , "" )
cell = row . AddCell ( )
cell . Value = fmt . Sprintf ( "%d" , val . Arrearage )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . ArrearageDate , "" )
}
name := utils . MakeOrderSn ( "缴费台账" )
filename = name + ".xlsx" //文件名
exceldir , _ := utils . GetCurrentPath ( "web/public/uploadxlsx" ) // 目录+文件名
excelfile = exceldir + "/" + filename
err = file . Save ( excelfile )
if err != nil {
return "" , "" , err
}
return excelfile , filename , nil
}
func ( t * Chargetab ) ExportChargeWayExcel ( datalist [ ] * Chargetab ) ( excelfile string , filename string , err error ) {
var file * xlsx . File
var sheet * xlsx . Sheet
var row * xlsx . Row
var cell * xlsx . Cell
file = xlsx . NewFile ( )
sheet , err = file . AddSheet ( "缴费台账" )
if err != nil {
return "" , "" , err
}
tableHead := true
fieldList := [ ] string {
"项目号" ,
"缴费类型" ,
"物业编号" ,
"收费起始日期" ,
"收费结束日期" ,
"收费方式" ,
"应收费用" ,
"实收费用" ,
"收费时间" ,
}
var courtName string
for _ , val := range datalist {
if tableHead {
//添加表头
row = sheet . AddRow ( )
for _ , field := range fieldList {
cell = row . AddCell ( )
cell . Value = field
}
tableHead = false
//continue
}
row = sheet . AddRow ( )
if courtName == "" {
engine := db . MasterEngine ( )
var court Courttab
exist , err := engine . Table ( court . TableName ( ) ) . ID ( val . Cid ) . Get ( & court )
if err != nil {
return "" , "" , err
}
if ! exist {
return "" , "" , errors . New ( "data not exist" )
}
courtName = court . Descr
}
cell = row . AddCell ( )
cell . Value = courtName
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargetype , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Propertyid , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargestartdate , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargeenddate , "" )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargeway , "" )
cell = row . AddCell ( )
cell . Value = fmt . Sprintf ( "%0.0f" , val . Chargableexpense )
cell = row . AddCell ( )
cell . Value = fmt . Sprintf ( "%0.0f" , val . Chargedexpense )
cell = row . AddCell ( )
cell . Value = utils . ValueToString ( val . Chargetime , "" )
cell = row . AddCell ( )
}
name := utils . MakeOrderSn ( "缴费台账" )
filename = name + ".xlsx" //文件名
exceldir , _ := utils . GetCurrentPath ( "web/public/uploadxlsx" ) // 目录+文件名
excelfile = exceldir + "/" + filename
err = file . Save ( excelfile )
if err != nil {
return "" , "" , err
}
return excelfile , filename , nil
}