package com.java110.job.task.fee; import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.smo.fee.IFeeConfigInnerServiceSMO; import com.java110.core.smo.fee.IFeeDetailInnerServiceSMO; import com.java110.core.smo.fee.IFeeInnerServiceSMO; import com.java110.core.smo.room.IRoomInnerServiceSMO; import com.java110.dto.RoomDto; import com.java110.dto.community.CommunityDto; import com.java110.dto.fee.BillDto; import com.java110.dto.fee.BillOweFeeDto; import com.java110.dto.fee.FeeConfigDto; import com.java110.dto.fee.FeeDetailDto; import com.java110.dto.fee.FeeDto; import com.java110.dto.task.TaskDto; import com.java110.job.quartz.TaskSystemQuartz; import com.java110.utils.constant.ResponseConstant; import com.java110.utils.exception.TaskTemplateException; import com.java110.utils.util.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.List; /** * @ClassName GenerateOwnerBillTemplate * @Description TODO 房屋费用账单生成 * @Author wuxw * @Date 2020/6/4 8:33 * @Version 1.0 * add by wuxw 2020/6/4 **/ @Component public class GenerateRoomBillTemplate extends TaskSystemQuartz { private static final String TASK_ATTR_BILL_TYPE = "10002"; // 出账类型 private static final String TASK_ATTR_VALUE_MONTH = "002"; //按月出账 private static final String TASK_ATTR_VALUE_DAY = "003"; //按日出账 private static final String TASK_ATTR_VALUE_YEAR = "001"; //按年出账 private static final String TASK_ATTR_VALUE_ONCE_MONTH = "005"; //一次性按月出账 @Autowired private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl; @Autowired private IFeeInnerServiceSMO feeInnerServiceSMOImpl; @Autowired private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl; @Autowired private IRoomInnerServiceSMO roomInnerServiceSMOImpl; @Override protected void process(TaskDto taskDto) throws Exception { // 获取小区 List communityDtos = getAllCommunity(); for (CommunityDto communityDto : communityDtos) { GenerateBill(taskDto, communityDto); } } /** * 根据小区生成账单 * * @param communityDto */ private void GenerateBill(TaskDto taskDto, CommunityDto communityDto) { //查询费用项 FeeConfigDto feeConfigDto = new FeeConfigDto(); feeConfigDto.setCommunityId(communityDto.getCommunityId()); feeConfigDto.setBillType(getCurTaskAttr(taskDto, TASK_ATTR_BILL_TYPE).getValue()); List feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto); for (FeeConfigDto tmpFeeConfigDto : feeConfigDtos) { try { GenerateBillByFeeConfig(taskDto, tmpFeeConfigDto); } catch (Exception e) { logger.error("费用出账失败" + tmpFeeConfigDto.getConfigId(), e); } } } /** * 按费用项来出账 * * @param taskDto * @param feeConfigDto */ private void GenerateBillByFeeConfig(TaskDto taskDto, FeeConfigDto feeConfigDto) throws Exception { //当前费用项是否 BillDto billDto = new BillDto(); billDto.setCurBill("T"); billDto.setConfigId(feeConfigDto.getConfigId()); billDto.setCommunityId(feeConfigDto.getCommunityId()); List billDtos = feeInnerServiceSMOImpl.queryBills(billDto); //Assert.listOnlyOne(billDtos, "当前存在多个有效账单" + feeConfigDto.getConfigId()); if (billDtos != null && billDtos.size() > 1) { throw new TaskTemplateException(ResponseConstant.RESULT_CODE_ERROR, "当前存在多个有效账单"); } Date startTime = billDtos == null ? getDefaultStartTime(feeConfigDto.getBillType()) : DateUtil.getDateFromString(billDto.getBillTime(), DateUtil.DATE_FORMATE_STRING_A); FeeDto feeDto = new FeeDto(); feeDto.setConfigId(feeConfigDto.getConfigId()); feeDto.setCommunityId(feeConfigDto.getCommunityId()); List feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); //没有关联费用不做出账 if (feeDto == null || feeDtos.size() < 1) { return; } for (FeeDto tmpFeeDto : feeDtos) { generateFee(startTime, tmpFeeDto); } } /** * 生成 费用 * * @param feeDto */ private void generateFee(Date startTime, FeeDto feeDto) { Date billEndTime = DateUtil.getCurrentDate(); if ("2009001".equals(feeDto.getState())) { //判断是否缴费结束 FeeDetailDto feeDetailDto = new FeeDetailDto(); feeDetailDto.setCommunityId(feeDto.getCommunityId()); feeDetailDto.setFeeId(feeDto.getFeeId()); List feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto); if (feeDetailDtos == null || feeDetailDtos.size() < 1) { return;//这种数据有问题 不做出账处理 } Date detailTime = feeDetailDtos.get(0).getCreateTime(); if (detailTime.getTime() < startTime.getTime()) { //说明上次出账已经出国 无需再出 return; } } if (feeDto.getEndTime().getTime() > billEndTime.getTime()) { //当期没有欠费 return; } computeFeePriceByRoom(feeDto); if (feeDto.getFeePrice() <= 0) { return ;//这个没有欠费可算 } BillOweFeeDto billOweFeeDto = new BillOweFeeDto(); billOweFeeDto.setOweId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_oweId)); billOweFeeDto.setFeeId(feeDto.getFeeId()); billOweFeeDto.setBillId("-1"); billOweFeeDto.setAmountOwed(); } private Date getDefaultStartTime(String billType) { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); if (billType.equals(TASK_ATTR_VALUE_MONTH)) { calendar.add(Calendar.MONTH, -1); return calendar.getTime(); } if (billType.equals(TASK_ATTR_VALUE_DAY)) { calendar.add(Calendar.DATE, -1); return calendar.getTime(); } if (billType.equals(TASK_ATTR_VALUE_DAY)) { calendar.add(Calendar.DATE, -1); return calendar.getTime(); } if (billType.equals(TASK_ATTR_VALUE_YEAR)) { calendar.add(Calendar.YEAR, -1); return calendar.getTime(); } return calendar.getTime(); } /** * 根据房屋来算单价 * * @param feeDto */ private void computeFeePriceByRoom(FeeDto feeDto) { RoomDto roomDto = new RoomDto(); roomDto.setCommunityId(feeDto.getCommunityId()); roomDto.setRoomId(feeDto.getPayerObjId()); List roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto); if (roomDtos == null || roomDtos.size() < 1) { //数据有问题 return; } String computingFormula = feeDto.getComputingFormula(); double feePrice = 0.00; if ("1001".equals(computingFormula)) { //面积*单价+附加费 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice())); BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea())); BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); } else if ("2002".equals(computingFormula)) { // 固定费用 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); } else { feePrice = -1.00; } feeDto.setFeePrice(feePrice); } }