Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

yanliming 4 lat temu
rodzic
commit
5011f6b670
29 zmienionych plików z 1607 dodań i 466 usunięć
  1. 23 0
      common/src/main/java/com/jpsoft/bus/config/WxConfig.java
  2. 18 0
      common/src/main/java/com/jpsoft/bus/modules/base/dao/MergeOrderInfoDAO.java
  3. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/dao/OrderInfoDAO.java
  4. 36 0
      common/src/main/java/com/jpsoft/bus/modules/base/dto/PassengerOrderDTO.java
  5. 47 0
      common/src/main/java/com/jpsoft/bus/modules/base/entity/MergeOrderInfo.java
  6. 21 0
      common/src/main/java/com/jpsoft/bus/modules/base/entity/OrderInfo.java
  7. 17 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/MergeOrderInfoService.java
  8. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/OrderInfoService.java
  9. 70 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/impl/MergeOrderInfoServiceImpl.java
  10. 11 6
      common/src/main/java/com/jpsoft/bus/modules/base/service/impl/OrderInfoServiceImpl.java
  11. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dao/PriceInfoDAO.java
  12. 40 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dto/PassengerDetailDTO.java
  13. 24 0
      common/src/main/java/com/jpsoft/bus/modules/bus/entity/PassengerInfo.java
  14. 2 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/PriceInfoService.java
  15. 13 10
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsServiceImpl.java
  16. 114 92
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PassengerInfoServiceImpl.java
  17. 11 6
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PriceInfoServiceImpl.java
  18. 2 2
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/ShiftInfoServiceImpl.java
  19. 3 11
      common/src/main/java/com/jpsoft/bus/modules/common/utils/OSSUtil.java
  20. 2 4
      common/src/main/java/com/jpsoft/bus/modules/common/utils/WechatMessageUtil.java
  21. 269 304
      common/src/main/java/com/jpsoft/bus/modules/common/utils/WeixinUtil.java
  22. 111 0
      common/src/main/resources/mapper/base/MergeOrderInfo.xml
  23. 15 1
      common/src/main/resources/mapper/base/OrderInfo.xml
  24. 15 2
      common/src/main/resources/mapper/bus/PassengerInfo.xml
  25. 12 2
      common/src/main/resources/mapper/bus/PriceInfo.xml
  26. 1 0
      web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java
  27. 228 0
      web/src/main/java/com/jpsoft/bus/modules/base/controller/MergeOrderInfoController.java
  28. 232 26
      web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java
  29. 264 0
      web/src/main/java/com/jpsoft/bus/wechat/controller/WxController.java

+ 23 - 0
common/src/main/java/com/jpsoft/bus/config/WxConfig.java

@@ -0,0 +1,23 @@
+package com.jpsoft.bus.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2020-3-21 13:42
+ */
+@Component
+@ConfigurationProperties(prefix = "wx.pay")
+@Data
+public class WxConfig {
+    private String appId;
+    private String appSecret;
+    private String token;
+    private String tokenUrl;
+    private String createQrCodeUrl;
+    private String showQrCodeUrl;
+    private String contentType;
+    private String portalUrl;
+}

+ 18 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dao/MergeOrderInfoDAO.java

@@ -0,0 +1,18 @@
+package com.jpsoft.bus.modules.base.dao;
+
+import java.util.List;
+import org.springframework.stereotype.Repository;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import java.util.Map;
+import com.jpsoft.bus.modules.common.dto.Sort;
+
+@Repository
+public interface MergeOrderInfoDAO {
+	int insert(MergeOrderInfo entity);
+	int update(MergeOrderInfo entity);
+	int exist(String id);
+	MergeOrderInfo get(String id);
+	int delete(String id);
+	List<MergeOrderInfo> list();
+	List<MergeOrderInfo> search(Map<String,Object> searchParams,List<Sort> sortList);
+}

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dao/OrderInfoDAO.java

@@ -15,4 +15,6 @@ public interface OrderInfoDAO {
 	int delete(String id);
 	List<OrderInfo> list();
 	List<OrderInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus);
 }

+ 36 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dto/PassengerOrderDTO.java

@@ -0,0 +1,36 @@
+package com.jpsoft.bus.modules.base.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-8 14:47
+ */
+@Data
+public class PassengerOrderDTO {
+
+    private String ticketType;
+
+    private String ticketTypeStr;
+
+    private BigDecimal goodsTicket;
+
+    private String payName;
+
+    private String payNameStr;
+
+    private BigDecimal totalFee;
+
+    public String getTicketTypeStr(String ticketType){
+        String ticketTypeStr = "";
+        if ("1".equals(ticketType)){
+            ticketTypeStr = "儿童票";
+        }
+        if ("2".equals(ticketType)){
+            ticketTypeStr = "成人票";
+        }
+        return ticketTypeStr;
+    }
+}

+ 47 - 0
common/src/main/java/com/jpsoft/bus/modules/base/entity/MergeOrderInfo.java

@@ -0,0 +1,47 @@
+package com.jpsoft.bus.modules.base.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+  描述:base_merge_order_info的实体类
+ */
+@Data
+@ApiModel(value = "base_merge_order_info的实体类")
+public class MergeOrderInfo {
+        @ApiModelProperty(value = "")
+    private String id;
+        @ApiModelProperty(value = "用户标识")
+    private String openId;
+        @ApiModelProperty(value = "支付状态(10:未支付,15:部分支付,20:支付完成,30:关闭,40:全额退款,45:部分退款)")
+    private Integer payStatus;
+        @ApiModelProperty(value = "支付方式(wechat:微信,alipay:支付宝,cash:现金,ticket:车票)")
+    private String payName;
+        @ApiModelProperty(value = "系统订单号")
+    private String outOrderNo;
+        @ApiModelProperty(value = "微信支付订单号")
+    private String transactionId;
+        @ApiModelProperty(value = "收款账户id")
+    private String paymentId;
+        @ApiModelProperty(value = "创建人")
+    private String createBy;
+        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
+	    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+        @ApiModelProperty(value = "更新人")
+    private String updateBy;
+        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
+	    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+        @ApiModelProperty(value = "是否删除")
+    private Boolean delFlag;
+}

+ 21 - 0
common/src/main/java/com/jpsoft/bus/modules/base/entity/OrderInfo.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import java.text.SimpleDateFormat;
 import java.math.BigDecimal;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.format.annotation.DateTimeFormat;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -63,4 +64,24 @@ public class OrderInfo {
     private String ticketType;
     @ApiModelProperty(value = "货票金额")
     private BigDecimal goodsTicket = BigDecimal.ZERO;
+    @ApiModelProperty(value = "综合账单id")
+    private String mergeOrderId;
+
+
+    public String getPayNameStr(String payName){
+        String payNameStr = "";
+        if ("wechat".equals(payName)){
+            payNameStr = "微信";
+        }
+        if ("alipay".equals(payName)){
+            payNameStr = "支付宝";
+        }
+        if ("cash".equals(payName)){
+            payNameStr = "现金";
+        }
+        if ("ticket".equals(payName)){
+            payNameStr = "车票";
+        }
+        return payNameStr;
+    }
 }

+ 17 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/MergeOrderInfoService.java

@@ -0,0 +1,17 @@
+package com.jpsoft.bus.modules.base.service;
+
+import java.util.List;
+import java.util.Map;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.github.pagehelper.Page;
+import com.jpsoft.bus.modules.common.dto.Sort;
+
+public interface MergeOrderInfoService {
+	MergeOrderInfo get(String id);
+	boolean exist(String id);
+	int insert(MergeOrderInfo model);
+	int update(MergeOrderInfo model);
+	int delete(String id);
+	List<MergeOrderInfo> list();
+	Page<MergeOrderInfo> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,boolean count,List<Sort> sortList);
+}

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/OrderInfoService.java

@@ -14,4 +14,6 @@ public interface OrderInfoService {
 	int delete(String id);
 	List<OrderInfo> list();
 	Page<OrderInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+
+    List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus);
 }

+ 70 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/impl/MergeOrderInfoServiceImpl.java

@@ -0,0 +1,70 @@
+package com.jpsoft.bus.modules.base.service.impl;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import com.jpsoft.bus.modules.base.dao.MergeOrderInfoDAO;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.github.pagehelper.Page;
+import com.jpsoft.bus.modules.common.dto.Sort;
+import com.github.pagehelper.PageHelper;
+
+@Transactional
+@Component(value="mergeOrderInfoService")
+public class MergeOrderInfoServiceImpl implements MergeOrderInfoService {
+	@Resource(name="mergeOrderInfoDAO")
+	private MergeOrderInfoDAO mergeOrderInfoDAO;
+
+	@Override
+	public MergeOrderInfo get(String id) {
+		// TODO Auto-generated method stub
+		return mergeOrderInfoDAO.get(id);
+	}
+
+	@Override
+	public int insert(MergeOrderInfo model) {
+		// TODO Auto-generated method stub
+		//model.setId(UUID.randomUUID().toString());
+		
+		return mergeOrderInfoDAO.insert(model);
+	}
+
+	@Override
+	public int update(MergeOrderInfo model) {
+		// TODO Auto-generated method stub
+		return mergeOrderInfoDAO.update(model);		
+	}
+
+	@Override
+	public int delete(String id) {
+		// TODO Auto-generated method stub
+		return mergeOrderInfoDAO.delete(id);
+	}
+
+	@Override
+	public boolean exist(String id) {
+		// TODO Auto-generated method stub
+		int count = mergeOrderInfoDAO.exist(id);
+		
+		return count > 0 ? true : false;
+	}
+	
+	@Override
+	public List<MergeOrderInfo> list() {
+		// TODO Auto-generated method stub
+		return mergeOrderInfoDAO.list();
+	}
+		
+	@Override
+	public Page<MergeOrderInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
+        Page<MergeOrderInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
+            mergeOrderInfoDAO.search(searchParams,sortList);
+        });
+        
+        return page;
+	}
+}

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/base/service/impl/OrderInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class OrderInfoServiceImpl implements OrderInfoService {
 	public int insert(OrderInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return orderInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(OrderInfo model) {
 		// TODO Auto-generated method stub
-		return orderInfoDAO.update(model);		
+		return orderInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class OrderInfoServiceImpl implements OrderInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = orderInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<OrderInfo> list() {
 		// TODO Auto-generated method stub
 		return orderInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<OrderInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<OrderInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             orderInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus) {
+		return orderInfoDAO.findByPassengerIdAndPayStatus(passengerId,payStatus);
+	}
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dao/PriceInfoDAO.java

@@ -15,4 +15,6 @@ public interface PriceInfoDAO {
 	int delete(String id);
 	List<PriceInfo> list();
 	List<PriceInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    PriceInfo findByStartStationAndEndStation(String ticketUpStationId, String ticketDownStationId);
 }

+ 40 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dto/PassengerDetailDTO.java

@@ -0,0 +1,40 @@
+package com.jpsoft.bus.modules.bus.dto;
+
+import com.jpsoft.bus.modules.base.dto.PassengerOrderDTO;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-8 11:33
+ */
+@Data
+public class PassengerDetailDTO {
+
+    private String id;
+
+    private String imageUrl;
+
+    private String ticketUpStationId;
+
+    private String ticketUpStationName;
+
+    private String ticketDownStationId;
+
+    private String ticketDownStationName;
+
+    private String payStatus;
+
+    private String payStatusName;
+
+    private List<PassengerOrderDTO> passengerOrderDTOList;
+
+    private BigDecimal payFee;
+
+
+
+
+
+}

+ 24 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/entity/PassengerInfo.java

@@ -60,4 +60,28 @@ public class PassengerInfo {
     @ApiModelProperty(value = "注册用户名")
     private String userName;
 
+    @ApiModelProperty(value = "购票的上车站点")
+    private String ticketUpStationId;
+
+    @ApiModelProperty(value = "购票的下车站点")
+    private String ticketDownStationId;
+
+
+    public String getPayStatusName(String payStatus){
+        String payStatusName = "";
+        if ("0".equals(payStatus)){
+            payStatusName = "未购票";
+        }
+        if ("1".equals(payStatus)){
+            payStatusName = "已购票";
+        }
+        if ("2".equals(payStatus)){
+            payStatusName = "已过站";
+        }
+        if ("3".equals(payStatus)){
+            payStatusName = "已补票";
+        }
+        return payStatusName;
+    }
+
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/PriceInfoService.java

@@ -14,4 +14,6 @@ public interface PriceInfoService {
 	int delete(String id);
 	List<PriceInfo> list();
 	Page<PriceInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+
+    PriceInfo findByStartStationAndEndStation(String ticketUpStationId, String ticketDownStationId);
 }

+ 13 - 10
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/GpsServiceImpl.java

@@ -259,16 +259,19 @@ public class GpsServiceImpl implements GpsService {
              nextStation = stationInfoList.get(nextIndex);
          }
 
-         //车辆离当前站点的距离
-        GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(vehicleInfo.getLatitude()), Double.valueOf(vehicleInfo.getLongitude()));
-        GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(currentStation.getLatitude()), Double.valueOf(currentStation.getLongitude()));
-
-        double meter1 = CommonUtil.getDistanceMeter(source, target, Ellipsoid.Sphere);
-        if (meter1 <= Double.valueOf(50)){
-            stationStatusDTO.setNowStationStatus("1");
-        }else {
-            stationStatusDTO.setNowStationStatus("2");
-        }
+         if(StringUtils.isNotEmpty(vehicleInfo.getLatitude())
+         && StringUtils.isNotEmpty(vehicleInfo.getLatitude())) {
+             //车辆离当前站点的距离
+             GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(vehicleInfo.getLatitude()), Double.valueOf(vehicleInfo.getLongitude()));
+             GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(currentStation.getLatitude()), Double.valueOf(currentStation.getLongitude()));
+
+             double meter1 = CommonUtil.getDistanceMeter(source, target, Ellipsoid.Sphere);
+             if (meter1 <= Double.valueOf(50)) {
+                 stationStatusDTO.setNowStationStatus("1");
+             } else {
+                 stationStatusDTO.setNowStationStatus("2");
+             }
+         }
 
         stationStatusDTO.setNowStationId(currentStation.getId());
         stationStatusDTO.setNowStationName(currentStation.getName());

+ 114 - 92
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PassengerInfoServiceImpl.java

@@ -12,6 +12,7 @@ import com.jpsoft.bus.modules.bus.entity.ShiftInfo;
 import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
 import com.jpsoft.bus.modules.bus.service.BaiduService;
 import com.jpsoft.bus.modules.common.utils.CommonUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,100 +24,121 @@ import com.jpsoft.bus.modules.common.dto.Sort;
 import com.github.pagehelper.PageHelper;
 
 @Transactional
-@Component(value="passengerInfoService")
+@Component(value = "passengerInfoService")
 public class PassengerInfoServiceImpl implements PassengerInfoService {
-	@Resource(name="passengerInfoDAO")
-	private PassengerInfoDAO passengerInfoDAO;
-
-	@Autowired
-	private BaiduService baiduService;
-
-	@Override
-	public PassengerInfo get(String id) {
-		// TODO Auto-generated method stub
-		return passengerInfoDAO.get(id);
-	}
-
-	@Override
-	public int insert(PassengerInfo model) {
-		// TODO Auto-generated method stub
-		//model.setId(UUID.randomUUID().toString());
-
-		return passengerInfoDAO.insert(model);
-	}
-
-	@Override
-	public int update(PassengerInfo model) {
-		// TODO Auto-generated method stub
-		return passengerInfoDAO.update(model);
-	}
-
-	@Override
-	public int delete(String id) {
-		// TODO Auto-generated method stub
-		return passengerInfoDAO.delete(id);
-	}
-
-	@Override
-	public boolean exist(String id) {
-		// TODO Auto-generated method stub
-		int count = passengerInfoDAO.exist(id);
-
-		return count > 0 ? true : false;
-	}
-
-	@Override
-	public List<PassengerInfo> list() {
-		// TODO Auto-generated method stub
-		return passengerInfoDAO.list();
-	}
-
-	@Override
-	public Page<PassengerInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
-        Page<PassengerInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
-            passengerInfoDAO.search(searchParams,sortList);
+    @Resource(name = "passengerInfoDAO")
+    private PassengerInfoDAO passengerInfoDAO;
+
+    @Autowired
+    private BaiduService baiduService;
+
+    @Override
+    public PassengerInfo get(String id) {
+        // TODO Auto-generated method stub
+        return passengerInfoDAO.get(id);
+    }
+
+    @Override
+    public int insert(PassengerInfo model) {
+        // TODO Auto-generated method stub
+        //model.setId(UUID.randomUUID().toString());
+
+        return passengerInfoDAO.insert(model);
+    }
+
+    @Override
+    public int update(PassengerInfo model) {
+        // TODO Auto-generated method stub
+        return passengerInfoDAO.update(model);
+    }
+
+    @Override
+    public int delete(String id) {
+        // TODO Auto-generated method stub
+        return passengerInfoDAO.delete(id);
+    }
+
+    @Override
+    public boolean exist(String id) {
+        // TODO Auto-generated method stub
+        int count = passengerInfoDAO.exist(id);
+
+        return count > 0 ? true : false;
+    }
+
+    @Override
+    public List<PassengerInfo> list() {
+        // TODO Auto-generated method stub
+        return passengerInfoDAO.list();
+    }
+
+    @Override
+    public Page<PassengerInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize, boolean count, List<Sort> sortList) {
+        Page<PassengerInfo> page = PageHelper.startPage(pageNumber, pageSize, count).doSelectPage(() -> {
+            passengerInfoDAO.search(searchParams, sortList);
         });
 
         return page;
-	}
-
-	@Override
-	public List<PassengerInfo> findByPersonIdShiftIdStatus(Long personId, String shiftId, String status) {
-		return passengerInfoDAO.findByPersonIdShiftIdStatus(personId,shiftId,status);
-	}
-
-	@Override
-	public void passengerFace(VehicleInfo vehicleInfo, ShiftInfo shiftInfo, String retFileUrl, String recordTime, String stationId,String personId) throws Exception {
-
-		Date recordDate = DateUtil.parse(recordTime,"yyyy-MM-dd HH:mm:ss");
-		//查询是否有已上车的乘客记录
-		List<PassengerInfo> passengerInfoList = findByPersonIdShiftIdStatus(Long.parseLong(personId),shiftInfo.getId(),"1");
-
-		if (passengerInfoList.size()>0){
-			PassengerInfo passengerInfo = passengerInfoList.get(0);
-			passengerInfo.setDownTime(recordDate);
-			passengerInfo.setDownStationId(stationId);
-			passengerInfo.setStatus("2");
-			update(passengerInfo);
-		}
-		else {
-			PassengerInfo passengerInfo = new PassengerInfo();
-			passengerInfo.setId(UUID.randomUUID().toString());
-			passengerInfo.setVehicleShiftId(shiftInfo.getId());
-			passengerInfo.setVehiclePersonId(Long.parseLong(personId));
-			passengerInfo.setImageUrl(retFileUrl);
-			passengerInfo.setUpTime(recordDate);
-			passengerInfo.setUpStationId(stationId);
-			passengerInfo.setStatus("1");
-			passengerInfo.setPayStatus("0");
-			passengerInfo.setCreateTime(new Date());
-			insert(passengerInfo);
-
-			String groupId = CommonUtil.getProvinceNum(vehicleInfo.getLicensePlateNumber()) + StrUtil.sub(vehicleInfo.getLicensePlateNumber(),1,10);
-			//将图片上传到百度AI人脸识别,  userInfo 1:司机,2:乘客
-			baiduService.faceUserAdd(retFileUrl,groupId,personId,"2");
-
-
-		}
-	}
+    }
+
+    @Override
+    public List<PassengerInfo> findByPersonIdShiftIdStatus(Long personId, String shiftId, String status) {
+        return passengerInfoDAO.findByPersonIdShiftIdStatus(personId, shiftId, status);
+    }
+
+    @Override
+    public void passengerFace(VehicleInfo vehicleInfo, ShiftInfo shiftInfo, String retFileUrl, String recordTime, String stationId, String personId) throws Exception {
+        Date recordDate = DateUtil.parse(recordTime, "yyyy-MM-dd HH:mm:ss");
+
+        //查询是否有已上车的乘客记录
+        List<PassengerInfo> passengerInfoList = findByPersonIdShiftIdStatus(Long.parseLong(personId), shiftInfo.getId(), "1");
+
+        if (passengerInfoList.size() > 0) {
+            PassengerInfo passengerInfo = passengerInfoList.get(0);
+            passengerInfo.setDownTime(recordDate);
+            passengerInfo.setDownStationId(stationId);
+            passengerInfo.setStatus("2");
+            update(passengerInfo);
+        } else {
+
+            //查询此班次是否有已下车的记录
+            List<PassengerInfo> passengerInfoList1 = findByPersonIdShiftIdStatus(Long.parseLong(personId), shiftInfo.getId(), "2");
+            if (passengerInfoList1.size() == 0) {
+                PassengerInfo passengerInfo = new PassengerInfo();
+                passengerInfo.setId(UUID.randomUUID().toString());
+                passengerInfo.setVehicleShiftId(shiftInfo.getId());
+                passengerInfo.setVehiclePersonId(Long.parseLong(personId));
+                passengerInfo.setUpTime(recordDate);
+                passengerInfo.setUpStationId(stationId);
+                passengerInfo.setStatus("1");
+                passengerInfo.setPayStatus("0");
+                passengerInfo.setCreateTime(new Date());
+
+                if (StringUtils.isNotEmpty(retFileUrl)) {
+                    passengerInfo.setImageUrl(retFileUrl);
+                } else {
+                    //如果没有上车记录,但有已下车记录,则读取之前记录的头像信息
+                    List<PassengerInfo> downList = findByPersonIdShiftIdStatus(Long.parseLong(personId), shiftInfo.getId(), "2");
+
+                    if (downList.size() > 0) {
+                        passengerInfo.setImageUrl(downList.get(0).getImageUrl());
+                    }
+                }
+
+                insert(passengerInfo);
+
+                String groupId = CommonUtil.getProvinceNum(vehicleInfo.getLicensePlateNumber()) + StrUtil.sub(vehicleInfo.getLicensePlateNumber(), 1, 10);
+
+                if (StringUtils.isNotEmpty(groupId)) {
+                    //将图片上传到百度AI人脸识别,  userInfo 1:司机,2:乘客
+                    baiduService.faceUserAdd(retFileUrl, groupId, personId, "2");
+                }
+
+            }else {
+				PassengerInfo passengerInfo = passengerInfoList1.get(0);
+				passengerInfo.setStatus("1");
+				update(passengerInfo);
+			}
+        }
+    }
 }

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PriceInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class PriceInfoServiceImpl implements PriceInfoService {
 	public int insert(PriceInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return priceInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(PriceInfo model) {
 		// TODO Auto-generated method stub
-		return priceInfoDAO.update(model);		
+		return priceInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class PriceInfoServiceImpl implements PriceInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = priceInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<PriceInfo> list() {
 		// TODO Auto-generated method stub
 		return priceInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<PriceInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<PriceInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             priceInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public PriceInfo findByStartStationAndEndStation(String ticketUpStationId, String ticketDownStationId) {
+		return priceInfoDAO.findByStartStationAndEndStation(ticketUpStationId,ticketDownStationId);
+	}
 }

+ 2 - 2
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/ShiftInfoServiceImpl.java

@@ -97,8 +97,8 @@ public class ShiftInfoServiceImpl implements ShiftInfoService {
 			}
 		}
 		//TODO 根据经纬度查询当前站点
-		String currentStationId = gpsService.getLatelyStation(vehicleInfo.getId());
-
+		//String currentStationId = gpsService.getLatelyStation(vehicleInfo.getId());
+		String currentStationId = startStationId;
 
 		ShiftInfo shiftInfo = new ShiftInfo();
 		shiftInfo.setId(UUID.randomUUID().toString());

+ 3 - 11
common/src/main/java/com/jpsoft/bus/modules/common/utils/OSSUtil.java

@@ -76,20 +76,13 @@ public class OSSUtil {
         return ossConfig.getUrlPrefix() + "/" + retFileUrl;
     }
 
-
     public static String uploadBase64(String photoBase64Data,String photoName,OSSConfig ossConfig){
-
         try{
-            //前50个字符
-            if (StringUtils.isNotEmpty(photoBase64Data)) {
-                // sysLog.setData(photoBase64Data.substring(0, Math.min(photoBase64Data.length(), 50)));
-            }
-
             BASE64Decoder decoder = new BASE64Decoder();
 
             String[] arr = photoBase64Data.split(",");
 
-            byte[] imgData = decoder.decodeBuffer(arr[1]);
+            byte[] imgData = decoder.decodeBuffer(arr.length>1 ? arr[1] : arr[0]);
 
             for (int i = 0; i < imgData.length; ++i) {
                 if (imgData[i] < 0) {// 调整异常数据
@@ -106,11 +99,10 @@ public class OSSUtil {
             String retFileUrl = OSSUtil.upload(ossConfig, "/faceImage", photoName, inputStream);
             return retFileUrl;
         }catch (Exception ex){
-
+            log.error(ex.getMessage(),ex);
         }
-        return null;
-
 
+        return null;
     }
 
     public static boolean download(String fileUrl,String filePath){

+ 2 - 4
common/src/main/java/com/jpsoft/bus/modules/common/utils/WechatMessageUtil.java

@@ -23,8 +23,6 @@ import java.util.regex.Pattern;
 @Component
 public class WechatMessageUtil {
 
-    @Autowired
-    private WeixinUtil weixinUtil;
 
     public static final String send_template = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
 
@@ -40,7 +38,7 @@ public class WechatMessageUtil {
     public  boolean sendTemplate(JSONObject sendData, String appId, String appSecret, String templateId, String openId, String url) {
         boolean result = false;
 
-        AccessToken accessToken = weixinUtil.getCommonAccessToken(appId, appSecret);
+        AccessToken accessToken = WeixinUtil.getAccessToken(appId, appSecret);
 
         if (accessToken != null) {
             //发送模版内容
@@ -76,7 +74,7 @@ public class WechatMessageUtil {
         String result = "";
 
         try {
-            AccessToken accessToken = weixinUtil.getCommonAccessToken(appId, appSecret);
+            AccessToken accessToken = WeixinUtil.getAccessToken(appId, appSecret);
 
             if (accessToken == null) {
                 throw new Exception("token无法获取");

+ 269 - 304
common/src/main/java/com/jpsoft/bus/modules/common/utils/WeixinUtil.java

@@ -3,14 +3,11 @@ package com.jpsoft.bus.modules.common.utils;
 import cn.hutool.core.date.DateTime;
 import com.jpsoft.bus.modules.wechat.entity.AccessToken;
 import com.jpsoft.bus.modules.wechat.vo.UserInfo;
-import lombok.extern.slf4j.Slf4j;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.ValueOperations;
-import org.springframework.stereotype.Component;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -32,321 +29,289 @@ import java.util.stream.Collectors;
  * @author lt
  * @date 2013-08-09
  */
-@Slf4j
-@Component
 public class WeixinUtil {
+	private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
 
-  /*  @Autowired
-    private RedisServiceImpl redisService;*/
+	// 获取access_token的接口地址(GET) 限200(次/天),可以在配置文件中修改
+	public static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 
-    //通用token,不同站点中相互刷新会导致冲突,因此要统一管理
-    @Value("${wx.commonAccessTokenUrl}")
-    private String commonAccessTokenUrl;
-
-    //获取微信的code
-    public String authCodeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
-
-    //通过code换取网页授权access_token
-    public String webAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
-
-    //js访问token
-    public String jsAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
-
-    // 获取用户信息
-    public String user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
-
-    public String subscribe_user_info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN ";
-
-    public String getCodeRequest(String appid, String url, String scope) {
+	//获取微信的code
+	public static String code = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
+	public static String getCodeRequest(String appid, String url,String scope){
         String result = null;
         String url_encode = "";
         try {
-            url_encode = java.net.URLEncoder.encode(url, "utf-8");
-        } catch (UnsupportedEncodingException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        result = authCodeUrl.replace("APPID", appid).replace("REDIRECT_URI", url_encode).replace("SCOPE", scope);
+			url_encode = java.net.URLEncoder.encode(url, "utf-8");
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+        result  = code.replace("APPID", appid).replace("REDIRECT_URI",url_encode).replace("SCOPE", scope);
         return result;
     }
 
-    public AccessToken getWebAccessToken(String appid, String appsecret, String code) throws Exception {
+	//通过code换取网页授权access_token
+	public static String accessTokenurl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+	public static AccessToken getAccessToken(String appid, String appsecret, String code) throws Exception {
         AccessToken accessToken = null;
-        String formatUrl = webAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
-        JSONObject json = HttpConnectionUtil.httpRequest(formatUrl, "GET", null);
+        String formatUrl = accessTokenurl.replace("APPID", appid).replace("SECRET",appsecret).replace("CODE", code);
+        JSONObject json  = HttpConnectionUtil.httpRequest(formatUrl, "GET", null);
         if (!json.isNullObject() && !json.isEmpty()) {
-            try {
-                accessToken = new AccessToken();
-                accessToken.setToken(json.getString("access_token"));
-                accessToken.setExpiresIn(json.getInt("expires_in"));
-                accessToken.setOpenid(json.getString("openid"));
-                accessToken.setScope(json.getString("scope"));
-            } catch (Exception e) {
-
-                // 获取token失败
-                log.error("获取token失败,返回结果result={}", json);
-                if (json.getString("errcode").equals("40163")) {
-                    throw new Exception("请重新扫码");
-
-                }
-
-            }
-        }
+			try {
+				accessToken = new AccessToken();
+				accessToken.setToken(json.getString("access_token"));
+				accessToken.setExpiresIn(json.getInt("expires_in"));
+				accessToken.setOpenid(json.getString("openid"));
+				accessToken.setScope(json.getString("scope"));
+			} catch (Exception e) {
+
+				// 获取token失败
+				log.error("获取token失败,返回结果result={}", json);
+				if (json.getString("errcode").equals("40163")){
+					throw new Exception("请重新扫码");
+
+				}
+
+			}
+		}
         return accessToken;
     }
 
-    public  String getJsAPI(String accessToken) {
-        String formatUrl = jsAccessTokenUrl.replace("ACCESS_TOKEN", accessToken);
-        JSONObject json = HttpConnectionUtil.httpRequest(formatUrl, "GET", null);
+	public static String jsAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
+	public static String getJsAPI(String accessToken){
+		String formatUrl = jsAccessTokenUrl.replace("ACCESS_TOKEN", accessToken);
+        JSONObject json  = HttpConnectionUtil.httpRequest(formatUrl, "GET", null);
 
         if (!json.isNullObject() && !json.isEmpty()) {
-            try {
-                return json.getString("ticket");
-            } catch (Exception e) {
-                // 获取token失败
-                if (json.getInt("errcode") == 40001){
-
-                //    valueOperations.get
-                 //   redisService.remove("wxAccessToken","accessToken");
-                }
-                log.error("获取jsAPI失败,返回结果result={}", json);
-            }
-        }
+			try {
+				return json.getString("ticket");
+			} catch (Exception e) {
+				// 获取token失败
+				log.error("获取jsAPI失败,返回结果result={}", json);
+			}
+		}
 
         return null;
-    }
-
-    /**
-     * 获取access_token
-     *
-     * @param appid     凭证
-     * @param appsecret 密钥
-     * @return
-     */
-    public AccessToken getCommonAccessToken(String appid, String appsecret) {
-        AccessToken accessToken = null;
-
-        if (accessToken == null) {
-            String requestUrl = commonAccessTokenUrl
-                              + "?grant_type=client_credential"
-                              + "&appid=" + appid
-                              + "&secret=" + appsecret;
-
-            JSONObject jsonObject = HttpConnectionUtil.httpRequest(requestUrl, "GET", null);
-
-            // 如果请求成功
-            if (null != jsonObject) {
-                try {
-                    accessToken = new AccessToken();
-                    accessToken.setToken(jsonObject.getString("access_token"));
-                    accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
-                } catch (JSONException e) {
-                    accessToken = null;
-                    // 获取token失败
-                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
-                }
-            }
-        }
-
-        return accessToken;
-    }
-
-    public UserInfo getUserInfo(String openid, String accessToken) {
-        // 拼装url
-        String url = user_info_url.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);
-
-        JSONObject jsonObject = HttpConnectionUtil.httpRequest(url, "GET", null);
-
-        UserInfo userInfo = null;
-        if (null != jsonObject) {
-            try {
-                userInfo = new UserInfo();
-                userInfo.setOpenid(jsonObject.getString("openid").replaceAll("\"", ""));
-
-                userInfo.setNickname(jsonObject.getString("nickname").replaceAll("\"", ""));
-                userInfo.setCity(jsonObject.getString("city").replaceAll("\"", ""));
-                userInfo.setProvince(jsonObject.getString("province").replaceAll("\"", ""));
-                userInfo.setCountry(jsonObject.getString("country").replaceAll("\"", ""));
-                userInfo.setHeadimgurl(jsonObject.getString("headimgurl").replaceAll("\"", ""));
-            } catch (JSONException e) {
-                // 获取token失败
-                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
-            }
-        }
-        return userInfo;
-    }
-
-    public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
-        String[] arr = new String[]{token, timestamp, nonce};
-
-        String content = Arrays.stream(arr)
-                .sorted(Comparator.naturalOrder())
-                .collect(Collectors.joining());
-
-        MessageDigest md = null;
-        String tmpStr = null;
-
-        try {
-            md = MessageDigest.getInstance("SHA-1");
-            // 将三个参数字符串拼接成一个字符串进行sha1加密
-            byte[] digest = md.digest(content.getBytes("UTF-8"));
-
-            StringBuffer hexstr = new StringBuffer();
-
-            String shaHex = "";
-
-            for (int i = 0; i < digest.length; i++) {
-                shaHex = Integer.toHexString(digest[i] & 0xFF);
-                if (shaHex.length() < 2) {
-                    hexstr.append(0);
-                }
-                hexstr.append(shaHex);
-            }
-
-            tmpStr = hexstr.toString();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
-        return signature.equals(tmpStr);
-    }
-
-    public static cn.hutool.json.JSONObject xmlToJson(ServletInputStream inputStream) throws Exception {
-        cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject();
-
-        // 创建sax解析工厂
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        // 创建sax转换工具
-        SAXParser saxParser = factory.newSAXParser();
-
-        saxParser.parse(inputStream, new DefaultHandler() {
-            private String tagName;
-
-            @Override
-            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-                tagName = qName;
-            }
-
-            @Override
-            public void endElement(String uri, String localName, String qName) throws SAXException {
-                tagName = null;
-            }
-
-            @Override
-            public void characters(char[] ch, int start, int length) throws SAXException {
-                if (tagName != null) {
-                    String content = new String(ch, start, length);
-                    jsonObject.put(tagName, content);
-                }
-            }
-        });
-
-        return jsonObject;
-    }
-
-    public static void replyTextMessage(HttpServletResponse response, String fromUserName, String toUserName, String content) {
-        StringBuilder sb = new StringBuilder();
-
-        sb.append("<xml>");
-        sb.append("<ToUserName><![CDATA[" + toUserName + "]]></ToUserName>");
-        sb.append("<FromUserName><![CDATA[" + fromUserName + "]]></FromUserName>");
-        sb.append("<CreateTime>" + DateTime.now().getTime() + "</CreateTime>");
-        sb.append("<MsgType><![CDATA[text]]></MsgType>");
-        sb.append("<Content><![CDATA[" + content + "]]></Content>");
-        sb.append("</xml>");
-
-        try {
-            response.getWriter().print(sb.toString());
-            response.getWriter().close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void replyArticlesMessage(HttpServletResponse response, String fromUserName, String toUserName, String title, String description, String picurl, String url) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("<xml>");
-        sb.append("<ToUserName><![CDATA[" + toUserName + "]]></ToUserName>");
-        sb.append("<FromUserName><![CDATA[" + fromUserName + "]]></FromUserName>");
-        sb.append("<CreateTime>" + DateTime.now().getTime() + "</CreateTime>");
-        sb.append("<MsgType><![CDATA[news]]></MsgType>");
-        sb.append("<ArticleCount>" + 1 + "</ArticleCount>");
-        sb.append("<Articles>");
-        sb.append("<item>");
-        sb.append("<Title><![CDATA[" + title + "]]></Title> ");
-        sb.append("<Description><![CDATA[" + description + "]]></Description>");
-        sb.append("<PicUrl><![CDATA[" + picurl + "]]></PicUrl>");
-        sb.append("<Url><![CDATA[" + url + "]]></Url>");
-        sb.append("</item>");
-        sb.append("</Articles>");
-        sb.append("</xml>");
-
-        try {
-            response.getWriter().print(sb.toString());
-            response.getWriter().close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-
-    /**
-     * 创建微信菜单
-     *
-     * @param appid
-     * @param appSecret
-     * @return
-     */
-    public static String createMenu(String appid, String appSecret) {
-     //   AccessToken token = WeixinUtil.getCommonAccessToken(appid, appSecret);
-
-        AccessToken token = new AccessToken();
-        System.out.println(token.getToken());
-
-        JSONObject data = new JSONObject();
-        JSONArray buttonArray = new JSONArray();
-
-        JSONObject button1 = new JSONObject();
-        button1.put("type", "view");
-        button1.put("name", "疫情监管");
-        button1.put("url", "http://wisdomhousewechat.sudaonline.net/prevention/");
-        buttonArray.add(button1);
-
-        JSONObject button2 = new JSONObject();
-        button2.put("type", "view");
-        button2.put("name", "智慧物业");
-        button2.put("url", "http://wisdomhousewechat.sudaonline.net/#/home/?id=1");
-        buttonArray.add(button2);
-
-        JSONObject button3 = new JSONObject();
-        button3.put("type", "click");
-        button3.put("name", "关于系统");
-        button3.put("key", "文章");
-        buttonArray.add(button3);
-
-
-        data.put("button", buttonArray);
-        data.put("action_name", "QR_LIMIT_STR_SCENE");
-
-        JSONObject actionInfo = new JSONObject();
-        JSONObject scene = new JSONObject();
-
-        scene.put("scene_str", "6");
-
-        actionInfo.put("scene", scene);
-
-        data.put("action_info", actionInfo);
-        System.out.println(data.toString());
-        //创建菜单
-        String result = HttpConnectionUtil.getHttpContentByPost(" https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token.getToken(), "utf-8", data.toString());
-
-
-        return result;
-
-    }
-
-    public static void main(String[] args) {
-        System.out.println("//");
-    }
+	}
+
+	/**
+	 * 获取access_token
+	 *
+	 * @param appid 凭证
+	 * @param appsecret 密钥
+	 * @return
+	 */
+	public static AccessToken getAccessToken(String appid, String appsecret) {
+		AccessToken accessToken = null;
+
+		String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
+		JSONObject jsonObject =HttpConnectionUtil.httpRequest(requestUrl, "GET", null);
+		// 如果请求成功
+		if (null != jsonObject) {
+			try {
+				accessToken = new AccessToken();
+				accessToken.setToken(jsonObject.getString("access_token"));
+				accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
+				//accessToken.setOpenid(jsonObject.getString("openid"));
+			} catch (JSONException e) {
+				accessToken = null;
+				// 获取token失败
+				log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+			}
+		}
+		return accessToken;
+	}
+
+	// 获取用户信息
+	public static String user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
+	public static String subscribe_user_info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN ";
+
+	public static UserInfo getUserInfo(String openid, String accessToken) {
+		// 拼装url
+		String url = user_info_url.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);;
+
+		JSONObject jsonObject = HttpConnectionUtil.httpRequest(url, "GET", null);
+
+		UserInfo userInfo = null;
+		 if (null != jsonObject) {
+				try {
+					userInfo = new UserInfo();
+					userInfo.setOpenid(jsonObject.getString("openid").replaceAll("\"", ""));
+
+					userInfo.setNickname(jsonObject.getString("nickname").replaceAll("\"", ""));
+					userInfo.setCity(jsonObject.getString("city").replaceAll("\"", ""));
+					userInfo.setProvince(jsonObject.getString("province").replaceAll("\"", ""));
+					userInfo.setCountry(jsonObject.getString("country").replaceAll("\"", ""));
+					userInfo.setHeadimgurl(jsonObject.getString("headimgurl").replaceAll("\"", ""));
+				} catch (JSONException e) {
+					// 获取token失败
+					log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
+				}
+			}
+		return userInfo;
+	}
+
+	public static boolean checkSignature(String token,String signature, String timestamp, String nonce) {
+		String[] arr = new String[] { token, timestamp, nonce };
+
+		String content = Arrays.stream(arr)
+				.sorted(Comparator.naturalOrder())
+				.collect(Collectors.joining());
+
+		MessageDigest md = null;
+		String tmpStr = null;
+
+		try {
+			md = MessageDigest.getInstance("SHA-1");
+			// 将三个参数字符串拼接成一个字符串进行sha1加密
+			byte[] digest = md.digest(content.getBytes("UTF-8"));
+
+			StringBuffer hexstr = new StringBuffer();
+
+			String shaHex = "";
+
+			for (int i = 0; i < digest.length; i++) {
+				shaHex = Integer.toHexString(digest[i] & 0xFF);
+				if (shaHex.length() < 2) {
+					hexstr.append(0);
+				}
+				hexstr.append(shaHex);
+			}
+
+			tmpStr = hexstr.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
+		return signature.equals(tmpStr);
+	}
+
+	public static cn.hutool.json.JSONObject xmlToJson(ServletInputStream inputStream) throws Exception {
+		cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject();
+
+		// 创建sax解析工厂
+		SAXParserFactory factory = SAXParserFactory.newInstance();
+		// 创建sax转换工具
+		SAXParser saxParser = factory.newSAXParser();
+
+		saxParser.parse(inputStream,new DefaultHandler(){
+			private String tagName;
+
+			@Override
+			public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+				tagName = qName;
+			}
+
+			@Override
+			public void endElement(String uri, String localName, String qName) throws SAXException {
+				tagName = null;
+			}
+
+			@Override
+			public void characters(char[] ch, int start, int length) throws SAXException {
+				if(tagName!=null){
+					String content = new String(ch,start,length);
+					jsonObject.put(tagName,content);
+				}
+			}
+		});
+
+		return jsonObject;
+	}
+	public static void replyTextMessage(HttpServletResponse response, String fromUserName, String toUserName, String content){
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("<xml>");
+		sb.append("<ToUserName><![CDATA[" + toUserName + "]]></ToUserName>");
+		sb.append("<FromUserName><![CDATA["+ fromUserName + "]]></FromUserName>");
+		sb.append("<CreateTime>" + DateTime.now().getTime() + "</CreateTime>");
+		sb.append("<MsgType><![CDATA[text]]></MsgType>");
+		sb.append("<Content><![CDATA[" + content + "]]></Content>");
+		sb.append("</xml>");
+
+		try {
+			response.getWriter().print(sb.toString());
+			response.getWriter().close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static void replyArticlesMessage(HttpServletResponse response, String fromUserName, String toUserName, String title,String description,String picurl,String url){
+		StringBuilder sb = new StringBuilder();
+		sb.append("<xml>");
+		sb.append("<ToUserName><![CDATA[" + toUserName + "]]></ToUserName>");
+		sb.append("<FromUserName><![CDATA["+ fromUserName + "]]></FromUserName>");
+		sb.append("<CreateTime>" + DateTime.now().getTime() + "</CreateTime>");
+		sb.append("<MsgType><![CDATA[news]]></MsgType>");
+		sb.append("<ArticleCount>" + 1 + "</ArticleCount>");
+		sb.append("<Articles>");
+		sb.append("<item>");
+		sb.append("<Title><![CDATA["+title+"]]></Title> ");
+		sb.append("<Description><![CDATA["+description+"]]></Description>");
+		sb.append("<PicUrl><![CDATA["+picurl+"]]></PicUrl>");
+		sb.append("<Url><![CDATA["+url+"]]></Url>");
+		sb.append("</item>");
+		sb.append("</Articles>");
+		sb.append("</xml>");
+
+		try {
+			response.getWriter().print(sb.toString());
+			response.getWriter().close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * 创建微信菜单
+	 * @param appid
+	 * @param appSecret
+	 * @return
+	 */
+	public static String createMenu(String appid,String appSecret){
+		AccessToken token = WeixinUtil.getAccessToken(appid, appSecret);
+
+		System.out.println(token.getToken());
+
+		JSONObject data = new JSONObject();
+		JSONArray buttonArray = new JSONArray();
+
+		JSONObject button1 = new JSONObject();
+		button1.put("type", "view");
+		button1.put("name", "疫情监管");
+		button1.put("url", "http://wisdomhousewechat.sudaonline.net/prevention/");
+		buttonArray.add(button1);
+
+		JSONObject button2 = new JSONObject();
+		button2.put("type","view");
+		button2.put("name","智慧物业");
+		button2.put("url","http://wisdomhousewechat.sudaonline.net/#/home/?id=1");
+		buttonArray.add(button2);
+
+		JSONObject button3 = new JSONObject();
+		button3.put("type","click");
+		button3.put("name","关于系统");
+		button3.put("key","文章");
+		buttonArray.add(button3);
+
+		data.put("button", buttonArray);
+		data.put("action_name", "QR_LIMIT_STR_SCENE");
+
+		JSONObject actionInfo = new JSONObject();
+		JSONObject scene = new JSONObject();
+
+		scene.put("scene_str", "6");
+
+		actionInfo.put("scene", scene);
+
+		data.put("action_info", actionInfo);
+		System.out.println(data.toString());
+		//创建菜单
+		String result = HttpConnectionUtil.getHttpContentByPost(" https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token.getToken(), "utf-8", data.toString());
+
+		return result;
+	}
 }

+ 111 - 0
common/src/main/resources/mapper/base/MergeOrderInfo.xml

@@ -0,0 +1,111 @@
+<?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">
+<!-- namespace必须指向DAO接口 -->
+<mapper namespace="com.jpsoft.bus.modules.base.dao.MergeOrderInfoDAO">
+	<resultMap id="MergeOrderInfoMap" type="com.jpsoft.bus.modules.base.entity.MergeOrderInfo">
+		<id property="id" column="id_" />
+			<result property="openId" column="open_id" />
+			<result property="payStatus" column="pay_status" />
+			<result property="payName" column="pay_name" />
+			<result property="outOrderNo" column="out_order_no" />
+			<result property="transactionId" column="transaction_id" />
+			<result property="paymentId" column="payment_id" />
+			<result property="createBy" column="create_by" />
+			<result property="createTime" column="create_time" />
+			<result property="updateBy" column="update_by" />
+			<result property="updateTime" column="update_time" />
+			<result property="delFlag" column="del_flag" />
+			</resultMap>
+	<insert id="insert" parameterType="com.jpsoft.bus.modules.base.entity.MergeOrderInfo">
+	<!--
+	<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
+		select sys_guid() from dual
+	</selectKey>
+	-->
+	<![CDATA[
+		insert into base_merge_order_info
+	    (id_,open_id,pay_status,pay_name,out_order_no,transaction_id,payment_id,create_by,create_time,update_by,update_time,del_flag)
+		values
+		(
+#{id,jdbcType=VARCHAR}
+,#{openId,jdbcType=VARCHAR}
+,#{payStatus,jdbcType= NUMERIC }
+,#{payName,jdbcType=VARCHAR}
+,#{outOrderNo,jdbcType=VARCHAR}
+,#{transactionId,jdbcType=VARCHAR}
+,#{paymentId,jdbcType=VARCHAR}
+,#{createBy,jdbcType=VARCHAR}
+,#{createTime,jdbcType= TIMESTAMP }
+,#{updateBy,jdbcType=VARCHAR}
+,#{updateTime,jdbcType= TIMESTAMP }
+,#{delFlag,jdbcType= NUMERIC }
+		)
+	]]>
+	</insert>
+	<delete id="delete" parameterType="string">
+		delete from base_merge_order_info where id_=#{id,jdbcType=VARCHAR}
+	</delete>
+	<update id="update" parameterType="com.jpsoft.bus.modules.base.entity.MergeOrderInfo">
+		update base_merge_order_info
+		<set>
+				<if test="openId!=null">
+		open_id=#{openId,jdbcType=VARCHAR},
+		</if>
+				<if test="payStatus!=null">
+		pay_status=#{payStatus,jdbcType= NUMERIC },
+		</if>
+				<if test="payName!=null">
+		pay_name=#{payName,jdbcType=VARCHAR},
+		</if>
+				<if test="outOrderNo!=null">
+		out_order_no=#{outOrderNo,jdbcType=VARCHAR},
+		</if>
+				<if test="transactionId!=null">
+		transaction_id=#{transactionId,jdbcType=VARCHAR},
+		</if>
+				<if test="paymentId!=null">
+		payment_id=#{paymentId,jdbcType=VARCHAR},
+		</if>
+				<if test="createBy!=null">
+		create_by=#{createBy,jdbcType=VARCHAR},
+		</if>
+				<if test="createTime!=null">
+		create_time=#{createTime,jdbcType= TIMESTAMP },
+		</if>
+				<if test="updateBy!=null">
+		update_by=#{updateBy,jdbcType=VARCHAR},
+		</if>
+				<if test="updateTime!=null">
+		update_time=#{updateTime,jdbcType= TIMESTAMP },
+		</if>
+				<if test="delFlag!=null">
+		del_flag=#{delFlag,jdbcType= NUMERIC },
+		</if>
+		</set>
+	where id_=#{id}
+	</update>
+	<select id="get" parameterType="string" resultMap="MergeOrderInfoMap">
+		select 
+id_,open_id,pay_status,pay_name,out_order_no,transaction_id,payment_id,create_by,create_time,update_by,update_time,del_flag		from base_merge_order_info where id_=#{0}
+	</select>
+	<select id="exist" parameterType="string" resultType="int">
+		select count(*) from base_merge_order_info where id_=#{0}
+	</select>
+	<select id="list" resultMap="MergeOrderInfoMap">
+		select * from base_merge_order_info
+	</select>
+	<select id="search" parameterType="hashmap" resultMap="MergeOrderInfoMap">
+		<![CDATA[
+			select * from base_merge_order_info
+		]]>
+		<where>
+			<if test="searchParams.id != null">
+				and ID_ like #{searchParams.id}
+			</if>
+		</where>
+		<foreach item="sort" collection="sortList"  open="order by" separator=",">
+	        ${sort.name} ${sort.order}
+	 	</foreach>
+	</select>
+</mapper>

+ 15 - 1
common/src/main/resources/mapper/base/OrderInfo.xml

@@ -24,6 +24,7 @@
 			<result property="passengerId" column="passenger_id"/>
 			<result property="ticketType" column="ticket_type"/>
 			<result property="goodsTicket" column="goods_ticket"/>
+			<result property="mergeOrderId" column="merge_order_id"/>
 			</resultMap>
 	<insert id="insert" parameterType="com.jpsoft.bus.modules.base.entity.OrderInfo">
 	<!--
@@ -33,7 +34,7 @@
 	-->
 	<![CDATA[
 		insert into base_order_info
-	    (id_,total_fee,body_,pay_status,pay_name,pay_fee,refund_fee,pay_time,out_order_no,transaction_id,open_id,payment_id,create_by,create_time,update_by,update_time,del_flag,passenger_id,ticket_type,goods_ticket)
+	    (id_,total_fee,body_,pay_status,pay_name,pay_fee,refund_fee,pay_time,out_order_no,transaction_id,open_id,payment_id,create_by,create_time,update_by,update_time,del_flag,passenger_id,ticket_type,goods_ticket,merge_order_id)
 		values
 		(
 #{id,jdbcType=VARCHAR}
@@ -56,6 +57,7 @@
 ,#{passengerId,jdbcType=VARCHAR}
 ,#{ticketType,jdbcType=VARCHAR}
 ,#{goodsTicket,jdbcType=DECIMAL}
+,#{mergeOrderId,jdbcType=VARCHAR}
 		)
 	]]>
 	</insert>
@@ -122,6 +124,9 @@
 			<if test="goodsTicket != null">
 				goods_ticket = #{goodsTicket,jdbcType=DECIMAL}
 			</if>
+			<if test="mergeOrderId != null">
+				merge_order_id = #{mergeOrderId,jdbcType=VARCHAR}
+			</if>
 		</set>
 	where id_=#{id}
 	</update>
@@ -166,4 +171,13 @@
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByPassengerIdAndPayStatus" resultMap="OrderInfoMap">
+		<![CDATA[
+		select * from base_order_info
+		where del_flag = 0
+		and passenger_id = #{passengerId}
+		and pay_status = #{payStatus}
+		]]>
+	</select>
 </mapper>

+ 15 - 2
common/src/main/resources/mapper/bus/PassengerInfo.xml

@@ -21,6 +21,8 @@
 			<result property="updateTime" column="update_time" />
 			<result property="delFlag" column="del_flag" />
 			<result property="userName" column="user_name" />
+			<result property="ticketUpStationId" column="ticket_up_station_id"/>
+			<result property="ticketDownStationId" column="ticket_down_station_id"/>
 			</resultMap>
 	<insert id="insert" parameterType="com.jpsoft.bus.modules.bus.entity.PassengerInfo">
 	<!--
@@ -30,7 +32,7 @@
 	-->
 	<![CDATA[
 		insert into bus_passenger_info
-	    (id_,vehicle_shift_id,vehicle_person_id,user_id,image_url,up_time,down_time,up_station_id,down_station_id,status_,pay_status,create_by,create_time,update_by,update_time,del_flag)
+	    (id_,vehicle_shift_id,vehicle_person_id,user_id,image_url,up_time,down_time,up_station_id,down_station_id,status_,pay_status,create_by,create_time,update_by,update_time,del_flag,ticket_up_station_id,ticket_down_station_id)
 		values
 		(
 #{id,jdbcType=VARCHAR}
@@ -49,6 +51,8 @@
 ,#{updateBy,jdbcType=VARCHAR}
 ,#{updateTime,jdbcType= TIMESTAMP }
 ,#{delFlag,jdbcType= NUMERIC }
+,#{ticketUpStationId,jdbcType=VARCHAR}
+,#{ticketDownStationId,jdbcType=VARCHAR}
 		)
 	]]>
 	</insert>
@@ -103,6 +107,13 @@
 				<if test="delFlag!=null">
 		del_flag=#{delFlag,jdbcType= NUMERIC },
 		</if>
+			<if test="ticketUpStationId!=null">
+				ticket_up_station_id=#{ticketUpStationId,jdbcType=VARCHAR},
+			</if>
+			<if test="ticketDownStationId!=null">
+				ticket_down_station_id=#{ticketDownStationId,jdbcType=VARCHAR},
+			</if>
+
 		</set>
 	where id_=#{id}
 	</update>
@@ -165,7 +176,9 @@
 		where del_flag = 0
 		and vehicle_person_id = #{personId}
 		and vehicle_shift_id = #{shiftId}
-		and status_ = #{status}
 		]]>
+		<if test="status!=null">
+			and status_ = #{status}
+		</if>
 	</select>
 </mapper>

+ 12 - 2
common/src/main/resources/mapper/bus/PriceInfo.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.bus.modules.bus.dao.PriceInfoDAO">
@@ -76,7 +76,7 @@
 	where id_=#{id}
 	</update>
 	<select id="get" parameterType="string" resultMap="PriceInfoMap">
-		select 
+		select
 id_,start_station_id,end_station_id,distance_,price_,create_by,create_time,update_by,update_time,del_flag		from bus_price_info where id_=#{0}
 	</select>
 	<select id="exist" parameterType="string" resultType="int">
@@ -98,4 +98,14 @@ id_,start_station_id,end_station_id,distance_,price_,create_by,create_time,updat
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByStartStationAndEndStation" resultMap="PriceInfoMap">
+		<![CDATA[
+		select * from bus_price_info
+		where del_flag = 0
+		and start_station_id = #{ticketUpStationId}
+		and end_station_id = #{ticketDownStationId}
+		limit 1
+		]]>
+	</select>
 </mapper>

+ 1 - 0
web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java

@@ -59,6 +59,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 				.excludePathPatterns("/mobile/driverApi/findByPhone")
 				.excludePathPatterns("/mobile/passengerApi/getShiftInfo")
 				.excludePathPatterns("/mobile/passengerApi/upload")
+				.excludePathPatterns("/wechat/findUserInfo/**")
 				;
 	}
 }

+ 228 - 0
web/src/main/java/com/jpsoft/bus/modules/base/controller/MergeOrderInfoController.java

@@ -0,0 +1,228 @@
+package com.jpsoft.bus.modules.base.controller;
+
+import com.github.pagehelper.Page;
+import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.common.dto.Sort;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.common.utils.PojoUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 支付订单
+ */
+@RestController
+@RequestMapping("/base/mergeOrderInfo")
+@Api(description = "mergeOrderInfo")
+public class MergeOrderInfoController {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private MergeOrderInfoService mergeOrderInfoService;
+
+    @ApiOperation(value="创建空记录")
+    @GetMapping("create")
+    public MessageResult<MergeOrderInfo> create(){
+        MessageResult<MergeOrderInfo> msgResult = new MessageResult<>();
+
+        MergeOrderInfo mergeOrderInfo = new MergeOrderInfo();
+
+        msgResult.setData(mergeOrderInfo);
+        msgResult.setResult(true);
+
+        return msgResult;
+    }
+    
+    @ApiOperation(value="添加信息")
+    @PostMapping("add")
+    public MessageResult<MergeOrderInfo> add(@RequestBody MergeOrderInfo mergeOrderInfo,@RequestAttribute String subject){
+        MessageResult<MergeOrderInfo> msgResult = new MessageResult<>();
+
+        try {
+            mergeOrderInfo.setId(UUID.randomUUID().toString());
+            mergeOrderInfo.setDelFlag(false);
+            mergeOrderInfo.setCreateBy(subject);
+            mergeOrderInfo.setCreateTime(new Date());
+            
+            int affectCount = mergeOrderInfoService.insert(mergeOrderInfo);
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(mergeOrderInfo);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库添加失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="获取信息")
+    @GetMapping("edit/{id}")
+    public MessageResult<MergeOrderInfo> edit(@PathVariable("id") String id){
+        MessageResult<MergeOrderInfo> msgResult = new MessageResult<>();
+
+        try {
+            MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(id);
+
+            if (mergeOrderInfo != null) {
+                msgResult.setResult(true);
+                msgResult.setData(mergeOrderInfo);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库不存在该记录!");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="更新用户")
+    @PostMapping("update")
+    public MessageResult<MergeOrderInfo> update(@RequestBody MergeOrderInfo mergeOrderInfo,@RequestAttribute String subject){
+        MessageResult<MergeOrderInfo> msgResult = new MessageResult<>();
+
+        try {
+            mergeOrderInfo.setUpdateBy(subject);
+            mergeOrderInfo.setUpdateTime(new Date());
+            
+            int affectCount = mergeOrderInfoService.update(mergeOrderInfo);
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(mergeOrderInfo);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库更新失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+	@ApiOperation(value="删除")
+    @PostMapping("delete/{id}")
+    public MessageResult<Integer> delete(@PathVariable("id") String id,@RequestAttribute String subject){
+        MessageResult<Integer> msgResult = new MessageResult<>();
+
+        try {
+            MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(id);
+            mergeOrderInfo.setDelFlag(true);
+            mergeOrderInfo.setUpdateBy(subject);
+            mergeOrderInfo.setUpdateTime(new Date());
+
+            int affectCount = mergeOrderInfoService.update(mergeOrderInfo);
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(affectCount);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("删除失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+
+    @ApiOperation(value="批量删除")
+    @PostMapping("batchDelete")
+    public MessageResult<Integer> batchDelete(@RequestBody List<String> idList,@RequestAttribute String subject){
+        MessageResult<Integer> msgResult = new MessageResult<>();
+
+        try {
+            int affectCount = 0;
+
+            for (String id : idList) {
+                MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(id);
+                mergeOrderInfo.setDelFlag(true);
+                mergeOrderInfo.setUpdateBy(subject);
+                mergeOrderInfo.setUpdateTime(new Date());
+
+                affectCount += mergeOrderInfoService.update(mergeOrderInfo);
+            }
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(affectCount);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("删除失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="列表")
+    @RequestMapping(value = "pageList",method = RequestMethod.POST)
+    public MessageResult<Map> pageList(
+            String id,
+            @RequestParam(value="pageIndex",defaultValue="1") int pageIndex,
+            @RequestParam(value="pageSize",defaultValue="20") int pageSize,
+            @RequestAttribute String subject){
+
+        //当前用户ID
+        System.out.println(subject);
+
+        MessageResult<Map> msgResult = new MessageResult<>();
+
+        Map<String,Object> searchParams = new HashMap<>();
+
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("id_","asc"));
+
+        if (StringUtils.isNotEmpty(id)) {
+            searchParams.put("id","%" + id + "%");
+        }
+
+        Page<MergeOrderInfo> page = mergeOrderInfoService.pageSearch(searchParams,pageIndex,pageSize,true,sortList);
+
+        msgResult.setResult(true);
+        msgResult.setData(PojoUtils.pageWrapper(page));
+
+        return msgResult;
+    }
+}

+ 232 - 26
web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java

@@ -2,8 +2,13 @@ package com.jpsoft.bus.modules.driver.controller;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.Page;
 import com.jpsoft.bus.config.OSSConfig;
+import com.jpsoft.bus.modules.base.dto.PassengerOrderDTO;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.bus.dto.PassengerDetailDTO;
 import com.jpsoft.bus.modules.bus.dto.StationStatusDTO;
 import com.jpsoft.bus.modules.bus.entity.*;
 import com.jpsoft.bus.modules.bus.service.*;
@@ -23,9 +28,11 @@ import org.bouncycastle.crypto.signers.ECDSASigner;
 import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
@@ -48,9 +55,15 @@ public class DriverApiController {
     @Autowired
     private ShiftInfoService shiftInfoService;
 
+    @Autowired
+    private PriceInfoService priceInfoService;
+
     @Autowired
     private BaiduService baiduService;
 
+    @Autowired
+    private OrderInfoService orderInfoService;
+
     @Autowired
     private GpsService gpsService;
 
@@ -72,6 +85,9 @@ public class DriverApiController {
     @Autowired
     private VehicleInfoService vehicleInfoService;
 
+    @Autowired
+    private ValueOperations<String,Object> valueOperations;
+
     @PostMapping("carActivation")
     @ApiOperation(value = "司机端激活")
     @ApiImplicitParams({
@@ -127,10 +143,11 @@ public class DriverApiController {
             if (driverInfo == null){
                 throw new Exception("司机不存在");
             }
-            List<ShiftInfo> shiftInfo = shiftInfoService.findByDriverIdAndStatus(driverInfo.getId(),"1");
-            if (shiftInfo.size()>0){
-                throw new Exception("此司机有正在运行的班次,请核对后输入");
-            }
+
+//            List<ShiftInfo> shiftInfo = shiftInfoService.findByDriverIdAndStatus(driverInfo.getId(),"1");
+//            if (shiftInfo.size()>0){
+//                throw new Exception("此司机有正在运行的班次,请核对后输入");
+//            }
             messageResult.setResult(true);
             messageResult.setCode(200);
             messageResult.setData(driverInfo);
@@ -185,6 +202,7 @@ public class DriverApiController {
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -263,6 +281,7 @@ public class DriverApiController {
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -293,6 +312,13 @@ public class DriverApiController {
             if (driverInfo == null){
                 throw new Exception("司机不存在");
             }
+
+            List<ShiftInfo> shiftInfo = shiftInfoService.findByDriverIdAndStatus(driverInfo.getId(),"1");
+
+            if (shiftInfo.size()>0){
+                throw new Exception("已有正在运行的班次!");
+            }
+
             //始发站
             StationInfo start = stationInfoService.get(startStationId);
             //终点站
@@ -309,6 +335,7 @@ public class DriverApiController {
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -352,15 +379,26 @@ public class DriverApiController {
             map.put("startStationName",startStation.getName());
             map.put("endStationId",endStation.getId());
             map.put("endStationName",endStation.getName());
-            map.put("currentStationId",currentStation.getId());
-            map.put("currentStationName",currentStation.getName());
+
+            if(currentStation!=null) {
+                map.put("currentStationId", currentStation.getId());
+                map.put("currentStationName", currentStation.getName());
+            }
+
             map.put("nextStationId",stationStatusDTO.getNextStationId());
             map.put("nextStationName",stationStatusDTO.getNextStationName());
 
+            RouteInfo routeInfo = routeInfoService.get(vehicleInfo.getRouteId());
+
+            if(routeInfo!=null){
+                map.put("routeName", routeInfo.getName());
+            }
+
             messageResult.setData(map);
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -368,19 +406,15 @@ public class DriverApiController {
         return messageResult;
     }
 
-    @PostMapping("passengerFaceRegister")
-    @ApiOperation(value = "乘客刷脸登记")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "personId", value = "乘客在设备上的id", required = true, paramType = "form"),
-            @ApiImplicitParam(name = "recordTime", value = "登记时间", required = true, paramType = "form"),
-            @ApiImplicitParam(name = "photoBase64Data", value = "照片base64编码", required = true, paramType = "form"),
-            @ApiImplicitParam(name = "token", value = "令牌", paramType = "form"),
-            @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form")
-    })
-    public MessageResult<Map> passengerFaceRegister(String personId, String photoBase64Data, String recordTime,String token, @RequestAttribute String subject) {
+    @PostMapping("existPassenger")
+    @ApiOperation(value="查询乘客是否存在")
+    public MessageResult<Map> existPassenger(@RequestBody JSONObject requestBody, @RequestAttribute String subject){
         MessageResult<Map> messageResult = new MessageResult<>();
 
         try {
+            Map<String,Object> data = new HashMap<>();
+
+            Long personId = requestBody.getLong("personId");
 
             VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
             if (vehicleInfo == null){
@@ -392,15 +426,70 @@ public class DriverApiController {
                 throw new Exception("车辆没有相关班次信息");
             }
 
-            ShiftInfo shiftInfo = shiftInfoList.get(0);
-            String retFileUrl = OSSUtil.uploadBase64(photoBase64Data,personId+".jpg",ossConfig);
+            List<PassengerInfo> passengerInfos = passengerInfoService.findByPersonIdShiftIdStatus(personId,shiftInfoList.get(0).getId(),null);
 
+            if (passengerInfos.size()>0){
+                messageResult.setData(data);
+                messageResult.setResult(true);
+            }
+            else{
+                messageResult.setResult(false);
+            }
+        }
+        catch (Exception ex){
+            log.error(ex.getMessage(),ex);
 
-            passengerInfoService.passengerFace(vehicleInfo,shiftInfo,retFileUrl,recordTime,shiftInfo.getCurrentStationId(),personId);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
 
-            messageResult.setResult(true);
-            messageResult.setCode(200);
+        return messageResult;
+    }
+
+    @PostMapping("passengerFaceRegister")
+    @ApiOperation(value = "乘客刷脸登记")
+    public MessageResult<Map> passengerFaceRegister(@RequestBody JSONObject requestBody, @RequestAttribute String subject) {
+        MessageResult<Map> messageResult = new MessageResult<>();
+
+        try {
+            String personId = requestBody.getString("personId");
+            String photoBase64Data = requestBody.getString("photoBase64Data");
+            String recordTime = requestBody.getString("recordTime");
+
+            //同一辆车相同乘客上下车登记间隔1分钟
+            String key = subject + "_" + personId;
+            boolean absent = valueOperations.setIfAbsent(key,true,1,TimeUnit.MINUTES);
+
+            if(absent) {
+                VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
+                if (vehicleInfo == null){
+                    throw new Exception("当前车辆不存在");
+                }
+
+                List<ShiftInfo> shiftInfoList = shiftInfoService.findByVehicleIdAndStatus(vehicleInfo.getId(),"1");
+                if (shiftInfoList.size() == 0){
+                    throw new Exception("车辆没有相关班次信息");
+                }
+
+                ShiftInfo shiftInfo = shiftInfoList.get(0);
+                String retFileUrl = "";
+
+                //只有第一次上车时返回登记照
+                if(StringUtils.isNotEmpty(photoBase64Data)){
+                    retFileUrl = OSSUtil.uploadBase64(photoBase64Data,personId+".jpg",ossConfig);
+                }
+
+                passengerInfoService.passengerFace(vehicleInfo, shiftInfo, retFileUrl, recordTime, shiftInfo.getCurrentStationId(), personId);
+                messageResult.setResult(true);
+                messageResult.setCode(200);
+            }
+            else{
+                messageResult.setResult(false);
+                messageResult.setMessage("乘客刷脸过于频繁,不重复登记!");
+            }
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -415,7 +504,7 @@ public class DriverApiController {
             @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form"),
             @ApiImplicitParam(name = "type", value = "1:未购票,2:待下车,3:待补票,4:全部", required = true, paramType = "form")
     })
-    public MessageResult<Map> busShiftNoTicket(String token, @RequestAttribute String subject,@RequestParam(value = "pageIndex", defaultValue = "1") int pageIndex,@RequestParam(value = "pageSize", defaultValue = "20") int pageSize,String type) {
+    public MessageResult<Map> busShiftTicketList(String token, @RequestAttribute String subject,@RequestParam(value = "pageIndex", defaultValue = "1") int pageIndex,@RequestParam(value = "pageSize", defaultValue = "20") int pageSize,String type) {
         MessageResult<Map> messageResult = new MessageResult<>();
 
         try {
@@ -448,16 +537,15 @@ public class DriverApiController {
                 searchParams.put("payStatus","2");
             }
 
-
             List<Sort> sortList = new ArrayList<>();
             sortList.add(new Sort("create_time","desc"));
             Page<PassengerInfo> page = passengerInfoService.pageSearch(searchParams,pageIndex,pageSize,true,sortList);
 
-
             messageResult.setData(PojoUtils.pageWrapper(page));
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -473,21 +561,63 @@ public class DriverApiController {
             @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form"),
             @ApiImplicitParam(name = "id", value = "乘客主id", required = true, paramType = "form")
     })
-    public MessageResult<Map> passengerInfo(String id,String token, @RequestAttribute String subject) {
-        MessageResult<Map> messageResult = new MessageResult<>();
+    public MessageResult<PassengerDetailDTO> passengerInfo(String id,String token, @RequestAttribute String subject) {
+        MessageResult<PassengerDetailDTO> messageResult = new MessageResult<>();
 
         try {
 
+            PassengerDetailDTO passengerDetailDTO = null;
             VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
             if (vehicleInfo == null){
                 throw new Exception("当前车辆不存在");
             }
+            PassengerInfo passengerInfo = passengerInfoService.get(id);
+            if (passengerInfo == null){
+                throw new Exception("无乘客记录");
+            }
+            List<OrderInfo> orderInfoList = orderInfoService.findByPassengerIdAndPayStatus(id,20);
+
+            if (orderInfoList.size()>0){
+                PassengerDetailDTO passengerDetailDTO1 = new PassengerDetailDTO();
+                passengerDetailDTO1.setId(id);
+                passengerDetailDTO1.setImageUrl(passengerInfo.getImageUrl());
+                passengerDetailDTO1.setTicketUpStationId(passengerInfo.getTicketUpStationId());
+                StationInfo upStationInfo = stationInfoService.get(passengerInfo.getTicketUpStationId());
+                passengerDetailDTO1.setTicketUpStationName(upStationInfo.getName());
+                passengerDetailDTO1.setTicketDownStationId(passengerInfo.getTicketDownStationId());
+
+                StationInfo downStationInfo = stationInfoService.get(passengerInfo.getTicketDownStationId());
+
+                passengerDetailDTO1.setTicketDownStationName(downStationInfo.getName());
+                passengerDetailDTO1.setPayStatus(passengerInfo.getPayStatus());
+                passengerDetailDTO1.setPayStatusName(passengerInfo.getPayStatusName(passengerInfo.getPayStatus()));
+                BigDecimal payFee = BigDecimal.ZERO;
+
+                List<PassengerOrderDTO> passengerOrderDTOList = new ArrayList<>();
+                for (OrderInfo orderInfo : orderInfoList){
+                    PassengerOrderDTO passengerOrderDTO = new PassengerOrderDTO();
+                    passengerOrderDTO.setTicketType(orderInfo.getTicketType());
+                    passengerOrderDTO.setGoodsTicket(orderInfo.getGoodsTicket());
+                    passengerOrderDTO.setPayName(orderInfo.getPayName());
+                    passengerOrderDTO.setPayNameStr(orderInfo.getPayNameStr(orderInfo.getPayName()));
+                    passengerOrderDTO.setTicketTypeStr(passengerOrderDTO.getTicketTypeStr(orderInfo.getTicketType()));
+                    passengerOrderDTO.setTotalFee(orderInfo.getTotalFee());
+                    passengerOrderDTOList.add(passengerOrderDTO);
+                    payFee = payFee.add(orderInfo.getPayFee());
+                }
+                passengerDetailDTO1.setPassengerOrderDTOList(passengerOrderDTOList);
+                passengerDetailDTO1.setPayFee(payFee);
+                passengerDetailDTO = passengerDetailDTO1;
+            }
 
 
 
+
+            messageResult.setData(passengerDetailDTO);
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }
@@ -495,4 +625,80 @@ public class DriverApiController {
         return messageResult;
     }
 
+
+    @PostMapping("driverCreateOrder")
+    @ApiOperation(value = "司机为乘客创建订单")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "令牌", paramType = "form"),
+            @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form"),
+            @ApiImplicitParam(name = "id", value = "乘客主id", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "ticketUpStationId", value = "乘客买票站点id", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "ticketDownStationId", value = "乘客买票下车站点id", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "ticketType", value = "购票类型(1:儿童票,2:成人票)", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "goodsTicket", value = "货票金额", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "payName", value = "cash:现金,ticket:车票,wechat:微信,alipay:支付宝", required = true, paramType = "form"),
+    })
+    public MessageResult<Map> driverCreateOrder(String id,String token, @RequestAttribute String subject) {
+        MessageResult<Map> messageResult = new MessageResult<>();
+
+        try {
+
+
+
+
+
+
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+    @PostMapping("ticketAmount")
+    @ApiOperation(value = "站点之间的车票金额")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "令牌", paramType = "form"),
+            @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form"),
+            @ApiImplicitParam(name = "ticketUpStationId", value = "乘客买票站点id", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "ticketDownStationId", value = "乘客买票下车站点id", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "ticketType", value = "购票类型(1:儿童票,2:成人票)", required = true, paramType = "form")
+    })
+    public MessageResult<Map> ticketAmount(String ticketUpStationId,String ticketDownStationId,String ticketType,String token, @RequestAttribute String subject) {
+        MessageResult<Map> messageResult = new MessageResult<>();
+
+        try {
+
+
+            PriceInfo priceInfo = priceInfoService.findByStartStationAndEndStation(ticketUpStationId,ticketDownStationId);
+            if (priceInfo == null){
+                throw new Exception("站点间没有价格标准");
+            }
+
+            BigDecimal price = priceInfo.getPrice();
+            if ("1".equals(ticketType)){
+                price = price.divide(new BigDecimal(2));
+            }
+            Map<String,Object> map = new HashMap<>();
+            map.put("price",price);
+            map.put("distance",priceInfo.getDistance());
+
+            messageResult.setData(map);
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+
+
 }

+ 264 - 0
web/src/main/java/com/jpsoft/bus/wechat/controller/WxController.java

@@ -0,0 +1,264 @@
+package com.jpsoft.bus.wechat.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.jpsoft.bus.config.WxConfig;
+import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.common.utils.Sign;
+import com.jpsoft.bus.modules.common.utils.WeixinUtil;
+import com.jpsoft.bus.modules.wechat.entity.AccessToken;
+import com.jpsoft.bus.modules.wechat.vo.UserInfo;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-12-3 15:08
+ */
+
+@Slf4j
+@RequestMapping("/wechat")
+@RestController
+public class WxController {
+
+
+    @Autowired
+    private WxConfig wxConfig;
+
+
+    @Autowired
+    private ValueOperations<String, Object> valueOperations;
+
+
+
+    @ApiOperation(value = "获取微信配置")
+    @GetMapping(value = "/getConfig")
+    public MessageResult getConfig(String url) {
+
+        int code = 200;
+        String message = "获取成功";
+        Object data = "";
+        boolean result = true;
+
+        try {
+            AccessToken token = WeixinUtil.getAccessToken(wxConfig.getAppId(), wxConfig.getAppSecret());
+
+            Map<String, String> wxMap = Sign.sign(WeixinUtil.getJsAPI(token.getToken()), url);
+
+            wxMap.put("appId", wxConfig.getAppId());
+
+            log.warn(JSONObject.toJSONString(wxMap));
+
+            HashMap<String, Object> dataMap = new HashMap<String, Object>();
+
+            dataMap.put("wxConfig", wxMap);
+
+            data = dataMap;
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+
+            code = 500;
+            result = false;
+            message = "系统错误";
+        }
+
+        return new MessageResult(result, message, data, code);
+    }
+
+    @ApiOperation(value = "获取微信code")
+    @PostMapping(value = "findWechatUrl")
+    public MessageResult findWechatUrl(@RequestBody String url) {
+
+        String newpath = WeixinUtil.getCodeRequest(wxConfig.getAppId(), url, "snsapi_userinfo");
+
+        HashMap<String, Object> dataMap = new HashMap<String, Object>();
+
+        dataMap.put("wechatUrl", newpath);
+
+        return new MessageResult(true, "获取成功", dataMap, 200);
+    }
+
+    @ApiOperation(value = "获取公众号用户信息")
+    @GetMapping(value = "findUserInfo/{code}")
+    public MessageResult findUserInfo(@PathVariable String code) {
+        try {
+            log.warn("code=" + code);
+            log.warn("appId=" + wxConfig.getAppId());
+            log.warn("appSecret=" + wxConfig.getAppSecret());
+
+            AccessToken at = WeixinUtil.getAccessToken(wxConfig.getAppId(), wxConfig.getAppSecret(), code);
+
+            if (at != null && StringUtils.isNotBlank(at.getOpenid())) {
+                String openId = at.getOpenid();
+                System.out.println("openId:" + openId);
+
+                UserInfo userInfo = WeixinUtil.getUserInfo(openId, at.getToken());
+
+                HashMap<String, Object> dataMap = new HashMap<String, Object>();
+
+                dataMap.put("userInfo", userInfo);
+
+                return new MessageResult(true, "获取微信信息成功", userInfo, 200);
+
+            } else {
+                return new MessageResult(false, "获取微信信息失败", "", 400);
+            }
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return new MessageResult(false, "系统错误", "", 500);
+        }
+    }
+
+
+
+
+
+    @ApiOperation(value = "验证服务器地址的有效性")
+    @GetMapping("/get")
+    @ResponseBody
+    public String index(@RequestParam(defaultValue = "") String signature,
+                        @RequestParam(defaultValue = "") String timestamp,
+                        @RequestParam(defaultValue = "") String nonce,
+                        @RequestParam(defaultValue = "") String echostr) {
+        log.warn("signature=" + signature);
+        log.warn("timestamp=" + timestamp);
+        log.warn("nonce=" + nonce);
+        log.warn("echostr=" + echostr);
+
+        if (WeixinUtil.checkSignature(wxConfig.getToken(), signature, timestamp, nonce)) {
+            return echostr;
+        } else {
+            return "index";
+        }
+    }
+
+
+    @ResponseBody
+    @ApiOperation(value = "创建二维码")
+    @PostMapping("/qrcode/create")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "expire_seconds", paramType = "query", required = true, value = "该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。"),
+            @ApiImplicitParam(name = "action_name", paramType = "query", required = true, value = "二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值"),
+            @ApiImplicitParam(name = "scene_id", paramType = "query", value = "场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)"),
+            @ApiImplicitParam(name = "scene_str", paramType = "query", value = "场景值ID(字符串形式的ID),字符串类型,长度限制为1到64")
+    })
+    public cn.hutool.json.JSONObject createQrcode(@RequestParam(name = "expire_seconds", defaultValue = "300") long expireSeconds,
+                                                  @RequestParam(name = "action_name", defaultValue = "QR_STR_SCENE") String actionName,
+                                                  @RequestParam(name = "scene_id", required = false) String sceneId,
+                                                  @RequestParam(name = "scene_str", required = false) String sceneStr) {
+        cn.hutool.json.JSONObject resultObj = new cn.hutool.json.JSONObject();
+
+        try {
+            StringBuilder urlBuilder = new StringBuilder();
+            AccessToken accessToken = WeixinUtil.getAccessToken(wxConfig.getAppId(), wxConfig.getAppSecret());
+
+            urlBuilder.append(wxConfig.getCreateQrCodeUrl())
+                    .append("?access_token=")
+                    .append(URLEncoder.encode(accessToken.getToken(), "UTF-8"));
+
+            cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject();
+            jsonObject.put("expire_seconds", expireSeconds);
+            jsonObject.put("action_name", actionName);
+
+            cn.hutool.json.JSONObject actionInfo = new cn.hutool.json.JSONObject();
+            cn.hutool.json.JSONObject scene = new cn.hutool.json.JSONObject();
+
+            StringBuilder keyBuilder = new StringBuilder();
+
+            keyBuilder.append(accessToken);
+
+            if (StringUtils.isNotEmpty(sceneId)) {
+                scene.put("scene_id", sceneId);
+                keyBuilder.append(sceneId);
+            }
+
+            if (StringUtils.isNotEmpty(sceneStr)) {
+                scene.put("scene_str", sceneStr);
+                keyBuilder.append(sceneStr);
+            }
+
+            String qrcodeUrl = (String) valueOperations.get("QRCODE_" + keyBuilder.toString());
+
+            if (StringUtils.isNotEmpty(qrcodeUrl)) {
+                resultObj.put("data", qrcodeUrl);
+                resultObj.put("result", true);
+            } else {
+                actionInfo.put("scene", scene);
+
+                jsonObject.put("action_info", actionInfo);
+
+                StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
+
+                entity.setContentType("application/json");//发送json数据需要设置contentType
+
+                HttpPost httpPost = new HttpPost(urlBuilder.toString());
+                CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+
+                httpPost.setEntity(entity);
+
+                HttpResponse res = httpClient.execute(httpPost);
+
+                if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                    String content = EntityUtils.toString(res.getEntity());// 返回json格式:
+                    cn.hutool.json.JSONObject ret = new cn.hutool.json.JSONObject(content);
+
+                    if (ret.containsKey("errcode")) {
+                        resultObj.put("result", false);
+                        resultObj.put("message", ret.getStr("errmsg"));
+                        resultObj.put("code", ret.getInt("errcode"));
+                    } else {
+                        String ticket = ret.getStr("ticket");
+                        long expire_seconds = ret.getLong("expire_seconds");
+
+                        qrcodeUrl = wxConfig.getShowQrCodeUrl() + "?ticket=" + URLEncoder.encode(ticket, "UTF-8");
+
+                        valueOperations.set("QRCODE_" + keyBuilder, qrcodeUrl, expire_seconds - 5, TimeUnit.SECONDS);
+
+                        resultObj.put("data", qrcodeUrl);
+                        resultObj.put("result", true);
+                    }
+                } else {
+                    resultObj.put("result", false);
+                    resultObj.put("message", "weixin服务器未正常返回!");
+                }
+            }
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+
+            resultObj.put("message", ex.getMessage());
+            resultObj.put("result", false);
+        }
+
+        return resultObj;
+    }
+
+
+
+}