1
0
Selaa lähdekoodia

增加商户通知类

zx 7 vuotta sitten
vanhempi
commit
8ecea7458d

+ 68 - 5
src/main/java/com/emato/cuspay/notify/CusMerchantNotice.java

@@ -1,14 +1,23 @@
 package com.emato.cuspay.notify;
 
+import com.emato.cuspay.common.contant.Dict;
 import com.emato.cuspay.dao.mapper.merch.MerchNotiMapper;
 import com.emato.cuspay.dto.merch.MerchNoti;
+import com.emato.cuspay.support.msg.resp.ResponseMessage;
+import com.emato.cuspay.support.msg.resp.ResponseStatus;
+import com.emato.cuspay.util.OkHttpUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import okhttp3.Request;
+import okhttp3.RequestBody;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import java.io.IOException;
 import java.util.List;
 
 
@@ -19,9 +28,9 @@ import java.util.List;
  */
 
 @Component
-public class WxMerchantNotice implements MerchantNotice{
+public class CusMerchantNotice implements MerchantNotice{
 
-    private static final Logger logger = LoggerFactory.getLogger(WxMerchantNotice.class);
+    private static final Logger logger = LoggerFactory.getLogger(CusMerchantNotice.class);
 
     @Value("${db.wx.notify.limit}")
     private Integer limit;
@@ -34,16 +43,70 @@ public class WxMerchantNotice implements MerchantNotice{
         List<MerchNoti> notis = merchNotiMapper.selectMerchNotis(limit);
 
         if (notis == null || notis.isEmpty()) {
-            logger.info("no ");
+            logger.info("没有商户通知数据");
+            return;
         }
 
-        //记录异常通知
-        List<MerchNoti> errorsList = Lists.newArrayList();
+        //记录通知状态
+        List<MerchNoti> noticeList = Lists.newArrayList();
 
         notis.forEach(noti->{
 
+            if (noti.getNotifyUrl() == null) {
+                logger.error("商户通知回调接口为空");
+                noti.setNotiStatue(Dict.NoticeStatus.i_3.getItem()); //发送失败
+                noti.setIsStoped(Dict.IsStopStatus.i_1.getItem());
+                noticeList.add(noti);
+                return;
+            }
+
+            if (noti.getNotiCount() == null || noti.getNotiCount() <= 0) {
+                logger.error("通知商户次数为空");
+                noti.setNotiStatue(Dict.NoticeStatus.i_3.getItem()); //发送失败
+                noti.setIsStoped(Dict.IsStopStatus.i_1.getItem());
+                noticeList.add(noti);
+                return;
+            }
+
+            //组装需要请求的参数
+            String jsonStr = createJsonByNoti(noti);
+            logger.info("商户通知回调参数Parameters:"+ jsonStr);
+
+            int counter = 0;
+
+            while (counter < noti.getNotiCount()) {
+                ++counter;
+
+                Request request = OkHttpUtils.buildRequest(noti.getNotifyUrl(),
+                        RequestBody.create(OkHttpUtils.JSON, jsonStr));
+                String result = null;
+                try{
+                    result = OkHttpUtils.post(request);
+                    noti.setNotiStatue(Dict.NoticeStatus.i_2.getItem()); //通知发送成功
+                    noti.setIsStoped(Dict.IsStopStatus.i_1.getItem());//停止通知
+                    noticeList.add(noti);
+                    return;
+                }catch (IOException e) {
+                    logger.error("商户回调通知异常"+e.getMessage());
+                }
+
+            }
+            noti.setNotiStatue(Dict.NoticeStatus.i_3.getItem()); //发送失败
+            noti.setIsStoped(Dict.IsStopStatus.i_1.getItem());
+            noticeList.add(noti);
         });
 
 
+        int result = merchNotiMapper.updateBatch(noticeList);
+        if (result < 0) {
+            logger.error("更新商户通知数据失败"+noticeList);
+        }
+    }
+
+    private String createJsonByNoti(MerchNoti noti) {
+        ResponseMessage responseMessage = new ResponseMessage.Builder()
+                    .setCode(ResponseStatus.SUCCESS.getItem())
+                    .setData(noti).build();
+        return new Gson().toJson(responseMessage);
     }
 }

+ 1 - 1
src/main/java/com/emato/cuspay/task/wx/MerchantNoticeTimer.java

@@ -16,7 +16,7 @@ import org.springframework.stereotype.Component;
  */
 
 @Component
-public class WxCusTimer {
+public class MerchantNoticeTimer {
 
     @Autowired
     private MerchantNotice cusMerchantNotice;

+ 21 - 0
src/main/java/com/emato/cuspay/wx/common/WxContants.java

@@ -6,9 +6,30 @@ package com.emato.cuspay.wx.common;
  * 2018-05-19 08:45
  */
 public abstract class WxContants {
+
     public final static String FAIL = "FAIL";
 
     public final static String RETURN_CODE_FAIL = "RETURN_CODE_FAIL";
 
     public final static String SUCCESS = "SUCCESS";
+
+    /**
+     * 商户支付配置信息不存在
+     */
+    public final static String ERROR_NO_INFOMATION = "-1";
+
+    /**
+     * 没有商户支付配置信息API密钥不存在
+     */
+    public final static String ERROR_NO_API_KEY = "-2";
+
+    /**
+     *海关校验失败
+     */
+    public final static String ERROR_FAIL = "-3";
+
+    /**
+     *海关接口异常
+     */
+    public final static String  ERROR_EXCEPT = "-4";
 }

+ 13 - 12
src/main/java/com/emato/cuspay/wx/controller/WxCusController.java

@@ -4,7 +4,7 @@ package com.emato.cuspay.wx.controller;
 
 
 
-import com.emato.cuspay.dto.wx.WxCbPayDoc;
+import com.emato.cuspay.wx.dao.entity.WxCbPayDoc;
 import com.emato.cuspay.support.msg.resp.ResponseMessage;
 import com.emato.cuspay.support.msg.resp.ResponseStatus;
 import com.emato.cuspay.util.MapBeanUtils;
@@ -47,10 +47,12 @@ public class WxCusController {
      */
     @RequestMapping(value = "/declarepayment")
     public ResponseMessage declarePayment(HttpServletRequest request){
-        String sn = request.getParameter("sn");
-        String name = request.getParameter("name");
-        System.out.println("============"+sn +":"+ name);
-        return new ResponseMessage.Builder().setCode(ResponseStatus.SUCCESS.getItem()).setMsg("ok").build();
+       String data = request.getParameter("data");
+        return new ResponseMessage.Builder()
+                    .setCode(ResponseStatus.SUCCESS.getItem())
+                .setMsg("ok")
+                .setData(data)
+                .build();
     }
 
     /**
@@ -58,15 +60,16 @@ public class WxCusController {
      * @param request
      * @return
      */
-    @RequestMapping(value = "/wxcbpay", method = RequestMethod.POST)
+    @RequestMapping(value = "/wxCbPay", method = RequestMethod.POST)
     public ResponseMessage addWxCbPayDoc(HttpServletRequest request) {
-        logger.info("支付单信息入库接口请求开始");
+        logger.info("微信支付单信息入库接口请求开始");
         String data = request.getParameter("data");
         // 检查参数是否齐全
         if (Strings.isNullOrEmpty(data)) {
-            return  new ResponseMessage.Builder().setCode(ResponseStatus.ERROR.getItem()).setMsg("缺少业务数据").build();
+            return  new ResponseMessage.Builder().setCode(ResponseStatus.ERROR.getItem())
+                        .setMsg("微信支付推单业务数据为空").build();
         }
-        logger.info("支付单信息入库接口请求数据:【{}】",data);
+        logger.info("微信支付单信息入库接口请求数据:【{}】",data);
 
         //解析数据
         List<WxCbPayDoc> wxCbPayDocList = JacksonUtil.fromListJson(data, new TypeReference<List<WxCbPayDoc>>(){});
@@ -81,15 +84,13 @@ public class WxCusController {
 
         beVerified.put("merchSn", "商户编号");
         beVerified.put("merchName", "商户名称");
-        beVerified.put("platSn","平台编号");
-        beVerified.put("platName","平台中文名称");
         beVerified.put("appid", "微信公众号ID");
         beVerified.put("mchId","微信支付商户号");
         beVerified.put("outTradeNo", "商户订单号");
         beVerified.put("transactionId","微信支付订单号");
         beVerified.put("customs","报送海关");
         beVerified.put("mchCustomsNo","商户海关备案号");
-        beVerified.put("platNo","接入平台内部编号");
+        beVerified.put("platNo","接入平台内部编号");//merchErpSn 商户erp编号
 
         ResponseMessage rst = Validator.isEmpty(beVerified, validate);
         if (ResponseStatus.ERROR.getItem().equals(rst.getCode())) {

+ 1 - 1
src/main/java/com/emato/cuspay/wx/dao/entity/WxCbPayDoc.java

@@ -1,4 +1,4 @@
-package com.emato.cuspay.dto.wx;
+package com.emato.cuspay.wx.dao.entity;
 
 import java.io.Serializable;
 import java.util.Date;

+ 1 - 1
src/main/java/com/emato/cuspay/wx/dao/entity/WxPayError.java

@@ -1,4 +1,4 @@
-package com.emato.cuspay.dto.wx;
+package com.emato.cuspay.wx.dao.entity;
 
 import java.io.Serializable;
 import java.util.Date;

+ 0 - 5
src/main/java/com/emato/cuspay/wx/declare/CusDeclare.java

@@ -8,11 +8,6 @@ package com.emato.cuspay.wx.declare;
  */
 public interface CusDeclare {
 
-    final static String FAIL = "FAIL";
-
-    final static String RETURN_CODE_FAIL = "RETURN_CODE_FAIL";
-
-    final static String SUCCESS = "SUCCESS";
 
     /**
      * 海关报关

+ 157 - 77
src/main/java/com/emato/cuspay/wx/declare/WxCusDeclare.java

@@ -1,17 +1,23 @@
 package com.emato.cuspay.wx.declare;
 
+import com.emato.cuspay.base.merch.MerchCusService;
+import com.emato.cuspay.base.merch.MerchNotiService;
+import com.emato.cuspay.dto.merch.MerchCusCfg;
+import com.emato.cuspay.wx.common.MerchNotiBuilder;
+import com.emato.cuspay.wx.common.WxContants;
 import com.emato.cuspay.wx.common.WxDict;
 import com.emato.cuspay.common.contant.TablePrimaryKeyPrefix;
 import com.emato.cuspay.common.core.db.IdWorkerAide;
 import com.emato.cuspay.dao.mapper.merch.MerchNotiMapper;
-import com.emato.cuspay.dao.mapper.wx.WxCbPayDocMapper;
-import com.emato.cuspay.dto.WxResponseMsg;
+import com.emato.cuspay.wx.dto.WxResponseMsg;
 import com.emato.cuspay.dto.merch.MerchNoti;
 import com.emato.cuspay.dto.merch.MerchPayCfg;
-import com.emato.cuspay.dto.wx.WxCbPayDoc;
-import com.emato.cuspay.dto.wx.WxPayError;
+import com.emato.cuspay.wx.dao.entity.WxCbPayDoc;
+import com.emato.cuspay.wx.dao.entity.WxPayError;
 import com.emato.cuspay.util.OkHttpUtils;
 import com.emato.cuspay.util.XmlUtils;
+import com.emato.cuspay.wx.service.WxCbPayDocService;
+import com.emato.cuspay.wx.service.WxPayErrorService;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import okhttp3.MediaType;
@@ -55,10 +61,16 @@ public class WxCusDeclare extends AbstractCusDeclare implements CusDeclare{
 
 
     @Autowired
-    private WxCbPayDocMapper wxCbPayDocMapper;
+    private WxCbPayDocService wxCbPayDocService;
 
     @Autowired
-    private MerchNotiMapper merchNotiMapper;
+    private WxPayErrorService wxPayErrorService;
+
+    @Autowired
+    private MerchNotiService merchNotiService;
+
+    @Autowired
+    private MerchCusService merchCusService;
 
     /**
      * 海关报关接口
@@ -67,35 +79,77 @@ public class WxCusDeclare extends AbstractCusDeclare implements CusDeclare{
         limit = (limit != null && limit > 0) ? limit : 20;
         count = (count != null && count > 0) ? count : 10;
 
-        List<WxCbPayDoc> wxCbPayDocs = wxCbPayDocMapper.selectBeDeclaredData(limit);
+        List<WxCbPayDoc> wxCbPayDocs = wxCbPayDocService.selectBeDeclaredData(limit);
 
         if (wxCbPayDocs == null || wxCbPayDocs.isEmpty()) {
             logger.info("没有待申报微信推海关的支付数据");
             return;
         }
 
+        //更新状态申报中
+        wxCbPayDocs.forEach(wxCbPayDoc -> {
+           wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_01.getItem());
+        });
+        int wxResult = wxCbPayDocService.updateBatch(wxCbPayDocs);
+        if (wxResult < 0) {
+            logger.error("批量更新待申报的微信推海关支付数据失败size:"+wxCbPayDocs.size()+" data:"+wxCbPayDocs);
+        }
+
+
         //记录异常数据
-        List<WxCbPayDoc> docs = Lists.newArrayList();
         List<WxPayError> errors = Lists.newArrayList();
+        //待通知的用户
+        List<MerchNoti> merchNotis = Lists.newArrayList();
 
         //修改数支付单状态为申报中
 
         wxCbPayDocs.forEach(wxCbPayDoc -> {
+
             //获取商户信息 从缓存中去  缓存不存在 从数据库重取
             MerchPayCfg merchPayCfg = getMerchPayCfgCache(wxCbPayDoc.getMerchSn());
 
+            MerchNotiBuilder builder = new MerchNotiBuilder();
+
+            //设置支付信息
+            builder.wxCbPay(wxCbPayDoc);
+            //设置通知次数
+            builder.notiCount(count);
+
             if (merchPayCfg == null) {
                 logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
+                wxCbPayDoc.setReturnCode(WxContants.ERROR_NO_INFOMATION);
+                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+
+                MerchNoti merchNoti = builder.code(WxContants.ERROR_NO_INFOMATION)
+                                .msg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在")
+                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                .build();
+                merchNotis.add(merchNoti);
                 return;
             }
 
             if (merchPayCfg.getMerchWxApiKey() == null) {
                 logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空");
+                wxCbPayDoc.setReturnCode(WxContants.ERROR_NO_INFOMATION);
+                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+
+                MerchNoti merchNoti = builder.code(WxContants.ERROR_NO_API_KEY)
+                        .msg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空")
+                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                        .build();
+                merchNotis.add(merchNoti);
                 return;
             }
+            //设置商户配置信息
+            builder.merchPay(merchPayCfg);
 
             //组装xml 格式数据
             String xml = XmlUtils.map2Xml(assemblyDeclareXml(wxCbPayDoc, merchPayCfg.getMerchWxApiKey()));
+            logger.info("微信支付报关请求数xml据为:"+xml);
 
             //通过http post请求 发送xml数据
             Request request = OkHttpUtils.buildRequest(declareURL,
@@ -110,141 +164,167 @@ public class WxCusDeclare extends AbstractCusDeclare implements CusDeclare{
                     throw new IOException("http请求["+declareURL+"]响应结果为空" );
                 }
                 ///返回状态码为失败
-                if (RETURN_CODE_FAIL.equals(wxResponseMsgDto.getReturnCode()) ||
-                        FAIL.equals(wxResponseMsgDto.getReturnCode())) {
+                if (WxContants.RETURN_CODE_FAIL.equals(wxResponseMsgDto.getReturnCode()) ||
+                        WxContants.FAIL.equals(wxResponseMsgDto.getReturnCode())) {
 
                     wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
                     wxCbPayDoc.setResultCode(wxResponseMsgDto.getReturnCode());
                     wxCbPayDoc.setReturnMsg(wxResponseMsgDto.getReturnMsg());
-                    wxCbPayDocMapper.insertSelective(wxCbPayDoc);
+                    wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
                     //通知商户
-                    MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                    merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem());
-                    merchNoti.setCode("-1");
-                    merchNoti.setMsg(wxResponseMsgDto.getReturnMsg());
-
-                    merchNotiMapper.insertSelective(merchNoti);
-
+                    MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
+                                    .msg(wxResponseMsgDto.getReturnMsg())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                    .build();
+                    merchNotis.add(merchNoti);
                 }
 
                 //返回这状态码为成功 业务结果成功
-                if (SUCCESS.equals(wxResponseMsgDto.getReturnCode()) && SUCCESS.equals(wxResponseMsgDto.getResultCode())) {
+                if (WxContants.SUCCESS.equals(wxResponseMsgDto.getReturnCode())
+                            && WxContants.SUCCESS.equals(wxResponseMsgDto.getResultCode())) {
                     wxCbPayDoc.setReturnCode(wxResponseMsgDto.getReturnCode());
                     wxCbPayDoc.setReturnMsg(wxResponseMsgDto.getReturnMsg());
                     wxCbPayDoc.setResultCode(wxResponseMsgDto.getResultCode());
 
+                    //订购人与支付人校验结果
+                    builder.certCheckResult(wxResponseMsgDto.getCertCheckResult());
+
                     //返回状态未申报
                     if (WxDict.ResponseMsgState.UNDECLARED.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_01.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_10.getItem()); //等待海关处理
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
+                                        .msg("未申报")
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                        .build();
+                        merchNotis.add(merchNoti);
                     }
 
                     //申报中
                     if (WxDict.ResponseMsgState.PROCESSING.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_01.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem());//海关处理中
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                        .msg(wxResponseMsgDto.getErrCodeDes())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                        .build();
+                        merchNotis.add(merchNoti);
                     }
 
                     //申报已提交
                     if (WxDict.ResponseMsgState.SUBMITTED.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_10.getItem());//等待海关处理
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                .msg(wxResponseMsgDto.getErrCodeDes())
+                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                .build();
+                        merchNotis.add(merchNoti);
 
                     }
                     //申报成功
                     if (WxDict.ResponseMsgState.SUCCESS.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_11.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem());
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                .msg(wxResponseMsgDto.getErrCodeDes())
+                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                .build();
+                        merchNotis.add(merchNoti);
                     }
                     //申报失败
                     if (WxDict.ResponseMsgState.FAIL.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem());
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
+                                    .msg("海关申报失败")
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                .build();
+                        merchNotis.add(merchNoti);
                     }
                     //海关接口异常
                     if (WxDict.ResponseMsgState.EXCEPT.getItem().equals(wxResponseMsgDto.getState())) {
                         wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
-                        wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                        MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                        merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem());
-                        merchNotiMapper.insertSelective(merchNoti);
+                        MerchNoti merchNoti = builder.code(WxContants.ERROR_EXCEPT)
+                                    .msg("海关接口异常")
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                    .build();
+                        merchNotis.add(merchNoti);
                     }
 
 
                 }
 
                 //返回状态码为成功 业务结果失败
-                if (SUCCESS.equals(wxResponseMsgDto.getReturnCode()) && FAIL.equals(wxResponseMsgDto.getResultCode())) {
+                if (WxContants.SUCCESS.equals(wxResponseMsgDto.getReturnCode())
+                            && WxContants.FAIL.equals(wxResponseMsgDto.getResultCode())) {
                     wxCbPayDoc.setResultCode(wxResponseMsgDto.getResultCode());
                     wxCbPayDoc.setErrCode(wxResponseMsgDto.getErrCode());
                     wxCbPayDoc.setErrCodeDes(wxResponseMsgDto.getErrCodeDes());
                     wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_12.getItem());
-                    wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
-
-                    MerchNoti merchNoti = assemblyMerchNoti(wxCbPayDoc, merchPayCfg);
-                    merchNoti.setCode(wxResponseMsgDto.getErrCode());
-                    merchNoti.setMsg(wxResponseMsgDto.getErrCodeDes());
-                    merchNoti.setCusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem());
+                    wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
+                    MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                .msg(wxResponseMsgDto.getErrCodeDes())
+                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                .build();
+                    merchNotis.add(merchNoti);
                 }
 
             } catch (IOException e) {
-                docs.add(wxCbPayDoc);
-                WxPayError wxPayError = new WxPayError();
+                WxPayError wxPayError = createWxPayError(wxCbPayDoc);
                 errors.add(wxPayError);
             }
         });
 
-        //存储异常记录
+        //持久化商户通知数据
+        int result = merchNotiService.insertBatch(merchNotis);
+        if (result < 0) {
+            logger.error("持久化"+result+"条商户通知数据失败data:"+merchNotis);
+        }
 
+        //存储异常记录
+        if (errors != null && !errors.isEmpty()) {
+            int errResult = wxPayErrorService.insertWxPayErrorBatch(errors);
+            if (errResult < 0) {
+                logger.error("持久化支付申报异常信息数据失败data:"+errors);
+            }
+        }
     }
 
-    private MerchNoti assemblyMerchNoti(WxCbPayDoc wxCbPayDoc, MerchPayCfg merchPayCfg) {
-        MerchNoti merchNoti = new MerchNoti();
-        merchNoti.setNotiSn(TablePrimaryKeyPrefix.merch_pay_noti_type + IdWorkerAide.nextId());
-        merchNoti.setAllPaySn(wxCbPayDoc.getTransactionId());
-        merchNoti.setMerchSn(wxCbPayDoc.getMerchSn());
-        merchNoti.setMerchSn(wxCbPayDoc.getMerchName());
-        merchNoti.setPlatSn(wxCbPayDoc.getPlatSn());
-        merchNoti.setPlatName(wxCbPayDoc.getPlatName());
-        merchNoti.setThirdPartyMerchCode(wxCbPayDoc.getThirdPartyMerchCode());
-        merchNoti.setThirdPartyMerchName(wxCbPayDoc.getThirdPartyMerchName());
-        merchNoti.setAllMerchId(wxCbPayDoc.getMchId());
-        merchNoti.setAllOrderNo(wxCbPayDoc.getOutTradeNo());
-        merchNoti.setAllPayNo(wxCbPayDoc.getTransactionId());
-        merchNoti.setAllSubOrderNo(wxCbPayDoc.getSubOrderNo());
-        merchNoti.setNotiCount(count);
-
-        merchNoti.setIsStoped(WxDict.IsStopStatus.i_0.getItem());
-        merchNoti.setNotiStatue(WxDict.NoticeStatus.i_0.getItem());
-
-        merchNoti.setPayChnlFlag(merchPayCfg.getPayChnlFlag());
-        merchNoti.setNotifyUrl(merchPayCfg.getNotifyUrl());
-        return merchNoti;
+    /**
+     * 记录异常的支付单证信息
+     * @param wxCbPayDoc
+     * @return
+     */
+    private WxPayError createWxPayError(WxCbPayDoc wxCbPayDoc) {
+        WxPayError wxPayError = new WxPayError();
+        wxPayError.setErrorSn(TablePrimaryKeyPrefix.wx_pay_error_type + IdWorkerAide.nextId());
+        wxPayError.setWxPaySn(wxCbPayDoc.getTransactionId());
+        wxPayError.setMerchSn(wxCbPayDoc.getMerchSn());
+        wxPayError.setMerchName(wxCbPayDoc.getMerchName());
+        wxPayError.setAppid(wxCbPayDoc.getAppid());
+        wxPayError.setMchId(wxCbPayDoc.getMchId());
+        wxPayError.setOutTradeNo(wxCbPayDoc.getOutTradeNo());
+        wxPayError.setTransactionId(wxCbPayDoc.getTransactionId());
+        wxPayError.setSubOrderNo(wxCbPayDoc.getSubOrderNo());
+        wxPayError.setCustoms(wxCbPayDoc.getCustoms());
+        wxPayError.setErrCode(wxCbPayDoc.getErrCode());
+        wxPayError.setErrMsg(wxCbPayDoc.getReturnMsg());
+        return  wxPayError;
     }
 
+
+
     /**
      * 组装报关所需要的报关数据
      * @param wxCbPayDoc 微信支付数据
@@ -310,8 +390,8 @@ public class WxCusDeclare extends AbstractCusDeclare implements CusDeclare{
         WxCbPayDoc wxCbPayDoc = new WxCbPayDoc();
         wxCbPayDoc.setAppid("wxd678efh567hg6787");
         wxCbPayDoc.setMchId("1501125641");
-        wxCbPayDoc.setOutTradeNo("20150806125346");
-        wxCbPayDoc.setTransactionId("1000320306201511078440737890");
+        wxCbPayDoc.setOutTradeNo("205598019850");
+        wxCbPayDoc.setTransactionId("401020180502000000011943");
         wxCbPayDoc.setCustoms("SHENZHEN");
         wxCbPayDoc.setMchCustomsNo("4403160Z3Y");//中网科技(深圳)有限公司
 

+ 1 - 1
src/main/java/com/emato/cuspay/wx/dto/WxResponseMsg.java

@@ -1,4 +1,4 @@
-package com.emato.cuspay.dto;
+package com.emato.cuspay.wx.dto;
 
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;

+ 17 - 8
src/main/java/com/emato/cuspay/wx/service/impl/WxCbPayDocServiceImpl.java

@@ -1,19 +1,16 @@
-package com.emato.cuspay.service.wx.impl;
+package com.emato.cuspay.wx.service.impl;
+
 
-import com.emato.cuspay.common.contant.Dict;
 import com.emato.cuspay.common.contant.TablePrimaryKeyPrefix;
 import com.emato.cuspay.common.core.db.IdWorkerAide;
-import com.emato.cuspay.dao.mapper.merch.MerchCusCfgMapper;
 import com.emato.cuspay.dao.mapper.merch.MerchPayCfgMapper;
 import com.emato.cuspay.dao.mapper.wx.WxCbPayDocMapper;
-import com.emato.cuspay.dto.merch.MerchCusCfg;
-import com.emato.cuspay.dto.wx.WxCbPayDoc;
-import com.emato.cuspay.service.wx.WxCbPayDocService;
+import com.emato.cuspay.wx.dao.entity.WxCbPayDoc;
 import com.emato.cuspay.support.msg.resp.ResponseMessage;
 import com.emato.cuspay.support.msg.resp.ResponseStatus;
 import com.emato.cuspay.util.jackson.JacksonUtil;
 import com.emato.cuspay.wx.common.WxDict;
-import com.google.common.base.Strings;
+import com.emato.cuspay.wx.service.WxCbPayDocService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -26,7 +23,7 @@ import java.util.List;
  * 2018-05-18 16:05
  */
 @Service
-public class WxCbPayDocServiceImpl implements WxCbPayDocService{
+public class WxCbPayDocServiceImpl implements WxCbPayDocService {
     @Autowired
     private WxCbPayDocMapper wxCbPayDocMapper;
 
@@ -60,4 +57,16 @@ public class WxCbPayDocServiceImpl implements WxCbPayDocService{
         return  new ResponseMessage.Builder().setCode(ResponseStatus.ERROR.getItem()).setMsg("入库失败")
                 .build();
     }
+
+    public List<WxCbPayDoc> selectBeDeclaredData(Integer limit) {
+        return wxCbPayDocMapper.selectBeDeclaredData(limit);
+    }
+
+    public int updateWxCbPay(WxCbPayDoc wxCbPayDoc) {
+        return wxCbPayDocMapper.updateByPrimaryKeySelective(wxCbPayDoc);
+    }
+
+    public int updateBatch(List<WxCbPayDoc> wxCbPayDocs) {
+        return  wxCbPayDocMapper.updateBatch(wxCbPayDocs);
+    }
 }

+ 19 - 1
src/main/java/com/emato/cuspay/wx/task/WxCusTimer.java

@@ -1,9 +1,27 @@
 package com.emato.cuspay.wx.task;
 
+import com.emato.cuspay.wx.declare.CusDeclare;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
 /**
- * @author zengjun
+ * @author zx
  * @version 1.0
  * 2018-05-19 14:49
  */
+
+@Component
 public class WxCusTimer {
+
+    @Autowired
+    private CusDeclare wxCusDeclare;
+
+    /**
+     * 支付申报定时任务
+     */
+    @Scheduled(fixedRate = 10000)
+    public void declareTask() {
+        wxCusDeclare.declare();
+    }
 }