feat(Property): 新增水电气费用计算功能

This commit is contained in:
2025-09-15 19:42:22 +08:00
parent 899b90fde8
commit b53f977e0b
3 changed files with 52 additions and 5 deletions

View File

@@ -95,5 +95,7 @@ public class CostHouseChargeBo extends BaseEntity {
private String remark; private String remark;
private String chargeTime;
} }

View File

@@ -2,7 +2,9 @@ package org.dromara.property.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
@@ -25,6 +27,9 @@ import org.dromara.property.domain.vo.*;
import org.dromara.property.domain.vo.residentVo.ResidentPersonVo; import org.dromara.property.domain.vo.residentVo.ResidentPersonVo;
import org.dromara.property.domain.vo.residentVo.ResidentUnitVo; import org.dromara.property.domain.vo.residentVo.ResidentUnitVo;
import org.dromara.property.mapper.*; import org.dromara.property.mapper.*;
import org.dromara.property.service.ITbFloorService;
import org.dromara.property.service.ITbRoomService;
import org.dromara.property.service.smartDevicesService.ITbMeterRecordService;
import org.dromara.system.api.RemoteDictService; import org.dromara.system.api.RemoteDictService;
import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteDictDataVo; import org.dromara.system.api.domain.vo.RemoteDictDataVo;
@@ -62,6 +67,10 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
@DubboReference @DubboReference
private RemoteDictService remoteDictService; private RemoteDictService remoteDictService;
private final ITbRoomService tbRoomService;
private final ITbFloorService tbFloorService;
private final ITbMeterRecordService tbMeterRecordService;
/** /**
* 查询房屋收费 * 查询房屋收费
* *
@@ -185,7 +194,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
ResidentUnitVo residentUnitVo = residentUnitMapper.selectVoById(add.getResidentUnitId()); ResidentUnitVo residentUnitVo = residentUnitMapper.selectVoById(add.getResidentUnitId());
add.setResidentUnitId(residentUnitVo.getId()); add.setResidentUnitId(residentUnitVo.getId());
add.setArea(residentUnitVo.getArea()); add.setArea(residentUnitVo.getArea());
BigDecimal area = new BigDecimal(add.getArea()); BigDecimal area = BigDecimal.valueOf(add.getArea());
CostItemsVo costItemsVo = costItemsMapper.selectVoById(add.getCostItemsId()); CostItemsVo costItemsVo = costItemsMapper.selectVoById(add.getCostItemsId());
BigDecimal unitPrice = costItemsVo.getUnitPrice(); BigDecimal unitPrice = costItemsVo.getUnitPrice();
// //向上取整 // //向上取整
@@ -214,11 +223,11 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
} }
//类型为5则为水费 //类型为5则为水费
if (Objects.equals(remoteDictDataVo.getDictValue(), "5")) { if (Objects.equals(remoteDictDataVo.getDictValue(), "5")) {
add.setAmountReceivable(meterCharge(residentUnitVo.getLocation(), area, 2L, bo));
} }
//类型为6则为电费 //类型为6则为电费
if (Objects.equals(remoteDictDataVo.getDictValue(), "6")) { if (Objects.equals(remoteDictDataVo.getDictValue(), "6")) {
add.setAmountReceivable(meterCharge(residentUnitVo.getLocation(), area, 1L, bo));
} }
//类型为8则为气费 //类型为8则为气费
if (Objects.equals(remoteDictDataVo.getDictValue(), "8")) { if (Objects.equals(remoteDictDataVo.getDictValue(), "8")) {
@@ -250,8 +259,44 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
/** /**
* 水电气费计算 * 水电气费计算
*/ */
private void meterCharge(){ private BigDecimal meterCharge(String location, BigDecimal roomArea, Long meterType, CostHouseChargeBo bo) {
if (StringUtils.isNotBlank(location)) {
String[] roomIds = location.split(",");
Map<Long, TbFloorVo> floorData = new HashMap<>(); // 存储去重的楼层数据
for (String item : roomIds) {
TbRoomVo roomVo = tbRoomService.queryById(Long.valueOf(item));
if (roomVo != null) {
Long floorId = roomVo.getFloorId();
// 保存楼层数据(如果尚未存在)
if (!floorData.containsKey(floorId)) {
// 假设您有获取楼层信息的方法,这里需要根据实际情况调整
TbFloorVo floorVo = tbFloorService.queryById(floorId);
if (floorVo != null) {
floorData.put(floorId, floorVo);
}
}
}
}
Float floorArea = 0f;
Float meterEnergy = 0f;
for (Map.Entry<Long, TbFloorVo> entry : floorData.entrySet()) {
floorArea += entry.getValue().getArea();
Map<String, Object> meterRecord = tbMeterRecordService.getEnergyTrend(entry.getKey().toString(), null, meterType, null, bo.getChargeTime(), null);
Map<String, Object> resultMap = Convert.convert(new TypeReference<>() {
}, meterRecord.get("nowMonth"));
meterEnergy += Convert.convert(Float.class, resultMap.get("total"));
}
BigDecimal floorAreaBD = Convert.toBigDecimal(floorArea);
BigDecimal meterEnergyBD = Convert.toBigDecimal(meterEnergy);
return roomArea.divide(floorAreaBD, 10, RoundingMode.HALF_UP)
.multiply(meterEnergyBD)
.multiply(Convert.toBigDecimal(0.9));
}
return BigDecimal.ZERO;
} }
/** /**

View File

@@ -14,7 +14,7 @@ import java.util.Map;
* 抄记录Service接口 * 抄记录Service接口
* *
* @author lsm * @author lsm
* @date 2025-07-19 * @since 2025-07-19
*/ */
public interface ITbMeterRecordService { public interface ITbMeterRecordService {