Pārlūkot izejas kodu

Merge branch 'V0.0.7' of http://10.87.21.221:8000/jzyd_yyds/soc into V0.0.7

zhulu 1 gadu atpakaļ
vecāks
revīzija
99b8fe54d6
26 mainītis faili ar 656 papildinājumiem un 73 dzēšanām
  1. 4 4
      soc-auth/src/main/resources/bootstrap.yml
  2. 6 6
      soc-gateway/src/main/resources/bootstrap.yml
  3. 2 2
      soc-modules/soc-modules-iot/src/main/resources/bootstrap.yml
  4. 5 2
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotDvrChannelMapper.xml
  5. 4 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotDvrDiskMapper.java
  6. 58 47
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDvrDiskServiceImpl.java
  7. 2 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDvrHardDiskDetectionServiceImpl.java
  8. 3 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoIntegrityCheckServiceImpl.java
  9. 4 4
      soc-modules/soc-modules-mediator/src/main/resources/bootstrap.yml
  10. 6 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotDvrDiskMapper.xml
  11. 115 0
      soc-modules/soc-modules-sms/document/SOC_SMS Web API 接口文档.md
  12. 35 3
      soc-modules/soc-modules-sms/pom.xml
  13. 38 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/controller/SmsController.java
  14. 17 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/ISmsService.java
  15. 59 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java
  16. 262 0
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/vo/SmsInfoVo.java
  17. 30 0
      soc-modules/soc-modules-sms/src/main/resources/bootstrap.yml
  18. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/cdpackage.jar
  19. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/esb-client-api-1.1.jar
  20. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/framework3.0.jar
  21. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/j2ee.jar
  22. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/security_tools.jar
  23. BIN
      soc-modules/soc-modules-sms/src/main/resources/lib/x509.jar
  24. BIN
      soc-modules/soc-modules-sms/短信密钥/YDAQBWGLXTComm.keystore
  25. 2 0
      soc-modules/soc-modules-sms/短信密钥/YDAQBWGLXTCommMasterKey.dat
  26. 4 4
      soc-modules/soc-modules-system/src/main/resources/bootstrap.yml

+ 4 - 4
soc-auth/src/main/resources/bootstrap.yml

@@ -14,17 +14,17 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 10.87.21.102:8848
-        namespace: 489e15c5-b16f-4c78-87f8-f398f73b6103
+        server-addr: 10.87.21.103:8847
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
       config:
         # 配置中心地址
-        server-addr: 10.87.21.102:8848
+        server-addr: 10.87.21.103:8847
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
-        namespace: 489e15c5-b16f-4c78-87f8-f398f73b6103
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
 logging:
   file:
     name: logs/${spring.application.name}/info.log

+ 6 - 6
soc-gateway/src/main/resources/bootstrap.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 8080
+  port: 8081
 
 # Spring
 spring: 
@@ -14,17 +14,17 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 10.87.10.54:8848
-        namespace: 083dc0cf-7829-4914-9d5c-d48f1a31015d
+        server-addr: 10.87.21.103:8847
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
       config:
         # 配置中心地址
-        server-addr: 10.87.10.54:8848
+        server-addr: 10.87.21.103:8847
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
-        namespace: 083dc0cf-7829-4914-9d5c-d48f1a31015d
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
     sentinel:
       #取消控制台懒加载
       eager: true
@@ -33,7 +33,7 @@ spring:
       datasource:
         ds1:
           nacos:
-            server-addr: 10.87.10.54:8848
+            server-addr: 10.87.21.103:8847
             dataId: sentinel-soc-gateway
             groupId: DEFAULT_GROUP
             data-type: json

+ 2 - 2
soc-modules/soc-modules-iot/src/main/resources/bootstrap.yml

@@ -13,11 +13,11 @@ spring:
   cloud:
     nacos:
       discovery:
-        namespace: 73dccc51-5e69-4c22-985e-733be898a242
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 服务注册地址
         server-addr: 10.87.21.103:8847
       config:
-        namespace: 73dccc51-5e69-4c22-985e-733be898a242
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 配置中心地址
         server-addr: 10.87.21.103:8847
         # 配置文件格式

+ 5 - 2
soc-modules/soc-modules-iot/src/main/resources/mapper/IotDvrChannelMapper.xml

@@ -84,8 +84,11 @@
         <if test="pageDto.integrityState!=null">
             and vic.status=#{pageDto.integrityState}
         </if>
-        <if test="pageDto.daysState!=null">
-            and vdc.status=#{pageDto.daysState}
+        <if test="pageDto.daysState==0">
+            and vdc.plan_days=vdc.real_days
+        </if>
+        <if test="pageDto.daysState==1">
+            and vdc.plan_days!=vdc.real_days
         </if>
         <if test="pageDto.diagnosisState!=null">
             and vdr.is_alarm=#{pageDto.diagnosisState}

+ 4 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotDvrDiskMapper.java

@@ -3,6 +3,9 @@ package com.xunmei.mediator.api.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,5 +17,6 @@ import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
  */
 @InterceptorIgnore(blockAttack = "true")
 public interface IotDvrDiskMapper extends BaseMapper<IotDvrDisk> {
+    List<IotDvrDisk> selectByEquipmentCode(@Param("codeList") List<String> codeList);
 
 }

+ 58 - 47
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDvrDiskServiceImpl.java

@@ -9,10 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.CacheConstants;
-import com.xunmei.common.core.domain.iot.domain.IotAlarmDefenceArea;
-import com.xunmei.common.core.domain.iot.domain.IotDevice;
-import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
-import com.xunmei.common.core.domain.iot.domain.IotDvrHardDiskDetection;
+import com.xunmei.common.core.domain.iot.domain.*;
 import com.xunmei.common.core.enums.CategoryDataEnum;
 import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.common.redis.utils.RedisUtils;
@@ -29,6 +26,7 @@ import com.xunmei.system.api.enums.DataType;
 import com.xunmei.system.api.util.LogUtils;
 import com.xunmei.system.api.vo.SysOrgVO;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -48,7 +46,6 @@ import java.util.stream.Collectors;
  * @since 2024-02-21
  */
 @Service
-@Slf4j
 public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrDisk> implements IotDvrDiskService {
 
 
@@ -58,6 +55,8 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
     private NorthErrorService northErrorService;
     @Autowired
     private IIotDeviceService iotDeviceService;
+    @Autowired
+    private IotDvrDiskLogService diskLogService;
 
 
     @Override
@@ -74,13 +73,15 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
                 continue;
             }
             final Optional<IotDvrDisk> first = list.stream().filter(disk -> ObjectUtil.equal(disk.getDiskIndex(), String.valueOf(index))).findFirst();
-            if (first.isPresent()) {
-                final IotDvrDisk iotDvrDisk = first.get();
-                iotDvrDisk.setState((Integer) map.get("state"));
-                iotDvrDisk.setStateUpdateTime(videoRecorderHardDiskDetection.getCheckTime());
-                iotDvrDisk.setUpdateTime(LocalDateTime.now());
-                diskArrayList.add(iotDvrDisk);
+            if (!first.isPresent()) {
+                LogUtils.STATUS_INFO_DISKS.info("硬盘检测上报消息处理磁盘状态时未找到对应磁盘,主机code:{},磁盘号:{}", equipmentCode, index);
+                continue;
             }
+            final IotDvrDisk iotDvrDisk = first.get();
+            iotDvrDisk.setState((Integer) map.get("state"));
+            iotDvrDisk.setStateUpdateTime(videoRecorderHardDiskDetection.getCheckTime());
+            iotDvrDisk.setUpdateTime(LocalDateTime.now());
+            diskArrayList.add(iotDvrDisk);
         }
         updateBatchById(diskArrayList);
     }
@@ -110,15 +111,22 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
         List<NorthError> errors = (List<NorthError>) map.get("errors");
 
         List<IotDvrDisk> dvrdisks = (List<IotDvrDisk>) map.get("dvrdisks");
-        final List<Long> orgIdLIst = dvrdisks.stream().map(IotDvrDisk::getOrgId).distinct().collect(Collectors.toList());
         this.northStatisticsSyncService.saveOrUpdateBaseCountByDataType(DataType.dvrdiskCount.getIndex(), dvrdisks.size(), false);
 
         northErrorService.saveErrorData(errors);
         if (ObjectUtil.isNotEmpty(dvrdisks)) {
-            LambdaQueryWrapper<IotDvrDisk> wrapper = new LambdaQueryWrapper<IotDvrDisk>();
-            wrapper.in(IotDvrDisk::getOrgId, orgIdLIst);
-            this.remove(wrapper);
             this.saveOrUpdateBatch(dvrdisks);
+            List<IotDvrDiskLog> list = new ArrayList<>();
+            for (IotDvrDisk dvrdisk : dvrdisks) {
+                final IotDvrDiskLog diskLog = new IotDvrDiskLog();
+                BeanUtils.copyProperties(dvrdisk, diskLog, "id");
+                diskLog.setIotDvrDiskId(dvrdisk.getId());
+                diskLog.setCreateTime(LocalDateTime.now());
+                diskLog.setUpdateTime(LocalDateTime.now());
+                list.add(diskLog);
+            }
+            diskLogService.saveBatch(list);
+
         }
     }
 
@@ -133,10 +141,12 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
         List<NorthError> errors = new ArrayList<>();
 
         List<IotDvrDisk> dvrdisks = new ArrayList<>();
-
+        final List<String> list = deviceListAll.stream().map(IotDevice::getEquipmentCode).collect(Collectors.toList());
+        final List<IotDvrDisk> allDiskList = baseMapper.selectByEquipmentCode(list);
+        final Map<String, List<IotDvrDisk>> listMap = allDiskList.stream().collect(Collectors.groupingBy(IotDvrDisk::getHostCode));
         for (DvrDiskPageDto pageDto : dvrdiskPageLists) {
             NorthError error = null;
-            SysOrgVO org = null;
+            SysOrgVO org;
             //验证DvrdiskPageDto对象中是否有参数为null
             error = CheckDataUtil.checkObjFieldIsNull(pageDto, msgId, "/api/data/dvrDiskList", null);
             if (error != null) {
@@ -146,31 +156,29 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
             //验证机构是否存在
             final Optional<SysOrgVO> optional = orgList.stream().filter(r -> r.getCode().equals(pageDto.getOrganizationGuid())).findFirst();
             if (!optional.isPresent()) {
-                error = new NorthError(msgId, "/api/data/dvrDiskList"
-                        , pageDto, "OrganizationGuid:" + pageDto.getOrganizationGuid() + "不正确");
+                error = new NorthError(msgId, "/api/data/dvrDiskList", pageDto, "OrganizationGuid:" + pageDto.getOrganizationGuid() + "不正确");
                 errors.add(error);
                 continue;
             } else {
                 org = optional.get();
             }
             //验证监控主机是否存在
-            SysOrgVO finalOrg = org;
-            List<IotDevice> deviceList = deviceListAll.stream().filter(r -> r.getEquipmentCode().equals(pageDto.getEquipmentCode())
-                    && r.getOrgId().equals(finalOrg.getId())).collect(Collectors.toList());
+            final Optional<IotDevice> hostDeviceOptional = deviceListAll.stream()
+                    .filter(r -> r.getEquipmentCode().equals(pageDto.getEquipmentCode()))
+                    .filter(r -> r.getOrgId().equals(org.getId()))
+                    .findFirst();
 
-            if (deviceList.size() == 0) {
-                error = new NorthError(msgId, "/api/data/dvrDiskList"
-                        , pageDto, "EquipmentCode:" + pageDto.getEquipmentCode() + "不正确");
+            if (!hostDeviceOptional.isPresent()) {
+                error = new NorthError(msgId, "/api/data/dvrDiskList", pageDto, "EquipmentCode:" + pageDto.getEquipmentCode() + "不正确");
                 errors.add(error);
                 continue;
             }
+            final List<IotDvrDisk> diskList = listMap.get(hostDeviceOptional.get().getEquipmentCode());
             List<DvrdiskDto> diskSpaces = pageDto.getDiskSpace();
-
-            if (ObjectUtil.isEmpty(diskSpaces)) {
+            if (ObjectUtil.hasEmpty(diskSpaces, diskList)) {
                 return map;
             }
             for (DvrdiskDto dto : diskSpaces) {
-                //验证DvrdiskDto是否有字段为null
                 List<String> fields = new ArrayList<>();
                 fields.add("name");
                 error = CheckDataUtil.checkObjFieldIsNull(dto, msgId, "/api/data/dvrDiskList", fields);
@@ -178,25 +186,28 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
                     errors.add(error);
                     continue;
                 }
-
-                IotDvrDisk dvrdisk = IotDvrDisk.builder()
-                        .available(NumberUtil.parseInt(dto.getAvailable().substring(0, dto.getAvailable().length() - 2)))
-                        .diskIndex(dto.getDiskSerialNum())
-                        .hostCode(pageDto.getEquipmentCode())
-                        .diskName(dto.getName())
-                        .id(IDHelper.id())
-                        .total(NumberUtil.parseInt(dto.getTotal().substring(0, dto.getTotal().length() - 2)))
-                        .orgId(org.getId())
-                        .orgName(org.getShortName())
-                        .orgPath(org.getPath())
-                        .deleted(0)
-                        .source(1)
-                        .createTime(LocalDateTime.now())
-                        .updateTime(LocalDateTime.now())
-                        .stateUpdateTime(LocalDateTime.now())
-                        .build();
-
-                dvrdisks.add(dvrdisk);
+                IotDvrDisk dvrDisk;
+                final Optional<IotDvrDisk> diskOptional = diskList.stream().filter(r -> ObjectUtil.equal(r.getDiskIndex(), dto.getDiskSerialNum())).findFirst();
+                if (!diskOptional.isPresent()) {
+                    dvrDisk = new IotDvrDisk();
+                    dvrDisk.setId(IDHelper.id());
+                    dvrDisk.setOrgId(org.getId());
+                    dvrDisk.setOrgName(org.getShortName());
+                    dvrDisk.setOrgPath(org.getPath());
+                    dvrDisk.setHostCode(pageDto.getEquipmentCode());
+                    dvrDisk.setDiskIndex(dto.getDiskSerialNum());
+                    dvrDisk.setDeleted(0);
+                    dvrDisk.setSource(1);
+                    dvrDisk.setCreateTime(LocalDateTime.now());
+                } else {
+                    dvrDisk = diskOptional.get();
+                }
+                dvrDisk.setAvailable(NumberUtil.parseInt(dto.getAvailable().substring(0, dto.getAvailable().length() - 2)));
+                dvrDisk.setDiskName(dto.getName());
+                dvrDisk.setTotal(NumberUtil.parseInt(dto.getTotal().substring(0, dto.getTotal().length() - 2)));
+                dvrDisk.setStateUpdateTime(LocalDateTime.now());
+                dvrDisk.setUpdateTime(LocalDateTime.now());
+                dvrdisks.add(dvrDisk);
             }
         }
         map.put("errors", errors);

+ 2 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDvrHardDiskDetectionServiceImpl.java

@@ -191,9 +191,10 @@ public class IotDvrHardDiskDetectionServiceImpl extends ServiceImpl<IotDvrHardDi
         this.saveOrUpdate(videoRecorderHardDiskDetection);
         videoRecorderHardDiskDetectionLogService.saveOrUpdate(videoRecorderHardDiskDetectionLog);
         try {
+            LogUtils.STATUS_INFO_DISKS.info("硬盘检测上报状态消息,开始处理对应盘符状态.....");
             iotDvrDiskService.updateStatusByDiskDetection(videoRecorderHardDiskDetection);
         } catch (Exception e) {
-            LogUtils.STATUS_INFO_DISKS.error("硬盘检测处理处理磁盘状态时发生异常!内容:{}",e.getMessage());
+            LogUtils.STATUS_INFO_DISKS.info("硬盘检测处理处理对应盘符状态时发生异常!内容:{}",e.getMessage());
             throw new RuntimeException(e);
         }
 

+ 3 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoIntegrityCheckServiceImpl.java

@@ -151,12 +151,15 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         MediatorVideoIntegrityCheckLog logData = integrityCheckLogService.findByOrgIdAndEquipmentCodeAndChannelCode(videoIntegrityCheck.getOrgId(), videoIntegrityCheck.getEquipmentCode(), videoIntegrityCheck.getChannelCode(), videoIntegrityCheck.getRecordDate());
         if (logData != null) {
             BeanUtils.copyProperties(videoIntegrityCheck, logData, "id");
+            logData.setUpdateTime(new Date());
             integrityCheckLogService.updateById(logData);
             return;
         }
         BeanUtils.copyProperties(videoIntegrityCheck, newLog);
         newLog.setId(IdWorker.getId());
         newLog.setVideoIntegrityCheckId(videoIntegrityCheck.getId());
+        newLog.setCreateTime(new Date());
+        newLog.setUpdateTime(new Date());
         integrityCheckLogService.save(newLog);
 
     }

+ 4 - 4
soc-modules/soc-modules-mediator/src/main/resources/bootstrap.yml

@@ -13,13 +13,13 @@ spring:
   cloud:
     nacos:
       discovery:
-        namespace: 598294c7-43c1-4d78-a437-21669f936cbb
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 服务注册地址
-        server-addr: 10.87.21.102:8848
+        server-addr: 10.87.21.103:8847
       config:
-        namespace: 598294c7-43c1-4d78-a437-21669f936cbb
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 配置中心地址
-        server-addr: 10.87.21.102:8848
+        server-addr: 10.87.21.103:8847
         # 配置文件格式
         file-extension: yml
         # 共享配置

+ 6 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotDvrDiskMapper.xml

@@ -2,4 +2,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xunmei.mediator.api.mapper.IotDvrDiskMapper">
 
+    <select id="selectByEquipmentCode" resultType="com.xunmei.common.core.domain.iot.domain.IotDvrDisk">
+        select * from iot_dvr_disk where host_code in
+        <foreach collection="codeList" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 115 - 0
soc-modules/soc-modules-sms/document/SOC_SMS Web API 接口文档.md

@@ -0,0 +1,115 @@
+# SOC_SMS Web API 接口文档
+
+
+# 1. 变更记录
+## 1.1. [v0.0.7] - 2024年3月18日
+### 1.1.1. 新增
+- 新增发送短信接口【3.1.1】
+
+
+# 2. 概括
+本文档详细定义SOC SMS的Web API,供第三方平台开发使用。   
+API接口采用HTTP协议提供数据服务,数据使用JSON格式表示。
+
+## 2.1. 数据编码
+提交的复杂数据对象和返回结果使用JSON来描述,请求和返回的数据均为UTF-8编码,请求和返回结果中HTTP Header的Content-Type设置为“application/json; charsert=utf-8”。
+
+## 2.3. 返回值
+返回的结果有统一的样式    
+
+|参数名|类型|是否必要|参数描述|
+|----|----|----|----|
+|code|string|否|编码,200:成功,500:内部异常,其它参见HTTP code(状态码)|
+|msg|string|否|描述|
+|data|string|否|数据|
+
+## 2.4. 日期时间
+
+本协议中的日期时间字符串使用`UTC`格式,日期和时间通过大写字母` `分隔。
+
+> 示例:
+>
+> - `完整时间` 2021-03-16 16:35:56 +08:00
+> - `仅日期` 2021-03-16
+> - `仅时间` 16:35:45
+
+
+## 2.4. 密钥文件配置
+
+用于与ESB应用服务器交互的报文完整性校验。ESB将提供给渠道密钥文件XXXCommMasterKey.dat和XXXComm.keystore(XXX为各系统名称,以ESB发布为准,禁止盗用其它系统密钥文件,否则系统之间会密钥冲突,报文校验失败),JVM增加启动参数 –DEAI_HOME=密钥文件路径.(注:密钥可在git仓库 http://10.87.21.221:8000/jzyd_yyds/soc.git 中\soc\soc-modules\soc-modules-sms\短信密钥,目录获取)
+
+# 3. 接口说明
+
+## 3.1. 短信
+### 3.1.1. 发送短信
+- 网关版本    0.0.7
+- 服务地址:		`/api/sms/send`
+- HTTP请求方式: `POST`
+- 输入参数:	  
+
+|名称|类型|是否必填|描述|取值范围|单位|备注|
+|---|---|---|---|---|---|---|
+|tranType|string|是|交易类型|854001(安保管理系统任务逾期提提醒),854002(安保管理系统告警提提醒)|-|-|
+|branchId|string|否|机构号|-|-|-|
+|consumerSeqNo|string|否|消费者系统流水号|-|-|-|
+|custNo|string|否|客户号|-|-|-|
+|custName|string|否|客户姓名|-|-|-|
+|sex|string|否|性别|-|-|-|
+|mobile|string|是|手机号|-|-|-|
+|acctNo|string|否|帐号|-|-|-|
+|occurDate|string|否|发生日期 格式:yyyy-MM-dd|-|-|-|
+|occurTime|string|否|发生时间:格式:Hh:mm:ss|
+|tranAmt1|string|否|交易金额1|-|-|-|
+|tranAmt2|string|否|交易金额2|-|-|-|
+|tranAmt3|string|否|交易金额3|-|-|-|
+|payoutStoreBit1|string|否|支出/存入位1|-|-|-|
+|payoutStoreBit2|string|否|支出/存入位2|-|-|-|
+|payoutStoreBit3|string|否|支出/存入位3|-|-|-|
+|tranRemark|string|否|交易摘要|-|-|-|
+|acctStatus|string|否|帐户状态|-|-|-|
+|channelType|string|否|渠道类型|-|-|-|
+|bak1|string|否|备用1|-|-|-|
+|bak2|string|否|备用2|-|-|-|
+|bak3|string|否|备用3|-|-|-|
+
+- 输出参数:恢复结果(成功/失败)
+- 请求示例:	`http://10.87.21.14/api/sms/send`
+```json
+1、安保管理系统任务逾期提醒 
+{
+    "tranType":"854002",
+    "branchId":"机构号",
+    "mobile":"18113133729",
+    "occurDate":"2024-03-18",
+    "occurTime":"15:02:00",
+    "bak3":"告警提醒内容"
+}
+```
+
+```json
+2、安保管理系统告警提醒
+{
+    "tranType":"854002",
+    "branchId":"机构号",
+    "mobile":"18113133729",
+    "occurDate":"2024-03-18",
+    "occurTime":"15:02:00",
+    "bak3":"告警提醒内容"
+}
+```
+- 成功返回:	
+
+```json
+{
+    "code":200,
+    "msg":''
+}
+ ```
+- 失败返回:
+
+```json
+{
+    "code": 500,
+    "msg": "内部异常"
+}
+ ```

+ 35 - 3
soc-modules/soc-modules-sms/pom.xml

@@ -77,14 +77,11 @@
             <artifactId>commons-text</artifactId>
             <version>1.8</version>
         </dependency>
-
-
         <dependency>
             <groupId>com.xunmei</groupId>
             <artifactId>soc-common-swagger</artifactId>
             <version>${soc.version}</version>
         </dependency>
-
         <dependency>
             <groupId>com.xunmei</groupId>
             <artifactId>soc-common-core</artifactId>
@@ -95,6 +92,41 @@
             <artifactId>soc-api-system</artifactId>
             <version>${soc.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.dc.eai</groupId>
+            <artifactId>esb_cdpackage</artifactId>
+            <version>1.0.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/cdpackage.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.dc.eai</groupId>
+            <artifactId>esb-client-api</artifactId>
+            <version>1.1.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/esb-client-api-1.1.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.dc.eai</groupId>
+            <artifactId>esb_framework</artifactId>
+            <version>3.0.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/framework3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.dc.eai</groupId>
+            <artifactId>esb_security_tools</artifactId>
+            <version>1.0.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/security_tools.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.dc.eai</groupId>
+            <artifactId>esb_x509</artifactId>
+            <version>1.0.0</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/lib/x509.jar</systemPath>
+        </dependency>
     </dependencies>
 
     <build>

+ 38 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/controller/SmsController.java

@@ -0,0 +1,38 @@
+package com.xunmei.sms.controller;
+
+import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.sms.service.ISmsService;
+import com.xunmei.sms.vo.SmsInfoVo;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 短信服务
+ * @author wubiyu[2024/03/15]
+ */
+@RequestMapping("/api/sms")
+@RestController
+public class SmsController extends BaseController {
+
+    /**
+     *短信服务
+     */
+    @Resource
+    private ISmsService smsService;
+
+    /**
+     * 发送短信
+     * @param smsData
+     * @return {@link AjaxResult}
+     */
+    @PostMapping("/send")
+    public AjaxResult send(@RequestBody SmsInfoVo smsData) {
+        return smsService.send(smsData);
+    }
+}

+ 17 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/ISmsService.java

@@ -0,0 +1,17 @@
+package com.xunmei.sms.service;
+
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.sms.vo.SmsInfoVo;
+
+/**
+ * 短信服务
+ * @author wubiyu[2024/03/15]
+ */
+public interface ISmsService {
+    /**
+     * 发送短信
+     * @param data
+     * @return {@link AjaxResult}
+     */
+    AjaxResult send(SmsInfoVo data);
+}

+ 59 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java

@@ -0,0 +1,59 @@
+package com.xunmei.sms.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dc.eai.data.CompositeData;
+import com.dcfs.esb.client.ESBClient;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.sms.vo.SmsInfoVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SmsService implements ISmsService {
+
+    private static Logger logger = LoggerFactory.getLogger(SmsService.class);
+
+    /**
+     * 发送短信
+     * @param data
+     * @return {@link AjaxResult}
+     */
+    @Override
+    public AjaxResult send(SmsInfoVo data) {
+        try {
+            logger.debug("【发送短信】开始,数据:" + JSONObject.toJSONString(data));
+            CompositeData smsCompositeData = SmsInfoVo.convertTo(data);
+
+            if (smsCompositeData == null) {
+                logger.error("【发送短信】转换数据出错:原数据:"+JSONObject.toJSONString(data));
+                return AjaxResult.error("【发送短信】转换数据出错");
+            }
+            CompositeData rspData = ESBClient.request(smsCompositeData);
+            logger.debug("【发送短信】返回数据:" + JSONObject.toJSONString(rspData));
+            return getResult(rspData);
+        } catch (Exception ex) {
+            logger.error("【发送短信】发送时内部异常:数据:"+JSONObject.toJSONString(data),ex);
+            return AjaxResult.error("【发送短信】发送时内部异常");
+        }
+    }
+
+    private AjaxResult getResult(CompositeData repData) {
+        boolean result = false;
+        try {
+            String retStatus = repData.getStruct("SYS_HEAD")
+                    .getField("RET_STATUS").strValue();
+            String retCode = repData.getStruct("SYS_HEAD").getArray("RET")
+                    .getStruct(0).getField("RET_CODE").strValue();
+            if ("S".equals(retStatus) && "000000".equals(retCode)) {
+                return AjaxResult.success();
+            } else {
+                String retMsg = repData.getStruct("SYS_HEAD").getArray("RET")
+                        .getStruct(0).getField("RET_MSG").strValue();
+                return AjaxResult.error(retMsg);
+            }
+        } catch (Exception e) {
+            return AjaxResult.error("【发送短信】解析发送结果时内部异常");
+        }
+    }
+}

+ 262 - 0
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/vo/SmsInfoVo.java

@@ -0,0 +1,262 @@
+package com.xunmei.sms.vo;
+
+import com.dc.eai.data.CompositeData;
+import com.dc.eai.data.Field;
+import com.dc.eai.data.FieldAttr;
+import com.dc.eai.data.FieldType;
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author wubiyu[2024/03/18]
+ */
+@Data
+public class SmsInfoVo {
+    private static Logger logger = LoggerFactory.getLogger(SmsInfoVo.class);
+    /**
+     * 交易类型
+     */
+    private String tranType;
+    /**
+     * 机构号
+     */
+    private String branchId;
+    /**
+     * 消费者系统流水号
+     */
+    private String consumerSeqNo;
+    /**
+     * 客户号
+     */
+    private String custNo;
+    /**
+     * 客户姓名
+     */
+    private String custName;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 帐号
+     */
+    private String acctNo;
+    /**
+     * 发生日期 格式:yyyy-MM-dd
+     */
+    private String occurDate;
+    /**
+     * 发生时间:格式:Hh:mm:ss
+     */
+    private String occurTime;
+    /**
+     * 交易金额1
+     */
+    private String tranAmt1;
+    /**
+     * 交易金额1
+     */
+    private String tranAmt2;
+    /**
+     * 交易金额1
+     */
+    private String tranAmt3;
+
+    /**
+     * 支出/存入位1
+     */
+    private String payoutStoreBit1;
+    /**
+     * 支出/存入位2
+     */
+    private String payoutStoreBit2;
+    /**
+     * 支出/存入位1
+     */
+    private String payoutStoreBit3;
+
+    /**
+     * 交易摘要
+     */
+    private String tranRemark;
+    /**
+     * 帐户状态
+     */
+    private String acctStatus;
+    /**
+     * 渠道类型
+     */
+    private String channelType;
+    /**
+     * 备用1
+     */
+    private String bak1;
+    /**
+     * 备用2
+     */
+    private String bak2;
+    /**
+     * 备用3
+     */
+    private String bak3;
+
+    public static CompositeData convertTo(SmsInfoVo source) {
+        try {
+            /***********************************************************************
+             * *********构造请求数据,定义相关结构体*******
+             **********************************************************************/
+            CompositeData reqData = new CompositeData();
+            CompositeData sysData = new CompositeData();
+            CompositeData appData = new CompositeData();
+            CompositeData body = new CompositeData();
+
+            reqData.addStruct("SYS_HEAD", sysData);
+            reqData.addStruct("APP_HEAD", appData);
+            reqData.addStruct("BODY", body);
+
+            /***********************************************************************
+             * ********* 系统头 ******************
+             **********************************************************************/
+            if (source.getConsumerSeqNo() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
+                field.setValue(source.getConsumerSeqNo());
+                sysData.addField("CONSUMER_SEQ_NO", field);
+            }
+
+            /***********************************************************************
+             * ********** 应用头 ***************
+             **********************************************************************/
+            if (source.getBranchId() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 9, 0));
+                field.setValue(source.getBranchId());
+                appData.addField("BRANCH_ID", field);
+            }
+
+            // 应用头其他需要上送的数据。。。
+
+            /***********************************************************************
+             * ************* 报文体 ************ 服务代码为11003000002,场景为07定义的输入数据
+             **********************************************************************/
+
+            if (source.getTranType() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 6, 0));
+                field.setValue(source.getTranType());
+                body.addField("TRAN_TYPE", field);
+            }
+            if (source.getCustNo() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 22, 0));
+                field.setValue(source.getCustNo());
+                body.addField("CUST_NO", field);
+            }
+
+            if (source.getCustName() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
+                field.setValue(source.getCustNo());
+                body.addField("CUST_NAME", field);
+            }
+            if (source.getSex() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 2, 0));
+                field.setValue(source.getSex());
+                body.addField("SEX", field);
+            }
+            if (source.getMobile() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 20, 0));
+                field.setValue(source.getMobile());
+                body.addField("MOBILE", field);
+            }
+            if (source.getAcctNo() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 32, 0));
+                field.setValue(source.getAcctNo());
+                body.addField("ACCT_NO", field);
+            }
+
+            if (source.getOccurDate() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 10, 0));
+                field.setValue(source.getOccurDate());
+                body.addField("OCCUR_DATE", field);
+            }
+
+            if (source.getOccurTime() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 10, 0));
+                field.setValue(source.getOccurTime());
+                body.addField("OCCUR_TIME", field);
+            }
+
+            if (source.getTranAmt1() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
+                field.setValue(source.getTranAmt1());
+                body.addField("TRAN_AMT1", field);
+            }
+
+            if (source.getTranAmt2() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
+                field.setValue(source.getTranAmt2());
+                body.addField("TRAN_AMT2", field);
+            }
+
+            if (source.getTranAmt3() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
+                field.setValue(source.getTranAmt3());
+                body.addField("TRAN_AMT3", field);
+            }
+
+            if (source.getPayoutStoreBit1() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
+                field.setValue(source.getPayoutStoreBit1());
+                body.addField("PAYOUT_STORE_BIT1", field);
+            }
+            if (source.getPayoutStoreBit2() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
+                field.setValue(source.getPayoutStoreBit2());
+                body.addField("PAYOUT_STORE_BIT2", field);
+            }
+            if (source.getPayoutStoreBit3() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
+                field.setValue(source.getPayoutStoreBit3());
+                body.addField("PAYOUT_STORE_BIT3", field);
+            }
+            if (source.getTranRemark() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 30, 0));
+                field.setValue(source.getTranRemark());
+                body.addField("TRAN_REMARK", field);
+            }
+            if (source.getAcctStatus() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 100, 0));
+                field.setValue(source.getAcctStatus());
+                body.addField("ACCT_STATUS", field);
+            }
+            if (source.getChannelType() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 2, 0));
+                field.setValue(source.getChannelType());
+                body.addField("CHANNEL_TYPE", field);
+            }
+            if (source.getBak1() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
+                field.setValue(source.getBak1());
+                body.addField("BAK1", field);
+            }
+            if (source.getBak2() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
+                field.setValue(source.getBak2());
+                body.addField("BAK2", field);
+            }
+            if (source.getBak3() != null) {
+                Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
+                field.setValue(source.getBak3());
+                body.addField("BAK3", field);
+            }
+            return reqData;
+        } catch (Exception ex) {
+            logger.error("【发送短信】转换数据异常", ex);
+            return null;
+        }
+    }
+}

+ 30 - 0
soc-modules/soc-modules-sms/src/main/resources/bootstrap.yml

@@ -0,0 +1,30 @@
+# Tomcat
+server:
+  port: 9002
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: soc-sms
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
+        # 服务注册地址
+        server-addr: 10.87.21.103:8847
+      config:
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
+        # 配置中心地址
+        server-addr: 10.87.21.103:8847
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+logging:
+  file:
+    name: logs/${spring.application.name}/info.log

BIN
soc-modules/soc-modules-sms/src/main/resources/lib/cdpackage.jar


BIN
soc-modules/soc-modules-sms/src/main/resources/lib/esb-client-api-1.1.jar


BIN
soc-modules/soc-modules-sms/src/main/resources/lib/framework3.0.jar


BIN
soc-modules/soc-modules-sms/src/main/resources/lib/j2ee.jar


BIN
soc-modules/soc-modules-sms/src/main/resources/lib/security_tools.jar


BIN
soc-modules/soc-modules-sms/src/main/resources/lib/x509.jar


BIN
soc-modules/soc-modules-sms/短信密钥/YDAQBWGLXTComm.keystore


+ 2 - 0
soc-modules/soc-modules-sms/短信密钥/YDAQBWGLXTCommMasterKey.dat

@@ -0,0 +1,2 @@
+qyYQXYPuFB8=
+/sSVpixuyF0Ljc8Im6uf4Q==

+ 4 - 4
soc-modules/soc-modules-system/src/main/resources/bootstrap.yml

@@ -13,13 +13,13 @@ spring:
   cloud:
     nacos:
       discovery:
-        namespace: 73dccc51-5e69-4c22-985e-733be898a242
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 服务注册地址
-        server-addr: 10.87.21.102:8848
+        server-addr: 10.87.21.103:8847
       config:
-        namespace: 73dccc51-5e69-4c22-985e-733be898a242
+        namespace: ffd30d7d-0a40-4674-ab19-e00aef378714
         # 配置中心地址
-        server-addr: 10.87.21.102:8848
+        server-addr: 10.87.21.103:8847
         # 配置文件格式
         file-extension: yml
         # 共享配置