diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxEnergyMeterMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxEnergyMeterMapper.java index 9f3d20e84..236f10bfa 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxEnergyMeterMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxEnergyMeterMapper.java @@ -10,6 +10,8 @@ import java.util.List; public interface WxEnergyMeterMapper extends CommonMapper { List findList(WxEnergyMeter wxBillRent); + + List findIdList(WxEnergyMeter wxBillRent); WxEnergyMeter selectById(@Param("id")Long id,@Param("tenantId")String tenantId); diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxEnergyHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxEnergyHelper.java index fa1413a5d..bf8958010 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxEnergyHelper.java +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxEnergyHelper.java @@ -3,6 +3,7 @@ package com.iformall.service.helper; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -11,6 +12,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; +import com.iformall.domain.po.WxEnergyFees; import com.iformall.domain.po.WxEnergyFeesShop; import com.iformall.domain.po.WxEnergyFeesTime; import com.iformall.domain.po.WxEnergyMeter; @@ -19,7 +21,9 @@ import com.iformall.domain.po.WxMallBuilding; import com.iformall.domain.po.WxMallFloor; import com.iformall.domain.po.WxShop; import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumEnergyMeterPhysicsType; import com.iformall.enums.EnumYesOrNo; +import com.iformall.mapper.WxEnergyMeterMapper; import com.iformall.mapper.WxEnergyMeterReadingMapper; import com.iformall.service.WxMallBuildingService; import com.iformall.service.WxMallFloorService; @@ -31,6 +35,8 @@ public class WxEnergyHelper { @Autowired WxEnergyMeterReadingMapper wxEnergyMeterReadingMapper; + @Autowired + WxEnergyMeterMapper wxEnergyMeterMapper; @Lazy @Autowired private WxMallBuildingService wxMallBuildingService; @@ -77,7 +83,7 @@ public class WxEnergyHelper { } private String replaceFormulaData(String formula,BigDecimal totalArea,WxShop shop,Map buildingAreaMap, - Map floorMap,Map meterNumberMap) { + Map floorAreaMap,Map meterNumberMap) { if (StringUtils.isBlank(formula)) { return null; } @@ -97,14 +103,14 @@ public class WxEnergyHelper { } } - if (null != floorMap && null != floorAreaList && floorAreaList.size() > 0 ) { + if (null != floorAreaMap && null != floorAreaList && floorAreaList.size() > 0 ) { for (int i = 0 ; i < floorAreaList.size(); i ++) { String floorArea = floorAreaList.get(i); String[] bs = floorArea.split("_"); if (null != bs && bs.length > 1) { - WxMallFloor floor = floorMap.get(Long.parseLong(bs[1])); - if (null != floor && null != floor.getOperatingArea()) { - formula = formula.replaceAll("{#floorArea_"+Long.parseLong(bs[1])+"#}", floor.getOperatingArea().toPlainString()); + BigDecimal floorarea = floorAreaMap.get(Long.parseLong(bs[1])); + if (null != floorarea) { + formula = formula.replaceAll("{#floorArea_"+Long.parseLong(bs[1])+"#}", floorarea.toPlainString()); } } @@ -142,33 +148,49 @@ public class WxEnergyHelper { * @param shopfee * @return */ - public String calcuteMoney(StringBuffer sb,BigDecimal totalArea,WxShop shop,WxEnergyFeesTime time,List meterList,WxEnergyFeesShop shopfee, - Map buildingAreaMap,Map floorMap,Map meterNumberMap) { + public String calcuteMoney(StringBuffer sb,BigDecimal totalArea,WxShop shop,WxEnergyFeesTime time,WxEnergyFees fees, WxEnergyFeesShop shopfee, + List userMeterList,Map> summaryMeterMap,Map buildingAreaMap,Map floorAreaMap) { if (StringUtils.isBlank(shopfee.getPrice())) { return "0"; } if (shopfee.getIsPublic() == EnumYesOrNo.YES.getCode()) { //替代占位符为真实数据 - // - String formula = replaceFormulaData(shopfee.getFormula(),totalArea,shop,buildingAreaMap,floorMap,meterNumberMap); + //公摊总表数据,根据公摊总表下的公共表来查询所有的读数 + Map meterNumberMap = null; + if (null != summaryMeterMap) { + meterNumberMap = new HashMap(); + for (Iterator it = summaryMeterMap.keySet().iterator(); it.hasNext();) { + Long sumaryMeterId = it.next(); + List childmids = summaryMeterMap.get(sumaryMeterId); + //查询子表的总读数 + WxEnergyMeterReading mrq = new WxEnergyMeterReading(); + mrq.updateTenantInfo(shopfee); + mrq.setMeterIds(childmids); + mrq.setStartTime(time.getStartTime()); + mrq.setEndTime(time.getEndTime()); + BigDecimal totalNumber = wxEnergyMeterReadingMapper.findNumberSum(mrq); + if (null == totalNumber || totalNumber.compareTo(new BigDecimal(0)) <= 0 ) { + totalNumber = new BigDecimal(0); + } + meterNumberMap.put(sumaryMeterId, totalNumber); + } + } + String formula = replaceFormulaData(shopfee.getFormula(),totalArea,shop,buildingAreaMap,floorAreaMap,meterNumberMap); if (null != formula) { return new BigDecimal(FormulaParser.evaluate(formula)).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString(); } return "0"; }else { - if (null == meterList || meterList.size() <= 0 ) { + + if (null == userMeterList || userMeterList.size() <= 0 ) { return "0"; } - List meterIdList = new ArrayList(); - for (int i = 0 ; i < meterList.size(); i++) { - WxEnergyMeter meter = meterList.get(i); - meterIdList.add(meter.getId()); - } - //根据表,区间的开始日期,结束日期来查询抄表数据。 WxEnergyMeterReading mrq = new WxEnergyMeterReading(); mrq.updateTenantInfo(shopfee); - mrq.setMeterIds(meterIdList); + mrq.setMeterIds(userMeterList); + mrq.setStartTime(time.getStartTime()); + mrq.setEndTime(time.getEndTime()); BigDecimal totalNumber = wxEnergyMeterReadingMapper.findNumberSum(mrq); if (null == totalNumber || totalNumber.compareTo(new BigDecimal(0)) <= 0 ) { return "0"; diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxEnergyServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxEnergyServiceImpl.java index b05c58d70..e1a4e8703 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxEnergyServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxEnergyServiceImpl.java @@ -538,7 +538,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { WxEnergyMeter mq = new WxEnergyMeter(); mq.updateTenantInfo(record); List ptylist = new ArrayList(); - ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); + //ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); ptylist.add(EnumEnergyMeterPhysicsType.SUMMARY.getCode()); mq.setPhysicsTypeList(ptylist); PageInfo page = this.meterListAsPage(mq,1,1000); @@ -881,12 +881,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { try { wxEnergyReadingCalcuteMapper.insert(record); WxEnergyFees fees = this.getFeesById(record.getFeesId(),record.getTenantId()); - if (fees.getIsPublic() == EnumYesOrNo.YES.getCode()) { - generateCalcuteResult(fees, record, record.getShopIds(), EnumEnergyMeterPhysicsType.PUBLIC); - }else { - generateCalcuteResult(fees, record, record.getShopIds(), EnumEnergyMeterPhysicsType.USER); - } - + generateCalcuteResult(fees, record, record.getShopIds()); } catch (Exception e) { logger.error("保存租赁账单失败,e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); @@ -899,20 +894,68 @@ public class WxEnergyServiceImpl implements WxEnergyService { } } - public void generateCalcuteResult(WxEnergyFees fees,WxEnergyReadingCalcute record,List shopIds,EnumEnergyMeterPhysicsType type) { + public void generateCalcuteResult(WxEnergyFees fees,WxEnergyReadingCalcute record,List shopIds) { final IdWorker idWorker = IdWorker.get(); WxShop shq = new WxShop(); shq.updateTenantInfo(record); shq.setIds(shopIds); Map shopMap = wxShopService.findShopMap(shq); - //TODO 总共面积 - BigDecimal totalArea = null; - //TODO 楼栋的面积 + // 总共面积 + BigDecimal totalArea = new BigDecimal(0); + // 楼栋的面积 Map buildingAreaMap = null; - //TODO 楼层 - Map floorMap = null; - //TODO 公摊总表的读数 - Map meterNumberMap = null; + //楼层 + Map floorAreaMap = null; + WxMallFloor fq = new WxMallFloor(); + fq.updateTenantInfo(record); + List floorList = wxMallFloorService.getBudingFloorList(fq, null); + if (null != floorList && floorList.size() > 0 ) { + floorAreaMap = new HashMap(); + buildingAreaMap = new HashMap(); + for (int i = 0 ; i < floorList.size() ; i ++) { + WxMallFloor floor = floorList.get(i); + if (null != floor.getOperatingArea()) { + floorAreaMap.put(floor.getId(), floor.getOperatingArea()); + BigDecimal bud = buildingAreaMap.get(floor.getBuildingId()); + if (null == bud) { + bud = new BigDecimal(0); + } + bud = bud.add(floor.getOperatingArea()); + buildingAreaMap.put(floor.getBuildingId(), bud); + totalArea = totalArea.add(floor.getOperatingArea()); + } + } + } + //用户表 + WxEnergyMeter mq = new WxEnergyMeter(); + mq.updateTenantInfo(record); + mq.setType(fees.getType()); + mq.setPhysicsType(EnumEnergyMeterPhysicsType.USER.getCode()); + List meterList = wxEnergyMeterMapper.findIdList(mq); + //查询公摊表 + Map> summaryMeterMap = null; + if (fees.getIsPublic() == EnumYesOrNo.YES.getCode()) { + WxEnergyMeter sumq = new WxEnergyMeter(); + sumq.updateTenantInfo(record); + sumq.setType(fees.getType()); + sumq.setPhysicsType(EnumEnergyMeterPhysicsType.SUMMARY.getCode()); + List sumeterList = wxEnergyMeterMapper.findList(mq); + if (null != sumeterList && sumeterList.size() > 0 ) { + summaryMeterMap = new HashMap>(); + for (int i = 0 ; i < meterList.size(); i ++) { + WxEnergyMeter summaryMeter = sumeterList.get(i); + //查询总表下的子表 + WxEnergyMeterChild mcq = new WxEnergyMeterChild(); + mcq.updateTenantInfo(record); + mcq.setParentMeterId(summaryMeter.getId()); + List childMeterIds = wxEnergyMeterChildMapper.findChildMeterIdList(mcq); + if (null != childMeterIds && childMeterIds.size() > 0 ) { + summaryMeterMap.put(summaryMeter.getId(), childMeterIds); + } + } + } + } + List resultList = new ArrayList(); for (int i = 0 ; i < shopIds.size(); i ++) { Long shopId= shopIds.get(i); @@ -945,16 +988,6 @@ public class WxEnergyServiceImpl implements WxEnergyService { return; } - //根据店铺去查询表 - WxEnergyMeter mq = new WxEnergyMeter(); - mq.updateTenantInfo(record); - mq.setType(fees.getType()); - mq.setPhysicsType(type.getCode()); - List meterList = wxEnergyMeterMapper.findList(mq); - if (null == meterList || meterList.size() <= 0 ) { - return; - } - //循环店铺科目, for (int j = 0 ; j < shopFeesList.size() ; j ++) { WxEnergyFeesShop shopfee = shopFeesList.get(j); @@ -968,7 +1001,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { cs.setFeesId(shopfee.getFeesId()); cs.setFeesShopId(shopfee.getId()); StringBuffer sb = new StringBuffer(); - cs.setMoney(wxEnergyHelper.calcuteMoney(sb,totalArea,shop,time, meterList, shopfee,buildingAreaMap,floorMap,meterNumberMap)); + cs.setMoney(wxEnergyHelper.calcuteMoney(sb,totalArea,shop,time, fees, shopfee,meterList,summaryMeterMap,buildingAreaMap,floorAreaMap)); cs.setPeriod(record.getPeriod()); cs.setMoney(sb.toString()); resultList.add(cs); diff --git a/mallinkService/src/main/resources/mapper/WxEnergyMeterMapper.xml b/mallinkService/src/main/resources/mapper/WxEnergyMeterMapper.xml index 99520a0fd..d13d1a1c6 100644 --- a/mallinkService/src/main/resources/mapper/WxEnergyMeterMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxEnergyMeterMapper.xml @@ -56,6 +56,12 @@ + +