Prechádzať zdrojové kódy

对公转账流程,,生产环境账号申请中

lishiqiang 2 týždňov pred
rodič
commit
9a4ede6560

+ 6 - 0
ship-module-ota/ship-module-ota-api/src/main/java/com/yc/ship/module/ota/api/OtaDistributorApi.java

@@ -2,8 +2,12 @@ package com.yc.ship.module.ota.api;
 
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.module.ota.api.dto.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.tags.Tag;
 
+import javax.annotation.security.PermitAll;
+import javax.validation.Valid;
 import java.util.List;
 
 @Tag(name = "API 服务 - 订单")
@@ -18,6 +22,8 @@ public interface OtaDistributorApi {
 
     DistributorRespDTO getDistributorById(Long id);
 
+    CommonResult<?> distributorCMBRecharge(DistributorSelfRechargeReqDTO payNotifyReqDTO);
+
     /**
      * 分销商交易充值
      *

+ 6 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/api/OtaDistributorApiImpl.java

@@ -52,6 +52,12 @@ public class OtaDistributorApiImpl implements OtaDistributorApi{
         return BeanUtils.toBean(distributor, DistributorRespDTO.class);
     }
 
+    @Override
+    public CommonResult<?> distributorCMBRecharge(DistributorSelfRechargeReqDTO payNotifyReqDTO) {
+        Long id = distributorSelfRechargeService.distributorCMBRecharge(payNotifyReqDTO.getOrderId(), payNotifyReqDTO.getPayOrderId(), payNotifyReqDTO.getPayStatus());
+        return CommonResult.success(id);
+    }
+
     @Override
     public CommonResult<DistributorProductRespDTO> getDistributorProductById(Long distributorProductId) {
         return distributorProductService.getDistributorProductById(distributorProductId);

+ 2 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/distributor/DistributorMapper.java

@@ -130,4 +130,6 @@ public interface DistributorMapper extends BaseMapperX<DistributorDO> {
                 .eq(DistributorDO::getIsUse, true)
                 .orderByDesc(DistributorDO::getId));
     }
+    @TenantIgnore
+    List<DistributorDO> selectChildNo();
 }

+ 14 - 1
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/job/ABCQueryJob.java

@@ -2,11 +2,14 @@ package com.yc.ship.module.ota.job;
 
 import com.yc.ship.framework.quartz.core.handler.JobHandler;
 import com.yc.ship.framework.tenant.core.job.TenantJob;
+import com.yc.ship.module.ota.dal.dataobject.distributor.DistributorDO;
+import com.yc.ship.module.ota.service.distributor.DistributorService;
 import com.yc.ship.module.ota.service.distributorselfrecharge.DistributorSelfRechargeService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @Slf4j
 @Component
@@ -15,10 +18,20 @@ public class ABCQueryJob implements JobHandler {
     @Resource
     private DistributorSelfRechargeService distributorSelfRechargeService;
 
+    @Resource
+    private DistributorService distributorService;
+
     @Override
     @TenantJob
     public String execute(String param) {
-        distributorSelfRechargeService.abcRemittance();
+        List<DistributorDO> list = distributorService.selectChildNo();
+        list.forEach(distributorDO -> {
+            try {
+                distributorSelfRechargeService.abcRemittance(distributorDO);
+            } catch (Exception e) {
+                log.error(distributorDO.getId()+"查询失败",e);
+            }
+        });
         return "成功";
     }
 }

+ 3 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributor/DistributorService.java

@@ -95,6 +95,9 @@ public interface DistributorService {
 
     List<DistributorDO> selectListByType(Integer type);
 
+
+    List<DistributorDO> selectChildNo();
+
     List<DistributorRespVO> getOtcDistributor(Integer type, Long productId);
 
     /**

+ 6 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributor/DistributorServiceImpl.java

@@ -667,6 +667,12 @@ public class DistributorServiceImpl implements DistributorService {
     public List<DistributorDO> selectListByType(Integer type) {
         return distributorMapper.selectListByType(type);
     }
+
+    @Override
+    public List<DistributorDO> selectChildNo() {
+        return distributorMapper.selectChildNo();
+    }
+
     @Override
     public List<DistributorRespVO> getOtcDistributor(Integer type, Long productId) {
         return distributorMapper.getOtcDistributorWithId(type, productId);

+ 2 - 1
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributorselfrecharge/DistributorSelfRechargeService.java

@@ -4,6 +4,7 @@ import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.module.ota.controller.admin.distributorselfrecharge.vo.DistributorSelfRechargePageReqVO;
 import com.yc.ship.module.ota.controller.admin.distributorselfrecharge.vo.DistributorSelfRechargeSaveReqVO;
 import com.yc.ship.module.ota.controller.admin.distributorselfrecharge.vo.DistributorSelfRechargeSimpleRespVO;
+import com.yc.ship.module.ota.dal.dataobject.distributor.DistributorDO;
 import com.yc.ship.module.ota.dal.dataobject.distributorselfrecharge.DistributorSelfRechargeDO;
 
 import javax.validation.Valid;
@@ -55,5 +56,5 @@ public interface DistributorSelfRechargeService {
 
     Long distributorSelfRecharge(Long id, String payOrderId, Integer payStatus);
     Long distributorCMBRecharge(Long id, String payOrderId, Integer payStatus);
-    void abcRemittance();
+    void abcRemittance(DistributorDO distributorDO);
 }

+ 111 - 15
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributorselfrecharge/DistributorSelfRechargeServiceImpl.java

@@ -1,7 +1,9 @@
 package com.yc.ship.module.ota.service.distributorselfrecharge;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.XML;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.yc.ship.framework.common.pojo.PageResult;
@@ -9,6 +11,8 @@ import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.framework.security.core.LoginUser;
 import com.yc.ship.framework.tenant.core.util.TenantUtils;
 import com.yc.ship.module.infra.api.config.ConfigApi;
+import com.yc.ship.module.ota.api.OtaDistributorApi;
+import com.yc.ship.module.ota.api.dto.DistributorSelfRechargeReqDTO;
 import com.yc.ship.module.ota.controller.admin.distributor.vo.LoginTypeRespVO;
 import com.yc.ship.module.ota.controller.admin.distributorselfrecharge.vo.DistributorSelfRechargePageReqVO;
 import com.yc.ship.module.ota.controller.admin.distributorselfrecharge.vo.DistributorSelfRechargeSaveReqVO;
@@ -30,11 +34,12 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
+import java.math.BigDecimal;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicReference;
@@ -67,6 +72,9 @@ public class DistributorSelfRechargeServiceImpl implements DistributorSelfRechar
     @Resource
     private AdminUserApi userApi;
 
+    @Resource
+    private OtaDistributorApi otaDistributorApi;
+
     @Resource
     private TradeApi tradeApi;
 
@@ -253,16 +261,22 @@ public class DistributorSelfRechargeServiceImpl implements DistributorSelfRechar
     }
 
     @Override
-    public void abcRemittance() {
+    public void abcRemittance(DistributorDO distributor) {
+        String cardNo = distributor.getCmbShortNo();
         log.info("abc对公转账充值");
         String host = configApi.getPlatformConfigValueByKey("dgConfig_ip");
         String portStr = configApi.getPlatformConfigValueByKey("dgConfig_port");
-        String name = configApi.getPlatformConfigValueByKey("dgConfig_name");
-        String yqtNo = configApi.getPlatformConfigValueByKey("dgConfig_no");
-        String yqtPro = configApi.getPlatformConfigValueByKey("dgConfig_pro");
         String yqtCard = configApi.getPlatformConfigValueByKey("dgConfig_card");
+        String day = configApi.getPlatformConfigValueByKey("dgConfig_day");
+        int ofday = 1;
+        if(StringUtils.isNotBlank(day)){
+            try {
+                ofday = Integer.parseInt(day);
+            }catch (Exception ignored){
+
+            }
+        }
 
-//        String host = "10.1.10.105";
         int port = 15999;
         if(StringUtils.isNotBlank(portStr)){
             try {
@@ -280,12 +294,21 @@ public class DistributorSelfRechargeServiceImpl implements DistributorSelfRechar
             Random random = new Random();
             int randomNumber2 = random.nextInt(1000) + 1000;
             String reqSeqNo = new SimpleDateFormat("yyyyMMddHHmmss").format(now) + ""+randomNumber2+"";
+
+            // 1. 获取当前时间,用于组装公共包头流水与日期
+            Long s1 = System.currentTimeMillis();
+            Long s0 = s1-172800000;
+
+            Date sDate = DateUtil.offsetDay( now,-ofday);
+            String endDate = new SimpleDateFormat("yyyyMMdd").format(now);
+            String startDate = new SimpleDateFormat("yyyyMMdd").format(sDate);
+
             // 2. 构造 CMLT40 增加多级账簿 XML 请求报文
             String xmlData = "<ap>\n" +
-                    "  <CCTransCode>CQRA10</CCTransCode>\n" +
+                    "  <CCTransCode>CQRD02</CCTransCode>\n" +
                     "  <ProductID>ICC</ProductID>\n" +
                     "  <ChannelType>ERP</ChannelType>\n" +
-                    "  <CorpNo>"+yqtNo+"</CorpNo>\n" +
+                    "  <CorpNo></CorpNo>\n" +
                     "  <OpNo></OpNo>\n" +
                     "  <AuthNo></AuthNo>\n" +
                     "  <ReqSeqNo>" + reqSeqNo + "</ReqSeqNo>\n" +
@@ -293,14 +316,16 @@ public class DistributorSelfRechargeServiceImpl implements DistributorSelfRechar
                     "  <ReqTime>" + reqTime + "</ReqTime>\n" +
                     "  <Sign></Sign>\n" +
                     "  <Corp>\n" +
-                    "    <StartDate>0</StartDate>\n" +
-                    "    <EndDate>F</EndDate>\n" +
+                    "    <StartDate>"+startDate+"</StartDate>\n" +
+                    "    <EndDate>"+endDate+"</EndDate>\n" +
                     "  </Corp>\n" +
                     "  <Cmp>\n" +
-                    "    <DbProv>"+yqtPro+"</DbProv>\n" +
+                    "    <DbProv>17</DbProv>\n" +
+                    "    <StartTime>"+s0+"</StartTime>\n" +
                     "    <DbAccNo>"+yqtCard+"</DbAccNo>\n" +
+                    "    <DbLogAccNo>"+cardNo+"</DbLogAccNo>\n" +
                     "    <DbCur>01</DbCur>\n" +
-                    "    <StartTime></StartTime>\n" +
+                    "    <LogAccBkOInd>0</LogAccBkOInd>\n" +
                     "  </Cmp>\n" +
                     "</ap>";
 
@@ -361,8 +386,79 @@ public class DistributorSelfRechargeServiceImpl implements DistributorSelfRechar
                 if(!"0000".equals(respCode)){
                     System.err.println("交易发送异常,异常信息:"+ap.getStr("RespInfo"));
                 }else {
-                    String resultCode = ap.getJSONObject("Cmp").getStr("DbLogAccNo");
-                    System.err.println("卡号:" + resultCode);
+                    System.out.println("交易发送成功");
+
+                    // 使用 try-with-resources 自动关闭流 //替换成文件目录
+                    try (FileInputStream fis = new FileInputStream("C:\\Users\\90653\\Desktop\\aaa.txt");
+                         InputStreamReader isr = new InputStreamReader(fis, "GBK");
+                         BufferedReader br = new BufferedReader(isr)) {
+
+                        String line;
+                        while ((line = br.readLine()) != null) {
+                            System.out.println(line);
+                            //省市代码|账号|账薄号|货币码|交易日期|日志号|交易时间|户名|账薄名|交易类型|交
+                            //易行号|传票号|发生额标识|现转标志|交易金额|账户余额|上笔余额|凭证种类|交易码|
+                            //凭证号|对方账号省市代码|对方账号|对方账号货币码|对方账号户名|对方账号开户行|
+                            //错账日期|错账传票号|记账柜员|摘要|附言|红蓝字标识|备注 1|备注 2|
+                            //17|342101046484369|1203444786|01|20260423|1527670363|20260423112009578611|宜畅式东士煌本孔凰于慊官送|宜畅式东士煌本孔凰于慊官送重庆万友国际旅行社
+                            // |0||3|0|1|30.00|30.00|0.00|2|2581|00000000|17|342101046420983||宜常收镐赛坭足克凰幼慊关嗣|中国农业银行股份有限公司枝江市支行||||0199|测试3||||
+                            String[] split = line.split("\\|");
+                            String refNbr  = split[5];
+                            String logTime = split[6];
+                            String recardNo = split[2];
+                            String trsAmt = split[14];
+                            System.err.println("日志号:" + refNbr);
+                            System.err.println("交易时间:" + logTime);
+                            System.err.println("卡号:" + recardNo);
+                            System.err.println("金额:" + trsAmt);
+
+
+                            LambdaQueryWrapper<DistributorSelfRechargeDO> existCheckWrapper = new LambdaQueryWrapper<>();
+                            existCheckWrapper.eq(DistributorSelfRechargeDO::getRechargeNo, refNbr);
+                            if (distributorSelfRechargeMapper.selectCount(existCheckWrapper) > 0) {
+                                log.warn("refNbr [{}] 已存在,跳过重复插入", refNbr);
+                                return;
+                            }
+
+                            try {
+                                DistributorSelfRechargeDO newRecharge = new DistributorSelfRechargeDO();
+                                newRecharge.setId(IdWorker.getId());
+                                newRecharge.setDistributorId(distributor.getId());
+                                newRecharge.setRechargeNo(refNbr);
+                                newRecharge.setMoney(new BigDecimal(trsAmt).setScale(2));
+                                newRecharge.setRechargeState(0);
+                                newRecharge.setPayType(9);
+                                newRecharge.setAccountId(distributor.getAccountTenantId());
+                                newRecharge.setAccountName(distributor.getName());
+                                newRecharge.setCreator(distributor.getName());
+                                newRecharge.setTenantId(distributor.getTenantId());
+                                newRecharge.setCreateTime(LocalDateTime.now());
+                                newRecharge.setUpdateTime(LocalDateTime.now());
+
+                                TenantUtils.execute(distributor.getTenantId(), () -> {
+                                    distributorSelfRechargeMapper.insert(newRecharge);
+                                });
+                                log.info("成功插入充值记录 | refNbr:{}", refNbr);
+                                DistributorSelfRechargeReqDTO reqDTO = new DistributorSelfRechargeReqDTO();
+                                reqDTO.setOrderId(newRecharge.getId());
+                                reqDTO.setPayOrderId(refNbr);
+                                reqDTO.setPayStatus(1);
+
+                                try {
+                                    otaDistributorApi.distributorCMBRecharge(reqDTO).getCheckedData();
+                                    log.error("充值通知成功 | orderId:{}", newRecharge.getId());
+                                } catch (Exception e) {
+                                    log.error("充值通知失败 | orderId:{}", newRecharge.getId(), e);
+                                }
+                            } catch (NumberFormatException e) {
+                                log.error("金额格式错误 | trsamt:{}", trsAmt, e);
+                            }
+
+                        }
+
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
                 }
             } else {
                 System.out.println("响应报文异常或为空");

+ 4 - 0
ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/distributor/DistributorMapper.xml

@@ -221,4 +221,8 @@
         AND od.id = #{distributorId}
         ORDER BY p.id,p.update_time
     </select>
+
+    <select id="selectChildNo" resultType="com.yc.ship.module.ota.dal.dataobject.distributor.DistributorDO">
+        select * from ota_distributor where deleted = 0 and is_use = 1 and cmb_short_no is not null
+    </select>
 </mapper>

+ 55 - 21
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/CMLT40Demo.java

@@ -1,6 +1,7 @@
 package com.yc.ship.module.trade.utils;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.XML;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.*;
 import java.net.Socket;
@@ -9,6 +10,7 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 
 
+@Slf4j
 public class CMLT40Demo {
 
     public static void main(String[] args) {
@@ -22,13 +24,15 @@ public class CMLT40Demo {
             String reqTime = new SimpleDateFormat("HHmmss").format(now);
             // 构造请求方流水号 (保证唯一性)
             String reqSeqNo = new SimpleDateFormat("yyyyMMddHHmmss").format(now) + "0001";
+            Long s1 = System.currentTimeMillis();
+            Long s0 = s1-172800000;
 
             // 2. 构造 CMLT40 增加多级账簿 XML 请求报文
             String xmlData = "<ap>\n" +
-                    "  <CCTransCode>CMLT40</CCTransCode>\n" +
+                    "  <CCTransCode>CQRD02</CCTransCode>\n" +
                     "  <ProductID>ICC</ProductID>\n" +
                     "  <ChannelType>ERP</ChannelType>\n" +
-                    "  <CorpNo>17999953800000028</CorpNo>\n" +
+                    "  <CorpNo></CorpNo>\n" +
                     "  <OpNo></OpNo>\n" +
                     "  <AuthNo></AuthNo>\n" +
                     "  <ReqSeqNo>" + reqSeqNo + "</ReqSeqNo>\n" +
@@ -36,29 +40,16 @@ public class CMLT40Demo {
                     "  <ReqTime>" + reqTime + "</ReqTime>\n" +
                     "  <Sign></Sign>\n" +
                     "  <Corp>\n" +
-                    "    <DbLogAccName>宜畅式东士煌本孔凰于慊官送测试子账号2</DbLogAccName>\n" +
-                    "    <IntTyp>0</IntTyp>\n" +
-                    "    <DbIntType>F</DbIntType>\n" +
-                    "    <DbRit>0.00</DbRit>\n" +
-                    "    <DbAddType>1</DbAddType>\n" +
-                    "    <DbRatType>00002000</DbRatType>\n" +
-                    "    <DbRatPct>0.00</DbRatPct>\n" +
-                    "    <DbRatAdd>0.00</DbRatAdd>\n" +
-                    "    <CrIntType>F</CrIntType>\n" +
-                    "    <CrRit>0.00</CrRit>\n" +
-                    "    <CrAddType>1</CrAddType>\n" +
-                    "    <CrRatType>00002000</CrRatType>\n" +
-                    "    <CrRatPct>0.00</CrRatPct>\n" +
-                    "    <CrRatAdd>0.00</CrRatAdd>\n" +
-                    "    <PmtHd>01</PmtHd>\n" +
-                    "    <ActInf>0</ActInf>\n" +
+                    "    <StartDate>20260420</StartDate>\n" +
+                    "    <EndDate>20260424</EndDate>\n" +
                     "  </Corp>\n" +
                     "  <Cmp>\n" +
                     "    <DbProv>17</DbProv>\n" +
+                    "    <StartTime>"+s0+"</StartTime>\n" +
                     "    <DbAccNo>342101046484369</DbAccNo>\n" +
-                    "    <DbLogAccNo>0000000006</DbLogAccNo>\n" +
+//                    "    <DbLogAccNo>0000000000</DbLogAccNo>\n" +
+                    "    <DbLogAccNo>1203444786</DbLogAccNo>\n" +
                     "    <DbCur>01</DbCur>\n" +
-                    "    <CrLogAccNo>0000000000</CrLogAccNo>\n" +
                     "    <LogAccBkOInd>0</LogAccBkOInd>\n" +
                     "  </Cmp>\n" +
                     "</ap>";
@@ -90,7 +81,6 @@ public class CMLT40Demo {
             out.flush();
             System.out.println("请求报文发送成功,等待响应...\n");
             System.out.println("请求报文发送成功,等待响应...\n"+new String(fullPacket, "GBK"));
-
 //            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
 //            PrintWriter out2 = new PrintWriter(socket.getOutputStream(), true);
 //
@@ -127,6 +117,50 @@ public class CMLT40Demo {
                 String respCode = ap.getStr("RespCode");
                 if(!"0000".equals(respCode)){
                     System.err.println("交易发送异常,异常信息:"+ap.getStr("RespInfo"));
+                    //{
+                    //    "ap": {
+                    //        "CCTransCode": "CQRD02",
+                    //        "RespDate": 20260428,
+                    //        "RespTime": 105107,
+                    //        "Channel": {
+                    //            "AccDate": 20260428,
+                    //            "JrnNo": "FC24902142",
+                    //            "VchNo": 0,
+                    //            "RespInfo": "",
+                    //            "RxtInfo": "",
+                    //            "AbisRespCode": "0000"
+                    //        },
+                    //        "Cmp": {
+                    //            "ContFlag": 0,
+                    //            "QueryCnt": 0,
+                    //            "BatchFileName": "CQRD02.17999953800000028.GS202604281051000577-D-Q",
+                    //            "RespPrvData": ""
+                    //        },
+                    //        "Corp": {
+                    //            "DbAccName": "",
+                    //            "DbLogAccName": ""
+                    //        },
+                    //        "Cme": {
+                    //            "RespHead": "Prov|AccNo|LogAccNo|Cur|TrDate|TrJrn|TrTime|AccName|LogAccName|TrType|TrBankNo|CreNo|AmtIndex|CshIndex|Amt|Bal|OvdAmt|VchType|TrCode|VchNo|OppProv|OppAccNo|OppCur|OppName|OppBank|ErrDate|ErrVch|Teller|Abs|Cmt|SpFlag|FmtCode|SpecInfo|",
+                    //            "RecordNum": 2,
+                    //            "FieldNum": 33
+                    //        },
+                    //        "RespSeqNo": "",
+                    //        "RespSource": 0,
+                    //        "RespCode": "0000",
+                    //        "RespInfo": "交易成功",
+                    //        "RxtInfo": "交易成功",
+                    //        "FileFlag": 1
+                    //    }
+                    //}
+                    JSONObject cmp = ap.getJSONObject("Cmp");
+                    JSONObject cme = ap.getJSONObject("Cme");
+                    String batchFileName = cmp.getStr("BatchFileName");
+                    String recordNum = cme.getStr("RecordNum");
+                    if(!"0".equals(recordNum)){
+                        log.info("批次文件名:" + batchFileName);
+                    }
+                    String respHead = cme.getStr("RespHead");
                 }else {
                     String cardNo = ap.getJSONObject("Cmp").getStr("DbLogAccNo");
                     System.err.println("卡号:" + cardNo);