java110
2021-05-05 2d079ac843ebcb335f2ef7d6952f9700a16fddde
service-fee/src/main/java/com/java110/fee/bmo/importFee/impl/FeeSharingBMOImpl.java
old mode 100644 new mode 100755
@@ -4,18 +4,17 @@
import com.java110.core.annotation.Java110Transactional;
import com.java110.core.factory.GenerateCodeFactory;
import com.java110.dto.RoomDto;
import com.java110.dto.community.CommunityDto;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeConfigDto;
import com.java110.dto.fee.FeeDto;
import com.java110.dto.feeFormula.FeeFormulaDto;
import com.java110.dto.owner.OwnerDto;
import com.java110.fee.bmo.importFee.IFeeSharingBMO;
import com.java110.intf.IImportFeeDetailInnerServiceSMO;
import com.java110.intf.community.ICommunityInnerServiceSMO;
import com.java110.intf.community.IRoomInnerServiceSMO;
import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
import com.java110.intf.fee.IFeeFormulaInnerServiceSMO;
import com.java110.intf.fee.IFeeInnerServiceSMO;
import com.java110.intf.fee.IImportFeeInnerServiceSMO;
import com.java110.intf.fee.*;
import com.java110.intf.user.IOwnerInnerServiceSMO;
import com.java110.po.fee.FeeAttrPo;
import com.java110.po.fee.PayFeeConfigPo;
import com.java110.po.fee.PayFeePo;
@@ -24,6 +23,7 @@
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.utils.util.DateUtil;
import com.java110.utils.util.StringUtil;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
@@ -33,7 +33,9 @@
import javax.script.ScriptEngineManager;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("feeSharingBMOImpl")
public class FeeSharingBMOImpl implements IFeeSharingBMO {
@@ -61,6 +63,12 @@
    @Autowired
    private IImportFeeDetailInnerServiceSMO importFeeDetailInnerServiceSMOImpl;
    @Autowired
    private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
    @Autowired
    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
    /**
     * 添加小区信息
     *
@@ -71,9 +79,28 @@
    public ResponseEntity<String> share(JSONObject reqJson) {
        CommunityDto communityDto = new CommunityDto();
        communityDto.setCommunityId(reqJson.getString("communityId"));
        List<CommunityDto> communityDtos = communityInnerServiceSMOImpl.queryCommunitys(communityDto);
        Assert.listOnlyOne(communityDtos, "未找到小区信息");
        String scope = reqJson.getString("scope");
        RoomDto roomDto = new RoomDto();
        roomDto.setState(RoomDto.STATE_SELL); // 已售房屋
        String[] states = null;
        if (reqJson.containsKey("roomState") && reqJson.getString("roomState").split(",").length > 0) {
            states = reqJson.getString("roomState").split(",");
            roomDto.setStates(states);
        } else {
            roomDto.setStates(new String[]{RoomDto.STATE_SELL, RoomDto.STATE_SHOP_SELL}); // 已经入住
        }
        if (reqJson.containsKey("roomType")) {
            roomDto.setRoomType(reqJson.getString("roomType"));
        }
        if (reqJson.containsKey("feeLayer") && !"全部".equals(reqJson.getString("feeLayer"))) {
            String[] layers = reqJson.getString("feeLayer").split("#");
            roomDto.setLayers(layers);
        }
        List<RoomDto> roomDtos = null;
        if ("1001".equals(scope)) {//小区
            roomDto.setCommunityId(reqJson.getString("objId"));
@@ -89,7 +116,26 @@
        }
        if (roomDtos == null || roomDtos.size() < 1) {
            throw new IllegalArgumentException("未找到相应房屋公摊费用");
            throw new IllegalArgumentException("未找到相应房屋");
        }
        //房屋刷入业主信息
        List<String> roomIds = new ArrayList<>();
        for (RoomDto tmpRoomDto : roomDtos) {
            roomIds.add(tmpRoomDto.getRoomId());
        }
        OwnerDto ownerDto = new OwnerDto();
        ownerDto.setCommunityId(roomDtos.get(0).getCommunityId());
        ownerDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
        List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwnersByRoom(ownerDto);
        for (RoomDto tmpRoomDto : roomDtos) {
            for (OwnerDto tmpOwnerDto : ownerDtos) {
                if (tmpRoomDto.getRoomId().equals(tmpOwnerDto.getRoomId())) {
                    tmpRoomDto.setOwnerId(tmpOwnerDto.getOwnerId());
                    tmpRoomDto.setOwnerName(tmpOwnerDto.getName());
                    tmpRoomDto.setLink(tmpOwnerDto.getLink());
                }
            }
        }
        FeeConfigDto feeConfigDto = new FeeConfigDto();
@@ -117,10 +163,10 @@
        String formulaValue = deakFormula(feeFormulaDtos.get(0));
        //公摊费用到房屋
        sharingFeeToRoom(formulaValue, Double.parseDouble(feeFormulaDtos.get(0).getPrice()), roomDtos, reqJson, feeConfigDto);
        sharingFeeToRoom(formulaValue, Double.parseDouble(feeFormulaDtos.get(0).getPrice()), roomDtos, reqJson, feeConfigDto, communityDtos.get(0),states);
        return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "保存失败");
        return ResultVo.success();
    }
    /**
@@ -130,15 +176,18 @@
     * @param roomDtos
     */
    private void sharingFeeToRoom(String formulaValue, double price, List<RoomDto> roomDtos,
                                  JSONObject reqJson, FeeConfigDto feeConfigDto) {
                                  JSONObject reqJson, FeeConfigDto feeConfigDto, CommunityDto communityDto,String[] states) {
        List<PayFeePo> payFeePos = new ArrayList<>();
        List<FeeAttrPo> feeAttrPos = new ArrayList<>();
        List<ImportFeeDetailPo> importFeeDetailPos = new ArrayList<>();
        String importFeeId = GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId);
        Map<String, Integer> floorRooms = new HashMap();
        Map<String, Integer> unitRooms = new HashMap();
        for (RoomDto roomDto : roomDtos) {
            doSharingFeeToRoom(formulaValue, price, roomDto, reqJson, payFeePos, feeConfigDto, feeAttrPos, importFeeId, importFeeDetailPos);
            doSharingFeeToRoom(formulaValue, price, roomDto, reqJson, payFeePos, feeConfigDto, feeAttrPos,
                    importFeeId, importFeeDetailPos, floorRooms, unitRooms, communityDto,states);
        }
        feeInnerServiceSMOImpl.saveFee(payFeePos);
@@ -160,7 +209,7 @@
            scopeName = roomDtos.get(0).getFloorNum() + "栋" + roomDtos.get(0).getUnitNum() + "单元";
        }
        importFeePo.setRemark("总使用量:" + reqJson.getString("totalDegrees")
                + ",公式:" + formulaValue + ",公摊范围:" + scopeName);
                + ";公式:" + formulaValue + ";公摊范围:" + scopeName);
        importFeeInnerServiceSMOImpl.saveImportFee(importFeePo);
        importFeeDetailInnerServiceSMOImpl.saveImportFeeDetails(importFeeDetailPos);
@@ -183,13 +232,44 @@
    private void doSharingFeeToRoom(String formulaValue, double price, RoomDto roomDto, JSONObject reqJson,
                                    List<PayFeePo> payFeePos, FeeConfigDto feeConfigDto,
                                    List<FeeAttrPo> feeAttrPos, String importFeeId,
                                    List<ImportFeeDetailPo> importFeeDetailPos) {
                                    List<ImportFeeDetailPo> importFeeDetailPos,
                                    Map<String, Integer> floorRooms,
                                    Map<String, Integer> unitRooms,
                                    CommunityDto communityDto,
                                    String[] states) {
        if (!floorRooms.containsKey(roomDto.getFloorId())) {
            RoomDto tmpRoomDto = new RoomDto();
            tmpRoomDto.setCommunityId(communityDto.getCommunityId());
            tmpRoomDto.setFloorId(roomDto.getFloorId());
            tmpRoomDto.setStates(states);
            int roomCount = roomInnerServiceSMOImpl.queryRoomsCount(tmpRoomDto);
            floorRooms.put(roomDto.getFloorId(), roomCount);
        }
        if (!unitRooms.containsKey(roomDto.getUnitId())) {
            RoomDto tmpRoomDto = new RoomDto();
            tmpRoomDto.setCommunityId(communityDto.getCommunityId());
            tmpRoomDto.setUnitId(roomDto.getUnitId());
            tmpRoomDto.setStates(states);
            int roomCount = roomInnerServiceSMOImpl.queryRoomsCount(tmpRoomDto);
            unitRooms.put(roomDto.getUnitId(), roomCount);
        }
        long floorRoomCount = floorRooms.get(roomDto.getFloorId());
        long unitRoomCount = unitRooms.get(roomDto.getUnitId());
        String orgFormulaValue = formulaValue;
        formulaValue = formulaValue.replace("T", reqJson.getString("totalDegrees"))
                .replace("F", roomDto.getFloorArea())
                .replace("U", roomDto.getUnitArea())
                .replace("R", roomDto.getBuiltUpArea())
                .replace("X", roomDto.getFeeCoefficient());
        formulaValue = formulaValue.replaceAll("T", reqJson.getString("totalDegrees"))
                .replaceAll("F", roomDto.getFloorArea())
                .replaceAll("U", roomDto.getUnitArea())
                .replaceAll("R", roomDto.getBuiltUpArea())
                .replaceAll("X", roomDto.getFeeCoefficient())
                .replaceAll("L", floorRoomCount + "")
                .replaceAll("D", unitRoomCount + "")
                .replaceAll("C", communityDto.getCommunityArea());
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
@@ -201,6 +281,7 @@
            BigDecimal priceObj = new BigDecimal(price);
            priceObj = valueObj.multiply(priceObj).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            amount = priceObj.doubleValue();
            value = valueObj.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "";
        } catch (Exception e) {
            throw new IllegalArgumentException("公式计算异常,公式为【" + orgFormulaValue + "】,计算 【" + formulaValue + "】异常");
        }
@@ -211,7 +292,7 @@
        payFeePo.setState(FeeDto.STATE_DOING);
        payFeePo.setCommunityId(reqJson.getString("communityId"));
        payFeePo.setConfigId(feeConfigDto.getConfigId());
        payFeePo.setPayerObjId(reqJson.getString("objId"));
        payFeePo.setPayerObjId(roomDto.getRoomId());
        payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
        payFeePo.setUserId(reqJson.getString("userId"));
        payFeePo.setIncomeObjId(reqJson.getString("storeId"));
@@ -223,6 +304,7 @@
        payFeePos.add(payFeePo);
        // 导入费用名称
        FeeAttrPo feeAttrPo = new FeeAttrPo();
        feeAttrPo.setCommunityId(reqJson.getString("communityId"));
        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
@@ -231,6 +313,7 @@
        feeAttrPo.setFeeId(payFeePo.getFeeId());
        feeAttrPos.add(feeAttrPo);
        // 公摊用量
        feeAttrPo = new FeeAttrPo();
        feeAttrPo.setCommunityId(reqJson.getString("communityId"));
        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
@@ -238,8 +321,70 @@
        feeAttrPo.setValue(value);
        feeAttrPo.setFeeId(payFeePo.getFeeId());
        feeAttrPos.add(feeAttrPo);
        // 公摊总用量
        feeAttrPo = new FeeAttrPo();
        feeAttrPo.setCommunityId(reqJson.getString("communityId"));
        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
        feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_TOTAL_DEGREES);
        feeAttrPo.setValue(reqJson.getString("totalDegrees"));
        feeAttrPo.setFeeId(payFeePo.getFeeId());
        feeAttrPos.add(feeAttrPo);
        feeAttrPo = new FeeAttrPo();
        feeAttrPo.setCommunityId(reqJson.getString("communityId"));
        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
        feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME);
        feeAttrPo.setValue(reqJson.getString("endTime"));
        feeAttrPo.setFeeId(payFeePo.getFeeId());
        feeAttrPos.add(feeAttrPo);
        if (!StringUtil.isEmpty(roomDto.getOwnerId())) {
            feeAttrPo = new FeeAttrPo();
            feeAttrPo.setCommunityId(reqJson.getString("communityId"));
            feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
            feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_ID);
            feeAttrPo.setValue(roomDto.getOwnerId());
            feeAttrPo.setFeeId(payFeePo.getFeeId());
            feeAttrPos.add(feeAttrPo);
            feeAttrPo = new FeeAttrPo();
            feeAttrPo.setCommunityId(reqJson.getString("communityId"));
            feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
            feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_NAME);
            feeAttrPo.setValue(roomDto.getOwnerName());
            feeAttrPo.setFeeId(payFeePo.getFeeId());
            feeAttrPos.add(feeAttrPo);
            feeAttrPo = new FeeAttrPo();
            feeAttrPo.setCommunityId(reqJson.getString("communityId"));
            feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
            feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_LINK);
            feeAttrPo.setValue(roomDto.getLink());
            feeAttrPo.setFeeId(payFeePo.getFeeId());
            feeAttrPos.add(feeAttrPo);
        }
        String formulaValueRemark = orgFormulaValue.replace("T", reqJson.getString("totalDegrees") + "<总用量>")
                .replace("F", roomDto.getFloorArea() + "<" + roomDto.getFloorNum() + "栋面积>")
                .replace("U", roomDto.getUnitArea() + "<" + roomDto.getUnitNum() + "单元面积>")
                .replace("R", roomDto.getBuiltUpArea() + "<" + roomDto.getRoomNum() + "室面积>")
                .replace("C", communityDto.getCommunityArea() + "<小区面积>")
                .replace("X", roomDto.getFeeCoefficient() + "<" + roomDto.getRoomNum() + "室算费系数>");
        formulaValueRemark += (" * " + price + "<单价>");
        // 公摊公式
        feeAttrPo = new FeeAttrPo();
        feeAttrPo.setCommunityId(reqJson.getString("communityId"));
        feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId));
        feeAttrPo.setSpecCd(FeeAttrDto.SPEC_CD_SHARE_FORMULA);
        feeAttrPo.setValue(formulaValueRemark);
        feeAttrPo.setFeeId(payFeePo.getFeeId());
        feeAttrPos.add(feeAttrPo);
        ImportFeeDetailPo importFeeDetailPo = new ImportFeeDetailPo();
        importFeeDetailPo.setAmount(value);
        importFeeDetailPo.setAmount(amount + "");
        importFeeDetailPo.setCommunityId(reqJson.getString("communityId"));
        importFeeDetailPo.setEndTime(reqJson.getString("endTime"));
        importFeeDetailPo.setFeeId(payFeePo.getFeeId());
@@ -253,9 +398,11 @@
        importFeeDetailPo.setState("1000");
        importFeeDetailPo.setImportFeeId(importFeeId);
        importFeeDetailPo.setRemark("公摊用量:" + value);
        importFeeDetailPo.setObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
        importFeeDetailPo.setObjId(roomDto.getRoomId());
        importFeeDetailPo.setObjName(RoomDto.ROOM_TYPE_ROOM.equals(roomDto.getRoomType()) ? roomDto.getFloorNum() + "-" + roomDto.getUnitNum() + "-" + roomDto.getRoomNum() :
                roomDto.getFloorNum() + "-" + roomDto.getRoomNum());
        importFeeDetailPos.add(importFeeDetailPo);
    }
    private String deakFormula(FeeFormulaDto feeFormulaDto) {