Explorar el Código

Merge remote-tracking branch 'origin/master'

wujiefeng hace 1 año
padre
commit
b80a6d926e
Se han modificado 14 ficheros con 222 adiciones y 124 borrados
  1. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountSearchParam.java
  2. 0 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/OrgUserFaceParam.java
  3. 0 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceSyncController.java
  4. 37 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectConfigOpenApiController.java
  5. 4 3
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserCountDaoImpl.java
  6. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/PayShareListDao.java
  7. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dataConfig/TtlConfig.java
  8. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java
  9. 27 79
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceUseRecordService.java
  10. 28 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/permiss/DevicePermissVerifyService.java
  11. 26 32
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/gateDoor/GateDoorService.java
  12. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectMainPaySettingService.java
  13. 2 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java
  14. 90 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectConfigService.java

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountSearchParam.java

@@ -40,7 +40,7 @@ public class UserCountSearchParam extends SuperSearch {
     private String address;
 
     @Schema(description = "用户状态")
-    private UserState state = UserState.Normal;
+    private UserState state;
 
     @Schema(description = "可登录端类型")
     private UserLoginType loginType = UserLoginType.All;

+ 0 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/OrgUserFaceParam.java

@@ -1,7 +1,6 @@
 package com.zhongshu.card.client.model.projectAbout;
 
 import com.zhongshu.card.client.model.base.SuperParam;
-import com.zhongshu.card.client.model.org.UserCountModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotEmpty;
 import lombok.AllArgsConstructor;

+ 0 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceSyncController.java

@@ -49,7 +49,6 @@ public class DeviceSyncController {
     @RequestMapping(value = "syncDeviceOnLineState", method = {RequestMethod.POST})
     public ResultContent syncDeviceOnLineState(@RequestBody DevicePingInfoParam param) {
         return deviceSyncFromIotService.syncDeviceOnLineState(param);
-//        return ResultContent.buildSuccess();
     }
 
     @Operation(summary = "物联网同步网关接口", hidden = true)

+ 37 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectConfigOpenApiController.java

@@ -0,0 +1,37 @@
+package com.zhongshu.card.server.core.controller.projectAbout;
+
+
+import com.github.microservice.models.project.ProjectConfigQueryParam;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.service.projectAbout.ProjectConfigService;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+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;
+
+@Slf4j
+@RestController
+@RequestMapping("openAPI/projectConfig/v1")
+@Tag(name = "项目配置")
+@Hidden
+public class ProjectConfigOpenApiController {
+
+    @Autowired
+    private ProjectConfigService projectConfigService;
+
+    /**
+     * 设备上线通知
+     */
+    @Operation(summary = "查询项目的配置信息")
+    @PostMapping(value = "iotQueryProjectConfig", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public ResultContent iotQueryProjectConfig(@RequestBody ProjectConfigQueryParam param) {
+        return projectConfigService.iotQueryProjectConfig(param);
+    }
+
+}

+ 4 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserCountDaoImpl.java

@@ -13,15 +13,12 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.aggregation.Aggregation;
-import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.regex.Pattern;
 
 /**
@@ -85,6 +82,10 @@ public class UserCountDaoImpl extends BaseImpl implements UserCountDaoExtend {
             criteria.and("userType").is(param.getUserType());
         }
 
+        if (param.getState() != null) {
+            criteria.and("state").is(param.getState());
+        }
+
         if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
             criteria.and("createTime").gte(param.getStartTime()).lte(param.getEndTime());
         }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/PayShareListDao.java

@@ -13,7 +13,7 @@ public interface PayShareListDao extends MongoDao<PayShareList> {
 
     PayShareList findTopById(String id);
 
-    PayShareList findTopByProjectOidAndName(String projectOid, String name);
+    PayShareList findTopByProjectOidAndNameAndPaymentType(String projectOid, String name, PaymentType paymentType);
 
     List<PayShareList> findByProjectOidAndPaymentTypeOrderBySortAsc(String projectOid, PaymentType paymentType);
 

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dataConfig/TtlConfig.java

@@ -12,4 +12,6 @@ public class TtlConfig {
     // 用户权限数据缓存的时间
     public static final Long userCacheTime = 30 * 24 * 60 * 60L * 1000;
 
+    // 设备使用记录的保存时间
+    public static final Long deviceUseRecordTime = 180 * 24 * 60 * 60L * 1000;
 }

+ 3 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java

@@ -90,6 +90,9 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "时间")
     private Long timestamp;
 
+    @Schema(description = "耗时,毫秒")
+    private Long useTime;
+
     @Schema(description = "年份,如:2024")
     private Integer year;
 

+ 27 - 79
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceUseRecordService.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.server.core.service.devices;
 
 import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.core.util.os.SystemUtil;
 import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.devices.DeviceUseRecordModel;
@@ -12,6 +13,7 @@ import com.zhongshu.card.server.core.dao.devices.DeviceUseRecordDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.school.CardInfoDao;
+import com.zhongshu.card.server.core.dataConfig.TtlConfig;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.devices.DeviceUseRecords;
 import com.zhongshu.card.server.core.domain.org.Organization;
@@ -26,11 +28,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * @author TRX
@@ -67,8 +72,26 @@ public class DeviceUseRecordService extends SuperService {
     @Autowired
     private OrganizationDao organizationDao;
 
-    // 设备使用日志保存3个月
-    private static Long ttlTime = 90 * 24 * 60 * 60 * 1000L;
+    //线程池
+    private ExecutorService executorService = Executors.newFixedThreadPool(SystemUtil.getCpuCoreCount() * 2);
+
+    @Autowired
+    private void init(ApplicationContext applicationContext) {
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            executorService.shutdownNow();
+        }));
+    }
+
+    /**
+     * 异步保存设备使用 日志
+     *
+     * @param param
+     */
+    public void asyncSaveRecord(GateDoorUseParam param) {
+        executorService.execute(() -> {
+            saveDeviceLogs(param);
+        });
+    }
 
     /**
      * 设备使用日志 (物联网来的数据)
@@ -146,7 +169,8 @@ public class DeviceUseRecordService extends SuperService {
                 if (ObjectUtils.isNotEmpty(organization)) {
                     deviceUseRecord.setProjectName(organization.getName());
                 }
-                deviceUseRecord.setTtl(new Date(System.currentTimeMillis() + ttlTime));
+                deviceUseRecord.setTtl(new Date(System.currentTimeMillis() + TtlConfig.deviceUseRecordTime));
+                deviceUseRecord.setMsg(param.getVerifyMsg());
                 deviceUseRecordDao.save(deviceUseRecord);
             } else {
                 return ResultContent.buildFail("数据初始失败");
@@ -166,82 +190,6 @@ public class DeviceUseRecordService extends SuperService {
         return null;
     }
 
-    /**
-     * 检查设备使用的 参数验证
-     *
-     * @param entity
-     */
-    public void checkUseDeviceData(DeviceUseRecords entity) {
-//        // 主要是从设备、卡片等的基础信息验证
-//        if (ObjectUtils.isNotEmpty(entity)) {
-//            // 1. 检查设备
-//            if (ObjectUtils.isEmpty(entity.getDeviceInfo())) {
-//                entity.setIsPassed(Boolean.FALSE);
-//                entity.setMsg("设备信息未找到");
-//                return;
-//            }
-//            DeviceInfoStoreModel deviceInfo = entity.getDeviceInfo();
-//            if (deviceInfo.getState() == null || deviceInfo.getState() != DataState.Enable) {
-//                entity.setIsPassed(Boolean.FALSE);
-//                entity.setMsg("设备未启用");
-//                return;
-//            }
-//            //2. 验证用户信息
-//            UserCountSimpleModel userAccount = entity.getUserAccount();
-//            if (ObjectUtils.isEmpty(userAccount)) {
-//                entity.setIsPassed(Boolean.FALSE);
-//                entity.setMsg("用户信息未确定");
-//                return;
-//            }
-//            if (userAccount.getState() == null || userAccount.getState() != UserState.Normal) {
-//                entity.setIsPassed(Boolean.FALSE);
-//                entity.setMsg(String.format("用户已禁用"));
-//                return;
-//            }
-//            // 验证用户是否有设备申请权限
-//            if (deviceInfo.getIsOpenUse() == null || !deviceInfo.getIsOpenUse()) {
-//                DevicePermiss devicePermiss = devicePermissDao.findTopByUserIdAndDeviceIdAndProjectOid(entity.getUserId(), entity.getDeviceId(), entity.getProjectOid());
-//                if (ObjectUtils.isEmpty(devicePermiss)) {
-//                    entity.setIsPassed(Boolean.FALSE);
-//                    entity.setMsg("用户没有设备权限");
-//                    return;
-//                }
-//                if (devicePermiss.getDataState() == null || devicePermiss.getDataState() != DataState.Enable) {
-//                    entity.setIsPassed(Boolean.FALSE);
-//                    entity.setMsg("用户权限未启用");
-//                    return;
-//                }
-//            }
-//
-//            Integer mode = entity.getMode();
-//            if (mode == null) {
-//                entity.setIsPassed(Boolean.FALSE);
-//                entity.setMsg("使用模式未确定");
-//                return;
-//            }
-//            if (mode == 0) {
-//                // 刷卡
-//                if (ObjectUtils.isEmpty(entity.getCardInfo())) {
-//                    entity.setIsPassed(Boolean.FALSE);
-//                    entity.setMsg("卡片未找到");
-//                    return;
-//                }
-//                CardInfoStoreModel cardInfo = entity.getCardInfo();
-//                if (cardInfo.getIsCanceled() != null && cardInfo.getIsCanceled()) {
-//                    entity.setIsPassed(Boolean.FALSE);
-//                    entity.setMsg("卡片已作废");
-//                    return;
-//                }
-//
-//                if (cardInfo.getCardState() == null || cardInfo.getCardState() != CardState.Enable) {
-//                    entity.setIsPassed(Boolean.FALSE);
-//                    entity.setMsg(String.format("卡片%s", cardInfo.getCardState().getRemark()));
-//                    return;
-//                }
-//            }
-//        }
-    }
-
     public ResultContent<Page<DeviceUseRecordModel>> page(DeviceUseRecordSearch param, Pageable pageable) {
         Page<DeviceUseRecords> page = deviceUseRecordDao.page(pageable, param);
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));

+ 28 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/permiss/DevicePermissVerifyService.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.service.devices.permiss;
 
+import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.devices.permiss.PermissSettingListSearch;
 import com.zhongshu.card.client.model.devices.permiss.TimeSlotModel;
@@ -21,6 +22,7 @@ import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StopWatch;
@@ -77,7 +79,13 @@ public class DevicePermissVerifyService {
      * @param deviceId
      * @return
      */
-    public ResultContent<String> verifyDevice(String userId, String deviceId) {
+    public ResultContent<String> verifyDevice(String userId, String deviceId, GateDoorUseParam deviceUserParam) {
+        if (StringUtils.isEmpty(userId)) {
+            return ResultContent.buildFail("未包含用户信息");
+        }
+        deviceUserParam.setUserId(userId);
+        deviceUserParam.setDeviceId(deviceId);
+
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("用户信息");
         String msg = "";
@@ -109,7 +117,6 @@ public class DevicePermissVerifyService {
 
         boolean hasPermission = false;
         String projectOid = deviceInfo.getProjectOid();
-
         stopWatch.start("查询绑定的设备权限");
         DevicePermiss devicePermiss = devicePermissDao.findTopByUserIdAndDeviceIdAndProjectOidAndDataState(userId, deviceId, projectOid, DataState.Enable);
         if (ObjectUtils.isNotEmpty(devicePermiss)) {
@@ -157,17 +164,34 @@ public class DevicePermissVerifyService {
                     boolean b = permissSettingListDao.isExit(search);
                     if (b) {
                         hasPermission = true;
+                    } else {
+                        msg = "未查询到权限";
                     }
                     stopWatch.stop();
                 } else {
                     hasPermission = false;
+                    if (ObjectUtils.isEmpty(deviceCacheModel)) {
+                        msg = "设备权限为空";
+                    } else if (!deviceCacheModel.isSuccess()) {
+                        msg = deviceCacheModel.getMsg();
+                    }
+                }
+            } else {
+                hasPermission = false;
+                if (ObjectUtils.isEmpty(permissTimeSlots)) {
+                    msg = "规则时间段为空";
+                } else if (ObjectUtils.isEmpty(userCacheModel)) {
+                    msg = "用户权限数据为空";
+                } else if (!userCacheModel.isSuccess()) {
+                    msg = userCacheModel.getMsg();
                 }
             }
         }
+        deviceUserParam.setUseTime(stopWatch.getTotalTimeMillis());
+        log.info("权限验证:{} {}", stopWatch.prettyPrint(), msg);
         if (!hasPermission) {
-            return ResultContent.buildFail("验证失败");
+            return ResultContent.buildFail(msg);
         }
-        log.info("权限验证:{}", stopWatch.prettyPrint());
         return ResultContent.buildSuccess(msg);
     }
 

+ 26 - 32
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/gateDoor/GateDoorService.java

@@ -166,8 +166,9 @@ public class GateDoorService extends SuperService {
     public ResultContent gateDoorOnLineVerify(GateDoorIotParam param) {
         GateDoorOnLineUseResult result = new GateDoorOnLineUseResult();
         GateDoorInfoParam info = param.getInfo();
-        info = new GateDoorInfoParam();
-        info.setPic("1");
+        if (ObjectUtils.isEmpty(info)) {
+            info = new GateDoorInfoParam();
+        }
 
         log.info("闸机使用记录 gateDoorOnLineVerify...");
         if (ObjectUtils.isNotEmpty(info)) {
@@ -175,37 +176,30 @@ public class GateDoorService extends SuperService {
             String gateWayId = param.getGateWayId();
             String mqttDataId = param.getMqttDataId();
             result.setMqttDataId(mqttDataId);
-
-            GateDoorUseParam useParam = new GateDoorUseParam();
-            useParam.setMqttDataId(param.getMqttDataId());
-            useParam.setDeviceId(param.getDeviceId());
-            useParam.setGateWayId(param.getGateWayId());
-            String faceBase64Str = info.getPic();
-
-//            // 根据人脸查找用户
-//            com.github.microservice.auth.client.content.ResultContent<String> faceContent = userFaceService.matches(faceBase64Str);
-//            String userId = "";
-//            if (faceContent.isSuccess()) {
-//                userId = faceContent.getContent();
-//            } else {
-//                String msg = faceContent.getMsg();
-//                if (StringUtils.isEmpty(msg)) {
-//                    msg = "人脸验证错误";
-//                }
-////                result.setFailed(msg);
-//            }
-            String userId = "665fc0389083d203896d3541";
-
-            if (StringUtils.isNotEmpty(userId)) {
-                // 验证用户对设备有误权限
-                ResultContent<String> resultContent = devicePermissVerifyService.verifyDevice(userId, deviceId);
-                if (resultContent.isSuccess()) {
-                    result.setSuccess();
-                    result.setMsg(resultContent.getContent());
-                } else {
-                    result.setFailed(resultContent.getMsg());
-                }
+            String userId = info.getCustomId();
+
+            GateDoorUseParam deviceUserParam = new GateDoorUseParam();
+            ResultContent<String> resultContent = devicePermissVerifyService.verifyDevice(userId, deviceId, deviceUserParam);
+            deviceUserParam.setMqttDataId(mqttDataId);
+            deviceUserParam.setOperateType(OperateType.Face);
+            deviceUserParam.setGateWayId(gateWayId);
+            deviceUserParam.setData(info);
+            deviceUserParam.setIsOffLine(Boolean.FALSE);
+            deviceUserParam.setPic(info.getPic());
+            if (resultContent.isSuccess()) {
+                result.setSuccess();
+                result.setMsg(resultContent.getContent());
+                deviceUserParam.setOperateState(OperateState.Success);
+                deviceUserParam.setIsPassed(Boolean.TRUE);
+                deviceUserParam.setVerifyMsg(resultContent.getContent());
+            } else {
+                result.setFailed(resultContent.getMsg());
+                deviceUserParam.setOperateState(OperateState.Failed);
+                deviceUserParam.setIsPassed(Boolean.FALSE);
+                deviceUserParam.setVerifyMsg(resultContent.getMsg());
             }
+            // 添加设备使用记录
+            deviceUseRecordService.asyncSaveRecord(deviceUserParam);
         } else {
             result.setFailed("参数错误");
         }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectMainPaySettingService.java

@@ -242,7 +242,7 @@ public class ProjectMainPaySettingService extends SuperService {
         }
         Organization projectInfo = organizationDao.findTopByOid(param.getProjectOid());
         PayShareList entity = null;
-        PayShareList nameTemp = payShareListDao.findTopByProjectOidAndName(param.getProjectOid(), param.getName());
+        PayShareList nameTemp = payShareListDao.findTopByProjectOidAndNameAndPaymentType(param.getProjectOid(), param.getName(), param.getPaymentType());
         if (StringUtils.isNotEmpty(param.getId())) {
             entity = payShareListDao.findTopById(param.getId());
             if (ObjectUtils.isEmpty(entity)) {

+ 2 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -8,6 +8,7 @@ import com.github.microservice.models.hxz.ConsumTransactionsModel;
 import com.github.microservice.models.hxz.ConsumTransactionsResult;
 import com.github.microservice.models.hxz.QRCodeTransactionModel;
 import com.github.microservice.models.hxz.WxPayResult;
+import com.github.microservice.models.hxz.base.IotBaseResult;
 import com.github.microservice.models.type.OrderFromType;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
@@ -450,7 +451,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
      * @param result
      * @return
      */
-    public String buildPayResultStr(ConsumTransactionsResult result) {
+    public String buildPayResultStr(IotBaseResult result) {
         if (ObjectUtils.isEmpty(result)) {
             return new JSONObject().toString();
         }

+ 90 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectConfigService.java

@@ -0,0 +1,90 @@
+package com.zhongshu.card.server.core.service.projectAbout;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.github.microservice.dataConfig.IotIdentifierConfig;
+import com.github.microservice.models.iot.IotSendParam;
+import com.github.microservice.models.project.ProjectConfigQueryParam;
+import com.github.microservice.models.project.ProjectConfigResultModel;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.service.openAPI.OpenApiRequestService;
+import com.zhongshu.card.server.core.service.payment.ExpenseFlowServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目配置信息 (得到)
+ *
+ * @author TRX
+ * @date 2025/1/3
+ */
+@Slf4j
+@Service
+public class ProjectConfigService {
+
+    @Autowired
+    private ExpenseFlowServiceImpl expenseFlowService;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    private OpenApiRequestService openApiRequestService;
+
+    /**
+     * 注册网关是查询项目的配置
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent iotQueryProjectConfig(ProjectConfigQueryParam param) {
+        ProjectConfigResultModel model = new ProjectConfigResultModel();
+        String projectInfoCode = param.getProjectInfoCode();
+        boolean isVerify = true;
+        if (StringUtils.isEmpty(projectInfoCode)) {
+            isVerify = false;
+            model.setFailed("projectInfoCode 不能为空");
+        }
+        if (isVerify) {
+            // 下发查询项目相关的配置
+            sendProjectConfig(projectInfoCode);
+        }
+        return ResultContent.buildSuccess(expenseFlowService.buildPayResultStr(model));
+    }
+
+    /**
+     * 下发项目信息
+     *
+     * @param projectInfoCode
+     */
+    public void sendProjectConfig(String projectInfoCode) {
+        IotSendParam param = new IotSendParam();
+        param.setIdentifier(IotIdentifierConfig.projectConfig);
+        param.setProjectInfoCode(projectInfoCode);
+        String projectOid = "";
+
+        ProjectConfigResultModel model = new ProjectConfigResultModel();
+        model.setProjectInfoCode(projectInfoCode);
+        Organization organization = organizationDao.findTopByCode(projectInfoCode);
+        if (ObjectUtils.isNotEmpty(organization)) {
+            projectOid = organization.getOid();
+            model.setSuccess();
+        } else {
+            model.setFailed("项目信息不存在");
+        }
+        JSONObject data = JSONUtil.parseObj(model);
+        param.setData(data);
+        ResultContent resultContent = openApiRequestService.sendIotMessage(param, projectOid);
+        if (resultContent.isSuccess()) {
+            log.info("项目配置信息下发成功");
+        } else {
+            log.error("项目配置信息下发失败 {}", resultContent.getMsg());
+        }
+    }
+
+}