Commit b4fdd45b authored by hanfeng's avatar hanfeng

Merge remote-tracking branch 'origin/master'

parents e3824f42 66704eb6
......@@ -2,6 +2,9 @@ package com.github.wxiaoqi.security.common.constant;
import cn.hutool.core.date.format.FastDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
......@@ -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 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 {
public String getCurrentUserName(){
return BaseContextHandler.getUsername();
}
public String getCurrentUserId(){
return BaseContextHandler.getUserID();
}
}
......@@ -38,7 +38,7 @@ public interface UserRestInterface {
default void checkAdminUser(){
if(null == getAdminUserInfo()) {
throw new BaseException(ResultCode.DB_OPERATION_FAIL_CODE);
throw new BaseException(ResultCode.NOTEXIST_CODE);
}
}
}
......@@ -138,11 +138,12 @@ public class AppUserRest {
* @return
*/
@RequestMapping(value = "/user/checkBindWechat")
public @ResponseBody JSONObject checkBindWechat(@RequestParam(value="username",defaultValue="")String username) {
public @ResponseBody JSONObject checkBindWechat(@RequestParam(value="username",defaultValue="")String username,
@RequestParam(value="type",defaultValue="0")Integer type) {
if (StringUtils.isBlank(username)) {
return JsonResultUtil.createFailedResult(ResultCode.NULL_CODE, "参数为空");
}
return appPermissionService.checkBindWechat(username);
return appPermissionService.checkBindWechat(username,type);
}
......
......@@ -114,6 +114,9 @@ public class AppPermissionService {
@Autowired
private AppUserPositionTempBiz positionTempBiz;
@Autowired
private AppUserAlipayBiz alipayBiz;
public AppUserInfo validate(String username, String password) {
AppUserInfo info = new AppUserInfo();
......@@ -617,12 +620,20 @@ public class AppPermissionService {
* @return
*/
public JSONObject checkBindWechat(String username) {
public JSONObject checkBindWechat(String username,Integer type) {
JSONObject data = new JSONObject();
try {
AppUserLogin userLogin = appUserLoginBiz.checkeUserLogin(username);
if (userLogin != null) {
String openid = userLogin.getOpenid();
if (type==null||type==0){
openid=userLogin.getWxOpenid();
}else if (type==2){
List<AppUserAlipay> list=alipayBiz.getListByUserId(userLogin.getId());
if (list.size()>0){
openid=list.get(0).getTxAlipay();
}
}
if (StringUtils.isNotBlank(openid)) {
data.put("type", 0); // 已存在
} else {
......
......@@ -54,6 +54,8 @@ public class ActivityUserJoinBiz extends BaseBiz<ActivityUserJoinMapper,Activity
}
insertSelective(userJoin);
ruleBiz.updateById(rule);
//领取优惠卷
receiveCoupn(userId);
}
//领取优惠卷
......
......@@ -8,7 +8,7 @@ import java.util.List;
import java.util.Map;
public enum DeductionTypeEnum {
//账款类型 1--违约金;2--消费金额;3--赔偿金(定损);4--违章相关
//账款类型 1--违约金;2--消费金额;3--赔偿金(定损);4--违章相关;5--其他
VIOLATE_CANCEL(101, "提前取消违约金"),
VIOLATE_ADVANCE(102, "提前还车违约金"),
VIOLATE_DELAY(103, "延迟还车违约金"),
......@@ -17,6 +17,7 @@ public enum DeductionTypeEnum {
DAMAGES(301, "赔偿金(定损)"),
VIOLATE_TRAFFIC_DEDUCT(401, "违章扣款"),
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 {
BEFORE(1, "提前"),
AFTER(2, "延期"),
CHANGE(3, "更换还车公司"),
DELAY_VEHICLE(4, "延长还车不计免赔")
;
/**
* 编码
......
......@@ -52,7 +52,7 @@ public class OrderLog implements Serializable {
* 操作者id,另外 -1为系统
*/
@Column(name = "log_user_id")
@ApiModelProperty(value = "操作者id,另外 -1为系统")
@ApiModelProperty(value = "操作者id,另外 -1为系统 -1+id 为后台人员")
private Integer logUserId;
/**
......@@ -68,13 +68,27 @@ public class OrderLog implements Serializable {
@Column(name = "crt_time")
@ApiModelProperty(value = "创建时间", hidden = true )
private Long crtTime;
/**
* 更新时间
*/
@Column(name = "upd_time")
@ApiModelProperty(value = "更新时间", hidden = true )
private Long updTime;
/**
* 日志类型 11--创建订单;12--创建订单
/**
* 日志类型 101--创建订单;102--
*/
@Column(name = "type")
@ApiModelProperty(value = "日志类型 11--创建订单;12--创建订单;")
@ApiModelProperty(value = "日志类型 101--创建订单;102--创建订单;201--")
private Integer type;
/**
* 详情
*/
@Column(name = "detail")
@ApiModelProperty(value = "详情")
private String detail;
}
package com.xxfc.platform.order.entity;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.util.JsonUtil;
import com.xxfc.platform.order.pojo.order.DelayRentOrderDTO;
import com.xxfc.platform.order.pojo.price.CostDetailExtend;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -333,4 +336,44 @@ public class OrderRentVehicleDetail implements Serializable {
public void handelCostDetailExtend(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 {
@Column(name = "violate_amount_detail")
private String violateDetail;
/**
* 延期还车,不计免赔额计算
*/
@Column(name = "delay_vehicle_detail")
private String delayVehicleDetail;
/**
* 1、交车, 2、还车, 3、定损还车
*/
......
......@@ -33,6 +33,7 @@ public class DedDetailDTO {
//作为:DedDetail :2、车辆损坏 3、其他
//作为:violate_amount_detail 1--提前还车 2--延期还车 3--更换还车公司费用
//作为:delay_vehicle_detail
Integer type;
//小雨都不知道什么东西
......
package com.xxfc.platform.order.pojo.calculate;
import cn.hutool.core.collection.CollUtil;
import com.xxfc.platform.order.pojo.price.DelayAddPriceVO;
import com.xxfc.platform.vehicle.pojo.dto.order.VMCalendarPriceCostDTO;
import lombok.Data;
import org.assertj.core.util.Lists;
......@@ -96,4 +97,32 @@ public class InProgressVO {
* 违约金 费用详情列表
*/
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 {
private String positionName;
//订单违约金
private String dedDetailDTO;
//订单延长还车,不计免赔额
private String delayVehicleDetail;
/**
* 車輛編碼
*/
......
......@@ -119,6 +119,23 @@ public class VehicleItemDTO extends OrderItem {
return usedAmount;
}
// public BigDecimal getUsedAmountHasDelay(Integer useDays, List<VMCalendarPriceCostDTO> delayAmountList) {
//
// BigDecimal usedAmount = getUsedAmount(useDays);
// if((useDays - getTotalNum()) > 0) {
// Integer delayAddDays = useDays - getTotalNum();
// if(delayAddDays > delayAmountList.size()) {
// delayAddDays = delayAmountList.size();
// }
//
// for(int i = 0; i < delayAddDays; i++) {
// usedAmount = usedAmount.add(delayAmountList.get(i).getPrice());
// }
// }
//
// return usedAmount;
// }
//由于免费天数可以抵消不是完整的天数,所以处理比较不同
public BigDecimal getFreeAmount(Integer offsetDay) {
List<VMCalendarPriceCostDTO> vmcpds = getVehicleDetail();
......@@ -187,8 +204,12 @@ public class VehicleItemDTO extends OrderItem {
if(ableFreeDays > cycleNum && cycleNum+ dto.getFreeDays() > ableFreeDays) { //本次累加天数 大于 可用免费天数
paramDTO.setFreeNum(ableFreeDays);
//分子
Integer up = (ableFreeDays - cycleNum);
//分母
Integer down = dto.getFreeDays();
//设置当前生效免费天数
dto.setValidFreeDays(up);
//根据百分比计算消费价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice().multiply(
new BigDecimal(up+ "").divide(new BigDecimal(down+ ""), 2, RoundingMode.HALF_UP))
......@@ -198,6 +219,7 @@ public class VehicleItemDTO extends OrderItem {
paramDTO.setFreeNum(paramDTO.getFreeNum()+ dto.getFreeDays());
//直接设置价格
dto.setFreeAndConsumeAmount(dto.getPrice(), dto.getPrice());
dto.setValidFreeDays(dto.getFreeDays());
paramDTO.offsetNum += 1;
}else { //上次累加天数 大于 可用天数
//直接设置价格
......
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;
}
}
......@@ -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.price.CancelStartedVO;
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.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign;
......@@ -108,8 +109,10 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
* @param orderViolateCoverAmount 订单违约金覆盖值
* @param depositViolateCoverAmount 押金违约金覆盖值
*/
public BigDecimal rentRefundProcessCancel(BaseOrder baseOrder, BigDecimal orderDeductSource, Long timeLag, String dicParentKey, BigDecimal depositAmount, BigDecimal depositDeductSource
, OrderAccountDetail oad, BigDecimal topAmount, BigDecimal orderViolateCoverAmount, BigDecimal depositViolateCoverAmount) {
public BigDecimal rentRefundProcessCancel(BaseOrder baseOrder, BigDecimal orderDeductSource, Long timeLag
, String dicParentKey, BigDecimal depositAmount, BigDecimal depositDeductSource
, OrderAccountDetail oad, BigDecimal topAmount, BigDecimal orderViolateCoverAmount, BigDecimal depositViolateCoverAmount
, Boolean noDeduct) {
//原来退款 和 最终退款
BigDecimal originalRefundAmount = BigDecimal.ZERO;
BigDecimal refundAmount = BigDecimal.ZERO;
......@@ -126,6 +129,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
if(null != orderDeductSource && BigDecimal.ZERO.compareTo(orderDeductSource) < 0) {
BigDecimal orderDeductAmount = calculateDeduction(orderDeductSource, timeLag, dicParentKey, orderRefundDescBuilder);
//如果属于免扣费情况
if(noDeduct) {
orderDeductAmount = BigDecimal.ZERO;
orderRefundDescBuilder = new StringBuilder("");
}
orderDeductAmount = orderDeductAmount.setScale(2, RoundingMode.HALF_UP);
if(null != orderViolateCoverAmount) {
orderDeductAmount = orderViolateCoverAmount;
......@@ -159,6 +167,11 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
if(null != depositDeductSource && BigDecimal.ZERO.compareTo(depositDeductSource) < 0) {
//通过原扣除款 计算剩余款
BigDecimal depositDeductAmount = calculateDeduction(depositDeductSource, timeLag, dicParentKey, depositRefundDescBuilder);
//如果属于免扣费情况
if(noDeduct) {
depositDeductAmount = BigDecimal.ZERO;
depositRefundDescBuilder = new StringBuilder("");
}
depositDeductAmount = depositDeductAmount.setScale(2, RoundingMode.HALF_UP);
if(null != orderViolateCoverAmount) {
depositDeductAmount = orderViolateCoverAmount;
......@@ -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()));
......@@ -437,6 +455,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
csv.setViolateDesc("");
//处理更改之后的违约金及描述
handleCrosstownDetail(crosstown, oad, csv);
handleCrosstownDelayDetail(crosstown, oad);
if(StrUtil.isBlank(csv.getViolateDesc())) {
csv.setViolateDesc(inProgressVO.getViolateDesc());
......@@ -451,11 +470,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
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);
//修改押金退还记录状态
......@@ -507,13 +521,13 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
csv.setOverAmountList(inProgressVO.getOverAmountList());
csv.setViolateAmountList(inProgressVO.getViolateAmountList());
if(csv.getUsedDayNum() == orderMQDTO.getOrderRentVehicleDetail().getDayNum()) {
if(csv.getUsedDayNum() == orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()) {
csv.setType(CostDetailExtend.FINLISH_ONTIME);
}else if(csv.getUsedDayNum() > orderMQDTO.getOrderRentVehicleDetail().getDayNum()){
}else if(csv.getUsedDayNum() > orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()){
csv.setType(CostDetailExtend.FINLISH_DELAY);
}else if(csv.getUsedDayNum() < orderMQDTO.getOrderRentVehicleDetail().getDayNum()){
}else if(csv.getUsedDayNum() < orderMQDTO.getOrderRentVehicleDetail().obtainRealDayNum()){
csv.setType(CostDetailExtend.FINLISH_ADVANCE);
}
......@@ -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) {
Boolean flag = Boolean.FALSE;
for(OrderAccountDeduction deduction : oad.getDeductions()) {
if(dte.getCode().equals(deduction.getType())) {
deduction.setName(vio.getDeductions());
BigDecimal diff = vio.getCost().subtract(deduction.getAmount());
//修改归还押金金额
oad.setDepositAmount(oad.getDepositAmount().subtract(diff));
deduction.setAmount(vio.getCost());
//修改归还押金金额
resetDeposit(oad);
//设置订单明细参数
csv.setViolateAmount(csv.getViolateAmount().add(diff));
......@@ -605,7 +662,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
OrderAccountDeduction oadNew = initDeduction(vio.getCost(), vio.getDeductions(), dte, OrderAccountDeduction.ORIGIN_DEPOSIT);
oad.getDeductions().add(oadNew);
//修改归还押金金额
oad.setDepositAmount(oad.getDepositAmount().subtract(oadNew.getAmount()));
resetDeposit(oad);
//设置订单明细参数
csv.setViolateAmount(csv.getViolateAmount().add(oadNew.getAmount()));
......@@ -613,7 +670,6 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
}
}
/**
* 获取每日订单账目,用于统计
* @param term
......
package com.xxfc.platform.order.biz;
import cn.hutool.core.util.StrUtil;
import com.xxfc.platform.order.contant.enumerate.OrderLogEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.xxfc.platform.order.entity.OrderLog;
......@@ -14,5 +17,22 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz;
* @date 2019-07-23 17:33:06
*/
@Service
@Slf4j
public class OrderLogBiz extends BaseBiz<OrderLogMapper,OrderLog> {
public void logChange(Object newObj, Object oldObj, Integer logUserId, String orderNo, OrderLogEnum orderLogEnum) {
try {
OrderLog orderLog = new OrderLog(){{
// setLogUserType();
setType(orderLogEnum.getCode());
setLogUserId(logUserId);
setLogContent(StrUtil.format(orderLogEnum.getContent(), orderNo));
setDetail(StrUtil.format(orderLogEnum.getDesc(), oldObj, newObj));
}};
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
}
}
}
//延期扣除费用
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());
//扣除费用,每次都是重新计算
BigDecimal amount = new BigDecimal(cost.toString()).divide(new BigDecimal("1"), 2, BigDecimal.ROUND_UP);
......
......@@ -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.CostDetailExtend;
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;
......@@ -132,6 +134,16 @@ public class OrderCancelBiz {
//触发退款流程
//判断是否已支付
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())) {
orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail(){{
......@@ -147,10 +159,11 @@ public class OrderCancelBiz {
//根据时间处理goodsAmount
//获取出发时间 到现在 距离时间
Long timeLag = orvd.getStartTime() - System.currentTimeMillis();
if(timeLag < 0 ) {
if(timeLag < 0 && overCancelBuffer) {
Integer useDays = orderCalculateBiz.getIncludeDays(orvd.getStartTime(), System.currentTimeMillis());
if(useDays > orvd.getDayNum()) {
useDays = orvd.getDayNum();
if(useDays > orvd.obtainRealDayNum()) {
useDays = orvd.obtainRealDayNum();
}
inProgressVO = orderCalculateBiz.calculateOrderComplete(baseOrder, orvd, oad, vehicleItemDTO, useDays, Boolean.TRUE);
......@@ -222,7 +235,7 @@ public class OrderCancelBiz {
//退款流程
//违约金封顶 租车身份价 * 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());
......@@ -265,6 +278,7 @@ public class OrderCancelBiz {
}
}else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) {
otd = orderTourDetailBiz.selectOne(new OrderTourDetail(){{
setOrderId(baseOrder.getId());
}});
......@@ -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) {
......
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 {
smsParams.add(orvd.getEndAddr());
smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getStartTime())));
smsParams.add(DateUtil.formatDateTime(DateUtil.date(orvd.getEndTime())));
smsParams.add(orvd.getDayNum().toString());
smsParams.add(orvd.obtainRealDayNum().toString());
smsParams.add(appUserDTO.getUsername());
}
}
......
......@@ -102,7 +102,8 @@ public class RentDepositJobHandler extends IJobHandler {
setType(crosstownTypeEnum);
}});
if(crosstown.getCrtTime().compareTo(System.currentTimeMillis() - (rentDepositAutoRefundTime * 60L * 1000L)) < 0) {
//提前31分钟 31 * 60L * 1000L 退钱
if(crosstown.getCrtTime().compareTo(System.currentTimeMillis() - (rentDepositAutoRefundTime * 60L * 1000L - (31 * 60L * 1000L))) < 0) {
orderAccountBiz.handleRentDepositMargin(baseOrder, orvd, crosstown);
}
......
package com.xxfc.platform.order.rest;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.wxiaoqi.security.admin.entity.AppUserLogin;
......@@ -22,15 +24,22 @@ import com.google.common.collect.Lists;
import com.xxfc.platform.activity.entity.Coupon;
import com.xxfc.platform.activity.feign.ActivityFeign;
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.OrderTypeEnum;
import com.xxfc.platform.order.entity.OrderItem;
import com.xxfc.platform.order.entity.OrderRentVehicleDetail;
import com.xxfc.platform.order.pojo.OrderAccompanyDTO;
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.service.OrderRentVehicleService;
import com.xxfc.platform.tour.entity.TourUser;
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.constant.VehicleBookRecordStatus;
import com.xxfc.platform.vehicle.entity.BranchCompany;
......@@ -39,6 +48,7 @@ import com.xxfc.platform.vehicle.entity.VehicleUserLicense;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxfc.platform.vehicle.pojo.BookVehicleVO;
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.ApiOperation;
import jodd.util.StringUtil;
......@@ -52,17 +62,18 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
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.YMR_SLASH_FORMATTER;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.*;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
@Controller
@RequestMapping("baseOrder")
//@RequestMapping("baseOrder")
@Api(value = "订单后台相关", tags = {"订单后台相关"})
@Slf4j
public class BackStageOrderController extends CommonBaseController implements UserRestInterface {
......@@ -83,6 +94,12 @@ public class BackStageOrderController extends CommonBaseController implements Us
@Autowired
OrderItemBiz orderItemBiz;
@Autowired
OrderCalculateBiz orderCalculateBiz;
@Autowired
OrderDelayBiz orderDelayBiz;
@Autowired
UserFeign userFeign;
......@@ -95,6 +112,9 @@ public class BackStageOrderController extends CommonBaseController implements Us
@Resource
VehicleFeign vehicleFeign;
@Autowired
ThirdFeign thirdFeign;
@Autowired
BackgroundBaseOrderBiz backgroundBaseOrderBiz;
@Override
......@@ -102,7 +122,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return userFeign;
}
@RequestMapping(value = "/getOrderList", method = RequestMethod.GET)
@RequestMapping(value = "/baseOrder/getOrderList", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "获取后台订单列表")
@IgnoreClientToken
......@@ -278,7 +298,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO);
}
@RequestMapping(value = "/getVehicleList", method = RequestMethod.GET)
@RequestMapping(value = "/baseOrder/getVehicleList", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "交还车租车订单列表")
@IgnoreClientToken
......@@ -341,7 +361,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO);
}
@RequestMapping(value = "/getTourList", method = RequestMethod.GET)
@RequestMapping(value = "/baseOrder/getTourList", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "交还车旅游订单列表")
@IgnoreClientToken
......@@ -356,7 +376,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
return new ObjectRestResponse<>().data(pageDataVO);
}
@GetMapping(value = "/orderDetail")
@GetMapping(value = "/baseOrder/orderDetail")
@ApiOperation(value = "交还车获取订单详情,带驾驶人信息")
@IgnoreClientToken
@ResponseBody
......@@ -377,7 +397,7 @@ public class BackStageOrderController extends CommonBaseController implements Us
@ApiOperation("结合后台人员所属公司查询订单详情")
@RequestMapping(value = "/company/{no}", method = RequestMethod.GET)
@RequestMapping(value = "/baseOrder/company/{no}", method = RequestMethod.GET)
@IgnoreClientToken
@ResponseBody
public ObjectRestResponse<OrderPageVO> companyGet(@PathVariable String no) {
......@@ -395,16 +415,15 @@ public class BackStageOrderController extends CommonBaseController implements Us
}
@ApiOperation("更換車輛")
@RequestMapping(value = "/bg/change-vehicle", method = RequestMethod.POST)
@RequestMapping(value = "/baseOrder/bg/change-vehicle", method = RequestMethod.POST)
@IgnoreClientToken
@ResponseBody
public ObjectRestResponse<OrderPageVO> changeVehicle(@RequestBody ChangeVehicleDTO dto) {
checkAdminUser();
//根据订单号获取订单
//查询列表数据
Query query = baseOrderBiz.initQuery(dto.getNo());
query.put("crtUser", null);
query.put("userId", null);
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) {
......@@ -438,13 +457,35 @@ public class BackStageOrderController extends CommonBaseController implements Us
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
public ObjectRestResponse updateEndCompany(@RequestBody OrderRentVehicleDetail orderRentVehicleDetail) {
return baseOrderBiz.save(orderRentVehicleDetail);
}
@GetMapping(value = "/getAll")
@GetMapping(value = "/baseOrder/getAll")
@ResponseBody
public ObjectRestResponse getAllOrderList(BaseOrderController.QueryOrderList dto) {
return backgroundBaseOrderBiz.getAllOrderList(dto);
......
......@@ -207,6 +207,8 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
bo.getOrder().setCrtUser(bo.getCrtUser());
}
//
bo.setMetaEndTime(bo.getEndTime());
super.handleDetail(bo);
}catch (Exception e) {
//事务补偿处理
......
......@@ -110,6 +110,11 @@ public class Activity {
@ApiModelProperty("0-默认;1-报名中,2-进行中;3-已结束")
private Integer status;
@Column(name = "live_url")
@ApiModelProperty("直播地址")
private String liveUrl;
@Column(name = "content")
@ApiModelProperty("活动图文内容(峰会主题)")
private String content;
......
......@@ -81,6 +81,7 @@ public class UserBiz extends BaseBiz<UserMapper, User> {
userId=uses.get(0).getId();
user.setId(userId);
}else {
user.setId(null);
Long time=System.currentTimeMillis()/1000L;
user.setWeId(weId);
user.setRId(rId);
......@@ -97,12 +98,12 @@ public class UserBiz extends BaseBiz<UserMapper, User> {
log.info("----code为空---");
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("code为空"));
}
String openid = "oXDd91MppH9i5F7xzPwigiMj--5w";
/*String access_token = null;
String openid= null ;
String access_token = null;
try {
JSONObject jsonData = weixinService.getAccessToken(code);
openid = jsonData.getString("openid");
access_token = jsonData.getString("access_token");
openid = jsonData.getString("openid");
access_token = jsonData.getString("access_token");
String refresh_token = jsonData.getString("refresh_token");
log.info("-----微信回调userInfo---openid=="+openid+"----access_token==="+access_token);
//验证access_token是否失效
......@@ -116,15 +117,15 @@ public class UserBiz extends BaseBiz<UserMapper, User> {
e.printStackTrace();
log.info("网络异常===" + e.getMessage());
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("网络异常"));
}*/
}
try {
// 获取微信用户基本信息
/* JSONObject userinfo_json = weixinService.getUserInfo(access_token,openid);
JSONObject userinfo_json = weixinService.getUserInfo(access_token,openid);
if (userinfo_json == null || StringUtils.isNotBlank(userinfo_json.getString("errcode"))) {
log.info("调用微信用户基本信息接口失败");
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("调用微信用户基本信息接口失败"));
}
log.info("微信用户基本信息---user===" +userinfo_json.toJSONString());*/
log.info("微信用户基本信息---user===" +userinfo_json.toJSONString());
if (activityId==null||activityId==0){
ActivityBm activityBm=activityBmBiz.userInfo(key);
if (activityBm==null){
......@@ -138,9 +139,9 @@ public class UserBiz extends BaseBiz<UserMapper, User> {
throw new BaseException(ResultCode.FAILED_CODE, Sets.newSet("redis的报名信息activityId---为空"));
}
User userInfo=new User();
String nickName = "苹果呀";//userinfo_json.getString("nickname");
String headimgurl = "http://thirdwx.qlogo.cn/mmopen/4eFHvhmOX6XuiaG6ib7wxkLa8AwMLFIbW9BSJ7EmwC3kRMUdgCrobdRUbhjMXbkY7aBc2CazjXFJiap5ianMH6yQnH2UQ4TfkXJw/132";//userinfo_json.getString("headimgurl");
String sex ="2"; //userinfo_json.getString("sex");
String nickName = userinfo_json.getString("nickname");
String headimgurl =userinfo_json.getString("headimgurl");
String sex =userinfo_json.getString("sex");
if (StringUtils.isBlank(sex)){
sex="0";
}
......
......@@ -56,7 +56,7 @@ public class DictionaryKey {
public static final String TOUR_IN_REFUND = "TOUR_IN_REFUND";
/**
* 租车:公司司机租金、免赔费用、违章预备金
* 租车:公司司机租金、免赔费用、违章预备金、租车时间缓冲(小时)
*/
public static final String DRIVER_PRICE = "DRIVER_PRICE";
public static final String DAMAGE_SAFE = "DAMAGE_SAFE";
......@@ -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 CANCEL_TIME_BUFFER = "CANCEL_TIME_BUFFER";
}
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.vo.GoodDataVO;
import com.github.wxiaoqi.security.common.vo.PageDataVO;
......@@ -16,7 +15,9 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
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.
......@@ -200,6 +201,14 @@ public interface VehicleFeign {
@RequestParam(value = "endDate") Long endDate,
@RequestParam(value = "vehicleModelId") Integer vehicleModelId,
@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")
Map<Integer, String> findCompanyMap();
......
......@@ -7,24 +7,30 @@ import java.util.Map;
@Data
public class BookVehicleVO {
//用途
public static final int BOOK_TYPE_RENT = 1;
/**
* 车辆id
*/
@ApiModelProperty("车辆id")
private String vehicleId;
/**
* 填写RecordId 修改日期
*/
private Long vehicleBookRecordId;
/**
* 预定目标日期(开始)
*/
@ApiModelProperty("预定目标日期(开始)")
@ApiModelProperty("预定目标日期(开始) yyyy-MM-dd HH:mm:ss")
private String bookStartDate;
/**
* 预定目标日期(结束)
*/
@ApiModelProperty("预定目标日期(结束)")
@ApiModelProperty("预定目标日期(结束) yyyy-MM-dd HH:mm:ss")
private String bookEndDate;
/**
......
......@@ -74,4 +74,10 @@ public class UsableVeicleDTO extends PageParam {
this.endDate = DEFAULT_DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endDateTamp), ZoneOffset.ofHours(8)));
this.endDateExtend = DEFAULT_DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(endDateTamp), ZoneOffset.ofHours(8)).plusDays(1L));
}
// private Boolean isTest;
//
// private Integer testCompanyId;
//
// private Integer testModelId;
}
\ No newline at end of file
......@@ -23,6 +23,11 @@ public class VMCalendarPriceCostDTO extends VehicleModelCalendarPriceDTO {
*/
private BigDecimal freeAmount = BigDecimal.ZERO;
/**
* 生效的免费天数
*/
private Integer validFreeDays = 0;
public void setFreeAndConsumeAmount(BigDecimal realAmount, BigDecimal freeAmount) {
setFreeAmount(freeAmount);
setConsumeAmount(realAmount.subtract(freeAmount));
......
......@@ -399,7 +399,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), 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个月
throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH);
}
......@@ -702,7 +702,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
DateTime startDay = DateTime.parse(bookVehicleVo.getBookStartDate(), 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个月
throw new BaseException(ResultCode.ONLY_BOOK_TWO_MONTH);
}
......@@ -824,11 +824,14 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
* @param startDay
* @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)) {
String curDateStr = curDate.toString(DEFAULT_DATE_TIME_FORMATTER);
if (curDateStr.compareTo(DateTime.now().toString(DEFAULT_DATE_TIME_FORMATTER)) < 0) {
throw new BaseException(ResultCode.ONLY_BOOK_FROM_TODAY);
if (!Boolean.TRUE.equals(notCheckTimeLegal)) {
//判定时间是否合法
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);
if (!yearMonthAndDate.containsKey(curYearMonth)) {
......
......@@ -400,7 +400,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr
log.info("参数:【{}==当前时间:{}==价格:{}==折扣:{}】", festivalDayMap, current_date, vehicle_price, discount);
Map<String, Object> vehicle_price_days_map = new HashMap<>(3);
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)) {
VehicleModelHolidayPriceDTO vehicleModelHolidayPriceDTO = festivalDayMap.get(current_date);
if (Objects.nonNull(vehicleModelHolidayPriceDTO)) {
......@@ -408,6 +408,7 @@ public class VehicleModelCalendarPriceBiz extends BaseBiz<VehicleModelCalendarPr
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_days_map.put(PRICE_VAL, vehicle_price);
vehicle_price_days_map.put(DAYS_VAL, free_days);
......
......@@ -229,6 +229,24 @@ public class VehicleController extends BaseController<VehicleBiz> implements Use
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