Commit 6d051ed4 authored by 周健威's avatar 周健威

Merge branch 'feature-delay-add'

parents 280f53ed 01fa0357
...@@ -2,6 +2,9 @@ package com.github.wxiaoqi.security.common.constant; ...@@ -2,6 +2,9 @@ package com.github.wxiaoqi.security.common.constant;
import cn.hutool.core.date.format.FastDateFormat; import cn.hutool.core.date.format.FastDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
/** /**
...@@ -50,4 +53,8 @@ public class CommonConstants { ...@@ -50,4 +53,8 @@ public class CommonConstants {
public static final org.joda.time.format.DateTimeFormatter YMR_SLASH_FORMATTER_JODA = org.joda.time.format.DateTimeFormat.forPattern(YMR_SLASH); public static final org.joda.time.format.DateTimeFormatter YMR_SLASH_FORMATTER_JODA = org.joda.time.format.DateTimeFormat.forPattern(YMR_SLASH);
public static final FastDateFormat HOUR_MINUTE_FORMATTE_HUTOOL = FastDateFormat.getInstance(HOUR_MINUTE); public static final FastDateFormat HOUR_MINUTE_FORMATTE_HUTOOL = FastDateFormat.getInstance(HOUR_MINUTE);
public static String stampTo8Zone(DateTimeFormatter dateTimeFormatter, Long timestamp) {
return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.ofHours(8)));
}
} }
...@@ -31,4 +31,8 @@ public class CommonBaseController { ...@@ -31,4 +31,8 @@ public class CommonBaseController {
public String getCurrentUserName(){ public String getCurrentUserName(){
return BaseContextHandler.getUsername(); return BaseContextHandler.getUsername();
} }
public String getCurrentUserId(){
return BaseContextHandler.getUserID();
}
} }
...@@ -38,7 +38,7 @@ public interface UserRestInterface { ...@@ -38,7 +38,7 @@ public interface UserRestInterface {
default void checkAdminUser(){ default void checkAdminUser(){
if(null == getAdminUserInfo()) { if(null == getAdminUserInfo()) {
throw new BaseException(ResultCode.DB_OPERATION_FAIL_CODE); throw new BaseException(ResultCode.NOTEXIST_CODE);
} }
} }
} }
...@@ -8,7 +8,7 @@ import java.util.List; ...@@ -8,7 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public enum DeductionTypeEnum { public enum DeductionTypeEnum {
//账款类型 1--违约金;2--消费金额;3--赔偿金(定损);4--违章相关 //账款类型 1--违约金;2--消费金额;3--赔偿金(定损);4--违章相关;5--其他
VIOLATE_CANCEL(101, "提前取消违约金"), VIOLATE_CANCEL(101, "提前取消违约金"),
VIOLATE_ADVANCE(102, "提前还车违约金"), VIOLATE_ADVANCE(102, "提前还车违约金"),
VIOLATE_DELAY(103, "延迟还车违约金"), VIOLATE_DELAY(103, "延迟还车违约金"),
...@@ -17,6 +17,7 @@ public enum DeductionTypeEnum { ...@@ -17,6 +17,7 @@ public enum DeductionTypeEnum {
DAMAGES(301, "赔偿金(定损)"), DAMAGES(301, "赔偿金(定损)"),
VIOLATE_TRAFFIC_DEDUCT(401, "违章扣款"), VIOLATE_TRAFFIC_DEDUCT(401, "违章扣款"),
VIOLATE_TRAFFIC_KEEP(402, "违章扣款保留金"), VIOLATE_TRAFFIC_KEEP(402, "违章扣款保留金"),
OTHER_DELAY_SAFE(501, "其他费用-延迟用车不记免赔"),
; ;
/** /**
* 编码 * 编码
......
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
...@@ -8,6 +8,7 @@ public enum OrderViolateEnum { ...@@ -8,6 +8,7 @@ public enum OrderViolateEnum {
BEFORE(1, "提前"), BEFORE(1, "提前"),
AFTER(2, "延期"), AFTER(2, "延期"),
CHANGE(3, "更换还车公司"), CHANGE(3, "更换还车公司"),
DELAY_VEHICLE(4, "延长还车不计免赔")
; ;
/** /**
* 编码 * 编码
......
...@@ -52,7 +52,7 @@ public class OrderLog implements Serializable { ...@@ -52,7 +52,7 @@ public class OrderLog implements Serializable {
* 操作者id,另外 -1为系统 * 操作者id,另外 -1为系统
*/ */
@Column(name = "log_user_id") @Column(name = "log_user_id")
@ApiModelProperty(value = "操作者id,另外 -1为系统") @ApiModelProperty(value = "操作者id,另外 -1为系统 -1+id 为后台人员")
private Integer logUserId; private Integer logUserId;
/** /**
...@@ -68,13 +68,27 @@ public class OrderLog implements Serializable { ...@@ -68,13 +68,27 @@ public class OrderLog implements Serializable {
@Column(name = "crt_time") @Column(name = "crt_time")
@ApiModelProperty(value = "创建时间", hidden = true ) @ApiModelProperty(value = "创建时间", hidden = true )
private Long crtTime; private Long crtTime;
/**
* 更新时间
*/
@Column(name = "upd_time")
@ApiModelProperty(value = "更新时间", hidden = true )
private Long updTime;
/** /**
* 日志类型 11--创建订单;12--创建订单 * 日志类型 101--创建订单;102--
*/ */
@Column(name = "type") @Column(name = "type")
@ApiModelProperty(value = "日志类型 11--创建订单;12--创建订单;") @ApiModelProperty(value = "日志类型 101--创建订单;102--创建订单;201--")
private Integer type; private Integer type;
/**
* 详情
*/
@Column(name = "detail")
@ApiModelProperty(value = "详情")
private String detail;
} }
package com.xxfc.platform.order.entity; package com.xxfc.platform.order.entity;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.util.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.CostDetailExtend;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -333,4 +336,44 @@ public class OrderRentVehicleDetail implements Serializable { ...@@ -333,4 +336,44 @@ public class OrderRentVehicleDetail implements Serializable {
public void handelCostDetailExtend(CostDetailExtend costDetailExtend) { public void handelCostDetailExtend(CostDetailExtend costDetailExtend) {
this.costDetailExtend = JsonUtil.objectToJson(((CostDetailExtend)costDetailExtend)); this.costDetailExtend = JsonUtil.objectToJson(((CostDetailExtend)costDetailExtend));
} }
@Column(name = "delay_add_free_days")
@ApiModelProperty(value = "延期补充的免费天数")
private Integer delayAddFreeDays;
@Column(name = "delay_add_days")
@ApiModelProperty(value = "延期增加的天数")
private Integer delayAddDays;
@Column(name = "delay_add_detail")
@ApiModelProperty(value = "增加延期还车费用(计算)明细")
private String delayAddDetail;
@Column(name = "delay_add_damage_safe")
@ApiModelProperty(value = "延期增加天数是否购买车损免赔")
private Integer delayAddDamageSafe;
@Column(name = "delay_add_end_time")
@ApiModelProperty(value = "延期结束时间")
private Long delayAddEndTime;
@Column(name = "meta_end_time")
@ApiModelProperty(value = "原结束时间")
private Long metaEndTime;
public Long getEndTime() {
return endTime;
}
public void setEndTime(Long endTime) {
this.endTime = endTime;
}
public Integer obtainRealDayNum() {
return this.dayNum + this.delayAddDays;
}
public DelayAddPriceVO obtainDelayAddDetail() {
return JSONUtil.toBean(this.getDelayAddDetail(), DelayAddPriceVO.class);
}
} }
...@@ -112,6 +112,12 @@ public class OrderVehicleCrosstown { ...@@ -112,6 +112,12 @@ public class OrderVehicleCrosstown {
@Column(name = "violate_amount_detail") @Column(name = "violate_amount_detail")
private String violateDetail; private String violateDetail;
/**
* 延期还车,不计免赔额计算
*/
@Column(name = "delay_vehicle_detail")
private String delayVehicleDetail;
/** /**
* 1、交车, 2、还车, 3、定损还车 * 1、交车, 2、还车, 3、定损还车
*/ */
......
...@@ -33,6 +33,7 @@ public class DedDetailDTO { ...@@ -33,6 +33,7 @@ public class DedDetailDTO {
//作为:DedDetail :2、车辆损坏 3、其他 //作为:DedDetail :2、车辆损坏 3、其他
//作为:violate_amount_detail 1--提前还车 2--延期还车 3--更换还车公司费用 //作为:violate_amount_detail 1--提前还车 2--延期还车 3--更换还车公司费用
//作为:delay_vehicle_detail
Integer type; Integer type;
//小雨都不知道什么东西 //小雨都不知道什么东西
......
package com.xxfc.platform.order.pojo.calculate; package com.xxfc.platform.order.pojo.calculate;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO; import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO;
import lombok.Data; import lombok.Data;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
...@@ -96,4 +97,32 @@ public class InProgressVO { ...@@ -96,4 +97,32 @@ public class InProgressVO {
* 违约金 费用详情列表 * 违约金 费用详情列表
*/ */
List<VMCalendarPriceCostDTO> violateAmountList = CollUtil.newArrayList(); List<VMCalendarPriceCostDTO> violateAmountList = CollUtil.newArrayList();
/**
* 添加的延期费用
*/
DelayAddPriceVO delayAddPriceVO = new DelayAddPriceVO();
/**
* 返还的原来订单的免费天数
*/
Integer metaOrderBackFreeDays = 0;
/**
* 返还的延期增加的免费天数
*/
Integer delayAddBackFreeDays = 0;
/**
* 原来订单的已使用的金额
*/
BigDecimal metaOrderUsedAmount = BigDecimal.ZERO;
/**
* 延期增加的已使用的金额
*/
BigDecimal delayAddUsedAmount = BigDecimal.ZERO;
} }
package com.xxfc.platform.order.pojo.order;
import com.github.wxiaoqi.security.common.constant.CommonConstants;
import lombok.Data;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.*;
@Data
public class DelayRentOrderDTO {
Integer operateId;
String no;
Integer needDamageSafe = 0;
Long delayEndTime;
Long endTime;
String bookEndDate;
String bookEndDateTime;
Long startTime;
String bookStartDate;
String bookStartDateTime;
public void setStartTime(Long startTime) {
this.startTime = startTime;
this.bookStartDate = stampTo8Zone(YMR_SLASH_FORMATTER, startTime);
this.bookStartDateTime = stampTo8Zone(DATE_TIME_LINE_FORMATTER, startTime);
}
public void setEndTime(Long endTime) {
this.endTime = endTime;
this.bookEndDate = stampTo8Zone(YMR_SLASH_FORMATTER, endTime);
this.bookEndDateTime = stampTo8Zone(DATE_TIME_LINE_FORMATTER, endTime);
}
}
\ No newline at end of file
...@@ -40,6 +40,8 @@ public class OrderPageVO extends BaseOrder { ...@@ -40,6 +40,8 @@ public class OrderPageVO extends BaseOrder {
private String positionName; private String positionName;
//订单违约金 //订单违约金
private String dedDetailDTO; private String dedDetailDTO;
//订单延长还车,不计免赔额
private String delayVehicleDetail;
/** /**
* 車輛編碼 * 車輛編碼
*/ */
......
...@@ -119,6 +119,23 @@ public class VehicleItemDTO extends OrderItem { ...@@ -119,6 +119,23 @@ public class VehicleItemDTO extends OrderItem {
return usedAmount; 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) { public BigDecimal getFreeAmount(Integer offsetDay) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail(); List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
...@@ -187,8 +204,12 @@ public class VehicleItemDTO extends OrderItem { ...@@ -187,8 +204,12 @@ public class VehicleItemDTO extends OrderItem {
if(ableFreeDays > cycleNum && cycleNum+ dto.getFreeDays() > ableFreeDays) { //本次累加天数 大于 可用免费天数 if(ableFreeDays > cycleNum && cycleNum+ dto.getFreeDays() > ableFreeDays) { //本次累加天数 大于 可用免费天数
paramDTO.setFreeNum(ableFreeDays); paramDTO.setFreeNum(ableFreeDays);
//分子
Integer up = (ableFreeDays - cycleNum); Integer up = (ableFreeDays - cycleNum);
//分母
Integer down = dto.getFreeDays(); Integer down = dto.getFreeDays();
//设置当前生效免费天数
dto.setValidFreeDays(up);
//根据百分比计算消费价格 //根据百分比计算消费价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice().multiply( dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice().multiply(
new BigDecimal(up+ "").divide(new BigDecimal(down+ ""), 2, RoundingMode.HALF_UP)) new BigDecimal(up+ "").divide(new BigDecimal(down+ ""), 2, RoundingMode.HALF_UP))
...@@ -198,6 +219,7 @@ public class VehicleItemDTO extends OrderItem { ...@@ -198,6 +219,7 @@ public class VehicleItemDTO extends OrderItem {
paramDTO.setFreeNum(paramDTO.getFreeNum()+ dto.getFreeDays()); paramDTO.setFreeNum(paramDTO.getFreeNum()+ dto.getFreeDays());
//直接设置价格 //直接设置价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice()); dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice());
dto.setValidFreeDays(dto.getFreeDays());
paramDTO.offsetNum += 1; paramDTO.offsetNum += 1;
}else { //上次累加天数 大于 可用天数 }else { //上次累加天数 大于 可用天数
//直接设置价格 //直接设置价格
......
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;
@Data
public class DelayAddPriceVO {
/**
* 延期增加的天数
*/
Integer delayAddDays = 0;
/**
* 不计免赔单价
*/
BigDecimal damageSafePrice = BigDecimal.ZERO;
/**
* 延期不记免赔费用
*/
BigDecimal delayDamageSafeAmount = BigDecimal.ZERO;
/**
* 使用(消耗)详情列表
*/
List<VMCalendarPriceCostDTO> delayAmountList = CollUtil.newArrayList();
public void initDelayDamageSafeAmount() {
this.delayDamageSafeAmount = this.damageSafePrice.multiply(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;
}
}
...@@ -86,172 +86,173 @@ import static com.xxfc.platform.universal.constant.DictionaryKey.ILLEGAL_TYPE; ...@@ -86,172 +86,173 @@ import static com.xxfc.platform.universal.constant.DictionaryKey.ILLEGAL_TYPE;
@Slf4j @Slf4j
public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements UserRestInterface { public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements UserRestInterface {
@Autowired @Autowired
OrderMemberDetailBiz orderMemberDetailBiz; OrderMemberDetailBiz orderMemberDetailBiz;
@Autowired @Autowired
OrderTourDetailBiz orderTourDetailBiz; OrderTourDetailBiz orderTourDetailBiz;
@Autowired @Autowired
OrderRentVehicleBiz orderRentVehicleBiz; OrderRentVehicleBiz orderRentVehicleBiz;
@Autowired @Autowired
OrderVehicleCrosstownBiz orderVehicleCrosstownBiz; OrderVehicleCrosstownBiz orderVehicleCrosstownBiz;
@Autowired @Autowired
OrderUserLicenseBiz orderUserLicenseBiz; OrderUserLicenseBiz orderUserLicenseBiz;
@Autowired @Autowired
OrderItemBiz orderItemBiz; OrderItemBiz orderItemBiz;
@Autowired @Autowired
OrderAccountBiz orderAccountBiz; OrderAccountBiz orderAccountBiz;
@Autowired @Autowired
VehicleFeign vehicleFeign; VehicleFeign vehicleFeign;
@Autowired @Autowired
ThirdFeign thirdFeign; ThirdFeign thirdFeign;
@Autowired @Autowired
TourFeign tourFeign; TourFeign tourFeign;
@Autowired @Autowired
UserFeign userFeign; UserFeign userFeign;
@Autowired @Autowired
MQSenderFeign mqSenderFeign; MQSenderFeign mqSenderFeign;
@Autowired @Autowired
OrderMsgBiz orderMsgBiz; OrderMsgBiz orderMsgBiz;
@Autowired @Autowired
ActivityFeign activityFeign; ActivityFeign activityFeign;
@Autowired @Autowired
OrderCalculateBiz orderCalculateBiz; OrderCalculateBiz orderCalculateBiz;
public static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); public static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
public List<OrderPageVO> pageByParm(Map<String, Object> paramMap) { public List<OrderPageVO> pageByParm(Map<String, Object> paramMap) {
return mapper.pageByParm(paramMap); return mapper.pageByParm(paramMap);
} }
public List<OrderListVo> listOrder(Map<String, Object> paramMap) { public List<OrderListVo> listOrder(Map<String, Object> paramMap) {
List<OrderListVo> orderListVos = mapper.listOrder(paramMap); List<OrderListVo> orderListVos = mapper.listOrder(paramMap);
return orderListVos; return orderListVos;
} }
public List<OrderPageVO> getRentVehicle(Map<String, Object> paramMap) { public List<OrderPageVO> getRentVehicle(Map<String, Object> paramMap) {
return mapper.getRentVehicle(paramMap); return mapper.getRentVehicle(paramMap);
} }
public List<OrderPageVO> getTourList(Map<String, Object> paramMap) { public List<OrderPageVO> getTourList(Map<String, Object> paramMap) {
return mapper.getTourList(paramMap); return mapper.getTourList(paramMap);
} }
public PageDataVO<MemberOrderBo> findMemberOrderPage(MemberOrderFindDTO memberOrderFindDTO){ public PageDataVO<MemberOrderBo> findMemberOrderPage(MemberOrderFindDTO memberOrderFindDTO) {
return PageDataVO.pageInfo(memberOrderFindDTO.getPage(),memberOrderFindDTO.getLimit(),()->mapper.findMemberOrders(memberOrderFindDTO)); return PageDataVO.pageInfo(memberOrderFindDTO.getPage(), memberOrderFindDTO.getLimit(), () -> mapper.findMemberOrders(memberOrderFindDTO));
} }
public List<MemberOrderBo> findMemberOrders(MemberOrderFindDTO memberOrderFindDTO) { public List<MemberOrderBo> findMemberOrders(MemberOrderFindDTO memberOrderFindDTO) {
return mapper.findMemberOrders(memberOrderFindDTO); return mapper.findMemberOrders(memberOrderFindDTO);
} }
// public List<MemberOrderBo> // public List<MemberOrderBo>
/** /**
* 获取订单详情 * 获取订单详情
* *
* @param no * @param no
* @return * @return
*/ */
public ObjectRestResponse<OrderPageVO> getOrderDetail(String no, UserDTO userDTO) { public ObjectRestResponse<OrderPageVO> getOrderDetail(String no, UserDTO userDTO) {
OrderPageVO orderPageVo = mapper.getOrderDetail(no); OrderPageVO orderPageVo = mapper.getOrderDetail(no);
if (orderPageVo == null) { if (orderPageVo == null) {
return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc());
} }
if(orderPageVo.getStatus() <= 3 && orderPageVo.getStatus() != 2 && orderPageVo.getStatus() != -1) { if (orderPageVo.getStatus() <= 3 && orderPageVo.getStatus() != 2 && orderPageVo.getStatus() != -1) {
return ObjectRestResponse.createFailedResult(ResCode.ORDER_DETAIL_IS_NOT_EXIST.getCode(), ResCode.ORDER_DETAIL_IS_NOT_EXIST.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.ORDER_DETAIL_IS_NOT_EXIST.getCode(), ResCode.ORDER_DETAIL_IS_NOT_EXIST.getDesc());
} }
AppUserDTO appUserVo = userFeign.userDetailById(orderPageVo.getUserId()).getData(); AppUserDTO appUserVo = userFeign.userDetailById(orderPageVo.getUserId()).getData();
if(appUserVo != null) { if (appUserVo != null) {
orderPageVo.setTelephone(appUserVo.getUsername()); orderPageVo.setTelephone(appUserVo.getUsername());
orderPageVo.setUsername(appUserVo.getRealname()); orderPageVo.setUsername(appUserVo.getRealname());
} }
List<BranchCompany> branchCompanies = vehicleFeign.companyAll(userDTO.getDataAll(), userDTO.getDataCompany(), userDTO.getDataZone()); List<BranchCompany> branchCompanies = vehicleFeign.companyAll(userDTO.getDataAll(), userDTO.getDataCompany(), userDTO.getDataZone());
List<Integer> companyIds = branchCompanies.stream().map(BranchCompany::getId).collect(Collectors.toList()); List<Integer> companyIds = branchCompanies.stream().map(BranchCompany::getId).collect(Collectors.toList());
if (orderPageVo.getOrderRentVehicleDetail() != null) { if (orderPageVo.getOrderRentVehicleDetail() != null) {
if (!companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId()) && !companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId())) { if (!companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId()) && !companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId())) {
return ObjectRestResponse.createFailedResult(ResCode.YOU_AUTH_FAIL.getCode(), ResCode.YOU_AUTH_FAIL.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.YOU_AUTH_FAIL.getCode(), ResCode.YOU_AUTH_FAIL.getDesc());
} }
if(userDTO.getCompanyId() == orderPageVo.getOrderRentVehicleDetail().getEndCompanyId()) { if (userDTO.getCompanyId() == orderPageVo.getOrderRentVehicleDetail().getEndCompanyId()) {
orderPageVo.setUserCompanyStatus(true); orderPageVo.setUserCompanyStatus(true);
} }
if (orderPageVo.getStatus() == 4) { //未交车 if (orderPageVo.getStatus() == 4) { //未交车
// boolean flag = getTodayTime(orderPageVo.getOrderRentVehicleDetail().getStartTime()); // boolean flag = getTodayTime(orderPageVo.getOrderRentVehicleDetail().getStartTime());
// if (!flag) { // if (!flag) {
// return ObjectRestResponse.createFailedResult(3501, "今日不是交车日期"); // return ObjectRestResponse.createFailedResult(3501, "今日不是交车日期");
// } // }
getDriverInfo(orderPageVo); getDriverInfo(orderPageVo);
} else if (orderPageVo.getStatus() >= 5 || orderPageVo.getStatus() == -1) {//出行中 已交车 } else if (orderPageVo.getStatus() >= 5 || orderPageVo.getStatus() == -1) {//出行中 已交车
//设置违约金金额 //设置违约金金额
getDriverInfo(orderPageVo); getDriverInfo(orderPageVo);
getUserLicense(orderPageVo); getUserLicense(orderPageVo);
} }
ObjectRestResponse<CompanyDetail> startResponse = vehicleFeign.getCompanyDetail(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId()); ObjectRestResponse<CompanyDetail> startResponse = vehicleFeign.getCompanyDetail(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId());
if (startResponse.getData() != null) { if (startResponse.getData() != null) {
orderPageVo.setStartCompanyName(startResponse.getData().getName()); orderPageVo.setStartCompanyName(startResponse.getData().getName());
} }
ObjectRestResponse<CompanyDetail> restResponse = vehicleFeign.getCompanyDetail(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId());
if (restResponse.getData() != null) {
orderPageVo.setEndCompanyName(restResponse.getData().getName());
}
RestResponse<Vehicle> response = vehicleFeign.findById(orderPageVo.getOrderRentVehicleDetail().getVehicleId());
if (response.getData() != null) {
orderPageVo.setVehicalNumberPlat(response.getData().getNumberPlate());
orderPageVo.setCode(response.getData().getCode());
}
} else if (orderPageVo.getOrderTourDetail() != null) {
if(StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) {
List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData();
orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list);
}
}
//设置保留金 ObjectRestResponse<CompanyDetail> restResponse = vehicleFeign.getCompanyDetail(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId());
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData(); if (restResponse.getData() != null) {
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail()); orderPageVo.setEndCompanyName(restResponse.getData().getName());
orderPageVo.setIllegalReserve(illegalReserve); }
orderPageVo.setItems(orderItemBiz.selectList(new OrderItem(){{ RestResponse<Vehicle> response = vehicleFeign.findById(orderPageVo.getOrderRentVehicleDetail().getVehicleId());
setOrderId(orderPageVo.getId()); if (response.getData() != null) {
}})); orderPageVo.setVehicalNumberPlat(response.getData().getNumberPlate());
return ObjectRestResponse.succ(orderPageVo); orderPageVo.setCode(response.getData().getCode());
} }
} else if (orderPageVo.getOrderTourDetail() != null) {
if (StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) {
List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData();
orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list);
}
}
/** //设置保留金
* 后台获取订单详情 Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
* @param no BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail());
* @param userDTO orderPageVo.setIllegalReserve(illegalReserve);
* @return orderPageVo.setItems(orderItemBiz.selectList(new OrderItem() {{
*/ setOrderId(orderPageVo.getId());
}}));
return ObjectRestResponse.succ(orderPageVo);
}
/**
* 后台获取订单详情
*
* @param no
* @param userDTO
* @return
*/
public ObjectRestResponse<OrderPageVO> orderDetail(String no, UserDTO userDTO) { public ObjectRestResponse<OrderPageVO> orderDetail(String no, UserDTO userDTO) {
OrderPageVO orderPageVo = mapper.getOrderDetail(no); OrderPageVO orderPageVo = mapper.getOrderDetail(no);
if (orderPageVo == null) { if (orderPageVo == null) {
return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc());
} }
AppUserDTO appUserVo = userFeign.userDetailById(orderPageVo.getUserId()).getData(); AppUserDTO appUserVo = userFeign.userDetailById(orderPageVo.getUserId()).getData();
if(appUserVo != null) { if (appUserVo != null) {
orderPageVo.setTelephone(appUserVo.getUsername()); orderPageVo.setTelephone(appUserVo.getUsername());
orderPageVo.setUsername(appUserVo.getRealname()); orderPageVo.setUsername(appUserVo.getRealname());
orderPageVo.setPositionName(appUserVo.getPositionName()); orderPageVo.setPositionName(appUserVo.getPositionName());
} }
List<BranchCompany> branchCompanies = vehicleFeign.companyAll(userDTO.getDataAll(), userDTO.getDataCompany(), userDTO.getDataZone()); List<BranchCompany> branchCompanies = vehicleFeign.companyAll(userDTO.getDataAll(), userDTO.getDataCompany(), userDTO.getDataZone());
List<Integer> companyIds = branchCompanies.stream().map(BranchCompany::getId).collect(Collectors.toList()); List<Integer> companyIds = branchCompanies.stream().map(BranchCompany::getId).collect(Collectors.toList());
...@@ -261,7 +262,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -261,7 +262,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
if (!companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId()) && !companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId())) { if (!companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getStartCompanyId()) && !companyIds.contains(orderPageVo.getOrderRentVehicleDetail().getEndCompanyId())) {
return ObjectRestResponse.createFailedResult(ResCode.YOU_AUTH_FAIL.getCode(), ResCode.YOU_AUTH_FAIL.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.YOU_AUTH_FAIL.getCode(), ResCode.YOU_AUTH_FAIL.getDesc());
} }
if(userDTO.getCompanyId() == orderPageVo.getOrderRentVehicleDetail().getEndCompanyId()) { if (userDTO.getCompanyId() == orderPageVo.getOrderRentVehicleDetail().getEndCompanyId()) {
orderPageVo.setUserCompanyStatus(true); orderPageVo.setUserCompanyStatus(true);
} }
if (orderPageVo.getStatus() == 4) { //未交车 if (orderPageVo.getStatus() == 4) { //未交车
...@@ -291,7 +292,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -291,7 +292,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
} }
} else if (orderPageVo.getOrderTourDetail() != null) { } else if (orderPageVo.getOrderTourDetail() != null) {
if(StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) { if (StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) {
List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData(); List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData();
orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list); orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list);
} }
...@@ -301,7 +302,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -301,7 +302,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData(); Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail()); BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail());
orderPageVo.setIllegalReserve(illegalReserve); orderPageVo.setIllegalReserve(illegalReserve);
orderPageVo.setItems(orderItemBiz.selectList(new OrderItem(){{ orderPageVo.setItems(orderItemBiz.selectList(new OrderItem() {{
setOrderId(orderPageVo.getId()); setOrderId(orderPageVo.getId());
setType(104); setType(104);
}})); }}));
...@@ -309,23 +310,23 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -309,23 +310,23 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
} }
//获取两个日期之间的天数(不包含头尾) //获取两个日期之间的天数(不包含头尾)
public int getDaysBetweenDateTime(DateTime startDay, DateTime endDay) { public int getDaysBetweenDateTime(DateTime startDay, DateTime endDay) {
int a = 0; int a = 0;
for (DateTime curDate = startDay.plusDays(1); curDate.compareTo(endDay) < 0; curDate = curDate.plusDays(1)) { for (DateTime curDate = startDay.plusDays(1); curDate.compareTo(endDay) < 0; curDate = curDate.plusDays(1)) {
a++; a++;
} }
return a; return a;
} }
//获取两个日期之间的天数(包含头尾) //获取两个日期之间的天数(包含头尾)
public int getDaysBetweenDateTimeHasStartEnd(DateTime startDay, DateTime endDay) { public int getDaysBetweenDateTimeHasStartEnd(DateTime startDay, DateTime endDay) {
int a = 0; int a = 0;
for (DateTime curDate = startDay; curDate.compareTo(endDay) <= 0; curDate = curDate.plusHours(1)) { for (DateTime curDate = startDay; curDate.compareTo(endDay) <= 0; curDate = curDate.plusHours(1)) {
a++; a++;
} }
return a; return a;
} }
// public static void main(String[] args) { // public static void main(String[] args) {
// DateTime dateTime = DateTime.parse("2019-09-20 12:00:00", DEFAULT_DATE_TIME_FORMATTER); // DateTime dateTime = DateTime.parse("2019-09-20 12:00:00", DEFAULT_DATE_TIME_FORMATTER);
...@@ -336,489 +337,497 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -336,489 +337,497 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
// System.out.println(a); // System.out.println(a);
// } // }
public void updateCrossRefund(OrderPageVO orderPageVO) { public void updateCrossRefund(OrderPageVO orderPageVO) {
//计算延期费用 //计算延期费用
DedDetailDTO dedDetailDTO = new DedDetailDTO(); DedDetailDTO dedDetailDTO = new DedDetailDTO();
//提前还车,结束时间大于当前时间 //提前还车,结束时间大于当前时间
Long nowTime = System.currentTimeMillis(); Long nowTime = System.currentTimeMillis();
Long endTime = orderPageVO.getOrderRentVehicleDetail().getEndTime(); Long endTime = orderPageVO.getOrderRentVehicleDetail().getEndTime();
Long startTime = orderPageVO.getOrderRentVehicleDetail().getStartTime(); Long startTime = orderPageVO.getOrderRentVehicleDetail().getStartTime();
//设置使用天数 //设置使用天数
int userUsedDay = orderCalculateBiz.getIncludeDays(startTime, nowTime); int userUsedDay = orderCalculateBiz.getIncludeDays(startTime, nowTime);
orderPageVO.getOrderRentVehicleDetail().setUsedDay(userUsedDay); orderPageVO.getOrderRentVehicleDetail().setUsedDay(userUsedDay);
orderRentVehicleBiz.updateSelectiveById(orderPageVO.getOrderRentVehicleDetail()); orderRentVehicleBiz.updateSelectiveById(orderPageVO.getOrderRentVehicleDetail());
//实际预定的天数 //实际预定的天数
int actualDay = orderCalculateBiz.getIncludeDays(startTime, endTime); int actualDay = orderCalculateBiz.getIncludeDays(startTime, endTime);
Integer orderId = orderPageVO.getId(); InProgressVO inProgressVO = orderCalculateBiz.inProgressCalculate(orderPageVO, userUsedDay);
List<OrderItem> items = orderItemBiz.selectList(new OrderItem() {{
setOrderId(orderId);
}});
//租车车辆单价
BigDecimal amount = new BigDecimal(0);
if (items != null && items.size() > 0) {
for (OrderItem orderItem : items) {
if (orderItem.getType() == ItemTypeEnum.VEHICLE_MODEL.getCode()) {
amount = orderItem.getUnitPrice();
break;
}
}
}
/**
* 提前还车
*/
if (userUsedDay - actualDay < 0) {
StringBuilder stringBuilder = new StringBuilder();
//提前的天数, 当天就算使用一天
int noUsedDay = actualDay - userUsedDay;
//退还未使用的天数,或者金额,扣除违约金,实际未使用天数的金额,最多3000元
InProgressVO inProgressVO = orderCalculateBiz.inProgressCalculate(orderPageVO, userUsedDay);
if (inProgressVO != null) {
//消费超额金
if(inProgressVO.getExtraAmount() != null) {
dedDetailDTO.setExcessCost(inProgressVO.getExtraAmount());
}
stringBuilder.append("违约金( ");
stringBuilder.append(noUsedDay);
stringBuilder.append("天) = ");
stringBuilder.append(inProgressVO.getViolateAmount());
initDedDetail(dedDetailDTO, OrderViolateEnum.BEFORE.getCode(), inProgressVO.getViolateAmount(), stringBuilder);
}
/**
* 延期还车
*/
} else if (userUsedDay - actualDay > 0) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("违约金( ");
//延期的天数, 延期违约金是延期天数*200%
InProgressVO inProgressVO = orderCalculateBiz.inProgressCalculate(orderPageVO, userUsedDay);
if (inProgressVO != null) {
int extraUsedDay = userUsedDay - actualDay;
if(extraUsedDay > 0) {
stringBuilder.append(extraUsedDay);
stringBuilder.append("(天)");
stringBuilder.append(" x 2)");
stringBuilder.append(" = ");
stringBuilder.append(inProgressVO.getViolateAmount());
stringBuilder.append("元");
initDedDetail(dedDetailDTO, OrderViolateEnum.AFTER.getCode(), inProgressVO.getViolateAmount(), stringBuilder);
}
}
}
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
if ((dedDetailDTO.getCost() != null && dedDetailDTO.getCost().doubleValue() != 0) || (dedDetailDTO.getExcessCost()!=null && dedDetailDTO.getExcessCost().doubleValue() != 0)) { if (inProgressVO != null) {
jsonArray.add(dedDetailDTO); //新增延长还车,不计免赔额,金额大于0才显示
} if (inProgressVO.getDelayAddPriceVO().getDelayDamageSafeAmount() != null && inProgressVO.getDelayAddPriceVO().getDelayDamageSafeAmount().doubleValue() > 0) {
DedDetailDTO dedDetailDTO1 = new DedDetailDTO(); StringBuilder stringBuilder = new StringBuilder();
//添加更改还车公司计算费用 stringBuilder.append("延长用车");
if (orderPageVO.getOrderRentVehicleDetail() != null && orderPageVO.getOrderRentVehicleDetail().getBookRecordId() != null) { stringBuilder.append(inProgressVO.getDelayAddPriceVO().getDelayAddDays());
//查询是否有更换还车记录 stringBuilder.append("天, 补扣不计免赔费用");
List<BookRecordUpdateLog> bookRecordUpdateLogs = vehicleFeign.get(orderPageVO.getOrderRentVehicleDetail().getBookRecordId()).getData(); stringBuilder.append(inProgressVO.getDelayAddPriceVO().getDelayDamageSafeAmount());
if(bookRecordUpdateLogs != null && bookRecordUpdateLogs.size() > 0) { stringBuilder.append("元");
orderPageVO.setBookRecordUpdateLogs(bookRecordUpdateLogs); initDedDetail(dedDetailDTO, OrderViolateEnum.DELAY_VEHICLE.getCode(), inProgressVO.getDelayAddPriceVO().getDelayDamageSafeAmount(), stringBuilder);
//有更换记录,则需要计算更换费用 jsonArray.add(dedDetailDTO);
//原始公司经纬度,列表中最后一个 bookRecordUpdateLogs.get(bookRecordUpdateLogs.size -1 ) 最后还车公司是列表中的第一条中的getNewRetCompanyId orderPageVO.setDelayVehicleDetail(jsonArray.toJSONString());
BookRecordUpdateLog oldCompany = bookRecordUpdateLogs.get(bookRecordUpdateLogs.size() -1); jsonArray = new JSONArray();
BookRecordUpdateLog newCompany = bookRecordUpdateLogs.get(0); dedDetailDTO = new DedDetailDTO();
if (oldCompany != null && newCompany != null) { } else {
CompanyDetail oldCompanyDetail = vehicleFeign.getCompanyDetail(oldCompany.getOldRetCompanyId()).getData(); orderPageVO.setDelayVehicleDetail(jsonArray.toJSONString());
CompanyDetail newCompanyDetail = vehicleFeign.getCompanyDetail(newCompany.getNewRetCompanyId()).getData(); }
if (oldCompanyDetail.getLatitude() != null && oldCompanyDetail.getLongitude() != null && newCompanyDetail.getLongitude() != null && newCompanyDetail.getLatitude() != null) { /**
//根据经纬度获取两个公司的距离 * 提前还车
double distance = DistanceUtil.getDistance(oldCompanyDetail.getLongitude().doubleValue(), oldCompanyDetail.getLatitude().doubleValue(), newCompanyDetail.getLongitude().doubleValue(), newCompanyDetail.getLatitude().doubleValue()); */
log.info("两个公司的距离为(米): {}", distance); if (userUsedDay - actualDay < 0) {
BigDecimal distanceNum = new BigDecimal(distance + "").divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_UP); StringBuilder stringBuilder = new StringBuilder();
//取出费用计算的单价 //提前的天数, 当天就算使用一天
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData(); int noUsedDay = actualDay - userUsedDay;
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(ILLEGAL_TYPE + "_" + DictionaryKey.ILLEGAL_FEE_PRICE).getDetail()); //退还未使用的天数,或者金额,扣除违约金,实际未使用天数的金额,最多3000元
BigDecimal totalCost = distanceNum.multiply(illegalReserve); //消费超额金
log.info("更换两个公司的总费用为: {}", totalCost); if (inProgressVO.getExtraAmount() != null) {
StringBuilder stringBuilder = new StringBuilder(); dedDetailDTO.setExcessCost(inProgressVO.getExtraAmount());
stringBuilder.append(illegalReserve); }
stringBuilder.append(" x "); stringBuilder.append("违约金( ");
stringBuilder.append(distanceNum); stringBuilder.append(noUsedDay);
stringBuilder.append("(KM)"); stringBuilder.append("天) = ");
stringBuilder.append(" = "); stringBuilder.append(inProgressVO.getViolateAmount());
stringBuilder.append(totalCost); initDedDetail(dedDetailDTO, OrderViolateEnum.BEFORE.getCode(), inProgressVO.getViolateAmount(), stringBuilder);
stringBuilder.append("元"); /**
dedDetailDTO1.setCost(totalCost); * 延期还车
initDedDetail(dedDetailDTO1, OrderViolateEnum.CHANGE.getCode(), totalCost, stringBuilder); */
} } else if (userUsedDay - actualDay > 0) {
} StringBuilder stringBuilder = new StringBuilder();
} stringBuilder.append("违约金( ");
} //延期的天数, 延期违约金是延期天数*200%
if (dedDetailDTO1.getCost() != null && dedDetailDTO1.getCost().doubleValue() != 0) { int extraUsedDay = userUsedDay - actualDay;
jsonArray.add(dedDetailDTO1); if (extraUsedDay > 0) {
} stringBuilder.append(extraUsedDay);
orderPageVO.setDedDetailDTO(jsonArray.toJSONString()); stringBuilder.append("(天)");
} stringBuilder.append(" x 2)");
stringBuilder.append(" = ");
stringBuilder.append(inProgressVO.getViolateAmount());
stringBuilder.append("元");
initDedDetail(dedDetailDTO, OrderViolateEnum.AFTER.getCode(), inProgressVO.getViolateAmount(), stringBuilder);
}
}
}
if ((dedDetailDTO.getCost() != null && dedDetailDTO.getCost().doubleValue() != 0) || (dedDetailDTO.getExcessCost() != null && dedDetailDTO.getExcessCost().doubleValue() != 0)) {
jsonArray.add(dedDetailDTO);
}
DedDetailDTO dedDetailDTO1 = new DedDetailDTO();
//添加更改还车公司计算费用
if (orderPageVO.getOrderRentVehicleDetail() != null && orderPageVO.getOrderRentVehicleDetail().getBookRecordId() != null) {
//查询是否有更换还车记录
List<BookRecordUpdateLog> bookRecordUpdateLogs = vehicleFeign.get(orderPageVO.getOrderRentVehicleDetail().getBookRecordId()).getData();
if (bookRecordUpdateLogs != null && bookRecordUpdateLogs.size() > 0) {
orderPageVO.setBookRecordUpdateLogs(bookRecordUpdateLogs);
//有更换记录,则需要计算更换费用
//原始公司经纬度,列表中最后一个 bookRecordUpdateLogs.get(bookRecordUpdateLogs.size -1 ) 最后还车公司是列表中的第一条中的getNewRetCompanyId
BookRecordUpdateLog oldCompany = bookRecordUpdateLogs.get(bookRecordUpdateLogs.size() - 1);
BookRecordUpdateLog newCompany = bookRecordUpdateLogs.get(0);
if (oldCompany != null && newCompany != null) {
CompanyDetail oldCompanyDetail = vehicleFeign.getCompanyDetail(oldCompany.getOldRetCompanyId()).getData();
CompanyDetail newCompanyDetail = vehicleFeign.getCompanyDetail(newCompany.getNewRetCompanyId()).getData();
if (oldCompanyDetail.getLatitude() != null && oldCompanyDetail.getLongitude() != null && newCompanyDetail.getLongitude() != null && newCompanyDetail.getLatitude() != null) {
//根据经纬度获取两个公司的距离
double distance = DistanceUtil.getDistance(oldCompanyDetail.getLongitude().doubleValue(), oldCompanyDetail.getLatitude().doubleValue(), newCompanyDetail.getLongitude().doubleValue(), newCompanyDetail.getLatitude().doubleValue());
log.info("两个公司的距离为(米): {}", distance);
BigDecimal distanceNum = new BigDecimal(distance + "").divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_UP);
//取出费用计算的单价
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(ILLEGAL_TYPE + "_" + DictionaryKey.ILLEGAL_FEE_PRICE).getDetail());
BigDecimal totalCost = distanceNum.multiply(illegalReserve);
log.info("更换两个公司的总费用为: {}", totalCost);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(illegalReserve);
stringBuilder.append(" x ");
stringBuilder.append(distanceNum);
stringBuilder.append("(KM)");
stringBuilder.append(" = ");
stringBuilder.append(totalCost);
stringBuilder.append("元");
dedDetailDTO1.setCost(totalCost);
initDedDetail(dedDetailDTO1, OrderViolateEnum.CHANGE.getCode(), totalCost, stringBuilder);
}
}
}
}
if (dedDetailDTO1.getCost() != null && dedDetailDTO1.getCost().doubleValue() != 0) {
jsonArray.add(dedDetailDTO1);
}
orderPageVO.setDedDetailDTO(jsonArray.toJSONString());
}
/** /**
* 初始化违约金实体 * 初始化违约金实体
* @param dedDetailDTO *
* @param type * @param dedDetailDTO
* @param cost * @param type
* @param stringBuilder * @param cost
*/ * @param stringBuilder
public void initDedDetail(DedDetailDTO dedDetailDTO, Integer type, BigDecimal cost, StringBuilder stringBuilder) { */
String detailName = null; public void initDedDetail(DedDetailDTO dedDetailDTO, Integer type, BigDecimal cost, StringBuilder stringBuilder) {
if (type == OrderViolateEnum.BEFORE.getCode()) { String detailName = null;
dedDetailDTO.setType(OrderViolateEnum.BEFORE.getCode()); if (type == OrderViolateEnum.BEFORE.getCode()) {
detailName = "提前还车违约金"; dedDetailDTO.setType(OrderViolateEnum.BEFORE.getCode());
} else if (type == OrderViolateEnum.AFTER.getCode()) { detailName = "提前还车违约金";
dedDetailDTO.setType(OrderViolateEnum.AFTER.getCode()); } else if (type == OrderViolateEnum.AFTER.getCode()) {
detailName = "延期还车违约金"; dedDetailDTO.setType(OrderViolateEnum.AFTER.getCode());
} else if (type == OrderViolateEnum.CHANGE.getCode()) { detailName = "延期还车违约金";
dedDetailDTO.setType(OrderViolateEnum.CHANGE.getCode()); } else if (type == OrderViolateEnum.CHANGE.getCode()) {
detailName = "更换还车公司"; dedDetailDTO.setType(OrderViolateEnum.CHANGE.getCode());
detailName = "更换还车公司";
} else if (type == OrderViolateEnum.DELAY_VEHICLE.getCode()) {
dedDetailDTO.setType(OrderViolateEnum.DELAY_VEHICLE.getCode());
detailName = "延长还车";
} }
//900元+违约金(¥900x2天=)1800元 //900元+违约金(¥900x2天=)1800元
dedDetailDTO.setDeductions(stringBuilder.toString()); dedDetailDTO.setDeductions(stringBuilder.toString());
dedDetailDTO.setCost(cost); dedDetailDTO.setCost(cost);
dedDetailDTO.setId(1); dedDetailDTO.setId(1);
dedDetailDTO.setStatusIndex(1); dedDetailDTO.setStatusIndex(1);
dedDetailDTO.setStatusName(detailName); dedDetailDTO.setStatusName(detailName);
} }
/** /**
* 获取驾驶人驾照 * 获取驾驶人驾照
* @param orderPageVo *
*/ * @param orderPageVo
public void getUserLicense(OrderPageVO orderPageVo) { */
OrderVehicleCrosstownDto orderVehicleCrosstownDto = new OrderVehicleCrosstownDto(); public void getUserLicense(OrderPageVO orderPageVo) {
orderVehicleCrosstownDto.setOrderId(orderPageVo.getId()); OrderVehicleCrosstownDto orderVehicleCrosstownDto = new OrderVehicleCrosstownDto();
orderVehicleCrosstownDto.setOrderNo(orderPageVo.getNo()); orderVehicleCrosstownDto.setOrderId(orderPageVo.getId());
List<OrderVehicleCrosstownDto> orderVehicleCrosstown = orderVehicleCrosstownBiz.selectByOrderId(orderVehicleCrosstownDto); orderVehicleCrosstownDto.setOrderNo(orderPageVo.getNo());
if (orderVehicleCrosstown != null && orderVehicleCrosstown.size() > 0) { List<OrderVehicleCrosstownDto> orderVehicleCrosstown = orderVehicleCrosstownBiz.selectByOrderId(orderVehicleCrosstownDto);
List<OrderUserLicense> orderUserLicenses = orderUserLicenseBiz.selectByIds(orderVehicleCrosstown.get(0).getUserLicenseId()).getData(); if (orderVehicleCrosstown != null && orderVehicleCrosstown.size() > 0) {
if (orderUserLicenses != null && orderUserLicenses.size() > 0) { List<OrderUserLicense> orderUserLicenses = orderUserLicenseBiz.selectByIds(orderVehicleCrosstown.get(0).getUserLicenseId()).getData();
orderVehicleCrosstownDto.setLicenseIdCard(orderUserLicenses.get(0).getLicenseIdCard()); if (orderUserLicenses != null && orderUserLicenses.size() > 0) {
orderVehicleCrosstownDto.setLicenseImg(orderUserLicenses.get(0).getLicenseImg()); orderVehicleCrosstownDto.setLicenseIdCard(orderUserLicenses.get(0).getLicenseIdCard());
orderVehicleCrosstownDto.setLicenseName(orderUserLicenses.get(0).getLicenseName()); orderVehicleCrosstownDto.setLicenseImg(orderUserLicenses.get(0).getLicenseImg());
orderVehicleCrosstownDto.setLicensePhone(orderUserLicenses.get(0).getLicensePhone()); orderVehicleCrosstownDto.setLicenseName(orderUserLicenses.get(0).getLicenseName());
} orderVehicleCrosstownDto.setLicensePhone(orderUserLicenses.get(0).getLicensePhone());
//设置违约明细 }
for (OrderVehicleCrosstownDto a : orderVehicleCrosstown) { //设置违约明细
if(a.getType() != CrosstownTypeEnum.DEPARTURE.getCode()) { for (OrderVehicleCrosstownDto a : orderVehicleCrosstown) {
if(StringUtils.isNotBlank(a.getViolateDetail())) { if (a.getType() != CrosstownTypeEnum.DEPARTURE.getCode()) {
orderPageVo.setDedDetailDTO(a.getViolateDetail()); if (StringUtils.isNotBlank(a.getViolateDetail())) {
} orderPageVo.setDedDetailDTO(a.getViolateDetail());
} }
} if (StringUtils.isNotBlank(a.getDelayVehicleDetail())) {
} orderPageVo.setDelayVehicleDetail(a.getDelayVehicleDetail());
if (StringUtils.isBlank(orderPageVo.getDedDetailDTO())) { }
updateCrossRefund(orderPageVo); }
} }
orderPageVo.setOrderVehicleCrosstownDto(orderVehicleCrosstownDto); }
} if (StringUtils.isBlank(orderPageVo.getDedDetailDTO()) || StringUtils.isBlank(orderPageVo.getDelayVehicleDetail())) {
updateCrossRefund(orderPageVo);
}
orderPageVo.setOrderVehicleCrosstownDto(orderVehicleCrosstownDto);
}
//后台获取用户驾驶信息 //后台获取用户驾驶信息
public void getUserLicense1(OrderPageVO orderPageVo) { public void getUserLicense1(OrderPageVO orderPageVo) {
OrderVehicleCrosstownDto orderVehicleCrosstownDto = new OrderVehicleCrosstownDto(); OrderVehicleCrosstownDto orderVehicleCrosstownDto = new OrderVehicleCrosstownDto();
orderVehicleCrosstownDto.setOrderId(orderPageVo.getId()); orderVehicleCrosstownDto.setOrderId(orderPageVo.getId());
orderVehicleCrosstownDto.setOrderNo(orderPageVo.getNo()); orderVehicleCrosstownDto.setOrderNo(orderPageVo.getNo());
List<OrderVehicleCrosstownDto> orderVehicleCrosstown = orderVehicleCrosstownBiz.selectByOrderId(orderVehicleCrosstownDto); List<OrderVehicleCrosstownDto> orderVehicleCrosstown = orderVehicleCrosstownBiz.selectByOrderId(orderVehicleCrosstownDto);
if (orderVehicleCrosstown != null && orderVehicleCrosstown.size() > 0) { if (orderVehicleCrosstown != null && orderVehicleCrosstown.size() > 0) {
List<OrderUserLicense> orderUserLicenses = orderUserLicenseBiz.selectByIds(orderVehicleCrosstown.get(0).getUserLicenseId()).getData(); List<OrderUserLicense> orderUserLicenses = orderUserLicenseBiz.selectByIds(orderVehicleCrosstown.get(0).getUserLicenseId()).getData();
if (orderUserLicenses != null && orderUserLicenses.size() > 0) { if (orderUserLicenses != null && orderUserLicenses.size() > 0) {
orderVehicleCrosstownDto.setLicenseIdCard(orderUserLicenses.get(0).getLicenseIdCard()); orderVehicleCrosstownDto.setLicenseIdCard(orderUserLicenses.get(0).getLicenseIdCard());
orderVehicleCrosstownDto.setLicenseImg(orderUserLicenses.get(0).getLicenseImg()); orderVehicleCrosstownDto.setLicenseImg(orderUserLicenses.get(0).getLicenseImg());
orderVehicleCrosstownDto.setLicenseName(orderUserLicenses.get(0).getLicenseName()); orderVehicleCrosstownDto.setLicenseName(orderUserLicenses.get(0).getLicenseName());
orderVehicleCrosstownDto.setLicensePhone(orderUserLicenses.get(0).getLicensePhone()); orderVehicleCrosstownDto.setLicensePhone(orderUserLicenses.get(0).getLicensePhone());
} }
//设置违约明细 //设置违约明细
for (OrderVehicleCrosstownDto a : orderVehicleCrosstown) { for (OrderVehicleCrosstownDto a : orderVehicleCrosstown) {
if(a.getType() != CrosstownTypeEnum.DEPARTURE.getCode()) { if (a.getType() != CrosstownTypeEnum.DEPARTURE.getCode()) {
if(StringUtils.isNotBlank(a.getViolateDetail())) { if (StringUtils.isNotBlank(a.getViolateDetail())) {
orderPageVo.setDedDetailDTO(a.getViolateDetail()); orderPageVo.setDedDetailDTO(a.getViolateDetail());
} }
} }
} }
} }
orderPageVo.setOrderVehicleCrosstownDto(orderVehicleCrosstownDto); orderPageVo.setOrderVehicleCrosstownDto(orderVehicleCrosstownDto);
} }
/** /**
* 获取驾驶人信息 * 获取驾驶人信息
* @param orderPageVo *
*/ * @param orderPageVo
public void getDriverInfo(OrderPageVO orderPageVo) { */
List<VehicleUserLicense> vehicleUserLicenses = Lists.newArrayList(); public void getDriverInfo(OrderPageVO orderPageVo) {
String myDriverIds = orderPageVo.getOrderRentVehicleDetail().getMyDriverIds(); List<VehicleUserLicense> vehicleUserLicenses = Lists.newArrayList();
if (StringUtils.isNotBlank(myDriverIds)) { String myDriverIds = orderPageVo.getOrderRentVehicleDetail().getMyDriverIds();
if (myDriverIds.contains(",")) { if (StringUtils.isNotBlank(myDriverIds)) {
String[] ids = myDriverIds.split(","); if (myDriverIds.contains(",")) {
try { String[] ids = myDriverIds.split(",");
//目前暂定一个驾驶人,后期需要更改再此更改 try {
RestResponse<VehicleUserLicense> restResponse = vehicleFeign.getOne(Integer.parseInt(ids[0])); //目前暂定一个驾驶人,后期需要更改再此更改
log.info(restResponse.getMessage()); RestResponse<VehicleUserLicense> restResponse = vehicleFeign.getOne(Integer.parseInt(ids[0]));
if (restResponse.getData() != null) { log.info(restResponse.getMessage());
vehicleUserLicenses.add(restResponse.getData()); if (restResponse.getData() != null) {
} vehicleUserLicenses.add(restResponse.getData());
} catch (Exception e) { }
log.error(e.getMessage(), e); } catch (Exception e) {
} log.error(e.getMessage(), e);
} else { }
try { } else {
vehicleUserLicenses.add(vehicleFeign.getOne(Integer.parseInt(myDriverIds.trim())).getData()); try {
} catch (Exception e) { vehicleUserLicenses.add(vehicleFeign.getOne(Integer.parseInt(myDriverIds.trim())).getData());
log.error(e.getMessage(), e); } catch (Exception e) {
} log.error(e.getMessage(), e);
} }
} }
orderPageVo.setVehicleUserLicenses(vehicleUserLicenses); }
} orderPageVo.setVehicleUserLicenses(vehicleUserLicenses);
}
/** /**
* 修改订单还车公司 * 修改订单还车公司
* @param orderRentVehicleDetail *
* @return * @param orderRentVehicleDetail
*/ * @return
public ObjectRestResponse save(OrderRentVehicleDetail orderRentVehicleDetail) { */
if (orderRentVehicleDetail == null || orderRentVehicleDetail.getId() == null) { public ObjectRestResponse save(OrderRentVehicleDetail orderRentVehicleDetail) {
return ObjectRestResponse.paramIsEmpty(); if (orderRentVehicleDetail == null || orderRentVehicleDetail.getId() == null) {
} return ObjectRestResponse.paramIsEmpty();
log.info("更新订单还车地点》》》 orderRentVehicleDetail = {}", orderRentVehicleDetail.toString()); }
UserDTO userDTO = getAdminUserInfo(); log.info("更新订单还车地点》》》 orderRentVehicleDetail = {}", orderRentVehicleDetail.toString());
if (userDTO == null) { UserDTO userDTO = getAdminUserInfo();
return ObjectRestResponse.createFailedResult(ResultCode.RSTOKEN_EXPIRED_CODE, ResultCode.getMsg(ResultCode.RSTOKEN_EXPIRED_CODE)); if (userDTO == null) {
} return ObjectRestResponse.createFailedResult(ResultCode.RSTOKEN_EXPIRED_CODE, ResultCode.getMsg(ResultCode.RSTOKEN_EXPIRED_CODE));
}
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
OrderRentVehicleDetail oldValue = orderRentVehicleBiz.selectById(orderRentVehicleDetail.getId()); OrderRentVehicleDetail oldValue = orderRentVehicleBiz.selectById(orderRentVehicleDetail.getId());
if(oldValue == null) { if (oldValue == null) {
return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc()); return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc());
} }
stringBuilder.append("修改订单和预定记录还车公司成功, 订单ID:"); stringBuilder.append("修改订单和预定记录还车公司成功, 订单ID:");
stringBuilder.append( oldValue.getOrderId()); stringBuilder.append(oldValue.getOrderId());
stringBuilder.append("; 原还车公司ID: "); stringBuilder.append("; 原还车公司ID: ");
stringBuilder.append(oldValue.getEndCompanyId()); stringBuilder.append(oldValue.getEndCompanyId());
stringBuilder.append("; 更新后还车公司ID: "); stringBuilder.append("; 更新后还车公司ID: ");
stringBuilder.append(orderRentVehicleDetail.getEndCompanyId()); stringBuilder.append(orderRentVehicleDetail.getEndCompanyId());
stringBuilder.append("; 操作人ID:"); stringBuilder.append("; 操作人ID:");
stringBuilder.append(userDTO.getId()); stringBuilder.append(userDTO.getId());
stringBuilder.append("; 操作人账号:"); stringBuilder.append("; 操作人账号:");
stringBuilder.append(userDTO.getUsername()); stringBuilder.append(userDTO.getUsername());
//添加修改记录实体 //添加修改记录实体
BookRecordUpdateLog bookRecordUpdateLog = new BookRecordUpdateLog(); BookRecordUpdateLog bookRecordUpdateLog = new BookRecordUpdateLog();
bookRecordUpdateLog.setBookRecordId(oldValue.getBookRecordId()); bookRecordUpdateLog.setBookRecordId(oldValue.getBookRecordId());
bookRecordUpdateLog.setOldRetCompanyId(oldValue.getEndCompanyId()); bookRecordUpdateLog.setOldRetCompanyId(oldValue.getEndCompanyId());
bookRecordUpdateLog.setNewRetCompanyId(orderRentVehicleDetail.getEndCompanyId()); bookRecordUpdateLog.setNewRetCompanyId(orderRentVehicleDetail.getEndCompanyId());
bookRecordUpdateLog.setOperaterId(userDTO.getId()); bookRecordUpdateLog.setOperaterId(userDTO.getId());
bookRecordUpdateLog.setOperaterName(userDTO.getName()); bookRecordUpdateLog.setOperaterName(userDTO.getName());
bookRecordUpdateLog.setOrderId(oldValue.getOrderId()); bookRecordUpdateLog.setOrderId(oldValue.getOrderId());
bookRecordUpdateLog.setCreateTime(new Date()); bookRecordUpdateLog.setCreateTime(new Date());
BeanUtil.copyProperties(orderRentVehicleDetail, oldValue, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true)); BeanUtil.copyProperties(orderRentVehicleDetail, oldValue, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
CompanyDetail companyDetail = vehicleFeign.getCompanyDetail(orderRentVehicleDetail.getEndCompanyId()).getData(); CompanyDetail companyDetail = vehicleFeign.getCompanyDetail(orderRentVehicleDetail.getEndCompanyId()).getData();
if(companyDetail != null) { if (companyDetail != null) {
oldValue.setEndCity(companyDetail.getAddrCity()); oldValue.setEndCity(companyDetail.getAddrCity());
oldValue.setEndAddr(companyDetail.detailAddr()); oldValue.setEndAddr(companyDetail.detailAddr());
} }
oldValue.setEndCompanyId(orderRentVehicleDetail.getEndCompanyId()); oldValue.setEndCompanyId(orderRentVehicleDetail.getEndCompanyId());
orderRentVehicleBiz.updateSelectiveByIdRe(oldValue); orderRentVehicleBiz.updateSelectiveByIdRe(oldValue);
ObjectRestResponse objectRestResponse = vehicleFeign.update(bookRecordUpdateLog); ObjectRestResponse objectRestResponse = vehicleFeign.update(bookRecordUpdateLog);
if (objectRestResponse!= null && objectRestResponse.getRel()) { if (objectRestResponse != null && objectRestResponse.getRel()) {
log.info(stringBuilder.toString()); log.info(stringBuilder.toString());
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
} }
return ObjectRestResponse.createFailedResult(1355, "修改失败!"); return ObjectRestResponse.createFailedResult(1355, "修改失败!");
} }
/** /**
* 获取订单详情,包含驾驶人信息,违约金等信息 * 获取订单详情,包含驾驶人信息,违约金等信息
* @param no *
* @return * @param no
*/ * @return
public ObjectRestResponse<OrderPageVO> getOrderDetail(String no) { */
OrderPageVO orderPageVo = mapper.getOrderDetail(no); public ObjectRestResponse<OrderPageVO> getOrderDetail(String no) {
if (orderPageVo == null) { OrderPageVO orderPageVo = mapper.getOrderDetail(no);
return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc()); if (orderPageVo == null) {
} return ObjectRestResponse.createFailedResult(ResCode.ORDER_IS_NOT_EXIST.getCode(), ResCode.ORDER_IS_NOT_EXIST.getDesc());
if (orderPageVo.getOrderRentVehicleDetail() != null) { }
if (orderPageVo.getStatus() == 4) { //未交车 if (orderPageVo.getOrderRentVehicleDetail() != null) {
if (orderPageVo.getStatus() == 4) { //未交车
// boolean flag = getTodayTime(orderPageVo.getOrderRentVehicleDetail().getStartTime()); // boolean flag = getTodayTime(orderPageVo.getOrderRentVehicleDetail().getStartTime());
// if (!flag) { // if (!flag) {
// return ObjectRestResponse.createFailedResult(3501, "今日不是交车日期"); // return ObjectRestResponse.createFailedResult(3501, "今日不是交车日期");
// } // }
getDriverInfo(orderPageVo); getDriverInfo(orderPageVo);
} else if (orderPageVo.getStatus() >= 5 || orderPageVo.getStatus() == -1) {//出行中 已交车 } else if (orderPageVo.getStatus() >= 5 || orderPageVo.getStatus() == -1) {//出行中 已交车
getDriverInfo(orderPageVo); getDriverInfo(orderPageVo);
getUserLicense(orderPageVo); getUserLicense(orderPageVo);
} }
RestResponse<Vehicle> restResponse = vehicleFeign.findById(orderPageVo.getOrderRentVehicleDetail().getVehicleId()); RestResponse<Vehicle> restResponse = vehicleFeign.findById(orderPageVo.getOrderRentVehicleDetail().getVehicleId());
if (restResponse.getData() != null) { if (restResponse.getData() != null) {
orderPageVo.setVehicalNumberPlat(restResponse.getData().getNumberPlate()); orderPageVo.setVehicalNumberPlat(restResponse.getData().getNumberPlate());
} }
} else if (orderPageVo.getOrderTourDetail() != null) { } else if (orderPageVo.getOrderTourDetail() != null) {
if(StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) { if (StringUtils.isNotBlank(orderPageVo.getOrderTourDetail().getTourUserIds())) {
List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData(); List<TourUser> list = tourFeign.getTourUsers(orderPageVo.getOrderTourDetail().getTourUserIds()).getData();
orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list); orderPageVo.getOrderTourDetail().setUserVoList(list == null || list.size() <= 0 ? new ArrayList<>() : list);
} }
} }
//设置保留金 //设置保留金
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData(); Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail()); BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER + "_" + DictionaryKey.ILLEGAL_RESERVE).getDetail());
orderPageVo.setIllegalReserve(illegalReserve); orderPageVo.setIllegalReserve(illegalReserve);
orderPageVo.setItems(orderItemBiz.selectList(new OrderItem(){{ orderPageVo.setItems(orderItemBiz.selectList(new OrderItem() {{
setOrderId(orderPageVo.getId()); setOrderId(orderPageVo.getId());
}})); }}));
return ObjectRestResponse.succ(orderPageVo); return ObjectRestResponse.succ(orderPageVo);
} }
/**
* 支付回调处理
*
* @param orderNo
* @param tradeNo
*/
@Transactional
public void payNotifyHandle(String orderNo, String tradeNo, Integer type, Integer payWay) {
OrderRentVehicleDetail orvd = new OrderRentVehicleDetail();
OrderTourDetail otd = new OrderTourDetail();
OrderMemberDetail omd = new OrderMemberDetail();
BaseOrder baseOrder = this.selectOne(new BaseOrder() {{
setNo(orderNo);
}});
if (OrderStatusEnum.ORDER_UNPAY.getCode().equals(baseOrder.getStatus()) && baseOrder.getHasPay().equals(SYS_FALSE)) {
BaseOrder updateOrder = new BaseOrder() {{
setId(baseOrder.getId());
setOutTradeNo(tradeNo);
setHasPay(SYS_TRUE);
setPayTime(System.currentTimeMillis());
setPayOrigin(type);
setPayWay(payWay);
setVersion(baseOrder.getVersion());
}};
//订单账款类
OrderAccountDetail oad = new OrderAccountDetail();
oad.setOriginOrderAmount(baseOrder.getGoodsAmount().subtract(baseOrder.getCouponAmount()));
//账单的的orderAmount 对应 的是商品金额
oad.setOrderAmount(baseOrder.getGoodsAmount().subtract(baseOrder.getCouponAmount()));
//如果是会员订单,则触发会员效益
if (OrderTypeEnum.MEMBER.getCode().equals(baseOrder.getType())) {
//直接设置订单完成
updateOrder.setStatus(OrderStatusEnum.ORDER_FINISH.getCode());
omd = orderMemberDetailBiz.selectOne(new OrderMemberDetail() {{
setOrderId(baseOrder.getId());
}});
//触发会员效益
UserMemberDTO userMemberDTO = new UserMemberDTO() {{
setUserId(baseOrder.getUserId());
setIsBind(ISBIND_BIND);
}};
userMemberDTO.setMemberLevel(omd.getMemberLevel());
userMemberDTO.setRentFreeDays(omd.getRentFreeNum());
userMemberDTO.setTotalNumber(omd.getRentFreeNum());
userMemberDTO.setDiscount(omd.getRebate());
ObjectRestResponse orr = userFeign.buyMember(userMemberDTO);
log.info("orr.getStatus() : " + orr.getStatus());
} else if (OrderTypeEnum.RENT_VEHICLE.getCode().equals(baseOrder.getType())) {
updateOrder.setStatus(OrderStatusEnum.ORDER_TOSTART.getCode());
orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail() {{
setOrderId(baseOrder.getId());
}});
//账款设置押金
oad.setOriginDepositAmount(orvd.getDeposit());
oad.setDepositAmount(orvd.getDeposit());
//车辆预定审核通过
RestResponse<Integer> result = vehicleFeign.rentProveVehicleBooking(orvd.getBookRecordId());
//确认免费天数
if (orvd.getFreeDays() > 0) {
userFeign.memberDays(baseOrder.getUserId(), orvd.getFreeDays(), UserFeign.MEMBER_DAYS_CONFIRM);
}
} else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) {
updateOrder.setStatus(OrderStatusEnum.ORDER_TOSTART.getCode());
otd = orderTourDetailBiz.selectOne(new OrderTourDetail() {{
setOrderId(baseOrder.getId());
}});
//站点总人数添加
tourFeign.updateTourGoodPersonNum(otd.getVerificationId(), TourFeign.TOTAL_PERSON, otd.getTotalNumber());
}
try {
this.updateSelectiveByIdRe(updateOrder);
//记录订单账款记录
Integer flag = orderAccountBiz.addOrderAccount(baseOrder.getId(), "订单支付", oad.getOriginOrderAmount().add(oad.getOriginDepositAmount()), oad.getOrderAmount().add(oad.getDepositAmount()), tradeNo, AccountTypeEnum.IN_ORDER_PAY.getCode(), JSONUtil.toJsonStr(oad));
} finally {
AppUserDTO appUserDTO = userFeign.userDetailById(baseOrder.getUserId()).getData();
/** //处理App用户提醒短信的发送
* 支付回调处理
*
* @param orderNo
* @param tradeNo
*/
@Transactional
public void payNotifyHandle(String orderNo, String tradeNo, Integer type, Integer payWay) {
OrderRentVehicleDetail orvd = new OrderRentVehicleDetail();
OrderTourDetail otd = new OrderTourDetail();
OrderMemberDetail omd = new OrderMemberDetail();
BaseOrder baseOrder = this.selectOne(new BaseOrder() {{
setNo(orderNo);
}});
if (OrderStatusEnum.ORDER_UNPAY.getCode().equals(baseOrder.getStatus()) && baseOrder.getHasPay().equals(SYS_FALSE)) {
BaseOrder updateOrder = new BaseOrder() {{
setId(baseOrder.getId());
setOutTradeNo(tradeNo);
setHasPay(SYS_TRUE);
setPayTime(System.currentTimeMillis());
setPayOrigin(type);
setPayWay(payWay);
setVersion(baseOrder.getVersion());
}};
//订单账款类
OrderAccountDetail oad = new OrderAccountDetail();
oad.setOriginOrderAmount(baseOrder.getGoodsAmount().subtract(baseOrder.getCouponAmount()));
//账单的的orderAmount 对应 的是商品金额
oad.setOrderAmount(baseOrder.getGoodsAmount().subtract(baseOrder.getCouponAmount()));
//如果是会员订单,则触发会员效益
if (OrderTypeEnum.MEMBER.getCode().equals(baseOrder.getType())) {
//直接设置订单完成
updateOrder.setStatus(OrderStatusEnum.ORDER_FINISH.getCode());
omd = orderMemberDetailBiz.selectOne(new OrderMemberDetail() {{
setOrderId(baseOrder.getId());
}});
//触发会员效益
UserMemberDTO userMemberDTO = new UserMemberDTO() {{
setUserId(baseOrder.getUserId());
setIsBind(ISBIND_BIND);
}};
userMemberDTO.setMemberLevel(omd.getMemberLevel());
userMemberDTO.setRentFreeDays(omd.getRentFreeNum());
userMemberDTO.setTotalNumber(omd.getRentFreeNum());
userMemberDTO.setDiscount(omd.getRebate());
ObjectRestResponse orr = userFeign.buyMember(userMemberDTO);
log.info("orr.getStatus() : " + orr.getStatus());
} else if (OrderTypeEnum.RENT_VEHICLE.getCode().equals(baseOrder.getType())) {
updateOrder.setStatus(OrderStatusEnum.ORDER_TOSTART.getCode());
orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail() {{
setOrderId(baseOrder.getId());
}});
//账款设置押金
oad.setOriginDepositAmount(orvd.getDeposit());
oad.setDepositAmount(orvd.getDeposit());
//车辆预定审核通过
RestResponse<Integer> result = vehicleFeign.rentProveVehicleBooking(orvd.getBookRecordId());
//确认免费天数
if (orvd.getFreeDays() > 0) {
userFeign.memberDays(baseOrder.getUserId(), orvd.getFreeDays(), UserFeign.MEMBER_DAYS_CONFIRM);
}
} else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) {
updateOrder.setStatus(OrderStatusEnum.ORDER_TOSTART.getCode());
otd = orderTourDetailBiz.selectOne(new OrderTourDetail() {{
setOrderId(baseOrder.getId());
}});
//站点总人数添加
tourFeign.updateTourGoodPersonNum(otd.getVerificationId(), TourFeign.TOTAL_PERSON, otd.getTotalNumber());
}
try {
this.updateSelectiveByIdRe(updateOrder);
//记录订单账款记录
Integer flag = orderAccountBiz.addOrderAccount(baseOrder.getId(), "订单支付", oad.getOriginOrderAmount().add(oad.getOriginDepositAmount()), oad.getOrderAmount().add(oad.getDepositAmount()), tradeNo, AccountTypeEnum.IN_ORDER_PAY.getCode(), JSONUtil.toJsonStr(oad));
} finally {
AppUserDTO appUserDTO = userFeign.userDetailById(baseOrder.getUserId()).getData();
//处理App用户提醒短信的发送
// orderMsgBiz.handelAppUserMsg(orvd, omd, baseOrder, appUserDTO); // orderMsgBiz.handelAppUserMsg(orvd, omd, baseOrder, appUserDTO);
orderMsgBiz.handelMsgPayNew(orvd, otd, omd, baseOrder, appUserDTO); orderMsgBiz.handelMsgPayNew(orvd, otd, omd, baseOrder, appUserDTO);
//处理后台用户提醒短信的发送 //处理后台用户提醒短信的发送
// orderMsgBiz.handelBgUserMsg4Pay(orvd, baseOrder, appUserDTO, OrderMsgBiz.RENT_PAY); // orderMsgBiz.handelBgUserMsg4Pay(orvd, baseOrder, appUserDTO, OrderMsgBiz.RENT_PAY);
sendOrderMq(orvd, otd, omd, baseOrder, OrderMQDTO.ORDER_PAY); sendOrderMq(orvd, otd, omd, baseOrder, OrderMQDTO.ORDER_PAY);
if(OrderTypeEnum.MEMBER.getCode().equals(baseOrder.getType())) { if (OrderTypeEnum.MEMBER.getCode().equals(baseOrder.getType())) {
sendOrderMq(orvd, otd, omd, baseOrder, OrderMQDTO.ORDER_FINISH); sendOrderMq(orvd, otd, omd, baseOrder, OrderMQDTO.ORDER_FINISH);
} }
} }
} else { } else {
log.error(" order has payed , orderNo:{}, tradeNo:{} ", orderNo, tradeNo); log.error(" order has payed , orderNo:{}, tradeNo:{} ", orderNo, tradeNo);
} }
} }
public void sendOrderMq(OrderRentVehicleDetail orvd, OrderTourDetail otd, OrderMemberDetail omd, BaseOrder baseOrder, Integer sign) {
//发送队列消息
OrderMQDTO orderMQDTO = BeanUtil.toBean(baseOrder, OrderMQDTO.class);
orderMQDTO.setOrderRentVehicleDetail(orvd);
orderMQDTO.setOrderTourDetail(otd);
orderMQDTO.setOrderMemberDetail(omd);
//获取item public void sendOrderMq(OrderRentVehicleDetail orvd, OrderTourDetail otd, OrderMemberDetail omd, BaseOrder baseOrder, Integer sign) {
orderMQDTO.setItems(orderItemBiz.selectList(new OrderItem() {{ //发送队列消息
setOrderId(baseOrder.getId()); OrderMQDTO orderMQDTO = BeanUtil.toBean(baseOrder, OrderMQDTO.class);
}})); orderMQDTO.setOrderRentVehicleDetail(orvd);
orderMQDTO.setOrderTourDetail(otd);
orderMQDTO.setOrderMemberDetail(omd);
sendQueue(orderMQDTO, sign); //获取item
} orderMQDTO.setItems(orderItemBiz.selectList(new OrderItem() {{
setOrderId(baseOrder.getId());
}}));
@Override sendQueue(orderMQDTO, sign);
public void updateSelectiveById(BaseOrder entity) { }
super.updateSelectiveById(entity);
}
/** @Override
* 更新(不成功抛异常) public void updateSelectiveById(BaseOrder entity) {
* super.updateSelectiveById(entity);
* @param baseOrder }
* @return
*/
public BaseOrder updateSelectiveByIdReT(BaseOrder baseOrder) {
return updateSelectiveByIdReT(baseOrder, false);
}
/** /**
* 更新(不成功抛异常) * 更新(不成功抛异常)
* *
* @param baseOrder * @param baseOrder
* @return * @return
*/ */
public BaseOrder updateSelectiveByIdReT(BaseOrder baseOrder, boolean needVersion) { public BaseOrder updateSelectiveByIdReT(BaseOrder baseOrder) {
if (needVersion) { return updateSelectiveByIdReT(baseOrder, false);
baseOrder.setVersion(selectById(baseOrder.getId()).getVersion()); }
}
if (updateSelectiveByIdRe(baseOrder) > 0) {
return selectById(baseOrder.getId());
} else {
log.error(StrUtil.format("数据更新失败:baseOrder: {}", JSONUtil.toJsonStr(baseOrder)));
throw new BaseException(ResultCode.DB_OPERATION_FAIL_CODE);
}
}
/**
* 更新(不成功抛异常)
*
* @param baseOrder
* @return
*/
public BaseOrder updateSelectiveByIdReT(BaseOrder baseOrder, boolean needVersion) {
if (needVersion) {
baseOrder.setVersion(selectById(baseOrder.getId()).getVersion());
}
if (updateSelectiveByIdRe(baseOrder) > 0) {
return selectById(baseOrder.getId());
} else {
log.error(StrUtil.format("数据更新失败:baseOrder: {}", JSONUtil.toJsonStr(baseOrder)));
throw new BaseException(ResultCode.DB_OPERATION_FAIL_CODE);
}
}
// /** // /**
...@@ -834,86 +843,94 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements ...@@ -834,86 +843,94 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper, BaseOrder> implements
// } // }
// } // }
public boolean getTodayTime(Long time) { public boolean getTodayTime(Long time) {
Long startTime = getDayStart(); Long startTime = getDayStart();
if (time >= startTime && time <= startTime + 24 * 60 * 60 * 1000 - 1) { if (time >= startTime && time <= startTime + 24 * 60 * 60 * 1000 - 1) {
return true; return true;
} }
return false; return false;
} }
public static Long getDayStart() { public static Long getDayStart() {
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset(); long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();
return zero; return zero;
} }
private void sendQueue(OrderMQDTO orderMQDTO, Integer sign) { private void sendQueue(OrderMQDTO orderMQDTO, Integer sign) {
try { try {
orderMQDTO.setSign(sign); orderMQDTO.setSign(sign);
SendMsgDTO sendMsgDTO = new SendMsgDTO(){{ SendMsgDTO sendMsgDTO = new SendMsgDTO() {{
setExchange(ORDER_TOPIC); setExchange(ORDER_TOPIC);
}}; }};
sendMsgDTO.setJson(JSONUtil.toJsonStr(orderMQDTO)); sendMsgDTO.setJson(JSONUtil.toJsonStr(orderMQDTO));
switch (sign) { switch (sign) {
case 2: case 2:
sendMsgDTO.setRoutKey(KEY_ORDER_CANCEL); sendMsgDTO.setRoutKey(KEY_ORDER_CANCEL);
break; break;
case 4: case 4:
sendMsgDTO.setRoutKey(KEY_ORDER_PAY); sendMsgDTO.setRoutKey(KEY_ORDER_PAY);
break; break;
case 6: case 6:
sendMsgDTO.setRoutKey(KEY_ORDER_FINLISH); sendMsgDTO.setRoutKey(KEY_ORDER_FINLISH);
break; break;
case 101: case 101:
sendMsgDTO.setRoutKey(KEY_ORDER_PART_DEPOSIT); sendMsgDTO.setRoutKey(KEY_ORDER_PART_DEPOSIT);
break; break;
default: default:
break; break;
} }
mqSenderFeign.postSendMessage(sendMsgDTO); mqSenderFeign.postSendMessage(sendMsgDTO);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
public Query initQuery(String no) { public Query initQuery(String no) {
QueryOrderDetailDTO qodd = new QueryOrderDetailDTO(); QueryOrderDetailDTO qodd = new QueryOrderDetailDTO();
//qodd.setCrtUser(Integer.valueOf(BaseContextHandler.getUserID())); //qodd.setCrtUser(Integer.valueOf(BaseContextHandler.getUserID()));
qodd.setUserId(Integer.valueOf(BaseContextHandler.getUserID())); qodd.setUserId(Integer.valueOf(BaseContextHandler.getUserID()));
qodd.setNo(no); qodd.setNo(no);
qodd.setLimit(1); qodd.setLimit(1);
qodd.setPage(1); qodd.setPage(1);
Query query = new Query(qodd); Query query = new Query(qodd);
return query; return query;
} }
@Override public Query initBgQuery(String no) {
public UserFeign getUserFeign() { Query query = initQuery(no);
return userFeign; query.put("crtUser", null);
} query.put("userId", null);
return query;
}
/** @Override
* 订单查询类 public UserFeign getUserFeign() {
*/ return userFeign;
@Data }
public static class QueryOrderDetailDTO extends QueryOrderDTO {
private String no;
}
/** /**
* 获取退还优惠卷 * 订单查询类
* @param orderId */
*/ @Data
public List<Coupon> getReturnCouponByOrderId(Integer orderId) { public static class QueryOrderDetailDTO extends QueryOrderDTO {
BaseOrder baseOrder = mapper.selectByPrimaryKey(orderId); private String no;
String backCoupon = baseOrder.getBackCoupon(); }
if (StringUtils.isNotBlank(backCoupon)) {
String[] couponArray = backCoupon.split(","); /**
return activityFeign.couponsByTickerNoList(Lists.newArrayList(couponArray)); * 获取退还优惠卷
} *
return Lists.newArrayList(); * @param orderId
} */
public List<Coupon> getReturnCouponByOrderId(Integer orderId) {
BaseOrder baseOrder = mapper.selectByPrimaryKey(orderId);
String backCoupon = baseOrder.getBackCoupon();
if (StringUtils.isNotBlank(backCoupon)) {
String[] couponArray = backCoupon.split(",");
return activityFeign.couponsByTickerNoList(Lists.newArrayList(couponArray));
}
return Lists.newArrayList();
}
public List<OrderDTO> selectOrdersByTypeAndTime(List<Integer> types, Integer hasPay, Date startDate, Date endDate) { public List<OrderDTO> selectOrdersByTypeAndTime(List<Integer> types, Integer hasPay, Date startDate, Date endDate) {
List<OrderDTO> orderDTOS = mapper.selectOrdersByTypeAndTime(types,hasPay,startDate,endDate); List<OrderDTO> orderDTOS = mapper.selectOrdersByTypeAndTime(types,hasPay,startDate,endDate);
......
...@@ -31,6 +31,7 @@ import com.xxfc.platform.order.pojo.mq.OrderMQDTO; ...@@ -31,6 +31,7 @@ import com.xxfc.platform.order.pojo.mq.OrderMQDTO;
import com.xxfc.platform.order.pojo.order.VehicleItemDTO; import com.xxfc.platform.order.pojo.order.VehicleItemDTO;
import com.xxfc.platform.order.pojo.price.CancelStartedVO; import com.xxfc.platform.order.pojo.price.CancelStartedVO;
import com.xxfc.platform.order.pojo.price.CostDetailExtend; import com.xxfc.platform.order.pojo.price.CostDetailExtend;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.universal.constant.DictionaryKey; import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary; import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign; import com.xxfc.platform.universal.feign.ThirdFeign;
...@@ -108,8 +109,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -108,8 +109,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
* @param orderViolateCoverAmount 订单违约金覆盖值 * @param orderViolateCoverAmount 订单违约金覆盖值
* @param depositViolateCoverAmount 押金违约金覆盖值 * @param depositViolateCoverAmount 押金违约金覆盖值
*/ */
public BigDecimal rentRefundProcessCancel(BaseOrder baseOrder, BigDecimal orderDeductSource, Long timeLag, String dicParentKey, BigDecimal depositAmount, BigDecimal depositDeductSource public BigDecimal rentRefundProcessCancel(BaseOrder baseOrder, BigDecimal orderDeductSource, Long timeLag
, OrderAccountDetail oad, BigDecimal topAmount, BigDecimal orderViolateCoverAmount, BigDecimal depositViolateCoverAmount) { , String dicParentKey, BigDecimal depositAmount, BigDecimal depositDeductSource
, OrderAccountDetail oad, BigDecimal topAmount, BigDecimal orderViolateCoverAmount, BigDecimal depositViolateCoverAmount
, Boolean noDeduct) {
//原来退款 和 最终退款 //原来退款 和 最终退款
BigDecimal originalRefundAmount = BigDecimal.ZERO; BigDecimal originalRefundAmount = BigDecimal.ZERO;
BigDecimal refundAmount = BigDecimal.ZERO; BigDecimal refundAmount = BigDecimal.ZERO;
...@@ -126,6 +129,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -126,6 +129,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
if(null != orderDeductSource && BigDecimal.ZERO.compareTo(orderDeductSource) < 0) { if(null != orderDeductSource && BigDecimal.ZERO.compareTo(orderDeductSource) < 0) {
BigDecimal orderDeductAmount = calculateDeduction(orderDeductSource, timeLag, dicParentKey, orderRefundDescBuilder); BigDecimal orderDeductAmount = calculateDeduction(orderDeductSource, timeLag, dicParentKey, orderRefundDescBuilder);
//如果属于免扣费情况
if(noDeduct) {
orderDeductAmount = BigDecimal.ZERO;
orderRefundDescBuilder = new StringBuilder("");
}
orderDeductAmount = orderDeductAmount.setScale(2, RoundingMode.HALF_UP); orderDeductAmount = orderDeductAmount.setScale(2, RoundingMode.HALF_UP);
if(null != orderViolateCoverAmount) { if(null != orderViolateCoverAmount) {
orderDeductAmount = orderViolateCoverAmount; orderDeductAmount = orderViolateCoverAmount;
...@@ -159,6 +167,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -159,6 +167,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
if(null != depositDeductSource && BigDecimal.ZERO.compareTo(depositDeductSource) < 0) { if(null != depositDeductSource && BigDecimal.ZERO.compareTo(depositDeductSource) < 0) {
//通过原扣除款 计算剩余款 //通过原扣除款 计算剩余款
BigDecimal depositDeductAmount = calculateDeduction(depositDeductSource, timeLag, dicParentKey, depositRefundDescBuilder); BigDecimal depositDeductAmount = calculateDeduction(depositDeductSource, timeLag, dicParentKey, depositRefundDescBuilder);
//如果属于免扣费情况
if(noDeduct) {
depositDeductAmount = BigDecimal.ZERO;
depositRefundDescBuilder = new StringBuilder("");
}
depositDeductAmount = depositDeductAmount.setScale(2, RoundingMode.HALF_UP); depositDeductAmount = depositDeductAmount.setScale(2, RoundingMode.HALF_UP);
if(null != orderViolateCoverAmount) { if(null != orderViolateCoverAmount) {
depositDeductAmount = orderViolateCoverAmount; depositDeductAmount = orderViolateCoverAmount;
...@@ -428,6 +441,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -428,6 +441,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
); );
} }
//还车扣除款 剩余的 钱,再减去违章预备金
oad.getDeductions().add(
initDeduction(illegalReserve, "违章保证金", DeductionTypeEnum.VIOLATE_TRAFFIC_KEEP, OrderAccountDeduction.ORIGIN_DEPOSIT)
);
//剩余押金 = 押金 - 违章保证金 - 定损金额 //剩余押金 = 押金 - 违章保证金 - 定损金额
oad.setDepositAmount(oad.getDepositAmount().subtract(illegalReserve).subtract(csv.getDamagesAmount())); oad.setDepositAmount(oad.getDepositAmount().subtract(illegalReserve).subtract(csv.getDamagesAmount()));
...@@ -437,6 +455,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -437,6 +455,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
csv.setViolateDesc(""); csv.setViolateDesc("");
//处理更改之后的违约金及描述 //处理更改之后的违约金及描述
handleCrosstownDetail(crosstown, oad, csv); handleCrosstownDetail(crosstown, oad, csv);
handleCrosstownDelayDetail(crosstown, oad);
if(StrUtil.isBlank(csv.getViolateDesc())) { if(StrUtil.isBlank(csv.getViolateDesc())) {
csv.setViolateDesc(inProgressVO.getViolateDesc()); csv.setViolateDesc(inProgressVO.getViolateDesc());
...@@ -451,11 +470,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -451,11 +470,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
String refundDesc = "退还车辆押金:"+ refundAmont.toString(); String refundDesc = "退还车辆押金:"+ refundAmont.toString();
//还车扣除款 剩余的 钱,再减去违章预备金
oad.getDeductions().add(
initDeduction(illegalReserve, "违章保证金", DeductionTypeEnum.VIOLATE_TRAFFIC_KEEP, OrderAccountDeduction.ORIGIN_DEPOSIT)
);
refundTrigger(orderMQDTO, orderMQDTO.getOrderRentVehicleDetail(), illegalReserve, originalRefundAmount, refundAmont, refundDesc, RefundStatusEnum.RESIDUE_ILLEGAL.getCode(), AccountTypeEnum.OUT_PART_DEPOSIT, oad); refundTrigger(orderMQDTO, orderMQDTO.getOrderRentVehicleDetail(), illegalReserve, originalRefundAmount, refundAmont, refundDesc, RefundStatusEnum.RESIDUE_ILLEGAL.getCode(), AccountTypeEnum.OUT_PART_DEPOSIT, oad);
//修改押金退还记录状态 //修改押金退还记录状态
...@@ -507,13 +521,13 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -507,13 +521,13 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
csv.setOverAmountList(inProgressVO.getOverAmountList()); csv.setOverAmountList(inProgressVO.getOverAmountList());
csv.setViolateAmountList(inProgressVO.getViolateAmountList()); csv.setViolateAmountList(inProgressVO.getViolateAmountList());
if(csv.getUsedDayNum() == orderMQDTO.getOrderRentVehicleDetail().getDayNum()) { if(csv.getUsedDayNum() == orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()) {
csv.setType(CostDetailExtend.FINLISH_ONTIME); csv.setType(CostDetailExtend.FINLISH_ONTIME);
}else if(csv.getUsedDayNum() > orderMQDTO.getOrderRentVehicleDetail().getDayNum()){ }else if(csv.getUsedDayNum() > orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()){
csv.setType(CostDetailExtend.FINLISH_DELAY); csv.setType(CostDetailExtend.FINLISH_DELAY);
}else if(csv.getUsedDayNum() < orderMQDTO.getOrderRentVehicleDetail().getDayNum()){ }else if(csv.getUsedDayNum() < orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()){
csv.setType(CostDetailExtend.FINLISH_ADVANCE); csv.setType(CostDetailExtend.FINLISH_ADVANCE);
} }
...@@ -582,15 +596,58 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -582,15 +596,58 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
} }
} }
private void handleCrosstownDelayDetail(OrderVehicleCrosstown crosstown, OrderAccountDetail oad) {
try{
if(null != crosstown.getDelayVehicleDetail()) {
//修改代码
List<DedDetailDTO> vios = JSONUtil.toList(JSONUtil.parseArray(crosstown.getDelayVehicleDetail()), DedDetailDTO.class);
for(DedDetailDTO vio : vios) {
if(OrderViolateEnum.DELAY_VEHICLE.getCode().equals(vio.getType())) {
Boolean flag = Boolean.FALSE;
for(OrderAccountDeduction deduction : oad.getDeductions()) {
if(DeductionTypeEnum.OTHER_DELAY_SAFE.getCode().equals(deduction.getType())) {
deduction.setName(vio.getDeductions());
deduction.setAmount(vio.getCost());
//修改归还押金金额
resetDeposit(oad);
flag = Boolean.TRUE;
break;
}
}
//如果没有修改,则添加
if(Boolean.FALSE.equals(flag)) {
OrderAccountDeduction oadNew = initDeduction(vio.getCost(), vio.getDeductions(), DeductionTypeEnum.OTHER_DELAY_SAFE, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(oadNew);
//修改归还押金金额
resetDeposit(oad);
}
}
}
}
}catch (Exception e) {
log.error("crosstown.getDelayVehicleDetail() crosstown id :"+crosstown.getId() +" 转换失败");
}
}
private void resetDeposit(OrderAccountDetail oad) {
//修改归还押金金额
BigDecimal toDeduction = oad.getDeductions().parallelStream().map(OrderAccountDeduction::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
oad.setDepositAmount(oad.getOriginDepositAmount().subtract(toDeduction));
}
private void handleViolateDetail(DeductionTypeEnum dte, OrderAccountDetail oad, DedDetailDTO vio, CancelStartedVO csv) { private void handleViolateDetail(DeductionTypeEnum dte, OrderAccountDetail oad, DedDetailDTO vio, CancelStartedVO csv) {
Boolean flag = Boolean.FALSE; Boolean flag = Boolean.FALSE;
for(OrderAccountDeduction deduction : oad.getDeductions()) { for(OrderAccountDeduction deduction : oad.getDeductions()) {
if(dte.getCode().equals(deduction.getType())) { if(dte.getCode().equals(deduction.getType())) {
deduction.setName(vio.getDeductions()); deduction.setName(vio.getDeductions());
BigDecimal diff = vio.getCost().subtract(deduction.getAmount()); BigDecimal diff = vio.getCost().subtract(deduction.getAmount());
//修改归还押金金额
oad.setDepositAmount(oad.getDepositAmount().subtract(diff));
deduction.setAmount(vio.getCost()); deduction.setAmount(vio.getCost());
//修改归还押金金额
resetDeposit(oad);
//设置订单明细参数 //设置订单明细参数
csv.setViolateAmount(csv.getViolateAmount().add(diff)); csv.setViolateAmount(csv.getViolateAmount().add(diff));
...@@ -605,7 +662,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -605,7 +662,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
OrderAccountDeduction oadNew = initDeduction(vio.getCost(), vio.getDeductions(), dte, OrderAccountDeduction.ORIGIN_DEPOSIT); OrderAccountDeduction oadNew = initDeduction(vio.getCost(), vio.getDeductions(), dte, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(oadNew); oad.getDeductions().add(oadNew);
//修改归还押金金额 //修改归还押金金额
oad.setDepositAmount(oad.getDepositAmount().subtract(oadNew.getAmount())); resetDeposit(oad);
//设置订单明细参数 //设置订单明细参数
csv.setViolateAmount(csv.getViolateAmount().add(oadNew.getAmount())); csv.setViolateAmount(csv.getViolateAmount().add(oadNew.getAmount()));
...@@ -613,7 +670,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> { ...@@ -613,7 +670,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
} }
} }
/** /**
* 获取每日订单账目,用于统计 * 获取每日订单账目,用于统计
* @param term * @param term
......
package com.xxfc.platform.order.biz; 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 org.springframework.stereotype.Service;
import com.xxfc.platform.order.entity.OrderLog; import com.xxfc.platform.order.entity.OrderLog;
...@@ -14,5 +17,22 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz; ...@@ -14,5 +17,22 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz;
* @date 2019-07-23 17:33:06 * @date 2019-07-23 17:33:06
*/ */
@Service @Service
@Slf4j
public class OrderLogBiz extends BaseBiz<OrderLogMapper,OrderLog> { 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));
}};
insertSelectiveRe(orderLog);
}catch (Exception e) {
log.error(e.getMessage(), e);
}
}
} }
\ No newline at end of file
...@@ -348,6 +348,18 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp ...@@ -348,6 +348,18 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
} }
} }
} }
//延期扣除费用
if (StringUtils.isNotBlank(orderVehicleCrosstownDto.getDelayVehicleDetail())) {
JSONArray jsonArray = JSONArray.parseArray(orderVehicleCrosstownDto.getDelayVehicleDetail());
if (jsonArray != null && jsonArray.size() > 0) {
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = JSONObject.parseObject(jsonArray.get(i).toString());
if (jsonObject.getString("cost") != null) {
cost += Double.parseDouble(jsonObject.getString("cost"));
}
}
}
}
orderVehicleCrosstownDto.setUserLicenseImg(orderVehicleCrosstownDto.getLicenseImg()); orderVehicleCrosstownDto.setUserLicenseImg(orderVehicleCrosstownDto.getLicenseImg());
//扣除费用,每次都是重新计算 //扣除费用,每次都是重新计算
BigDecimal amount = new BigDecimal(cost.toString()).divide(new BigDecimal("1"), 2, BigDecimal.ROUND_UP); BigDecimal amount = new BigDecimal(cost.toString()).divide(new BigDecimal("1"), 2, BigDecimal.ROUND_UP);
......
...@@ -12,6 +12,7 @@ import com.xxfc.platform.app.feign.ConfigFeign; ...@@ -12,6 +12,7 @@ import com.xxfc.platform.app.feign.ConfigFeign;
import com.xxfc.platform.order.biz.BaseOrderBiz; import com.xxfc.platform.order.biz.BaseOrderBiz;
import com.xxfc.platform.order.biz.OrderAccountBiz; import com.xxfc.platform.order.biz.OrderAccountBiz;
import com.xxfc.platform.order.biz.OrderItemBiz; 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.DeductionTypeEnum;
import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum; import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum; import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
...@@ -25,6 +26,7 @@ import com.xxfc.platform.order.pojo.calculate.InProgressVO; ...@@ -25,6 +26,7 @@ import com.xxfc.platform.order.pojo.calculate.InProgressVO;
import com.xxfc.platform.order.pojo.calculate.OrderRefundPriceVO; import com.xxfc.platform.order.pojo.calculate.OrderRefundPriceVO;
import com.xxfc.platform.order.pojo.order.OrderPageVO; import com.xxfc.platform.order.pojo.order.OrderPageVO;
import com.xxfc.platform.order.pojo.order.VehicleItemDTO; import com.xxfc.platform.order.pojo.order.VehicleItemDTO;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.universal.constant.DictionaryKey; import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary; import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign; import com.xxfc.platform.universal.feign.ThirdFeign;
...@@ -80,7 +82,10 @@ public class OrderCalculateBiz { ...@@ -80,7 +82,10 @@ public class OrderCalculateBiz {
@Autowired @Autowired
BaseOrderBiz baseOrderBiz; 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 refundAmount = BigDecimal.ZERO;
BigDecimal consumeAmount = BigDecimal.ZERO; BigDecimal consumeAmount = BigDecimal.ZERO;
BigDecimal topViolateAmount = BigDecimal.ZERO; BigDecimal topViolateAmount = BigDecimal.ZERO;
...@@ -103,7 +108,21 @@ public class OrderCalculateBiz { ...@@ -103,7 +108,21 @@ public class OrderCalculateBiz {
InProgressVO inProgressVO = new InProgressVO(); InProgressVO inProgressVO = new InProgressVO();
inProgressVO.setUsedDays(useDays); inProgressVO.setUsedDays(useDays);
inProgressVO.setUsedAmount(vehicleItemDTO.getUsedAmount(useDays));
//处理不记免赔违约金
if(useDays > 0) {
inProgressVO.setDelayAddPriceVO(orvd.obtainDelayAddDetail());
OrderAccountDeduction violateDeduction = orderAccountBiz.initDeduction(orvd.obtainDelayAddDetail().getDelayDamageSafeAmount(), "", DeductionTypeEnum.OTHER_DELAY_SAFE, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(violateDeduction);
}
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); Integer useDaysMapFreeDays = vehicleItemDTO.mapFreeDays(useDays);
...@@ -113,10 +132,11 @@ public class OrderCalculateBiz { ...@@ -113,10 +132,11 @@ public class OrderCalculateBiz {
//待返还的优惠券编号 //待返还的优惠券编号
List<String> backCouponNos = Lists.newArrayList(); List<String> backCouponNos = Lists.newArrayList();
//剩余天数 //剩余天数
Integer residueDays = vehicleItemDTO.getTotalNum() - useDays; Integer realResidueDays = orvd.obtainRealDayNum() - useDays;
//过了出发时间取消订单 ,优先使用免费天数 //过了出发时间取消订单 ,优先使用免费天数
if(backFreeDays <= 0) { if(backFreeDays <= 0) {
//设置免费天数 //设置免费天数
inProgressVO.setUsedfreeDays(freeDays); inProgressVO.setUsedfreeDays(freeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(null)); inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(null));
...@@ -169,20 +189,36 @@ public class OrderCalculateBiz { ...@@ -169,20 +189,36 @@ public class OrderCalculateBiz {
inProgressVO.setConsumeAmount(consumeAmount); inProgressVO.setConsumeAmount(consumeAmount);
refundAmount = handleConsumeAmount(oad, refundAmount, consumeAmount, goodsRealAmount, inProgressVO); 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 { }else {
//设置免费天数 //设置免费天数
inProgressVO.setUsedfreeDays(useDaysMapFreeDays); inProgressVO.setUsedfreeDays(useDaysMapFreeDays);
inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(useDays)); inProgressVO.setUsedFreeDaysAmount(vehicleItemDTO.getFreeAmount(useDays));
//返回剩余免费天数,返回优惠券,订单款
//修改bug,不需要提前加, 已在handleConsumeAmount方法中添加
// refundAmount = refundAmount.add(goodsRealAmount);
// inProgressVO.setBackFreeDays(backFreeDays);
//融入日期价格 //融入日期价格
Integer trueBackFreeDays = 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())) { if(StrUtil.isNotBlank(baseOrder.getCouponTickerNos())) {
...@@ -200,29 +236,37 @@ public class OrderCalculateBiz { ...@@ -200,29 +236,37 @@ public class OrderCalculateBiz {
inProgressVO.setRefundOrderAmount(refundAmount); inProgressVO.setRefundOrderAmount(refundAmount);
inProgressVO.setBackCoupons(backCouponNos); inProgressVO.setBackCoupons(backCouponNos);
List<VMCalendarPriceCostDTO> realVmcpds = Convert.toList(VMCalendarPriceCostDTO.class, vmcpds);
//查看是否有增加的延期天数-->添加延期的费用列表
if(orvd.getDelayAddDays() > 0) {
realVmcpds.addAll(orvd.obtainDelayAddDetail().getDelayAmountList());
}
//计算违约金 //计算违约金
//residueDays * 身份价格 //residueDays * 身份价格
if(residueDays > 0) { if(realResidueDays > 0) { //提前还车
//设置消耗费用列表 //设置消耗费用列表
for(int i = 0; i < useDays; i++) { 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{}天" //"{}元/天 x{}天"
BigDecimal residueAmount = BigDecimal.ZERO; BigDecimal residueAmount = BigDecimal.ZERO;
for(int i = useDays; i < vehicleItemDTO.getTotalNum(); i++) { for(int i = useDays; i < realVmcpds.size(); i++) {
residueAmount = residueAmount.add(vmcpds.get(i).getPrice()); residueAmount = residueAmount.add(realVmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(vmcpds.get(i)); inProgressVO.getViolateAmountList().add(realVmcpds.get(i));
} }
String violateDesc = StrUtil.format("{}元", residueAmount.toString()); String violateDesc = StrUtil.format("{}元", residueAmount.toString());
if(residueDays >= 2) { if(realResidueDays >= 2) {
residueDays = 2; realResidueDays = 2;
residueAmount = BigDecimal.ZERO; residueAmount = BigDecimal.ZERO;
inProgressVO.setViolateAmountList(CollUtil.newArrayList()); inProgressVO.setViolateAmountList(CollUtil.newArrayList());
for(int i = useDays; i < (useDays + residueDays); i++) { for(int i = useDays; i < (useDays + realResidueDays); i++) {
residueAmount = residueAmount.add(vmcpds.get(i).getPrice()); residueAmount = residueAmount.add(realVmcpds.get(i).getPrice());
inProgressVO.getViolateAmountList().add(vmcpds.get(i)); inProgressVO.getViolateAmountList().add(realVmcpds.get(i));
} }
violateDesc += StrUtil.format("(封顶{}元)", residueAmount); violateDesc += StrUtil.format("(封顶{}元)", residueAmount);
} }
...@@ -231,18 +275,21 @@ public class OrderCalculateBiz { ...@@ -231,18 +275,21 @@ public class OrderCalculateBiz {
inProgressVO.setViolateDesc(" 提前还车违约金:"+ violateDesc); inProgressVO.setViolateDesc(" 提前还车违约金:"+ violateDesc);
OrderAccountDeduction violateDeduction = orderAccountBiz.initDeduction(inProgressVO.getViolateAmount(), violateDesc, DeductionTypeEnum.VIOLATE_ADVANCE, OrderAccountDeduction.ORIGIN_DEPOSIT); OrderAccountDeduction violateDeduction = orderAccountBiz.initDeduction(inProgressVO.getViolateAmount(), violateDesc, DeductionTypeEnum.VIOLATE_ADVANCE, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(violateDeduction); oad.getDeductions().add(violateDeduction);
}else if(residueDays < 0 && !isCancel){ }else if (realResidueDays.equals(0)) { //准时还车
//设置消耗费用列表
useAmountList.addAll(Convert.toList(VMCalendarPriceCostDTO.class, realVmcpds));
}else if(realResidueDays < 0 && !isCancel){
//isCancel 表示是否为取消,取消则不计算延期还车(因为没有出车) //isCancel 表示是否为取消,取消则不计算延期还车(因为没有出车)
//设置消耗费用列表 //设置消耗费用列表
useAmountList.addAll(Convert.toList(VMCalendarPriceCostDTO.class, vmcpds)); useAmountList.addAll(Convert.toList(VMCalendarPriceCostDTO.class, realVmcpds));
//如果订单 出发中 或者 已完成 或者定损中 //如果订单 出发中 或者 已完成 或者定损中
if(OrderStatusEnum.ORDER_WAIT.getCode().equals(baseOrder.getStatus()) || if(OrderStatusEnum.ORDER_WAIT.getCode().equals(baseOrder.getStatus()) ||
OrderStatusEnum.ORDER_FINISH.getCode().equals(baseOrder.getStatus()) || OrderStatusEnum.ORDER_FINISH.getCode().equals(baseOrder.getStatus()) ||
OrderStatusEnum.ORDER_FIXED_LOSS.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); 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() BigDecimal overAmount = overAmountList.parallelStream()
.map(VMCalendarPriceCostDTO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(2+ "")); .map(VMCalendarPriceCostDTO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(2+ ""));
...@@ -285,11 +332,15 @@ public class OrderCalculateBiz { ...@@ -285,11 +332,15 @@ public class OrderCalculateBiz {
setType(ItemTypeEnum.VEHICLE_MODEL.getCode()); setType(ItemTypeEnum.VEHICLE_MODEL.getCode());
setOrderId(baseOrder.getId()); setOrderId(baseOrder.getId());
}}), VehicleItemDTO.class); }}), 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) { 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()))); oad.setDepositAmount(orvd.getDeposit().subtract(inProgressVO.getExtraAmount().add(inProgressVO.getViolateAmount())));
...@@ -345,78 +396,100 @@ public class OrderCalculateBiz { ...@@ -345,78 +396,100 @@ public class OrderCalculateBiz {
InProgressVO inProgressVO = new InProgressVO(); InProgressVO inProgressVO = new InProgressVO();
BigDecimal topAmount = BigDecimal.ZERO; BigDecimal topAmount = BigDecimal.ZERO;
switch (orderTypeEnum) { if(SYS_TRUE.equals(orderPageVO.getHasPay()) && null != orderPageVO.getPayTime()) {
case RENT_VEHICLE: //缓冲取消时间(一个小时)
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
Long autoCancelTime = Long.valueOf(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.CANCEL_TIME_BUFFER).getDetail());
autoCancelTime = autoCancelTime * 60L * 1000L;
Long timeLag = orderPageVO.getOrderRentVehicleDetail().getStartTime() - System.currentTimeMillis(); //判断是否支付超过缓冲取消时间(一个小时)
Long orderCrtLag = System.currentTimeMillis() - orderPageVO.getPayTime();
Boolean overCancelBuffer = (orderCrtLag > autoCancelTime)? Boolean.TRUE: Boolean.FALSE;
VehicleItemDTO vehicleItemDTO = BeanUtil.toBean(orderItemBiz.selectOne(new OrderItem(){{ switch (orderTypeEnum) {
setType(ItemTypeEnum.VEHICLE_MODEL.getCode()); case RENT_VEHICLE:
setOrderId(orderPageVO.getId());
}}), VehicleItemDTO.class);
//融入日期价格 Long timeLag = orderPageVO.getOrderRentVehicleDetail().getStartTime() - System.currentTimeMillis();
List<VehicleModelCalendarPriceDTO> vmcpds = JSONUtil.toList(JSONUtil.parseArray(vehicleItemDTO.getDetail()), VehicleModelCalendarPriceDTO.class);
VehicleItemDTO vehicleItemDTO = BeanUtil.toBean(orderItemBiz.selectOne(new OrderItem(){{
setType(ItemTypeEnum.VEHICLE_MODEL.getCode());
setOrderId(orderPageVO.getId());
}}), VehicleItemDTO.class);
//融入日期价格
List<VehicleModelCalendarPriceDTO> vmcpds = JSONUtil.toList(JSONUtil.parseArray(vehicleItemDTO.getDetail()), VehicleModelCalendarPriceDTO.class);
if(timeLag < 0 && overCancelBuffer) {
Integer useDays = getIncludeDays(orderPageVO.getOrderRentVehicleDetail().getStartTime(), DateTime.now().getMillis());
OrderAccountDetail oad = new OrderAccountDetail();
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, orderPageVO.getOrderRentVehicleDetail(), useDays, oad, Boolean.FALSE);
topAmount = vehicleItemDTO.getTopAmount(useDays);
totalDeductAmount = oad.realTotalDeduct();
totalRefundAmount = oad.getOrderAmount().add(oad.getDepositAmount());
refundDesc = inProgressVO.getViolateDesc();
}else {
String key = RENT_REFUND;
BigDecimal deductionAmount = orderAccountBiz.calculateDeduction(vehicleItemDTO.getBuyAmount()
, orderPageVO.getOrderRentVehicleDetail().getStartTime() - System.currentTimeMillis()
, DictionaryKey.APP_ORDER+ "_"+ key
, refundDescBuilder);
if(!overCancelBuffer) {
deductionAmount = BigDecimal.ZERO;
refundDescBuilder = new StringBuilder("");
}
topAmount = vehicleItemDTO.getTopAmount(0);
totalDeductAmount = (topAmount.compareTo(deductionAmount) < 0) ? topAmount: deductionAmount;
totalRefundAmount = orderPageVO.getRealAmount().subtract(totalDeductAmount);
refundDesc = refundDescBuilder.toString();
}
break;
case TOUR:
//判断是省内还是省外
String key = TOUR_IN_REFUND;
if(SYS_TRUE.equals(orderPageVO.getOrderTourDetail().getIsOutside())) {
key = TOUR_REFUND;
}
if(timeLag < 0 ) { OrderItem adultItem = orderItemBiz.selectOne(new OrderItem(){{
Integer useDays = getIncludeDays(orderPageVO.getOrderRentVehicleDetail().getStartTime(), DateTime.now().getMillis()); setType(ItemTypeEnum.TOUR_ADULT.getCode());
OrderAccountDetail oad = new OrderAccountDetail(); setOrderId(orderPageVO.getId());
inProgressVO = inProgressCalculate(orderPageVO, vehicleItemDTO, useDays, oad, Boolean.FALSE); }});
topAmount = vehicleItemDTO.getTopAmount(useDays); OrderItem childItem = orderItemBiz.selectOne(new OrderItem(){{
totalDeductAmount = oad.realTotalDeduct(); setType(ItemTypeEnum.TOUR_CHILD.getCode());
totalRefundAmount = oad.getOrderAmount().add(oad.getDepositAmount()); setOrderId(orderPageVO.getId());
refundDesc = inProgressVO.getViolateDesc(); }});
}else {
String key = RENT_REFUND; BigDecimal adultItemAmount = (null == adultItem)? BigDecimal.ZERO: adultItem.getRealAmount();
BigDecimal childItemAmount = (null == childItem)? BigDecimal.ZERO: childItem.getRealAmount();
BigDecimal deductionAmount = orderAccountBiz.calculateDeduction(vehicleItemDTO.getBuyAmount() BigDecimal deductionAmount = orderAccountBiz.calculateDeduction(adultItemAmount.add(childItemAmount)
, orderPageVO.getOrderRentVehicleDetail().getStartTime() - System.currentTimeMillis() , orderPageVO.getOrderTourDetail().getStartTime() - System.currentTimeMillis()
, DictionaryKey.APP_ORDER+ "_"+ key , DictionaryKey.APP_ORDER+ "_"+ key
, refundDescBuilder); , refundDescBuilder);
topAmount = vehicleItemDTO.getTopAmount(0); if(!overCancelBuffer) {
totalDeductAmount = (topAmount.compareTo(deductionAmount) < 0) ? topAmount: deductionAmount; deductionAmount = BigDecimal.ZERO;
totalRefundAmount = orderPageVO.getRealAmount().subtract(totalDeductAmount); refundDescBuilder = new StringBuilder("");
refundDesc = refundDescBuilder.toString(); }
}
break;
case TOUR:
//判断是省内还是省外
String key = TOUR_IN_REFUND;
if(SYS_TRUE.equals(orderPageVO.getOrderTourDetail().getIsOutside())) {
key = TOUR_REFUND;
}
OrderItem adultItem = orderItemBiz.selectOne(new OrderItem(){{ topAmount = adultItemAmount.add(childItemAmount);
setType(ItemTypeEnum.TOUR_ADULT.getCode()); totalDeductAmount = deductionAmount;
setOrderId(orderPageVO.getId()); totalRefundAmount = orderPageVO.getRealAmount().subtract(deductionAmount);
}}); refundDesc = refundDescBuilder.toString();
break;
OrderItem childItem = orderItemBiz.selectOne(new OrderItem(){{ default:
setType(ItemTypeEnum.TOUR_CHILD.getCode()); break;
setOrderId(orderPageVO.getId()); }
}});
BigDecimal adultItemAmount = (null == adultItem)? BigDecimal.ZERO: adultItem.getRealAmount();
BigDecimal childItemAmount = (null == childItem)? BigDecimal.ZERO: childItem.getRealAmount();
BigDecimal deductionAmount = orderAccountBiz.calculateDeduction(adultItemAmount.add(childItemAmount)
, orderPageVO.getOrderTourDetail().getStartTime() - System.currentTimeMillis()
, DictionaryKey.APP_ORDER+ "_"+ key
, refundDescBuilder);
topAmount = adultItemAmount.add(childItemAmount);
totalDeductAmount = deductionAmount;
totalRefundAmount = orderPageVO.getRealAmount().subtract(deductionAmount);
refundDesc = refundDescBuilder.toString();
break;
default:
break;
} }
OrderRefundPriceVO orpv = new OrderRefundPriceVO(); OrderRefundPriceVO orpv = new OrderRefundPriceVO();
orpv.setRealAmount(orderPageVO.getRealAmount()); orpv.setRealAmount(orderPageVO.getRealAmount());
orpv.setRefundAmount(totalRefundAmount); orpv.setRefundAmount(totalRefundAmount);
......
...@@ -22,6 +22,8 @@ import com.xxfc.platform.order.pojo.price.CancelNoStartVO; ...@@ -22,6 +22,8 @@ import com.xxfc.platform.order.pojo.price.CancelNoStartVO;
import com.xxfc.platform.order.pojo.price.CancelStartedVO; import com.xxfc.platform.order.pojo.price.CancelStartedVO;
import com.xxfc.platform.order.pojo.price.CostDetailExtend; import com.xxfc.platform.order.pojo.price.CostDetailExtend;
import com.xxfc.platform.tour.feign.TourFeign; import com.xxfc.platform.tour.feign.TourFeign;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign; import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.common.RestResponse; import com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.feign.VehicleFeign; import com.xxfc.platform.vehicle.feign.VehicleFeign;
...@@ -132,6 +134,16 @@ public class OrderCancelBiz { ...@@ -132,6 +134,16 @@ public class OrderCancelBiz {
//触发退款流程 //触发退款流程
//判断是否已支付 //判断是否已支付
if(SYS_TRUE.equals(baseOrder.getHasPay())) { if(SYS_TRUE.equals(baseOrder.getHasPay())) {
//缓冲取消时间(一个小时)
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
Long autoCancelTime = Long.valueOf(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.CANCEL_TIME_BUFFER).getDetail());
autoCancelTime = autoCancelTime * 60L * 1000L;
//判断是否支付超过缓冲取消时间(一个小时)
Long orderCrtLag = System.currentTimeMillis() - baseOrder.getPayTime();
Boolean overCancelBuffer = (orderCrtLag > autoCancelTime)? Boolean.TRUE: Boolean.FALSE;
//判断订单类型 //判断订单类型
if(OrderTypeEnum.RENT_VEHICLE.getCode().equals(baseOrder.getType())) { if(OrderTypeEnum.RENT_VEHICLE.getCode().equals(baseOrder.getType())) {
orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail(){{ orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail(){{
...@@ -147,10 +159,11 @@ public class OrderCancelBiz { ...@@ -147,10 +159,11 @@ public class OrderCancelBiz {
//根据时间处理goodsAmount //根据时间处理goodsAmount
//获取出发时间 到现在 距离时间 //获取出发时间 到现在 距离时间
Long timeLag = orvd.getStartTime() - System.currentTimeMillis(); Long timeLag = orvd.getStartTime() - System.currentTimeMillis();
if(timeLag < 0 ) {
if(timeLag < 0 && overCancelBuffer) {
Integer useDays = orderCalculateBiz.getIncludeDays(orvd.getStartTime(), System.currentTimeMillis()); Integer useDays = orderCalculateBiz.getIncludeDays(orvd.getStartTime(), System.currentTimeMillis());
if(useDays > orvd.getDayNum()) { if(useDays > orvd.obtainRealDayNum()) {
useDays = orvd.getDayNum(); useDays = orvd.obtainRealDayNum();
} }
inProgressVO = orderCalculateBiz.calculateOrderComplete(baseOrder, orvd, oad, vehicleItemDTO, useDays, Boolean.TRUE); inProgressVO = orderCalculateBiz.calculateOrderComplete(baseOrder, orvd, oad, vehicleItemDTO, useDays, Boolean.TRUE);
...@@ -222,7 +235,7 @@ public class OrderCancelBiz { ...@@ -222,7 +235,7 @@ public class OrderCancelBiz {
//退款流程 //退款流程
//违约金封顶 租车身份价 * 2天 //违约金封顶 租车身份价 * 2天
orderAccountBiz.rentRefundProcessCancel(baseOrder, BigDecimal.ZERO, timeLag, APP_ORDER+ "_"+ RENT_REFUND, orvd.getDeposit(), vehicleItemDTO.getBuyAmount(), oad, vehicleItemDTO.getTopAmount(0), null, changeViolateAmount); orderAccountBiz.rentRefundProcessCancel(baseOrder, BigDecimal.ZERO, timeLag, APP_ORDER+ "_"+ RENT_REFUND, orvd.getDeposit(), vehicleItemDTO.getBuyAmount(), oad, vehicleItemDTO.getTopAmount(0), null, changeViolateAmount, (!overCancelBuffer));
//设置订单数据 //设置订单数据
//baseOrder.setDamagesAmount(csv.getDamagesAmount()); //baseOrder.setDamagesAmount(csv.getDamagesAmount());
...@@ -265,6 +278,7 @@ public class OrderCancelBiz { ...@@ -265,6 +278,7 @@ public class OrderCancelBiz {
} }
}else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) { }else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) {
otd = orderTourDetailBiz.selectOne(new OrderTourDetail(){{ otd = orderTourDetailBiz.selectOne(new OrderTourDetail(){{
setOrderId(baseOrder.getId()); setOrderId(baseOrder.getId());
}}); }});
...@@ -291,7 +305,7 @@ public class OrderCancelBiz { ...@@ -291,7 +305,7 @@ public class OrderCancelBiz {
} }
//退款流程 //退款流程
orderAccountBiz.rentRefundProcessCancel(baseOrder, adultItemAmount.add(childItemAmount), timeLag, APP_ORDER+ "_"+ key, BigDecimal.ZERO, BigDecimal.ZERO, oad, adultItemAmount.add(childItemAmount), changeViolateAmount, null); orderAccountBiz.rentRefundProcessCancel(baseOrder, adultItemAmount.add(childItemAmount), timeLag, APP_ORDER+ "_"+ key, BigDecimal.ZERO, BigDecimal.ZERO, oad, adultItemAmount.add(childItemAmount), changeViolateAmount, null, (!overCancelBuffer));
//如果有扣款项,则生成额外的费用明细 //如果有扣款项,则生成额外的费用明细
if(oad.getDeductions().size() > 0) { if(oad.getDeductions().size() > 0) {
......
package com.xxfc.platform.order.biz.inner;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.xxfc.platform.activity.feign.ActivityFeign;
import com.xxfc.platform.order.biz.*;
import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderLogEnum;
import com.xxfc.platform.order.entity.OrderItem;
import com.xxfc.platform.order.entity.OrderRentVehicleDetail;
import com.xxfc.platform.order.pojo.order.DelayRentOrderDTO;
import com.xxfc.platform.order.pojo.order.OrderPageVO;
import com.xxfc.platform.order.pojo.order.VehicleItemDTO;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.tour.feign.TourFeign;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxfc.platform.vehicle.pojo.BookVehicleVO;
import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO;
import lombok.extern.slf4j.Slf4j;
import org.mockito.internal.util.collections.Sets;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_JSON_TRUE;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_TRUE;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
/**
* 订单退款记录表
*
* @author zjw
* @email nishijjo@qq.com
* @date 2019-06-18 11:08:09
*/
@Slf4j
@Service
public class OrderDelayBiz {
@Autowired
BaseOrderBiz baseOrderBiz;
@Autowired
OrderItemBiz orderItemBiz;
@Autowired
OrderMemberDetailBiz orderMemberDetailBiz;
@Autowired
OrderTourDetailBiz orderTourDetailBiz;
@Autowired
OrderRentVehicleBiz orderRentVehicleBiz;
@Autowired
OrderMsgBiz orderMsgBiz;
@Autowired
OrderCalculateBiz orderCalculateBiz;
@Autowired
OrderAccountBiz orderAccountBiz;
@Autowired
OrderTemplateBiz orderTemplateBiz;
@Autowired
OrderLogBiz orderLogBiz;
@Autowired
UserFeign userFeign;
@Autowired
VehicleFeign vehicleFeign;
@Autowired
TourFeign tourFeign;
@Autowired
ThirdFeign thirdFeign;
@Autowired
ActivityFeign activityFeign;
public void delayRentOrder(OrderPageVO orderPageVO, DelayRentOrderDTO dto) {
OrderRentVehicleDetail orvd = orderPageVO.getOrderRentVehicleDetail();
OrderRentVehicleDetail oldOrvd = BeanUtil.toBean(orvd, OrderRentVehicleDetail.class);
Integer delayAddDays = 0;
Integer delayAddFreeDays = 0;
//分布式事务执行标记
Integer cloudTransact = 0;
//计算delay多少天
delayAddDays = orderCalculateBiz.getIncludeDays(orvd.getStartTime(), dto.getDelayEndTime());
delayAddDays = delayAddDays - orderPageVO.getOrderRentVehicleDetail().getDayNum();
//判断
if(delayAddDays < 0) {
throw new BaseException(ResultCode.PARAM_ILLEGAL_CODE, Sets.newSet("延期时间不对"));
}else {
//变化的延期免费天数
Integer changeDelayFreeDays = 0;
List<VMCalendarPriceCostDTO> delayAmountList;
if(delayAddDays > 0) {
VehicleItemDTO vehicleItemDTO = BeanUtil.toBean(orderItemBiz.selectOne(new OrderItem(){{
setType(ItemTypeEnum.VEHICLE_MODEL.getCode());
setOrderId(orderPageVO.getId());
}}), VehicleItemDTO.class);
List<VMCalendarPriceCostDTO> vmcpcds = vehicleItemDTO.getVehicleDetail();
//获得延期天数费用
delayAmountList = orderItemBiz.getOverAmountList(vmcpcds.get(vmcpcds.size() - 1).getDate(), 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();
delayAddFreeDays = 0;
}
//初始化变化的延期免费天数为延期天数
changeDelayFreeDays = delayAddFreeDays;
//判断是否已经设置了延期, 修改变化的延期免费天数
if(orvd.getDelayAddDays() > 0) {
//extendDelayDays = delayAddDays - orvd.getDelayAddDays();
changeDelayFreeDays = delayAddFreeDays - orvd.getDelayAddFreeDays();
}
//根据 changeDelayFreeDays 判断 是否拥有那么足够的天数
if(changeDelayFreeDays > 0) {
AppUserDTO appUserDTO = userFeign.userDetailById(orderPageVO.getUserId()).getData();
if(appUserDTO.getRentFreeDays() < changeDelayFreeDays) {
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("免费天数不够"));
}
}
//触发调用修改预约
dto.setEndTime(dto.getDelayEndTime());
dto.setStartTime(orderPageVO.getOrderRentVehicleDetail().getStartTime());
//根据订单号获取订单
RestResponse restResponse = vehicleFeign.updateOrderBookRecord(new BookVehicleVO() {{
setVehicleId(orderPageVO.getOrderRentVehicleDetail().getVehicleId());
setVehicleBookRecordId(orvd.getBookRecordId());
setBookStartDate(dto.getBookStartDateTime());
setBookEndDate(dto.getBookEndDateTime());
setBookStartDateTime(dto.getBookStartDateTime());
setBookEndDateTime(dto.getBookEndDateTime());
setBookType(BOOK_TYPE_RENT);
}});
if( !SYS_JSON_TRUE.equals(restResponse.getStatus())) {
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("延期失败"));
}
cloudTransact = 1;
//扣减免费天数
if(changeDelayFreeDays > 0) {
int result = userFeign.memberDays(orderPageVO.getUserId(), changeDelayFreeDays, UserFeign.MEMBER_DAYS_LOCK);
if (result < 0) {
throw new BaseException(ResultCode.FAILED_CODE);
}
}else if(changeDelayFreeDays < 0){
int result = userFeign.memberDays(orderPageVO.getUserId(), 0 - changeDelayFreeDays, UserFeign.MEMBER_DAYS_WITHDRAW);
if (result < 0) {
throw new BaseException(ResultCode.FAILED_CODE);
}
}
cloudTransact = 2;
//更新OrderRentVehicleDetail
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
orvd.setDelayAddDamageSafe(dto.getNeedDamageSafe());
orvd.setDelayAddDays(delayAddDays);
orvd.setDelayAddFreeDays(delayAddFreeDays);
orvd.setDelayAddEndTime(dto.getDelayEndTime());
//修改还车时间
orvd.setEndTime(dto.getDelayEndTime());
DelayAddPriceVO delayAddPriceVO = new DelayAddPriceVO(){{
setDamageSafePrice(new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.DAMAGE_SAFE).getDetail()));
setDelayAddDays(orvd.getDelayAddDays());
setDelayAmountList(delayAmountList);
}};
if(SYS_TRUE.equals(dto.getNeedDamageSafe())) {
delayAddPriceVO.initDelayDamageSafeAmount();
}
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
...@@ -517,7 +517,7 @@ public class OrderMsgBiz { ...@@ -517,7 +517,7 @@ public class OrderMsgBiz {
smsParams.add(orvd.getEndAddr()); smsParams.add(orvd.getEndAddr());
smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getStartTime()))); smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getStartTime())));
smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getEndTime()))); smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getEndTime())));
smsParams.add(orvd.getDayNum().toString()); smsParams.add(orvd.obtainRealDayNum().toString());
smsParams.add(appUserDTO.getUsername()); smsParams.add(appUserDTO.getUsername());
} }
} }
......
package com.xxfc.platform.order.rest; package com.xxfc.platform.order.rest;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.wxiaoqi.security.admin.entity.AppUserLogin; import com.github.wxiaoqi.security.admin.entity.AppUserLogin;
...@@ -22,15 +24,22 @@ import com.google.common.collect.Lists; ...@@ -22,15 +24,22 @@ import com.google.common.collect.Lists;
import com.xxfc.platform.activity.entity.Coupon; import com.xxfc.platform.activity.entity.Coupon;
import com.xxfc.platform.activity.feign.ActivityFeign; import com.xxfc.platform.activity.feign.ActivityFeign;
import com.xxfc.platform.order.biz.*; import com.xxfc.platform.order.biz.*;
import com.xxfc.platform.order.biz.inner.OrderCalculateBiz;
import com.xxfc.platform.order.biz.inner.OrderDelayBiz;
import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum; import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.entity.OrderItem; import com.xxfc.platform.order.entity.OrderItem;
import com.xxfc.platform.order.entity.OrderRentVehicleDetail; import com.xxfc.platform.order.entity.OrderRentVehicleDetail;
import com.xxfc.platform.order.pojo.OrderAccompanyDTO; import com.xxfc.platform.order.pojo.OrderAccompanyDTO;
import com.xxfc.platform.order.pojo.order.*; import com.xxfc.platform.order.pojo.order.*;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.order.pojo.price.RentVehiclePriceVO; import com.xxfc.platform.order.pojo.price.RentVehiclePriceVO;
import com.xxfc.platform.order.service.OrderRentVehicleService; import com.xxfc.platform.order.service.OrderRentVehicleService;
import com.xxfc.platform.tour.entity.TourUser; import com.xxfc.platform.tour.entity.TourUser;
import com.xxfc.platform.tour.feign.TourFeign; import com.xxfc.platform.tour.feign.TourFeign;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.common.RestResponse; import com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.constant.VehicleBookRecordStatus; import com.xxfc.platform.vehicle.constant.VehicleBookRecordStatus;
import com.xxfc.platform.vehicle.entity.BranchCompany; import com.xxfc.platform.vehicle.entity.BranchCompany;
...@@ -39,6 +48,7 @@ import com.xxfc.platform.vehicle.entity.VehicleUserLicense; ...@@ -39,6 +48,7 @@ import com.xxfc.platform.vehicle.entity.VehicleUserLicense;
import com.xxfc.platform.vehicle.feign.VehicleFeign; import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxfc.platform.vehicle.pojo.BookVehicleVO; import com.xxfc.platform.vehicle.pojo.BookVehicleVO;
import com.xxfc.platform.vehicle.pojo.CompanyDetail; import com.xxfc.platform.vehicle.pojo.CompanyDetail;
import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jodd.util.StringUtil; import jodd.util.StringUtil;
...@@ -52,17 +62,18 @@ import org.springframework.web.bind.annotation.*; ...@@ -52,17 +62,18 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.DATE_TIME_LINE_FORMATTER; import static com.github.wxiaoqi.security.common.constant.CommonConstants.*;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.YMR_SLASH_FORMATTER; import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
@Controller @Controller
@RequestMapping("baseOrder") //@RequestMapping("baseOrder")
@Api(value = "订单后台相关", tags = {"订单后台相关"}) @Api(value = "订单后台相关", tags = {"订单后台相关"})
@Slf4j @Slf4j
public class BackStageOrderController extends CommonBaseController implements UserRestInterface { public class BackStageOrderController extends CommonBaseController implements UserRestInterface {
...@@ -83,6 +94,12 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -83,6 +94,12 @@ public class BackStageOrderController extends CommonBaseController implements Us
@Autowired @Autowired
OrderItemBiz orderItemBiz; OrderItemBiz orderItemBiz;
@Autowired
OrderCalculateBiz orderCalculateBiz;
@Autowired
OrderDelayBiz orderDelayBiz;
@Autowired @Autowired
UserFeign userFeign; UserFeign userFeign;
...@@ -95,6 +112,9 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -95,6 +112,9 @@ public class BackStageOrderController extends CommonBaseController implements Us
@Resource @Resource
VehicleFeign vehicleFeign; VehicleFeign vehicleFeign;
@Autowired
ThirdFeign thirdFeign;
@Autowired @Autowired
BackgroundBaseOrderBiz backgroundBaseOrderBiz; BackgroundBaseOrderBiz backgroundBaseOrderBiz;
@Override @Override
...@@ -102,7 +122,7 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -102,7 +122,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return userFeign; return userFeign;
} }
@RequestMapping(value = "/getOrderList", method = RequestMethod.GET) @RequestMapping(value = "/baseOrder/getOrderList", method = RequestMethod.GET)
@ResponseBody @ResponseBody
@ApiOperation(value = "获取后台订单列表") @ApiOperation(value = "获取后台订单列表")
@IgnoreClientToken @IgnoreClientToken
...@@ -278,7 +298,7 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -278,7 +298,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO); return new ObjectRestResponse<>().data(pageDataVO);
} }
@RequestMapping(value = "/getVehicleList", method = RequestMethod.GET) @RequestMapping(value = "/baseOrder/getVehicleList", method = RequestMethod.GET)
@ResponseBody @ResponseBody
@ApiOperation(value = "交还车租车订单列表") @ApiOperation(value = "交还车租车订单列表")
@IgnoreClientToken @IgnoreClientToken
...@@ -341,7 +361,7 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -341,7 +361,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO); return new ObjectRestResponse<>().data(pageDataVO);
} }
@RequestMapping(value = "/getTourList", method = RequestMethod.GET) @RequestMapping(value = "/baseOrder/getTourList", method = RequestMethod.GET)
@ResponseBody @ResponseBody
@ApiOperation(value = "交还车旅游订单列表") @ApiOperation(value = "交还车旅游订单列表")
@IgnoreClientToken @IgnoreClientToken
...@@ -356,7 +376,7 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -356,7 +376,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO); return new ObjectRestResponse<>().data(pageDataVO);
} }
@GetMapping(value = "/orderDetail") @GetMapping(value = "/baseOrder/orderDetail")
@ApiOperation(value = "交还车获取订单详情,带驾驶人信息") @ApiOperation(value = "交还车获取订单详情,带驾驶人信息")
@IgnoreClientToken @IgnoreClientToken
@ResponseBody @ResponseBody
...@@ -377,7 +397,7 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -377,7 +397,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
@ApiOperation("结合后台人员所属公司查询订单详情") @ApiOperation("结合后台人员所属公司查询订单详情")
@RequestMapping(value = "/company/{no}", method = RequestMethod.GET) @RequestMapping(value = "/baseOrder/company/{no}", method = RequestMethod.GET)
@IgnoreClientToken @IgnoreClientToken
@ResponseBody @ResponseBody
public ObjectRestResponse<OrderPageVO> companyGet(@PathVariable String no) { public ObjectRestResponse<OrderPageVO> companyGet(@PathVariable String no) {
...@@ -395,16 +415,15 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -395,16 +415,15 @@ public class BackStageOrderController extends CommonBaseController implements Us
} }
@ApiOperation("更換車輛") @ApiOperation("更換車輛")
@RequestMapping(value = "/bg/change-vehicle", method = RequestMethod.POST) @RequestMapping(value = "/baseOrder/bg/change-vehicle", method = RequestMethod.POST)
@IgnoreClientToken @IgnoreClientToken
@ResponseBody @ResponseBody
public ObjectRestResponse<OrderPageVO> changeVehicle(@RequestBody ChangeVehicleDTO dto) { public ObjectRestResponse<OrderPageVO> changeVehicle(@RequestBody ChangeVehicleDTO dto) {
checkAdminUser(); checkAdminUser();
//根据订单号获取订单 //根据订单号获取订单
//查询列表数据 //查询列表数据
Query query = baseOrderBiz.initQuery(dto.getNo()); Query query = baseOrderBiz.initBgQuery(dto.getNo());
query.put("crtUser", null);
query.put("userId", null);
PageDataVO<OrderPageVO> page = PageDataVO.pageInfo(query, () -> baseOrderBiz.pageByParm(query.getSuper())); PageDataVO<OrderPageVO> page = PageDataVO.pageInfo(query, () -> baseOrderBiz.pageByParm(query.getSuper()));
OrderPageVO orderPageVO = page.getData().get(0); OrderPageVO orderPageVO = page.getData().get(0);
if (null == orderPageVO) { if (null == orderPageVO) {
...@@ -438,13 +457,35 @@ public class BackStageOrderController extends CommonBaseController implements Us ...@@ -438,13 +457,35 @@ public class BackStageOrderController extends CommonBaseController implements Us
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
} }
@PostMapping("/updateEndCompany") @ApiOperation("修改租车订单延长时间")
@RequestMapping(value = "/baseOrder/bg/delay-rent-order", method = RequestMethod.POST)
@IgnoreClientToken
@ResponseBody
public ObjectRestResponse<OrderPageVO> delayRentOrder(@RequestBody DelayRentOrderDTO dto) {
checkAdminUser();
dto.setOperateId(Integer.valueOf("-1"+ getCurrentUserId()));
Query query = baseOrderBiz.initBgQuery(dto.getNo());
PageDataVO<OrderPageVO> page = PageDataVO.pageInfo(query, () -> baseOrderBiz.pageByParm(query.getSuper()));
OrderPageVO orderPageVO = page.getData().get(0);
if (null == orderPageVO || !OrderTypeEnum.RENT_VEHICLE.getCode().equals(orderPageVO.getType())) {
throw new BaseException(ResultCode.PARAM_ILLEGAL_CODE, Sets.newSet("订单不存在,或不是租车订单"));
}
orderDelayBiz.delayRentOrder(orderPageVO, dto);
return ObjectRestResponse.succ();
}
@PostMapping("/baseOrder/updateEndCompany")
@ResponseBody @ResponseBody
public ObjectRestResponse updateEndCompany(@RequestBody OrderRentVehicleDetail orderRentVehicleDetail) { public ObjectRestResponse updateEndCompany(@RequestBody OrderRentVehicleDetail orderRentVehicleDetail) {
return baseOrderBiz.save(orderRentVehicleDetail); return baseOrderBiz.save(orderRentVehicleDetail);
} }
@GetMapping(value = "/getAll") @GetMapping(value = "/baseOrder/getAll")
@ResponseBody @ResponseBody
public ObjectRestResponse getAllOrderList(BaseOrderController.QueryOrderList dto) { public ObjectRestResponse getAllOrderList(BaseOrderController.QueryOrderList dto) {
return backgroundBaseOrderBiz.getAllOrderList(dto); return backgroundBaseOrderBiz.getAllOrderList(dto);
......
...@@ -207,6 +207,8 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl ...@@ -207,6 +207,8 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
bo.getOrder().setCrtUser(bo.getCrtUser()); bo.getOrder().setCrtUser(bo.getCrtUser());
} }
//
bo.setMetaEndTime(bo.getEndTime());
super.handleDetail(bo); super.handleDetail(bo);
}catch (Exception e) { }catch (Exception e) {
//事务补偿处理 //事务补偿处理
......
...@@ -56,7 +56,7 @@ public class DictionaryKey { ...@@ -56,7 +56,7 @@ public class DictionaryKey {
public static final String TOUR_IN_REFUND = "TOUR_IN_REFUND"; public static final String TOUR_IN_REFUND = "TOUR_IN_REFUND";
/** /**
* 租车:公司司机租金、免赔费用、违章预备金 * 租车:公司司机租金、免赔费用、违章预备金、租车时间缓冲(小时)
*/ */
public static final String DRIVER_PRICE = "DRIVER_PRICE"; public static final String DRIVER_PRICE = "DRIVER_PRICE";
public static final String DAMAGE_SAFE = "DAMAGE_SAFE"; public static final String DAMAGE_SAFE = "DAMAGE_SAFE";
...@@ -84,4 +84,9 @@ public class DictionaryKey { ...@@ -84,4 +84,9 @@ public class DictionaryKey {
* 自动退款保留押金的时间(小时) * 自动退款保留押金的时间(小时)
*/ */
public static final String RENT_DEPOSIT_AUTO_REFUND_TIME = "RENT_DEPOSIT_AUTO_REFUND_TIME"; public static final String RENT_DEPOSIT_AUTO_REFUND_TIME = "RENT_DEPOSIT_AUTO_REFUND_TIME";
/**
* 取消时间缓冲(分钟)
*/
public static final String CANCEL_TIME_BUFFER = "CANCEL_TIME_BUFFER";
} }
package com.xxfc.platform.vehicle.feign; package com.xxfc.platform.vehicle.feign;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.vo.GoodDataVO; import com.github.wxiaoqi.security.common.vo.GoodDataVO;
import com.github.wxiaoqi.security.common.vo.PageDataVO; import com.github.wxiaoqi.security.common.vo.PageDataVO;
...@@ -16,7 +15,9 @@ import org.springframework.cloud.openfeign.FeignClient; ...@@ -16,7 +15,9 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.Set;
/** /**
* Created by ace on 2017/9/15. * Created by ace on 2017/9/15.
...@@ -200,6 +201,14 @@ public interface VehicleFeign { ...@@ -200,6 +201,14 @@ public interface VehicleFeign {
@RequestParam(value = "endDate") Long endDate, @RequestParam(value = "endDate") Long endDate,
@RequestParam(value = "vehicleModelId") Integer vehicleModelId, @RequestParam(value = "vehicleModelId") Integer vehicleModelId,
@RequestParam(value = "userId") Integer userId); @RequestParam(value = "userId") Integer userId);
/**
* 订单修改订单时间,同时需要修改预定记录
* * @param bookVehicleVo
* @return
*/
@RequestMapping(value = "/vehicleInfo/bookRecord/order-update", method = RequestMethod.POST)
public RestResponse updateOrderBookRecord(@RequestBody BookVehicleVO bookVehicleVo);
@GetMapping("/branchCompany/company_info") @GetMapping("/branchCompany/company_info")
Map<Integer, String> findCompanyMap(); Map<Integer, String> findCompanyMap();
......
...@@ -7,24 +7,30 @@ import java.util.Map; ...@@ -7,24 +7,30 @@ import java.util.Map;
@Data @Data
public class BookVehicleVO { public class BookVehicleVO {
//用途
public static final int BOOK_TYPE_RENT = 1;
/** /**
* 车辆id * 车辆id
*/ */
@ApiModelProperty("车辆id") @ApiModelProperty("车辆id")
private String vehicleId; private String vehicleId;
/**
* 填写RecordId 修改日期
*/
private Long vehicleBookRecordId; private Long vehicleBookRecordId;
/** /**
* 预定目标日期(开始) * 预定目标日期(开始)
*/ */
@ApiModelProperty("预定目标日期(开始)") @ApiModelProperty("预定目标日期(开始) yyyy-MM-dd HH:mm:ss")
private String bookStartDate; private String bookStartDate;
/** /**
* 预定目标日期(结束) * 预定目标日期(结束)
*/ */
@ApiModelProperty("预定目标日期(结束)") @ApiModelProperty("预定目标日期(结束) yyyy-MM-dd HH:mm:ss")
private String bookEndDate; private String bookEndDate;
/** /**
......
...@@ -23,6 +23,11 @@ public class VMCalendarPriceCostDTO extends VehicleModelCalendarPriceDTO { ...@@ -23,6 +23,11 @@ public class VMCalendarPriceCostDTO extends VehicleModelCalendarPriceDTO {
*/ */
private BigDecimal freeAmount = BigDecimal.ZERO; private BigDecimal freeAmount = BigDecimal.ZERO;
/**
* 生效的免费天数
*/
private Integer validFreeDays = 0;
public void setFreeAndConsumeAmount(BigDecimal realAmount, BigDecimal freeAmount) { public void setFreeAndConsumeAmount(BigDecimal realAmount, BigDecimal freeAmount) {
setFreeAmount(freeAmount); setFreeAmount(freeAmount);
setConsumeAmount(realAmount.subtract(freeAmount)); setConsumeAmount(realAmount.subtract(freeAmount));
......
...@@ -399,7 +399,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR ...@@ -399,7 +399,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), DATE_TIME_FORMATTER); DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), DATE_TIME_FORMATTER);
DateTime endDay = DateTime.parse(bookVehicleVo.getBookEndDate(), DATE_TIME_FORMATTER); DateTime endDay = DateTime.parse(bookVehicleVo.getBookEndDate(), DATE_TIME_FORMATTER);
//转换日期范围为列表,并检查是否合法 //转换日期范围为列表,并检查是否合法
fillDateList4DatePeriod(yearMonthAndDate, DateTime.parse(startDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), DateTime.parse(endDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER)); fillDateList4DatePeriod(yearMonthAndDate, DateTime.parse(startDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), DateTime.parse(endDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), bookVehicleVo.getNotCheckTimeLegal());
if (yearMonthAndDate.size() > 3) {//连续的日期最多夸3个月 if (yearMonthAndDate.size() > 3) {//连续的日期最多夸3个月
throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH); throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH);
} }
...@@ -702,7 +702,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR ...@@ -702,7 +702,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), DATE_TIME_FORMATTER); DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), DATE_TIME_FORMATTER);
DateTime endDay = DateTime.parse(bookVehicleVo.getBookEndDate(), DATE_TIME_FORMATTER); DateTime endDay = DateTime.parse(bookVehicleVo.getBookEndDate(), DATE_TIME_FORMATTER);
//转换日期范围为列表,并检查是否合法 //转换日期范围为列表,并检查是否合法
fillDateList4DatePeriod(yearMonthAndDate, DateTime.parse(startDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), DateTime.parse(endDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER)); fillDateList4DatePeriod(yearMonthAndDate, DateTime.parse(startDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), DateTime.parse(endDay.toString(DEFAULT_DATE_TIME_FORMATTER), DEFAULT_DATE_TIME_FORMATTER), bookVehicleVo.getNotCheckTimeLegal());
if (yearMonthAndDate.size() > 3) {//连续的日期最多夸3个月 if (yearMonthAndDate.size() > 3) {//连续的日期最多夸3个月
throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH); throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH);
} }
...@@ -824,11 +824,14 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR ...@@ -824,11 +824,14 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
* @param startDay * @param startDay
* @param endDay * @param endDay
*/ */
private void fillDateList4DatePeriod(Map<String, List<String>> yearMonthAndDate, DateTime startDay, DateTime endDay) { private void fillDateList4DatePeriod(Map<String, List<String>> yearMonthAndDate, DateTime startDay, DateTime endDay, Boolean notCheckTimeLegal) {
for (DateTime curDate = startDay; curDate.compareTo(endDay) <= 0; curDate = curDate.plusDays(1)) { for (DateTime curDate = startDay; curDate.compareTo(endDay) <= 0; curDate = curDate.plusDays(1)) {
String curDateStr = curDate.toString(DEFAULT_DATE_TIME_FORMATTER); String curDateStr = curDate.toString(DEFAULT_DATE_TIME_FORMATTER);
if (curDateStr.compareTo(DateTime.now().toString(DEFAULT_DATE_TIME_FORMATTER)) < 0) { if (!Boolean.TRUE.equals(notCheckTimeLegal)) {
throw new BaseException(ResultCode.ONLY_BOOK_FROM_TODAY); //判定时间是否合法
if (curDateStr.compareTo(DateTime.now().toString(DEFAULT_DATE_TIME_FORMATTER)) < 0) {
throw new BaseException(ResultCode.ONLY_BOOK_FROM_TODAY);
}
} }
String curYearMonth = curDate.toString(YEARMONTH_DATE_TIME_FORMATTER); String curYearMonth = curDate.toString(YEARMONTH_DATE_TIME_FORMATTER);
if (!yearMonthAndDate.containsKey(curYearMonth)) { if (!yearMonthAndDate.containsKey(curYearMonth)) {
......
...@@ -400,7 +400,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr ...@@ -400,7 +400,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr
log.info("参数:【{}==当前时间:{}==价格:{}==折扣:{}】", festivalDayMap, current_date, vehicle_price, discount); log.info("参数:【{}==当前时间:{}==价格:{}==折扣:{}】", festivalDayMap, current_date, vehicle_price, discount);
Map<String, Object> vehicle_price_days_map = new HashMap<>(3); Map<String, Object> vehicle_price_days_map = new HashMap<>(3);
Integer free_days = DEFAULT_FREE_DAYS; Integer free_days = DEFAULT_FREE_DAYS;
vehicle_price_days_map.put(BASE_PRICE_VAL, vehicle_price); //vehicle_price_days_map.put(BASE_PRICE_VAL, vehicle_price);
if (MapUtil.isNotEmpty(festivalDayMap)) { if (MapUtil.isNotEmpty(festivalDayMap)) {
VehicleModelHolidayPriceDTO vehicleModelHolidayPriceDTO = festivalDayMap.get(current_date); VehicleModelHolidayPriceDTO vehicleModelHolidayPriceDTO = festivalDayMap.get(current_date);
if (Objects.nonNull(vehicleModelHolidayPriceDTO)) { if (Objects.nonNull(vehicleModelHolidayPriceDTO)) {
...@@ -408,6 +408,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr ...@@ -408,6 +408,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr
free_days = vehicleModelHolidayPriceDTO.getFreeDays() == null ? free_days : vehicleModelHolidayPriceDTO.getFreeDays(); free_days = vehicleModelHolidayPriceDTO.getFreeDays() == null ? free_days : vehicleModelHolidayPriceDTO.getFreeDays();
} }
} }
vehicle_price_days_map.put(BASE_PRICE_VAL, vehicle_price);
vehicle_price = vehicle_price.multiply(new BigDecimal(Objects.toString(discount / 100.00))); vehicle_price = vehicle_price.multiply(new BigDecimal(Objects.toString(discount / 100.00)));
vehicle_price_days_map.put(PRICE_VAL, vehicle_price); vehicle_price_days_map.put(PRICE_VAL, vehicle_price);
vehicle_price_days_map.put(DAYS_VAL, free_days); vehicle_price_days_map.put(DAYS_VAL, free_days);
......
...@@ -229,6 +229,24 @@ public class VehicleController extends BaseController<VehicleBiz> implements Use ...@@ -229,6 +229,24 @@ public class VehicleController extends BaseController<VehicleBiz> implements Use
return RestResponse.suc(); return RestResponse.suc();
} }
/**
* 订单修改订单时间,同时需要修改预定记录
* * @param bookVehicleVo
* @return
*/
@RequestMapping(value = "/bookRecord/order-update", method = RequestMethod.POST)
@ApiOperation(value = "订单修改订单时间")
public RestResponse updateOrderBookRecord(@RequestBody BookVehicleVO bookVehicleVo) throws Exception {
Integer operatorId = Integer.parseInt(BaseContextHandler.getUserID());
String userName = BaseContextHandler.getName();
bookVehicleVo.setStatus(VehicleBookRecordStatus.APPROVE.getCode());
bookVehicleVo.setNotCheckTimeLegal(Boolean.TRUE);
baseBiz.applyVehicle(operatorId, bookVehicleVo, userName);
return RestResponse.suc();
}
/** /**
* 申请预定车辆 需要审核 * 申请预定车辆 需要审核
* *
......
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