| @@ -10,6 +10,8 @@ import java.util.List; | |||
| public interface WxEnergyMeterMapper extends CommonMapper<WxEnergyMeter, Long> { | |||
| List<WxEnergyMeter> findList(WxEnergyMeter wxBillRent); | |||
| List<Long> findIdList(WxEnergyMeter wxBillRent); | |||
| WxEnergyMeter selectById(@Param("id")Long id,@Param("tenantId")String tenantId); | |||
| @@ -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<Long,BigDecimal> buildingAreaMap, | |||
| Map<Long,WxMallFloor> floorMap,Map<Long,BigDecimal> meterNumberMap) { | |||
| Map<Long, BigDecimal> floorAreaMap,Map<Long,BigDecimal> 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<WxEnergyMeter> meterList,WxEnergyFeesShop shopfee, | |||
| Map<Long,BigDecimal> buildingAreaMap,Map<Long,WxMallFloor> floorMap,Map<Long,BigDecimal> meterNumberMap) { | |||
| public String calcuteMoney(StringBuffer sb,BigDecimal totalArea,WxShop shop,WxEnergyFeesTime time,WxEnergyFees fees, WxEnergyFeesShop shopfee, | |||
| List<Long> userMeterList,Map<Long,List<Long>> summaryMeterMap,Map<Long,BigDecimal> buildingAreaMap,Map<Long, BigDecimal> 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<Long,BigDecimal> meterNumberMap = null; | |||
| if (null != summaryMeterMap) { | |||
| meterNumberMap = new HashMap<Long,BigDecimal>(); | |||
| for (Iterator<Long> it = summaryMeterMap.keySet().iterator(); it.hasNext();) { | |||
| Long sumaryMeterId = it.next(); | |||
| List<Long> 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<Long> meterIdList = new ArrayList<Long>(); | |||
| 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"; | |||
| @@ -538,7 +538,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { | |||
| WxEnergyMeter mq = new WxEnergyMeter(); | |||
| mq.updateTenantInfo(record); | |||
| List<Integer> ptylist = new ArrayList<Integer>(); | |||
| ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); | |||
| //ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); | |||
| ptylist.add(EnumEnergyMeterPhysicsType.SUMMARY.getCode()); | |||
| mq.setPhysicsTypeList(ptylist); | |||
| PageInfo<WxEnergyMeter> 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<Long> shopIds,EnumEnergyMeterPhysicsType type) { | |||
| public void generateCalcuteResult(WxEnergyFees fees,WxEnergyReadingCalcute record,List<Long> shopIds) { | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| WxShop shq = new WxShop(); | |||
| shq.updateTenantInfo(record); | |||
| shq.setIds(shopIds); | |||
| Map<Long, WxShop> shopMap = wxShopService.findShopMap(shq); | |||
| //TODO 总共面积 | |||
| BigDecimal totalArea = null; | |||
| //TODO 楼栋的面积 | |||
| // 总共面积 | |||
| BigDecimal totalArea = new BigDecimal(0); | |||
| // 楼栋的面积 | |||
| Map<Long,BigDecimal> buildingAreaMap = null; | |||
| //TODO 楼层 | |||
| Map<Long,WxMallFloor> floorMap = null; | |||
| //TODO 公摊总表的读数 | |||
| Map<Long,BigDecimal> meterNumberMap = null; | |||
| //楼层 | |||
| Map<Long, BigDecimal> floorAreaMap = null; | |||
| WxMallFloor fq = new WxMallFloor(); | |||
| fq.updateTenantInfo(record); | |||
| List<WxMallFloor> floorList = wxMallFloorService.getBudingFloorList(fq, null); | |||
| if (null != floorList && floorList.size() > 0 ) { | |||
| floorAreaMap = new HashMap<Long, BigDecimal>(); | |||
| buildingAreaMap = new HashMap<Long, BigDecimal>(); | |||
| 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<Long> meterList = wxEnergyMeterMapper.findIdList(mq); | |||
| //查询公摊表 | |||
| Map<Long,List<Long>> 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<WxEnergyMeter> sumeterList = wxEnergyMeterMapper.findList(mq); | |||
| if (null != sumeterList && sumeterList.size() > 0 ) { | |||
| summaryMeterMap = new HashMap<Long,List<Long>>(); | |||
| 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<Long> childMeterIds = wxEnergyMeterChildMapper.findChildMeterIdList(mcq); | |||
| if (null != childMeterIds && childMeterIds.size() > 0 ) { | |||
| summaryMeterMap.put(summaryMeter.getId(), childMeterIds); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| List<WxEnergyReadingCalcuteResult> resultList = new ArrayList<WxEnergyReadingCalcuteResult>(); | |||
| 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<WxEnergyMeter> 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); | |||
| @@ -56,6 +56,12 @@ | |||
| <include refid="dynamicWhereConditions"/> | |||
| </select> | |||
| <select id="findIdList" parameterType="com.iformall.domain.po.WxEnergyMeter" resultType="Long"> | |||
| select id | |||
| from wx_energy_meter | |||
| <include refid="dynamicWhereConditions"/> | |||
| </select> | |||
| <select id="selectById" parameterType="HashMap" resultMap="BaseResultMap"> | |||
| select | |||
| <include refid="allColumns"/> | |||