Bladeren bron

优化在场车辆

java110 4 jaren geleden
bovenliggende
commit
0719340c44

+ 42 - 19
java110-bean/src/main/java/com/java110/dto/carInoutPayment/CarInoutPaymentDto.java

@@ -1,6 +1,7 @@
 package com.java110.dto.carInoutPayment;
 
 import com.java110.dto.PageDto;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -15,12 +16,13 @@ import java.util.Date;
 public class CarInoutPaymentDto extends PageDto implements Serializable {
 
     private String realCharge;
-private String inoutId;
-private String payType;
-private String paymentId;
-private String paId;
-private String communityId;
-private String payCharge;
+    private String inoutId;
+    private String payType;
+    private String paymentId;
+    private String paId;
+    private String communityId;
+    private String payCharge;
+    private String payTime;
 
 
     private Date createTime;
@@ -31,43 +33,56 @@ private String payCharge;
     public String getRealCharge() {
         return realCharge;
     }
-public void setRealCharge(String realCharge) {
+
+    public void setRealCharge(String realCharge) {
         this.realCharge = realCharge;
     }
-public String getInoutId() {
+
+    public String getInoutId() {
         return inoutId;
     }
-public void setInoutId(String inoutId) {
+
+    public void setInoutId(String inoutId) {
         this.inoutId = inoutId;
     }
-public String getPayType() {
+
+    public String getPayType() {
         return payType;
     }
-public void setPayType(String payType) {
+
+    public void setPayType(String payType) {
         this.payType = payType;
     }
-public String getPaymentId() {
+
+    public String getPaymentId() {
         return paymentId;
     }
-public void setPaymentId(String paymentId) {
+
+    public void setPaymentId(String paymentId) {
         this.paymentId = paymentId;
     }
-public String getPaId() {
+
+    public String getPaId() {
         return paId;
     }
-public void setPaId(String paId) {
+
+    public void setPaId(String paId) {
         this.paId = paId;
     }
-public String getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
-public String getPayCharge() {
+
+    public String getPayCharge() {
         return payCharge;
     }
-public void setPayCharge(String payCharge) {
+
+    public void setPayCharge(String payCharge) {
         this.payCharge = payCharge;
     }
 
@@ -87,4 +102,12 @@ public void setPayCharge(String payCharge) {
     public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
+
+    public String getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(String payTime) {
+        this.payTime = payTime;
+    }
 }

+ 59 - 0
java110-bean/src/main/java/com/java110/dto/fee/TempCarFeeResult.java

@@ -0,0 +1,59 @@
+package com.java110.dto.fee;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 临时车费用结果
+ */
+public class TempCarFeeResult implements Serializable {
+
+    public TempCarFeeResult(String carNum, Double payCharge, Double maxMoney, Double baseMoney) {
+        this.carNum = carNum;
+        this.payCharge = payCharge;
+        if (maxMoney < payCharge) {
+            this.payCharge = maxMoney;
+        }
+        this.payCharge = new BigDecimal(this.payCharge).add(new BigDecimal(baseMoney)).doubleValue();
+    }
+
+    private String carNum;
+
+    private Double payCharge;
+
+    private long hours;
+
+    private long min;
+
+    public String getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(String carNum) {
+        this.carNum = carNum;
+    }
+
+    public Double getPayCharge() {
+        return payCharge;
+    }
+
+    public void setPayCharge(Double payCharge) {
+        this.payCharge = payCharge;
+    }
+
+    public long getMin() {
+        return min;
+    }
+
+    public void setMin(long min) {
+        this.min = min;
+    }
+
+    public long getHours() {
+        return hours;
+    }
+
+    public void setHours(long hours) {
+        this.hours = hours;
+    }
+}

+ 20 - 1
java110-bean/src/main/java/com/java110/dto/machine/CarInoutDto.java

@@ -1,6 +1,7 @@
 package com.java110.dto.machine;
 
 import com.java110.dto.PageDto;
+import com.java110.dto.carInoutPayment.CarInoutPaymentDto;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -13,7 +14,7 @@ import java.util.Date;
  * @Version 1.0
  * add by wuxw 2019/4/24
  **/
-public class CarInoutDto extends PageDto implements Serializable {
+public class CarInoutDto extends CarInoutPaymentDto implements Serializable {
 
     //状态,100300 进场状态 100400 支付完成 100500 离场状态 100600 支付超时重新支付
     public static final String STATE_IN = "100300";
@@ -31,6 +32,8 @@ public class CarInoutDto extends PageDto implements Serializable {
     private String communityId;
     private String outTime;
     private String paId;
+    private long hours;
+    private long min;
 
 
     private Date createTime;
@@ -127,4 +130,20 @@ public class CarInoutDto extends PageDto implements Serializable {
     public void setPaId(String paId) {
         this.paId = paId;
     }
+
+    public long getHours() {
+        return hours;
+    }
+
+    public void setHours(long hours) {
+        this.hours = hours;
+    }
+
+    public long getMin() {
+        return min;
+    }
+
+    public void setMin(long min) {
+        this.min = min;
+    }
 }

+ 105 - 0
java110-core/src/main/java/com/java110/core/factory/TempCarFeeFactory.java

@@ -0,0 +1,105 @@
+package com.java110.core.factory;
+
+
+import com.java110.dto.machine.CarInoutDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto;
+import com.java110.utils.util.DateUtil;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 临时车 费用 工厂类
+ */
+public class TempCarFeeFactory {
+
+    /**
+     * 判断 用户是支付完成
+     *
+     * @param carInoutDto
+     * @return
+     */
+    public static boolean judgeFinishPayTempCarFee(CarInoutDto carInoutDto) {
+
+        //不是支付完成 状态
+        if (!CarInoutDto.STATE_PAY.equals(carInoutDto.getState())) {
+            return false;
+        }
+
+        //支付时间是否超过15分钟
+        Date payTime = null;
+        try {
+            payTime = DateUtil.getDateFromString(carInoutDto.getPayTime(), DateUtil.DATE_FORMATE_STRING_A);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Date nowTime = DateUtil.getCurrentDate();
+        //支付完成超过15分钟
+        if (nowTime.getTime() - payTime.getTime() > 15 * 60 * 1000) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 判断 用户是支付完成
+     *
+     * @param carInoutDto
+     * @return
+     */
+    public static long getTempCarMin(CarInoutDto carInoutDto) {
+
+        //支付时间是否超过15分钟
+        Date payTime = null;
+        try {
+            //不是支付完成 状态
+            if (CarInoutDto.STATE_PAY.equals(carInoutDto.getState())) {
+
+                try {
+                    payTime = DateUtil.getDateFromString(carInoutDto.getPayTime(), DateUtil.DATE_FORMATE_STRING_A);
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+            } else {
+                payTime = DateUtil.getDateFromString(carInoutDto.getInTime(), DateUtil.DATE_FORMATE_STRING_A);
+            }
+            Date nowTime = DateUtil.getCurrentDate();
+            //支付完成超过15分钟
+            return (nowTime.getTime() - payTime.getTime()) / (60 * 1000);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    public static double getAttrValueDouble(List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos, String specCd) {
+
+        for (TempCarFeeConfigAttrDto tempCarFeeConfigAttrDto : tempCarFeeConfigAttrDtos) {
+            if (tempCarFeeConfigAttrDto.getSpecCd().equals(specCd)) {
+                return Double.parseDouble(tempCarFeeConfigAttrDto.getValue());
+            }
+        }
+
+        return 0.0;
+    }
+
+
+    public static String getAttrValueString(List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos, String specCd) {
+        for (TempCarFeeConfigAttrDto tempCarFeeConfigAttrDto : tempCarFeeConfigAttrDtos) {
+            if (tempCarFeeConfigAttrDto.getSpecCd().equals(specCd)) {
+                return tempCarFeeConfigAttrDto.getValue();
+            }
+        }
+        return "";
+    }
+
+    public static int getAttrValueInt(List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos, String specCd) {
+        for (TempCarFeeConfigAttrDto tempCarFeeConfigAttrDto : tempCarFeeConfigAttrDtos) {
+            if (tempCarFeeConfigAttrDto.getSpecCd().equals(specCd)) {
+                return Integer.parseInt(tempCarFeeConfigAttrDto.getValue());
+            }
+        }
+        return 0;
+    }
+}

+ 10 - 0
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java

@@ -2,6 +2,7 @@ package com.java110.core.smo;
 
 import com.java110.dto.RoomDto;
 import com.java110.dto.fee.FeeDto;
+import com.java110.dto.machine.CarInoutDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.owner.OwnerDto;
 import com.java110.dto.report.ReportCarDto;
@@ -64,6 +65,7 @@ public interface IComputeFeeSMO {
 
     /**
      * 查询费用的业主信息
+     *
      * @param feeDto
      * @return
      */
@@ -71,6 +73,7 @@ public interface IComputeFeeSMO {
 
     /**
      * 刷入 付费方名称
+     *
      * @param feeDtos
      */
     public void freshFeeObjName(List<FeeDto> feeDtos);
@@ -140,4 +143,11 @@ public interface IComputeFeeSMO {
     void computeEveryOweFee(FeeDto tmpFeeDto);
 
     void computeEveryOweFee(FeeDto tmpFeeDto, RoomDto roomDto);
+
+    /**
+     * 计算停车时间和费用
+     *
+     * @param carInoutDtos
+     */
+    void computeTempCarStopTimeAndFee(List<CarInoutDto> carInoutDtos);
 }

+ 63 - 2
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -5,17 +5,28 @@ import com.java110.dto.RoomDto;
 import com.java110.dto.community.CommunityDto;
 import com.java110.dto.contract.ContractDto;
 import com.java110.dto.contractRoom.ContractRoomDto;
-import com.java110.dto.fee.*;
+import com.java110.dto.fee.BillDto;
+import com.java110.dto.fee.BillOweFeeDto;
+import com.java110.dto.fee.FeeAttrDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.fee.TempCarFeeResult;
+import com.java110.dto.machine.CarInoutDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.owner.OwnerDto;
 import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.report.ReportCarDto;
 import com.java110.dto.report.ReportFeeDto;
 import com.java110.dto.report.ReportRoomDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto;
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IComputeTempCarFee;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.fee.ITempCarFeeConfigAttrInnerServiceSMO;
+import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
 import com.java110.intf.store.IContractInnerServiceSMO;
 import com.java110.intf.store.IContractRoomInnerServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
@@ -23,6 +34,7 @@ import com.java110.intf.user.IOwnerInnerServiceSMO;
 import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.factory.ApplicationContextFactory;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
@@ -36,7 +48,12 @@ import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 费用计算 服务类
@@ -75,6 +92,12 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
     @Autowired(required = false)
     private IContractInnerServiceSMO contractInnerServiceSMOImpl;
 
+    @Autowired(required = false)
+    private ITempCarFeeConfigInnerServiceSMO tempCarFeeConfigInnerServiceSMOImpl;
+
+    @Autowired(required = false)
+    private ITempCarFeeConfigAttrInnerServiceSMO tempCarFeeConfigAttrInnerServiceSMOImpl;
+
     @Override
     public Date getFeeEndTime() {
         return null;
@@ -94,6 +117,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         computeFeePrice(tmpFeeDto, roomDto);
     }
 
+
     /**
      * 计算欠费金额
      *
@@ -1528,6 +1552,43 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         return endDate.getTime();
     }
 
+
+    @Override
+    public void computeTempCarStopTimeAndFee(List<CarInoutDto> carInoutDtos) {
+
+        if (carInoutDtos == null || carInoutDtos.size() < 1) {
+            return;
+        }
+
+//计算停车时间
+        TempCarFeeConfigDto tempCarFeeConfigDto = new TempCarFeeConfigDto();
+        tempCarFeeConfigDto.setPaId(carInoutDtos.get(0).getPaId());
+        tempCarFeeConfigDto.setCommunityId(carInoutDtos.get(0).getCommunityId());
+        List<TempCarFeeConfigDto> tempCarFeeConfigDtos = tempCarFeeConfigInnerServiceSMOImpl.queryTempCarFeeConfigs(tempCarFeeConfigDto);
+
+        if (tempCarFeeConfigDtos == null || tempCarFeeConfigDtos.size() < 1) {
+            return;
+        }
+        TempCarFeeConfigAttrDto tempCarFeeConfigAttrDto = new TempCarFeeConfigAttrDto();
+        tempCarFeeConfigAttrDto.setConfigId(tempCarFeeConfigDto.getConfigId());
+        tempCarFeeConfigAttrDto.setCommunityId(tempCarFeeConfigDto.getCommunityId());
+
+        List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos = tempCarFeeConfigAttrInnerServiceSMOImpl.queryTempCarFeeConfigAttrs(tempCarFeeConfigAttrDto);
+        long time = 0;
+        for (CarInoutDto carInoutDto : carInoutDtos) {
+            try {
+                IComputeTempCarFee computeTempCarFee = ApplicationContextFactory.getBean(tempCarFeeConfigDtos.get(0).getRuleId(), IComputeTempCarFee.class);
+                TempCarFeeResult result = computeTempCarFee.computeTempCarFee(carInoutDtos.get(0), tempCarFeeConfigDtos.get(0),tempCarFeeConfigAttrDtos);
+                carInoutDto.setMin(result.getMin());
+                carInoutDto.setHours(result.getHours());
+                carInoutDto.setPayCharge(result.getPayCharge()+"");
+            } catch (Exception e) {
+                logger.error("临时车算费失败", e);
+            }
+        }
+    }
+
+
     public static void main(String[] args) {
         ComputeFeeSMOImpl computeFeeSMO = new ComputeFeeSMOImpl();
         try {

+ 28 - 0
java110-interface/src/main/java/com/java110/intf/fee/IComputeTempCarFee.java

@@ -0,0 +1,28 @@
+package com.java110.intf.fee;
+
+
+import com.java110.dto.fee.TempCarFeeResult;
+import com.java110.dto.machine.CarInoutDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto;
+
+import java.util.List;
+
+/**
+ * 计算 临时车 停车费
+ */
+public interface IComputeTempCarFee {
+
+
+    /**
+     * 临时车停车费计算
+     *
+     * @param carInoutDto
+     * @param tempCarFeeConfigDto
+     * @return
+     */
+    TempCarFeeResult computeTempCarFee(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto) throws Exception;
+
+
+     TempCarFeeResult computeTempCarFee(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto, List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos) throws Exception;
+}

+ 30 - 3
service-common/src/main/java/com/java110/common/cmd/carInout/ListCarInParkingAreaCmd.java

@@ -20,8 +20,9 @@ import com.java110.core.annotation.Java110Cmd;
 import com.java110.core.context.ICmdDataFlowContext;
 import com.java110.core.event.cmd.AbstractServiceCmdListener;
 import com.java110.core.event.cmd.CmdEvent;
+import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.machine.CarInoutDto;
-import com.java110.intf.common.ICarInoutInnerServiceSMO;
+import com.java110.intf.common.ICarInoutV1InnerServiceSMO;
 import com.java110.utils.exception.CmdException;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.BeanConvertUtil;
@@ -29,6 +30,11 @@ import com.java110.vo.ResultVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 类表述:查询 在场车辆
@@ -46,7 +52,10 @@ public class ListCarInParkingAreaCmd extends AbstractServiceCmdListener {
     private static Logger logger = LoggerFactory.getLogger(ListCarInParkingAreaCmd.class);
 
     @Autowired
-    private ICarInoutInnerServiceSMO carInoutInnerServiceSMOImpl;
+    private ICarInoutV1InnerServiceSMO carInoutV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
 
 
     @Override
@@ -59,8 +68,26 @@ public class ListCarInParkingAreaCmd extends AbstractServiceCmdListener {
     public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
         CarInoutDto carInoutDto = BeanConvertUtil.covertBean(reqJson, CarInoutDto.class);
 
-        //carInoutInnerServiceSMOImpl.queryCarInCount(carInoutDto);
+        carInoutDto.setStates(new String[]{CarInoutDto.STATE_IN, CarInoutDto.STATE_PAY, CarInoutDto.STATE_REPAY});
+        int count = carInoutV1InnerServiceSMOImpl.queryCarInoutsCount(carInoutDto);
+
+        List<CarInoutDto> carInoutDtos = null;
+
+        if (count > 0) {
+            carInoutDtos = carInoutV1InnerServiceSMOImpl.queryCarInouts(carInoutDto);
+            computeCarInouts(carInoutDtos);
+        } else {
+            carInoutDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reqJson.getInteger("row")), count, carInoutDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
 
         cmdDataFlowContext.setResponseEntity(ResultVo.success());
     }
+
+    private void computeCarInouts(List<CarInoutDto> carInoutDtos) {
+        computeFeeSMOImpl.computeTempCarStopTimeAndFee(carInoutDtos);
+    }
 }

+ 86 - 0
service-fee/src/main/java/com/java110/fee/tempCar/BaseComputeTempCarFee.java

@@ -0,0 +1,86 @@
+package com.java110.fee.tempCar;
+
+
+import com.java110.core.factory.TempCarFeeFactory;
+import com.java110.dto.fee.TempCarFeeResult;
+import com.java110.dto.machine.CarInoutDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto;
+import com.java110.intf.fee.IComputeTempCarFee;
+import com.java110.intf.fee.ITempCarFeeConfigAttrInnerServiceSMO;
+import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
+import com.java110.utils.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+
+public abstract class BaseComputeTempCarFee implements IComputeTempCarFee {
+    @Autowired
+    private ITempCarFeeConfigInnerServiceSMO tempCarFeeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private ITempCarFeeConfigAttrInnerServiceSMO tempCarFeeConfigAttrInnerServiceSMOImpl;
+
+    @Override
+    public TempCarFeeResult computeTempCarFee(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto) throws Exception {
+        return computeTempCarFee(carInoutDto, tempCarFeeConfigDto, null);
+    }
+
+    @Override
+    public TempCarFeeResult computeTempCarFee(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto, List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos) throws Exception {
+        if (tempCarFeeConfigAttrDtos == null || tempCarFeeConfigAttrDtos.size() < 1) {
+            TempCarFeeConfigAttrDto tempCarFeeConfigAttrDto = new TempCarFeeConfigAttrDto();
+            tempCarFeeConfigAttrDto.setConfigId(tempCarFeeConfigDto.getConfigId());
+            tempCarFeeConfigAttrDto.setCommunityId(tempCarFeeConfigDto.getCommunityId());
+
+            tempCarFeeConfigAttrDtos = tempCarFeeConfigAttrInnerServiceSMOImpl.queryTempCarFeeConfigAttrs(tempCarFeeConfigAttrDto);
+        }
+        TempCarFeeResult result = doCompute(carInoutDto, tempCarFeeConfigDto, tempCarFeeConfigAttrDtos);
+        //获取停车时间
+        long min = TempCarFeeFactory.getTempCarMin(carInoutDto);
+        long hours = min / 60; //因为两者都是整数,你得到一个int
+        long minutes = min % 60;
+        result.setMin(minutes);
+        result.setHours(hours);
+        return result;
+    }
+
+    /**
+     * 计算 费用
+     *
+     * @param carInoutDto
+     * @param tempCarFeeConfigDto
+     * @param tempCarFeeConfigAttrDtos
+     * @return
+     */
+    public abstract TempCarFeeResult doCompute(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto, List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos);
+
+    /**
+     * 判断 用户是支付完成
+     *
+     * @param carInoutDto
+     * @return
+     */
+    public static long getTempCarMin(CarInoutDto carInoutDto) {
+
+        //支付时间是否超过15分钟
+        Date payTime = null;
+        try {
+            //不是支付完成 状态
+            if (CarInoutDto.STATE_PAY.equals(carInoutDto.getState())) {
+                payTime = carInoutDto.getCreateTime();
+            } else {
+                payTime = DateUtil.getDateFromString(carInoutDto.getInTime(), DateUtil.DATE_FORMATE_STRING_A);
+            }
+            Date nowTime = DateUtil.getCurrentDate();
+            //支付完成超过15分钟
+            return (nowTime.getTime() - payTime.getTime()) / (60 * 1000);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+}

+ 121 - 0
service-fee/src/main/java/com/java110/fee/tempCar/BasicComputeTempCarFeeImpl.java

@@ -0,0 +1,121 @@
+package com.java110.fee.tempCar;
+
+import com.java110.core.factory.TempCarFeeFactory;
+import com.java110.dto.fee.TempCarFeeResult;
+import com.java110.dto.machine.CarInoutDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto;
+import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 标准临时车费用计算
+ */
+
+@Component(value = "6700012001")
+public class BasicComputeTempCarFeeImpl extends BaseComputeTempCarFee {
+
+    //5600012001	免费时间(分钟)
+    //5600012002	首段时长(分钟)
+    //5600012003	首段时长收费
+    //5600012004	超过首段(分钟)
+    //5600012005	超过首段收费
+    //5600012006	停车超过(分钟)
+    //5600012007	每多少分钟
+    //5600012008	停车超过收费
+    //5600012009	最高收费
+    public static final String SPEC_CD_5600012001 = "5600012001";
+    public static final String SPEC_CD_5600012002 = "5600012002";
+    public static final String SPEC_CD_5600012003 = "5600012003";
+    public static final String SPEC_CD_5600012004 = "5600012004";
+    public static final String SPEC_CD_5600012005 = "5600012005";
+    public static final String SPEC_CD_5600012006 = "5600012006";
+    public static final String SPEC_CD_5600012007 = "5600012007";
+    public static final String SPEC_CD_5600012008 = "5600012006";
+    public static final String SPEC_CD_5600012009 = "5600012009";
+
+    @Override
+    public TempCarFeeResult doCompute(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto,
+                                      List<TempCarFeeConfigAttrDto> tempCarFeeConfigAttrDtos) {
+
+
+        //获取停车时间
+        long min = TempCarFeeFactory.getTempCarMin(carInoutDto);
+
+        int freeMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012001);
+
+        //最大收费
+        double maxFeeMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012009);
+        //判断 时间是否超过24小时
+        double baseMoney = 0.0;
+
+        //免费时间中
+        if (min < freeMin && !TempCarFeeFactory.judgeFinishPayTempCarFee(carInoutDto)) {
+            return new TempCarFeeResult(carInoutDto.getCarNum(), 0.0, maxFeeMoney, baseMoney);
+        }
+
+        BigDecimal minDeci = new BigDecimal(min);
+
+        //处理超过 一天的数据
+        if (min > 24 * 60) {
+            BigDecimal dayDeci = minDeci.divide(new BigDecimal(24 * 60),0, BigDecimal.ROUND_DOWN);
+            baseMoney = dayDeci.multiply(new BigDecimal(maxFeeMoney)).doubleValue();
+
+            minDeci = minDeci.subtract(dayDeci.multiply(new BigDecimal(24 * 60))).setScale(0, BigDecimal.ROUND_DOWN);
+            min = minDeci.intValue();
+        }
+
+        // 特殊情况  好几天后刚好 min为0
+        if (min == 0) {
+            return new TempCarFeeResult(carInoutDto.getCarNum(), 0.0, maxFeeMoney, baseMoney);
+        }
+
+        int firstMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012002);
+        double firstMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012003);
+        //在首段时长(分钟)中
+        if (min < firstMin) {
+            return new TempCarFeeResult(carInoutDto.getCarNum(), firstMoney, maxFeeMoney, baseMoney);
+        }
+
+        //超过手段
+        int afterMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012004);
+        double afterByMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012005);
+
+        //超过多少分钟
+        int maxMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012006);
+
+
+        //判断是否超过最大 停车时间
+        if (min < maxMin) { //最大停车时间内
+            //超过的时间
+            BigDecimal afterFirstMin = minDeci.subtract(new BigDecimal(firstMin));
+            //时间差 除以 没多少分钟 向上取整
+            double money = afterFirstMin.divide(new BigDecimal(afterMin),0, BigDecimal.ROUND_UP)
+                    .multiply(new BigDecimal(afterByMoney))
+                    .setScale(2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(firstMoney)).doubleValue();
+            return new TempCarFeeResult(carInoutDto.getCarNum(), money, maxFeeMoney, baseMoney);
+        }
+
+        //最大停车时间
+        BigDecimal maxMinDeci = new BigDecimal(maxMin);
+        int afterMaxMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012007);
+        double afterMaxByMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012008);
+        //最大时间减去 首段时间
+        BigDecimal afterFirstMin = maxMinDeci.subtract(new BigDecimal(firstMin));
+        //时间差 除以 没多少分钟 向上取整
+        BigDecimal firstToMaxMoney = afterFirstMin.divide(new BigDecimal(afterMin),0, BigDecimal.ROUND_UP)
+                .multiply(new BigDecimal(afterByMoney))
+                .setScale(2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(firstMoney));
+
+        double money = minDeci.subtract(maxMinDeci)
+                .divide(new BigDecimal(afterMaxMin),0,BigDecimal.ROUND_UP)
+                .multiply(new BigDecimal(afterMaxByMoney))
+                .setScale(2, BigDecimal.ROUND_HALF_UP)
+                .add(firstToMaxMoney).doubleValue();
+
+        return new TempCarFeeResult(carInoutDto.getCarNum(), money, maxFeeMoney, baseMoney);
+    }
+
+}