Commit 494ea5de authored by 周健威's avatar 周健威

修改代码

parent 650e988d
......@@ -23,6 +23,9 @@ public class VehicleItemDTO extends OrderItem {
//已抵消天数
private Integer offsetNum = 0;
//免费金额
private BigDecimal freeAmount;
//标记是否单价一样
private Integer sameUnitPrice = 1;
......@@ -101,31 +104,76 @@ public class VehicleItemDTO extends OrderItem {
}
public BigDecimal getUsedAmount(Integer useDays) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
if(CollUtil.isEmpty(vmcpds)){
if(useDays > getTotalNum()) {
useDays = getTotalNum();
}
return getUnitPrice().multiply(new BigDecimal(useDays+ ""));
}
public BigDecimal getFreeAmount(Integer freeDays) {
BigDecimal usedAmount = BigDecimal.ZERO;
for(VMCalendarPriceCostDTO vmcpcd : vmcpds) {
usedAmount.add(vmcpcd.getPrice());
}
return usedAmount;
}
//由于免费天数可以抵消不是完整的天数,所以处理比较不同
public BigDecimal getFreeAmount(Integer offsetDay) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
if(CollUtil.isEmpty(vmcpds)){
return getUnitPrice().multiply(new BigDecimal(freeDays+ ""));
if(null == offsetDay) {
return getUnitPrice().multiply(new BigDecimal(getCutNum()+ ""));
}else {
return getUnitPrice().multiply(new BigDecimal(offsetDay+ ""));
}
}
BigDecimal freeAmount = BigDecimal.ZERO;
for(int i = 0; i < getBuyNum(); i++) {
freeAmount = freeAmount.add(vmcpds.get(i).getPrice());
if(null == offsetDay) {
for(int i = 0; i < offsetDay; i++) {
freeAmount.add(vmcpds.get(i).getFreeAmount());
}
}else {
for(VMCalendarPriceCostDTO vmcpcd : vmcpds) {
freeAmount.add(vmcpcd.getFreeAmount());
}
}
return freeAmount;
}
// public Integer getActualNum() {
//
// }
public Integer mapFreeDays(Integer userDays) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
if(userDays < getTotalNum()) {
userDays = getTotalNum();
}
if(CollUtil.isEmpty(vmcpds)){
return userDays;
}
Integer mapFreeDays = 0;
for(int i = 0; i < userDays; i++) {
mapFreeDays += vmcpds.get(i).getFreeDays();
}
return mapFreeDays;
}
public void initDetail(Integer ableFreeDays) {
if(StrUtil.isNotBlank(getDetail())) {
List<VehicleModelCalendarPriceDTO> metaList = JSONUtil.toList(JSONUtil.parseArray(getDetail()), VehicleModelCalendarPriceDTO.class);
//计算消费金额
List<VMCalendarPriceCostDTO> list = Convert.toList(VMCalendarPriceCostDTO.class, metaList);
ParamDTO paramDTO = initParam(ableFreeDays, list);
this.sameUnitPrice = paramDTO.getSameUnitPrice();
setCutNum(paramDTO.getFreeNum());
setOffsetNum(paramDTO.getOffsetNum());
setDetail(JSONUtil.parseArray(list).toString());
}
}
public ParamDTO initParam(Integer ableFreeDays, List<VMCalendarPriceCostDTO> list) {
ParamDTO paramDTO = new ParamDTO();
//循环价格列表 获得对应消耗的免费天数
//循环已标记的已使用免费天数
Integer cycleNum = 0;
......@@ -134,10 +182,10 @@ public class VehicleItemDTO extends OrderItem {
if(null == tempUnitPrice) {
tempUnitPrice = dto.getPrice();
}else if( !tempUnitPrice.equals(dto.getPrice())) {
this.sameUnitPrice = 0;
paramDTO.setSameUnitPrice(0);
}
if(ableFreeDays > cycleNum && cycleNum+ dto.getFreeDays() > ableFreeDays) { //本次累加天数 大于 可用免费天数
setCutNum(ableFreeDays);
paramDTO.setFreeNum(ableFreeDays);
Integer up = (ableFreeDays - cycleNum);
Integer down = dto.getFreeDays();
......@@ -145,19 +193,33 @@ public class VehicleItemDTO extends OrderItem {
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice().multiply(
new BigDecimal(up+ "").divide(new BigDecimal(down+ ""), 2, RoundingMode.HALF_UP))
.setScale(2, RoundingMode.HALF_UP));
paramDTO.setFreeAmount(paramDTO.getFreeAmount().add(dto.getFreeAmount()));
}else if(ableFreeDays > cycleNum){ //本次累加天数 小于等于 可用免费天数
setCutNum(getCutNum()+ dto.getFreeDays());
paramDTO.setFreeNum(paramDTO.getFreeNum()+ dto.getFreeDays());
//直接设置价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice());
this.offsetNum += 1;
paramDTO.offsetNum += 1;
}else { //上次累加天数 大于 可用天数
//直接设置价格
dto.setFreeAndConsumeAmount(dto.getPrice(), BigDecimal.ZERO);
}
cycleNum += dto.getFreeDays();
}
setDetail(JSONUtil.parseArray(list).toString());
return paramDTO;
}
@Data
public class ParamDTO {
//已抵消天数
private Integer offsetNum = 0;
//标记是否单价一样
private Integer sameUnitPrice = 1;
//免费数量
private Integer freeNum;
//免费金额
private BigDecimal freeAmount;
}
}
......@@ -84,16 +84,22 @@ public class OrderCalculateBiz {
@Autowired
BaseOrderBiz baseOrderBiz;
public InProgressVO inProgressCalculate(BaseOrder baseOrder, VehicleItemDTO vehicleItemDTO, Integer freeDays, Integer useDays, OrderAccountDetail oad, Boolean isCancel) {
public InProgressVO inProgressCalculate(BaseOrder baseOrder, VehicleItemDTO vehicleItemDTO, Integer useDays, OrderAccountDetail oad, Boolean isCancel) {
BigDecimal refundAmount = BigDecimal.ZERO;
BigDecimal consumeAmount = BigDecimal.ZERO;
BigDecimal topViolateAmount = BigDecimal.ZERO;
BigDecimal itemChangeAmount = BigDecimal.ZERO;
//免费天数
Integer freeDays = (null == vehicleItemDTO.getCutNum())?0 :vehicleItemDTO.getCutNum();
//融入日期价格
List<VehicleModelCalendarPriceDTO> vmcpds = JSONUtil.toList(JSONUtil.parseArray(vehicleItemDTO.getDetail()), VehicleModelCalendarPriceDTO.class);
List<VMCalendarPriceCostDTO> vmcpds = vehicleItemDTO.getVehicleDetail();
VehicleItemDTO.ParamDTO paramDTO = vehicleItemDTO.initParam(freeDays, vmcpds);
List<VMCalendarPriceCostDTO> useAmountList = CollUtil.newArrayList();
//抵消的天数
Integer offsetDays = paramDTO.getOffsetNum();
//商品真实价格
BigDecimal goodsRealAmount = baseOrder.getGoodsAmount().subtract(baseOrder.getCouponAmount());
//其他消费金额 = 商品真实价格 - 主要商品真实价格 = (商品价格 - 优惠价格)- 主要商品真实价格
......@@ -103,24 +109,28 @@ public class OrderCalculateBiz {
inProgressVO.setUsedDays(useDays);
inProgressVO.setUsedAmount(vehicleItemDTO.getUsedAmount(useDays));
//使用的天数对应的免费天数
Integer useDaysMapFreeDays = vehicleItemDTO.mapFreeDays(useDays);
//计算:剩余免费天数
Integer backFreeDays = freeDays - useDays;
//待返还的免费天数
Integer backFreeDays = freeDays - useDaysMapFreeDays;
//待返还的优惠券编号
List<String> backCouponNos = Lists.newArrayList();
//剩余天数
Integer residueDays = vehicleItemDTO.getTotalNum() - useDays;
//过了出发时间取消订单 ,优先使用免费天数
if(backFreeDays <= 0) {
//设置免费天数
inProgressVO.setUsedfreeDays(freeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(freeDays));
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(null));
//消费天数
Integer consumeDays = useDays - freeDays;
Integer consumeDays = useDays - offsetDays;
//如果使用天数 大于 总天数
if(useDays > vehicleItemDTO.getTotalNum()) {
//消费天数
consumeDays = vehicleItemDTO.getTotalNum() - freeDays;
consumeDays = vehicleItemDTO.getTotalNum() - offsetDays;
}
//需要扣除订单费用
......@@ -128,8 +138,8 @@ public class OrderCalculateBiz {
//计算使用天数的费用
//融入日期价格
//consumeAmount = orderItem.getUnitPrice().multiply(new BigDecimal(consumeDays+""));
for(int i = freeDays; i < (freeDays+ consumeDays); i++) {
consumeAmount = consumeAmount.add(vmcpds.get(i).getPrice());
for(int i = offsetDays; i < (offsetDays+ consumeDays); i++) {
consumeAmount = consumeAmount.add(vmcpds.get(i).getConsumeAmount());
}
if(StrUtil.isNotBlank(baseOrder.getCouponTickerNos())) {
......@@ -149,14 +159,14 @@ public class OrderCalculateBiz {
}
}
//设置消费金额
//设置消费金额,添加租车以外的消费金额
consumeAmount = consumeAmount.add(otherItemRealAmount);
inProgressVO.setConsumeAmount(consumeAmount);
refundAmount = handleConsumeAmount(oad, refundAmount, consumeAmount, goodsRealAmount, inProgressVO);
}else {
//设置免费天数
inProgressVO.setUsedfreeDays(useDays);
inProgressVO.setUsedfreeDays(useDaysMapFreeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(useDays));
//返回剩余免费天数,返回优惠券,订单款
......@@ -165,27 +175,21 @@ public class OrderCalculateBiz {
// inProgressVO.setBackFreeDays(backFreeDays);
//融入日期价格
Integer trueBackFreeDays = 0;
for(int i = (freeDays - backFreeDays); i < freeDays; i++) {
trueBackFreeDays += vmcpds.get(i).getFreeDays();
}
Integer trueBackFreeDays = backFreeDays;
inProgressVO.setBackFreeDays(trueBackFreeDays);
//返回优惠券
if(StrUtil.isNotBlank(baseOrder.getCouponTickerNos())) {
//返回所有优惠券
//没有租车消费金额,所以返回所有优惠券
inProgressVO.setBackCoupons(StrUtil.split(baseOrder.getCouponTickerNos(), ','));
}
//设置消费金额 由于返回了优惠券,所以添加优惠券之前减免的金额
//设置消费金额,添加租车以外的消费金额
consumeAmount = consumeAmount.add(otherItemRealAmount);
//修改bug,消费金额不需要添加优惠券金额
//.add(baseOrder.getCouponAmount());
inProgressVO.setConsumeAmount(consumeAmount);
refundAmount = handleConsumeAmount(oad, refundAmount, consumeAmount, goodsRealAmount, inProgressVO);
}
inProgressVO.setRefundOrderAmount(refundAmount);
......@@ -268,12 +272,11 @@ public class OrderCalculateBiz {
setType(ItemTypeEnum.VEHICLE_MODEL.getCode());
setOrderId(baseOrder.getId());
}}), VehicleItemDTO.class);
Integer freeDays = (null == vehicleItemDTO.getCutNum())?0 :vehicleItemDTO.getCutNum();
return inProgressCalculate(baseOrder, vehicleItemDTO, freeDays, useDays, new OrderAccountDetail(), Boolean.FALSE);
return inProgressCalculate(baseOrder, vehicleItemDTO, 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, vehicleItemDTO.getCutNum(), useDays, oad, isCancel);
InProgressVO inProgressVO = inProgressCalculate(baseOrder, vehicleItemDTO, useDays, oad, isCancel);
//定金 - (额外消费金额 + 违约金)
oad.setDepositAmount(orvd.getDeposit().subtract(inProgressVO.getExtraAmount().add(inProgressVO.getViolateAmount())));
......@@ -345,8 +348,7 @@ public class OrderCalculateBiz {
if(timeLag < 0 ) {
Integer useDays = getIncludeDays(orderPageVO.getOrderRentVehicleDetail().getStartTime(), DateTime.now().getMillis());
OrderAccountDetail oad = new OrderAccountDetail();
Integer freeDays = (null == vehicleItemDTO.getCutNum())?0 :vehicleItemDTO.getCutNum();
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, freeDays, useDays, new OrderAccountDetail(), Boolean.FALSE);
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, useDays, new OrderAccountDetail(), Boolean.FALSE);
topAmount = vehicleItemDTO.getTopAmount(useDays);
totalDeductAmount = oad.realTotalDeduct();
......
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