Explorar el Código

添加停车收费,修改连续正常时间逻辑

fllmoyu hace 5 años
padre
commit
c43b8a03a9

+ 4 - 0
common/src/main/java/com/jpsoft/smart/modules/base/dao/TotalCheckCompanyDAO.java

@@ -5,6 +5,7 @@ import com.jpsoft.smart.modules.base.entity.CompanyInfo;
 import com.jpsoft.smart.modules.base.entity.TotalCheckCompany;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,4 +37,7 @@ public interface TotalCheckCompanyDAO {
     List<TotalCheckCompany> findAll();
 
 
+    Date findMaxAbnormalTimeByCompanyList(List<CompanyInfo> list);
+
+    Integer findMaxNormalDayByCompanyList(List<CompanyInfo> list);
 }

+ 6 - 0
common/src/main/java/com/jpsoft/smart/modules/base/entity/TotalCheckCompany.java

@@ -65,5 +65,11 @@ public class TotalCheckCompany {
      */
     @ApiModelProperty(value = "更新时间")
     private Date updateTime;
+
+    /**
+     * 发生异常的日期
+     */
+    @ApiModelProperty(value = "发生异常的日期")
+    private Date abnormalTime;
 }
 

+ 5 - 0
common/src/main/java/com/jpsoft/smart/modules/base/service/TotalCheckCompanyService.java

@@ -3,6 +3,7 @@ package com.jpsoft.smart.modules.base.service;
 import com.jpsoft.smart.modules.base.entity.CompanyInfo;
 import com.jpsoft.smart.modules.base.entity.TotalCheckCompany;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -28,4 +29,8 @@ public interface TotalCheckCompanyService {
     Integer getTotalCheckNum(List<CompanyInfo> list);
 
     List<TotalCheckCompany> findAll();
+
+    Date findMaxAbnormalTimeByCompanyList(List<CompanyInfo> list);
+
+    Integer findMaxNormalDayByCompanyList(List<CompanyInfo> list);
 }

+ 11 - 0
common/src/main/java/com/jpsoft/smart/modules/base/service/impl/TotalCheckCompanyServiceImpl.java

@@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -71,4 +72,14 @@ public class TotalCheckCompanyServiceImpl implements TotalCheckCompanyService {
     public List<TotalCheckCompany> findAll() {
         return totalCheckCompanyDAO.findAll();
     }
+
+    @Override
+    public Date findMaxAbnormalTimeByCompanyList(List<CompanyInfo> list) {
+        return totalCheckCompanyDAO.findMaxAbnormalTimeByCompanyList(list);
+    }
+
+    @Override
+    public Integer findMaxNormalDayByCompanyList(List<CompanyInfo> list) {
+        return totalCheckCompanyDAO.findMaxNormalDayByCompanyList(list);
+    }
 }

+ 13 - 12
common/src/main/java/com/jpsoft/smart/modules/common/utils/StringUtils.java

@@ -24,45 +24,46 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
 		}
 		return encode;
 	}
-	
+
 	/**
 	 * 获取UUID,去掉`-`的
 	 * @return {String}
-	 * 
+	 *
 	 */
 	public static String generateStr () {
 		return UUID.randomUUID().toString().replace("-", "");
 	}
 
-	
+
 	/**
 	 * 要求外部订单号必须唯一。
 	 * @return {String}
 	 */
-	public  static String getOutTradeNo() {
+	public synchronized static String getOutTradeNo() {
 		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
 		Date date = new Date();
 		String key = format.format(date);
-		key = key + System.currentTimeMillis();
-		key = key.substring(0, 15);
+		Integer ran = (int)((Math.random()*9+1)*100000);
+		key = key +ran.toString();
+	//	key = key.substring(0, 24);
 		return key;
 	}
 
 	/**
 	 * 字符串格式化
-	 * 
+	 *
 	 * use: format("my name is {0}, and i like {1}!", "L.cm", "java")
-	 * 
+	 *
 	 * int long use {0,number,#}
-	 * 
-	 * @param s 
+	 *
+	 * @param s
 	 * @param args
 	 * @return {String}转换后的字符串
 	 */
 	public static String format(String s, Object... args) {
 		return MessageFormat.format(s, args);
 	}
-	
+
 	/**
 	 * 替换某个字符
 	 * @param str
@@ -138,7 +139,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
 		}
 		return new String(buffer);
 	}
-	
+
 	public static void main(String[] args) {
 		System.out.println(random(32, RandomType.ALL));
 	}

+ 9 - 0
common/src/main/java/com/jpsoft/smart/modules/common/utils/TimeZonesUtil.java

@@ -61,4 +61,13 @@ public class TimeZonesUtil {
 
         return resultTimeZone;
     }
+
+    public static String parseSecond(Long second){
+        int h= Math.toIntExact(second / 3600);
+        int m= Math.toIntExact((second % 3600) / 60);
+        int s= Math.toIntExact((second % 3600) % 60);
+
+
+        return h+"时"+m+"分"+s+"秒";
+    }
 }

+ 27 - 2
common/src/main/resources/mapper/base/TotalCheckCompany.xml

@@ -11,7 +11,8 @@
     create_by,
     create_time,
     update_by,
-    update_time
+    update_time,
+    abnormal_time
 </sql>
     <resultMap id="TotalCheckCompanyMap" type="com.jpsoft.smart.modules.base.entity.TotalCheckCompany">
         <id property="id" column="id_"/>
@@ -24,6 +25,7 @@
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
         <result property="updateTime" column="update_time"/>
+        <result property="abnormalTime" column="abnormal_time"/>
     </resultMap>
     <select id="get" parameterType="long" resultMap="TotalCheckCompanyMap">
             select * from base_total_check_company where id_=#{0} and del_flag = false
@@ -32,7 +34,7 @@
     <insert id="insert" parameterType="com.jpsoft.smart.modules.base.entity.TotalCheckCompany">
         insert into base_total_check_company
         (company_id,normal_day,total_check_num,total_abnormal_num,del_flag,
-        create_by,create_time,update_by,update_time)
+        create_by,create_time,update_by,update_time,abnormal_time)
         values
         (
         #{companyId,jdbcType=VARCHAR}
@@ -44,6 +46,7 @@
         ,#{createTime,jdbcType= TIMESTAMP }
         ,#{updateBy,jdbcType=VARCHAR}
         ,#{updateTime,jdbcType= TIMESTAMP }
+        ,#{abnormalTime,jdbcType= TIMESTAMP }
         )
     </insert>
     <update id="update" parameterType = "com.jpsoft.smart.modules.base.entity.TotalCheckCompany">
@@ -77,6 +80,9 @@
             <if test="updateTime!=null">
                 update_time=#{updateTime,jdbcType= TIMESTAMP },
             </if>
+            <if test="abnormalTime !=null">
+                abnormal_time=#{abnormalTime,jdbcType= TIMESTAMP },
+            </if>
         </set>
         where id_=#{id}
     </update>
@@ -126,4 +132,23 @@
         <include refid="Base_Column_List"/>
         from base_total_check_company where del_flag = 0
     </select>
+
+    <select id="findMaxAbnormalTimeByCompanyList" resultType="Date">
+        <![CDATA[
+        select max(abnormal_time) from base_total_check_company
+        where del_flag = 0
+        ]]>
+        <foreach collection="list" index="index" item="item" open="and company_id in(" separator="," close=")">   #{item.id}
+        </foreach>
+
+    </select>
+
+    <select id="findMaxNormalDayByCompanyList" resultType="Integer">
+        <![CDATA[
+        select max(normal_day) from base_total_check_company
+        where del_flag = 0
+        ]]>
+        <foreach collection="list" index="index" item="item" open="and company_id in(" separator="," close=")">   #{item.id}
+        </foreach>
+    </select>
 </mapper>

+ 4 - 0
web/src/main/java/com/jpsoft/smart/config/WebMvcConfig.java

@@ -54,8 +54,12 @@ public class WebMvcConfig implements WebMvcConfigurer {
                         "/mobileApi/**")
 				.excludePathPatterns("/wxPay/webPay")
 				.excludePathPatterns("/aliPay/tradePrecreatePay")
+				.excludePathPatterns("/wxPay/parkingWxPay")
+				.excludePathPatterns("/aliPay/parkingTradeWebPay")
 				.excludePathPatterns("/aliPay/payNotify")
 				.excludePathPatterns("/wxPay/payNotify")
+				.excludePathPatterns("/aliPay/**")
+				.excludePathPatterns("/wxPay/parkingWxPayNotify")
 				.excludePathPatterns("/base/alarmInfo/alarmNotify")
 				.excludePathPatterns("/base/informationInfo/addMobile")
 				.excludePathPatterns("/base/employeeInfo/mobile/**")

+ 38 - 6
web/src/main/java/com/jpsoft/smart/modules/base/controller/HomePageController.java

@@ -3,6 +3,7 @@ package com.jpsoft.smart.modules.base.controller;
 import cn.hutool.core.date.DateUtil;
 import com.jpsoft.smart.modules.base.entity.CompanyInfo;
 import com.jpsoft.smart.modules.base.entity.EmployeeInfo;
+import com.jpsoft.smart.modules.base.entity.TotalCheckCompany;
 import com.jpsoft.smart.modules.base.service.*;
 import com.jpsoft.smart.modules.common.dto.MessageResult;
 import com.jpsoft.smart.modules.sys.entity.User;
@@ -70,10 +71,26 @@ public class HomePageController {
             Integer dayAbnormalNum = 0;
             Integer totalAbnormalNum = 0;
             if (userService.hasRole(subject, "SYSADMIN")) {
-                companyNum = companyInfoService.list().size();
+                list = companyInfoService.list();
+                companyNum = list.size();
                 personNum = personInfoService.notGuestList().size();
-                Integer normalDaysNum =  totalCheckCompanyService.findMinNormalDay();
-                normalDays = normalDaysNum==null?0:normalDaysNum;
+
+
+                /*Integer normalDaysNum =  totalCheckCompanyService.findMinNormalDay();
+                normalDays = normalDaysNum==null?0:normalDaysNum;*/
+                Date abnormalTime = totalCheckCompanyService.findMaxAbnormalTimeByCompanyList(list);
+                if (abnormalTime == null){
+                    normalDays = totalCheckCompanyService.findMaxNormalDayByCompanyList(list);
+                }
+                else {
+                    Long today = DateUtil.beginOfDay(new Date()).getTime();
+                    Long abnormalDay = abnormalTime.getTime();
+                    normalDays = Math.toIntExact((today - abnormalDay) / (1000 * 60 * 60 * 24)) -1;
+
+                }
+
+
+
                 Integer num = checkNumCompanyService.getDayCheckNum(DateUtil.format(new Date(), "yyyy-MM-dd"));
                 Integer totalNum = totalCheckCompanyService.getTotalCheckNum(null);
                 dayCheckNum = num == null ? 0 : num;
@@ -86,8 +103,23 @@ public class HomePageController {
                 companyNum = list.size();
                 personNum = Math.toIntExact(personInfoService.countByCompanyList(list));
 
-                Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
-                normalDays = normalDaysNum==null?0:normalDaysNum;
+               /* Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
+                normalDays = normalDaysNum==null?0:normalDaysNum;*/
+
+           //     Integer normalDays = 0;
+                Date totalCheckCompany = totalCheckCompanyService.findMaxAbnormalTimeByCompanyList(list);
+                if (totalCheckCompany == null){
+                    normalDays = totalCheckCompanyService.findMaxNormalDayByCompanyList(list);
+                }
+                else {
+                    Long today = DateUtil.beginOfDay(new Date()).getTime();
+                    Long abnormalDay = totalCheckCompany.getTime();
+                    normalDays = Math.toIntExact((today - abnormalDay) / (1000 * 60 * 60 * 24)) -1;
+
+                }
+
+
+
                 Integer num = checkNumCompanyService.getDayCheckNumByCompanyList(DateUtil.format(new Date(), "yyyy-MM-dd"), list);
                 Integer totalNum = totalCheckCompanyService.getTotalCheckNum(list);
                 dayCheckNum = num == null ? 0 : num;
@@ -103,7 +135,7 @@ public class HomePageController {
 
             map.put("companyNum", companyNum);
             map.put("personNum", personNum);
-            map.put("normalDays", normalDays);
+            map.put("normalDays", normalDays<0?0:normalDays);
             map.put("dayCheckNum", dayCheckNum);
             map.put("totalCheckNum", totalCheckNum);
             map.put("dayAbnormalNum", dayAbnormalNum);

+ 33 - 20
web/src/main/java/com/jpsoft/smart/modules/mobile/controller/HealthShowApiController.java

@@ -85,7 +85,7 @@ public class HealthShowApiController {
                 }
 
                 //个人所在公司
-                CompanyInfo company = companyInfoService.get(personInfo.getCompanyId());
+                companyInfo = companyInfoService.get(personInfo.getCompanyId());
 
                 //人员包含监管者权限,找出此人所关联的所有公司
                 if (personInfo.getPopedom().contains("3")) {
@@ -100,8 +100,8 @@ public class HealthShowApiController {
                     }
 
                     //如果人员关联的公司不包含自己所在的公司则加入
-                    if (!list.contains(company)) {
-                        list.add(company);
+                    if (!list.contains(companyInfo)) {
+                        list.add(companyInfo);
                     }
 
                 }
@@ -151,8 +151,17 @@ public class HealthShowApiController {
                 Integer dayAbnormalNum = num1+num2;
                 Integer totalAbnormalNum =  totalNum2 + dayAbnormalNum;
 
-                Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
-                Integer normalDays = normalDaysNum == null ? 0 : normalDaysNum;
+           //     Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
+                Integer normalDays = 0;
+                Date totalCheckCompany = totalCheckCompanyService.findMaxAbnormalTimeByCompanyList(list);
+                if (totalCheckCompany == null){
+                    normalDays = totalCheckCompanyService.findMaxNormalDayByCompanyList(list);
+                }
+                else {
+                    Long today = DateUtil.beginOfDay(new Date()).getTime();
+                    Long abnormalDay = totalCheckCompany.getTime();
+                    normalDays = Math.toIntExact((today - abnormalDay) / (1000 * 60 * 60 * 24))-1;
+                }
 
 
                 mapData.put("checkedPersonNum", checkedPersonNum);
@@ -161,7 +170,7 @@ public class HealthShowApiController {
                 mapData.put("totalCheckNum", totalCheckNum);
                 mapData.put("dayAbnormalNum", dayAbnormalNum);
                 mapData.put("totalAbnormalNum", totalAbnormalNum);
-                mapData.put("normalDays", normalDays);
+                mapData.put("normalDays", normalDays<0?0:normalDays);
 
             }
             msgResult.setMessage("查询成功");
@@ -295,7 +304,7 @@ public class HealthShowApiController {
                 }
 
                 //个人所在公司
-                CompanyInfo company = companyInfoService.get(personInfo.getCompanyId());
+                 companyInfo = companyInfoService.get(personInfo.getCompanyId());
                 if (personInfo.getPopedom().contains("3")) {
                     List<PersonCompany> personCompanyList = personCompanyService.findByPersonId(personInfo.getId());
                     if (personCompanyList.size() > 0) {
@@ -308,8 +317,8 @@ public class HealthShowApiController {
                     }
 
                     //如果人员关联的公司不包含自己所在的公司则加入
-                    if (!list.contains(company)) {
-                        list.add(company);
+                    if (!list.contains(companyInfo)) {
+                        list.add(companyInfo);
                     }
                 }
 
@@ -360,20 +369,24 @@ public class HealthShowApiController {
                 Integer totalNum2 = totalCheckCompanyService.getTotalAbnormalNumByCompanyList(list);
                 Integer dayAbnormalNum = num1+num2;
                 Integer totalAbnormalNum =  totalNum2 + dayAbnormalNum;
-               /* Integer num2 = personDeviceFilterLogService.getDayAbnormalNumByCompanyList(DateUtil.beginOfDay(new Date()), new Date(), list);
-                Integer totalNum2 = totalCheckCompanyService.getTotalAbnormalNumByCompanyList(list);
 
-                //当日异常
-                Integer dayAbnormalNum = num2 == null ? 0 : num2;
 
-                //总异常
-                Integer totalAbnormalNum = totalNum2 == null ? 0 : totalNum2 + dayAbnormalNum;*/
-
-                Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
+                /*Integer normalDaysNum = totalCheckCompanyService.findMinNormalDayByCompanyList(list);
                 //连续无异常天数
-                Integer normalDays = normalDaysNum == null ? 0 : normalDaysNum;
+                Integer normalDays = normalDaysNum == null ? 0 : normalDaysNum;*/
+
+                Integer normalDays = 0;
+                Date totalCheckCompany = totalCheckCompanyService.findMaxAbnormalTimeByCompanyList(list);
+                if (totalCheckCompany == null){
+                    normalDays = totalCheckCompanyService.findMaxNormalDayByCompanyList(list);
+                }
+                else {
+                    Long today = DateUtil.beginOfDay(new Date()).getTime();
+                    Long abnormalDay = totalCheckCompany.getTime();
+                    normalDays = Math.toIntExact((today - abnormalDay) / (1000 * 60 * 60 * 24))-1;
+                }
+
 
-                //   HashMap<String, Object> mapData = new HashMap<>();
                 mapData.put("teacherNum", teacherNum);
                 mapData.put("studentNum", studentNum);
                 mapData.put("visitorNum",visitorNum);
@@ -381,7 +394,7 @@ public class HealthShowApiController {
                 mapData.put("checkedStudentNum", checkedStudentNum);
                 mapData.put("dayAbnormalNum", dayAbnormalNum);
                 mapData.put("totalAbnormalNum", totalAbnormalNum);
-                mapData.put("normalDays", normalDays);
+                mapData.put("normalDays", normalDays<0?0:normalDays);
                 msgResult.setData(mapData);
 
 

+ 318 - 5
web/src/main/java/com/jpsoft/smart/modules/pay/alipay/AlipayController.java

@@ -3,28 +3,52 @@ package com.jpsoft.smart.modules.pay.alipay;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeCreateModel;
+import com.alipay.api.domain.AlipayTradeWapPayModel;
+import com.alipay.api.domain.BusinessParams;
+import com.alipay.api.domain.ExtendParams;
 import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.request.AlipayTradeCreateRequest;
 import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
+import com.alipay.api.response.AlipayTradeCreateResponse;
 import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeWapPayResponse;
 import com.ijpay.alipay.AliPayApi;
+import com.ijpay.alipay.AliPayApiConfig;
+import com.ijpay.alipay.AliPayApiConfigKit;
+import com.jpsoft.smart.modules.base.entity.CompanyPaymentInfo;
 import com.jpsoft.smart.modules.base.entity.ElectricClientInfo;
+import com.jpsoft.smart.modules.base.entity.ParkingRecord;
 import com.jpsoft.smart.modules.base.entity.RechargeRecord;
+import com.jpsoft.smart.modules.base.service.CompanyPaymentInfoService;
 import com.jpsoft.smart.modules.base.service.ElectricClientInfoService;
+import com.jpsoft.smart.modules.base.service.ParkingRecordService;
 import com.jpsoft.smart.modules.base.service.RechargeRecordService;
 import com.jpsoft.smart.modules.business.service.RechargeService;
 import com.jpsoft.smart.modules.common.dto.MessageResult;
 import com.jpsoft.smart.electricity.server.protocol.MeterReceivePacket;
+import com.jpsoft.smart.modules.common.service.IRedisService;
+import com.jpsoft.smart.modules.common.utils.ParkApiUtil;
 import com.jpsoft.smart.modules.pay.properties.AliPayProperties;
+import com.jpsoft.smart.modules.pay.properties.ParkAliPayProperties;
+import com.jpsoft.smart.modules.wechat.vo.UserInfo;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
 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 javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
@@ -41,11 +65,13 @@ import java.util.concurrent.TimeUnit;
 @RestController
 public class AlipayController {
 
-    private Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
     private AliPayProperties aliPayProperties;
 
+    @Autowired
+    private ParkAliPayProperties parkAliPayProperties;
+
     @Autowired
     private RechargeRecordService rechargeRecordService;
 
@@ -55,6 +81,20 @@ public class AlipayController {
     @Autowired
     private ElectricClientInfoService electricClientInfoService;
 
+    @Autowired
+    private ParkingRecordService parkingRecordService;
+
+    @Autowired
+    private CompanyPaymentInfoService companyPaymentInfoService;
+
+    @Autowired
+    private IRedisService redisService;
+
+    @Autowired
+    private ParkApiUtil parkApiUtil;
+
+
+
     @ApiOperation(value = "支付宝扫码支付")
     @GetMapping("/tradePrecreatePay")
     public MessageResult tradePrecreatePay(String recordId) {
@@ -111,7 +151,7 @@ public class AlipayController {
 
         } catch (Exception e) {
             e.printStackTrace();
-            logger.error(e.getMessage(), e);
+            log.error(e.getMessage(), e);
             result.setResult(false);
             result.setMessage(e.getMessage());
         }
@@ -177,21 +217,294 @@ public class AlipayController {
                 } catch (Exception e) {
                     rechargeRecord.setErrorLog(e.getMessage());
                     e.printStackTrace();
-                    logger.error(e.getMessage(), e);
+                    log.error(e.getMessage(), e);
                 }
                 rechargeRecordService.update(rechargeRecord);
 
 
                 return "success";
             } else {
-                logger.error("notify_url 验证失败");
+                log.error("notify_url 验证失败");
                 return "failure";
             }
         } catch (Exception e) {
             e.printStackTrace();
-            logger.error(e.getMessage(), e);
+            log.error(e.getMessage(), e);
             return "failure";
         }
     }
 
+    @ApiOperation(value = "停车支付宝扫码支付")
+    @PostMapping("/parkTradePrecreatePay")
+    public MessageResult parkTradePrecreatePay(@RequestBody HashMap<String, String> map) {
+
+        MessageResult result = new MessageResult();
+
+        try {
+            ParkingRecord parkingRecord = parkingRecordService.get(map.get("id"));
+            if (parkingRecord == null){
+                throw new Exception("订单不存在");
+            }
+            CompanyPaymentInfo companyPaymentInfo = companyPaymentInfoService.findByCompanyId(parkingRecord.getCompanyId());
+            if (companyPaymentInfo == null){
+                throw new Exception("公司未配置收款账户");
+            }
+
+            AlipayClient alipayClient = new DefaultAlipayClient(aliPayProperties.getServiceUrl(), aliPayProperties.getAppId(), aliPayProperties.getPrivateKey(), "json", aliPayProperties.getInputCharset(), aliPayProperties.getZfbPublicKey(), aliPayProperties.getSignType());
+            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
+            request.setNotifyUrl(companyPaymentInfo.getParkingAlipayNotifyUrl());
+
+
+
+            if (parkingRecord.getPayAmount().compareTo(BigDecimal.ZERO) != 1) {
+                throw new Exception("金额有误");
+            }
+            if (parkingRecord.getPayStatus().equals("20")) {
+                throw new Exception("订单已支付");
+            }
+
+
+            Map<String, Object> maps = new HashMap<>();
+            maps.put("out_trade_no", parkingRecord.getSerialNumber());
+            maps.put("total_amount", String.valueOf(parkingRecord.getPayAmount()));
+            maps.put("subject", parkingRecord.getProductTheme());
+            maps.put("timeout_express", "5m");
+
+            JSONObject extendParams = new JSONObject();
+
+            extendParams.put("sys_service_provider_id", aliPayProperties.getMchId());
+            maps.put("extend_params", extendParams);
+            request.putOtherTextParam("app_auth_token", companyPaymentInfo.getAppAuthToken());
+            //把订单信息转换为json对象的字符串
+            String postdata = JSONObject.toJSONString(maps);
+            request.setBizContent(postdata);
+            AlipayTradePrecreateResponse response = alipayClient.execute(request);
+            String body = response.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(body);
+            String alipayTradePrecreateResponse = jsonObject.getString("alipay_trade_precreate_response");
+            JSONObject jsonResponse = JSONObject.parseObject(alipayTradePrecreateResponse);
+
+            if (!jsonResponse.getString("code").equals("10000")) {
+                throw new Exception(jsonResponse.getString("sub_msg"));
+            }
+
+            String qr_code = jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
+            result.setResult(true);
+
+            log.warn("qr_code=" + qr_code);
+            result.setData(qr_code);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            result.setResult(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+
+    }
+
+
+    @ApiOperation(value = "停车支付宝手机网站支付")
+    @PostMapping("/parkingTradeWebPay")
+    public MessageResult parkingTradeWebPay(@RequestBody HashMap<String, String> map) {
+
+        MessageResult result = new MessageResult();
+
+        try {
+            ParkingRecord parkingRecord = parkingRecordService.get(map.get("id"));
+            if (parkingRecord == null){
+                throw new Exception("订单不存在");
+            }
+            CompanyPaymentInfo companyPaymentInfo = companyPaymentInfoService.findByCompanyId(parkingRecord.getCompanyId());
+            if (companyPaymentInfo == null){
+                throw new Exception("公司未配置收款账户");
+            }
+
+
+
+
+            AlipayClient alipayClient = new DefaultAlipayClient(parkAliPayProperties.getServiceUrl(), parkAliPayProperties.getAppId(), parkAliPayProperties.getPrivateKey(), "json", parkAliPayProperties.getInputCharset(), parkAliPayProperties.getZfbPublicKey(), parkAliPayProperties.getSignType());
+            AlipayTradeCreateRequest request = new AlipayTradeCreateRequest ();
+            request.setNotifyUrl(companyPaymentInfo.getParkingAlipayNotifyUrl());
+
+
+
+            if (parkingRecord.getPayAmount().compareTo(BigDecimal.ZERO) != 1) {
+                throw new Exception("金额有误");
+            }
+            if (parkingRecord.getPayStatus().equals("20")) {
+                throw new Exception("订单已支付");
+            }
+
+
+            Map<String, Object> maps = new HashMap<>();
+            maps.put("out_trade_no", parkingRecord.getSerialNumber());
+            maps.put("total_amount", String.valueOf(parkingRecord.getPayAmount()));
+            maps.put("subject", parkingRecord.getProductTheme());
+            maps.put("timeout_express", "5m");
+            maps.put("buyer_id", parkingRecord.getOpenId());
+
+            JSONObject extendParams = new JSONObject();
+
+            extendParams.put("sys_service_provider_id", aliPayProperties.getMchId());
+            maps.put("extend_params", extendParams);
+            request.putOtherTextParam("app_auth_token", companyPaymentInfo.getAppAuthToken());
+            //把订单信息转换为json对象的字符串
+            String postdata = JSONObject.toJSONString(maps);
+            request.setBizContent(postdata);
+            AlipayTradeCreateResponse response = alipayClient.execute(request);
+            if(response.isSuccess()){
+
+                HashMap<String,Object> dataMap = new HashMap<String,Object>();
+
+                dataMap.put("tradeNo", response.getTradeNo());
+
+                HashMap<String,Object> resultMap = new HashMap<String,Object>();
+
+                resultMap.put("tradeOrder", dataMap);
+
+                result.setData(resultMap);
+                result.setResult(true);
+
+            } else {
+                result.setResult(false);
+                result.setData("");
+
+            }
+
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            result.setResult(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+
+    }
+
+    @RequestMapping(value="/parkingAlipayNotify")
+    public String parkingAlipayNotify(HttpServletRequest request) {
+
+        try {
+            // 获取支付宝POST过来反馈信息
+            Map<String, String> params = AliPayApi.toMap(request);
+
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                System.out.println(entry.getKey() + " = " + entry.getValue());
+            }
+
+            boolean verifyResult = AlipaySignature.rsaCheckV1(params, parkAliPayProperties.getZfbPublicKey(), "UTF-8", "RSA2");
+
+            if (verifyResult) {
+
+                ParkingRecord parkingRecord = parkingRecordService.findBySerialNumber(params.get("out_trade_no"));
+                if (parkingRecord == null) {
+                    throw new Exception("支付已完成,但未找到此订单号的流水");
+                }
+                if (!parkingRecord.getPayAmount().toString().equals(params.get("buyer_pay_amount"))) {
+                    throw new Exception("支付金额与系统金额不一致");
+                }
+                parkingRecord.setUpdateTime(new Date());
+                parkingRecord.setUpdateBy(params.get("buyer_logon_id"));
+                parkingRecord.setPayType("alipay");
+                parkingRecord.setPayStatus("20");
+                parkingRecord.setTransactionNumber(params.get("trade_no"));
+                parkingRecord.setPaymentTime(DateUtil.parse(params.get("gmt_payment")));
+
+                try {
+
+                    String accessToken = (String) redisService.get("accessToken", "accessToken");
+                    if (StringUtils.isBlank(accessToken)){
+                        accessToken = parkApiUtil.getXToken();
+                    }
+
+                    HashMap<String,Object> map = new HashMap<>();
+                    net.sf.json.JSONObject jsonObject = new net.sf.json.JSONObject();
+                    if (StringUtils.isBlank(parkingRecord.getParkingDeviceNo())){
+                        map.put("carNum",parkingRecord.getCarNum());
+                        map.put("consumeMoney",parkingRecord.getPayAmount().floatValue());
+                        map.put("feeAmount",parkingRecord.getPayAmount().floatValue());
+                  //      jsonObject = parkApiUtil.httpRequest("/ipms/integration/kingdo/payment/success",accessToken,"POST",map);
+                    }else {
+                        map.put("deviceCode",parkingRecord.getParkingDeviceNo());
+                        map.put("feeAmount",parkingRecord.getPayAmount().floatValue());
+               //         jsonObject = parkApiUtil.httpRequest("/ipms/payment/bydevice/success",accessToken,"POST",map);
+
+                    }
+
+
+                    if (!jsonObject.getString("errMsg").equals("success")) {
+                        log.error(jsonObject.getString("errMsg"));
+                    }
+
+
+
+
+
+
+                } catch (Exception e) {
+                    log.error(e.getMessage(),e);
+                }
+                parkingRecordService.update(parkingRecord);
+
+
+                return "success";
+            } else {
+                log.error("notify_url 验证失败");
+                return "failure";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            return "failure";
+        }
+    }
+
+
+    @GetMapping(value="findUserInfo/{authCode}")
+    public MessageResult findUserInfo(@PathVariable(name="authCode") String authCode){
+
+        System.out.println("获取支付宝的userId");
+        try{
+
+            AlipayClient alipayClient = new DefaultAlipayClient(parkAliPayProperties.getServiceUrl(),parkAliPayProperties.getAppId(),parkAliPayProperties.getPrivateKey(),parkAliPayProperties.getFormat(),parkAliPayProperties.getInputCharset(),parkAliPayProperties.getZfbPublicKey(),parkAliPayProperties.getSignType());
+
+            AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+            request.setCode(authCode);
+            request.setGrantType("authorization_code");
+
+            AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
+
+            System.out.println(oauthTokenResponse.getUserId());
+
+            HashMap<String,Object> dataMap = new HashMap<String,Object>();
+
+            UserInfo userInfo = new UserInfo();
+            userInfo.setOpenid(oauthTokenResponse.getUserId());
+       //     dataMap.put("openId", oauthTokenResponse.getUserId());
+
+         //   HashMap<String,Object> resultMap = new HashMap<String,Object>();
+
+        //    resultMap.put("userInfo", dataMap);
+
+            return new MessageResult(true, "获取支付宝信息成功", userInfo,200);
+        } catch (AlipayApiException e) {
+
+
+
+            //处理异常
+            e.printStackTrace();
+            return new MessageResult(false, "获取支付宝授权失败", "",400);
+        } catch (Exception e) {
+            //处理异常
+            e.printStackTrace();
+            return new MessageResult(false, "获取支付宝授权失败", "",400);
+        }
+    }
+
+
+
 }

+ 198 - 0
web/src/main/java/com/jpsoft/smart/modules/pay/weixin/WxPayController.java

@@ -8,15 +8,24 @@ import com.ijpay.core.kit.HttpKit;
 import com.ijpay.core.kit.WxPayKit;
 import com.ijpay.wxpay.WxPayApi;
 import com.ijpay.wxpay.model.UnifiedOrderModel;
+import com.jpsoft.smart.modules.base.entity.CompanyPaymentInfo;
 import com.jpsoft.smart.modules.base.entity.ElectricClientInfo;
+import com.jpsoft.smart.modules.base.entity.ParkingRecord;
 import com.jpsoft.smart.modules.base.entity.RechargeRecord;
+import com.jpsoft.smart.modules.base.service.CompanyPaymentInfoService;
 import com.jpsoft.smart.modules.base.service.ElectricClientInfoService;
+import com.jpsoft.smart.modules.base.service.ParkingRecordService;
 import com.jpsoft.smart.modules.base.service.RechargeRecordService;
 import com.jpsoft.smart.modules.business.service.RechargeService;
 import com.jpsoft.smart.modules.common.dto.MessageResult;
 import com.jpsoft.smart.electricity.server.protocol.MeterReceivePacket;
+import com.jpsoft.smart.modules.common.service.IRedisService;
+import com.jpsoft.smart.modules.common.utils.ParkApiUtil;
 import com.jpsoft.smart.modules.pay.properties.WxJpsoftProperties;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +45,7 @@ import java.util.concurrent.TimeUnit;
 
 @RequestMapping("/wxPay")
 @RestController
+@Slf4j
 public class WxPayController {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
@@ -52,6 +62,18 @@ public class WxPayController {
     @Autowired
     private ElectricClientInfoService electricClientInfoService;
 
+    @Autowired
+    private ParkingRecordService parkingRecordService;
+
+    @Autowired
+    private CompanyPaymentInfoService companyPaymentInfoService;
+
+    @Autowired
+    private IRedisService redisService;
+
+    @Autowired
+    private ParkApiUtil parkApiUtil;
+
     @ApiOperation(value = "微信JSAPI支付")
     @GetMapping("/webPay")
     public MessageResult webPay(String recordId,String openId) {
@@ -214,4 +236,180 @@ public class WxPayController {
 
         return null;
     }
+
+    @ApiOperation(value = "停车微信JSAPI支付")
+    @PostMapping("/parkingWxPay")
+    public MessageResult parkingWxPay(@RequestBody HashMap<String, String> map) {
+        MessageResult msgResult = new MessageResult<>();
+        try {
+            ParkingRecord parkingRecord = parkingRecordService.get(map.get("id"));
+
+            parkingRecord.setUpdateTime(new Date());
+
+            parkingRecordService.update(parkingRecord);
+
+            if (parkingRecord == null) {
+                throw new Exception("订单不存在");
+            }
+            if (StrUtil.isBlank(parkingRecord.getOpenId())) {
+                throw new Exception("openId不存在");
+            }
+            if (parkingRecord.getPayAmount().compareTo(BigDecimal.ZERO) != 1) {
+                throw new Exception("金额有误");
+            }
+            if (parkingRecord.getPayStatus().equals("20")) {
+                throw new Exception("订单已支付");
+            }
+
+            CompanyPaymentInfo companyPaymentInfo = companyPaymentInfoService.findByCompanyId(parkingRecord.getCompanyId());
+            if (companyPaymentInfo == null){
+                throw new Exception("该公司未配置收费账户");
+            }
+
+
+            //金额处理
+            int wxTotalTee = parkingRecord.getPayAmount().multiply(new BigDecimal(100)).intValue();
+            Map<String, String> params = UnifiedOrderModel
+                    .builder()
+                    .appid(companyPaymentInfo.getAppId())
+                    .mch_id(companyPaymentInfo.getMchId())
+                    .sub_mch_id(companyPaymentInfo.getSubMchId())
+                    .sub_appid(companyPaymentInfo.getSubAppId())
+                    .nonce_str(WxPayKit.generateStr())
+                    .body(parkingRecord.getProductTheme())
+                    .out_trade_no(parkingRecord.getSerialNumber())
+                    .total_fee(String.valueOf(wxTotalTee))
+                    .spbill_create_ip(wxJpsoftProperties.getIp())
+                    .notify_url(companyPaymentInfo.getParkingWechatNotifyUrl())
+                    .trade_type(TradeType.JSAPI.getTradeType())
+                    .sub_openid(parkingRecord.getOpenId())
+                 //   .openid(parkingRecord.getOpenId())
+                    .build()
+                    .createSign(wxJpsoftProperties.getMchKey(), SignType.HMACSHA256);
+
+            String xmlResult = WxPayApi.pushOrder(false, params);
+            logger.info(xmlResult);
+
+            Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
+            String returnCode = resultMap.get("return_code");
+            String returnMsg = resultMap.get("return_msg");
+            if (!WxPayKit.codeIsOk(returnCode)) {
+                logger.error(returnCode);
+                throw new Exception(returnMsg);
+            }
+            String resultCode = resultMap.get("result_code");
+            if (!WxPayKit.codeIsOk(resultCode)) {
+                String errCode = resultMap.get("err_code_des");
+                logger.error(errCode);
+                throw new Exception(errCode);
+            }
+
+            // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
+
+            String prepayId = resultMap.get("prepay_id");
+
+            Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxJpsoftProperties.getAppId(),
+                    wxJpsoftProperties.getMchKey(), SignType.HMACSHA256);
+
+            msgResult.setData(packageParams);
+            msgResult.setResult(true);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            msgResult.setResult(false);
+            msgResult.setMessage(e.getMessage());
+        }
+        return msgResult;
+    }
+
+
+    @RequestMapping(value = "/parkingWxPayNotify", method = {RequestMethod.POST, RequestMethod.GET})
+    @ResponseBody
+    public String parkingWxPayNotify(HttpServletRequest request) {
+        String xmlMsg = HttpKit.readData(request);
+        logger.warn("支付通知=" + xmlMsg);
+        Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
+
+        String returnCode = params.get("return_code");
+        String outTradeNo = params.get("out_trade_no");
+        String payTimeStr = params.get("time_end");
+        Date payTime = DateUtil.parse(payTimeStr);
+
+        // 注意此处签名方式需与统一下单的签名类型一致 WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey()
+        if (WxPayKit.verifyNotify(params, wxJpsoftProperties.getMchKey(), SignType.HMACSHA256)) {
+            if (WxPayKit.codeIsOk(returnCode)) {
+                // 更新订单信息
+
+                try {
+                    ParkingRecord parkingRecord = parkingRecordService.findBySerialNumber(outTradeNo);
+                    if (parkingRecord == null) {
+                        throw new Exception("支付已完成,但未找到此订单号的流水");
+                    }
+                    if (parkingRecord.getPayAmount().multiply(new BigDecimal(100)).compareTo(new BigDecimal(params.get("total_fee"))) !=0) {
+                        throw new Exception("支付金额与系统金额不一致");
+                    }
+
+                    parkingRecord.setUpdateTime(new Date());
+                    parkingRecord.setUpdateBy(params.get("openid"));
+                    parkingRecord.setPayType("wechat");
+                    parkingRecord.setPayStatus("20");
+                    parkingRecord.setTransactionNumber(params.get("transaction_id"));
+                    parkingRecord.setPaymentTime(payTime);
+
+                    try {
+
+
+                        String accessToken = (String) redisService.get("accessToken", "accessToken");
+                        if (StringUtils.isBlank(accessToken)){
+                            accessToken = parkApiUtil.getXToken();
+                        }
+
+                        HashMap<String,Object> map = new HashMap<>();
+
+                        JSONObject jsonObject = new JSONObject();
+                        if (StringUtils.isBlank(parkingRecord.getParkingDeviceNo())){
+                            map.put("carNum",parkingRecord.getCarNum());
+                            map.put("consumeMoney",parkingRecord.getPayAmount().floatValue());
+                            map.put("feeAmount",parkingRecord.getPayAmount().floatValue());
+                        //     jsonObject = parkApiUtil.httpRequest("/ipms/integration/kingdo/payment/success",accessToken,"POST",map);
+                        }else {
+                            map.put("deviceCode",parkingRecord.getParkingDeviceNo());
+                            map.put("feeAmount",parkingRecord.getPayAmount().floatValue());
+                       //      jsonObject = parkApiUtil.httpRequest("/ipms/payment/bydevice/success",accessToken,"POST",map);
+
+                        }
+
+
+                        if (!jsonObject.getString("errMsg").equals("success")) {
+                            log.error(jsonObject.getString("errMsg"));
+                        }
+
+
+
+
+
+
+                    } catch (Exception e) {
+                       log.error(e.getMessage(),e);
+                    }
+
+
+                    parkingRecordService.update(parkingRecord);
+
+                    // 发送通知等
+                    Map<String, String> xml = new HashMap<String, String>(2);
+                    xml.put("return_code", "SUCCESS");
+                    xml.put("return_msg", "OK");
+                    return WxPayKit.toXml(xml);
+                } catch (Exception e) {
+                    logger.error(e.getMessage(), e);
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return null;
+    }
+
 }

+ 321 - 17
web/src/main/java/com/jpsoft/smart/modules/wechat/controller/WxController.java

@@ -1,23 +1,15 @@
 package com.jpsoft.smart.modules.wechat.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.jpsoft.smart.config.WxConfig;
-import com.jpsoft.smart.modules.base.entity.CompanyInfo;
-import com.jpsoft.smart.modules.base.entity.InformationInfo;
-import com.jpsoft.smart.modules.base.entity.OwnerInfo;
-import com.jpsoft.smart.modules.base.entity.WarningPusher;
-import com.jpsoft.smart.modules.base.service.CompanyInfoService;
-import com.jpsoft.smart.modules.base.service.InformationInfoService;
-import com.jpsoft.smart.modules.base.service.OwnerInfoService;
-import com.jpsoft.smart.modules.base.service.WarningPusherService;
+import com.jpsoft.smart.modules.base.entity.*;
+import com.jpsoft.smart.modules.base.service.*;
 import com.jpsoft.smart.modules.common.dto.MessageResult;
 import com.jpsoft.smart.modules.common.service.impl.RedisServiceImpl;
-import com.jpsoft.smart.modules.common.utils.ApiUtil;
+import com.jpsoft.smart.modules.common.utils.*;
 import com.jpsoft.smart.modules.common.utils.Generator.CaptchaUtilA;
 import com.jpsoft.smart.modules.common.utils.Generator.CircleCaptchaA;
-import com.jpsoft.smart.modules.common.utils.SMSUtil;
-import com.jpsoft.smart.modules.common.utils.Sign;
-import com.jpsoft.smart.modules.common.utils.WeixinUtil;
 import com.jpsoft.smart.modules.pay.properties.WxPayProperties;
 import com.jpsoft.smart.modules.wechat.entity.AccessControl;
 import com.jpsoft.smart.modules.wechat.entity.AccessToken;
@@ -47,6 +39,7 @@ 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;
@@ -66,6 +59,9 @@ public class WxController {
     @Autowired
     private ApiUtil apiUtil;
 
+    @Autowired
+    private ParkApiUtil parkApiUtil;
+
     @Autowired
     private WxConfig wxConfig;
 
@@ -96,6 +92,12 @@ public class WxController {
     @Autowired
     private CompanyInfoService companyInfoService;
 
+    @Autowired
+    private ParkingRecordService parkingRecordService;
+
+    @Autowired
+    private CompanyPaymentInfoService companyPaymentInfoService;
+
 
     @ApiOperation(value = "获取微信配置")
     @GetMapping(value = "/getConfig")
@@ -171,6 +173,38 @@ public class WxController {
         }
     }
 
+    @ApiOperation(value = "获取公众号用户信息")
+    @GetMapping(value = "/findParkUserInfo")
+    public MessageResult findParkUserInfo(String code,String companyInfoId) {
+        try {
+            System.out.println("获取微信用户openId");
+            CompanyPaymentInfo companyPaymentInfo = companyPaymentInfoService.findByCompanyId(companyInfoId);
+
+
+            AccessToken at = WeixinUtil.getAccessToken(companyPaymentInfo.getSubAppId(), companyPaymentInfo.getSubAppSecret(), 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);
+        }
+    }
+
     @GetMapping(value = "getAppId/{id}")
     @ResponseBody
     public MessageResult getAppId(@PathVariable("id") String id) {
@@ -857,12 +891,12 @@ public class WxController {
                         }
 
                     }
-                    if ("4000".equals(eventCode)){
+                    if ("4000".equals(eventCode)) {
                         CompanyInfo companyInfo = companyInfoService.get(id);
-                        if (companyInfo == null){
-                            WeixinUtil.replyTextMessage(response,wechatId,openId,"您的公司暂时不在我们的管辖内,请联系管理员!");
-                        }else {
-                            WeixinUtil.replyArticlesMessage(response,wechatId,openId,companyInfo.getName(),replyMessage.getMessage(),companyInfo.getLogo(),"http://wisdomhousewechat.sudaonline.net/prevention-xxd/upyes.html");
+                        if (companyInfo == null) {
+                            WeixinUtil.replyTextMessage(response, wechatId, openId, "您的公司暂时不在我们的管辖内,请联系管理员!");
+                        } else {
+                            WeixinUtil.replyArticlesMessage(response, wechatId, openId, companyInfo.getName(), replyMessage.getMessage(), companyInfo.getLogo(), "http://wisdomhousewechat.sudaonline.net/prevention-xxd/upyes.html");
                         }
                     }
 
@@ -907,4 +941,274 @@ public class WxController {
         }
     }
 
+
+    @GetMapping("/getMsgByCarNum")
+    @ResponseBody
+    @ApiOperation(value = "输入车牌号获取停车信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "companyInfoId", paramType = "query", required = true, value = "公司id"),
+            @ApiImplicitParam(name = "carNum", paramType = "query", required = true, value = "车牌号"),
+            @ApiImplicitParam(name = "openId", paramType = "query", required = false, value = "openId")
+
+    })
+    public MessageResult getMsgByCarNum(String companyInfoId, String carNum,String openId) {
+        int code = 200;
+        String message = "查询成功";
+        Object data = "";
+        boolean result = true;
+
+        HashMap<String, Object> dataMap = new HashMap<>();
+        try {
+
+
+            if (StringUtils.isBlank(companyInfoId)) {
+                return new MessageResult(false, "公司为空", "", 400);
+            }
+            CompanyInfo companyInfo = companyInfoService.get(companyInfoId);
+            if (companyInfo == null) {
+                return new MessageResult(false, "公司不存在", "", 400);
+            }
+
+            if (StringUtils.isBlank(carNum)) {
+                return new MessageResult(false, "车牌号为空", "", 400);
+            }
+
+            String accessToken = (String) redisService.get("accessToken", "accessToken");
+            if (StringUtils.isBlank(accessToken)) {
+                accessToken = parkApiUtil.getXToken();
+            }
+
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("carNum", carNum);
+            map.put("queryType", 1);
+            net.sf.json.JSONObject jsonObject = parkApiUtil.httpRequest("/ipms/integration/kingdo/payment/info", accessToken, "POST", map);
+
+
+            if (jsonObject.getString("errMsg").equals("success")) {
+
+
+
+                net.sf.json.JSONObject dataJson = jsonObject.getJSONObject("data");
+                if (dataJson.size()>0){
+
+
+                BigDecimal parkingTime = new BigDecimal(dataJson.getString("parkTime"));
+                Date inParkingTime = DateUtil.date(dataJson.getLong("inParkTime"));
+                BigDecimal payAmount = new BigDecimal(dataJson.getString("receivableMoney"));
+                String serialNumber = com.jpsoft.smart.modules.common.utils.StringUtils.getOutTradeNo();
+                ParkingRecord parkingRecord = new ParkingRecord();
+                parkingRecord.setId(UUID.randomUUID().toString());
+                parkingRecord.setCarNum(carNum);
+                parkingRecord.setCompanyId(companyInfoId);
+                parkingRecord.setInParkingTime(inParkingTime);
+                parkingRecord.setParkingTime(parkingTime);
+
+
+             //   parkingRecord.setPayAmount(payAmount);
+                parkingRecord.setPayAmount(new BigDecimal(0.01));
+
+
+                parkingRecord.setSerialNumber(serialNumber);
+                parkingRecord.setPayStatus("10");
+                parkingRecord.setProductTheme("停车费");
+                parkingRecord.setOpenId(openId);
+                parkingRecord.setCreateTime(new Date());
+                parkingRecord.setDelFlag(false);
+                parkingRecordService.insert(parkingRecord);
+
+                HashMap<String, Object> parkMap = new HashMap<>();
+                parkMap.put("carNum", carNum);
+                parkMap.put("receivableMoney", parkingRecord.getPayAmount());
+                parkMap.put("parkTime", TimeZonesUtil.parseSecond(dataJson.getLong("parkTime")));
+                parkMap.put("inParkTime", DateUtil.formatDateTime(inParkingTime));
+                parkMap.put("parkName",dataJson.getString("parkName"));
+
+
+                dataMap.put("parkingData", parkMap);
+                dataMap.put("parkingRecordId", parkingRecord.getId());
+
+            }else {
+                    return new MessageResult(false,"无停车信息","",400);
+                }
+
+            } else {
+                code = 400;
+                message = "查询失败";
+                result = false;
+                return new MessageResult(result, message, data, code);
+            }
+
+
+           /*HashMap<String,Object> map = new HashMap<>();
+           map.put("carInNumPicUrl","http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-1.jpg");
+           map.put("carInPicUrl", "http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-0.jpg");
+           map.put("carNum",carNum);
+           map.put("carType",1);
+           map.put("inParkTime","2017-11-15");
+           map.put("ownerType",0);
+           map.put("parkCode","null_yu");
+           map.put("parkName","yu");
+           map.put("parkTime","1000");
+           map.put("queryType",1);
+           map.put("receivableMoney",0.01);*/
+
+            //    data = map;
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            code = 400;
+            message = "查询失败";
+            result = false;
+        }
+
+        return new MessageResult(result, message, dataMap, code);
+    }
+
+
+    @GetMapping("/getMsgByDeviceCode")
+    @ResponseBody
+    @ApiOperation(value = "输入设备号获取停车信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "companyInfoId", paramType = "query", required = true, value = "公司id"),
+            @ApiImplicitParam(name = "deviceCode", paramType = "query", required = true, value = "设备号"),
+            @ApiImplicitParam(name = "openId", paramType = "query", required = false, value = "openId")
+
+    })
+    public MessageResult getMsgByDeviceCode(String companyInfoId,String deviceCode,String openId) {
+        int code = 200;
+        String message = "查询成功";
+        Object data = "";
+        boolean result = true;
+
+        try {
+
+            if (StringUtils.isBlank(deviceCode)) {
+                code = 400;
+                message = "道闸设备编码为空";
+                result = false;
+                return new MessageResult(result, message, data, code);
+            }
+
+            String accessToken = (String) redisService.get("accessToken", "accessToken");
+            if (StringUtils.isBlank(accessToken)) {
+                accessToken = parkApiUtil.getXToken();
+            }
+
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("deviceCode", deviceCode);
+        //    net.sf.json.JSONObject jsonObject = parkApiUtil.httpRequest("/ipms/payment/bydevice", accessToken, "POST", map);
+
+
+            //测试死数据,部署是删除
+            net.sf.json.JSONObject jsonObject1 = new net.sf.json.JSONObject();
+            jsonObject1.put("errMsg","success");
+            HashMap<String,Object> ceMap = new HashMap<>();
+            ceMap.put("carNumImgUrl","http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-1.jpg");
+            ceMap.put("carImgUrl", "http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-0.jpg");
+            ceMap.put("carNum","鄂D1234");
+            ceMap.put("carType",1);
+            ceMap.put("chargeDetail","停车时长42秒,收费金额0.01元");
+            ceMap.put("inParkTime",1586926518000L);
+            ceMap.put("ownerType",0);
+            ceMap.put("parkCode","null_yu");
+            ceMap.put("parkName","yu");
+            ceMap.put("parkTime",42);
+            ceMap.put("state",1);
+            ceMap.put("receivableMoney",0.01);
+            jsonObject1.put("data",ceMap);
+
+            if (jsonObject1.getString("errMsg").equals("success")) {
+
+                net.sf.json.JSONObject dataJson = (net.sf.json.JSONObject) jsonObject1.get("data");
+                Integer state = dataJson.getInt("state");
+                HashMap<String, Object> dataMap = new HashMap<>();
+                if (dataJson.size()>0) {
+
+                    BigDecimal parkingTime = new BigDecimal(dataJson.getString("parkTime"));
+                    Date inParkingTime = DateUtil.date(dataJson.getLong("inParkTime"));
+                    BigDecimal payAmount = new BigDecimal(dataJson.getString("receivableMoney"));
+                    String serialNumber = com.jpsoft.smart.modules.common.utils.StringUtils.getOutTradeNo();
+                    ParkingRecord parkingRecord = new ParkingRecord();
+                    parkingRecord.setId(UUID.randomUUID().toString());
+                    parkingRecord.setCarNum(dataJson.getString("carNum"));
+                    parkingRecord.setParkingDeviceNo(deviceCode);
+                    parkingRecord.setCompanyId(companyInfoId);
+                    parkingRecord.setInParkingTime(inParkingTime);
+                    parkingRecord.setParkingTime(parkingTime);
+                    parkingRecord.setPayAmount(payAmount);
+                    parkingRecord.setSerialNumber(serialNumber);
+                    parkingRecord.setPayStatus("10");
+                    parkingRecord.setProductTheme("停车费");
+                    parkingRecord.setOpenId(openId);
+                    parkingRecord.setCreateTime(new Date());
+                    parkingRecord.setDelFlag(false);
+                    parkingRecordService.insert(parkingRecord);
+
+
+                    HashMap<String, Object> parkMap = new HashMap<>();
+                    parkMap.put("carNum", dataJson.getString("carNum"));
+                    parkMap.put("receivableMoney", payAmount);
+                    parkMap.put("parkTime", TimeZonesUtil.parseSecond(dataJson.getLong("parkTime")));
+                    parkMap.put("inParkTime", DateUtil.formatDateTime(inParkingTime));
+                    parkMap.put("parkName",dataJson.getString("parkName"));
+
+
+                    dataMap.put("parkingData", parkMap);
+                    dataMap.put("parkingRecordId", parkingRecord.getId());
+
+
+                   /* dataMap.put("carNumImgUrl", dataJson.getString("carNumImgUrl"));
+                    dataMap.put("carImgUrl", dataJson.getString("carImgUrl"));
+                    dataMap.put("carNum", dataJson.getString("carNum"));
+                    dataMap.put("carType", 1);
+                    dataMap.put("chargeDetail", dataJson.getString("chargeDetail"));
+                    dataMap.put("inParkTime", dataJson.getString("inParkTime"));
+                    dataMap.put("ownerType", 0);
+                    dataMap.put("parkCode", dataJson.getString("parkCode"));
+                    dataMap.put("parkName", dataJson.getString("parkName"));
+                    dataMap.put("parkTime", dataJson.getString("parkTime"));
+                    dataMap.put("state", 1);
+                    dataMap.put("receivableMoney", dataJson.getString("receivableMoney"));*/
+
+                    data = dataMap;
+                }
+
+
+            } else {
+                code = 400;
+                message = "查询失败";
+                result = false;
+                return new MessageResult(result, message, data, code);
+            }
+
+
+           /* HashMap<String,Object> map = new HashMap<>();
+            map.put("carNumImgUrl","http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-1.jpg");
+            map.put("carImgUrl", "http://172.7.2.185:8082/d/1000033$1$0$0/20170629/10/2859-427-0.jpg");
+            map.put("carNum","鄂D1234");
+            map.put("carType",1);
+            map.put("chargeDetail","停车时长42秒,收费金额0.01元");
+            map.put("inParkTime","2017-11-15");
+            map.put("ownerType",0);
+            map.put("parkCode","null_yu");
+            map.put("parkName","yu");
+            map.put("parkTime","42");
+            map.put("state",1);
+            map.put("receivableMoney",0.01);
+
+            data = map;*/
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            code = 500;
+            message = "查询失败";
+            result = false;
+        }
+
+        return new MessageResult(result, message, data, code);
+    }
+
+
 }

+ 22 - 4
web/src/main/java/com/jpsoft/smart/schduled/CheckPersonTask.java

@@ -47,36 +47,50 @@ public class CheckPersonTask {
         Date startTime = DateUtil.beginOfDay(date);
         Date endTime = DateUtil.endOfDay(date);
         String recordTime = DateUtil.format(new Date(),"yyyy-MM-dd");
+
+        //查询当天有记录的公司
         List<CheckNumCompany> checkNumCompanyList = checkNumCompanyService.findByRecordTime(recordTime);
+        //获取所有公司统计表的数据
         List<TotalCheckCompany> totalCheckCompanyList = totalCheckCompanyService.findAll();
         List<String> totalCheckCompanyIds = new ArrayList<>();
+
+        //将公司统计表id数据存放在totalCheckCompanyIds
         for (TotalCheckCompany totalCheckCompany: totalCheckCompanyList){
             totalCheckCompanyIds.add(totalCheckCompany.getCompanyId());
         }
 
-
-
-
-
+        //当日有记录的公司的id集合初始化
         List<String> checkNumCompanyIds = new ArrayList<>();
+
+        //当日有数据时要进行判断正常,异常,过人记录
         if (checkNumCompanyList.size()>0){
             for (CheckNumCompany checkNumCompany: checkNumCompanyList){
+                //查询公司信息
                 CompanyInfo companyInfo = companyInfoService.get(checkNumCompany.getCompanyId());
+                //将有记录的公司id保存到checkNumCompanyIds
                 checkNumCompanyIds.add(companyInfo.getId());
+                //将有记录的公司存在list中以方便后面接口使用
                 List<CompanyInfo> list = new ArrayList<>();
                 list.add(companyInfo);
+                //按照公司id查询公司无异常人数
                 Integer normal = personDeviceFilterLogService.getDayNormalNumByCompanyId(startTime,endTime,checkNumCompany.getCompanyId());
+                //按照公司list查询公司异常人数
                 Integer abNormal = personDeviceFilterLogService.getDayAbnormalNumByCompanyList(startTime,endTime,list);
+                //将正常异常数据保存
                 checkNumCompany.setNormalNum(normal==null?0:normal.longValue());
                 checkNumCompany.setAbnormalNum(abNormal == null?0:abNormal.longValue());
                 checkNumCompanyService.update(checkNumCompany);
 
+                //查询出此公司的统计数据
                 TotalCheckCompany totalCheckCompany = totalCheckCompanyService.findByCompanyId(companyInfo.getId());
+                //如果不存在则新建一条
                 if (totalCheckCompany == null){
                     TotalCheckCompany totalCheckCompany1 = new TotalCheckCompany();
                     totalCheckCompany1.setCompanyId(companyInfo.getId());
+                    //如果有异常则连续正常日期清零,并记录发生异常的日期
                     if (checkNumCompany.getAbnormalNum()>0){
                         totalCheckCompany1.setNormalDay(0L);
+                        totalCheckCompany1.setAbnormalTime(DateUtil.beginOfDay(new Date()));
                     }else {
                         totalCheckCompany1.setNormalDay(1L);
                     }
@@ -87,8 +101,10 @@ public class CheckPersonTask {
                     totalCheckCompanyService.insert(totalCheckCompany1);
 
                 }else {
+                    //当公司记录存在并有异常时要更新异常日期
                     if (checkNumCompany.getAbnormalNum()>0){
                         totalCheckCompany.setNormalDay(0L);
+                        totalCheckCompany.setAbnormalTime(DateUtil.beginOfDay(new Date()));
                     }else {
                         Long normalDay = totalCheckCompany.getNormalDay();
                         totalCheckCompany.setNormalDay(normalDay+1L);
@@ -103,6 +119,7 @@ public class CheckPersonTask {
                 }
             }
 
+            //将已经有记录的公司移除,无记录的公司默认正常天数加1
             boolean success =totalCheckCompanyIds.removeAll(checkNumCompanyIds);
 
             if (success){
@@ -114,6 +131,7 @@ public class CheckPersonTask {
                     totalCheckCompanyService.update(totalCheckCompany);
                 }
             }
+         //无记录时所有公司正常日期加1,异常时间不更新
         }else {
             for (TotalCheckCompany totalCheckCompany : totalCheckCompanyList){
                 Long normalDay = totalCheckCompany.getNormalDay();