瀏覽代碼

1新增用水性质报表

Xiaojh 4 年之前
父節點
當前提交
9c06d592df

+ 40 - 7
smart-city-platform/src/main/java/com/bz/smart_city/commom/util/ExcelUtil.java

@@ -2,10 +2,7 @@ package com.bz.smart_city.commom.util;
 
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.hssf.util.HSSFColor;
-import org.apache.poi.ss.usermodel.BorderStyle;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
-import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 
 import javax.servlet.http.HttpServletResponse;
@@ -29,6 +26,8 @@ public class ExcelUtil {
 
     private List<Object[]> dataList = new ArrayList<Object[]>();
 
+    private List<String> eList = new ArrayList<String>();
+
 
     //构造方法,传入要导出的数据
     public ExcelUtil(String title, String[] rowName, List<Object[]> dataList) {
@@ -37,6 +36,13 @@ public class ExcelUtil {
         this.title = title;
     }
 
+    public ExcelUtil(String title, String[] rowName, List<Object[]> dataList,List<String>list) {
+        this.dataList = dataList;
+        this.rowName = rowName;
+        this.title = title;
+        this.eList = list;
+    }
+
     /*
      * 导出数据
      * */
@@ -64,9 +70,22 @@ public class ExcelUtil {
                 cellTiltle.setCellStyle(columnTopStyle);
                 cellTiltle.setCellValue(title);
 
+                HSSFRow rowRowName = null;
+                if(eList != null && eList.size() > 0){
+                    for(int i=0; i<eList.size(); i++){
+                        Row searchFormRow = sheet.createRow(2+i);
+                        Cell searchFormCell = searchFormRow.createCell(0);
+                        searchFormCell.setCellValue(eList.get(i));
+                        sheet.addMergedRegion(new CellRangeAddress(searchFormRow.getRowNum(),
+                                searchFormRow.getRowNum(), 0, (rowName.length - 1)));
+                    }
+                    rowRowName = sheet.createRow(4);                // 在索引4的位置创建行(最顶端的行开始的第二行)
+                }else{
+                    rowRowName = sheet.createRow(2);                // 在索引2的位置创建行(最顶端的行开始的第二行)
+                }
+
                 // 定义所需列数
-                int columnNum = rowName.length;
-                HSSFRow rowRowName = sheet.createRow(2);                // 在索引2的位置创建行(最顶端的行开始的第二行)
+                int columnNum = rowName.length;               // 在索引2的位置创建行(最顶端的行开始的第二行)
 
                 // 将列头设置到sheet的单元格中
                 for (int n = 0; n < columnNum; n++) {
@@ -81,7 +100,12 @@ public class ExcelUtil {
                 for (int i = 0; i < listPage.size(); i++) {
 
                     Object[] obj = listPage.get(i);//遍历每个对象
-                    HSSFRow row = sheet.createRow(i + 3);//创建所需的行数
+                    HSSFRow row = null;
+                    if(eList != null && eList.size() > 0){
+                        row = sheet.createRow(i + 5);//创建所需的行数
+                    }else{
+                        row = sheet.createRow(i + 3);//创建所需的行数
+                    }
 
                     for (int j = 0; j < obj.length; j++) {
                         HSSFCell cell = null;   //设置单元格的数据类型
@@ -112,11 +136,20 @@ public class ExcelUtil {
                         }
                         if (currentRow.getCell(colNum) != null) {
                             HSSFCell currentCell = currentRow.getCell(colNum);
+                            String numbers = "";
                             if (currentCell.getCellTypeEnum() == CellType.STRING) {
                                 int length = calculateLength(currentCell.getStringCellValue());
                                 if (columnWidth < length) {
                                     columnWidth = length;
                                 }
+                                if(eList != null && eList.size() > 0){
+                                    if(rowNum == 4){
+                                        numbers = currentCell != null ? currentCell.getStringCellValue() : "";
+                                    }
+                                    if(numbers.equals("序号")){
+                                        columnWidth = 18;
+                                    }
+                                }
                             }
                         }
                     }

+ 49 - 0
smart-city-platform/src/main/java/com/bz/smart_city/controller/pay/PayReportController.java

@@ -6,6 +6,8 @@ import com.bz.smart_city.commom.model.ResultStatus;
 import com.bz.smart_city.dto.pay.PayArrearagedetailsReportDto;
 import com.bz.smart_city.dto.pay.PayOperatordetailsReportDto;
 import com.bz.smart_city.dto.pay.PayTransactiondetailsReportDto;
+import com.bz.smart_city.dto.pay.PayWaterPropertyReportDto;
+import com.bz.smart_city.entity.pay.PayWaterPropertyReport;
 import com.bz.smart_city.service.pay.PayReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -17,10 +19,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 /**
  * @Author: ZJY
@@ -119,4 +123,49 @@ public class PayReportController {
         return  new AjaxMessage<>(ResultStatus.OK,pagination);
     }
 
+    @ApiOperation(value = "用水性质销售统计报表")
+    @GetMapping("/getWaterPropertySaleReport")
+    public AjaxMessage<List<PayWaterPropertyReportDto>> getWaterPropertySaleReport(
+            @ApiParam(value = "机构ID", required = false) @RequestParam(required = false) Integer officeId,
+            @ApiParam(value = "收费员", required = false) @RequestParam(required = false) Integer userId,
+            @ApiParam(value = "起始时间", required = false,defaultValue = "2020-01-01") @RequestParam(required = false) String startDate,
+            @ApiParam(value = "结束时间", required = false,defaultValue = "2020-01-30") @RequestParam(required = false) String endDate,
+            @ApiParam(value = "用水类别", required = false) @RequestParam(required = false) Integer watercategoryId
+    ){
+        PayWaterPropertyReport  inParams = new PayWaterPropertyReport();
+        inParams.setOfficeId(officeId);
+        inParams.setUserId(userId);
+        inParams.setStartDate(startDate);
+        inParams.setEndDate(endDate);
+        inParams.setWatercategoryId(watercategoryId);
+
+        List<PayWaterPropertyReportDto> pagination = payReportService.getWaterPropertySaleReport(inParams);
+        return  new AjaxMessage<>(ResultStatus.OK,pagination);
+    }
+
+
+    @ApiOperation(value = "用水性质销售统计报表导出")
+    @GetMapping("/exportWaterPropertySale")
+    public void exportWaterPropertySale(
+            @ApiParam(value = "机构ID", required = false) @RequestParam(required = false) Integer officeId,
+            @ApiParam(value = "机构名称", required = false) @RequestParam(required = false) String officeName,
+            @ApiParam(value = "收费员Id", required = false) @RequestParam(required = false) Integer userId,
+            @ApiParam(value = "收费员名称", required = false) @RequestParam(required = false) String userName,
+            @ApiParam(value = "起始时间", required = false,defaultValue = "2020-01-01") @RequestParam(required = false) String startDate,
+            @ApiParam(value = "结束时间", required = false,defaultValue = "2020-01-30") @RequestParam(required = false) String endDate,
+            @ApiParam(value = "用水类别Id", required = false) @RequestParam(required = false) Integer watercategoryId,
+            @ApiParam(value = "用水类别名称", required = false) @RequestParam(required = false) String watercategoryName,
+            HttpServletResponse httpServletResponse
+    ){
+        PayWaterPropertyReport inParams = new PayWaterPropertyReport();
+        inParams.setOfficeId(officeId);
+        inParams.setOfficeName(officeName);
+        inParams.setUserId(userId);
+        inParams.setUserName(userName);
+        inParams.setStartDate(startDate);
+        inParams.setEndDate(endDate);
+        inParams.setWatercategoryId(watercategoryId);
+        inParams.setWatercategoryName(watercategoryName);
+        payReportService.WaterPropertySaleExcel(inParams,httpServletResponse);
+    }
 }

+ 7 - 0
smart-city-platform/src/main/java/com/bz/smart_city/dao/pay/PayReportMapper.java

@@ -3,7 +3,10 @@ package com.bz.smart_city.dao.pay;
 import com.bz.smart_city.dto.pay.PayArrearagedetailsReportDto;
 import com.bz.smart_city.dto.pay.PayOperatordetailsReportDto;
 import com.bz.smart_city.dto.pay.PayTransactiondetailsReportDto;
+import com.bz.smart_city.dto.pay.PayWaterPropertyReportDto;
+import com.bz.smart_city.entity.pay.PayWaterPropertyReport;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -20,4 +23,8 @@ public interface PayReportMapper {
 
     List<PayArrearagedetailsReportDto>getPayArrearagedetailsReportList(PayArrearagedetailsReportDto inParams);
 
+    List<PayWaterPropertyReportDto> getWaterPropertySaleReport(PayWaterPropertyReportDto inParams);
+    List<PayWaterPropertyReportDto> getTranInfoReport(@Param("inParams") PayWaterPropertyReport inParams);
+    List<PayWaterPropertyReportDto> getReceviceInfoReport(@Param("inParams") PayWaterPropertyReport inParams);
+
 }

+ 35 - 0
smart-city-platform/src/main/java/com/bz/smart_city/dto/pay/PayWaterPropertyReportDto.java

@@ -0,0 +1,35 @@
+package com.bz.smart_city.dto.pay;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author xjh
+ * @version 1.0
+ * @date 2021/1/12
+ */
+@Data
+@ApiModel("用水性质销售统计报表DTO")
+public class PayWaterPropertyReportDto {
+    @ApiModelProperty("用水性质ID")
+    private String waterpropertyId;
+    @ApiModelProperty("用水性质编号")
+    private String waterpropertyName;//用水性质编号
+    @ApiModelProperty("购水次数")
+    private Integer frequency;//购水次数
+    @ApiModelProperty("购水量")
+    private Integer amount;//购水量
+    @ApiModelProperty("定额水费")
+    private BigDecimal sfee;//定额水费
+    @ApiModelProperty("排污费")
+    private BigDecimal wsfee;//排污费
+    @ApiModelProperty("源水费")
+    private String ysfee;//源水费
+    @ApiModelProperty("附加费")
+    private String fjfee;//附加费
+    @ApiModelProperty("购水金额")
+    private BigDecimal receivedamount;//购水金额
+}

+ 56 - 0
smart-city-platform/src/main/java/com/bz/smart_city/entity/pay/PayWaterPropertyReport.java

@@ -0,0 +1,56 @@
+package com.bz.smart_city.entity.pay;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * @author xjh
+ * @version 1.0
+ * @date 2020/1/12
+ */
+@Data
+@ApiModel("用水性质销售统计报表entity")
+public class PayWaterPropertyReport {
+    @ApiModelProperty("用水性质ID")
+    private String waterpropertyId;
+    @ApiModelProperty("用水性质编号")
+    private String waterpropertyName;//用水性质编号
+    @ApiModelProperty("购水次数")
+    private Integer frequency;//购水次数
+    @ApiModelProperty("购水量")
+    private Integer amount;//购水量
+    @ApiModelProperty("定额水费")
+    private BigDecimal sfee;//定额水费
+    @ApiModelProperty("排污费")
+    private BigDecimal wsfee;//排污费
+    @ApiModelProperty("源水费")
+    private String ysfee;//源水费
+    @ApiModelProperty("附加费")
+    private String fjfee;//附加费
+    @ApiModelProperty("购水金额")
+    private BigDecimal receivedamount;//购水金额
+    @ApiModelProperty("客户ID")
+    private BigInteger customerId;
+    @ApiModelProperty("水司ID")
+    private BigInteger siteId;
+    @ApiModelProperty("机构ID")
+    private Integer officeId;
+    @ApiModelProperty("机构名称")
+    private String officeName;
+    @ApiModelProperty("用户ID")
+    private Integer userId;
+    @ApiModelProperty("用户名称")
+    private String userName;
+    @ApiModelProperty("起始时间")
+    private String startDate;
+    @ApiModelProperty("结束时间")
+    private String endDate;
+    @ApiModelProperty("用水类别ID")
+    private Integer watercategoryId;
+    @ApiModelProperty("用水类别名称")
+    private String watercategoryName;
+}

+ 43 - 8
smart-city-platform/src/main/java/com/bz/smart_city/service/impl/pay/PayChargeSurveyServiceImpl.java

@@ -37,7 +37,7 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
     }
 
     public static void main(String[] args) {
-      try {
+        try {
           /*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月日
           Calendar startDate = Calendar.getInstance();//起始年月
           startDate.setTime(sdf.parse("2020-07-01"));
@@ -64,10 +64,10 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
           BigDecimal bigDecima2 = new BigDecimal("600.00");
           BigDecimal divide = bigDecima2.subtract(bigDecima1).divide(bigDecima1,3, RoundingMode.HALF_UP);*/
 
-          //BigDecimal divide = bigDecima1 .divide(bigDecima2,2, RoundingMode.HALF_UP);
-      }catch (Exception e) {
-          e.printStackTrace();
-      }
+            //BigDecimal divide = bigDecima1 .divide(bigDecima2,2, RoundingMode.HALF_UP);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     /**
@@ -77,11 +77,19 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
     public PayChargeSurveyDto accountSurvey(){
         PayChargeSurveyDto payChargeSurveyDto = new PayChargeSurveyDto();
         LoginUser loginUser = UserUtil.getCurrentUser();
+        if(loginUser == null || loginUser.getCustomerId() == null){
+            return payChargeSurveyDto;
+        }
+        if(loginUser == null || loginUser.getSiteId() == null){
+            return payChargeSurveyDto;
+        }
         DecimalFormat df = new DecimalFormat("0.0");
         BigDecimal defc = new BigDecimal("0.0");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月日
         BigInteger siteId = BigInteger.valueOf(loginUser.getSiteId());
-        BigInteger customerId = BigInteger.valueOf(loginUser.getCustomerId());
+        BigInteger customerId = null;
+        Integer cus = loginUser.getCustomerId() != null ? loginUser.getCustomerId() : null;
+        customerId = BigInteger.valueOf(cus);
         try {
             //1.获取客户总数跟较上月比率
             /***********************************时间计算*****************************************/
@@ -109,7 +117,13 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
             String endPeriod = list.get(0).getYear()+"-"+String.format("%02d", list.get(0).getMonth())+"-31";
 
             //上一账期汇总
-            String lastDate = list.get(1).getYear() +"-"+String.format("%02d", list.get(1).getMonth())+"-01";
+            String lastDate = "";
+            if(list.size() > 1){
+                lastDate = list.get(1).getYear() +"-"+String.format("%02d", list.get(1).getMonth())+"-01";
+            }else{
+                lastDate = list.get(0).getYear() +"-"+String.format("%02d", list.get(0).getMonth())+"-01";
+            }
+
             PayAccountSurvey accountSurvey = payChargeSurveyMapper.getlastAccount(lastDate,siteId,customerId);
 
             //客户总数计算
@@ -263,8 +277,16 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
     public PayTransactionSurveyDto tranSurvey(String periodDate){
         PayTransactionSurveyDto payTransactionSurveyDto = new PayTransactionSurveyDto();
         LoginUser loginUser = UserUtil.getCurrentUser();
+        if(loginUser == null || loginUser.getCustomerId() == null){
+            return payTransactionSurveyDto;
+        }
+        if(loginUser == null || loginUser.getSiteId() == null){
+            return payTransactionSurveyDto;
+        }
         BigInteger siteId = BigInteger.valueOf(loginUser.getSiteId());
-        BigInteger customerId = BigInteger.valueOf(loginUser.getCustomerId());
+        BigInteger customerId = null;
+        Integer cus = loginUser.getCustomerId() != null ? loginUser.getCustomerId() : null;
+        customerId = BigInteger.valueOf(cus);
         BigDecimal defc = new BigDecimal("0.0");
         try {
             List<BaseClosingAccountInfoDto> list = baseClosingAccountInfoMapper.getList(null,null,
@@ -514,6 +536,12 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
     public PayFeeSueveyDto feeSurvey(){
         PayFeeSueveyDto payFeeSveveyDto = new PayFeeSueveyDto();
         LoginUser loginUser = UserUtil.getCurrentUser();
+        if(loginUser == null || loginUser.getCustomerId() == null){
+            return payFeeSveveyDto;
+        }
+        if(loginUser == null || loginUser.getSiteId() == null){
+            return payFeeSveveyDto;
+        }
         BigInteger siteId = BigInteger.valueOf(loginUser.getSiteId());
         BigInteger customerId = BigInteger.valueOf(loginUser.getCustomerId());
         BigDecimal defc = new BigDecimal("0.0");
@@ -598,6 +626,13 @@ public class PayChargeSurveyServiceImpl implements PayChargeSurveyService {
     public PayAmountSurveyDto amountSurver(){
         PayAmountSurveyDto payAmountSurveyDto = new PayAmountSurveyDto();
         LoginUser loginUser = UserUtil.getCurrentUser();
+        if(loginUser == null || loginUser.getCustomerId() == null){
+            return payAmountSurveyDto;
+        }
+        if(loginUser == null || loginUser.getSiteId() == null){
+            return payAmountSurveyDto;
+        }
+
         BigInteger siteId = BigInteger.valueOf(loginUser.getSiteId());
         BigInteger customerId = BigInteger.valueOf(loginUser.getCustomerId());
         BigDecimal defb = new BigDecimal("1.0");

+ 280 - 0
smart-city-platform/src/main/java/com/bz/smart_city/service/impl/pay/PayReportServiceImpl.java

@@ -1,19 +1,28 @@
 package com.bz.smart_city.service.impl.pay;
 
+import com.bz.smart_city.commom.exception.ServiceException;
 import com.bz.smart_city.commom.model.Pagination;
+import com.bz.smart_city.commom.util.ExcelUtil;
 import com.bz.smart_city.commom.util.UserUtil;
 import com.bz.smart_city.dao.pay.PayReportMapper;
 import com.bz.smart_city.dto.LoginUser;
 import com.bz.smart_city.dto.pay.*;
+import com.bz.smart_city.entity.pay.PayWaterPropertyReport;
 import com.bz.smart_city.service.pay.PayAgenttransactionService;
 import com.bz.smart_city.service.pay.PayReportService;
 import com.github.pagehelper.PageHelper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -175,4 +184,275 @@ public class PayReportServiceImpl implements PayReportService {
         //return new Pagination<>(reList);
     }
 
+    /**
+     * 用水性质销售报表
+     * @param payWaterPropertyReport
+     * @return
+     */
+    @Override
+    public List<PayWaterPropertyReportDto> getWaterPropertySaleReport(PayWaterPropertyReport payWaterPropertyReport)
+    {
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        BigInteger customerId = new BigInteger(String.valueOf(loginUser.getCustomerId()));
+        payWaterPropertyReport.setCustomerId(customerId);
+        BigInteger siteId = new BigInteger(String.valueOf(loginUser.getSiteId()));
+        payWaterPropertyReport.setSiteId(siteId);
+
+        //组装账户交易明细+实收记录
+        List<PayWaterPropertyReportDto> list = new ArrayList<PayWaterPropertyReportDto>();
+        //获取账户交易明细记录
+        List<PayWaterPropertyReportDto> tList = payReportMapper.getTranInfoReport(payWaterPropertyReport);
+        //获取实收记录
+        List<PayWaterPropertyReportDto> rList = payReportMapper.getReceviceInfoReport(payWaterPropertyReport);
+        if(tList != null && tList.size() > 0){
+            //遍历交易明细
+            for(int i=0; i < tList.size(); i++){
+                if(rList != null && rList.size() > 0){
+                    //遍历实收
+                    Iterator<PayWaterPropertyReportDto> it = rList.iterator();
+                    while (it.hasNext()){
+                        //实收+交易明细 = 总额
+                        //排除预存抵扣(payway!=5),交易状态=入账(state=1),是否作废=否(iscanceled=0)
+                        PayWaterPropertyReportDto dt = it.next();
+                        if(tList.get(i).getWaterpropertyId().equals(dt.getWaterpropertyId())){
+                            //购水次数
+                            tList.get(i).setFrequency(tList.get(i).getFrequency() + dt.getFrequency());
+                            //购水金额
+                            tList.get(i).setReceivedamount(tList.get(i).getReceivedamount().add(dt.getReceivedamount()));
+                            //购水量
+                            tList.get(i).setAmount(tList.get(i).getAmount() + dt.getAmount());
+                            //水费
+                            tList.get(i).setSfee(dt.getSfee());
+                            //污水费
+                            tList.get(i).setWsfee(dt.getWsfee());
+                            //源水费
+                            tList.get(i).setYsfee("0.000");
+                            //附加费
+                            tList.get(i).setFjfee("0.000");
+                            //已经取值过的可以移除
+                            it.remove();
+                        }
+                    }
+                }
+            }
+        }
+        list.addAll(tList);
+        //组装汇总记录
+        if(tList != null && tList.size() >0){
+            Integer frequency = 0;//购水次数
+            Integer amount = 0; //购水量
+            BigDecimal df = new BigDecimal("0.000");
+            BigDecimal sfee = df;//水费
+            BigDecimal wsfee = sfee;//污水费
+            String ysfee = "0.000";//源水费
+            String fjfee = "0.000";//附加费
+            BigDecimal receivedamount = df;//购水金额
+            for(PayWaterPropertyReportDto dto : tList){
+                frequency = frequency + dto.getFrequency();
+                amount = amount + dto.getAmount();
+                sfee = sfee.add(dto.getSfee());
+                wsfee = wsfee.add(dto.getWsfee());
+                receivedamount = receivedamount.add(dto.getReceivedamount());
+            }
+            PayWaterPropertyReportDto dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("购水合计");
+            dto.setFrequency(frequency);
+            dto.setAmount(amount);
+            dto.setSfee(sfee);
+            dto.setWsfee(wsfee);
+            dto.setYsfee(ysfee);
+            dto.setFjfee(fjfee);
+            dto.setReceivedamount(receivedamount);
+            list.add(dto);
+            dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("赠水合计");
+            dto.setFrequency(0);
+            dto.setAmount(0);
+            dto.setSfee(df);
+            dto.setWsfee(df);
+            dto.setYsfee("0.000");
+            dto.setFjfee("0.000");
+            dto.setReceivedamount(df);
+            list.add(dto);
+            dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("总计");
+            dto.setFrequency(frequency);
+            dto.setAmount(amount);
+            dto.setSfee(sfee);
+            dto.setWsfee(wsfee);
+            dto.setYsfee(ysfee);
+            dto.setFjfee(fjfee);
+            dto.setReceivedamount(receivedamount);
+            list.add(dto);
+        }
+        return list;
+    }
+
+    /**
+     * 用水性质销售报表导出
+     * @param payWaterPropertyReport
+     * @return
+     */
+    @Override
+    public void WaterPropertySaleExcel(PayWaterPropertyReport payWaterPropertyReport, HttpServletResponse httpServletResponse){
+
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        BigInteger customerId = new BigInteger(String.valueOf(loginUser.getCustomerId()));
+        payWaterPropertyReport.setCustomerId(customerId);
+        BigInteger siteId = new BigInteger(String.valueOf(loginUser.getSiteId()));
+        payWaterPropertyReport.setSiteId(siteId);
+
+        String title = "用水性质销售报表";//表头名称
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        //列名
+        String[] rowsName = new String[]{"序号","用水性质编号","购水次数","购水量(吨)","定额水费(元)","排污费(元)","源水费(元)","附加费(元)","购水金额(元)"};
+        //组装账户交易明细+实收记录
+        List<PayWaterPropertyReportDto> list = new ArrayList<PayWaterPropertyReportDto>();
+        //获取账户交易明细记录
+        List<PayWaterPropertyReportDto> tList = payReportMapper.getTranInfoReport(payWaterPropertyReport);
+        //获取实收记录
+        List<PayWaterPropertyReportDto> rList = payReportMapper.getReceviceInfoReport(payWaterPropertyReport);
+        if(tList != null && tList.size() > 0){
+            //遍历交易明细
+            for(int i=0; i < tList.size(); i++){
+                if(rList != null && rList.size() > 0){
+                    //遍历实收
+                    Iterator<PayWaterPropertyReportDto> it = rList.iterator();
+                    while (it.hasNext()){
+                        //实收+交易明细 = 总额
+                        //排除预存抵扣(payway!=5),交易状态=入账(state=1),是否作废=否(iscanceled=0)
+                        PayWaterPropertyReportDto dt = it.next();
+                        if(tList.get(i).getWaterpropertyId().equals(dt.getWaterpropertyId())){
+                            //购水次数
+                            tList.get(i).setFrequency(tList.get(i).getFrequency() + dt.getFrequency());
+                            //购水金额
+                            tList.get(i).setReceivedamount(tList.get(i).getReceivedamount().add(dt.getReceivedamount()));
+                            //购水量
+                            tList.get(i).setAmount(tList.get(i).getAmount() + dt.getAmount());
+                            //水费
+                            tList.get(i).setSfee(dt.getSfee());
+                            //污水费
+                            tList.get(i).setWsfee(dt.getWsfee());
+                            //源水费
+                            tList.get(i).setYsfee("0.000");
+                            //附加费
+                            tList.get(i).setFjfee("0.000");
+                            //已经取值过的可以移除
+                            it.remove();
+                        }
+                    }
+                }
+            }
+        }
+        list.addAll(tList);
+        //组装汇总记录
+        if(tList != null && tList.size() >0){
+            Integer frequency = 0;//购水次数
+            Integer amount = 0; //购水量
+            BigDecimal db = new BigDecimal("0.000");
+            BigDecimal sfee = db;//水费
+            BigDecimal wsfee = sfee;//污水费
+            String ysfee = "0.000";//源水费
+            String fjfee = "0.000";//附加费
+            BigDecimal receivedamount = db;//购水金额
+            for(PayWaterPropertyReportDto dto : tList){
+                frequency = frequency + dto.getFrequency();
+                amount = amount + dto.getAmount();
+                sfee = sfee.add(dto.getSfee());
+                wsfee = wsfee.add(dto.getWsfee());
+                receivedamount = receivedamount.add(dto.getReceivedamount());
+            }
+            PayWaterPropertyReportDto dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("购水合计");
+            dto.setFrequency(frequency);
+            dto.setAmount(amount);
+            dto.setSfee(sfee);
+            dto.setWsfee(wsfee);
+            dto.setYsfee(ysfee);
+            dto.setFjfee(fjfee);
+            dto.setReceivedamount(receivedamount);
+            list.add(dto);
+            dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("赠水合计");
+            dto.setFrequency(0);
+            dto.setAmount(0);
+            dto.setSfee(db);
+            dto.setWsfee(db);
+            dto.setYsfee("0.000");
+            dto.setFjfee("0.000");
+            dto.setReceivedamount(db);
+            list.add(dto);
+            dto = new PayWaterPropertyReportDto();
+            dto.setWaterpropertyName("总计");
+            dto.setFrequency(frequency);
+            dto.setAmount(amount);
+            dto.setSfee(sfee);
+            dto.setWsfee(wsfee);
+            dto.setYsfee(ysfee);
+            dto.setFjfee(fjfee);
+            dto.setReceivedamount(receivedamount);
+            list.add(dto);
+        }
+
+        List<Object[]> dataList = new ArrayList();
+        Object[] objs = null;
+        BigDecimal db =  new BigDecimal("0.0");
+        for(int i=0; i<list.size() ; i++){
+            PayWaterPropertyReportDto dto = list.get(i);
+            objs = new Object[rowsName.length];
+            objs[0] = i;
+            objs[1] = dto != null && StringUtils.isNotBlank(dto.getWaterpropertyName()) ? dto.getWaterpropertyName() : "";//用水性质编号
+            objs[2] = dto != null && dto.getFrequency() != null ? dto.getFrequency() : 0;//购水次数
+            objs[3] = dto != null && dto.getAmount() != null ? dto.getAmount() : 0;//购水量
+            objs[4] = dto != null && dto.getSfee() != null ? dto.getSfee() : db;//水费
+            objs[5] = dto != null && dto.getWsfee() != null ? dto.getWsfee() : db;//污水处理费
+            objs[6] = "0.000";//源水费
+            objs[7] = "0.000";//附加费
+            objs[8] = dto != null && dto.getReceivedamount() != null ? dto.getReceivedamount() : db;//购水金额
+            dataList.add(objs);
+        }
+
+        String message="";
+        List<String> eList = new ArrayList<String>();
+        if(StringUtils.isNoneBlank(payWaterPropertyReport.getWatercategoryName())){
+            message = message + "用水类型:"+payWaterPropertyReport.getWatercategoryName();
+        }else{
+            message = message + "用水类型:(全部冷热水)";
+        }
+        if(StringUtils.isNotBlank(payWaterPropertyReport.getWaterpropertyName())){
+            message = message + "       用水性质所属类别:"+payWaterPropertyReport.getWaterpropertyName();
+        }else{
+            message = message + "       用水性质所属类别:全部类别";
+        }
+        //第一行
+        eList.add(message);
+        message="";
+
+        if(StringUtils.isNotBlank(payWaterPropertyReport.getOfficeName())){
+            message = message + "销售网点:"+payWaterPropertyReport.getOfficeName();
+        }else{
+            message = message + "销售网点:全部网点";
+        }
+        if(StringUtils.isNotBlank(payWaterPropertyReport.getUserName())){
+            message = message + "      操作员:"+payWaterPropertyReport.getOfficeName();
+        }else{
+            message = message + "      操作员:全部操作员";
+        }
+        if(StringUtils.isNotBlank(payWaterPropertyReport.getStartDate())){
+            message = message + "   统计日期:"+payWaterPropertyReport.getStartDate();
+        }
+        if(StringUtils.isNotBlank(payWaterPropertyReport.getEndDate())){
+            message = message + " 至 "+payWaterPropertyReport.getEndDate();
+        }
+        message = message + "   列印日期:"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+        eList.add(message);
+
+        ExcelUtil excelUtil = new ExcelUtil(title, rowsName, dataList,eList);
+        try {
+            excelUtil.export(httpServletResponse);
+        } catch (Exception e) {
+            throw new ServiceException(-900, "导出异常");
+        }
+    }
+
 }

+ 9 - 0
smart-city-platform/src/main/java/com/bz/smart_city/service/pay/PayReportService.java

@@ -4,6 +4,11 @@ import com.bz.smart_city.commom.model.Pagination;
 import com.bz.smart_city.dto.pay.PayArrearagedetailsReportDto;
 import com.bz.smart_city.dto.pay.PayOperatordetailsReportDto;
 import com.bz.smart_city.dto.pay.PayTransactiondetailsReportDto;
+import com.bz.smart_city.dto.pay.PayWaterPropertyReportDto;
+import com.bz.smart_city.entity.pay.PayWaterPropertyReport;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @Author: ZJY
@@ -16,4 +21,8 @@ public interface PayReportService {
     Pagination<PayOperatordetailsReportDto> getPayOperatordetailsReport(PayOperatordetailsReportDto payOperatordetailsReportDto,int pageNum,int pageSize);
 
     Pagination<PayArrearagedetailsReportDto> getPayArrearagedetailsReport(PayArrearagedetailsReportDto payArrearagedetailsReportDto, int pageNum, int pageSize);
+
+    List<PayWaterPropertyReportDto> getWaterPropertySaleReport(PayWaterPropertyReport payWaterPropertyReport);
+
+    void WaterPropertySaleExcel(PayWaterPropertyReport payWaterPropertyReport, HttpServletResponse httpServletResponse);
 }

+ 208 - 0
smart-city-platform/src/main/resources/mapper/pay/PayReportMapper.xml

@@ -198,5 +198,213 @@
         ORDER BY accountnumber asc
     </select>
 
+    <select id="getTranInfoReport" resultType="com.bz.smart_city.dto.pay.PayWaterPropertyReportDto">
+        SELECT
+            p.id as "waterpropertyId",
+            p.name as "waterpropertyName",
+            ifnull(count(distinct a.payseriesno),0) "frequency",
+            ifnull(round(sum(a.transamount),3),'0.000') as "receivedamount",
+            ifnull(FLOOR(sum(a.transamount)/p.totalprice_l1),0) as "amount",
+            round(ifnull((FLOOR(sum(a.transamount)/p.totalprice_l1))*(max(case when e.feetype = 1 then e.price end )),0 ),3)as "sfee",
+            round(ifnull((FLOOR(sum(a.transamount)/p.totalprice_l1))*(max(case when e.feetype = 4 then e.price end )),0 ),3) as "wsfee",
+            '0.000' as "ysfee",
+            '0.000' as "fjfee"
+        FROM
+        pay_pay_transactiondetails a
+        left join pay_pay_received r on a.received_id = r.id
+        left join pay_base_customerandmeterrela c on c.account_id = a.account_id
+        left join pay_base_waterproperty p on p.id = c.waterproperty_id
+        left join pay_base_watercategory w on w.id = p.category_id
+        left join pay_base_priceofwaterproperty b on p.id = b.waterproperty_id
+        left join pay_base_waterprice e on b.waterprice_id = e.id and e.ladderlevel = 1
+        left join sc_organization o on o.id = c.office_id
+        left join sc_user u on u.id = a.create_by
+        <where>
+            a.payway != 5
+            AND a.state = 1
+            AND a.canceledrecord_id IS NULL
+            and (a.iscanceled = 0 or a.iscanceled is null)
+            <if test="inParams.customerId != null and inParams.customerId != ''">
+                AND a.customer_id =#{inParams.customerId}
+            </if>
+            <if test="inParams.siteId != null and inParams.siteId != ''">
+                AND a.site_id =#{inParams.siteId}
+            </if>
+            <if test="inParams.startDate != null and inParams.startDate != null">
+                AND DATE_FORMAT(a.transtime,'%Y-%m-%d') &gt;=#{inParams.startDate}
+            </if>
+            <if test="inParams.endDate != null and inParams.endDate != null">
+                AND DATE_FORMAT(a.transtime,'%Y-%m-%d') &lt;=#{inParams.endDate}
+            </if>
+            <if test="inParams.officeId != null and inParams.officeId != ''">
+                and o.id =#{inParams.officeId}
+            </if>
+            <if test="inParams.userId != null and inParams.userId != ''">
+                and u.id =#{inParams.userId}
+            </if>
+            <if test="inParams.watercategoryId != null and inParams.watercategoryId != ''">
+                and w.id =#{inParams.watercategoryId}
+            </if>
+        </where>
+        GROUP BY c.waterproperty_id
+    </select>
+
+    <select id="getReceviceInfoReport" resultType="com.bz.smart_city.dto.pay.PayWaterPropertyReportDto">
+        select
+            p.id as "waterpropertyId",
+            p.name as "waterpropertyName",
+            ifnull(count(distinct a.payseriesno),0) "frequency",
+            ifnull(round(sum(a.receivedamount),3),'0.000') as "receivedamount",
+            ifnull(FLOOR(sum(a.receivedamount)/p.totalprice_l1),0) as "amount",
+            round(ifnull((FLOOR(sum(a.receivedamount)/p.totalprice_l1))*(max(case when e.feetype = 1 then e.price end )),0 ),3)as "sfee",
+            round(ifnull((FLOOR(sum(a.receivedamount)/p.totalprice_l1))*(max(case when e.feetype = 4 then e.price end )),0 ),3) as "wsfee",
+            '0.000' as "ysfee",
+            '0.000' as "fjfee"
+        from pay_pay_received a
+        left join pay_base_customerandmeterrela c on c.account_id = a.account_id
+        left join pay_base_waterproperty p on p.id = c.waterproperty_id
+        left join pay_base_watercategory w on w.id = p.category_id
+        left join pay_base_priceofwaterproperty b on p.id = b.waterproperty_id
+        left join pay_base_waterprice e on b.waterprice_id = e.id and e.ladderlevel = 1
+        left join sc_organization o on o.id = c.office_id
+        left join sc_user u on u.id = a.create_by
+        <where>
+            a.payway != 5 and a.state =  1 and canceledrecord_id is null and iscanceled = 0
+            <if test="inParams.customerId != null and inParams.customerId != ''">
+                AND a.customer_id =#{inParams.customerId}
+            </if>
+            <if test="inParams.siteId != null and inParams.siteId != ''">
+                AND a.site_id =#{inParams.siteId}
+            </if>
+            <if test="inParams.startDate != null and inParams.startDate != null">
+                AND DATE_FORMAT(a.create_date,'%Y-%m-%d') &gt;=#{inParams.startDate}
+            </if>
+            <if test="inParams.endDate != null and inParams.endDate != null">
+                AND DATE_FORMAT(a.create_date,'%Y-%m-%d') &lt;=#{inParams.endDate}
+            </if>
+            <if test="inParams.officeId != null and inParams.officeId != ''">
+                and o.id =#{inParams.officeId}
+            </if>
+            <if test="inParams.userId != null and inParams.userId != ''">
+                and u.id =#{inParams.userId}
+            </if>
+            <if test="inParams.watercategoryId != null and inParams.watercategoryId != ''">
+                and w.id =#{inParams.watercategoryId}
+            </if>
+        </where>
+        GROUP BY c.waterproperty_id
+    </select>
+
+    <select id="getWaterPropertySaleReport" resultType="com.bz.smart_city.dto.pay.PayWaterPropertyReportDto">
+        create table tranTab
+        (
+            SELECT
+                p.id as "waterpropertyId",
+                p.name as "waterpropertyName",
+                count(distinct a.payseriesno) "frequency",
+                round(sum(a.transamount),3) as "receivedamount",
+                FLOOR(sum(a.transamount)/p.totalprice_l1) as "amount"
+            FROM
+                pay_pay_transactiondetails a
+                left join pay_pay_received r on a.received_id = r.id
+                left join pay_base_customerandmeterrela c on c.account_id = a.account_id
+                left join pay_base_waterproperty p on p.id = c.waterproperty_id
+                left join pay_base_watercategory w on w.id = p.category_id
+                left join sc_organization o on o.id = c.office_id
+                left join sc_user u on u.id = a.create_by
+            WHERE
+                a.payway != 5
+                AND a.state = 1
+                AND a.canceledrecord_id IS NULL
+                and (a.iscanceled = 0 or a.iscanceled is null)
+                AND a.YEAR ='2020'
+                AND a.MONTH ='12'
+                AND a.site_id ='22'
+                AND a.customer_id ='47'
+            GROUP BY c.waterproperty_id
+        );
+        Create table receTab
+        (
+            select
+                p.id as "waterpropertyId",
+                p.name as "waterpropertyName",
+                count(distinct a.payseriesno) "frequency",
+                round(sum(a.receivedamount),3) as "receivedamount",
+                FLOOR(sum(a.receivedamount)/p.totalprice_l1) as "amount",
+                round(sum(case when a.feetype = 1 then a.receivedamount end),3) as "sfee",
+                round(sum(case when a.feetype = 4 then a.receivedamount end),3) as "wsfee",
+                '0.000' as "ysfee",
+                '0.000' as "fjfee"
+            from pay_pay_received a
+            left join pay_base_customerandmeterrela c on c.account_id = a.account_id
+                left join pay_base_waterproperty p on p.id = c.waterproperty_id
+                left join pay_base_watercategory w on w.id = p.category_id
+                left join sc_organization o on o.id = c.office_id
+                left join sc_user u on u.id = a.create_by
+            where
+            a.payway != 5 and a.state =  1 and canceledrecord_id is null and iscanceled = 0
+            and a.year = '2020' and a.month = '12' and a.site_id = '22' and a.customer_id = '47'
+            GROUP BY c.waterproperty_id
+        );
+        create table tab
+        (
+            select
+                a.waterpropertyId as "waterpropertyId",
+                a.waterpropertyName as "waterpropertyName",
+                (ifnull(a.frequency,0) + ifnull(b.frequency,0)) as "frequency",
+                (IFNULL(a.receivedamount,0)+ifnull(b.receivedamount,0)) as "receivedamount",
+                (ifnull(a.amount,0)+ifnull(b.amount,0)) as "amount",
+                ifnull(b.sfee,'0.000') as "sfee",
+                ifnull(b.wsfee,'0.000') as "wsfee",
+                ifnull(b.ysfee,'0.000') as "ysfee",
+                ifnull(b.fjfee,'0.000') as "fjfee"
+            from tranTab a
+            left join receTab b on a.waterpropertyId = b.waterpropertyId
+        );
+        select
+            a.waterpropertyName as "waterpropertyName",
+            a.frequency as "frequency",
+            a.receivedamount as "receivedamount",
+            a.amount as "amount",
+            a.sfee as "sfee",
+            a.wsfee as "wsfee",
+            a.ysfee as "ysfee",
+            a.fjfee as "fjfee"
+        from tab a
+        union all
+        select
+            '购水合计' as "waterpropertyName",
+            sum(b.frequency) as "frequency",
+            sum(b.receivedamount) as "receivedamount",
+            sum(b.amount) as "amount",
+            sum(b.sfee) as "sfee",
+            sum(b.wsfee) as "wsfee",
+            '0.000' as "ysfee",
+            '0.000' as "fjfee"
+        from tab b
+        union all
+        select
+            '赠水合计' as "waterpropertyName",
+            '0' as "frequency",
+            '0.000' as "receivedamount",
+            '0' as "amount",
+            '0.000' as "sfee",
+            '0.000' as "wsfee",
+            '0.000' as "ysfee",
+            '0.000' as "fjfee"
+        from dual
+        union all
+        select
+            '总计' as "waterpropertyName",
+            sum(c.frequency) as "frequency",
+            sum(c.receivedamount) as "receivedamount",
+            sum(c.amount) as "amount",
+            sum(c.sfee) as "sfee",
+            sum(c.wsfee) as "wsfee",
+            '0.000' as "ysfee",
+            '0.000' as "fjfee"
+        from tab c;
+    </select>
+
 
 </mapper>

+ 2 - 2
smart-city-platform/src/main/resources/mapper/pay/payFeeMapper.xml

@@ -116,9 +116,9 @@
         from pay_base_customerandmeterrela c
         left join pay_base_account a on c.account_id=a.id
         left join pay_base_waterproperty p on c.waterProperty_id=p.id
-        inner join sc_device device on device.metercode = c.metercode
+        inner join sc_device device on device.metercode = c.metercode and device.customer_id =#{customerId}
         <where>
-            c.businessstate=1 and c.site_id=#{siteId} and c.customer_id=#{customerId}
+            c.businessstate=1 and c.site_id=#{siteId}
             <if test="id != null and id != ''">
                 and  c.id= #{id}
             </if>