Commit 4dfba9b0 authored by jiaorz's avatar jiaorz

Merge branch 'base-modify' of http://113.105.137.151:22280/youjj/cloud-platform into base-modify

parents f973f5f9 01701847
......@@ -166,4 +166,44 @@ public class AuthController {
}
/**
* 根据用户id登录 Unbelievable ! ! !
* @param userId
* @return
* @throws Exception
*/
@PostMapping(value = "/applet/uid/login")
public JSONObject appletLoginByUserId(@RequestParam("userId") Integer userId) throws Exception{
log.info(userId+"----require appletLoginByUserId...");
JSONObject data = appAuthService.appletLoginByUserId(userId);
if(data!=null&&data.getInteger("status")== ResultCode.SUCCESS_CODE){
JSONObject result=data.getJSONObject("data");
if(result==null){
data.put("status",1001);
}else {
String token=appAuthService.getToken(String.valueOf(result.get("username")),result.getInteger("userId"));
data.put("token",token);
}
}
return data;
}
@PostMapping(value = "/applet/registry")
public JSONObject registryWithApplet(
@RequestParam(value="username",defaultValue="")String username,
@RequestParam(value="nickname",defaultValue="")String nickname,
@RequestParam(value="headimgurl",defaultValue="")String headimgurl)throws Exception {
JSONObject data=appAuthService.appletRegistry(username,nickname,headimgurl);
if(data!=null&&data.getInteger("status")== ResultCode.SUCCESS_CODE){
JSONObject result=data.getJSONObject("data");
if(result==null){
data.put("status",1001);
}else {
String token=appAuthService.getToken(String.valueOf(result.get("username")),result.getInteger("userId"));
data.put("token",token);
}
}
return data;
}
}
......@@ -6,10 +6,7 @@ import com.github.wxiaoqi.security.api.vo.user.UserInfo;
import com.github.wxiaoqi.security.auth.configuration.FeignConfiguration;
import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
/**
......@@ -51,4 +48,22 @@ public interface IUserService {
public JSONObject reset( @RequestParam(value="username")String username,
@RequestParam(value="mobilecode")String mobilecode,
@RequestParam(value="password")String password);
/**
* 小程序通过用户id登录登录
* @param userid
* @return
*/
@RequestMapping(value = "/api/app/applet/uid/login", method = RequestMethod.POST)
public JSONObject appletLogin(@RequestParam(value = "userid") Integer userid);
/**
* 小程序注册
* @param username
* @param nickname
* @param headimgurl
* @return
*/
@PostMapping("/api/app/applet/registry")
public JSONObject appletRegistry(@RequestParam(value="username")String username, @RequestParam(value="nickname")String nickname,@RequestParam(value="headimgurl")String headimgurl);
}
......@@ -3,6 +3,7 @@ package com.github.wxiaoqi.security.auth.service;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest;
import org.springframework.web.bind.annotation.RequestParam;
public interface AuthService {
String login(JwtAuthenticationRequest authenticationRequest) throws Exception;
......@@ -16,4 +17,20 @@ public interface AuthService {
JSONObject tlogin(String username, String password,String mobilecode,Integer type) throws Exception;
String getToken(String username,Integer id) throws Exception;
JSONObject reset(String username, String mobilecode, String password) throws Exception;
/**
* 使用用户id登录 Unbelievable ! ! !
* @param userid
* @return
*/
JSONObject appletLoginByUserId(Integer userid);
/**
* 通过小程序注册
* @param username
* @param headimgurl
* @param nickname
* @return
*/
JSONObject appletRegistry(String username,String headimgurl,String nickname);
}
......@@ -86,4 +86,14 @@ public class AppAuthServiceImpl implements AuthService {
return userService.reset(username,mobilecode,password);
}
@Override
public JSONObject appletLoginByUserId(Integer userid) {
return userService.appletLogin(userid);
}
@Override
public JSONObject appletRegistry(String username,String headimgurl,String nickname) {
return userService.appletRegistry(username,headimgurl,nickname);
}
}
......@@ -83,4 +83,14 @@ public class AuthServiceImpl implements AuthService {
public JSONObject reset(String username, String mobilecode, String password) throws Exception {
return userService.reset(username,mobilecode,password);
}
@Override
public JSONObject appletLoginByUserId(Integer userid) {
return userService.appletLogin(userid);
}
@Override
public JSONObject appletRegistry(String username,String headimgurl,String nickname) {
return userService.appletRegistry(username,headimgurl,nickname);
}
}
......@@ -4,6 +4,7 @@ import com.github.wxiaoqi.security.common.constant.RestCode;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import java.util.Map;
import java.util.Set;
/**
* Created by ace on 2017/9/8.
......@@ -57,4 +58,9 @@ public class BaseException extends RuntimeException {
super(ResultCode.getMsg(code) + (map == null? "" : map.toString()));
this.status = code;
}
public BaseException(int code, Set<String> set) {
super(ResultCode.getMsg(code)+ (set == null? "" : set.toString()));
this.status = code;
}
}
package com.github.wxiaoqi.security.common.util;
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.Map;
/**
*
* @ClassName: IntervalUtil
* @author: kangyl17909
* @date: 2018年7月3日
*/
public class IntervalUtil {
/**
* 判断data_value是否在interval区间范围内
* @author: kangyl17909
* @date: 2018年7月3日
* @param data_value 数值类型的
* @param interval 正常的数学区间,包括无穷大等,如:(1,3)、>5%、(-∞,6]、(125%,135%)U(70%,80%)
* @return true:表示data_value在区间interval范围内,false:表示data_value不在区间interval范围内
*/
public boolean isInTheInterval(String data_value,String interval) {
//将区间和data_value转化为可计算的表达式
String formula = getFormulaByAllInterval(data_value,interval,"||");
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
try {
//计算表达式
return (Boolean) jse.eval(formula);
} catch (Exception t) {
return false;
}
}
/**
* 将所有阀值区间转化为公式:如
* [75,80) =》 date_value < 80 && date_value >= 75
* (125%,135%)U(70%,80%) =》 (date_value < 1.35 && date_value > 1.25) || (date_value < 0.8 && date_value > 0.7)
* @param date_value
* @param interval 形式如:(125%,135%)U(70%,80%)
* @param connector 连接符 如:") || ("
*/
private String getFormulaByAllInterval(String date_value, String interval, String connector) {
StringBuffer buff = new StringBuffer();
for(String limit:interval.split("U")){//如:(125%,135%)U (70%,80%)
buff.append("(").append(getFormulaByInterval(date_value, limit," && ")).append(")").append(connector);
}
String allLimitInvel = buff.toString();
int index = allLimitInvel.lastIndexOf(connector);
allLimitInvel = allLimitInvel.substring(0,index);
return allLimitInvel;
}
/**
* 将整个阀值区间转化为公式:如
* 145) =》 date_value < 145
* [75,80) =》 date_value < 80 && date_value >= 75
* @param date_value
* @param interval 形式如:145)、[75,80)
* @param connector 连接符 如:&&
*/
private String getFormulaByInterval(String date_value, String interval, String connector) {
StringBuffer buff = new StringBuffer();
for(String halfInterval:interval.split(",")){//如:[75,80)、≥80
buff.append(getFormulaByHalfInterval(halfInterval, date_value)).append(connector);
}
String limitInvel = buff.toString();
int index = limitInvel.lastIndexOf(connector);
limitInvel = limitInvel.substring(0,index);
return limitInvel;
}
/**
* 将半个阀值区间转化为公式:如
* 145) =》 date_value < 145
* ≥80% =》 date_value >= 0.8
* [130 =》 date_value >= 130
* <80% =》 date_value < 0.8
* @param halfInterval 形式如:145)、≥80%、[130、<80%
* @param date_value
* @return date_value < 145
*/
private String getFormulaByHalfInterval(String halfInterval, String date_value) {
halfInterval = halfInterval.trim();
if(halfInterval.contains("∞")){//包含无穷大则不需要公式
return "1 == 1";
}
StringBuffer formula = new StringBuffer();
String data = "";
String opera = "";
if(halfInterval.matches("^([<>≤≥\\[\\(]{1}(-?\\d+.?\\d*\\%?))$")){//表示判断方向(如>)在前面 如:≥80%
opera = halfInterval.substring(0,1);
data = halfInterval.substring(1);
}else{//[130、145)
opera = halfInterval.substring(halfInterval.length()-1);
data = halfInterval.substring(0,halfInterval.length()-1);
}
double value = dealPercent(data);
formula.append(date_value).append(" ").append(opera).append(" ").append(value);
String a = formula.toString();
//转化特定字符
return a.replace("[", ">=").replace("(", ">").replace("]", "<=").replace(")", "<").replace("≤", "<=").replace("≥", ">=");
}
/**
* 去除百分号,转为小数
* @param str 可能含百分号的数字
* @return
*/
private double dealPercent(String str){
double d = 0.0;
if(str.contains("%")){
str = str.substring(0,str.length()-1);
d = Double.parseDouble(str)/100;
}else{
d = Double.parseDouble(str);
}
return d;
}
public static boolean staticIsInTheInterval(String data_value,String interval) {
return new IntervalUtil().isInTheInterval(data_value, interval);
}
public static Object evaluate(String expression, JexlContext jexlContext) {
Expression e = new JexlEngine().createExpression(expression);
return e.evaluate(jexlContext);
}
public static Object evaluate(String expression, Map<String, Object> jexlContextMap) {
Expression e = new JexlEngine().createExpression(expression);
JexlContext jexlContext = new MapContext();
jexlContextMap.forEach((k, v) -> jexlContext.set(k, v));
return e.evaluate(jexlContext);
}
public static void main(String[] args) {
IntervalUtil a = new IntervalUtil();
System.out.println(a.isInTheInterval("6", "(-∞,6]"));
}
}
......@@ -6,7 +6,9 @@ import com.github.wxiaoqi.security.common.util.SystemProperty;
public class ResultCode {
////////////////////////////参数相关///////////////////////////
//参数非法,请修改
public static int PARAM_ILLEGAL_CODE = Integer.valueOf(SystemProperty.getResultConfig("PARAM_ILLEGAL_CODE"));
//参数时效已过时,不能使用
public static int PARAM_EXPIRE_CODE = Integer.valueOf(SystemProperty.getResultConfig("PARAM_EXPIRE_CODE"));
// 操作成功
......
package com.github.wxiaoqi.security.admin.constant.enumerate;
/**
* @author libin
* @version 1.0
* @description 用户来源
* @data 2019/7/3 18:31
*/
public enum UserSourceEnum {
APP(0,"APP"),
APPLET(1,"小程序"),
NEWPROMOTION(2,"新人推广");
private int code;
private String source;
UserSourceEnum(int code, String source) {
this.code = code;
this.source = source;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
}
......@@ -31,5 +31,6 @@ public class AppUserDetail {
private Long createtime;
private Long updatetime;
private Integer isdel;
private Integer channel;
}
......@@ -35,5 +35,39 @@ public class AppUserLogin {
private String idNumber;
@Column(name = "certification_status")
private Integer certificationStatus;
/**
* 创建ip
*/
@Column(name = "crt_host")
private String crtHost;
/**
* 更新ip
*/
@Column(name = "upd_host")
private String updHost;
/**
* 最后登录ip
*/
@Column(name = "last_host")
private String lastHost;
/**
* 最后登录时间
*/
@Column(name = "last_time")
private Long lastTime;
/**
* 省份编号
*/
@Column(name = "province_code")
private Integer provinceCode;
/**
* 市编号
*/
@Column(name = "city_code")
private Integer cityCode;
}
......@@ -219,6 +219,11 @@
<version>2.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.xxfc.platform</groupId>
<artifactId>xx-universal-api</artifactId>
<version>2.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>ace-admin</finalName>
......
......@@ -8,6 +8,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import tk.mybatis.spring.annotation.MapperScan;
......@@ -22,13 +23,13 @@ import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient
@EnableCircuitBreaker
@SpringBootApplication
@EnableFeignClients(value = {"com.github.wxiaoqi.security","com.xxfc.platform"},defaultConfiguration = HeaderConfig.class)
@EnableScheduling
@EnableAceAuthClient
@EnableAceCache
@EnableTransactionManagement
@MapperScan("com.github.wxiaoqi.security.admin.mapper")
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
//@EnableSwagger2Doc
public class AdminBootstrap {
public static void main(String[] args) {
......
......@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
......@@ -100,7 +101,7 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
public AppUserLogin checkeUserLogin(String username) {
Example example = new Example(AppUserLogin.class);
example.createCriteria().andEqualTo("username", username).andEqualTo("isdel", 0);
example.createCriteria().andEqualTo("username", username).andEqualTo("isdel", 0).andEqualTo("status",0);
List<AppUserLogin> userLoginList = mapper.selectByExample(example);
if (userLoginList != null && userLoginList.size() != 0) {
return userLoginList.get(0);
......@@ -150,5 +151,12 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
return mapper.selectByPrimaryKey(userId);
}
/**
* 登录信息更改
* @param userId
* @param ip
*/
public void updateLoginInfo(Integer userId,String ip){
mapper.updateLoginUserInfoById(userId,ip, Instant.now().toEpochMilli());
}
}
......@@ -7,6 +7,7 @@ import com.github.wxiaoqi.security.admin.vo.AppUserVo;
import com.github.wxiaoqi.security.admin.vo.UserMemberVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.wxiaoqi.security.admin.entity.BaseUserMember;
......@@ -30,14 +31,14 @@ public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper,BaseUserMemb
AppUserDetailBiz detailBiz;
//获取用户会员信息
@Cache(key = "user:member{1}")
@Cache(key = "user:member{1}")
public UserMemberVo getMemberInfoByUserId(Integer userId){
return mapper.getInfoByUserId(userId);
}
//更新会员信息
@Override
@CacheClear(key = "user:member{1.userid}")
@CacheClear(key = "user:member{1.userId}")
public void updateSelectiveById(BaseUserMember userMember){ super.updateSelectiveById(userMember);}
......@@ -61,13 +62,23 @@ public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper,BaseUserMemb
baseUserMember.setBuyCount(1);
insertSelective(baseUserMember);
}else {
Integer discount=userMemberVo.getDiscount()==null?0:userMemberVo.getDiscount();
Integer discount1=baseUserMember.getDiscount()==null?0:baseUserMember.getDiscount();
if(discount<discount1){
baseUserMember.setDiscount(discount);
}
Integer level=userMemberVo.getMemberLevel()==null?0:userMemberVo.getMemberLevel();
Integer level1=baseUserMember.getMemberLevel()==null?0:baseUserMember.getMemberLevel();
if(level>level1){
baseUserMember.setMemberLevel(level);
}
baseUserMember.setId(userMemberVo.getId());
totalNumber+=userMemberVo.getTotalNumber()==null?0:userMemberVo.getTotalNumber();
freeDays+=userMemberVo.getRentFreeDays()==null?0:userMemberVo.getRentFreeDays();
baseUserMember.setBuyCount(userMemberVo.getBuyCount()+1);
baseUserMember.setTotalNumber(totalNumber);
baseUserMember.setRentFreeDays(freeDays);
updateSelectiveById(baseUserMember);
getMyBiz().updateSelectiveById(baseUserMember);
}
AppUserVo userVo= detailBiz.getUserInfoById(userId);
if(userVo!=null&&(userVo.getIsMember()==null||userVo.getIsMember()==0)){
......@@ -106,7 +117,7 @@ public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper,BaseUserMemb
if(freeDays>0&&freeDays>=days){
freeDays=freeDays-days;
baseUserMember.setRentFreeDays(freeDays);
updateSelectiveById(baseUserMember);
getMyBiz().updateSelectiveById(baseUserMember);
num=freeDays;
}
}else if(type==2){
......@@ -122,17 +133,17 @@ public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper,BaseUserMemb
Integer payCount=userMemberVo.getPayCount()==null?0:userMemberVo.getPayCount();
payCount=payCount+1;
baseUserMember.setPayCount(payCount);
updateSelectiveById(baseUserMember);
getMyBiz().updateSelectiveById(baseUserMember);
num=freeDays;
}else {
/*lockDays=lockDays>0?(lockDays-days)>0?(lockDays-days):0:0;
baseUserMember.setLockDays(lockDays);
updateSelectiveById(baseUserMember);
getMyBiz().updateSelectiveById(baseUserMember);
num=freeDays-lockDays;*/
freeDays=(freeDays+days)>0?(freeDays+days):0;
freeDays=freeDays>totalNumber?totalNumber:freeDays;
baseUserMember.setRentFreeDays(freeDays);
updateSelectiveById(baseUserMember);
getMyBiz().updateSelectiveById(baseUserMember);
num=freeDays;
}
......@@ -140,7 +151,9 @@ public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper,BaseUserMemb
return num;
}
private BaseUserMemberBiz getMyBiz() {
return AopContext.currentProxy() != null ? (BaseUserMemberBiz) AopContext.currentProxy() : this;
}
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
......@@ -64,4 +65,8 @@ public class WebConfiguration implements WebMvcConfigurer {
return list;
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
......@@ -2,9 +2,19 @@ package com.github.wxiaoqi.security.admin.mapper;
import com.github.wxiaoqi.security.admin.entity.AppUserLogin;
import com.github.wxiaoqi.security.admin.entity.AppUserManage;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import tk.mybatis.mapper.common.Mapper;
public interface AppUserLoginMapper extends Mapper<AppUserLogin> {
/**
* 登录信息更改 ip 登录时间
* @param userId
* @param ip
* @param lastTime
*/
@Update("update `app_user_login` set `last_host`=#{ip},`last_time`=#{lastTime} where `id`=#{userId}")
void updateLoginUserInfoById(@Param("userId") Integer userId,@Param("ip") String ip, @Param("lastTime") long lastTime);
}
\ No newline at end of file
......@@ -171,5 +171,30 @@ public class AppUserRest {
return appPermissionService.upAuthentication(userId,name,idNumber,status);
}
/**
* 通过用户id登录 unbelievable! ! !
* @param userid
* @return
*/
@PostMapping("/applet/uid/login")
public JSONObject appletLogin(@RequestParam(value = "userid") Integer userid){
return appPermissionService.appletLoginByUserId(userid);
}
@PostMapping("/applet/registry")
public JSONObject appletRegistry(
@RequestParam(value="username",defaultValue="")String username,
@RequestParam(value="nickname",defaultValue="")String nickname,
@RequestParam(value="headimgurl",defaultValue="")String headimgurl){
if(StringUtils.isBlank(headimgurl)){
headimgurl=SystemConfig.USER_HEADER_URL_DEFAULT;
}
if(StringUtils.isBlank(nickname)){
nickname=SystemConfig.USER_NIKENAME_DEFAULT+(int)((Math.random()*9+1)*100000);
}
return appPermissionService.appletRegistry(username,headimgurl,nickname);
}
}
......@@ -11,6 +11,8 @@
<result property="memberLevel" column="member_level"/>
<result property="cardLeave" column="card_leave"/>
<result property="isBind" column="is_bind"/>
<result property="payCount" column="pay_count"/>
<result property="buyCount" column="buy_count"/>
<result property="totalNumber" column="total_number"/>
<result property="rentFreeDays" column="rent_free_days"/>
<result property="validTime" column="valid_time"/>
......
......@@ -74,6 +74,13 @@ public class AppVersion implements Serializable {
@Column(name = "download_switch")
@ApiModelProperty(value = "下载开关(0:可下载,1:不可下载)")
private Integer downloadSwitch;
/**
* 下载开关(0:可下载,1:不可下载)
*/
@Column(name = "is_compel")
@ApiModelProperty(value = "是否强制:0-否;1-是")
private Integer isCompel;
/**
* 权重
......
package com.xxfc.platform.order.contant.enumerate;
import java.util.HashMap;
import java.util.Map;
public enum CrosstownTypeEnum {
RentVehicle(1, "交车"),
TOUR(2, "还车"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
private static Map<Integer,String> codeAndDesc = new HashMap<Integer, String>();
CrosstownTypeEnum(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ public enum OrderStatusEnum {
ORDER_CRT(1, "创建订单"),
ORDER_CANCEL(2, "取消订单"),
ORDER_UNPAY(3, "待支付"),
ORDER_TOSTART(4, "待进行(待出行)"),
ORDER_TOSTART(4, "待进行(待出行/租车已支付)"),
ORDER_WAIT(5, "出行中(进行中)"),
ORDER_FINISH(6, "已完成"),
;
......
package com.xxfc.platform.order.contant.enumerate;
import java.util.HashMap;
import java.util.Map;
public enum RefundStatusEnum {
NONE(0, "未退还"),
ALL(1, "已退还所有钱"),
RESIDUE_ILLEGAL(2, "已退还部分押金(保留违章预备金)"),
REFUND_DEPOSIT(3, "已退还所有押金(扣除该扣除的)"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
private static Map<Integer,String> codeAndDesc = new HashMap<Integer, String>();
RefundStatusEnum(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
\ No newline at end of file
......@@ -47,7 +47,7 @@ public class BaseOrder implements Serializable {
* 订单类型 1--租车;2--旅游
*/
@Column(name = "type")
@ApiModelProperty(value = "订单类型 1--租车;2--旅游")
@ApiModelProperty(value = "订单类型 1--租车;2--旅游; 3--会员订单")
private Integer type;
/**
......@@ -190,12 +190,26 @@ public class BaseOrder implements Serializable {
@ApiModelProperty(value = "退款时间")
private Long refundTime;
/**
* 退款状态
*/
@Column(name = "refund_status")
@ApiModelProperty(value = "退款的状态 0--未退还;1--已退还所有钱;2--已退还部分押金(保留违章预备金);3--已退还所有押金(扣除该扣除的)")
private Integer refundStatus;
/**
* 是否有优惠
*/
@Column(name = "has_discount")
@ApiModelProperty(value = "是否有优惠")
private Long hasDiscount;
@ApiModelProperty(value = "是否有优惠 0--无优惠;1--有优惠")
private Integer hasDiscount;
/**
* 是否有优惠
*/
@Column(name = "has_member_right")
@ApiModelProperty(value = "是否有使用会员权益")
private Integer hasMemberRight;
/**
* 是否已支付
......
......@@ -273,13 +273,6 @@ public class OrderRentVehicleDetail implements Serializable {
@ApiModelProperty(value = "出发公司区域id")
private Integer startZoneId;
/**
* 退还钱(押金)的状态 0--未退还;1--已退还所有钱;2--已退还部分押金(保留违章预备金);3--已退还所有押金(扣除该扣除的)
*/
@Column(name = "return_pay_status")
@ApiModelProperty(value = "退还钱(押金)的状态 0--未退还;1--已退还所有钱;2--已退还部分押金(保留违章预备金);3--已退还所有押金(扣除该扣除的)")
private Integer returnPayStatus;
/**
* 剩余需要退还的钱(押金)
*/
......@@ -294,4 +287,11 @@ public class OrderRentVehicleDetail implements Serializable {
@ApiModelProperty(value = "预定记录id")
private Long bookRecordId;
/**
* 是否购买免赔
*/
@Column(name = "damage_safe")
@ApiModelProperty(value = "是否购买免赔")
private Integer damageSafe;
}
......@@ -3,6 +3,7 @@ package com.xxfc.platform.order.entity;
import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
@Table(name = "order_vehicle_crosstown")
@Data
......@@ -99,6 +100,7 @@ public class OrderVehicaleCrosstown {
* 扣除项明细 json
* deductions: 扣除项
* cost:费用
* id:编号(用于顺序)
*/
private String dedDetail;
......@@ -110,12 +112,12 @@ public class OrderVehicaleCrosstown {
/**
* 合计扣除费用
*/
private Integer deductionCost;
private BigDecimal deductionCost;
/**
* 剩余押金
*/
private Integer restDeposit;
private BigDecimal restDeposit;
/**
* 驾驶人Id
......
package com.xxfc.platform.order.pojo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class DedDetailDTO {
/**
* : 扣除项
*/
String deductions;
/**
* :费用
*/
BigDecimal cost;
/**
* 编号(用于顺序)
*/
Integer id;
}
......@@ -16,7 +16,6 @@ public class RentVehicleBO extends OrderRentVehicleDetail implements OrderDetail
private BaseOrder order;
private VehicleModel vehicleModel;
private BookVehicleVO bookVehicleVO;
private Integer damageSafe;
/**
* 是否使用出租免费天数
*/
......
package com.xxfc.platform.order.pojo.order;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class UnitPriceDTO {
@ApiModelProperty(value = "旅游保险单价")
private BigDecimal insurePrice;
}
\ No newline at end of file
package com.xxfc.platform.order.biz;
import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicyBase;
import cn.hutool.core.util.StrUtil;
import com.github.wxiaoqi.security.admin.dto.UserMemberDTO;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.util.IntervalUtil;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.google.common.collect.Lists;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.contant.enumerate.RefundStatusEnum;
import com.xxfc.platform.order.contant.enumerate.RefundTypeEnum;
import com.xxfc.platform.order.entity.*;
import com.xxfc.platform.order.mapper.BaseOrderMapper;
......@@ -22,18 +25,18 @@ import com.xxfc.platform.vehicle.common.RestResponse;
import com.xxfc.platform.vehicle.entity.VehicleUserLicense;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.jexl2.MapContext;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_FALSE;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_TRUE;
import static com.xxfc.platform.universal.constant.DictionaryKey.*;
/**
*
......@@ -165,6 +168,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
* 取消订单
* @param baseOrder
*/
@Transactional
public void cancel(BaseOrder baseOrder) {
if(cancelAble.get(baseOrder.getType()).contains(baseOrder.getStatus())) {
BaseOrder updateOrder = new BaseOrder(){{
......@@ -190,10 +194,14 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
}});
//退款流程
refundProcess(baseOrder, orvd);
rentRefundProcess(baseOrder, orvd.getDeposit(), orvd.getStartTime(), APP_ORDER+ "_"+ RENT_REFUND);
}else if (OrderTypeEnum.TOUR.getCode().equals(baseOrder.getType())) {
OrderTourDetail otd = orderTourDetailBiz.selectOne(new OrderTourDetail(){{
setOrderId(baseOrder.getId());
}});
//退款流程
rentRefundProcess(baseOrder, otd.getStartTime(), APP_ORDER+ "_"+ TOUR_REFUND);
}
}
......@@ -202,7 +210,15 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
OrderRentVehicleDetail orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail(){{
setOrderId(baseOrder.getId());
}});
//取消租车预定
//已支付,并且是待出行状态,取消预约
if(OrderStatusEnum.ORDER_TOSTART.equals(baseOrder.getType()) && SYS_TRUE.equals(baseOrder.getHasPay())){
vehicleFeign.unbookVehicle(orvd.getBookRecordId());
}else {
//未支付,拒绝之前的预约
vehicleFeign.rejectVehicleBooking(orvd.getBookRecordId());
}
//取消租车免费天数使用
if(null != orvd.getFreeDays() && orvd.getFreeDays() > 0) {
......@@ -225,17 +241,104 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
}
}
private void refundProcess(BaseOrder baseOrder, OrderRentVehicleDetail orvd) {
/**
* 租车退款流程(不含押金的通用方法)
* @param baseOrder
* @param startTime
* @param dicParentKey
*/
private void rentRefundProcess(BaseOrder baseOrder, Long startTime, String dicParentKey){
rentRefundProcess(baseOrder, BigDecimal.ZERO, startTime, dicParentKey);
}
/**
* 租车退款流程(含押金)
* @param baseOrder
* @param depositAmont
* @param startTime
* @param dicParentKey
*/
private void rentRefundProcess(BaseOrder baseOrder, BigDecimal depositAmont, Long startTime, String dicParentKey) {
//计算退款金额
// 1、押金 + 租金(规则扣除)
BigDecimal refundAmont = orvd.getDeposit().add(baseOrder.getGoodsAmount());
String refundTradeNo = thirdFeign.refund(new OrderRefundVo(){{
BigDecimal refundGoodsAmount = baseOrder.getGoodsAmount();
String refundDesc = "取消订单退款:";
BigDecimal refundGoodsAmont = baseOrder.getGoodsAmount();
if(null == depositAmont) {
depositAmont = BigDecimal.ZERO;
}
//根据时间处理goodsAmount
//获取出发时间 到现在 距离时间
Long timeLag = startTime - System.currentTimeMillis();
Integer hourLag = Long.valueOf(timeLag/(1000L * 60L * 60L)).intValue();
Map<String, com.xxfc.platform.universal.entity.Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
Set<com.xxfc.platform.universal.entity.Dictionary> rentRefunds = dictionaryMap.get(dicParentKey).getChildrens();
for(com.xxfc.platform.universal.entity.Dictionary dic : rentRefunds) {
if(StrUtil.isBlank(dic.getName())) {
continue;
}
String[] names = dic.getName().split("\\|");
if(names.length < 2) {
continue;
}
//符合范围
if(IntervalUtil.staticIsInTheInterval(hourLag.toString(), names[0])){
refundGoodsAmont = new BigDecimal(((Double) IntervalUtil.evaluate(dic.getDetail(), new MapContext(){{
//ga : goodsAmount
set("ga", baseOrder.getGoodsAmount());
}})).toString());
refundDesc = names[1]+ ","+ refundDesc;
break;
}
}
//退款金额
BigDecimal refundAmont = depositAmont.add(refundGoodsAmont);
//退款子流程: 订单基础,退款描述,退款金额
refundSubProcess(baseOrder, refundDesc, refundAmont, RefundTypeEnum.RentVehicle.getCode(), RefundStatusEnum.ALL.getCode());
}
/**
* 退款子流程
* @param baseOrder
* @param refundDesc
* @param refundAmont
* @param refundType
* @param refundStatus
*/
public void refundSubProcess(BaseOrder baseOrder, String refundDesc, BigDecimal refundAmont, Integer refundType, Integer refundStatus) {
OrderRefundVo orv = new OrderRefundVo(){{
setAmount(baseOrder.getRealAmount().multiply(new BigDecimal("100")).intValue());
setRefundAmount(refundAmont.multiply(new BigDecimal("100")).intValue());
setOrderNo(baseOrder.getNo());
setRefundDesc("取消订单退款:"+ refundAmont.toString());
}}).getData();
}};
orv.setRefundDesc(refundDesc+ refundAmont.toString());
orv.setRefundAmount(refundAmont.multiply(new BigDecimal("100")).intValue());
String refundTradeNo = thirdFeign.refund(orv).getData();
//记录订单退款记录
Integer flag = addOrderRefund(baseOrder.getId(), refundDesc, refundAmont, refundTradeNo, refundType);
//更新订单的退款状态和退款时间
if(SYS_TRUE.equals(flag) && null != refundStatus) {
updateSelectiveByIdReT(new BaseOrder(){{
setRefundStatus(refundStatus);
setRefundTime(System.currentTimeMillis());
}});
}
}
/**
* 记录订单退款记录
* @param orderId
* @param refundDesc
* @param refundAmont
* @param refundTradeNo
*/
private Integer addOrderRefund(Integer orderId, String refundDesc, BigDecimal refundAmont, String refundTradeNo, Integer refundType) {
//如果返回的流水为空,则当做失败
Integer refundStatus = SYS_TRUE;
if(StrUtil.isBlank(refundTradeNo)) {
......@@ -244,15 +347,18 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
//创建订单退款记录
OrderRefund orderRefund = new OrderRefund(){{
setOrderId(baseOrder.getId());
setRefundAmount(refundAmont);
setOrderId(orderId);
setRefundTime(System.currentTimeMillis());
setRefundDesc("取消订单退款:"+ refundAmont.toString());
setTradeNo(refundTradeNo);
setRefundType(RefundTypeEnum.RentVehicle.getCode());
}};
orderRefund.setRefundAmount(refundAmont);
orderRefund.setRefundDesc(refundDesc);
orderRefund.setRefundStatus(refundStatus);
orderRefund.setRefundType(refundType);
orderRefundBiz.insertSelective(orderRefund);
return refundStatus;
}
/**
......@@ -318,4 +424,12 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
log.error(" order has payed , orderNo:{}, tradeNo:{} ", orderNo, tradeNo);
}
}
public BaseOrder updateSelectiveByIdReT(BaseOrder baseOrder) {
if(updateSelectiveByIdRe(baseOrder) > 0) {
return selectById(baseOrder.getId());
}else {
throw new BaseException(ResultCode.DB_OPERATION_FAIL_CODE);
}
}
}
\ No newline at end of file
......@@ -101,7 +101,7 @@ public class OrderTourVerificationBiz{
//核销列表
public ObjectRestResponse getVerifications(TourGoodOrderFindVo tourGoodOrderFindVo){
return ObjectRestResponse.succ(tourFeign.findTourGoodOrders(BeanUtil.beanToMap(tourGoodOrderFindVo)));
return ObjectRestResponse.succ(tourFeign.findTourGoodOrders(tourGoodOrderFindVo));
}
public boolean isPower(List<BranchCompany> list,Integer companyId){
......
package com.xxfc.platform.order.jobhandler;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 跨平台Http任务
*
* @author xuxueli 2018-09-16 03:48:34
*/
@JobHandler(value = "httpJobHandler")
@Component
@Slf4j
public class HttpJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
try {
for(int i =0; i < 10; i++) {
XxlJobLogger.log("helloword");
log.info("helloword");
}
ReturnT returnT = new ReturnT();
returnT.setCode(100);
returnT.setMsg("成功");
returnT.setContent(param);
return returnT;
} catch (Exception e) {
XxlJobLogger.log(e);
return FAIL;
} finally {
;
}
}
}
\ No newline at end of file
package com.xxfc.platform.order.jobhandler;
import cn.hutool.json.JSONUtil;
import com.github.wxiaoqi.security.common.util.IntervalUtil;
import com.xxfc.platform.order.biz.BaseOrderBiz;
import com.xxfc.platform.order.biz.OrderRentVehicleBiz;
import com.xxfc.platform.order.biz.OrderVehicalCrosstownBiz;
import com.xxfc.platform.order.contant.enumerate.*;
import com.xxfc.platform.order.entity.BaseOrder;
import com.xxfc.platform.order.entity.OrderRentVehicleDetail;
import com.xxfc.platform.order.entity.OrderVehicaleCrosstown;
import com.xxfc.platform.order.pojo.DedDetailDTO;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
/**
* 跨平台Http任务
*
* @author xuxueli 2018-09-16 03:48:34
*/
@JobHandler(value = "rentDepositHandler")
@Component
@Slf4j
public class RentDepositHandler extends IJobHandler {
@Autowired
BaseOrderBiz baseOrderBiz;
@Autowired
OrderRentVehicleBiz orderRentVehicleBiz;
@Autowired
OrderVehicalCrosstownBiz crosstownBiz;
@Autowired
ThirdFeign thirdFeign;
@Override
public ReturnT<String> execute(String idLastNumInterval) throws Exception {
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
BigDecimal illegalReserve = new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.ILLEGAL_RESERVE).getDetail());
try {
for(int i = 0; i < 10; i++) {
if(IntervalUtil.staticIsInTheInterval(String.valueOf(i), idLastNumInterval)) {
List<BaseOrder> lists = baseOrderBiz.selectByExample(new Example.Builder(BaseOrder.class)
//订单已完成的租车订单
.where(WeekendSqls.<BaseOrder>custom().andEqualTo(BaseOrder::getType, OrderTypeEnum.RentVehicle)
.andEqualTo(BaseOrder::getStatus, OrderStatusEnum.ORDER_FINISH)
.andLike(BaseOrder::getId, "%"+ String.valueOf(i))).build());
//处理自动退押金
for(BaseOrder baseOrder : lists) {
OrderRentVehicleDetail orvd = orderRentVehicleBiz.selectOne(new OrderRentVehicleDetail() {{
setOrderId(baseOrder.getId());
}});
//未退还, 进行保留违章预备金 的退还
if(RefundStatusEnum.NONE.getCode().equals(baseOrder.getRefundStatus())) {
OrderVehicaleCrosstown crosstown = crosstownBiz.selectOne(new OrderVehicaleCrosstown(){{
setOrderId(baseOrder.getId());
setType(CrosstownTypeEnum.TOUR.getCode());
}});
BigDecimal refundAmont = crosstown.getRestDeposit().subtract(illegalReserve);
List<DedDetailDTO> dddList = JSONUtil.toBean(crosstown.getDedDetail(), List.class);
String refundDesc = "退还押金:"+ refundAmont.toString()+ "(已扣除 违章预备金:"+ illegalReserve.toString();
for(DedDetailDTO ddd : dddList) {
refundDesc += ", "+ ddd.getDeductions()+ ":"+ ddd.getCost();
}
refundDesc += ")";
//退款子流程: 订单基础,退款描述,退款金额
baseOrderBiz.refundSubProcess(baseOrder, refundDesc, refundAmont, RefundTypeEnum.RentVehicle.getCode(), RefundStatusEnum.RESIDUE_ILLEGAL.getCode());
//设置剩余
}else if(RefundStatusEnum.RESIDUE_ILLEGAL.getCode().equals(baseOrder.getRefundStatus())){
//判断是否违章
//扣违章的钱
//baseOrderBiz.refundSubProcess(baseOrder, refundDesc, refundAmont, RefundTypeEnum.RentVehicle.getCode(), RefundStatusEnum.RESIDUE_ILLEGAL.getCode());
}
// baseOrderBiz.refundSubProcess(baseOrder, refundDesc, refundAmont);
}
}
}
ReturnT returnT = new ReturnT(){{
setCode(100);
setMsg("成功");
setContent(idLastNumInterval);
}};
return returnT;
} catch (Exception e) {
XxlJobLogger.log(e);
return FAIL;
} finally {
;
}
}
}
\ No newline at end of file
......@@ -24,8 +24,11 @@ import com.xxfc.platform.order.entity.BaseOrder;
import com.xxfc.platform.order.mqhandler.RabbitProduct;
import com.xxfc.platform.order.pojo.order.CancelOrderDTO;
import com.xxfc.platform.order.pojo.order.OrderPageVO;
import com.xxfc.platform.order.pojo.order.UnitPriceDTO;
import com.xxfc.platform.order.pojo.pay.RentVehicleOrderPayVO;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.constant.enumerate.PayChannelEnum;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.universal.vo.OrderPayVo;
import com.xxfc.platform.vehicle.common.RestResponse;
......@@ -47,8 +50,11 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
@Controller
@RequestMapping("baseOrder")
@Api(value = "订单", tags = {"订单"})
......@@ -83,6 +89,18 @@ public class BaseOrderController extends CommonBaseController {
String qrcodePrefix = "fcwx://order";
String notifyUrl = "/baseOrder/app/unauth/notifyUrl";
@RequestMapping(value = "/app/unauth/getOrderUnitPrice", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "获取订单相关的单价")
@IgnoreClientToken
@IgnoreUserToken
public ObjectRestResponse<UnitPriceDTO> getOrderUnitPrice() {
Map<String, Dictionary> dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
return ObjectRestResponse.succ(new UnitPriceDTO(){{
setInsurePrice(new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.INSURE_PRICE).getDetail()));
}});
}
@RequestMapping(value = "/page", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "订单列表")
......@@ -333,6 +351,13 @@ public class BaseOrderController extends CommonBaseController {
"6--已完成")
private Integer status;
private String multiStatus;
@ApiModelProperty(value = "是否有使用会员权益")
private Integer hasMemberRight;
@ApiModelProperty(value = "订单类型 1--租车;2--旅游; 3--会员订单")
private Integer type;
}
/**
......
......@@ -26,6 +26,8 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.persistence.Column;
@Controller
@RequestMapping("orderRentVehicle")
@Api(value="租车订单",tags={"租车订单"})
......@@ -65,15 +67,19 @@ public class OrderRentVehicleController extends CommonBaseController {
return ObjectRestResponse.succ(orderRentVehicleBiz.listByOrderId(orderId));
}
@RequestMapping(value = "/app/unauth/calculate-price",method = RequestMethod.GET)
@RequestMapping(value = "/calculate-price",method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "价格计算")
@IgnoreUserToken
public ObjectRestResponse<RentVehiclePriceVO> calculatePrice(CalculatePriceVO vo){
RentVehicleBO bo = BeanUtil.toBean(vo, RentVehicleBO.class);
if(StrUtil.isNotBlank(BaseContextHandler.getToken())) {
bo.setAppUserDTO(userFeign.userDetailByToken(BaseContextHandler.getToken()).getData());
}
bo.setOrder(new BaseOrder(){{
setHasMemberRight(vo.getHasMemberRight());
}});
bo.setAppUserDTO(userFeign.userDetailByToken(BaseContextHandler.getToken()).getData());
orderRentVehicleService.initDetailSecond(bo);
return ObjectRestResponse.succ(orderRentVehicleService.calculatePrice(bo));
}
......@@ -100,5 +106,16 @@ public class OrderRentVehicleController extends CommonBaseController {
@ApiModelProperty(value = "是否购买免赔 1--是")
private Integer damageSafe;
/**
* 是否有使用会员权益
*/
@ApiModelProperty(value = "是否有使用会员权益")
private Integer hasMemberRight;
/**
* 是否使用出租免费天数
*/
@ApiModelProperty(value = "是否使用出租免费天数")
private Integer rentFreeDay;
}
}
\ No newline at end of file
......@@ -13,10 +13,12 @@ import com.xxfc.platform.order.entity.BaseOrder;
import com.xxfc.platform.order.entity.inter.OrderDetail;
import com.xxfc.platform.order.mqhandler.RabbitProduct;
import com.xxfc.platform.order.pojo.price.OrderPriceVO;
import com.xxfc.platform.universal.entity.Dictionary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Map;
@Transactional
public abstract class AbstractOrderHandle<Biz extends BaseBiz, Detail extends OrderDetail>{
......@@ -26,6 +28,8 @@ public abstract class AbstractOrderHandle<Biz extends BaseBiz, Detail extends Or
@Autowired
protected Biz detailBiz;
protected Map<String, Dictionary> dictionaryMap;
@Autowired
RabbitProduct rabbitProduct;
......
......@@ -24,6 +24,7 @@ import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.HashSet;
@Service
@Log4j
......@@ -69,8 +70,8 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
super.initDetail(bo);
BaseUserMemberLevel buml = userFeign.level(bo.getMemberLevel());
if(!bo.getMemberLevelId().equals(buml.getId())) {
throw new BaseException(ResultCode.PARAM_ILLEGAL_CODE, new HashMap<String, Object>(){{
put("MemberLevelId 和 MemberLevel", "不对称");
throw new BaseException(ResultCode.PARAM_ILLEGAL_CODE, new HashSet<String>(){{
add("MemberLevelId 和 MemberLevel不对称");
}});
}
bo.setBaseUserMemberLevel(buml);
......
......@@ -20,7 +20,7 @@ import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.entity.OrderTemplate;
import com.xxfc.platform.order.pojo.order.RentVehicleBO;
import com.xxfc.platform.order.pojo.price.RentVehiclePriceVO;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.entity.VehicleBookRecord;
import com.xxfc.platform.vehicle.entity.VehicleModel;
......@@ -33,8 +33,11 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.HashSet;
import static com.github.wxiaoqi.security.admin.constant.enumerate.MemberEnum.*;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_TRUE;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
@Service
@Log4j
......@@ -47,6 +50,7 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
private static Integer DISCOUNT_STATUS_NONE = 0;
private static Integer DISCOUNT_STATUS_MEMBER = 1;
private static Integer DISCOUNT_STATUS_FIXED = 2;
private static Long autoCancelTime;
@Autowired
VehicleFeign vehicleFeign;
......@@ -72,23 +76,21 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
@Override
public void initDetail(RentVehicleBO bo) {
super.initDetail(bo);
initDetailSecond(bo);
}
public void initDetailSecond(RentVehicleBO bo) {
initDictionary();
VehicleModel vehicleModel = vehicleFeign.get(bo.getModelId()).getData();
bo.setVehicleModel(vehicleModel);
}
private void initDictionary() {
Dictionary driverPriceDic = thirdFeign.dictionaryGet(BeanUtil.beanToMap(new Dictionary(){{
setType("APP_ORDER");
setCode("DRIVER_PRICE");
}}, false, true)).getData().get(0);
Dictionary damageSafeDic = thirdFeign.dictionaryGet(BeanUtil.beanToMap(new Dictionary(){{
setType("APP_ORDER");
setCode("DAMAGE_SAFE");
}}, false, true)).getData().get(0);
this.DRIVER_PRICE = new BigDecimal(driverPriceDic.getDetail());
this.DAMAGE_SAFE = new BigDecimal(damageSafeDic.getDetail());
public void initDictionary() {
dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
this.autoCancelTime = Long.valueOf(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.ACT_RENT).getDetail());
this.DRIVER_PRICE = new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.DRIVER_PRICE).getDetail());
this.DAMAGE_SAFE = new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.DAMAGE_SAFE).getDetail());
}
@Override
......@@ -112,9 +114,8 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
super.handleDetail(bo);
//发送定时取消订单(30分钟)
//rabbitProduct.sendDelayMessage(bo.getOrder(), 1000L * 60 * 30);
rabbitProduct.sendDelayMessage(bo.getOrder(), 1000L * 60 * 5);
//发送定时取消订单(数据字典设置--5分钟)
rabbitProduct.sendDelayMessage(bo.getOrder(), autoCancelTime);
}
@Override
......@@ -134,13 +135,16 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
BigDecimal modelAmount = BigDecimal.ZERO;
Integer vehicleDayNum = 0;
Integer freeDayNum = 0;
//当前用户
AppUserDTO dto = detail.getAppUserDTO();
//如果用户存在,并且为会员,并且车辆有优惠价
if(null != dto && null != detail.getRentFreeDay() && detail.getRentFreeDay() > 0 ) {
if(dto.getRentFreeDays() <= 0) {
throw new BaseException(ResultCode.PARAM_EXPIRE_CODE);
if(null == dto.getRentFreeDays() || dto.getRentFreeDays() <= 0) {
throw new BaseException(ResultCode.PARAM_EXPIRE_CODE, new HashSet<String>() {{
add("免费租车天数不存在或为0");
}});
}
if(detail.getDayNum() > dto.getRentFreeDays()) {
freeDayNum = dto.getRentFreeDays();
......@@ -148,6 +152,7 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
freeDayNum = detail.getDayNum();
}
vehicleDayNum = detail.getDayNum() - freeDayNum;
detail.getOrder().setHasMemberRight(SYS_TRUE);
}else {
vehicleDayNum = detail.getDayNum();
}
......@@ -166,18 +171,30 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
switch (MemberEnum.getByCode(detail.getAppUserDTO().getMemberLevel())) {
case NORMAL:
modelAmount = handleDiscount(vehicleModel, prices, NORMAL);
detail.getOrder().setHasMemberRight(SYS_TRUE);
break;
case GOLD:
modelAmount = handleDiscount(vehicleModel, prices, GOLD);
detail.getOrder().setHasMemberRight(SYS_TRUE);
break;
case DIAMOND:
modelAmount = handleDiscount(vehicleModel, prices, DIAMOND);
detail.getOrder().setHasMemberRight(SYS_TRUE);
break;
}
}else {
modelAmount = vehicleModel.getPrice();
}
vehicleAmount = vehicleAmount.add(modelAmount.multiply(BigDecimal.valueOf(vehicleDayNum)));
//优惠券处理
//待完成
//如果有使用会员权益或者优惠券,则设置订单已优惠
if(SYS_TRUE.equals(detail.getOrder().getHasMemberRight())) {
detail.getOrder().setHasDiscount(SYS_TRUE);
}
if(DRIVER_TYPE_COMPANY.equals(detail.getDriverType())) {
//计算司机费用
driverAmount = driverAmount.add(DRIVER_PRICE.multiply(BigDecimal.valueOf(detail.getDayNum())));
......@@ -194,25 +211,26 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
orderAmount = orderAmount.add(goodsAmount).add(vehicleModel.getDeposit());
//生成订单明细
RentVehiclePriceVO rvp = new RentVehiclePriceVO();
rvp.setOrderAmount(orderAmount);
rvp.setGoodsAmount(goodsAmount);
RentVehiclePriceVO rvp = new RentVehiclePriceVO(){{
setOrderAmount(orderAmount);
setGoodsAmount(goodsAmount);
setRealAmount(orderAmount);
setDeposit(vehicleModel.getDeposit());
setDriverPrice(DRIVER_PRICE);
setDamageSafePrice(DAMAGE_SAFE);
setModelName(vehicleModel.getName());
setDayNum(detail.getDayNum());
setVehicleNum(1);
setDriverNum(1);
}};
rvp.setDriverAmount(driverAmount);
rvp.setVehicleAmount(vehicleAmount);
rvp.setDamageSafeAmount(damageSafeAmount);
rvp.setRealAmount(orderAmount);
rvp.setDeposit(vehicleModel.getDeposit());
rvp.setModelAmount(modelAmount);
rvp.setDriverPrice(DRIVER_PRICE);
rvp.setDamageSafePrice(DAMAGE_SAFE);
rvp.setModelName(vehicleModel.getName());
rvp.setDayNum(detail.getDayNum());
rvp.setVehicleDayNum(vehicleDayNum);
rvp.setVehicleNum(1);
rvp.setDriverNum(1);
//设置收费明细
costDetail(rvp, handlechildren(detail, vehicleDayNum));
costDetail(rvp, handleChildren(detail, vehicleDayNum));
return rvp;
}
......@@ -234,7 +252,7 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
return modelAmount;
}
private String handlechildren(RentVehicleBO detail, Integer vehicleDayNum) {
private String handleChildren(RentVehicleBO detail, Integer vehicleDayNum) {
StringBuffer childrenStr = new StringBuffer("");
if(vehicleDayNum > 0) {
childrenStr.append(",${tem_0101}");
......
......@@ -6,7 +6,9 @@ import cn.hutool.core.util.StrUtil;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.xxfc.platform.order.biz.OrderCostDetailBiz;
import com.xxfc.platform.order.biz.OrderTemplateBiz;
import com.xxfc.platform.order.biz.OrderTourDetailBiz;
......@@ -22,6 +24,8 @@ import com.xxfc.platform.tour.entity.TourGoodVerification;
import com.xxfc.platform.tour.entity.TourUser;
import com.xxfc.platform.tour.feign.TourFeign;
import com.xxfc.platform.tour.vo.TourSpePriceVo;
import com.xxfc.platform.universal.constant.DictionaryKey;
import com.xxfc.platform.universal.feign.ThirdFeign;
import com.xxfc.platform.vehicle.entity.SysRegion;
import com.xxfc.platform.vehicle.feign.VehicleFeign;
import com.xxfc.platform.vehicle.pojo.CompanyDetail;
......@@ -34,11 +38,12 @@ import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_FALSE;
import static com.github.wxiaoqi.security.common.constant.CommonConstants.SYS_TRUE;
import static com.xxfc.platform.universal.constant.DictionaryKey.APP_ORDER;
@Service
@Log4j
......@@ -49,13 +54,13 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
@Autowired
VehicleFeign vehicleFeign;
private static Integer IS_CHILD = 1;
private static Integer LEVEL_DEFAULT = 0;
private static Integer NUMBER_ZERO = 0;
private static BigDecimal INSURE_PRICE = new BigDecimal("5.00"); //保险
private static BigDecimal INSURE_PRICE;
private static Long autoCancelTime;
//= new BigDecimal("5.00"); //保险
@Autowired
OrderCostDetailBiz orderCostDetailBiz;
......@@ -69,6 +74,9 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
@Autowired
UserFeign userFeign;
@Autowired
ThirdFeign thirdFeign;
@Autowired
public HttpServletRequest request;
......@@ -84,11 +92,18 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
@Override
public void initDetail(TourBO bo) {
super.initDetail(bo);
initDictionary();
TourGood tourGood = tourFeign.usableGet(bo.getGoodId()).getData();
bo.setTourGood(tourGood);
bo.setAppUserDTO(getUserInfo());
}
public void initDictionary() {
dictionaryMap = thirdFeign.dictionaryGetAll4Map().getData();
this.INSURE_PRICE = new BigDecimal(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.INSURE_PRICE).getDetail());
this.autoCancelTime = Long.valueOf(dictionaryMap.get(APP_ORDER+ "_"+ DictionaryKey.ACT_TOUR).getDetail());
}
@Override
public void handleDetail(TourBO bo) {
//设置订单状态为3
......@@ -117,7 +132,7 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
super.handleDetail(bo);
//发送定时取消订单(30分钟)
rabbitProduct.sendDelayMessage(bo.getOrder(), 1000L * 60 * 30);
rabbitProduct.sendDelayMessage(bo.getOrder(), autoCancelTime);
}
@Override
......@@ -156,6 +171,10 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
detail.setTotalNumber(detail.getAdultNum() + detail.getChildNum());
}
if(detail.getAdultNum() <= 0) {
throw new BaseException(ResultCode.PARAM_ILLEGAL_CODE, new HashSet<String>(){{add("最少一个成人");}});
}
//计算旅游价格
ObjectRestResponse<TourSpePriceVo> objectRestResponse = tourFeign.refund(new TourSpePriceDTO(){{
setChildNumber(detail.getChildNum());
......@@ -172,7 +191,7 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
insureAmount = insureAmount.add(INSURE_PRICE.multiply(new BigDecimal(String.valueOf(detail.getTotalNumber() * detail.getTourGood().getNumber()))));
}
//总价
tourAmount = tourAmount.add(tourSpePriceVo.getTotalPrice()).add(tourSpePriceVo.getChildPrice());
tourAmount = tourAmount.add(tourSpePriceVo.getTotalPrice()).add(tourSpePriceVo.getTotalChildPrice());
//商品价格
goodsAmount = goodsAmount.add(tourAmount);
//总价格
......@@ -193,11 +212,11 @@ public class OrderTourService extends AbstractOrderHandle<OrderTourDetailBiz, To
tpv.setTotalNumber(detail.getTotalNumber());
//设置收费明细
costDetail(tpv, handlechildren(detail));
costDetail(tpv, handleChildren(detail));
return tpv;
}
private String handlechildren(TourBO detail) {
private String handleChildren(TourBO detail) {
StringBuffer childrenStr = new StringBuffer("");
if(NUMBER_ZERO < detail.getAdultNum()) {
childrenStr.append(",${tem_0201}");
......
......@@ -56,6 +56,20 @@
<if test="no != null">
and no = #{no}
</if>
<if test="type != null">
and type = #{type}
</if>
<if test="hasMemberRight != null">
and has_member_right = #{hasMemberRight}
</if>
<if test="multiStatus != null">
and
(
<foreach collection="multiStatus.split(',')" index="sIndex" item="statusEntity" separator=" or ">
status = #{statusEntity}
</foreach>
)
</if>
</where>
order by crt_time desc
</select>
......
......@@ -83,8 +83,8 @@ public interface TourFeign {
* @param tourGoodOrderFindVo
* @return
*/
@GetMapping("/tourGood/verfication/orders")
PageDataVO<TourGoodOrderVo> findTourGoodOrders(@RequestParam("tourGoodOrderFindVo") Map<String,Object> tourGoodOrderFindVo);
@RequestMapping(value = "/tourGood/verfication/orders", method = RequestMethod.POST)
PageDataVO<TourGoodOrderVo> findTourGoodOrders(@RequestBody TourGoodOrderFindVo tourGoodOrderFindVo);
@ApiOperation("首页旅游列表")
@GetMapping(value = "/tourGood/app/shopList")
......
......@@ -66,7 +66,13 @@ public class TourGoodBiz extends BaseBiz<TourGoodMapper, TourGood> {
*/
public ObjectRestResponse<TourGood> getGoodList(int page, int limit , String query , Double latitude, Double longitude, Integer tagId, Double distance){
Map<String, Object> params = initParam(page, limit, query, latitude, longitude, tagId, distance);
return new ObjectRestResponse().status(RestCode.SUCCESS.getStatus()).msg(RestCode.SUCCESS.getMsg()).data(PageDataVO.pageInfo(page, limit, () -> mapper.getGoodList(params)));
PageDataVO<TourGood> dataVO=null;
if(latitude!=null&&latitude>0&&longitude!=null&&longitude>0){
dataVO=PageDataVO.pageInfo(page, limit, ()->mapper.getCoordinateList(params));
}else {
dataVO=PageDataVO.pageInfo(page, limit, ()->mapper.getGoodList(params));
}
return new ObjectRestResponse().status(RestCode.SUCCESS.getStatus()).msg(RestCode.SUCCESS.getMsg()).data(dataVO);
}
private Map<String, Object> initParam(int page, int limit, String query, Double latitude, Double longitude, Integer tagId, Double distance) {
......
......@@ -75,6 +75,9 @@ public class TourGoodDetailBiz extends BaseBiz<TourGoodMapper, TourGood> {
}
}
//获取banner
List<GoodBannerDTO> bannerList = bannerMapper.getBannerList(id);
detailVo.setBannerDTOS(bannerList);
//获取出行时间
List<TourDepartTimeVo> timelist = priceMapper.getAllByGoodId(id);
detailVo.setTourDepartTimeVo(timelist);
......
......@@ -23,6 +23,8 @@ public interface TourGoodMapper extends Mapper<TourGood> {
//查询旅游路线列表
public List<TourGood> getGoodList(@Param("params") Map<String,Object> map);
//根据经纬度查询旅游路线列表
public List<TourGood> getCoordinateList(@Param("params") Map<String,Object> map);
//获取商品列表
public List<TourGoodVo> findGoodList(@Param("params") GoodSearchDTO tourGoodDTO);
......
......@@ -36,7 +36,7 @@ public class TourGoodController extends BaseController<TourGoodBiz, TourGood> {
public ObjectRestResponse<TourGood> getGoodList(@RequestParam(value = "page", required = true) Integer page, @RequestParam(value = "limit", required = true) Integer limit,
@RequestParam(value = "query", required = false) String query, @RequestParam(value = "latitude", required = false) Double latitude,
@RequestParam(value = "longitude", required = false) Double longitude, @RequestParam(value = "tagId", required = false) Integer tagId,
@RequestParam(value = "distance", defaultValue = "10.00") Double distance) {
@RequestParam(value = "distance", defaultValue = "100.00") Double distance) {
return baseBiz.getGoodList(page, limit, query, latitude, longitude, tagId, distance);
}
......
......@@ -21,8 +21,8 @@ public class TourGoodVerificationController extends BaseController<TourGoodVerif
* @return
*/
@ApiOperation("订单列表的查询")
@GetMapping("/orders")
public PageDataVO<TourGoodOrderVo> findTourGoodOrders( TourGoodOrderFindVo tourGoodOrderFindVo){
@RequestMapping(value = "/orders", method = RequestMethod.POST)
public PageDataVO<TourGoodOrderVo> findTourGoodOrders( @RequestBody TourGoodOrderFindVo tourGoodOrderFindVo){
PageDataVO<TourGoodOrderVo> tourGoodOrderPageDataVo = getBaseBiz().findTourGoodOrdersPage(tourGoodOrderFindVo);
return tourGoodOrderPageDataVo;
}
......
......@@ -51,6 +51,21 @@
<result property="isOutside" column="is_outside"/>
</resultMap>
<!--查询旅游路线列表-->
<select id="getCoordinateList" parameterType="java.util.Map" resultMap="tourGoodMap">
SELECT t.* from tour_good t
left join (
select good_id,
IFNULL(ROUND(( (2 * ASIN( SQRT( POW( SIN((latitude * PI() / 180.0- #{params.latitude}* PI() / 180.0)/2), 2)+COS( latitude * PI() / 180.0)*COS( #{params.longitude} * PI() / 180.0)
*POW(SIN((longitude * PI() / 180.0 - #{params.longitude}* PI() /180.0)/2),2))))*6378.137)*10000)/10000 ,0 ) AS distance
FROM tour_good_site WHERE type=2 ) gs ON t.id=gs.good_id
where t.is_del=0 AND t.status=1 and gs.distance &lt; #{params.distance}
<if test="params.query != null and params.query != ''">
and (t.`name` like CONCAT('%',#{params.query},'%') or t.introduce like CONCAT('%',#{params.query},'%'))
</if>
order by gs.distance
</select>
<!--查询旅游路线列表-->
<select id="getGoodList" parameterType="java.util.Map" resultMap="tourGoodMap">
SELECT * from tour_good t
......@@ -58,22 +73,11 @@
<if test="params.query != null and params.query != ''">
and (t.`name` like CONCAT('%',#{params.query},'%') or t.introduce like CONCAT('%',#{params.query},'%'))
</if>
<if test="params.latitude != null and params.latitude != '' and params.longitude != null and params.longitude != ''">
and t.id in (SELECT s.good_id from (
select good_id,
if(ROUND(( (2 * ASIN( SQRT( POW( SIN((latitude * PI() / 180.0- #{params.latitude}* PI() / 180.0)/2), 2)+COS( latitude * PI() / 180.0)*COS( #{params.longitude} * PI() / 180.0)
*POW(SIN((longitude * PI() / 180.0 - #{params.longitude}* PI() /180.0)/2),2))))*6378.137)*10000)/10000 is null ,0,ROUND(( (2 * ASIN( SQRT( POW( SIN((latitude * PI() / 180.0- #{params.latitude}* PI() / 180.0)/2), 2)+COS( latitude * PI() / 180.0)*COS(#{params.longitude} * PI() / 180.0)
*POW(SIN((longitude * PI() / 180.0 - #{params.longitude}* PI() /180.0)/2),2))))*6378.137)*10000)/10000 ) AS distance
FROM tour_good_site
order by distance
) s
where s.distance &lt; #{params.distance})
</if>
<if test="params.tagId != null and params.tagId != '' ">
and t.id in (SELECT tg.good_id from tour_good_tag tg
where tg.tag_id = #{params.tagId}) and t.recommend = 1
ORDER BY t.recommend
</if>
<if test="params.tagId != null and params.tagId != '' ">
and t.id in (SELECT tg.good_id from tour_good_tag tg
where tg.tag_id = #{params.tagId}) and t.recommend = 1
ORDER BY t.recommend
</if>
</select>
......
package com.xxfc.platform.universal.constant;
public class DictionaryKey {
/**
* 订单类型
*/
public static final String APP_ORDER ="APP_ORDER";
/**
* 租车,旅游退款
*/
public static final String RENT_REFUND ="RENT_REFUND";
public static final String TOUR_REFUND ="TOUR_REFUND";
/**
* 租车:公司司机租金、免赔费用、违章预备金
*/
public static final String DRIVER_PRICE ="DRIVER_PRICE";
public static final String DAMAGE_SAFE ="DAMAGE_SAFE";
public static final String ILLEGAL_RESERVE = "ILLEGAL_RESERVE";
/**
* 旅游:保险费用
*/
public static final String INSURE_PRICE ="INSURE_PRICE";
/**
* 自动取消订单时间:租车、旅游
*/
public static final String ACT_RENT = "ACT_RENT";
public static final String ACT_TOUR = "ACT_TOUR";
}
package com.xxfc.platform.vehicle.constant;
package com.xxfc.platform.universal.constant;
public class RedisKey {
/**
......
package com.xxfc.platform.universal.constant;
import java.util.HashMap;
import java.util.Map;
public enum RegionType {
COUNTRY(-1,"国家"),//这一类型不存在db中,只是用于查询所有国家
REGION(0,"地区"),
PROVINCE(1,"省/直辖市"),
CITY(2,"市"),
PREFECTUR(3,"县"),
TOWN(4,"镇"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
private static Map<Integer,String> codeAndDesc = new HashMap<Integer, String>();
//Maps.newHashMap();
static{
for(RegionType constantType : RegionType.values()){
codeAndDesc.put(constantType.getCode(),constantType.getDesc());
}
}
RegionType(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
package com.xxfc.platform.universal.constant;
public enum ResCode {
AUTH_FAIL(-1,"权限验证不通过"),
INVALID_REST_REQ_PARAM(100000,"rest请求参数非法");
/**
* 返回码
*/
private Integer code;
/**
* 描述
*/
private String desc;
ResCode(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xxfc.platform.universal.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/7/3 17:51
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RegionDTO {
private Long id;
private Long parentId;
}
package com.xxfc.platform.universal.entity;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
@Data
@Builder(toBuilder = true)
public class SysRegion {
@Tolerate
public SysRegion() {
}
private Long id;
/**
* 所属父地区id
*/
private Long parentId;
private String name;
/**
* 地区类型 0-国家 1-省/直辖市 2-市 3 - 镇、县
*/
private Integer type;
/**
* 从左往右,第1,2位代表省代码,3、4为代表市代码,5-6位代表镇或县代码
*/
private Integer agencyId;
}
package com.xxfc.platform.universal.feign;
import com.xxfc.platform.universal.dto.RegionDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @author libin
* @version 1.0
* @description 区域码 接口
* @data 2019/7/3 20:00
*/
@FeignClient(value = "xx-universal",contextId = "region")
public interface RegionFeign {
/**
* 根据城市名查询
* @param city
* @return
*/
@GetMapping("/sysRegion/region_name")
RegionDTO getRegionByCityName(@RequestParam(value = "city") String city);
}
......@@ -2,11 +2,10 @@ package com.xxfc.platform.universal.feign;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.universal.dto.RegionDTO;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.entity.OrderRefund;
import com.xxfc.platform.universal.vo.OrderPayVo;
import com.xxfc.platform.universal.vo.OrderRefundVo;
import com.xxfc.platform.universal.vo.TrafficViolations;
import com.xxfc.platform.universal.vo.*;
import feign.Param;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
......@@ -27,8 +26,11 @@ import java.util.Map;
public interface ThirdFeign {
@RequestMapping(value = "/sms/app/unauth/send", method = RequestMethod.GET)
public JSONObject send(@RequestParam(value = "phone") String phone);
@RequestMapping(value = "/sms/app/unauth/sendCode", method = RequestMethod.GET)
//发送短信模板消息
public JSONObject sendCode(@RequestParam("phone") String phone, @RequestParam("code")String code, @RequestParam("templateCode")String templateCode );
@RequestMapping(value = "/file/app/unauth/uploadFiles", method = RequestMethod.POST)
public JSONObject uploadFiles(@RequestParam("files") MultipartFile[] files);
public JSONObject uploadFiles(@RequestParam(value = "files") MultipartFile[] files);
@RequestMapping(value = "/pay/app/wx", method = RequestMethod.POST)
public JSONObject wx(@RequestBody OrderPayVo orderPayVo);
@RequestMapping(value = "/refund/app/wx", method = RequestMethod.POST)
......@@ -61,9 +63,18 @@ public interface ThirdFeign {
// @GetMapping(value = "/dictionary/getParents")
@RequestMapping(value = "/dictionary/getParents", method = RequestMethod.GET)
public ObjectRestResponse<List<Dictionary>> dictionaryGetParent(@RequestParam String type);
public ObjectRestResponse<List<Dictionary>> dictionaryGetParent(@RequestParam(value = "type") String type);
// @GetMapping(value = "/dictionary/get")
@RequestMapping(value = "/dictionary/get", method = RequestMethod.GET)
public ObjectRestResponse<List<Dictionary>> dictionaryGet(@RequestParam Map<String, Object> dictionary);
public ObjectRestResponse<List<Dictionary>> dictionaryGet(@RequestParam(value = "dictionary") Map<String, Object> dictionary);
@RequestMapping(value = "/dictionary/getAll4Map", method = RequestMethod.GET)
public ObjectRestResponse<Map<String, Dictionary>> dictionaryGetAll4Map();
/***************************************** 违章 ********************************************/
@GetMapping("/3p/tv/getRentViolation")
public ObjectRestResponse<List<ViolationVO>> getRentViolation(@RequestParam(value = "rentViolationDTO") Map<String, Object> rentViolationDTO);
}
package com.xxfc.platform.universal.msg;
public class CustomIllegalParamException extends RuntimeException {
public CustomIllegalParamException(String msg){
super(msg);
}
}
package com.xxfc.platform.universal.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class RentViolationDTO {
String vehicleId;
Long startTime;
Long endTime;
}
package com.xxfc.platform.universal.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ViolationVO {
BigDecimal price;
}
......@@ -18,6 +18,12 @@
<version>2.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.xxfc.platform</groupId>
<artifactId>xx-vehicle-api</artifactId>
<version>2.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
......
......@@ -8,6 +8,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication(scanBasePackages = {
......@@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
})
@EnableDiscoveryClient
@EnableAceAuthClient
@EnableScheduling
@EnableAceCache
@EnableTransactionManagement
@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.xxfc.platform.universal.mapper")
......
......@@ -12,10 +12,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@Slf4j
......@@ -83,6 +82,11 @@ public class DictionaryBiz extends BaseBiz<DictionaryMapper, Dictionary> {
if(StringUtils.isEmpty(type)) {
return ObjectRestResponse.paramIsEmpty();
}
List<Dictionary> dictionaryList = getParentCommon(type);
return ObjectRestResponse.succ(dictionaryList);
}
private List<Dictionary> getParentCommon(String type) {
Dictionary dictionary = new Dictionary();
dictionary.setType(type);
dictionary.setPid(0);
......@@ -91,10 +95,19 @@ public class DictionaryBiz extends BaseBiz<DictionaryMapper, Dictionary> {
Set<Dictionary> dictionaryVoList = buildTree(parent.getId());
parent.setChildrens(dictionaryVoList);
}
return ObjectRestResponse.succ(dictionaryList);
return dictionaryList;
}
public Map<String, Dictionary> getAll4Map(){
// List<Dictionary> dictionaries = this.getParentCommon(null);
List<Dictionary> dictionaries = selectListAll();
Map<String, Dictionary> dictionaryMap = dictionaries.parallelStream().collect(Collectors.toMap(dic -> dic.getType()+ "_"+ dic.getCode()
, Function.identity(), (oldValue, newValue) -> newValue));
dictionaryMap.forEach((k,v) -> {
v.setChildrens(buildTree(v.getId()));
});
return dictionaryMap;
}
public DictionaryVo buidTree(Dictionary dictionary) {
DictionaryVo dictionaryVo = new DictionaryVo();
......
package com.xxfc.platform.universal.biz;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists;
import com.xxfc.platform.universal.constant.RedisKey;
import com.xxfc.platform.universal.constant.RegionType;
import com.xxfc.platform.universal.dto.RegionDTO;
import com.xxfc.platform.universal.entity.SysRegion;
import com.xxfc.platform.universal.mapper.SysRegionMapper;
import com.xxfc.platform.universal.msg.CustomIllegalParamException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.util.List;
@Service
@Slf4j
public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
@Autowired
private RedisTemplate customRedisTemplate;//todo redis需要改为多实例
@Autowired
@Qualifier(value = "applicationTaskExecutor")
private TaskExecutor customTaskExecutor;
/**
* 国家没有父地区,其parentId为0
*/
private static final Long PARENT_ID_NONE = 0l;
public List<SysRegion> getRegionsByCodes(List<Long> ids){
List<String> redisCacheKeys = Lists.newArrayList();
if(CollectionUtils.isEmpty(ids)){
throw new CustomIllegalParamException("empty id list");
}
for(Long id:ids){
redisCacheKeys.add(RedisKey.SYS_REGION_CACHE_PREFIX+id);
}
List<String> cachedRegionStrList = customRedisTemplate.opsForValue().multiGet(redisCacheKeys);
List<SysRegion> rs = Lists.newArrayList();
Boolean hasCache = Boolean.TRUE;
for(String cachedRegionStr:cachedRegionStrList){
if(StringUtils.isBlank(cachedRegionStr)){
hasCache = Boolean.FALSE;
continue;
}else{
rs.add(JSONObject.parseObject(cachedRegionStr,SysRegion.class));
}
}
if(!hasCache){//从db读
rs = mapper.getByIdList(ids);
}
return rs;
}
//获取相应地区类型对应在id的位数,作为对应parent查找其下地区的redis key组成部分
private String getPrefixOfAgencyId(Integer type,Long parentId){
return String.valueOf(parentId);
}
/**
* 获取对应redis中的hash的key
* @param parentId
* @return
*/
private String getCacheRedisKey(Long parentId){
//获取相应地区类型对应在agencyId的位数
return RedisKey.SYS_REGION_SONS_CACHE_PREFIX +parentId;
}
/**
* 查询对应地区之下的地区
* @param id
* @return
*/
public List<SysRegion> getSonRegion(Long id){
//从缓存中查询
String redisKey = getCacheRedisKey(id);
String sysRegionListJson = String.valueOf(customRedisTemplate.opsForValue().get(redisKey));
List<SysRegion> sysRegions = null;
if(StringUtils.isNotBlank(sysRegionListJson)){
sysRegions = JSONObject.parseArray(sysRegionListJson,SysRegion.class);
}
if(CollectionUtils.isNotEmpty(sysRegions)){
return sysRegions;
}
//不存在则异步开启刷新缓存任务
refreshCacheAsync();
//从db中查询
return getSonRegionNoCache(id);
}
public List<SysRegion> getSonRegionNoCache(Long parentId){
//从db中查询
SysRegion param = new SysRegion();
param.setParentId(parentId);
return mapper.select(param);
}
public void refreshCacheAsync(){
customTaskExecutor.execute(new Runnable() {
@Override
public void run() {
refreshCache();
}
});
}
/**
* 刷新其孩子节点到缓存,并对其孩子迭代执行此操作
* @param parentId
*/
private void refreshCacheRegionAndSon(Long parentId){
List<SysRegion> sonRegions = getSonRegionNoCache(parentId);
//把当前节点的子节点数据缓存
String redisKey = getCacheRedisKey(parentId);
customRedisTemplate.opsForValue().set(redisKey,JSON.toJSON(sonRegions).toString());
log.info("完成地区【"+parentId+"】的子地区数据缓存");
if(CollectionUtils.isEmpty(sonRegions) || sonRegions.get(0).getType().equals(RegionType.CITY.getCode())){
return;
}
for(SysRegion sonRegion:sonRegions){
//缓存每个地区
customRedisTemplate.opsForValue().set(RedisKey.SYS_REGION_CACHE_PREFIX+sonRegion.getId(),JSON.toJSON(sonRegion).toString());
refreshCacheRegionAndSon(sonRegion.getId());
}
}
/**
* 5分钟内刷新数据到缓存
*/
@Scheduled(cron = "0 */5 * * * *")//每5分钟刷新一次数据
public void refreshCache(){
String redisLockKey = RedisKey.SYS_REGION_REFRESH_LOCK +(DateTime.now().getMinuteOfDay()/5);//同一日每5分钟只刷新一次
Boolean suc = customRedisTemplate.opsForValue().setIfAbsent(redisLockKey, String.valueOf(DateTime.now().getMillis()));
if(!suc){
log.info("刷新地区数据:获取乐观锁失败,不执行任务");
return;
}
log.info("刷新地区数据任务开始");
refreshCacheRegionAndSon(PARENT_ID_NONE);
log.info("刷新常量数据任务成功");
}
/**
* 5分钟内刷新数据到缓存
*/
public List<SysRegion> selectCity(){
List<SysRegion> selectByWeekendSql = mapper.selectByExample(new Example.Builder(SysRegion.class)
.where(WeekendSqls.<SysRegion>custom().andLike(SysRegion::getId, "%00")
.andNotLike(SysRegion::getId, "%0000"))
.build());
return selectByWeekendSql;
}
/**
* 通过属性获取省
* @param type
* @return
*/
public List<SysRegion> getSysRegionByType(Integer type){
SysRegion sysRegion = new SysRegion();
sysRegion.setType(type);
return mapper.select(sysRegion);
}
public RegionDTO findRegionByCityName(String city) {
return mapper.findByCityName(city);
}
}
......@@ -6,6 +6,8 @@ import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
......@@ -51,4 +53,13 @@ public class WebConfiguration implements WebMvcConfigurer {
Collections.addAll(list, urls);
return list;
}
/* @Bean(name = "customTaskExecutor")
TaskExecutor getTaskExecutor(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(5);// 线程池维护线程的最少数量
threadPoolTaskExecutor.setMaxPoolSize(10);// 线程池维护线程的最大数量
threadPoolTaskExecutor.setQueueCapacity(50);// 缓存队列
return threadPoolTaskExecutor;
}*/
}
......@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "dictionary")
......@@ -47,4 +48,10 @@ public class DictionaryController {
public ObjectRestResponse<List<Dictionary>> getParent(String type) {
return dictionaryBiz.getParent(type);
}
@GetMapping(value = "/getAll4Map")
@ApiOperation(value = "获取所有的内容, key为 <type>_<code>")
public ObjectRestResponse<Map<String, Dictionary>> getAll4Map() {
return ObjectRestResponse.succ(dictionaryBiz.getAll4Map());
}
}
......@@ -33,5 +33,12 @@ public class SmsController {
public JSONObject sendSms(@RequestParam("phone") String phone) throws Exception {
return smsService.smsCode(phone);
}
@RequestMapping(value = "/app/unauth/sendCode", method = RequestMethod.GET)
public JSONObject sendCode(
@RequestParam("phone") String phone,
@RequestParam("code")String code,
@RequestParam("templateCode")String templateCode ) throws Exception {
return smsService.smsByCode(phone,code,templateCode);
}
}
package com.xxfc.platform.universal.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.github.wxiaoqi.security.auth.client.annotation.IgnoreClientToken;
import com.github.wxiaoqi.security.auth.client.annotation.IgnoreUserToken;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.rest.BaseController;
import com.xxfc.platform.universal.biz.SysRegionBiz;
import com.xxfc.platform.universal.constant.ResCode;
import com.xxfc.platform.universal.dto.RegionDTO;
import com.xxfc.platform.universal.entity.SysRegion;
import com.xxfc.platform.universal.msg.CustomIllegalParamException;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Arrays;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.util.List;
@RestController
@RequestMapping("/sysRegion")
@IgnoreClientToken
@Slf4j
public class SysRegionController extends BaseController<SysRegionBiz,SysRegion> {
/**
* 父类id获取子类对象
* @param id
* @return
*/
@IgnoreUserToken
@RequestMapping(value ="/sons/{id}",method = RequestMethod.GET)
public ObjectRestResponse<List<SysRegion>> getSonRegion(@PathVariable Long id){
return ObjectRestResponse.succ(baseBiz.getSonRegion(id));
}
/**
* 通过属性获取省
* @param type
* @return
*/
@IgnoreUserToken
@RequestMapping(value ="/getSonRegionByType/{type}",method = RequestMethod.GET)
public ObjectRestResponse<List<SysRegion>> getSysRegionByType(@PathVariable Integer type){
return ObjectRestResponse.succ(baseBiz.getSysRegionByType(type));
}
@RequestMapping(value ="",method = RequestMethod.GET)
public ObjectRestResponse<List<SysRegion>> getRegion(@RequestParam String idListJson){
try {
List<Long> ids = JSON.parseArray(idListJson,Long.class);
return ObjectRestResponse.succ(baseBiz.getRegionsByCodes(ids));
} catch (JSONException ex) {
return ObjectRestResponse.createFailedResultMsg(ResCode.INVALID_REST_REQ_PARAM.getCode());
} catch (CustomIllegalParamException ex){
return ObjectRestResponse.createFailedResultMsg(ResCode.INVALID_REST_REQ_PARAM.getCode());
}
}
/**
* 根据多个id查找省份
* @param ids
* @return
*/
@GetMapping("/getSysRegionByIds/{ids}")
public ObjectRestResponse getSysRegionByIds(@PathVariable String ids){
Example exam = Example.builder(SysRegion.class)
.where(WeekendSqls.<SysRegion>custom()
.andIn(SysRegion::getId, Arrays.asList(ids.split(",")))).build();
return ObjectRestResponse.succ( baseBiz.selectByExample(exam));
}
/**
* 通过城市名查询
* @param city
* @return
*/
@GetMapping("/region_name")
public RegionDTO getRegionByCityName(@RequestParam(value = "city") String city){
return baseBiz.findRegionByCityName(city);
}
}
......@@ -3,10 +3,16 @@ package com.xxfc.platform.universal.controller;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.universal.service.TrafficViolationsService;
import com.xxfc.platform.universal.vo.RentViolationDTO;
import com.xxfc.platform.universal.vo.TrafficViolations;
import com.xxfc.platform.universal.vo.ViolationVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("3p/tv")
public class TrafficViolationsController {
......@@ -56,7 +62,13 @@ public class TrafficViolationsController {
}
}
@GetMapping("/getRentViolation")
public ObjectRestResponse<List<ViolationVO>> getRentViolation(RentViolationDTO rentViolationDTO) {
return ObjectRestResponse.succ(new ArrayList<ViolationVO>(){{
add(new ViolationVO(){{setPrice(new BigDecimal("100.00"));}});
add(new ViolationVO(){{setPrice(new BigDecimal("200.00"));}});
}});
}
}
package com.xxfc.platform.universal.mapper;
import com.xxfc.platform.universal.dto.RegionDTO;
import com.xxfc.platform.universal.entity.SysRegion;
import org.springframework.data.repository.query.Param;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
import java.util.Map;
public interface SysRegionMapper extends Mapper<SysRegion> {
public List<SysRegion> getAllByPage(Map<String, Object> params);
public List<SysRegion> getByIdList(List<Long> idList);
//获取地区的编号
public Integer getNumber(@Param("name") String name);
//获取地区的编号
public Integer getNumberV2(@Param("name") String name, @Param("type") Integer type);
RegionDTO findByCityName(String city);
}
......@@ -57,6 +57,18 @@ public class SmsService {
}
}
public JSONObject smsByCode(String mobile,String pwd,String templateCode){
try {
if(StringUtils.isNotBlank(mobile)){
mobile=mobile.replace(" ", "");
}
sendSmsByStr(mobile,pwd,templateCode);
return JsonResultUtil.createSuccessResult();
} catch (ClientException e) {
e.printStackTrace();
return JsonResultUtil.createDefaultFail();
}
}
public String sendSms(String mobile, String code) throws ClientException {
//可自助调整超时时间
......@@ -93,13 +105,56 @@ public class SmsService {
log.info("RequestId=" + sendSmsResponse.getRequestId());
log.info("BizId=" + sendSmsResponse.getBizId());
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//请求成功
return code;
//请求成功
return code;
}
return null;
}
public boolean sendSmsByStr(String mobile, String str,String templateCode) throws ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(mobile);
//必填:短信签名-可在短信控制台中找到
request.setSignName(SignName);
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(TemplateParam.replace("str",str));//\"name\":\"Tom\",
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.setOutId("yourOutId");
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
log.info("短信接口返回的数据----------------mobile======"+mobile+"----str===="+str);
log.info("Code=" + sendSmsResponse.getCode());
log.info("Message=" + sendSmsResponse.getMessage());
log.info("RequestId=" + sendSmsResponse.getRequestId());
log.info("BizId=" + sendSmsResponse.getBizId());
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//请求成功
return true;
}
return false;
}
/* public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxfc.platform.universal.mapper.SysRegionMapper">
<select id="getAllByPage" parameterType="java.util.Map"
resultType="com.xxfc.platform.universal.entity.SysRegion">
select `id`, parent_id, `name`, `type`, agency_id from sys_region limit #{pageStart},${pageSize}
</select>
<select id="getByIdList" parameterType="java.util.List"
resultType="com.xxfc.platform.universal.entity.SysRegion">
select `id`, parent_id, `name`, `type`, agency_id from sys_region where id in
<foreach collection="list" index="i" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
<select id="getNumber" resultType="Integer">
select `id` from sys_region where name like CONCAT('%',#{name},'%') limit 1
</select>
<select id="getNumberV2" resultType="Integer">
select `id` from sys_region where name like CONCAT('%',#{name},'%') and type=#{type} limit 1
</select>
<select id="findByCityName" resultType="com.xxfc.platform.universal.dto.RegionDTO">
select `id`,`parent_id` as `parentId` from `sys_region` where `type`=2 and `name` like concat('%',#{city} ,'%')
</select>
</mapper>
\ No newline at end of file
......@@ -12,9 +12,12 @@ public enum ResCode {
VEHICLE_BOOKED_INFO_ALREADY_CHANGED(101001,"车辆预定信息已更改,请刷新后继续操作"),
//车辆信息相关返回码-车辆信息
VEHICLE_INFO_SAME_NUM_PLATE_EXISTS(102001,"该车牌车辆已经存在"),
VEHICLE_INFO_SAME_NUM_PLATE_EXISTS(102001,"该车牌已经存在"),
VEHICLE_INFO_BRANCH_NOT_EXIST(102002,"分公司信息非法"),
VEHICLE_INFO_CODE_EXIST(102003,"车辆编码已存在"),
VEHICLE_INFO_SAME_NUM_PLATE_AND_CODE_EMPTY(102004,"车辆编码和车牌号为空"),
VEHICLE_INFO_SAME_NUM_PLATE_AND_CODE_EXIST(102004,"车辆编码或车牌号已存在"),
//车辆信息相关返回码-预定申请信息
VEHICLE_BOOKED_RECORD_ALREADY_CHANGED(103001,"车辆预定申请已被审批,请刷新后继续操作"),
......
......@@ -127,9 +127,11 @@ public class Vehicle {
* 最后更新里程数
*/
private Integer mileageLastUpdate;
/**
* 停车分公司id
* 停车分公司(id)
*/
@Column(name = "park_branch_company_id")
private Integer parkBranchCompanyId;
/**
* 预计目的地分公司id
......
......@@ -37,10 +37,16 @@ public interface VehicleFeign {
@RequestMapping(value ="/branchCompany/app/unauth/detail/{id}",method = RequestMethod.GET)
public ObjectRestResponse<CompanyDetail> getCompanyDetail(@PathVariable Integer id);
@RequestMapping(value = "/unbook/4employee/{bookRecordId}", method = RequestMethod.DELETE)
//拒绝预约
@RequestMapping(value = "/vehicleInfo/book/4employee/reject/{bookRecordId}", method = RequestMethod.PUT)
public RestResponse<Integer> rejectVehicleBooking(@PathVariable Long bookRecordId);
//取消预约
@RequestMapping(value = "/vehicleInfo/unbook/4employee/{bookRecordId}", method = RequestMethod.DELETE)
public RestResponse<Integer> unbookVehicle(@PathVariable Long bookRecordId);
@RequestMapping(value = "/book/4employee/prove/{bookRecordId}", method = RequestMethod.PUT)
//通过预约
@RequestMapping(value = "/vehicleInfo/book/4employee/prove/{bookRecordId}", method = RequestMethod.PUT)
public RestResponse<Integer> proveVehicleBooking(@PathVariable Long bookRecordId);
//获取分公司列表
......
......@@ -41,6 +41,13 @@ public class AddOrUpdateVehicleVo {
@Column(name = "subordinate_branch")
private Integer subordinateBranch;
/**
* 停车分公司(id)
*/
@Column(name = "park_branch_company_id")
private Integer parkBranchCompanyId;
/**
* 用途类型:租赁房车(1)、展车等,对应关系见车辆常量表
*/
......
......@@ -40,6 +40,24 @@ public class QueryVehicleVo {
*/
private String subBranchName;
/**
* 停靠分支机构(id)
*/
private Integer parkBranchCompanyId;
/**
* 停靠分支机构(名称)
*/
private String parkBranchCompanyName;
/**
* 目的地分支机构(id)
*/
private Integer expectDestinationBranchCompanyId;
/**
* 目的地分支机构(名称)
*/
private String expectDestinationBranchCompanyName;
/**
* 用途类型:租赁房车(1)、展车等,对应关系见车辆常量表
*/
......
package com.xxfc.platform.vehicle.pojo;
import lombok.Data;
import java.util.Date;
@Data
public class ResultVehicleVo {
/**
* 主键(uuid)
*/
private String id;
/**
* 车辆编号,0-没有
*/
private Integer code;
/**
* 车辆状态: 1-正常运行 2-维修 3-报废
*/
private Integer status;
/**
* 车牌号,空字符串-没有
*/
private String numberPlate;
/**
* 品牌(编码,对应关系见相关常量),0-未填写
*/
private Integer brand;
/**
* 所属分支机构(id)
*/
private Integer subordinateBranch;
/**
* 所属分支机构(名称)
*/
private String subBranchName;
/**
* 停靠分支机构(id)
*/
private Integer parkBranchCompanyId;
/**
* 停靠分支机构(名称)
*/
private String parkBranchCompanyName;
/**
* 目的地分支机构(id)
*/
private Integer expectDestinationBranchCompanyId;
/**
* 目的地分支机构(名称)
*/
private String expectDestinationBranchCompanyName;
/**
* 用途类型:租赁房车(1)、展车等,对应关系见车辆常量表
*/
private Integer useType;
/**
* 备注信息
*/
private String remark;
private Date createTime;
private Date updateTime;
/**
* 车架号
*/
private String vin;
/**
* 保险公司,见常量表
*/
private Integer insuranceCompany;
/**
* 保险单号
*/
private String insuranceNo;
/**
* 保险开始时间
*/
private Date insuranceStartDate;
/**
* 保险结束时间
*/
private Date insuranceEndDate;
/**
* 年审时间
*/
private Date annualVerificationDate;
/**
* 保养时间
*/
private Date maintenanceDate;
/**
* 保养公里
*/
private Integer mileage;
/**
* 保养里程数
*/
private Integer maintenanceMileage;
/**
* 车辆所属人-类型
*/
private Integer belongTo;
/**
* 所属人 名称
*/
private String belongToName;
/**
* 行驶证路径
*/
private String drivingLicensePath;
/**
* 发动机号
*/
private String engineNum;
/**
* 生产商
*/
private String manufacturer;
/**
* 收车时间
*/
private Date receiveTime;
}
\ No newline at end of file
......@@ -32,11 +32,11 @@ public class VehiclePageQueryVo {
*/
private Integer subordinateBranch;
/**
* 所属分支机构(id)
* 所属省份(id)
*/
private Integer addrProvince;
/**
* 所属分支机构(id)
* 所属市区(id)
*/
private Integer addrCity;
......
......@@ -199,18 +199,27 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
}
for(AddOrUpdateVehicleVo addOrUpdateVehicleVo:addOrUpdateVehicleVoList) {
Vehicle vehicle = new Vehicle();
BeanUtils.copyProperties(vehicle, addOrUpdateVehicleVo);
BeanUtilsBean.getInstance().copyProperties(vehicle, addOrUpdateVehicleVo);
if (addOrUpdateVehicleVo.getParkBranchCompanyId()==null) {
throw new CustomIllegalParamException("Stop at branch office cannot be empty");
}
vehicle.setId(UUID.randomUUID().toString());
// 检查车牌或者编码是否已存在,已存在则返回失败
List<Vehicle> exitsVehicles = lockByCode(addOrUpdateVehicleVo);
if(CollectionUtils.isNotEmpty(exitsVehicles)){
if(addOrUpdateVehicleVo.getCode()!= null &&
addOrUpdateVehicleVo.getCode().equals(exitsVehicles.get(0).getCode())){
return RestResponse.code(ResCode.VEHICLE_INFO_CODE_EXIST.getCode());
}else{
return RestResponse.code(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode());
}
return RestResponse.codeAndMessage(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode(),
ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getDesc());
// if(addOrUpdateVehicleVo.getCode()!= null &&
// addOrUpdateVehicleVo.getCode().equals(exitsVehicles.get(0).getCode())){
// return RestResponse.code(ResCode.VEHICLE_INFO_CODE_EXIST.getCode());
// }else{
// return RestResponse.code(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode());
// }
}
mapper.insertSelective(vehicle);
}
......@@ -223,9 +232,13 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
* @param addOrUpdateVehicleVo
* @return 锁定成功返回
*/
private List<Vehicle> lockByCode(AddOrUpdateVehicleVo addOrUpdateVehicleVo){
if(addOrUpdateVehicleVo.getCode() == null){
return null;
private List<Vehicle> lockByCode(AddOrUpdateVehicleVo addOrUpdateVehicleVo)throws CustomIllegalParamException{
// if(addOrUpdateVehicleVo.getCode() == null){
// return null;
// }
if(addOrUpdateVehicleVo.getNumberPlate() == null){
throw new CustomIllegalParamException("Without a license plate number");
}
List<Vehicle> vehicles = mapper.lockByCode(addOrUpdateVehicleVo);
return vehicles;
......@@ -244,7 +257,11 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
for(AddOrUpdateVehicleVo addOrUpdateVehicleVo:addOrUpdateVehicleVoList){
Vehicle vehicle = new Vehicle();
BeanUtils.copyProperties(vehicle, addOrUpdateVehicleVo);
BeanUtilsBean.getInstance().copyProperties(vehicle, addOrUpdateVehicleVo);
if (addOrUpdateVehicleVo.getParkBranchCompanyId()==null) {
throw new CustomIllegalParamException("Stop at branch office cannot be empty");
}
//悲观锁,检查是否已存在车牌或编码
List<Vehicle> exitsVehicles = lockByCode(addOrUpdateVehicleVo);
if(CollectionUtils.isNotEmpty(exitsVehicles)){
......@@ -252,12 +269,15 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
if(exitsVehicle.getId().equals(addOrUpdateVehicleVo.getId())){
continue;
}
if(addOrUpdateVehicleVo.getCode()!= null &&
addOrUpdateVehicleVo.getCode().equals(exitsVehicles.get(0).getCode())){
return RestResponse.code(ResCode.VEHICLE_INFO_CODE_EXIST.getCode());
}else{
return RestResponse.code(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode());
}
return RestResponse.codeAndMessage(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode(),
ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getDesc());
// if(addOrUpdateVehicleVo.getCode()!= null &&
// addOrUpdateVehicleVo.getCode().equals(exitsVehicles.get(0).getCode())){
// return RestResponse.code(ResCode.VEHICLE_INFO_CODE_EXIST.getCode());
// }else{
// return RestResponse.code(ResCode.VEHICLE_INFO_SAME_NUM_PLATE_EXISTS.getCode());
// }
}
}
mapper.updateByPrimaryKeySelective(vehicle);
......@@ -429,6 +449,11 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
if(effected == 0){//修改失败,手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动回滚
return RestResponse.code(ResCode.VEHICLE_BOOKED_RECORD_ALREADY_CHANGED.getCode());
}else if(VehicleBookRecordStatus.REJECTED.getCode().equals(rsStatus)){
//拒绝,则释放bookinfo
bookVehicleVo.setUnbookStartDate(bookVehicleVo.getBookStartDate());
bookVehicleVo.setUnbookEndDate(bookVehicleVo.getBookEndDate());
Boolean hasSuc = unbookVehicle(bookVehicleVo);
}
return RestResponse.suc();
}
......@@ -625,7 +650,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
}
/**
* 取消预定
* 取消预定(释放bookinfo)
* @return
*/
@Transactional
......@@ -836,7 +861,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
* @return
* @throws Exception
*/
public PageDataVO<QueryVehicleVo> getByPage(VehiclePageQueryVo vehiclePageQueryVo) throws Exception{
public PageDataVO<ResultVehicleVo> getByPage(VehiclePageQueryVo vehiclePageQueryVo) throws Exception{
Map<String, Object> params = PropertyUtils.describe(vehiclePageQueryVo);
Integer pageSize = (Integer) params.get("limit");
params.remove("pageSize");
......@@ -846,8 +871,8 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
adjustBookedInfoParam(params,vehiclePageQueryVo);
params.get("yearMonthAndParam");
PageHelper.startPage(pageNo,pageSize);
List<QueryVehicleVo> vehicles = mapper.getByPage(params);
PageInfo<QueryVehicleVo> vehiclePageInfo = new PageInfo<>(vehicles);
List<ResultVehicleVo> vehicles = mapper.getByPage(params);
PageInfo<ResultVehicleVo> vehiclePageInfo = new PageInfo<>(vehicles);
return PageDataVO.pageInfo(vehiclePageInfo);
}
/**
......@@ -856,7 +881,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
* @return
* @throws Exception
*/
public PageDataVO<QueryVehicleVo> getByPageNotAllData(VehiclePageQueryVo vehiclePageQueryVo, List<Integer> companyList) throws Exception{
public PageDataVO<ResultVehicleVo> getByPageNotAllData(VehiclePageQueryVo vehiclePageQueryVo, List<Integer> companyList) throws Exception{
Map<String, Object> params = PropertyUtils.describe(vehiclePageQueryVo);
Integer pageSize = (Integer) params.get("limit");
params.remove("pageSize");
......@@ -870,8 +895,8 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> {
params.put("companyList", Arrays.asList(-1));
}
PageHelper.startPage(pageNo,pageSize);
List<QueryVehicleVo> vehicles = mapper.getByPageNotAllData(params);
PageInfo<QueryVehicleVo> vehiclePageInfo = new PageInfo<>(vehicles);
List<ResultVehicleVo> vehicles = mapper.getByPageNotAllData(params);
PageInfo<ResultVehicleVo> vehiclePageInfo = new PageInfo<>(vehicles);
return PageDataVO.pageInfo(vehiclePageInfo);
}
......
......@@ -10,6 +10,8 @@ import org.springframework.stereotype.Service;
import com.xxfc.platform.vehicle.entity.VehicleModel;
import com.xxfc.platform.vehicle.mapper.VehicleModelMapper;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.List;
import java.util.stream.Collectors;
......@@ -45,6 +47,9 @@ public class VehicleModelBiz extends BaseBiz<VehicleModelMapper, VehicleModel> {
PageDataVO<VehicleModelVo> mPageDataVO = PageDataVO.pageInfo(vmqc.getPage(),
vmqc.getLimit(), () -> mapper.findVehicleModelPage(vmqc));
// List<VehicleModelVo> vehicleModelVos = mPageDataVO.getData();
// vehicleModelVos.parallelStream().forEach(vehicleModelVo -> vehicleModelVo.setPicture(vehicleModelVo.getPicture().split(",")[0]));
return ObjectRestResponse.succ(mPageDataVO);
} catch (Exception e) {
e.printStackTrace();
......@@ -53,13 +58,14 @@ public class VehicleModelBiz extends BaseBiz<VehicleModelMapper, VehicleModel> {
}
@Transactional
public Integer insertAndGetId(VehicleModel vm) {
try {
mapper.insertSelective(vm);
return vm.getId();
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return null;
......
......@@ -11,9 +11,9 @@ import java.util.Map;
public interface VehicleMapper extends Mapper<Vehicle> {
public List<QueryVehicleVo> getByPage(Map<String, Object> params);
public List<ResultVehicleVo> getByPage(Map<String, Object> params);
public List<QueryVehicleVo> getByPageNotAllData(Map<String, Object> params);
public List<ResultVehicleVo> getByPageNotAllData(Map<String, Object> params);
public int updateStatusById(Map<String, Object> params);
......
......@@ -42,10 +42,7 @@ import org.springframework.web.multipart.MultipartFile;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
......@@ -121,7 +118,7 @@ public class VehicleController extends BaseController<VehicleBiz> {
}
@RequestMapping(value = "/page", method = RequestMethod.GET)
public RestResponse<PageDataVO<QueryVehicleVo>> getByPage(@RequestParam String vehiclePageQueryVoJson) throws Exception {
public RestResponse<PageDataVO<ResultVehicleVo>> getByPage(@RequestParam String vehiclePageQueryVoJson) throws Exception {
VehiclePageQueryVo vehiclePageQueryVo = null;
try {
vehiclePageQueryVo = JSON.parseObject(vehiclePageQueryVoJson, VehiclePageQueryVo.class);
......@@ -144,7 +141,7 @@ public class VehicleController extends BaseController<VehicleBiz> {
@RequestMapping(value = "/small/page", method = RequestMethod.GET)
@IgnoreUserToken
public RestResponse<PageDataVO<QueryVehicleVo>> getByPageBySmall(@RequestParam String vehiclePageQueryVoJson,@RequestParam Integer uid) throws Exception {
public RestResponse<PageDataVO<ResultVehicleVo>> getByPageBySmall(@RequestParam String vehiclePageQueryVoJson,@RequestParam Integer uid) throws Exception {
VehiclePageQueryVo vehiclePageQueryVo = null;
try {
vehiclePageQueryVo = JSON.parseObject(vehiclePageQueryVoJson, VehiclePageQueryVo.class);
......@@ -401,8 +398,8 @@ public class VehicleController extends BaseController<VehicleBiz> {
//查询可车辆信息
PageDataVO<Vehicle> pageDataVO = vehicleBiz.searchUsableVehicle(dto);
if (pageDataVO.getData().size() <= 0) {
throw new BaseException(ResultCode.NOTEXIST_CODE, new HashMap<String, Object>(){{
put("可用车辆", "不存在");
throw new BaseException(ResultCode.NOTEXIST_CODE, new HashSet<String>(){{
add("可用车辆不存在");
}});
}
bookVehicleVo.setVehicleId(pageDataVO.getData().get(0).getId());
......
......@@ -104,6 +104,9 @@ public class VehicleModelController extends BaseController<VehicleModelBiz, Vehi
//
// }
// }
if (vmqc.getIsDel()==null) {
vmqc.setIsDel(0);
}
if (vmqc == null || vmqc.getPage() == null || vmqc.getLimit() == null || vmqc.getPage() < 0 || vmqc.getLimit() <= 0) {
......
......@@ -30,15 +30,21 @@
<select id="getByPage" parameterType="java.util.Map"
resultType="com.xxfc.platform.vehicle.pojo.QueryVehicleVo">
resultType="com.xxfc.platform.vehicle.pojo.ResultVehicleVo">
SELECT r.* FROM (
select DISTINCT v.`id`,
v.`code`,
v.`status`,
v.number_plate,
v.brand,
IFNULL(v.park_branch_company_id,v.expect_destination_branch_company_id) AS subordinate_branch,
IFNULL(bc.name,bc1.name) AS subBranchName,
-- IFNULL(v.park_branch_company_id,v.expect_destination_branch_company_id) AS subordinate_branch,
-- IFNULL(bc.name,bc1.name) AS subBranchName,
v.park_branch_company_id,
bc.name as parkBranchCompanyName,
v.expect_destination_branch_company_id,
bc1.name as expectDestinationBranchCompanyName,
v.subordinate_branch,
bc2.name as subBranchName,
v.use_type,
v.remark,
v.create_time,
......@@ -66,8 +72,14 @@
left join
vehicle_book_info vbi on v.`id` = vbi.vehicle
</if>
-- LEFT JOIN branch_company bc ON v.park_branch_company_id = bc.id
-- LEFT JOIN branch_company bc1 ON v.expect_destination_branch_company_id = bc1.id
-- 停车分公司
LEFT JOIN branch_company bc ON v.park_branch_company_id = bc.id
-- 目的地分公司
LEFT JOIN branch_company bc1 ON v.expect_destination_branch_company_id = bc1.id
-- 所属分公司
LEFT JOIN branch_company bc2 ON v.subordinate_branch = bc2.id
where
v.is_del=0
<if test="mRangeDateEnd !=null">
......@@ -94,9 +106,9 @@
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
</if>
<if test="subordinateBranch !=null">
and v.subordinate_branch = #{subordinateBranch}
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
<!-- </if>-->
<if test="code !=null">
and v.code = #{code}
</if>
......@@ -127,11 +139,12 @@
</foreach>
</if>
<if test="subordinateBranch !=null ">
and ( v.park_branch_company_id = #{subordinateBranch} or v.expect_destination_branch_company_id=#{subordinateBranch} )
and ( v.park_branch_company_id = #{subordinateBranch} or
v.expect_destination_branch_company_id=#{subordinateBranch} )
</if>
<if test=" addrProvince !=null or addrCity !=null or zoneId !=null ">
and (
<trim suffixOverrides="OR">
and (
<trim suffixOverrides="OR">
<if test="addrProvince !=null">
(bc.addr_province=#{addrProvince} or bc1.addr_province=#{addrProvince}) OR
</if>
......@@ -141,23 +154,29 @@
<if test="zoneId !=null">
(bc.zone_id=#{zoneId} or bc1.zone_id=#{zoneId}) OR
</if>
</trim>
)
</trim>
)
</if>
order by v.code
) r ORDER BY r.subBranchName
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="getByPageNotAllData" parameterType="java.util.Map"
resultType="com.xxfc.platform.vehicle.pojo.QueryVehicleVo">
resultType="com.xxfc.platform.vehicle.pojo.ResultVehicleVo">
SELECT r.* FROM (
select DISTINCT v.`id`,
v.`code`,
v.`status`,
v.number_plate,
v.brand,
IFNULL(v.park_branch_company_id,v.expect_destination_branch_company_id) AS subordinate_branch,
IFNULL(bc.name,bc1.name) AS subBranchName,
-- IFNULL(v.park_branch_company_id,v.expect_destination_branch_company_id) AS subordinate_branch,
-- IFNULL(bc.name,bc1.name) AS subBranchName,
v.park_branch_company_id,
bc.name as parkBranchCompanyName,
v.expect_destination_branch_company_id,
bc1.name as expectDestinationBranchCompanyName,
v.subordinate_branch,
bc2.name as subBranchName,
v.use_type,
v.remark,
v.create_time,
......@@ -185,24 +204,36 @@
left join
vehicle_book_info vbi on v.`id` = vbi.vehicle
</if>
-- 停车分公司
LEFT JOIN branch_company bc ON v.park_branch_company_id = bc.id
-- 目的地分公司
LEFT JOIN branch_company bc1 ON v.expect_destination_branch_company_id = bc1.id
-- 所属分公司
LEFT JOIN branch_company bc2 ON v.subordinate_branch = bc2.id
where
v.is_del=0
<if test="companyList != null">
and ( v.park_branch_company_id in (
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
#{companyId},
</foreach>
</trim>
</foreach>
</trim>
)
or v.expect_destination_branch_company_id in (
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
#{companyId},
</foreach>
</trim>
</foreach>
</trim>
)
<!-- or v.subordinate_branch in (-->
<!-- <trim suffixOverrides=",">-->
<!-- <foreach collection="companyList" item="companyId">-->
<!-- #{companyId},-->
<!-- </foreach>-->
<!-- </trim>-->
)
)
)
</if>
......@@ -230,9 +261,9 @@
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
</if>
<if test="subordinateBranch !=null">
and v.subordinate_branch = #{subordinateBranch}
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
<!-- </if>-->
<if test="code !=null">
and v.code = #{code}
</if>
......@@ -262,7 +293,8 @@
</foreach>
</if>
<if test="subordinateBranch !=null ">
and ( v.park_branch_company_id = #{subordinateBranch} or v.expect_destination_branch_company_id=#{subordinateBranch} )
and ( v.park_branch_company_id = #{subordinateBranch} or
v.expect_destination_branch_company_id=#{subordinateBranch} )
</if>
<if test=" addrProvince !=null or addrCity !=null or zoneId !=null ">
and (
......@@ -274,13 +306,13 @@
(bc.addr_city=#{addrProvince} or bc1.addr_city=#{addrProvince}) OR
</if>
<if test="zoneId !=null">
(bc.zone_id=#{zoneId} or bc1.zone_id=#{zoneId}) OR
(bc.zone_id=#{zoneId} or bc1.zone_id=#{zoneId}) OR
</if>
</trim>
)
</if>
order by v.code
) r ORDER BY r.subBranchName
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="lockByCode" resultType="com.xxfc.platform.vehicle.entity.Vehicle"
......@@ -291,8 +323,11 @@
v.number_plate
from vehicle v
where
`code` = #{code}
number_plate=#{numberPlate}
and is_del=0
for update
</select>
<select id="selectByNumberPlate" resultType="com.xxfc.platform.vehicle.entity.Vehicle">
select * from vehicle
......
......@@ -10,9 +10,11 @@
parent_id,name,icon,depict,rank,level,state,crt_time,upd_time,isMore,start_using
) VALUES
<foreach collection ="vpclist" item="vpc" index="index" separator =",">
<if test="vpc.state == 0" >
(#{vpc.parentId},#{vpc.name},#{vpc.icon},#{vpc.depict}
,#{vpc.rank},#{vpc.level},#{vpc.state},#{vpc.crtTime}
,#{vpc.updTime},#{vpc.isMore},#{vpc.startUsing})
</if>
</foreach>
</insert>
......
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