| @@ -10,6 +10,8 @@ import java.util.List; | |||||
| public interface WxEnergyMeterMapper extends CommonMapper<WxEnergyMeter, Long> { | public interface WxEnergyMeterMapper extends CommonMapper<WxEnergyMeter, Long> { | ||||
| List<WxEnergyMeter> findList(WxEnergyMeter wxBillRent); | List<WxEnergyMeter> findList(WxEnergyMeter wxBillRent); | ||||
| List<Long> findIdList(WxEnergyMeter wxBillRent); | |||||
| WxEnergyMeter selectById(@Param("id")Long id,@Param("tenantId")String tenantId); | 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.math.BigDecimal; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.Iterator; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| @@ -11,6 +12,7 @@ import org.springframework.context.annotation.Lazy; | |||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | 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.WxEnergyFeesShop; | ||||
| import com.iformall.domain.po.WxEnergyFeesTime; | import com.iformall.domain.po.WxEnergyFeesTime; | ||||
| import com.iformall.domain.po.WxEnergyMeter; | 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.WxMallFloor; | ||||
| import com.iformall.domain.po.WxShop; | import com.iformall.domain.po.WxShop; | ||||
| import com.iformall.domain.po.base.TenantEntity; | import com.iformall.domain.po.base.TenantEntity; | ||||
| import com.iformall.enums.EnumEnergyMeterPhysicsType; | |||||
| import com.iformall.enums.EnumYesOrNo; | import com.iformall.enums.EnumYesOrNo; | ||||
| import com.iformall.mapper.WxEnergyMeterMapper; | |||||
| import com.iformall.mapper.WxEnergyMeterReadingMapper; | import com.iformall.mapper.WxEnergyMeterReadingMapper; | ||||
| import com.iformall.service.WxMallBuildingService; | import com.iformall.service.WxMallBuildingService; | ||||
| import com.iformall.service.WxMallFloorService; | import com.iformall.service.WxMallFloorService; | ||||
| @@ -31,6 +35,8 @@ public class WxEnergyHelper { | |||||
| @Autowired | @Autowired | ||||
| WxEnergyMeterReadingMapper wxEnergyMeterReadingMapper; | WxEnergyMeterReadingMapper wxEnergyMeterReadingMapper; | ||||
| @Autowired | |||||
| WxEnergyMeterMapper wxEnergyMeterMapper; | |||||
| @Lazy | @Lazy | ||||
| @Autowired | @Autowired | ||||
| private WxMallBuildingService wxMallBuildingService; | private WxMallBuildingService wxMallBuildingService; | ||||
| @@ -77,7 +83,7 @@ public class WxEnergyHelper { | |||||
| } | } | ||||
| private String replaceFormulaData(String formula,BigDecimal totalArea,WxShop shop,Map<Long,BigDecimal> buildingAreaMap, | 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)) { | if (StringUtils.isBlank(formula)) { | ||||
| return null; | 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 ++) { | for (int i = 0 ; i < floorAreaList.size(); i ++) { | ||||
| String floorArea = floorAreaList.get(i); | String floorArea = floorAreaList.get(i); | ||||
| String[] bs = floorArea.split("_"); | String[] bs = floorArea.split("_"); | ||||
| if (null != bs && bs.length > 1) { | 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 | * @param shopfee | ||||
| * @return | * @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())) { | if (StringUtils.isBlank(shopfee.getPrice())) { | ||||
| return "0"; | return "0"; | ||||
| } | } | ||||
| if (shopfee.getIsPublic() == EnumYesOrNo.YES.getCode()) { | 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) { | if (null != formula) { | ||||
| return new BigDecimal(FormulaParser.evaluate(formula)).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString(); | return new BigDecimal(FormulaParser.evaluate(formula)).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString(); | ||||
| } | } | ||||
| return "0"; | return "0"; | ||||
| }else { | }else { | ||||
| if (null == meterList || meterList.size() <= 0 ) { | |||||
| if (null == userMeterList || userMeterList.size() <= 0 ) { | |||||
| return "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(); | WxEnergyMeterReading mrq = new WxEnergyMeterReading(); | ||||
| mrq.updateTenantInfo(shopfee); | mrq.updateTenantInfo(shopfee); | ||||
| mrq.setMeterIds(meterIdList); | |||||
| mrq.setMeterIds(userMeterList); | |||||
| mrq.setStartTime(time.getStartTime()); | |||||
| mrq.setEndTime(time.getEndTime()); | |||||
| BigDecimal totalNumber = wxEnergyMeterReadingMapper.findNumberSum(mrq); | BigDecimal totalNumber = wxEnergyMeterReadingMapper.findNumberSum(mrq); | ||||
| if (null == totalNumber || totalNumber.compareTo(new BigDecimal(0)) <= 0 ) { | if (null == totalNumber || totalNumber.compareTo(new BigDecimal(0)) <= 0 ) { | ||||
| return "0"; | return "0"; | ||||
| @@ -538,7 +538,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { | |||||
| WxEnergyMeter mq = new WxEnergyMeter(); | WxEnergyMeter mq = new WxEnergyMeter(); | ||||
| mq.updateTenantInfo(record); | mq.updateTenantInfo(record); | ||||
| List<Integer> ptylist = new ArrayList<Integer>(); | List<Integer> ptylist = new ArrayList<Integer>(); | ||||
| ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); | |||||
| //ptylist.add(EnumEnergyMeterPhysicsType.PUBLIC.getCode()); | |||||
| ptylist.add(EnumEnergyMeterPhysicsType.SUMMARY.getCode()); | ptylist.add(EnumEnergyMeterPhysicsType.SUMMARY.getCode()); | ||||
| mq.setPhysicsTypeList(ptylist); | mq.setPhysicsTypeList(ptylist); | ||||
| PageInfo<WxEnergyMeter> page = this.meterListAsPage(mq,1,1000); | PageInfo<WxEnergyMeter> page = this.meterListAsPage(mq,1,1000); | ||||
| @@ -881,12 +881,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { | |||||
| try { | try { | ||||
| wxEnergyReadingCalcuteMapper.insert(record); | wxEnergyReadingCalcuteMapper.insert(record); | ||||
| WxEnergyFees fees = this.getFeesById(record.getFeesId(),record.getTenantId()); | 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) { | } catch (Exception e) { | ||||
| logger.error("保存租赁账单失败,e:" + e.getMessage()); | logger.error("保存租赁账单失败,e:" + e.getMessage()); | ||||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + 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(); | final IdWorker idWorker = IdWorker.get(); | ||||
| WxShop shq = new WxShop(); | WxShop shq = new WxShop(); | ||||
| shq.updateTenantInfo(record); | shq.updateTenantInfo(record); | ||||
| shq.setIds(shopIds); | shq.setIds(shopIds); | ||||
| Map<Long, WxShop> shopMap = wxShopService.findShopMap(shq); | Map<Long, WxShop> shopMap = wxShopService.findShopMap(shq); | ||||
| //TODO 总共面积 | |||||
| BigDecimal totalArea = null; | |||||
| //TODO 楼栋的面积 | |||||
| // 总共面积 | |||||
| BigDecimal totalArea = new BigDecimal(0); | |||||
| // 楼栋的面积 | |||||
| Map<Long,BigDecimal> buildingAreaMap = null; | 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>(); | List<WxEnergyReadingCalcuteResult> resultList = new ArrayList<WxEnergyReadingCalcuteResult>(); | ||||
| for (int i = 0 ; i < shopIds.size(); i ++) { | for (int i = 0 ; i < shopIds.size(); i ++) { | ||||
| Long shopId= shopIds.get(i); | Long shopId= shopIds.get(i); | ||||
| @@ -945,16 +988,6 @@ public class WxEnergyServiceImpl implements WxEnergyService { | |||||
| return; | 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 ++) { | for (int j = 0 ; j < shopFeesList.size() ; j ++) { | ||||
| WxEnergyFeesShop shopfee = shopFeesList.get(j); | WxEnergyFeesShop shopfee = shopFeesList.get(j); | ||||
| @@ -968,7 +1001,7 @@ public class WxEnergyServiceImpl implements WxEnergyService { | |||||
| cs.setFeesId(shopfee.getFeesId()); | cs.setFeesId(shopfee.getFeesId()); | ||||
| cs.setFeesShopId(shopfee.getId()); | cs.setFeesShopId(shopfee.getId()); | ||||
| StringBuffer sb = new StringBuffer(); | 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.setPeriod(record.getPeriod()); | ||||
| cs.setMoney(sb.toString()); | cs.setMoney(sb.toString()); | ||||
| resultList.add(cs); | resultList.add(cs); | ||||
| @@ -56,6 +56,12 @@ | |||||
| <include refid="dynamicWhereConditions"/> | <include refid="dynamicWhereConditions"/> | ||||
| </select> | </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 id="selectById" parameterType="HashMap" resultMap="BaseResultMap"> | ||||
| select | select | ||||
| <include refid="allColumns"/> | <include refid="allColumns"/> | ||||