Commit 03857ab8 authored by 周健威's avatar 周健威

Merge branch 'master' into holiday-price

# Conflicts:
#	ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/AppUserSellingWaterBiz.java
#	ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/AppUserController.java
#	xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/biz/inner/OrderCancelBiz.java
#	xx-universal/xx-universal-server/src/main/java/com/xxfc/platform/universal/biz/OrderPayBiz.java
parents c7e48311 09adea94
......@@ -60,6 +60,11 @@ public class AppUserManageDTO {
*/
private Set<Integer> citySet;
/**
* 用户id
*/
private Integer userId;
// /**
// * 接收前台时间范围
// */
......
......@@ -63,6 +63,9 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
@Autowired
private AppUserRelationBiz appUserRelationBiz;
@Autowired
private AppUserSellingWaterBiz appUserSellingWaterBiz;
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Override
public void insertSelective(AppUserLogin entity) {
......@@ -417,11 +420,10 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
leaderId = appUserLogins.get(0).getId();
//2.根据leader userId查询下级 userid
if (Objects.nonNull(leaderId)) {
List<AppUserRelation> appUserRelationList = appUserRelationBiz.findMemberPageByLeaderId(leaderId);
if(CollectionUtils.isEmpty(appUserRelationList)){
memberIds = appUserSellingWaterBiz.findMemberIdByLeaderIdAndOrdreType(leaderId,3);
if(CollectionUtils.isEmpty(memberIds)){
return Collections.EMPTY_LIST;
}
memberIds = appUserRelationList.stream().map(AppUserRelation::getUserId).collect(Collectors.toList());
}
}
List<Integer> userIds = mapper.findAppUser(phone, name, memberIds);
......
......@@ -184,4 +184,14 @@ public class AppUserManageBiz extends BaseBiz<AppUserDetailMapper, AppUserDetail
}
}
public AppUserManageVo findUserInfoById(Integer userId) {
AppUserManageVo appUserManageVo = new AppUserManageVo();
AppUserManageDTO appUserManageDTO = new AppUserManageDTO();
appUserManageDTO.setUserId(userId);
List<AppUserManageVo> appUserManageVos = mapper.selectAppUserManage(appUserManageDTO);
if (CollectionUtils.isEmpty(appUserManageVos)){
return appUserManageVo;
}
return appUserManageVos.get(0);
}
}
......@@ -217,6 +217,9 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
return null;
}
log.info("---userId==="+userId+"-----isForever==="+userRelation.getIsForever());
if (validTime==null||validTime==0){
return userRelation;
}
Long time=System.currentTimeMillis()-validTime;
if (userRelation.getIsForever()==1||userRelation.getBindTime()>time){
return userRelation;
......
......@@ -439,6 +439,18 @@ public class AppUserSellingWaterBiz extends BaseBiz<AppUserSellingWaterMapper, A
return sellingWalletPagVo;
}
public List<Integer> findMemberIdByLeaderIdAndOrdreType(Integer leaderId, int orderType) {
Example example = new Example(AppUserSellingWater.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("userId", leaderId);
criteria.andEqualTo("orderType", orderType);
List<AppUserSellingWater> appUserSellingWaters = mapper.selectByExample(example);
if (CollectionUtils.isEmpty(appUserSellingWaters)){
return Collections.EMPTY_LIST;
}
return appUserSellingWaters.stream().map(AppUserSellingWater::getSourceId).collect(Collectors.toList());
}
public PageDataVO<UserSellingWaterAdminDTO> findSellingWaterWithPage(UserSellingWaterFindDTO userSellingWaterFindDTO) {
PageDataVO<UserSellingWaterAdminDTO> pageDataVO = PageDataVO.pageInfo(userSellingWaterFindDTO.getPage(),
userSellingWaterFindDTO.getLimit(),
......
......@@ -19,13 +19,12 @@ import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.msg.TableResultResponse;
import com.github.wxiaoqi.security.common.rest.CommonBaseController;
import com.github.wxiaoqi.security.common.util.Query;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.xxfc.platform.order.feign.OrderFeign;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -164,6 +163,7 @@ public class AppUserController extends CommonBaseController{
String icon=memberLevel.getIcon();
userDTO.setIcon(icon);
userDTO.setBigIcon(memberLevel.getBigIcon());
userDTO.setItemImg(memberLevel.getItemImg());
}
}
}
......@@ -171,20 +171,7 @@ public class AppUserController extends CommonBaseController{
if (userPosition!=null&&userPosition.getLevel()>0){
userDTO.setPositionName(userPosition.getName());
}
AppUserRelation relation=relationBiz.getRelationByIdUserIdAndTime(userid);
Integer parentId=0;
if (relation!=null){
parentId=relation.getParentId();
}
userDTO.setParentId(parentId);
List<AppUserAlipay> appUserAlipays = appUserAlipayBiz.getByUserId(request);
long count = appUserAlipays.stream().filter(appUserAlipay -> appUserAlipay.getType() == 1).count();
userDTO.setIsBindAliPay(count>0);
userDTO.setId(id);
userDTO.setAliPayNickName(userDTO.getIsBindAliPay()?appUserAlipays.get(0).getNickname():"");
AppUserLogin appUserLogin = appUserLoginBiz.selectById(userid);
userDTO.setIsBindWx(StringUtils.isNotEmpty(appUserLogin.getWxOpenid()));
userDTO.setIsBindQQ(StringUtils.isNotEmpty(appUserLogin.getOpenid()));
return ObjectRestResponse.succ(userDTO);
}
......@@ -234,7 +221,7 @@ public class AppUserController extends CommonBaseController{
appUserLogin.setOpenid(userVo.getOpenid());
appUserLogin.setId(userid);
appUserLogin.setUsername(userVo.getUsername());
appUserLoginBiz.bindOpenid(appUserLogin);
appUserLoginBiz.updateAppuserLogin(appUserLogin);
//支付宝绑定
if (StringUtils.isNotEmpty(userVo.getAliCode()) && userVo.getAliCode().trim().length()>0){
appUserAlipayBiz.getUserInfo(userVo.getAliCode(),request);
......@@ -348,8 +335,6 @@ public class AppUserController extends CommonBaseController{
return appUserLoginBiz.test();
}
@PostMapping("/bind")
private ObjectRestResponse accountBinding(@RequestBody AccountBindDTO accountBindDTO, HttpServletRequest request){
try {
......
......@@ -45,8 +45,10 @@ public class AppUserRelationController extends BaseController<AppUserRelationBiz
@RequestParam(value = "code",defaultValue = "")String code,
HttpServletRequest request){
try {
Integer userid = Integer.parseInt(userAuthUtil.getInfoFromToken(userAuthConfig.getToken(request)).getId());
return baseBiz.appBindRelation(userid,code);
//屏蔽分享绑定
/*Integer userid = Integer.parseInt(userAuthUtil.getInfoFromToken(userAuthConfig.getToken(request)).getId());
return baseBiz.appBindRelation(userid,code);*/
return ObjectRestResponse.succ();
} catch (Exception e) {
e.printStackTrace();
throw new BaseException(e);
......
......@@ -19,7 +19,6 @@ import com.xxfc.platform.vehicle.feign.VehicleFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Set;
/**
......@@ -66,6 +65,12 @@ public class AppUsersManageController extends BaseController<AppUserManageBiz,Ap
appUserManageDTO.setCitySet(cityList);
return ObjectRestResponse.succ(baseBiz.findAllByQueryAndCity(appUserManageDTO));
}
@GetMapping("/user_info/{id}")
public ObjectRestResponse<AppUserManageVo> findUserInfo(@PathVariable(value = "id") Integer userId){
AppUserManageVo appUserManageVo = baseBiz.findUserInfoById(userId);
return ObjectRestResponse.succ(appUserManageVo);
}
/**
* 查询一条
* @param id
......
package com.github.wxiaoqi.security.admin.rest;
import com.github.wxiaoqi.security.admin.biz.AppUserSellingWaterBiz;
import com.github.wxiaoqi.security.admin.dto.OrderWaterDTO;
import com.github.wxiaoqi.security.admin.vo.SellingWalletPagVo;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil;
......@@ -8,10 +9,7 @@ import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
......@@ -34,6 +32,9 @@ public class UserSellingWaterController {
@Autowired
private UserAuthConfig userAuthConfig;
@Autowired
private AppUserSellingWaterBiz waterBiz;
@GetMapping("/page")
public ObjectRestResponse<SellingWalletPagVo> findSellingWaterPage(@RequestParam(required = false,value = "type") Integer wating,
@RequestParam("pageNo") Integer pageNo,
......@@ -61,4 +62,14 @@ public class UserSellingWaterController {
throw new BaseException(e);
}
}
@PostMapping("app/unauth/order")
public ObjectRestResponse order(@RequestBody OrderWaterDTO orderWaterDTO) {
try {
waterBiz.orderWater(orderWaterDTO);
return ObjectRestResponse.succ();
} catch (Exception e) {
throw new BaseException(e);
}
}
}
......@@ -434,13 +434,14 @@ public class AppPermissionService {
if(type!=null&&type==1){
try {
Integer parentId=0;
if (StringUtils.isNotBlank(code)) {
//屏蔽app登录的绑定关系
/*if (StringUtils.isNotBlank(code)) {
parentId = appUserDetailBiz.getUserByCode(code);
}
//绑定上下线关系
if (parentId != null && parentId > 0) {
relationBiz.bindRelation(userid, parentId, 1);
}
}*/
//活动消息
Integer state=userVo.getState();
log.info("-----------autoLogin----state==="+state);
......
......@@ -165,6 +165,9 @@
<if test="source !=null ">
and d.source = #{source}
</if>
<if test="userId!=null">
and l.id=#{userId}
</if>
<if test="citySet != null ">
and d.city_code in
<foreach collection="citySet" item="item" index="index" open="(" separator="," close=")" >
......
......@@ -156,6 +156,9 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
if(null != orderViolateCoverAmount) {
depositDeductAmount = orderViolateCoverAmount;
}
if (null != depositViolateCoverAmount) {
depositDeductAmount = depositViolateCoverAmount;
}
if(topAmount.compareTo(depositDeductAmount) > 0) {
totalDeductAmount = totalDeductAmount.add(depositDeductAmount);
topAmount = topAmount.subtract(depositDeductAmount);
......@@ -215,6 +218,23 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
orv.setOrderNo(baseOrder.getNo());
orv.setRefundDesc(refundDesc+ refundAmount.toString());
orv.setRefundAmount(refundAmount.multiply(new BigDecimal("100")).intValue());
// originalRefundAmount - refundAmount
Integer freeze2PayAmount = originalRefundAmount.subtract(refundAmount).multiply(new BigDecimal("100")).intValue();
if(AccountTypeEnum.OUT_PART_DEPOSIT.getCode().equals(refundType)) {
// freeze2PayAmount - 违章保证金
for(OrderAccountDeduction deduction : oad.getDeductions()) {
if(DeductionTypeEnum.VIOLATE_TRAFFIC_KEEP.getCode().equals(deduction.getType())) {
freeze2PayAmount -= deduction.getAmount().multiply(new BigDecimal("100")).intValue();
break;
}
}
}
orv.setFreeze2PayAmount(freeze2PayAmount);
orv.setFreeze2PayDesc("");
ObjectRestResponse<String> result = thirdFeign.refund(orv);
refundTradeNo = result.getData();
if(null == refundTradeNo) {
......@@ -399,9 +419,7 @@ public class OrderAccountBiz extends BaseBiz<OrderAccountMapper,OrderAccount> {
BigDecimal originalRefundAmount = oad.getOriginDepositAmount().add(oad.getOriginOrderAmount());
//crosstown.getRestDeposit().add(crosstown.getDeductionCost()).subtract(illegalReserve);
String refundDesc = "退还押金:"+ refundAmont.toString()+ "(已扣除 违章预备金:"+ illegalReserve.toString();
refundDesc += handleDedRefundDesc;
refundDesc += ")";
String refundDesc = "退还车辆押金:"+ refundAmont.toString();
//还车扣除款 剩余的 钱,再减去违章预备金
oad.getDeductions().add(
......
......@@ -170,7 +170,7 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
OrderRentVehicleDetail orderRentVehicleDetail = orderRentVehicleBiz.selectById(baseOrder.getDetailId());
if (orderVehicleCrosstownDto.getType() == CrosstownTypeEnum.DEPARTURE.getCode()) {
boolean flag = getTodayTime(orderRentVehicleDetail.getStartTime());
boolean flag = getTodayTime(orderRentVehicleDetail.getStartTime(), orderRentVehicleDetail.getEndTime());
if (!flag) {
return ObjectRestResponse.createFailedResult(3502, "已超过预定还车时间,不能进行交车操作!");
}
......@@ -438,9 +438,15 @@ public class OrderVehicleCrosstownBiz extends BaseBiz<OrderVehicaleCrosstownMapp
return illegalReserve;
}
public boolean getTodayTime(Long time) {
/**
* 当前时间大于预定开始时间当天0点,小于结束时间当天时间24点 2019.11.04
* @param startTime
* @param endTime
* @return
*/
public boolean getTodayTime(Long startTime, Long endTime) {
long current = System.currentTimeMillis();
if (current <= (getDayStart(time) + 24 * 60 * 60 * 1000 - 1) && current >= getDayStart(time)) {
if (getDayStart(startTime) <= (current) && current <= getDayStart(endTime) + 1000 * 3600 * 24 - 1) {
return true;
}
return false;
......
......@@ -32,7 +32,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
......@@ -204,6 +203,11 @@ public class OrderCancelBiz {
}else {
// //没到出车时间
//判断是否修改违约金
if(null != changeViolateAmount) {
oad.changeCancelViolate(changeViolateAmount);
}
//退款流程
//违约金封顶 租车身份价 * 2天
orderAccountBiz.rentRefundProcessCancel(baseOrder, BigDecimal.ZERO, timeLag, APP_ORDER+ "_"+ RENT_REFUND, orvd.getDeposit(), vehicleItemDTO.getBuyAmount(), oad, vehicleItemDTO.getTopAmount(0), null, changeViolateAmount);
......
......@@ -110,7 +110,7 @@ public class RentDepositJobHandler extends IJobHandler {
OrderAccountDetail oad = new OrderAccountDetail();
String refundDesc = "退还押金:";
String refundDesc = "退还违章押金:";
BigDecimal refundAmont;
if(null != orderViolation) {
//设置扣款项
......@@ -120,8 +120,7 @@ public class RentDepositJobHandler extends IJobHandler {
//还车扣除款 剩余的 钱,再减去违章预备金
refundAmont = orvd.getReturnPayResidue().subtract(orderViolation.getPrice());
refundDesc += refundAmont.toString()+ "(已扣除 违章扣款:"+ refundAmont.toString();
refundDesc += ")";
refundDesc += refundAmont.toString();
}else {
refundAmont = orvd.getReturnPayResidue();
refundDesc += refundAmont.toString();
......
......@@ -12,7 +12,7 @@ import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
/**;
*
*
* @author zjw
......
......@@ -3,7 +3,9 @@ package com.xxfc.platform.order.rest;
import cn.hutool.core.bean.BeanUtil;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.auth.client.annotation.IgnoreClientToken;
import com.github.wxiaoqi.security.auth.client.annotation.IgnoreUserToken;
import com.github.wxiaoqi.security.common.context.BaseContextHandler;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.github.wxiaoqi.security.common.rest.BaseController;
import com.xxfc.platform.order.biz.OrderMemberDetailBiz;
......@@ -20,7 +22,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
@Controller
@RequestMapping("orderMember")
......@@ -69,6 +76,16 @@ public class OrderMemberController extends BaseController<OrderMemberDetailBiz,
@PostMapping("/export")
@ResponseBody
public void exportMemberOrders(@RequestBody MemberOrderFindDTO memberOrderFindDTO, HttpServletResponse response){
// orderMemberService.exportMemberOrderData(memberOrderFindDTO);
try {
String name = DateTimeFormatter.ofPattern("YYYYMMddHHmmss").format(LocalDateTime.now());
response.setContentType("application/vnd.ms-excel;charset=utf-8");
String filename = String.format("%s-MemberOrder.xlsx",name);
response.setHeader("Content-Disposition","attachment;filename="+ new String(filename.getBytes(), "iso8859-1"));
ServletOutputStream outputStream = response.getOutputStream();
orderMemberService.exportMemberOrderData(memberOrderFindDTO, name, outputStream);
response.setCharacterEncoding("UTF-8");
}catch (Exception ex){
throw new BaseException("导出数据失败");
}
}
}
\ No newline at end of file
......@@ -89,7 +89,7 @@ public class OrderRefundController extends BaseController<OrderRefundBiz,OrderRe
@ResponseBody
@IgnoreClientToken
public ObjectRestResponse<BigDecimal> getViolatePrice(@PathVariable(value = "no") String no) {
checkAppUser();
checkAdminUser();
OrderPageVO orderPageVO = baseOrderBiz.pageByParm(new Query(new PageParam(){{
setLimit(1);
setPage(1);
......
package com.xxfc.platform.order.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.wxiaoqi.security.admin.bo.UserBo;
import com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.rest.UserRestInterface;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.util.excel.ExcelExport;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.github.wxiaoqi.security.common.vo.PageDataVO;
import com.xxfc.platform.activity.feign.ActivityFeign;
......@@ -20,7 +17,6 @@ import com.xxfc.platform.order.biz.OrderTemplateBiz;
import com.xxfc.platform.order.contant.enumerate.ItemTypeEnum;
import com.xxfc.platform.order.contant.enumerate.OrderStatusEnum;
import com.xxfc.platform.order.contant.enumerate.OrderTypeEnum;
import com.xxfc.platform.order.entity.BaseOrder;
import com.xxfc.platform.order.entity.OrderItem;
import com.xxfc.platform.order.pojo.dto.MemberOrderBo;
import com.xxfc.platform.order.pojo.dto.MemberOrderFindDTO;
......@@ -37,19 +33,20 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -96,6 +93,10 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
@Autowired
public HttpServletRequest request;
private SimpleDateFormat simleFormatter = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYYMMddHHmmss");
@PostConstruct
public void init() {
this.orderTypeEnum = OrderTypeEnum.MEMBER;
......@@ -197,56 +198,95 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
* 导出数据
* @param memberOrderFindDTO
*/
public void exportMemberOrderData(MemberOrderFindDTO memberOrderFindDTO) throws Exception{
public void exportMemberOrderData(MemberOrderFindDTO memberOrderFindDTO,String name,OutputStream outputStream) throws Exception{
MemberOrderPageVo memberOrderPageVo = listMemberOrderPage(memberOrderFindDTO);
List<MemberOrderBo> memberOrderBoList = memberOrderPageVo.getMemberOrderPage().getData();
MemberOrderStatisticsBo memberOrderStatisticsBo = memberOrderPageVo.getMemberOrderStatisticsBo();
FileOutputStream fileOutputStream = new FileOutputStream("ts.xlsx");
ExcelExport excelExport = new ExcelExport();
Workbook workbook = excelExport.getWorkbook();
Sheet sheet = workbook.createSheet();
CellStyle cellStyleHeader01 = workbook.createCellStyle();
cellStyleHeader01.setAlignment(HorizontalAlignment.CENTER);
sheet.autoSizeColumn(9);
XSSFWorkbook hssfWorkbook = new XSSFWorkbook();
XSSFSheet sheet = hssfWorkbook.createSheet(name+"会员订单列表");
CellStyle headerCellStyle = createHeaderCellStyle(hssfWorkbook);
CellStyle generalCellStyle = createGeneralCellStyle(hssfWorkbook);
Row row1 = sheet.createRow(0);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYYMMddHHmmss");
createHeader(row1,0,new String[]{dateTimeFormatter.format(LocalDateTime.now())+"会员订单列表"},cellStyleHeader01);
createHeader(row1,0,new String[]{name+"会员订单列表"},headerCellStyle);
CellRangeAddress cellRangeAddress = new CellRangeAddress(0,0,0,11);
sheet.addMergedRegion(cellRangeAddress);
Row row2 = sheet.createRow(1);
Cell row2_cell1 = row2.createCell(0);
row2_cell1.setCellValue("统计");
row2_cell1.setCellStyle(cellStyleHeader01);
row2_cell1.setCellStyle(headerCellStyle);
CellRangeAddress cellRangeAddress2 = new CellRangeAddress(1,2,0,0);
sheet.addMergedRegion(cellRangeAddress2);
String[] header2 = new String[]{"会员订单总数(单)","会员订单总额(元)","钻石会员订单(单)","钻石会员订单总额(元)","黄金会员订单(单)","黄金会员订单总额(元)","普通会员订单(单)","普通会员订单总额(元)"};
createHeader(row2,1,header2,cellStyleHeader01);
createHeader(row2,1,header2,headerCellStyle);
String[] countData = getData(memberOrderStatisticsBo);
Row row4 = sheet.createRow(2);
createCellCount(row4,1,countData,cellStyleHeader01);
createCellCount(row4,1,countData,generalCellStyle);
Row row5 = sheet.createRow(4);
String[] header3 = new String[]{"订单号","创建时间","订单状态","名称","用户姓名","手机号","上级姓名/手机号","促成人姓名/手机号","订单价格(元)","优惠金额(元)","实付金额(元)","支付时间"};
CellRangeAddress cellRangeAddress3 = new CellRangeAddress(3,3,0,header3.length);
sheet.addMergedRegion(cellRangeAddress3);
createHeader(row5,0,header3,cellStyleHeader01);
createHeader(row5,0,header3,headerCellStyle);
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
for(int i=0;i<header3.length;i++){
sheet.setColumnWidth(i,24*256);
}
List<String[]> orderDataList = getMemberOrderDataList(memberOrderBoList, 12);
createMemberOrderCellData(sheet,5,generalCellStyle,orderDataList);
hssfWorkbook.write(outputStream);
hssfWorkbook.close();
}
private List<String[]> getMemberOrderDataList(List<MemberOrderBo> memberOrderBoList,Integer size){
List<String[]> memerOrderData = new ArrayList<>();
String[] data = null;
String[] data;
for (MemberOrderBo memberOrderBo : memberOrderBoList) {
data = new String[size];
data[0]=memberOrderBo.getOrderNo();
data[1]=simleFormatter.format(memberOrderBo.getCreatTime());
data[2]=memberOrderBo.getStatus()==2?"取消":memberOrderBo.getStatus()==3?"待支付":memberOrderBo.getStatus()==6?"已完成":"";
data[3]=memberOrderBo.getName();
data[4]=memberOrderBo.getUserName();
data[5]=memberOrderBo.getPhone()==null?"":memberOrderBo.getPhone();
data[6]=String.format("%s/%s",memberOrderBo.getLeaderName()==null?"":memberOrderBo.getLeaderName(),memberOrderBo.getLeaderPhone()==null?"":memberOrderBo.getLeaderPhone());
data[7]=String.format("%s/%s",memberOrderBo.getFacilitateName()==null?"":memberOrderBo.getFacilitateName(),memberOrderBo.getFacilitatePhone()==null?"":memberOrderBo.getFacilitatePhone());
data[8]=memberOrderBo.getOrderAmount().toString();
data[9]=memberOrderBo.getCouponAmount().toString();
data[10]=memberOrderBo.getRealAmount().toString();
data[11]=memberOrderBo.getPayTime()==null?"":simleFormatter.format(new Date(memberOrderBo.getPayTime()));
memerOrderData.add(data);
}
return null;
return memerOrderData;
}
private CellStyle createGeneralCellStyle(XSSFWorkbook hssfWorkbook){
CellStyle cellStyleGeneral = createHeaderCellStyle(hssfWorkbook);
cellStyleGeneral.setWrapText(true);
XSSFFont generalFont = createFont(hssfWorkbook);
generalFont.setBold(false);
cellStyleGeneral.setFont(generalFont);
return cellStyleGeneral;
}
private CellStyle createHeaderCellStyle(XSSFWorkbook hssfWorkbook){
XSSFCellStyle cellStyleHeader = hssfWorkbook.createCellStyle();
cellStyleHeader.setAlignment(HorizontalAlignment.CENTER);
cellStyleHeader.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyleHeader.setLocked(false);
XSSFFont headerFont = createFont(hssfWorkbook);
cellStyleHeader.setFont(headerFont);
return cellStyleHeader;
}
private XSSFFont createFont(XSSFWorkbook hssfWorkbook){
XSSFFont font = hssfWorkbook.createFont();
font.setFontName("黑体");
font.setBold(true);
return font;
}
private String[] getData(MemberOrderStatisticsBo memberOrderStatisticsBo){
......@@ -270,11 +310,18 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
}
}
private void createMemberOrderCellData(Sheet sheet,int startRowIndex,CellStyle cellStyle,List<String[]> memberOrderList){
for (String[] data : memberOrderList) {
Row row = sheet.createRow(startRowIndex++);
createCellCount(row,0,data,cellStyle);
}
}
private void createCellCount(Row row,int CellStartIndex,String[] data,CellStyle cellStyle){
for(int i=CellStartIndex,y=0;y<data.length;i++,y++){
Cell cell = row.createCell(i);
cell.setCellValue(Objects.toString(data[y]));
cell.setCellStyle(cellStyle);
cell.setCellValue(data[y]);
}
}
......
package com.xxfc.platform.universal.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 解析出的身份证信息
* @author Administrator
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IDCardInformation {
/**
* 住址
*/
private String address;
/**
* 出生年月日(yyyyMMdd格式)
*/
private String birthday;
/**
* 姓名
*/
private String name;
/**
* 证件号
*/
private String code;
/**
* 性别
*/
private String sex;
/**
* 民族
*/
private String nation;
/**
* 证件签发机构
*/
private String issue;
/**
* 签发时间
*/
private String issueDate;
/**
*失效时间
*/
private String expiryDate;
}
package com.xxfc.platform.universal.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
* 订单支付
......@@ -45,6 +48,10 @@ public class OrderPay implements Serializable {
@ApiModelProperty(value = "1:微信公众号支付 2.支付宝即时到账,3,银联")
private Integer payWay;
@Column(name = "pay_type")
@ApiModelProperty(value = "1:支付宝APP支付,2:支付宝预授权支付")
private Integer payType;
//渠道:1-租车;2-旅游
@Column(name = "channel")
@ApiModelProperty(value = "渠道:1-租车;2-旅游")
......
......@@ -4,10 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
......@@ -69,5 +65,11 @@ public class OrderPayVo{
private String tradeNo;
//支付接口返回的流水号
@Column(name = "serial_number")
@ApiModelProperty(value = "支付接口返回的流水号")
private String serialNumber;
@ApiModelProperty(value = "1:支付宝APP支付,2:支付宝预授权支付")
private Integer payType;
}
......@@ -8,6 +8,7 @@ import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
/**
......@@ -37,5 +38,12 @@ public class OrderRefundVo{
@ApiModelProperty(value = "退款描述")
private String refundDesc;
//冻结转支付描述 只用于预支付相关
@ApiModelProperty(value = "冻结转支付描述")
private String freeze2PayDesc;
//冻结转支付金额 只用于预支付相关
@ApiModelProperty(value = "冻结转支付金额")
private Integer freeze2PayAmount;
}
......@@ -73,7 +73,6 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
private static final String SUCCESS = "SUCCESS";
public JSONObject preparepay(OrderPayVo orderPayVo) {
if (null == orderPayVo) {
log.error("-----参数为空-----------");
......@@ -117,6 +116,7 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
jsParam = WXPay.apppay(amount + "", orderPayVo.getBody(), notify_url, trade_no, orderPayVo.getBuyerIp(), 0);
} else if (type == 1 && payWay == 2) {
sellerAccount = SystemConfig.ALIPAY_PID;
orderPayVo.setPayType(2);
jsParam = generateAliPayment(orderPayVo, notifyUrl);
} else if (type == 3 && payWay == 1) {
sellerAccount = SystemConfig.APP_PARTNER;
......@@ -220,22 +220,10 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
log.info(valueStr);
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
String msg = JSONObject.toJSONString(params);
log.info("alipay notify message={}", msg);
//添加回调记录
// PaymentCallbackLog callbackLog = new PaymentCallbackLog();
// callbackLog.setPayCode(rstradeNo);
// callbackLog.setPayType(SystemConstant.PayType.ALIPAY);
// callbackLog.setOrderCode(rsOrderCode);
// callbackLog.setMessage(msg);
// paymentCallbackLogRepository.save(callbackLog);
// 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
// boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
//支付宝回调验签
try {
boolean flag = AlipaySignature.rsaCheckV1(params, SystemConfig.ALIPAY_PUBLIC_KEY, AlipayConstants.CHARSET_UTF8, AlipayConstants.SIGN_TYPE_RSA2);
......@@ -244,36 +232,26 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
return ObjectRestResponse.createDefaultFail().getMessage();
}
String rsTradeStatus = params.get("trade_status");
if (!SystemConfig.ALIPAY_TRADE_FINISHED.equals(rsTradeStatus) && !SystemConfig.ALIPAY_TRADE_SUCCESS.equals(rsTradeStatus)) {
if (StringUtils.isBlank(rsTradeStatus)) { //订单预授权支付回调
String status = params.get("status");
if (!status.equals("SUCCESS")) {
log.info("alipay order trade_status has problem, result={}", msg);
return ObjectRestResponse.createDefaultFail().getMessage();
}
//订单APP支付回调
} else if (!SystemConfig.ALIPAY_TRADE_FINISHED.equals(rsTradeStatus) && !SystemConfig.ALIPAY_TRADE_SUCCESS.equals(rsTradeStatus)) {
log.info("alipay order trade_status has problem, result={}", msg);
return ObjectRestResponse.createDefaultFail().getMessage();
}
//String rsSellerId = params.get("seller_id");
//
// PaymentRecord paymentRecord = paymentRecordRepository.findOneByOrderCode(rsOrderCode);
// //验证付款信息
// if (paymentRecord == null || !paymentRecord.getAmount().toString().equals(rsAmount)
// || !aliPayConfig.getAppId().equals(rsAppId)) {
// log.info("alipay order notify fail, result={}", msg);
// return Response.FAILURE.getHeader().getMessage();
// }
// //重复回调
// if (paymentRecord.getStatus().intValue() != 1) {
// log.info("alipay order repeat notify, result={}", msg);
// return Response.SUCCESS().getHeader().getMessage();
// }
//
// paymentRecord.setPayCode(rstradeNo);
// paymentRecord.setStatus(2);
// paymentRecordRepository.save(paymentRecord);
// Map<String, Object> sendMap = DataUtils.objectToMap(paymentRecord);
// sendMap.put("amount", new BigDecimal(rsAmount).multiply(new BigDecimal(100)).intValue());
// sendMsgToOrder(JSONObject.toJSONString(sendMap));
String tradeNo = params.get("out_trade_no");
if (StringUtils.isBlank(tradeNo)) {
tradeNo = params.get("out_request_no");
}
String operationId = params.get("trade_no");
if (StringUtils.isBlank(operationId)) {
operationId = params.get("auth_no");
}
notice(tradeNo, operationId);
return ObjectRestResponse.succ().getMessage();
} catch (AlipayApiException e) {
......@@ -293,7 +271,7 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
AlipayClient alipayClient = getAlipayClient();
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
try {
return appOrderPay(alipayClient, orderPayVo, notifyUrl);
return fundAuthOrderAppFreeze(alipayClient, orderPayVo, notifyUrl);
} catch (Exception e) {
e.printStackTrace();
}
......@@ -352,13 +330,10 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
//预授权冻结
public String fundAuthOrderAppFreeze(AlipayClient alipayClient, OrderPayVo orderPayVo, String notifyUrl) throws AlipayApiException {
AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
AlipayFundAuthOrderAppFreezeModel model = new AlipayFundAuthOrderAppFreezeModel();
BigDecimal realAmount = new BigDecimal(orderPayVo.getAmount().toString()).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_UP);
request.setBizContent("{" +
"\"auth_code\":\"" + orderPayVo.getTradeNo() + "\"," +
"\"auth_code_type\":\"bar_code\"," +
"\"out_order_no\":\"" + orderPayVo.getOrderNo() + "\"," +
"\"out_request_no\":\"" + orderPayVo.getOrderNo() + "\"," +
"\"out_order_no\":\"" + orderPayVo.getTradeNo() + "\"," +
"\"out_request_no\":\"" + orderPayVo.getTradeNo() + "\"," +
"\"order_title\":\"" + orderPayVo.getSubject() + "\"," +
"\"product_code\":\"PRE_AUTH_ONLINE\"," +
"\"pay_timeout\":\"1d\"," +
......@@ -512,78 +487,86 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
//解冻预授权
public void fundAuthOrderUnFreeze(AlipayClient alipayClient) throws AlipayApiException {
public boolean fundAuthOrderUnFreeze(String outTradeNo, String serialNumber, Integer refundAmount, String refundReason) throws AlipayApiException {
String notifyUrl = weixinHost + "/api/universal/pay/app/unauth/notify/alipay";
AlipayClient alipayClient = getAlipayClient();
BigDecimal realAmount = new BigDecimal(refundAmount.toString()).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_UP);
AlipayFundAuthOrderUnfreezeRequest request = new AlipayFundAuthOrderUnfreezeRequest();
AlipayFundAuthOrderUnfreezeModel model = new AlipayFundAuthOrderUnfreezeModel();
model.setAuthNo("2017120410002001390208978986"); // 支付宝资金授权订单号,在授权冻结成功时返回需要入库保存
model.setOutRequestNo("UnfreezeRequestNo000003");//同一商户每次不同的资金操作请求,商户请求流水号不能重复,且与冻结流水号不同
model.setAmount("0.01"); // 本次操作解冻的金额,单位为:元(人民币),精确到小数点后两位
model.setRemark("预授权解冻"); // 商户对本次解冻操作的附言描述,长度不超过100个字母或50个汉字
model.setAuthNo(serialNumber); // 支付宝资金授权订单号,在授权冻结成功时返回需要入库保存
model.setOutRequestNo(outTradeNo);//同一商户每次不同的资金操作请求,商户请求流水号不能重复,且与冻结流水号不同
model.setAmount(realAmount.toString()); // 本次操作解冻的金额,单位为:元(人民币),精确到小数点后两位
model.setRemark(refundReason); // 商户对本次解冻操作的附言描述,长度不超过100个字母或50个汉字
//选填字段,信用授权订单,针对信用全免订单,传入该值完结信用订单,形成芝麻履约记录
// model.setExtraParam("{\"unfreezeBizInfo\":\"{\\\"bizComplete\\\":\\\"true\\\"}\"}");
request.setBizModel(model);
request.setNotifyUrl("");//异步通知地址,必填,该接口只通过该参数进行异步通知
request.setNotifyUrl(notifyUrl);//异步通知地址,必填,该接口只通过该参数进行异步通知
AlipayFundAuthOrderUnfreezeResponse response = alipayClient.execute(request);
log.info("response: {}" + response.getBody());
if (response.isSuccess()) {
log.info("调用成功");
log.info("response: {}" + response.getBody());//签名后的参数,直接入参到
return true;
} else {
log.info("调用失败");
return false;
}
}
//取消预授权
public void fundAuthCancel() throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", "app_id", "your private_key", "json", "GBK", "alipay_public_key", "RSA2");
public String fundAuthCancel(String outTradeNo, String serialNumber, String refundReason) throws AlipayApiException {
AlipayClient alipayClient = getAlipayClient();
String notifyUrl = weixinHost + "/api/universal/pay/app/unauth/notify/alipay";
AlipayFundAuthOperationCancelRequest request = new AlipayFundAuthOperationCancelRequest();
AlipayFundAuthOperationCancelModel model = new AlipayFundAuthOperationCancelModel();
//model.setAuthNo("2017120110002001390206804295"); // 支付宝资金授权订单号,在授权冻结成功时返回参数中获得
model.setOutOrderNo("orderFreeze000005"); //商户的授权资金订单号,与支付宝的授权资金订单号不能同时为空
model.setAuthNo(outTradeNo); // 支付宝资金授权订单号,在授权冻结成功时返回参数中获得
//model.setOutOrderNo(orderPayVo.getOrderNo()); //商户的授权资金订单号,与支付宝的授权资金订单号不能同时为空
//model.setOperationId("20171201317348823902"); //支付宝的授权资金操作流水号
model.setOutRequestNo("requestNo000005");//与支付宝的授权资金操作流水号不能同时为空,与冻结流水号相同
model.setRemark("预授权撤销"); // 商户对本次撤销操作的附言描述,长度不超过100个字母或50个汉字
model.setOutRequestNo(serialNumber);//与支付宝的授权资金操作流水号不能同时为空,与冻结流水号相同
model.setRemark(refundReason); // 商户对本次撤销操作的附言描述,长度不超过100个字母或50个汉字
request.setBizModel(model);
request.setNotifyUrl("");//异步通知地址,必填,该接口只通过该参数进行异步通知
request.setNotifyUrl(notifyUrl);//异步通知地址,必填,该接口只通过该参数进行异步通知
AlipayFundAuthOperationCancelResponse response = alipayClient.execute(request);
log.info("response: {}" + response.getBody());
if (response.isSuccess()) {
log.info("调用成功");
log.info("response: {}" + response.getBody());//签名后的参数,直接入参到
return response.getBody();
} else {
log.info("调用失败");
return null;
}
}
//预授权转支付
public void tradePay() throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", "app_id", "your private_key", "json", "utf-8", "alipay_public_key", "RSA2");
public boolean tradePay(String outTradeNo, String serialNumber, Integer refundAmount, String refundReason, String subject) throws AlipayApiException {
String notifyUrl = weixinHost + "/api/universal/pay/app/unauth/notify/alipay";
AlipayClient alipayClient = getAlipayClient();
BigDecimal realAmount = new BigDecimal(refundAmount.toString()).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_UP);
AlipayTradePayRequest request = new AlipayTradePayRequest();
AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo("20180412100020088982"); // 预授权转支付商户订单号,为新的商户交易流水号;如果重试发起扣款,商户订单号不要变;
model.setOutTradeNo(outTradeNo); // 预授权转支付商户订单号,为新的商户交易流水号;如果重试发起扣款,商户订单号不要变;
model.setProductCode("PRE_AUTH_ONLINE"); // 固定值PRE_AUTH_ONLINE
model.setAuthNo("2018041210002001660228733635"); // 填写预授权冻结交易号
model.setSubject("预授权转支付测试"); // 解冻转支付标题,用于展示在支付宝账单中
model.setTotalAmount("0.01"); // 结算支付金额
model.setAuthNo(serialNumber); // 填写预授权冻结交易号
model.setSubject(subject); // 解冻转支付标题,用于展示在支付宝账单中
model.setTotalAmount(realAmount.toString()); // 结算支付金额
model.setSellerId(SystemConfig.ALIPAY_PID); // 填写卖家支付宝账户pid
model.setBuyerId(SystemConfig.ALIPAY_APPID); // 填写预授权用户uid,通过预授权冻结接口返回的payer_user_id字段获取
model.setStoreId("test_store_id"); // 填写实际交易发生的终端编号,与预授权的outStoreCode保持一致即可
model.setBody("预授权解冻转支付测试"); // 可填写备注信息
model.setBody(refundReason); // 可填写备注信息
//如果需要从一笔授权中完成多笔订单支付,保持auth_no不变,不同订单根据outTradeNo进行标识,此时auth_confirm_mode不传或者传入NOT_COMPLETE;进行到最后一笔转支付时,auth_confirm_mode传入COMPLETE由支付宝完成剩余金额自动解冻,或者商户自行调用解冻接口将剩余金额解冻。
model.setAuthConfirmMode("NOT_COMPLETE");//传入该值用户剩余金额不会自动解冻
request.setBizModel(model);
request.setNotifyUrl("");//异步通知地址,必填,该接口只通过该参数进行异步通知
request.setNotifyUrl(notifyUrl);//异步通知地址,必填,该接口只通过该参数进行异步通知
AlipayTradePayResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
log.info("response: {}" + response.getBody());
return true;
} else {
System.out.println("调用失败");
}
log.info("调用失败");
return false;
}
//退款
public void testTradeRefund() throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", "app_id", "your private_key", "json", "GBK", "alipay_public_key", "RSA2");
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setOutTradeNo("tradePay000002"); //与预授权转支付商户订单号相同,代表对该笔交易退款
model.setRefundAmount("0.01");
model.setRefundReason("预授权退款测试");
model.setOutRequestNo("refund0000001");//标识一次退款请求,同一笔交易多次退款需要保证唯一,如部分退款则此参数必传。
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizModel(model);
AlipayTradeRefundResponse response = alipayClient.execute(request);
log.info("response: {}" + response.getBody());
}
/**
......@@ -625,14 +608,18 @@ public class OrderPayBiz extends BaseBiz<OrderPayMapper, OrderPay>{
return false;
}
public static void main(String[] args) {
public static void main(String[] args) throws AlipayApiException {
OrderPayBiz orderPayBiz = new OrderPayBiz();
FundPayVo fundPayVo = new FundPayVo();
fundPayVo.setRemark("转账");
fundPayVo.setOutBizNo("12345678");
fundPayVo.setAmount("0.1");
fundPayVo.setPayeeAccount("2088212169302286");
AlipayClient alipayClient = orderPayBiz.getAlipayClient();
System.out.println(orderPayBiz.alipayfundTrans(alipayClient, fundPayVo));
OrderPayVo orderPayVo = new OrderPayVo();
orderPayVo.setOrderNo("20191024153859000003");
orderPayVo.setTradeNo("2019102410002001530572359246");
orderPayVo.setSerialNumber("2019102410002001530572351411");
orderPayVo.setAmount(3);
orderPayVo.setBody("扣除租车订单费用");
orderPayVo.setSubject("租车订单交易费用");
//orderPayBiz.fundAuthOrderUnFreeze(orderPayVo, "");
//orderPayBiz.alipayOrderRefund("20191024153859000003","2019102422001421530513773694", 2, "xxxx", "");
//orderPayBiz.tradePay(orderPayVo, "");
//orderPayBiz.fundAuthCancel(orderPayVo, "");
}
}
......@@ -5,7 +5,6 @@ import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.util.process.ResultCode;
import com.github.wxiaoqi.security.common.util.process.SystemConfig;
import com.github.wxiaoqi.security.common.util.result.JsonResultUtil;
import com.xxfc.platform.universal.entity.Dictionary;
import com.xxfc.platform.universal.entity.OrderPay;
import com.xxfc.platform.universal.entity.OrderRefund;
import com.xxfc.platform.universal.mapper.OrderRefundMapper;
......@@ -21,10 +20,6 @@ import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
import java.util.Map;
import static com.xxfc.platform.universal.constant.DictionaryKey.PAY_DEMOTION;
import static com.xxfc.platform.universal.constant.DictionaryKey.UNIVERSAL_PAY;
/**
* 订单支付退款表
......@@ -59,17 +54,17 @@ public class OrderRefundBiz extends BaseBiz<OrderRefundMapper, OrderRefund> {
Integer refundAmount = orderRefundVo.getRefundAmount();
//临时处理
Map<String, Dictionary> dictionaryMap = dictionaryBiz.getAll4Map();
Integer demotion = Integer.valueOf(dictionaryMap.get(UNIVERSAL_PAY + "_" + PAY_DEMOTION).getDetail());
payAmount = payAmount / demotion;
if (payAmount <= 0) {
payAmount = 1;
}
refundAmount = refundAmount / demotion;
if (refundAmount <= 0) {
refundAmount = 1;
}
// Map<String, Dictionary> dictionaryMap = dictionaryBiz.getAll4Map();
// Integer demotion = Integer.valueOf(dictionaryMap.get(UNIVERSAL_PAY + "_" + PAY_DEMOTION).getDetail());
// payAmount = payAmount / demotion;
// if (payAmount <= 0) {
// payAmount = 1;
// }
//
// refundAmount = refundAmount / demotion;
// if (refundAmount <= 0) {
// refundAmount = 1;
// }
String refundDesc = StringUtils.isNotBlank(orderRefundVo.getRefundDesc()) ? orderRefundVo.getRefundDesc() : "审核通过,退款";
String out_refund_no = Snowflake.build() + "";
......@@ -89,9 +84,19 @@ public class OrderRefundBiz extends BaseBiz<OrderRefundMapper, OrderRefund> {
OrderPay orderPay = list.get(0);
String out_trade_no = orderPay.getTradeNo();
boolean flag = false;
if (orderPay.getPayWay() == 2) {
log.info("======支付宝退款中===========");
if (orderPay.getPayWay() == 2 && orderPay.getPayType() == 1) {
log.info("======支付宝APP支付退款中===========");
flag = payBiz.alipayOrderRefund(out_trade_no, orderPay.getSerialNumber(), refundAmount, refundDesc, out_trade_no + System.currentTimeMillis());
} else if (orderPay.getPayWay() == 2 && orderPay.getPayType() == 2) {
log.info("======支付宝预授权支付退款中===========");
//需要根据实际传过来的参数类型来进行解冻或者预授权转支付
if (orderRefundVo.getRefundAmount() != 0) { //解冻金额
flag = payBiz.fundAuthOrderUnFreeze(orderPay.getTradeNo() + System.currentTimeMillis(), orderPay.getSerialNumber(), orderRefundVo.getRefundAmount(), orderRefundVo.getRefundDesc());
}
//预授权转支付
if(orderRefundVo.getFreeze2PayAmount() != 0) {
flag = payBiz.tradePay(orderPay.getTradeNo() + System.currentTimeMillis(), orderPay.getSerialNumber(), orderRefundVo.getFreeze2PayAmount(), orderRefundVo.getFreeze2PayDesc(), orderRefundVo.getFreeze2PayDesc());
}
} else if(orderPay.getPayWay() == 1){
log.info("======微信退款中===========");
flag = WxPayRefundUtils.refund(appid, mchId, partnerKey, out_trade_no, out_refund_no, payAmount + "",
......
......@@ -4,12 +4,15 @@ package com.xxfc.platform.universal.service;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.common.constant.RestCode;
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.universal.biz.UserMessage;
import com.xxfc.platform.universal.entity.IDCardInformation;
import com.xxfc.platform.universal.entity.IdInformation;
import com.xxfc.platform.universal.mapper.IdInformationMapper;
import com.xxfc.platform.universal.service.PictureParsing.UserPictureParsing;
import com.xxfc.platform.universal.service.authenticationInterface.UserAuthentication;
import com.xxfc.platform.universal.utils.CertifHttpUtils;
import com.xxfc.platform.universal.utils.Validation;
......@@ -36,6 +39,7 @@ import java.util.*;
/**
* 认证业务
*
* @author Administrator
*/
@Service
......@@ -44,100 +48,6 @@ public class CertificationService {
@Autowired
private UserAuthentication authentication;
/**
* 认证相关的数据
*/
@Value("${certif.cHost}")
private String cHost;
@Value("${certif.cPath}")
private String cPath;
@Value("${certif.cMethod}")
private String cMethod;
@Value("${certif.cAppcode}")
private String cAppcode;
//请求:身份证号字段名
@Value("${certif.idCardName}")
private String idCardName;
//请求:用户姓名字段名
@Value("${certif.cName}")
private String cName;
//响应:认证错误码字段名
@Value("${certif.certifRet}")
private String certifRet;
//响应:认证通过码
@Value("${certif.certifResultCode}")
private String certifResultCode;
/**
* 图片解析相关的数据
*/
//认证借口host
@Value("${certif.iHost}")
private String iHost;
//认证接口path
@Value("${certif.iPath}")
private String iPath;
//请求方式
@Value("${certif.iMethod}")
private String iMethod;
//认证AppCode(接口商家提供)
@Value("${certif.iAppcode}")
private String iAppcode;
//请求:图片url字段名
@Value("${certif.picName}")
private String picName;
//请求:方向字段名
@Value("${certif.typeName}")
private String typeName;
//请求:反面图片标识
@Value("${certif.frontParameter}")
private String frontParameter;
//请求:反面图片标识
@Value("${certif.backParameter}")
private String backParameter;
//响应:解析错误码字段名
@Value("${certif.imageRet}")
private String imageRet;
//响应:图片解析错误码
@Value("${certif.imageResultCode}")
private String imageResultCode;
//响应:响应内容字段名
@Value("${certif.dataNam}")
private String dataNam;
//响应:正面身份证号字段名
@Value("${certif.numberName}")
private String numberName;
//响应:正面姓名字段名
@Value("${certif.iName}")
private String iName;
//响应:背面到期时间字段名
@Value("${certif.expirationDateName}")
private String expirationDateName;
@Autowired
private IdInformationMapper idInformationMapper;
......@@ -148,14 +58,16 @@ public class CertificationService {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private UserPictureParsing userPictureParsing;
// 身份证图片进行实名认证
/**
* 一、身份证图片进行实名认证
* @param idInformation
* @return
*/
public ObjectRestResponse<Integer> certificate(IdInformation idInformation) {
//1.判断
//携带返回参数的map
HashedMap hashMap = new HashedMap();
// 认证状态:true是认证过
//1.认证前数据判断
//判断是否bean是否为null
if (idInformation == null) {
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA, "无法识别,请重新上传");
......@@ -181,69 +93,35 @@ public class CertificationService {
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA, "请上传背面照");
}
//2.解析
//正面进行解析
String front = imageParse(idInformation.getFrontUrl(), frontParameter);
//解析证件背面
String back = imageParse(idInformation.getBackUrl(), backParameter);
log.info("----解析front=========" + front);
log.info("----解析back=========" + back);
if (StringUtils.isBlank(front) || StringUtils.isBlank(back)) {
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"无法识别,请重新上传");
}
Map frontMap = (Map) JSONObject.parse(front);
//反面进行解析
Map backMap = (Map) JSONObject.parse(back);
//判断是否调用图片解析的接口是否异常,若果两个次认证都没结果
if (MapUtil.isEmpty(frontMap)
|| !(frontMap.get(imageRet).equals(imageResultCode))
|| MapUtil.isEmpty(backMap)
|| !(backMap.get(imageRet).equals(imageResultCode))
) {
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"无法识别,请重新上传");
}
Map frontData = (Map) frontMap.get(dataNam);
Map backData = (Map) backMap.get(dataNam);
if (MapUtil.isEmpty(backData) || MapUtil.isEmpty(frontData)) {
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"无法识别,请重新上传");
}
//解析通过,进行匹配
String name = (String) frontData.get(iName);
String number = (String) frontData.get(numberName);
IDCardInformation credentialsData = userPictureParsing.analysis(idInformation.getFrontUrl(), idInformation.getBackUrl());
//验证证件信息是否和填入的客户信息一致
String name = credentialsData.getName();
String number = credentialsData.getCode();
if (idInformation.getName().equals(name)) {
ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE, "姓名不一致");
}
if (idInformation.getIdNumber().equals(number)) {
ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE, "证件号不一致");
}
//map携带身份证和姓名进行认证
// Map<String, String> authMap = new HashMap<>();
// authMap.put(idCardName, (String) frontData.get(numberName));
// authMap.put(cName, (String) frontData.get(cName));
// //3.调用接口进行认证
//
// boolean result = certificate(authMap);
boolean result = authentication.certificate(new UserMessage(){{
//3.验证
boolean result = authentication.certificate(new UserMessage() {{
setIdNumber(number);
setName(name);
}} );
}});
log.info("----认证结果result=========" + result);
//认证返回的参数是否为空
if (result) {
//认证成功后存入保存到数据库
//获得身份证正面记录的身份证号和真实姓名
//设置姓名
idInformation.setName((String) frontData.get(iName));
idInformation.setName(name);
//设置身份证号
idInformation.setIdNumber((String) frontData.get(numberName));
idInformation.setIdNumber(number);
//获得到期时间
String endDate = (String) backData.get(expirationDateName);
String endDate = credentialsData.getExpiryDate();
log.info("----获得到期时间endDate=========" + endDate);
if (StringUtils.isBlank(endDate)) {
return ObjectRestResponse.succ();
return ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE, "图片识别失败,请重新上传");
}
Date expirationDate = new Date();
if (!Validation.isDate(endDate)) {
......@@ -259,92 +137,25 @@ public class CertificationService {
expirationDate = formatter.parse(endDate);
} catch (ParseException e) {
e.printStackTrace();
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"无法识别,请重新上传");
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA, "无法识别,请重新上传");
}
}
idInformation.setExpirationDate(expirationDate);
CertificationService cs = applicationContext.getBean(this.getClass());
return cs.addIdInformation(idInformation);
// log.info("----请求admin=========" + objRR);
// if (objRR.getRel()) {
// return ObjectRestResponse.succ(objRR.getData());
// }
}
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"网络异常,请稍后再试");
}
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA, "网络异常,请稍后再试");
//认证
//认证
public boolean certificate(Map<String, String> querys) {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + cAppcode);
try {
log.info("----querys=========" + querys);
HttpResponse response = CertifHttpUtils.doGet(cHost, cPath, cMethod, headers, querys);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
/**
* 状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
*/
//获取response的body
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity());
log.info("----认证结果result=========" + result);
//认证返回的参数是否为空
if (!StringUtils.isBlank(result)) {
Map<String, Object> map = (Map<String, Object>) JSONObject.parse(result);
log.info("----certifRet=========" + certifRet);
if (MapUtil.isNotEmpty(map) || certifResultCode.equals(map.get(certifRet))) {
return true;
}
}
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//身份证照片解析
public String imageParse(String imageUrl, String type) {
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + iAppcode);
Map<String, String> querys = new HashMap<String, String>();
Map<String, String> bodys = new HashMap<String, String>();
bodys.put(picName, imageUrl);
//默认正面front,背面请传back
bodys.put(typeName, type);
try {
HttpResponse response = CertifHttpUtils.doPost(iHost, iPath, iMethod, headers, querys, bodys);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
log.info("----statusCode=========" + querys);
/**
* 状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
* 二、认证通过保存到数据库当中
*
* @param idInformation
* @return
*/
//获取response的body
if (statusCode == 200) {
return EntityUtils.toString(response.getEntity());
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//认证通过保存到数据库当中
@Transactional(rollbackFor = Exception.class)
public ObjectRestResponse<Integer> addIdInformation(IdInformation idInformation) {
log.info("----idInformation=========" + idInformation);
......@@ -353,28 +164,23 @@ public class CertificationService {
try {
Example exa = new Example(IdInformation.class);
Example.Criteria criteria = exa.createCriteria();
criteria.andEqualTo("idNumber",idInformation.getIdNumber());
// criteria.andEqualTo("userLoginId",idInformation.getUserLoginId());
criteria.andEqualTo("idNumber", idInformation.getIdNumber());
List<IdInformation> idInformatics = idInformationMapper.selectByExample(exa);
if (CollectionUtils.isEmpty(idInformatics)) {
idInformation.setCrtTime(new Date());
idInformationMapper.insertSelective(idInformation);
}else {
// IdInformation idInformation1 = idInformatics.get(0);
// idInformation.setId(idInformation1.getId());
// idInformation.setUpdTime(new Date());
// idInformationMapper.updateByPrimaryKeySelective(idInformation);
} else {
log.error("该身份证已存在,不要重复认证");
return ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE,"该身份证已存在,不要重复认证");
return ObjectRestResponse.createFailedResult(ResultCode.FAILED_CODE, "该身份证已存在,不要重复认证");
}
log.info("----addIdInformation---userid==="+idInformation.getUserLoginId()+"----name====" + idInformation.getName()+"---IdNumber==="+idInformation.getIdNumber());
log.info("----addIdInformation---userid===" + idInformation.getUserLoginId() + "----name====" + idInformation.getName() + "---IdNumber===" + idInformation.getIdNumber());
//认证成功后修改用户,用户认证状态
ObjectRestResponse authentication = userFeign.authentication(idInformation.getUserLoginId(), idInformation.getName(), idInformation.getIdNumber(), 1);
return ObjectRestResponse.succ(idInformation.getId());
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus();
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA,"无法识别,请重新上传");
return ObjectRestResponse.createFailedResult(ResultCode.INCOMPLETE_DATA, "无法识别,请重新上传");
}
}
......
package com.xxfc.platform.universal.service.PictureParsing;
import com.xxfc.platform.universal.entity.IDCardInformation;
/**
* @author Administrator
*/
public interface UserPictureParsing {
IDCardInformation analysis(String front ,String back);
}
package com.xxfc.platform.universal.service.PictureParsing.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.xxfc.platform.universal.entity.IDCardInformation;
import com.xxfc.platform.universal.service.PictureParsing.UserPictureParsing;
import com.xxfc.platform.universal.utils.CertifHttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 调用四川涪擎图片解析接口
*
* @author Administrator
*/
@Service
@Slf4j
public class XCFQPictureParsingImpl implements UserPictureParsing {
// private String appcode = "acea1c8811f748b3a65815f11db357c4";
private String appcode2 = "ee7710ce92054cae9f6c040f6864e6a7";
/**
* 认证相关的数据
*/
private String host = "https://ocridcards.market.alicloudapi.com";
private String path = "/idimages";
private String method = "POST";
private String dataNam = "result";
/**
* 照片解析
*
* @param frontImage 正面照片
* @param backImage 反面照片
* @return
*/
@Override
public IDCardInformation analysis(String frontImage, String backImage) {
Map<String,String> front = judgeAccordingToAnalyticalData(frontImage, "front");
if (MapUtils.isEmpty(front)) {
log.error("正面解析失败,请重新上传");
throw new BaseException("正面解析失败,请重新上传");
}
Map<String,String> back = judgeAccordingToAnalyticalData(backImage, "back");
if (MapUtils.isEmpty(back)) {
log.error("反面解析失败,请重新上传");
throw new BaseException("反面解析失败,请重新上传");
}
return new IDCardInformation(
front.get("address"),
front.get("birthday"),
front.get("name"),
front.get("code"),
front.get("sex"),
front.get("nation"),
back.get("issue"),
back.get("issueDate"),
back.get("expiryDate"));
}
private Map<String,String> judgeAccordingToAnalyticalData(String imageUrl, String type) {
String json = imageParse(imageUrl);
log.info("json:" + json);
if (StringUtils.isBlank(json)) {
return null;
}
Map reuslt = (Map) JSONObject.parse(json);
//判断是否调用图片解析的接口是否异常,若果两个次认证都没结果
if ("front".equals(type)) {
if (MapUtil.isEmpty(reuslt)
|| !(reuslt.get("code").equals("1"))
) {
return null;
}
}
if ("back".equals(type)) {
if (MapUtil.isEmpty(reuslt)
|| !(reuslt.get("code").equals("2"))
) {
return null;
}
}
Map<String,String> map = (Map) reuslt.get(dataNam);
log.info("map:" + map);
if (MapUtils.isNotEmpty(map)) {
return map;
}
return null;
}
//身份证照片解析
private String imageParse(String imageUrl) {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + appcode2);
Map<String, String> querys = new HashMap<String, String>();
Map<String, String> bodys = new HashMap<String, String>();
bodys.put("image", imageUrl);
try {
return callExternalRequest(headers,querys,bodys,1);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String callExternalRequest(Map<String, String> headers,
Map<String, String> querys,
Map<String, String> bodys,
int type) throws Exception {
HttpResponse response = CertifHttpUtils.doPost(host, path, method, headers, querys, bodys);
log.info("response:"+response);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
/**
* 状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
*/
log.info("外部接口响应状态码:"+statusCode);
//获取response的body
if (statusCode == 200) {
return EntityUtils.toString(response.getEntity());
}
if (403==statusCode){
log.error("验证次数已用完");
}
return null;
}
}
......@@ -28,16 +28,17 @@ import java.util.Map;
@Primary
public class XCFQAuthentication implements UserAuthentication {
private String cAppcode="acea1c8811f748b3a65815f11db357c4";
// private String appcode="acea1c8811f748b3a65815f11db357c4";
private String appcode2 = "ee7710ce92054cae9f6c040f6864e6a7";
/**
* 认证相关的数据
*/
private String cHost = "https://idcert.market.alicloudapi.com";
private String hsot = "https://idcert.market.alicloudapi.com";
private String cPath = "/idcard";
private String path = "/idcard";
private String cMethod = "GET";
private String method = "GET";
//响应:认证错误码字段名
private String certifRet = "status";
......@@ -53,37 +54,51 @@ public class XCFQAuthentication implements UserAuthentication {
@Override
public boolean certificate(UserMessage message) {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + appcode2);
try {
return callExternalRequest(message, headers, 1);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private boolean callExternalRequest(UserMessage message, Map<String, String> headers, int type) throws Exception {
//map携带身份证和姓名进行认证
Map<String, String> querys = new HashMap<>();
querys.put(idCardName, message.getIdNumber());
querys.put(cName, message.getName());
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + cAppcode);
try {
log.info("----querys=========" + querys);
HttpResponse response = HttpUtils.doGet(cHost, cPath, cMethod, headers, querys);
HttpResponse response = HttpUtils.doGet(hsot, path, method, headers, querys);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
/**
* 状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
*/
log.info("外部接口响应状态码:"+statusCode);
log.info("外部接口响应状态码:" + statusCode);
//获取response的body
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity());
log.info("----认证结果result=========" + result);
//认证返回的参数是否为空
if (!StringUtils.isBlank(result)) {
Map<String, Object> map = (Map<String, Object>) JSONObject.parse(result);
log.info("----certifRet=========" + certifRet);
if (MapUtil.isNotEmpty(map) || certifResultCode.equals(map.get(certifRet))) {
Map<String,String> map = (Map<String, String>) JSONObject.parse(result);
log.info("----响应数据=========" + map);
if (MapUtil.isNotEmpty(map) && certifResultCode.equals(map.get("status"))) {
log.info("认证成功");
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
if (403 == statusCode) {
log.error("验证次数已用完");
}
return false;
}
}
......@@ -17,7 +17,6 @@
<version>2.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
......
......@@ -64,11 +64,17 @@ public class Vehicle {
*/
private Integer insuranceCompany;
private Integer strongInsuranceCompany;
/**
* 保险单号
*/
private String insuranceNo;
/**
* 强险单号
*/
private String strongInsuranceNo;
/**
* 保险开始时间
......@@ -80,6 +86,11 @@ public class Vehicle {
*/
private Date insuranceEndDate;
/**
* 强险的结束时间
*/
private Date strongInsuranceEndDate;
/**
* 年审时间
*/
......@@ -151,6 +162,24 @@ public class Vehicle {
@Column(name = "travel_status")
private Integer travelStatus;
/**
* 终端号
*/
@Column(name = "terminal_number")
private String terminalNumber;
/**
* SIM卡号
*/
@Column(name = "sim_number")
private String simNumber;
/**
* 通讯类型
*/
@Column(name = "communication_type")
private String communicationType;
/**
* 是否删除;0-正常;1-删除
*/
......
......@@ -68,12 +68,14 @@ public class AddOrUpdateVehicleVo {
* 保险公司,见常量表
*/
private Integer insuranceCompany;
private Integer strongInsuranceCompany;
/**
* 保险单号
*/
private String insuranceNo;
private String strongInsuranceNo;
/**
* 保险开始时间
......@@ -84,6 +86,7 @@ public class AddOrUpdateVehicleVo {
* 保险结束时间
*/
private Date insuranceEndDate;
private Date strongInsuranceEndDate;
/**
* 年审时间
......
......@@ -26,6 +26,12 @@ public class ResultVehicleVo {
*/
private String numberPlate;
/**
* 车型
*/
private String vehicleType;
/**
* 品牌(编码,对应关系见相关常量),0-未填写
*/
......@@ -49,6 +55,8 @@ public class ResultVehicleVo {
*/
private String parkBranchCompanyName;
/**
* 目的地分支机构(id)
*/
......@@ -64,6 +72,12 @@ public class ResultVehicleVo {
*/
private Integer useType;
/**
* 用途名称
*/
private String useTypeName;
/**
* 备注信息
*/
......
package com.xxfc.platform.vehicle.pojo;
import lombok.Data;
@Data
public class VehicleExcelVo {
/**
* 车牌号,空字符串-没有
*/
private String numberPlate;
/**
* 车辆编号,0-没有
*/
private Integer code;
/**
* 车型
*/
private String vehicleType;
/**
* 用途名称
*/
private String useTypeName;
/**
* 停靠分支机构(名)
*/
private String parkBranchCompanyName;
}
......@@ -138,4 +138,6 @@ public class VehiclePageQueryVo {
*/
private Integer modelId;
}
......@@ -85,8 +85,12 @@ public class VehicleActiveService {
// 写入车辆公里数,预计目的地
vehicle.setMileageLastUpdate(MileageLift1);
// 修改车辆状态,确认是空闲状态
int result = vehicleMapper.updateStatusByIdAndStatus(departureVo.getVehicleId(), VehicleStatus.DEPARTURE.getCode(),
VehicleStatus.NORMAL.getCode());
if (vehicle.getStatus().equals(VehicleStatus.NORMAL.getCode())) {
vehicle.setStatus(VehicleStatus.DEPARTURE.getCode());
}
vehicleMapper.updateByPrimaryKeySelective(vehicle);
//修改预约记录状态
VehicleBookRecord vehicleBookRecord = null;
......@@ -211,7 +215,10 @@ public class VehicleActiveService {
}
// 写入车辆公里数,还车分公司id
vehicle.setMileageLastUpdate(MileageRest1);
vehicleMapper.updateByPrimaryKeySelective(vehicle);
if (vehicleBookRecord != null) {
vehicle.setParkBranchCompanyId(vehicleBookRecord.getRetCompany());
}
// 出车记录
VehicleDepartureLogVo departureLogVo = vehicleDepartureLogMapper.selectByBookRecordId(arrivalVo.getBookRecordId());
......@@ -230,13 +237,13 @@ public class VehicleActiveService {
}
}
if (flag) { //如果此条记录后面还有未收车记录,就不修改车辆状态
int result = vehicleMapper.updateStatus(arrivalVo.getVehicleId(), VehicleStatus.NORMAL.getCode());
// if (result == 0) {
vehicle.setStatus(VehicleStatus.NORMAL.getCode());
// if (result == 0) {
// throw new BaseException(ResCode.VEHICLE_DEPARTURE_VEHICLE_UNDEPARTURE.getDesc(),
// ResCode.VEHICLE_DEPARTURE_VEHICLE_UNDEPARTURE.getCode());
// }
}
vehicleMapper.updateByPrimaryKeySelective(vehicle);
DateTime arrivalDate = new DateTime(vehicleBookRecord.getBookEndDate());
DateTime actualArrivalDate = new DateTime(new Date());
//提前还车处理
......
......@@ -1173,7 +1173,7 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
public PageDataVO<UsableVehicleModelVO> searchUsableModel(UsableVeicleDTO dto) {
Map<String, Object> params = BeanUtil.beanToMap(dto);
if (StrUtil.isNotBlank(dto.getStartDate()) && StrUtil.isNotBlank(dto.getEndDate())) {
initBookSearchParam(dto, params, Boolean.TRUE);
initBookSearchParam(dto, params, Boolean.FALSE);
}
return PageDataVO.pageInfo(dto.getPage(), dto.getLimit(), () -> mapper.searchUsableModel(params));
}
......@@ -1233,10 +1233,10 @@ public class VehicleBiz extends BaseBiz<VehicleMapper, Vehicle> implements UserR
List<String> notBookedDates = Lists.newArrayList();
if (StringUtils.isNotBlank(dto.getBookEndDate()) &&
StringUtils.isNotBlank(dto.getBookEndDate())) {
// notBookedDates = convertDatePeriod2List(dto.getBookStartDate(),
// dto.getBookEndDate());
notBookedDates = convertDatePeriod2List(dto.getStartDateExtend(),
dto.getEndDateExtend());
notBookedDates = convertDatePeriod2List(dto.getBookStartDate(),
dto.getBookEndDate());
// notBookedDates = convertDatePeriod2List(dto.getStartDateExtend(),
// dto.getEndDateExtend());
}
//若传入预定信息查询条件,则查询对应月份预定信息查询条件(不超过3个月)
......
package com.xxfc.platform.vehicle.biz;
import com.alibaba.fastjson.JSON;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.Lists;
import com.xxfc.platform.vehicle.entity.Vehicle;
import com.xxfc.platform.vehicle.mapper.VehicleMapper;
import com.xxfc.platform.vehicle.pojo.ResultVehicleVo;
import com.xxfc.platform.vehicle.pojo.VehicleExcelVo;
import com.xxfc.platform.vehicle.pojo.VehiclePageQueryVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class VehicleInformationDownloadBiz extends BaseBiz<VehicleMapper, Vehicle> {
@Autowired
private VehicleBiz vehicleBiz;
public List getByPageNotAllData(VehiclePageQueryVo vehiclePageQueryVo, List<Integer> companyList) throws Exception {
Map<String, Object> params = PropertyUtils.describe(vehiclePageQueryVo);
//处理预定日期相关参数
vehicleBiz.adjustBookedInfoParam(params, vehiclePageQueryVo);
if (companyList != null && companyList.size() > 0) {
params.put("companyList", companyList);
} else {
params.put("companyList", Arrays.asList(-1));
}
return mapper.getByPageNotAllData(params);
}
public List getByPage(VehiclePageQueryVo vehiclePageQueryVo) throws Exception {
Map<String, Object> params = PropertyUtils.describe(vehiclePageQueryVo);
//处理预定日期相关参数
vehicleBiz.adjustBookedInfoParam(params, vehiclePageQueryVo);
params.get("yearMonthAndParam");
if (vehiclePageQueryVo.getModelId() == null) {
params.remove("modelId");
}
return mapper.getByPage(params);
}
//getResultVehicleVoList
public List<ResultVehicleVo> getResultVehicleVoList(String vehiclePageQueryVoJson, UserDTO userDTO) {
VehiclePageQueryVo vehiclePageQueryVo = new VehiclePageQueryVo();
try {
if (StringUtils.isNotBlank(vehiclePageQueryVoJson)){
vehiclePageQueryVo = JSON.parseObject(vehiclePageQueryVoJson, VehiclePageQueryVo.class);
}
if (userDTO.getDataAll() == 2) {
List<Integer> companyList = vehicleBiz.dataCompany(userDTO.getDataZone(), userDTO.getDataCompany());
return getByPageNotAllData(vehiclePageQueryVo, companyList);
}
return getByPage(vehiclePageQueryVo);
} catch (Exception e) {
e.printStackTrace();
}
return new ArrayList();
}
public List<VehicleExcelVo> getList(String vehiclePageQueryVoJson, UserDTO userDTO) throws Exception {
List<ResultVehicleVo> resultVehicleVoList = getResultVehicleVoList(vehiclePageQueryVoJson, userDTO);
ArrayList<VehicleExcelVo> arrayList = Lists.newArrayList();
resultVehicleVoList.parallelStream().forEach(result->{
try {
VehicleExcelVo vehicleExcelVo = new VehicleExcelVo();
BeanUtilsBean.getInstance().copyProperties(vehicleExcelVo,result);
arrayList.add(vehicleExcelVo);
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
});
return arrayList;
}
}
......@@ -16,6 +16,8 @@ public interface VehicleMapper extends Mapper<Vehicle> {
public List<ResultVehicleVo> getByPageNotAllData(Map<String, Object> params);
public int updateStatusById(Map<String, Object> params);
/**
......
package com.xxfc.platform.vehicle.rest.admin;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.wxiaoqi.security.admin.feign.UserFeign;
import com.github.wxiaoqi.security.admin.feign.dto.UserDTO;
import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.xxfc.platform.vehicle.biz.VehicleBiz;
import com.xxfc.platform.vehicle.biz.VehicleInformationDownloadBiz;
import com.xxfc.platform.vehicle.common.BaseController;
import com.xxfc.platform.vehicle.pojo.VehicleExcelVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("VehicleInformationDownload")
@Slf4j
public class VehicleInformationDownloadController extends BaseController<VehicleInformationDownloadBiz> {
@Autowired
UserFeign userFeign;
@Autowired
private UserAuthConfig userAuthConfig;
@Autowired
private VehicleBiz vehicleBiz;
@Autowired
HttpServletResponse response;
@GetMapping("/excel")
public void downloadExcel(@RequestParam(value = "vehiclePageQueryVoJson",required = false) String vehiclePageQueryVoJson) throws Exception {
UserDTO userDTO = userFeign.userinfoByToken(userAuthConfig.getToken(request)).getData();
if (userDTO==null) {
throw new BaseException("token已失效");
}
List<VehicleExcelVo> rows = baseBiz.getList(vehiclePageQueryVoJson, userDTO);
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.addHeaderAlias("numberPlate", "车牌号");
writer.addHeaderAlias("code", "车辆编码");
writer.addHeaderAlias("vehicleType", "车型");
writer.addHeaderAlias("useTypeName", "用途");
writer.addHeaderAlias("parkBranchCompanyName", "停靠分公司");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition", "attachment;filename=clxx.xlsx");
//out为OutputStream,需要写出到的目标流
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
......@@ -31,7 +31,7 @@
from branch_company
<where>
<if test="addrCity != null">
and addr_city = #{addrCity}
and (addr_city = #{addrCity} or addr_province = #{addrCity} or addr_town = #{addrCity})
</if>
<if test="lon != null and lat != null">
and longitude is not null and latitude is not null
......
......@@ -487,7 +487,7 @@
and (v3.number_plate like concat('%', #{keywords}, '%') or v3.code like concat('%', #{keywords}, '%'))
</if>
<if test="zoneId != null">
and bc3.zone_id = #{zoneId}
and bc1.zone_id = #{zoneId}
</if>
<if test="companyIds != null and companyIds.size > 0">
and (v1.lift_company in
......
......@@ -70,7 +70,9 @@
v.receive_time,
v.update_time,
v.model_id,
v.mileage_last_update as mileage
v.mileage_last_update as mileage,
c.val as useTypeName,
vm.name as vehicleType
<if test=" yearMonthAndParam != null ">
,vbi.booked_date
</if>
......@@ -79,6 +81,8 @@
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
-- 目的地分公司
......@@ -87,6 +91,8 @@
LEFT JOIN branch_company bc2 ON v.subordinate_branch = bc2.id
LEFT JOIN vehicle_book_record v2 on v2.id = (select id from vehicle_book_record where vehicle_id = v.id order by update_time DESC LIMIT 1)
LEFT JOIN vehicle_departure_log v3 on v2.id = v3.book_record_id
LEFT JOIN vehicle_model vm ON v.model_id = vm.id
LEFT JOIN (select * from constant where type = 2) c ON v.use_type = c.code
where
v.is_del=0
<if test="mRangeDateEnd !=null">
......@@ -117,7 +123,7 @@
and v.belong_to_name like concat('%',#{belongToName},'%')
</if>
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
and v.vin like CONCAT('%',#{vin},'%')
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
......@@ -171,9 +177,11 @@
and bc.zone_id=#{zoneId}
</if>
</if>
order by v.code
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="getByPageNotAllData" parameterType="java.util.Map"
resultType="com.xxfc.platform.vehicle.pojo.ResultVehicleVo">
SELECT r.* FROM (
......@@ -210,7 +218,9 @@
v.receive_time,
v.update_time,
v.model_id,
v.mileage_last_update as mileage
v.mileage_last_update as mileage,
c.val as useTypeName,
vm.name as vehicleType
<if test=" yearMonthAndParam !=null ">
,vbi.booked_date
</if>
......@@ -227,6 +237,248 @@
LEFT JOIN branch_company bc2 ON v.subordinate_branch = bc2.id
LEFT JOIN vehicle_book_record v2 on v2.id = (select id from vehicle_book_record where vehicle_id = v.id order by update_time DESC LIMIT 1)
LEFT JOIN vehicle_departure_log v3 on v2.id = v3.book_record_id
LEFT JOIN vehicle_model vm ON v.model_id = vm.id
LEFT JOIN (select * from constant where type = 2) c ON v.use_type = c.code
where
v.is_del=0
<if test="companyList != null">
and ( v.park_branch_company_id in (
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
#{companyId},
</foreach>
</trim>
)
<!--or v.expect_destination_branch_company_id in (
<trim suffixOverrides=",">
<foreach collection="companyList" item="companyId">
#{companyId},
</foreach>
</trim>
)-->
<!-- or v.subordinate_branch in (-->
<!-- <trim suffixOverrides=",">-->
<!-- <foreach collection="companyList" item="companyId">-->
<!-- #{companyId},-->
<!-- </foreach>-->
<!-- </trim>-->
)
</if>
<if test="mRangeDateEnd !=null">
and v.maintenance_date &lt;= #{mRangeDateEnd}
</if>
<if test="modelId != null and modelId != ''">
and v.model_id = #{modelId}
</if>
<if test="mRangeDateStart !=null">
and v.maintenance_date &gt;= #{mRangeDateStart}
</if>
<if test="aVRangeDateStart !=null">
and v.annual_verification_date &lt;= #{aVRangeDateEnd}
</if>
<if test="aVRangeDateEnd !=null">
and v.annual_verification_date &gt;= #{aVRangeDateStart}
</if>
<if test="insuranceDateRangeStart !=null">
and v.insurance_end_date &lt;= #{insuranceDateRangeEnd}
</if>
<if test="insuranceDateRangeEnd !=null">
and v.insurance_end_date &gt;= #{insuranceDateRangeStart}
</if>
<if test="insuranceCompany !=null">
and v.insurance_company = #{insuranceCompany}
</if>
<if test="belongToName !=null">
and v.belong_to_name = #{belongToName}
</if>
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
<!-- </if>-->
<if test="code !=null">
and v.code = #{code}
</if>
<if test="status !=null">
and v.status = #{status}
</if>
<if test="numberPlate !=null and numberPlate != ''">
and v.number_plate like concat('%',#{numberPlate},'%')
</if>
<if test="brand !=null">
and v.brand = #{brand}
</if>
<if test="useType !=null">
and v.use_type = #{useType}
</if>
-- 添加所属大区搜索条件
<if test="zoneId !=null">
and bc.zone_id=#{zoneId}
</if>
<!-- 若需根据预定日期条件查询,针对换为位操作 -->
<if test=" yearMonthAndParam !=null ">
<foreach collection="yearMonthAndParam" index="yearMonth" item="andOperation">
and
( (vbi.`year_month` = #{yearMonth} or vbi.`year_month` is null) and
ifnull(vbi.`booked_date`,0) &amp; #{andOperation.andOperationFactor} = #{andOperation.andOperationRs}
)
</foreach>
</if>
<if test="subordinateBranch !=null ">
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 ">
<if test="addrProvince !=null">
and bc.addr_province=#{addrProvince}
</if>
<if test="addrCity !=null">
and bc.addr_city=#{addrCity}
</if>
<if test="zoneId !=null">
and bc.zone_id=#{zoneId}
</if>
</if>
order by v.code
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="getVehicleExcelVo" parameterType="java.util.Map"
resultType="com.xxfc.platform.vehicle.pojo.VehicleExcelVo">
SELECT r.* FROM (
select
v.`code`,
v.number_plate,
bc.name as parkBranchCompanyName,
c.val as useType,
vm.name as vehicleType
from vehicle v
<if test=" yearMonthAndParam != null ">
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
LEFT JOIN vehicle_book_record v2 on v2.vehicle_id = v.id
LEFT JOIN vehicle_departure_log v3 on v2.id = v3.book_record_id
LEFT JOIN vehicle_model vm ON v.model_id = vm.id
LEFT JOIN (select * from constant where type = 2) c ON v.use_type = c.code
where
v.is_del=0
<if test="mRangeDateEnd !=null">
and v.maintenance_date &lt;= #{mRangeDateEnd}
</if>
<if test="modelId != null and modelId != ''">
and v.model_id = #{modelId}
</if>
<if test="mRangeDateStart !=null">
and v.maintenance_date &gt;= #{mRangeDateStart}
</if>
<if test="aVRangeDateStart !=null">
and v.annual_verification_date &lt;= #{aVRangeDateEnd}
</if>
<if test="aVRangeDateEnd !=null">
and v.annual_verification_date &gt;= #{aVRangeDateStart}
</if>
<if test="insuranceDateRangeStart !=null">
and v.insurance_end_date &lt;= #{insuranceDateRangeEnd}
</if>
<if test="insuranceDateRangeEnd !=null">
and v.insurance_end_date &gt;= #{insuranceDateRangeStart}
</if>
<if test="insuranceCompany !=null">
and v.insurance_company = #{insuranceCompany}
</if>
<if test="belongToName !=null">
and v.belong_to_name = #{belongToName}
</if>
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
<!-- </if>-->
<if test="code !=null">
and v.code = #{code}
</if>
<if test="status !=null and status != 6 and status != 7">
and v.status = #{status}
</if>
<if test="status !=null and status == 6">
and v3.id is not NULL and v2.book_type = 3 and v3.state = 0
</if>
<if test="status !=null and status == 7">
and v3.id is not NULL and v2.book_type = 6 and v3.state = 0
</if>
<if test="numberPlate !=null and numberPlate != ''">
and v.number_plate like concat('%',#{numberPlate},'%')
</if>
<if test="brand !=null">
and v.brand = #{brand}
</if>
<if test="useType !=null">
and v.use_type = #{useType}
</if>
-- 添加所属大区搜索条件
<if test="zoneId !=null">
and bc.zone_id=#{zoneId}
</if>
<!-- 若需根据预定日期条件查询,针对换为位操作 -->
<if test=" yearMonthAndParam !=null ">
<foreach collection="yearMonthAndParam" index="yearMonth" item="andOperation">
and
( (vbi.`year_month` = #{yearMonth} or vbi.`year_month` is null) and
ifnull(vbi.`booked_date`,0) &amp; #{andOperation.andOperationFactor} = #{andOperation.andOperationRs}
)
</foreach>
</if>
<if test="subordinateBranch !=null ">
and ( v.park_branch_company_id = #{subordinateBranch})
</if>
<if test=" addrProvince !=null or addrCity !=null or zoneId !=null ">
<if test="addrProvince !=null">
and bc.addr_province=#{addrProvince}
</if>
<if test="addrCity !=null">
and bc.addr_city=#{addrCity}
</if>
<if test="zoneId !=null">
and bc.zone_id=#{zoneId}
</if>
</if>
order by v.code
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="getVehicleExcelVoNotAllData" parameterType="java.util.Map"
resultType="com.xxfc.platform.vehicle.pojo.VehicleExcelVo">
SELECT r.* FROM (
select
v.`code`,
v.number_plate,
bc.name as parkBranchCompanyName,
c.val as useType,
vm.name as vehicleType
from vehicle v
<if test=" yearMonthAndParam !=null ">
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
LEFT JOIN vehicle_model vm ON v.model_id = vm.id
LEFT JOIN (select * from constant where type = 2) c ON v.use_type = c.code
where
v.is_del=0
<if test="companyList != null">
......@@ -280,7 +532,7 @@
and v.belong_to_name like concat('%',#{belongToName},'%')
</if>
<if test="vin !=null and vin != ''">
and v.vin = #{vin}
and v.vin like CONCAT('%',#{vin},'%')
</if>
<!-- <if test="subordinateBranch !=null">-->
<!-- and v.subordinate_branch = #{subordinateBranch}-->
......@@ -334,9 +586,12 @@
and bc.zone_id=#{zoneId}
</if>
</if>
order by v.code
) r ORDER BY r.parkBranchCompanyName
</select>
<select id="lockByCode" resultType="com.xxfc.platform.vehicle.entity.Vehicle"
parameterType="com.xxfc.platform.vehicle.pojo.AddOrUpdateVehicleVo">
select
......@@ -552,14 +807,14 @@
</if>
<!-- yearNo4Where 标识时间参数不用于where条件,用于select部分 -->
<if test=" yearMonthAndParam !=null and yearNo4Where != null and yearNo4Where == true">
,(max(
,(ifnull(max(
vbi.bit_str = #{yearMonthAndParamBitStr}
<!-- 租车列表 不过滤前后预约记录不符的车辆 但是合并标示车型是否有车 即 hasVehicle-->
<if test="withoutRecordWhere != null and withoutRecordWhere = 1 and startCompanyId != null and endCompanyId != null ">
and (abr.to_lift_company is null or abr.to_lift_company = #{startCompanyId})
and (abr.to_return_company is null or abr.to_return_company = #{endCompanyId})
</if>
)
), 1)
) as hasVehicle
</if>
<if test="lon != null and lat != null">
......@@ -570,6 +825,7 @@
and vm.id is not null
and vm.status = 1
and vm.isdel = 0
and vm.app_show = 1
and bc.id is not null
GROUP BY model_id, company_id
<if test="lon != null and lat != null">, distance</if>
......
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