| New file |
| | |
| | | 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<CommunityDto> 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<FeeConfigDto> 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<BillDto> 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<FeeDto> 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<FeeDetailDto> 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<RoomDto> 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); |
| | | } |
| | | } |