Commit e2a020b2 authored by jiaorz's avatar jiaorz

修改提前还车逻辑

parent 2e1b9aaf
package com.xxfc.platform.order.contant.enumerate;
import java.util.HashMap;
import java.util.Map;
public enum OrderViolateEnum {
BEFORE(1, "提前"),
AFTER(2, "延期")
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
public static Map<Integer, OrderTypeEnum> codeAndDesc = new HashMap<Integer, OrderTypeEnum>();
//Maps.newHashMap();
static{
for(OrderTypeEnum enumE : OrderTypeEnum.values()){
codeAndDesc.put(enumE.getCode(), enumE);
}
}
OrderViolateEnum(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
public static OrderTypeEnum get(Integer code) {
for(OrderTypeEnum enumE : OrderTypeEnum.values()) {
if (enumE.getCode().equals(code)) {
return enumE;
}
}
return null;
}
}
...@@ -105,6 +105,13 @@ public class OrderVehicleCrosstown { ...@@ -105,6 +105,13 @@ public class OrderVehicleCrosstown {
*/ */
private String dedDetail; private String dedDetail;
/**
* 租车违约金明细
*/
@Column(name = "violate_amount_detail")
private String violateDetail;
/** /**
* 1、交车, 2、还车, 3、定损还车 * 1、交车, 2、还车, 3、定损还车
*/ */
......
...@@ -13,12 +13,12 @@ import com.github.wxiaoqi.security.common.exception.BaseException; ...@@ -13,12 +13,12 @@ import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.util.process.ResultCode; import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.xxfc.platform.activity.user.UserInfoBiz; import com.xxfc.platform.activity.user.UserInfoBiz;
import com.xxfc.platform.order.contant.enumerate.CrosstownTypeEnum; import com.xxfc.platform.order.biz.inner.OrderCalculateBiz;
import com.xxfc.platform.order.contant.enumerate.DepositRefundStatus; import com.xxfc.platform.order.contant.enumerate.*;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
import com.xxfc.platform.order.entity.*; import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.OrderVehicaleCrosstownMapper; import com.xxfc.platform.order.mapper.OrderVehicaleCrosstownMapper;
import com.xxfc.platform.order.pojo.DedDetailDTO; import com.xxfc.platform.order.pojo.DedDetailDTO;
import com.xxfc.platform.order.pojo.calculate.InProgressVO;
import com.xxfc.platform.order.pojo.mq.OrderMQDTO; import com.xxfc.platform.order.pojo.mq.OrderMQDTO;
import com.xxfc.platform.order.pojo.order.OrderPageVO; import com.xxfc.platform.order.pojo.order.OrderPageVO;
import com.xxfc.platform.order.pojo.order.OrderVehicleCrosstownDto; import com.xxfc.platform.order.pojo.order.OrderVehicleCrosstownDto;
...@@ -74,6 +74,12 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp ...@@ -74,6 +74,12 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
@Autowired @Autowired
BaseOrderBiz baseOrderBiz; BaseOrderBiz baseOrderBiz;
@Autowired
OrderItemBiz orderItemBiz;
@Autowired
OrderCalculateBiz orderCalculateBiz;
public OrderVehicleCrosstown get(Integer id) { public OrderVehicleCrosstown get(Integer id) {
return selectById(id); return selectById(id);
} }
...@@ -289,63 +295,72 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp ...@@ -289,63 +295,72 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
private void handleOrderStatus(BaseOrder baseOrder, OrderRentVehicleDetail orderRentVehicleDetail, OrderVehicleCrosstown orderVehicleCrosstown) { private void handleOrderStatus(BaseOrder baseOrder, OrderRentVehicleDetail orderRentVehicleDetail, OrderVehicleCrosstown orderVehicleCrosstown) {
//交车完成 设置订单状态为出行中 //交车完成 设置订单状态为出行中
BigDecimal totalAmount = new BigDecimal(0); BigDecimal totalAmount = orderRentVehicleDetail.getDeposit();
ObjectRestResponse<OrderPageVO> objectRestResponse = baseOrderBiz.getOrderDetail(baseOrder.getNo());
if (objectRestResponse.getData() != null && objectRestResponse.getData().getOrderRentVehicleDetail() != null) {
//总押金
totalAmount = objectRestResponse.getData().getOrderRentVehicleDetail().getDeposit();
}
if (baseOrder.getStatus() == OrderStatusEnum.ORDER_TOSTART.getCode()) {//交车 if (baseOrder.getStatus() == OrderStatusEnum.ORDER_TOSTART.getCode()) {//交车
baseOrder.setStatus(OrderStatusEnum.ORDER_WAIT.getCode()); baseOrder.setStatus(OrderStatusEnum.ORDER_WAIT.getCode());
baseOrder = baseOrderBiz.updateSelectiveByIdReT(baseOrder); baseOrder = baseOrderBiz.updateSelectiveByIdReT(baseOrder);
} else if (baseOrder.getStatus() == OrderStatusEnum.ORDER_WAIT.getCode()) { //还车 } else if (baseOrder.getStatus() == OrderStatusEnum.ORDER_WAIT.getCode()) { //还车
if (orderVehicleCrosstown.getType() == CrosstownTypeEnum.ARRIVE.getCode()) {//不定损直接还车 //提前还车,结束时间大于当前时间
//添加非定损记录 DateTime nowTime = DateTime.now();
DepositRefundRecord depositRefundRecord = new DepositRefundRecord(); DateTime endTime = new DateTime(orderRentVehicleDetail.getEndTime());
depositRefundRecord.setAmount(orderVehicleCrosstown.getDeductionCost()); DateTime startTime = new DateTime(orderRentVehicleDetail.getStartTime());
depositRefundRecord.setRestAmount(totalAmount.subtract(getAmount()).subtract(orderVehicleCrosstown.getDeductionCost())); //实际预定的天数
depositRefundRecord.setTotalAmount(totalAmount.subtract(getAmount())); int actualDay = getDaysBetweenDateTime(startTime, endTime);
depositRefundRecord.setCrosstownId(orderVehicleCrosstown.getId()); if (orderRentVehicleDetail.getEndTime() > nowTime.getMillis()) {
orderDepositRefundRecordBiz.saveNormalRecord(depositRefundRecord); //提前的天数
//修改订单状态为已完成 int noUsedDay = getDaysBetweenDateTime(nowTime, endTime);
baseOrder.setStatus(OrderStatusEnum.ORDER_FINISH.getCode()); //退还未使用的天数,或者金额,扣除违约金,实际未使用天数的金额,最多3000元
baseOrder = baseOrderBiz.updateSelectiveByIdReT(baseOrder); InProgressVO inProgressVO = orderCalculateBiz.inProgressCalculate(baseOrder, actualDay - noUsedDay);
//修改订单详情是否押金全部退还 if (inProgressVO != null) {
orderRentVehicleDetail.setFixedLossStatus(0); baseOrder.setViolateAmount(inProgressVO.getViolateAmount());
orderRentVehicleBiz.updateSelectiveByIdRe(orderRentVehicleDetail); baseOrder.setExtraAmount(inProgressVO.getExtraAmount());
baseOrderBiz.sendOrderMq(orderRentVehicleDetail, null, null, baseOrder, OrderMQDTO.ORDER_FINISH); if (inProgressVO.getBackCoupons() != null && inProgressVO.getBackCoupons().size() > 0) {
} else if (orderVehicleCrosstown.getType() == CrosstownTypeEnum.FIXED_LOSS.getCode()) { //定损还车,添加定损记录 StringBuilder backCoupons = new StringBuilder();
//提前还车,结束时间大于当前时间 inProgressVO.getBackCoupons().forEach((a) -> backCoupons.append(a + ","));
DateTime nowTime = DateTime.now(); baseOrder.setBackCoupon(backCoupons.toString());
DateTime endTime = new DateTime(orderRentVehicleDetail.getEndTime()); }
DateTime startTime = new DateTime(orderRentVehicleDetail.getStartTime()); }
//实际预定的天数 BigDecimal cost = new BigDecimal(0);
int actualDay = getDaysBetweenDateTime(startTime, endTime); cost.add(inProgressVO.getExtraAmount()).add(inProgressVO.getViolateAmount());
if (orderRentVehicleDetail.getEndTime() > nowTime.getMillis()) { updateCrossRefund(orderVehicleCrosstown, cost, OrderViolateEnum.AFTER.getCode());
//提前的天数 //延期还车,结束时间小于当前时间
int noUsedDay = getDaysBetweenDateTime(nowTime, endTime); } else if (orderRentVehicleDetail.getEndTime() < nowTime.getMillis()) {
//退还未使用的天数,或者金额,扣除违约金,实际未使用天数的金额,最多3000元 //延期的天数, 延期违约金是延期天数*200%
int usedDay = getDaysBetweenDateTime(endTime, nowTime);
//延期还车,结束时间小于当前时间 Integer orderId = baseOrder.getId();
} else if (orderRentVehicleDetail.getEndTime() < nowTime.getMillis()) { List<OrderItem> items = orderItemBiz.selectList(new OrderItem() {{
//延期的天数, 延期违约金是延期天数*200% setOrderId(orderId);
int usedDay = getDaysBetweenDateTime(endTime, nowTime); }});
DedDetailDTO dedDetailDTO = new DedDetailDTO(); BigDecimal amount = new BigDecimal(0);
dedDetailDTO.setDeductions("违约金:"); if (items != null && items.size() > 0) {
dedDetailDTO.setCost(baseOrder.getGoodsAmount().multiply(new BigDecimal(usedDay)).multiply(new BigDecimal(2))); for (OrderItem orderItem : items) {
dedDetailDTO.setId(1); if (orderItem.getType() == ItemTypeEnum.VEHICLE_MODEL.getCode()) {
dedDetailDTO.setStatusIndex(1); amount = orderItem.getUnitPrice();
dedDetailDTO.setStatusName("延期违约金"); break;
dedDetailDTO.setType(3); }
orderVehicleCrosstown.setDedDetail(JSONObject.toJSONString(dedDetailDTO)); }
BigDecimal restDeposit = orderVehicleCrosstown.getRestDeposit().subtract(dedDetailDTO.getCost());
orderVehicleCrosstown.setRestDeposit(restDeposit);
orderVehicleCrosstown.setDeductionCost(orderVehicleCrosstown.getDeductionCost().add(dedDetailDTO.getCost()));
orderVehicleCrosstownBiz.updateSelectiveByIdRe(orderVehicleCrosstown);
} }
BigDecimal cost = amount.multiply(new BigDecimal(usedDay)).multiply(new BigDecimal(2));
updateCrossRefund(orderVehicleCrosstown, cost, OrderViolateEnum.AFTER.getCode());
} }
}
if (orderVehicleCrosstown.getType() == CrosstownTypeEnum.ARRIVE.getCode()) {//不定损直接还车
//添加非定损记录
DepositRefundRecord depositRefundRecord = new DepositRefundRecord();
depositRefundRecord.setAmount(orderVehicleCrosstown.getDeductionCost());
depositRefundRecord.setRestAmount(totalAmount.subtract(getAmount()).subtract(orderVehicleCrosstown.getDeductionCost()));
depositRefundRecord.setTotalAmount(totalAmount.subtract(getAmount()));
depositRefundRecord.setCrosstownId(orderVehicleCrosstown.getId());
orderDepositRefundRecordBiz.saveNormalRecord(depositRefundRecord);
//修改订单状态为已完成
baseOrder.setStatus(OrderStatusEnum.ORDER_FINISH.getCode());
baseOrder = baseOrderBiz.updateSelectiveByIdReT(baseOrder);
//修改订单详情是否押金全部退还
orderRentVehicleDetail.setFixedLossStatus(0);
orderRentVehicleBiz.updateSelectiveByIdRe(orderRentVehicleDetail);
baseOrderBiz.sendOrderMq(orderRentVehicleDetail, null, null, baseOrder, OrderMQDTO.ORDER_FINISH);
} else if (orderVehicleCrosstown.getType() == CrosstownTypeEnum.FIXED_LOSS.getCode()) { //定损还车,添加定损记录
//添加定损记录 //添加定损记录
DepositRefundRecord depositRefundRecord = new DepositRefundRecord(); DepositRefundRecord depositRefundRecord = new DepositRefundRecord();
depositRefundRecord.setAmount(orderVehicleCrosstown.getDeductionCost()); depositRefundRecord.setAmount(orderVehicleCrosstown.getDeductionCost());
...@@ -386,6 +401,28 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp ...@@ -386,6 +401,28 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
} }
} }
public void updateCrossRefund(OrderVehicleCrosstown orderVehicleCrosstown, BigDecimal cost, Integer type) {
DedDetailDTO dedDetailDTO = new DedDetailDTO();
String detailName = null;
if (type == OrderViolateEnum.BEFORE.getCode()) {
dedDetailDTO.setType(OrderViolateEnum.BEFORE.getCode());
detailName = "提前还车违约金";
} else if (type == OrderViolateEnum.AFTER.getCode()) {
dedDetailDTO.setType(OrderViolateEnum.AFTER.getCode());
detailName = "延期还车违约金";
}
dedDetailDTO.setDeductions(detailName);
dedDetailDTO.setCost(cost);
dedDetailDTO.setId(1);
dedDetailDTO.setStatusIndex(1);
dedDetailDTO.setStatusName(detailName);
orderVehicleCrosstown.setViolateDetail(JSONObject.toJSONString(dedDetailDTO));
BigDecimal restDeposit = orderVehicleCrosstown.getRestDeposit().subtract(dedDetailDTO.getCost());
orderVehicleCrosstown.setRestDeposit(restDeposit);
orderVehicleCrosstown.setDeductionCost(orderVehicleCrosstown.getDeductionCost().add(dedDetailDTO.getCost()));
orderVehicleCrosstownBiz.updateSelectiveByIdRe(orderVehicleCrosstown);
}
//添加订单驾驶人信息 //添加订单驾驶人信息
public void getOrderLicense(OrderVehicleCrosstownDto orderVehicleCrosstownDto) { public void getOrderLicense(OrderVehicleCrosstownDto orderVehicleCrosstownDto) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment