Commit a7fbb3d3 authored by 周健威's avatar 周健威

延期还车代码

parent 09616a82
package com.xxfc.platform.order.contant.enumerate;
import java.util.HashMap;
import java.util.Map;
public enum OrderLogEnum {
//账款类型 1--订单常规操作;2--与账相关;3--延期相关
ORDER_ADD (101, "删除订单"),
DELAY_MODIFY (301, "延期增改", "订单号:{}, 延期增改", "旧:{}, 新:{}"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
/**
* 日志内容
*/
private String content;
/**
* 细节
*/
private String detail;
private static Map<Integer,String> codeAndDesc = new HashMap<Integer, String>();
OrderLogEnum(Integer code, String desc){
this.code=code;
this.desc=desc;
}
OrderLogEnum(Integer code, String desc, String content, String detail){
this.code=code;
this.desc=desc;
this.content=content;
this.detail=detail;
}
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 String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
\ No newline at end of file
......@@ -88,7 +88,7 @@ public class OrderLog implements Serializable {
*/
@Column(name = "detail")
@ApiModelProperty(value = "详情")
private Integer detail;
private String detail;
}
package com.xxfc.platform.order.entity;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.util.JsonUtil;
import com.xxfc.platform.order.pojo.order.DelayRentOrderDTO;
import com.xxfc.platform.order.pojo.price.CostDetailExtend;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -353,4 +356,12 @@ public class OrderRentVehicleDetail implements Serializable {
@Column(name = "delay_add_end_time")
@ApiModelProperty(value = "延期结束时间")
private Long delayAddEndTime;
public Integer obtainRealDayNum() {
return this.dayNum + this.delayAddDays;
}
public DelayAddPriceVO obtainDelayAddDetail() {
return JSONUtil.toBean(this.getDelayAddDetail(), DelayAddPriceVO.class);
}
}
......@@ -103,4 +103,26 @@ public class InProgressVO {
* 添加的延期费用
*/
DelayAddPriceVO delayAddPriceVO = new DelayAddPriceVO();
/**
* 返还的原来订单的免费天数
*/
Integer metaOrderBackFreeDays = 0;
/**
* 返还的延期增加的免费天数
*/
Integer delayAddBackFreeDays = 0;
/**
* 原来订单的已使用的金额
*/
BigDecimal metaOrderUsedAmount = BigDecimal.ZERO;
/**
* 延期增加的已使用的金额
*/
BigDecimal delayAddUsedAmount = BigDecimal.ZERO;
}
......@@ -7,6 +7,7 @@ import static com.github.wxiaoqi.security.common.constant.CommonConstants.*;
@Data
public class DelayRentOrderDTO {
Integer operateId;
String no;
Integer needDamageSafe = 0;
Long delayEndTime;
......
......@@ -119,6 +119,23 @@ public class VehicleItemDTO extends OrderItem {
return usedAmount;
}
// public BigDecimal getUsedAmountHasDelay(Integer useDays, List<VMCalendarPriceCostDTO> delayAmountList) {
//
// BigDecimal usedAmount = getUsedAmount(useDays);
// if((useDays - getTotalNum()) > 0) {
// Integer delayAddDays = useDays - getTotalNum();
// if(delayAddDays > delayAmountList.size()) {
// delayAddDays = delayAmountList.size();
// }
//
// for(int i = 0; i < delayAddDays; i++) {
// usedAmount = usedAmount.add(delayAmountList.get(i).getPrice());
// }
// }
//
// return usedAmount;
// }
//由于免费天数可以抵消不是完整的天数,所以处理比较不同
public BigDecimal getFreeAmount(Integer offsetDay) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
......@@ -187,8 +204,12 @@ public class VehicleItemDTO extends OrderItem {
if(ableFreeDays > cycleNum && cycleNum+ dto.getFreeDays() > ableFreeDays) { //本次累加天数 大于 可用免费天数
paramDTO.setFreeNum(ableFreeDays);
//分子
Integer up = (ableFreeDays - cycleNum);
//分母
Integer down = dto.getFreeDays();
//设置当前生效免费天数
dto.setValidFreeDays(up);
//根据百分比计算消费价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice().multiply(
new BigDecimal(up+ "").divide(new BigDecimal(down+ ""), 2, RoundingMode.HALF_UP))
......@@ -198,6 +219,7 @@ public class VehicleItemDTO extends OrderItem {
paramDTO.setFreeNum(paramDTO.getFreeNum()+ dto.getFreeDays());
//直接设置价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice());
dto.setValidFreeDays(dto.getFreeDays());
paramDTO.offsetNum += 1;
}else { //上次累加天数 大于 可用天数
//直接设置价格
......
......@@ -3,6 +3,7 @@ package com.xxfc.platform.order.pojo.price;
import cn.hutool.core.collection.CollUtil;
import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO;
import lombok.Data;
import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
import java.math.BigDecimal;
import java.util.List;
......@@ -32,4 +33,48 @@ public class DelayAddPriceVO {
public void initDelayDamageSafeAmount() {
this.delayDamageSafeAmount = this.damageSafePrice.add(new BigDecimal(delayAddDays+ ""));
}
public Integer residueDelayFreeDays(Integer realResidueDays) {
if(realResidueDays > delayAddDays) {
realResidueDays = delayAddDays;
}
//已使用的延长天数
Integer useDelayDays = delayAddDays - realResidueDays;
//延长的免费天数
Integer residueDelayFreeDays = 0;
List<VMCalendarPriceCostDTO> delayAmountList = getDelayAmountList();
for(int i = useDelayDays; i < delayAddDays; i++) {
residueDelayFreeDays += delayAmountList.get(i).getFreeDays();
}
return residueDelayFreeDays;
}
public BigDecimal delayAddUseAmount(Integer delayAddUseDays) {
BigDecimal delayUsedAmount = BigDecimal.ZERO;
if(delayAddUseDays > getDelayAddDays()) {
delayAddUseDays = getDelayAddDays();
}
for(int i = 0; i < delayAddUseDays; i++) {
delayUsedAmount = delayUsedAmount.add(delayAmountList.get(i).getPrice());
}
return delayUsedAmount;
}
public BigDecimal delayAddFreeAmount(Integer delayAddUseDays) {
BigDecimal delayFreeAmount = BigDecimal.ZERO;
if(delayAddUseDays > getDelayAddDays()) {
delayAddUseDays = getDelayAddDays();
}
for(int i = 0; i < delayAddUseDays; i++) {
delayFreeAmount = delayFreeAmount.add(delayAmountList.get(i).getFreeAmount());
}
return delayFreeAmount;
}
}
package com.xxfc.platform.order.biz;
import cn.hutool.core.util.StrUtil;
import com.xxfc.platform.order.contant.enumerate.OrderLogEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.xxfc.platform.order.entity.OrderLog;
......@@ -14,5 +17,22 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz;
* @date 2019-07-23 17:33:06
*/
@Service
@Slf4j
public class OrderLogBiz extends BaseBiz<OrderLogMapper,OrderLog> {
public void logChange(Object newObj, Object oldObj, Integer logUserId, String orderNo, OrderLogEnum orderLogEnum) {
try {
OrderLog orderLog = new OrderLog(){{
// setLogUserType();
setType(orderLogEnum.getCode());
setLogUserId(logUserId);
setLogContent(StrUtil.format(orderLogEnum.getContent(), orderNo));
setDetail(StrUtil.format(orderLogEnum.getDesc(), oldObj, newObj));
}};
updateSelectiveByIdRe(orderLog);
}catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
\ No newline at end of file
......@@ -12,6 +12,7 @@ import com.xxfc.platform.app.feign.ConfigFeign;
import com.xxfc.platform.order.biz.BaseOrderBiz;
import com.xxfc.platform.order.biz.OrderAccountBiz;
import com.xxfc.platform.order.biz.OrderItemBiz;
import com.xxfc.platform.order.biz.OrderRentVehicleBiz;
import com.xxfc.platform.order.contant.enumerate.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
......@@ -80,7 +81,10 @@ public class OrderCalculateBiz {
@Autowired
BaseOrderBiz baseOrderBiz;
public InProgressVO inProgressCalculate(BaseOrder baseOrder, VehicleItemDTO vehicleItemDTO, Integer useDays, OrderAccountDetail oad, Boolean isCancel) {
@Autowired
OrderRentVehicleBiz orderRentVehicleBiz;
public InProgressVO inProgressCalculate(BaseOrder baseOrder, VehicleItemDTO vehicleItemDTO, OrderRentVehicleDetail orvd, Integer useDays, OrderAccountDetail oad, Boolean isCancel) {
BigDecimal refundAmount = BigDecimal.ZERO;
BigDecimal consumeAmount = BigDecimal.ZERO;
BigDecimal topViolateAmount = BigDecimal.ZERO;
......@@ -103,7 +107,14 @@ public class OrderCalculateBiz {
InProgressVO inProgressVO = new InProgressVO();
inProgressVO.setUsedDays(useDays);
inProgressVO.setUsedAmount(vehicleItemDTO.getUsedAmount(useDays));
inProgressVO.setMetaOrderUsedAmount(vehicleItemDTO.getUsedAmount(useDays));
//查看是否有增加的延期天数-->添加分别原订单和延期的使用金额
if(orvd.getDelayAddDays() > 0 && useDays > vehicleItemDTO.getTotalNum()) {
inProgressVO.setDelayAddUsedAmount(orvd.obtainDelayAddDetail().delayAddUseAmount(useDays - vehicleItemDTO.getTotalNum()));
}
inProgressVO.setUsedAmount(inProgressVO.getMetaOrderUsedAmount().add(inProgressVO.getDelayAddUsedAmount()));
//使用的天数对应的免费天数
Integer useDaysMapFreeDays = vehicleItemDTO.mapFreeDays(useDays);
......@@ -113,10 +124,11 @@ public class OrderCalculateBiz {
//待返还的优惠券编号
List<String> backCouponNos = Lists.newArrayList();
//剩余天数
Integer residueDays = vehicleItemDTO.getTotalNum() - useDays;
Integer realResidueDays = orvd.obtainRealDayNum() - useDays;
//过了出发时间取消订单 ,优先使用免费天数
if(backFreeDays <= 0) {
//设置免费天数
inProgressVO.setUsedfreeDays(freeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(null));
......@@ -169,20 +181,36 @@ public class OrderCalculateBiz {
inProgressVO.setConsumeAmount(consumeAmount);
refundAmount = handleConsumeAmount(oad, refundAmount, consumeAmount, goodsRealAmount, inProgressVO);
//查看是否有增加的延期天数-->添加分别原订单和延期的返回天数
if(orvd.getDelayAddDays() > 0 && realResidueDays > 0) {
inProgressVO.setDelayAddBackFreeDays(orvd.obtainDelayAddDetail().residueDelayFreeDays(realResidueDays));
inProgressVO.setBackFreeDays(inProgressVO.getDelayAddBackFreeDays());
}
//查看是否有增加的延期天数-->添加延期的已使用免费天数 和 已使用免费天数金额
if(orvd.getDelayAddDays() > 0 && useDays > vehicleItemDTO.getTotalNum()) {
inProgressVO.setUsedfreeDays(inProgressVO.getUsedfreeDays() + (orvd.getDelayAddFreeDays() - inProgressVO.getDelayAddBackFreeDays()));
inProgressVO.setUsedFreeDaysAmount(inProgressVO.getUsedFreeDaysAmount().add(orvd.obtainDelayAddDetail().delayAddFreeAmount(useDays - vehicleItemDTO.getTotalNum())));
}
}else {
//设置免费天数
inProgressVO.setUsedfreeDays(useDaysMapFreeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(useDays));
//返回剩余免费天数,返回优惠券,订单款
//修改bug,不需要提前加, 已在handleConsumeAmount方法中添加
// refundAmount = refundAmount.add(goodsRealAmount);
// inProgressVO.setBackFreeDays(backFreeDays);
//融入日期价格
Integer trueBackFreeDays = backFreeDays;
inProgressVO.setBackFreeDays(trueBackFreeDays);
inProgressVO.setMetaOrderBackFreeDays(trueBackFreeDays);
//查看是否有增加的延期天数-->添加分别原订单和延期的返回天数
if(orvd.getDelayAddDays() > 0) {
inProgressVO.setDelayAddBackFreeDays(orvd.getDelayAddFreeDays());
}
inProgressVO.setBackFreeDays(inProgressVO.getMetaOrderBackFreeDays()+ inProgressVO.getDelayAddBackFreeDays());
//查看是否有增加的延期天数-->添加延期的已使用免费天数 和 已使用免费天数金额
//不需要
//返回优惠券
if(StrUtil.isNotBlank(baseOrder.getCouponTickerNos())) {
......@@ -200,29 +228,37 @@ public class OrderCalculateBiz {
inProgressVO.setRefundOrderAmount(refundAmount);
inProgressVO.setBackCoupons(backCouponNos);
List<VMCalendarPriceCostDTO> realVmcpds = Convert.toList(VMCalendarPriceCostDTO.class, vmcpds);
//查看是否有增加的延期天数-->添加延期的费用列表
if(orvd.getDelayAddDays() > 0) {
realVmcpds.addAll(orvd.obtainDelayAddDetail().getDelayAmountList());
}
//计算违约金
//residueDays * 身份价格
if(residueDays > 0) {
if(realResidueDays > 0) {
//设置消耗费用列表
for(int i = 0; i < useDays; i++) {
useAmountList.add(BeanUtil.toBean(vmcpds.get(i), VMCalendarPriceCostDTO.class));
useAmountList.add(BeanUtil.toBean(realVmcpds.get(i), VMCalendarPriceCostDTO.class));
}
//"{}元/天 x{}天"
BigDecimal residueAmount = BigDecimal.ZERO;
for(int i = useDays; i < vehicleItemDTO.getTotalNum(); i++) {
residueAmount = residueAmount.add(vmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(vmcpds.get(i));
residueAmount = residueAmount.add(realVmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(realVmcpds.get(i));
}
String violateDesc = StrUtil.format("{}元", residueAmount.toString());
if(residueDays >= 2) {
residueDays = 2;
if(realResidueDays >= 2) {
realResidueDays = 2;
residueAmount = BigDecimal.ZERO;
inProgressVO.setViolateAmountList(CollUtil.newArrayList());
for(int i = useDays; i < (useDays + residueDays); i++) {
residueAmount = residueAmount.add(vmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(vmcpds.get(i));
for(int i = useDays; i < (useDays + realResidueDays); i++) {
residueAmount = residueAmount.add(realVmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(realVmcpds.get(i));
}
violateDesc += StrUtil.format("(封顶{}元)", residueAmount);
}
......@@ -231,18 +267,18 @@ public class OrderCalculateBiz {
inProgressVO.setViolateDesc(" 提前还车违约金:"+ violateDesc);
OrderAccountDeduction violateDeduction = orderAccountBiz.initDeduction(inProgressVO.getViolateAmount(), violateDesc, DeductionTypeEnum.VIOLATE_ADVANCE, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(violateDeduction);
}else if(residueDays < 0 && !isCancel){
}else if(realResidueDays < 0 && !isCancel){
//isCancel 表示是否为取消,取消则不计算延期还车(因为没有出车)
//设置消耗费用列表
useAmountList.addAll(Convert.toList(VMCalendarPriceCostDTO.class, vmcpds));
useAmountList.addAll(Convert.toList(VMCalendarPriceCostDTO.class, realVmcpds));
//如果订单 出发中 或者 已完成 或者定损中
if(OrderStatusEnum.ORDER_WAIT.getCode().equals(baseOrder.getStatus()) ||
OrderStatusEnum.ORDER_FINISH.getCode().equals(baseOrder.getStatus()) ||
OrderStatusEnum.ORDER_FIXED_LOSS.getCode().equals(baseOrder.getStatus())) {
Integer overDays = 0 - residueDays;
Integer overDays = 0 - realResidueDays;
String violateDesc = StrUtil.format(" 延迟{}天", overDays);
List<VMCalendarPriceCostDTO> overAmountList = orderItemBiz.getOverAmountList(vmcpds.get(vmcpds.size() - 1).getDate(), overDays, vehicleItemDTO.getGoodId(), baseOrder.getUserId());
List<VMCalendarPriceCostDTO> overAmountList = orderItemBiz.getOverAmountList(realVmcpds.get(realVmcpds.size() - 1).getDate(), overDays, vehicleItemDTO.getGoodId(), baseOrder.getUserId());
BigDecimal overAmount = overAmountList.parallelStream()
.map(VMCalendarPriceCostDTO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(2+ ""));
......@@ -285,11 +321,15 @@ public class OrderCalculateBiz {
setType(ItemTypeEnum.VEHICLE_MODEL.getCode());
setOrderId(baseOrder.getId());
}}), VehicleItemDTO.class);
return inProgressCalculate(baseOrder, vehicleItemDTO, useDays, new OrderAccountDetail(), Boolean.FALSE);
OrderRentVehicleDetail orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail() {{
setOrderId(baseOrder.getId());
}});
return inProgressCalculate(baseOrder, vehicleItemDTO, orvd, useDays, new OrderAccountDetail(), Boolean.FALSE);
}
public InProgressVO calculateOrderComplete(BaseOrder baseOrder, OrderRentVehicleDetail orvd, OrderAccountDetail oad, VehicleItemDTO vehicleItemDTO, Integer useDays, Boolean isCancel) {
InProgressVO inProgressVO = inProgressCalculate(baseOrder, vehicleItemDTO, useDays, oad, isCancel);
InProgressVO inProgressVO = inProgressCalculate(baseOrder, vehicleItemDTO, orvd, useDays, oad, isCancel);
//定金 - (额外消费金额 + 违约金)
oad.setDepositAmount(orvd.getDeposit().subtract(inProgressVO.getExtraAmount().add(inProgressVO.getViolateAmount())));
......@@ -361,7 +401,7 @@ public class OrderCalculateBiz {
if(timeLag < 0 ) {
Integer useDays = getIncludeDays(orderPageVO.getOrderRentVehicleDetail().getStartTime(), DateTime.now().getMillis());
OrderAccountDetail oad = new OrderAccountDetail();
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, useDays, oad, Boolean.FALSE);
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, orderPageVO.getOrderRentVehicleDetail(), useDays, oad, Boolean.FALSE);
topAmount = vehicleItemDTO.getTopAmount(useDays);
totalDeductAmount = oad.realTotalDeduct();
......
......@@ -149,8 +149,8 @@ public class OrderCancelBiz {
Long timeLag = orvd.getStartTime() - System.currentTimeMillis();
if(timeLag < 0 ) {
Integer useDays = orderCalculateBiz.getIncludeDays(orvd.getStartTime(), System.currentTimeMillis());
if(useDays > orvd.getDayNum()) {
useDays = orvd.getDayNum();
if(useDays > orvd.obtainRealDayNum()) {
useDays = orvd.obtainRealDayNum();
}
inProgressVO = orderCalculateBiz.calculateOrderComplete(baseOrder, orvd, oad, vehicleItemDTO, useDays, Boolean.TRUE);
......
......@@ -89,6 +89,9 @@ public class OrderDelayBiz {
@Autowired
OrderTemplateBiz orderTemplateBiz;
@Autowired
OrderLogBiz orderLogBiz;
@Autowired
UserFeign userFeign;
......@@ -106,6 +109,7 @@ public class OrderDelayBiz {
public void delayRentOrder(OrderPageVO orderPageVO, DelayRentOrderDTO dto) {
OrderRentVehicleDetail orvd = orderPageVO.getOrderRentVehicleDetail();
OrderRentVehicleDetail oldOrvd = BeanUtil.toBean(orvd, OrderRentVehicleDetail.class);
Integer delayAddDays = 0;
Integer delayAddFreeDays = 0;
//分布式事务执行标记
......@@ -126,6 +130,12 @@ public class OrderDelayBiz {
if(delayAddDays > 0) {
//获得延期天数费用
delayAmountList = orderItemBiz.getOverAmountList(DateUtil.date(orvd.getEndTime()), delayAddDays, orvd.getModelId(), orderPageVO.getUserId());
//处理免费天数和免费金额
delayAmountList.parallelStream().forEach( vmcpcd -> {
vmcpcd.setValidFreeDays(vmcpcd.getFreeDays());
vmcpcd.setFreeAmount(vmcpcd.getPrice());
});
delayAddFreeDays = delayAmountList.parallelStream().mapToInt(VMCalendarPriceCostDTO::getFreeDays).sum();
}else {
delayAmountList = CollUtil.newArrayList();
......@@ -198,6 +208,7 @@ public class OrderDelayBiz {
}
orvd.setDelayAddDetail(JSONUtil.toJsonStr(delayAddPriceVO));
orderRentVehicleBiz.updateSelectiveByIdRe(orvd);
orderLogBiz.logChange(orvd, oldOrvd, dto.getOperateId(), orderPageVO.getNo(), OrderLogEnum.DELAY_MODIFY);
}
}
}
\ No newline at end of file
......@@ -23,6 +23,11 @@ public class VMCalendarPriceCostDTO extends VehicleModelCalendarPriceDTO {
*/
private BigDecimal freeAmount = BigDecimal.ZERO;
/**
* 生效的免费天数
*/
private Integer validFreeDays = 0;
public void setFreeAndConsumeAmount(BigDecimal realAmount, BigDecimal freeAmount) {
setFreeAmount(freeAmount);
setConsumeAmount(realAmount.subtract(freeAmount));
......
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