MrShi
2025-11-05 57eea78f9841586d4d21e38537b5dddd6829f682
Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao
已添加7个文件
已修改96个文件
1975 ■■■■ 文件已修改
admin/src/views/business/deletePersonnel.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/AndroidManifest.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java 394 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/face_activity.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/layout_download.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/main_activity.xml 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/values/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/admin_start.sh 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/启动脚本和日志处理脚本说明.txt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-self.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/bootstrap-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Monitor.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-pro.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-self.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap-test.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-pro.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-self.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/resources/bootstrap-test.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/pom.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_screen/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java 358 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/openapi/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/pom.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deletePersonnel.vue
@@ -82,7 +82,6 @@
        </template>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
keyCabinet-android/app/build.gradle
@@ -10,8 +10,8 @@
        applicationId "com.doumee.keyCabinet"
        minSdkVersion build_versions.min_sdk
        targetSdkVersion build_versions.target_sdk
        versionCode 1
        versionName "1.0.0"
        versionCode 2
        versionName "1.0.1"
        //支持vectorDrawables矢量图
        vectorDrawables.useSupportLibrary = true
keyCabinet-android/app/src/main/AndroidManifest.xml
@@ -76,19 +76,19 @@
                android:resource="@xml/provider_paths" />
        </provider>
        <receiver
        <!--<receiver
            android:name="com.doumee.keyCabinet.ui.service.BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <!-- æŽ¥æ”¶å¯åŠ¨å®Œæˆçš„å¹¿æ’­ -->
            &lt;!&ndash; æŽ¥æ”¶å¯åŠ¨å®Œæˆçš„å¹¿æ’­ &ndash;&gt;
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
        </receiver>-->
        <service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />
        <!--<service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />-->
        <uses-library
            android:name="org.apache.http.legacy"
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/FaceUserBean.java
@@ -8,7 +8,7 @@
    private Integer memberId;
    private String memberName;
    //0:管理员,1:用户
    //0:管理员,1:司机
    private String groupId;
    private boolean checked;
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenErrEvent.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.keyCabinet.event;
public class OpenErrEvent {
    private String key;
    public OpenErrEvent(String key) {
        this.key = key;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/OpenGridEvent.java
@@ -5,12 +5,25 @@
    private String channelCode;
    //板号
    private String boardCode;
    private String key;
    public OpenGridEvent(String channelCode, String boardCode) {
        this.channelCode = channelCode;
        this.boardCode = boardCode;
    }
    public OpenGridEvent(String key) {
        this.key = key;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public String getChannelCode() {
        return channelCode;
    }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
@@ -61,7 +61,7 @@
     * èŽ·å–IC卡用户主键 - å¸æœº
     */
    @POST("visitsAdmin/cloudService/web/cabinet/getMemberIdByCode")
    Observable<BaseResponse<Integer>> getMemberIdByCode(@Query("code")String code);
    Observable<BaseResponse<Integer>> getMemberIdByCode(@Body RequestBody requestBody);
    /**
     * é…’精检测告警
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/AlcoholTestAlarmParam.java
@@ -1,6 +1,8 @@
package com.doumee.keyCabinet.http.param;
public class AlcoholTestAlarmParam {
    //柜子id
    private Integer cabinetId;
    //会员id
    private Integer memberId;
    private String alcoholNum;
@@ -20,4 +22,12 @@
    public void setAlcoholNum(String alcoholNum) {
        this.alcoholNum = alcoholNum;
    }
    public Integer getCabinetId() {
        return cabinetId;
    }
    public void setCabinetId(Integer cabinetId) {
        this.cabinetId = cabinetId;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/GetMemberIdByCodeParam.java
@@ -1,11 +1,9 @@
package com.doumee.keyCabinet.http.param;
public class GetMemberIdByCodeParam {
    //关联人员类型:0=司机;1=校验人员
    private Integer userType;
    private String code;
    public GetMemberIdByCodeParam(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
@@ -14,4 +12,12 @@
    public void setCode(String code) {
        this.code = code;
    }
    public Integer getUserType() {
        return userType;
    }
    public void setUserType(Integer userType) {
        this.userType = userType;
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/AddFaceVM.java
@@ -51,13 +51,13 @@
                                List<FaceUserBean> datas = new ArrayList<>();
                                if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getAutoFaceList()){
                                        bean.setGroupId("1");
                                        bean.setGroupId("0");
                                    }
                                    datas.addAll(faceBean.getAutoFaceList());
                                }
                                if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getDriverFaceList()){
                                        bean.setGroupId("0");
                                        bean.setGroupId("1");
                                    }
                                    datas.addAll(faceBean.getDriverFaceList());
                                }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -27,6 +27,7 @@
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.FaceActivityBinding;
import com.doumee.keyCabinet.event.FaceStatusChangeEvent;
import com.doumee.keyCabinet.event.HttpEvent;
import com.doumee.keyCabinet.event.JiujinBeginEvent;
import com.doumee.keyCabinet.event.JiujinResultEvent;
import com.doumee.keyCabinet.event.TimeClockEvent;
@@ -130,6 +131,7 @@
    private void statusFsm(int toStatus){
        status = toStatus;
        isToChose = false;
        getDB().etEwm.requestFocus();
        switch (toStatus){
            case 0:
                //取-管理员人脸验证
@@ -141,7 +143,6 @@
            case 1:
                //取-管理员刷卡验证
                getDB().etEwm.setText("");
                getDB().etEwm.requestFocus();
                getDB().tvTitle.setText("管理员身份验证");
                getDB().clFace.setVisibility(View.GONE);
                getDB().clCard.setVisibility(View.VISIBLE);
@@ -198,7 +199,7 @@
                //取-司机酒精检测失败
                //Toast.makeText(mContext, "司机酒精检测失败", Toast.LENGTH_SHORT).show();
                getDB().clJiu.setVisibility(View.GONE);
                getDB().tvJg1.setText("酒精检测异常,请重新检测");
                getDB().tvJg1.setText("酒精检测操作不当,请重新检测");
                getDB().clTip1.setVisibility(View.VISIBLE);
                break;
            case 7:
@@ -297,6 +298,14 @@
                    finish();
                }
                break;
            case 8:
                getDB().message.setText(data.getData().get("obj").toString());
                getDB().message.setVisibility(View.VISIBLE);
                handler.sendEmptyMessageDelayed(6,2000);
                getDB().message.invalidate();
                getDB().message.requestLayout();
                EventBus.getDefault().post(new HttpEvent("ic卡+++++++"+data.getData().get("type").toString()));
                break;
            default:
                break;
        }
@@ -328,7 +337,7 @@
        //ic卡读取
        getDB().etEwm.requestFocus();
        getDB().etEwm.setFocusable(true);
        getDB().etEwm.setShowSoftInputOnFocus(true);
        getDB().etEwm.setShowSoftInputOnFocus(false);
        hideSoftKeyboard(getDB().etEwm);
        getDB().etEwm.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
@@ -336,6 +345,7 @@
                hideSoftKeyboard(getDB().etEwm);
            }
        });
        getDB().etEwm.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -354,6 +364,8 @@
                    return;
                }
                if(status!=1&&status!=3&&status!=8){
                    getDB().etEwm.setText("");
                    getDB().etEwm.requestFocus();
                    return;
                }
                if(handler.hasMessages(5)){
@@ -498,6 +510,8 @@
                        getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
                        //Toast.makeText(mContext, "酒精检测超标", Toast.LENGTH_SHORT).show();
                        statusFsm(9);
                        //再检测,将声音关闭
                        EventBus.getDefault().post(new JiujinBeginEvent());
                    }
                    break;
                case 4:
@@ -515,6 +529,9 @@
                    }
                    getDB().etEwm.setText("");
                    getDB().etEwm.requestFocus();
                    break;
                case 6:
                    getDB().message.setVisibility(View.GONE);
                    break;
                default:
                    break;
@@ -593,6 +610,7 @@
                    User user = livenessModel.getUser();
                    if (user == null) {
                        mUser = null;
                        //EventBus.getDefault().post(new HttpEvent("人脸用户检测失败------->"+(status==0?"管理员人脸检测:":"司机人脸检测:")));
                        if (isCompareCheck) {
                            /*getDB().clFail.setVisibility(View.VISIBLE);
                            getDB().tv4.setText(getString(R.string.face_tip2));
@@ -601,6 +619,8 @@
                    } else {
                        mUser = user;
                        /*EventBus.getDefault().post(new HttpEvent("人脸用户------->"+(status==0?"管理员人脸检测:":"司机人脸检测:")
                                +(user.getGroupId().equals("0")?"管理员":"司机")));*/
                        if (isCompareCheck) {
                            getDB().clFail.setVisibility(View.GONE);
                            if(handler.hasMessages(0)) {
@@ -665,6 +685,9 @@
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void JiujinResultEvent(JiujinResultEvent e){
        if(!isFinishing()){
            if(status!=4&&status!=6){
                return;
            }
            //Toast.makeText(mContext, "酒精检测返回:"+e.isOk(), Toast.LENGTH_SHORT).show();
            if(!e.isOk()){
                getDB().clJiujinProgress.setVisibility(View.GONE);
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceVM.java
@@ -49,8 +49,10 @@
     * @param type //0:管理员,1:司机
     */
    public void getMemberIdByCode(String code,String type){
        //showLoading(true);
        getRetrofitService(Apis.class).getMemberIdByCode(code)
        GetMemberIdByCodeParam param = new GetMemberIdByCodeParam();
        param.setUserType("0".equals(type)?1:0);
        param.setCode(code);
        getRetrofitService(Apis.class).getMemberIdByCode(ParamsUtil.encodeRequestBody(param))
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new SimpleObserver<BaseResponse<Integer>>(rxJavaGcManager) {
                    @Override
@@ -70,7 +72,7 @@
                                }
                            }
                        }else {
                            //toast(response.getMessage());
                            doAction(8,response.getMessage());
                        }
                    }
@@ -92,6 +94,7 @@
     */
    public void alcoholTestAlarm(String data){
        AlcoholTestAlarmParam param = new AlcoholTestAlarmParam();
        param.setCabinetId(MApplication.getConfigBean().getId());
        param.setMemberId(MApplication.getLoginBean().getMemberId());
        param.setAlcoholNum(data);
        showLoading(true);
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/adapter/FaceUserAdapter.java
@@ -69,7 +69,7 @@
        // æ·»åŠ æ•°æ®
        holder.text_user_ctime.setText(mList.get(position).getId()+"");
        holder.textUserName.setText(mList.get(position).getUserName());
        holder.textSf.setText(mList.get(position).getGroupId().equals("0")?
        holder.textSf.setText(mList.get(position).getGroupId().equals("1")?
                MApplication.mContext.getString(R.string.face_hy) :MApplication.mContext.getString(R.string.face_xy));
        FrescoUtils.displayImageFresco(mList.get(position).getImageName(),holder.circleUserHead);
    }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
@@ -45,7 +45,7 @@
    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
        getDB().etTime.setText(SpUtil.getInt("loop_time",30)+"");
        getDB().etTime.setText(SpUtil.getInt("loop_time",60)+"");
    }
    @Override
@@ -57,7 +57,9 @@
                    ToastView.show(MApplication.mContext,"接口地址不能为空");
                    return;
                }
                if(!url.startsWith("http://")||!url.startsWith("https://")||!url.endsWith("/")){
                if((url.startsWith("http://")||url.startsWith("https://"))&&url.endsWith("/")){
                    //正确
                }else {
                    ToastView.show(MApplication.mContext,"接口地址错误");
                    return;
                }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
@@ -25,6 +25,7 @@
import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -58,6 +59,7 @@
    private int status;
    private int ysDownCount = 10;
    private boolean isChose;
    @Override
    public int getLayoutId() {
@@ -73,6 +75,9 @@
        adapter = new CabinetRcvAdapter(this, R.layout.cabinet_rcv_item, new CabinetRcvAdapter.OnItemClick() {
            @Override
            public void onItemClick(KeyCabinetBean item) {
                if(isChose){
                    return;
                }
                selectBean = item;
            }
        });
@@ -151,6 +156,10 @@
                    Toast.makeText(mContext, "请选择柜门", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(isChose){
                    return;
                }
                isChose = true;
                if(isOpening){
                    return;
                }
@@ -160,7 +169,7 @@
                downTime = 60;
                break;
            case 2:
                getDB().clTip1.setVisibility(View.GONE);
                //getDB().clTip1.setVisibility(View.GONE);
                if(status==0) {
                    //重新开门
                    openTime = StringUtil.DateToStr(new Date());
@@ -183,7 +192,7 @@
                isOpening = false;
                //开启成功
                status=1;
                if("0".equals(flag)) {
                if(flag==0) {
                    getDB().imgTip2.setImageResource(R.mipmap.ic_notclose_key);
                    getDB().tvTip22.setText("请领取钥匙后关闭柜门");
                }else {
@@ -193,7 +202,6 @@
                getDB().tvTip21.setText(getTipText(selectBean.getCode(),"柜门打开成功"), TextView.BufferType.SPANNABLE);
                getDB().clTip1.setVisibility(View.GONE);
                getDB().clTip2.setVisibility(View.VISIBLE);
                EventBus.getDefault().post(new GetKeyStatusEvent());
                ysDownCount = 8;
                break;
            case 7:
@@ -291,6 +299,8 @@
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }
    private String openTime = "";
@@ -300,6 +310,10 @@
            if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                //开门成功,移除开门
                if(handler.hasMessages(1)){
                    handler.removeMessages(1);
                }
                if(key.equals(e.getKey())) {
                    if (e.getIsOpen()==1) {
                        //开门成功
@@ -307,8 +321,7 @@
                            return;
                        }
                        isOpened = true;
                        Toast.makeText(mContext, "操作4", Toast.LENGTH_LONG).show();
                        doRegister(4, null);
                        getVM().doAction(4);
                    } else {
                        //失败
                        //如果是钥匙不对继续开门
@@ -321,25 +334,35 @@
                            }
                            if (!gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                //钥匙不匹配
                                doRegister(10,null);
                                getVM().doAction(10,null);
                                EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                return;
                            }
                        }
                        doRegister(3, null);
                        getVM().doAction(3);
                    }
                }
            }
        }
    }
    private Long keyTime;
    private boolean isOpened = false;
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()){
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            //获取卡号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            if(selectBean!=null){
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            handler.sendEmptyMessageDelayed(0,1200);
            /*if(selectBean!=null){
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                if(key.equals(e.getKey())) {
@@ -361,18 +384,17 @@
                                    if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                        //领取失败
                                        isOpened = false;
                                        doRegister(6, null);
                                        getVM().doAction(6);
                                        getVM().closeGrid(gridDo);
                                    }else {
                                        //钥匙不匹配
                                        //Toast.makeText(mContext, "操作10", Toast.LENGTH_LONG).show();
                                        doRegister(10,null);
                                        getVM().doAction(10,null);
                                        EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                    }
                                } else {
                                    //钥匙拿走了
                                    isOpened = false;
                                    doRegister(5, null);
                                    getVM().doAction(5);
                                    getVM().closeGrid(gridDo);
                                }
                            }else {
@@ -398,17 +420,17 @@
                                    if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                        //相同归还成功
                                        isOpened = false;
                                        doRegister(8, null);
                                        getVM().doAction(8);
                                        getVM().closeGrid(gridDo);
                                    }else {
                                        //钥匙不匹配
                                        doRegister(10,null);
                                        getVM().doAction(10,null);
                                        EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                    }
                                } else {
                                    //钥匙未归还
                                    isOpened = false;
                                    doRegister(9, null);
                                    getVM().doAction(9);
                                    getVM().closeGrid(gridDo);
                                }
                            }else {
@@ -419,7 +441,20 @@
                        }
                    }
                }
            }*/
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
            handler.sendEmptyMessageDelayed(1,1000);
        }
    }
@@ -427,6 +462,17 @@
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            if(selectBean!=null){
                //校验时间
                if(keyTime==null){
                    return;
                }
                if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                    //校验返回时间<命令时间
                    return;
                }
                if(handler.hasMessages(0)){
                    handler.removeMessages(0);
                }
                String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                        +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                if(flag==0) {
@@ -440,25 +486,24 @@
                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                    //领取失败
                                    isOpened = false;
                                    doRegister(6, null);
                                    getVM().doAction(6);
                                    getVM().closeGrid(gridDo);
                                }else {
                                    //钥匙不匹配
                                    //Toast.makeText(mContext, "操作10", Toast.LENGTH_LONG).show();
                                    doRegister(10,null);
                                    getVM().doAction(10);
                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                }
                            } else {
                                //钥匙拿走了
                                isOpened = false;
                                doRegister(5, null);
                                getVM().doAction(5);
                                getVM().closeGrid(gridDo);
                            }
                        }else {
                            //没关门
                            if(TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                //空了
                                doRegister(7,null);
                                getVM().doAction(7);
                            }
                        }
                    }else {
@@ -474,24 +519,24 @@
                                if (gridDo.getCurKeyCode().equals(selectBean.getKeyCode())) {
                                    //相同归还成功
                                    isOpened = false;
                                    doRegister(8, null);
                                    getVM().doAction(8);
                                    getVM().closeGrid(gridDo);
                                }else {
                                    //钥匙不匹配
                                    doRegister(10,null);
                                    getVM().doAction(10);
                                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                                }
                            } else {
                                //钥匙未归还
                                isOpened = false;
                                doRegister(9, null);
                                getVM().doAction(9);
                                getVM().closeGrid(gridDo);
                            }
                        }else {
                            //没关门
                            if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                                //有钥匙了
                                doRegister(7,null);
                                getVM().doAction(7);
                            }
                        }
                    } else {
@@ -501,4 +546,24 @@
            }
        }
    }
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 0:
                    //重新发送钥匙查询
                    //发送查询钥匙号
                    EventBus.getDefault().post(new GetKeyStatusEvent());
                    handler.sendEmptyMessageDelayed(0,1200);
                    break;
                case 1:
                    EventBus.getDefault().post(new OpenGridEvent(selectBean.getChannelCode(), selectBean.getBoardCode()));
                    handler.sendEmptyMessageDelayed(1,1000);
                    break;
                default:
                    break;
            }
        }
    };
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -1,10 +1,13 @@
package com.doumee.keyCabinet.ui.keyCabinet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@@ -14,6 +17,7 @@
import android.widget.TextView;
import android.widget.Toast;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
@@ -27,6 +31,7 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -37,6 +42,7 @@
import com.doumee.lib_coremodel.util.RecyclerHelp;
import com.doumee.lib_coremodel.util.StringUtil;
import com.example.datalibrary.db.DBManager;
import com.innohi.YNHAPI;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -100,6 +106,15 @@
            }
        });
        getVM().getCabinetDetail();
        getDB().tvTitle.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //可以下拉
                YNHAPI mAPI = YNHAPI.getInstance();
                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
                return true;
            }
        });
    }
    private void updateBtnStatus(){
@@ -168,11 +183,6 @@
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
            for(int i=0;i<updateList.size();i++){
                upList[i] = updateList.get(i);
            }
            //todo åŽ»æŽ‰
            CabinetGridDo gridDo = oldMap.get("0101");
            if(gridDo!=null){
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙2:"+gridDo.getCurKeyCode()));
            }
            DaoManager.getCabinetGridDao().update(upList);
@@ -344,7 +354,7 @@
        }
        if(isShowOpenTip){
            if(openTipDownCount==0){
                doRegister(9,null);
                getVM().doAction(9);
            }else {
                openTipDownCount--;
                getDB().tvClKmClose.setText(openTipDownCount+"s è‡ªåЍ关闭");
@@ -526,15 +536,14 @@
        }
    }
    private String sygKey;
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()){
            //开门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            if(e.getIsOpen()==0){
                if(e.getKey().equals(sygKey)){
                    return;
                }
                sygKey = e.getKey();
                //开门失败,重新开门
                EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                        Integer.parseInt(e.getKey().substring(0,2), 16)+""));
@@ -542,6 +551,8 @@
        }
    }
    private Long keyTime;
    private HashMap<String,String> closeMap = new HashMap<>();
    /**
     * å…³é—¨
     * @param e
@@ -549,12 +560,23 @@
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()){
            //获取卡号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            if(isShowTip){
                isShowTip = false;
                getDB().clTip.setVisibility(View.GONE); 
            }
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            //发送查询钥匙号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            handler.sendEmptyMessageDelayed(0,1200);
            closeMap.put(e.getKey(),"");
            /*111
            //校验卡号
            CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
            if(gridDo!=null){
@@ -580,20 +602,51 @@
                        }
                    }
                }
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功==>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                getVM().closeGrid(gridDo);
            }*/
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
            }
            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
            Message msg = Message.obtain();
            msg.what=1;
            msg.obj = e.getKey();
            handler.sendMessageDelayed(msg,1000);
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()){
            //校验时间
            if(keyTime==null){
                return;
            }
            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                //校验返回时间<命令时间
                return;
            }
            if(handler.hasMessages(0)){
                handler.removeMessages(0);
            }
            HashMap<String,String> copyMap = new HashMap<>();
            copyMap.putAll(closeMap);
            closeMap.clear();
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                boolean isFail = false;
                if(TextUtils.isEmpty(gridDo.getGridKey())){
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                        //未绑定的存放了钥匙
@@ -602,6 +655,7 @@
                            sb.append("、");
                        }
                        sb.append(gridDo.getCabinetName());
                        isFail = true;
                    }
                }else {
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
@@ -612,7 +666,15 @@
                                sb.append("、");
                            }
                            sb.append(gridDo.getCabinetName());
                            isFail = true;
                        }
                    }
                }
                if(!isFail){
                    if(copyMap.containsKey(gridDo.getGridKey())){
                        //关门成功
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                        getVM().closeGrid(gridDo);
                    }
                }
            }
@@ -625,4 +687,31 @@
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                case 0:
                    //重新发送钥匙查询
                    //发送查询钥匙号
                    EventBus.getDefault().post(new GetKeyStatusEvent());
                    handler.sendEmptyMessageDelayed(0,1200);
                    break;
                case 1:
                    EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
                    handler.sendEmptyMessageDelayed(1,1000);
                    break;
                default:
                    break;
            }
        }
    };
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
@@ -296,7 +296,7 @@
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        if(response.getCode()==200){
                            EventBus.getDefault().post(new HttpEvent("关闭柜格接口成功"));
                            EventBus.getDefault().post(new HttpEvent("关闭柜格接口成功:"+gridDo.getCurKeyCode()));
                            getCabinetDetail();
                            doAction(11);
                        }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
@@ -11,12 +11,14 @@
import android.widget.Toast;
import com.doumee.keyCabinet.BuildConfig;
import com.doumee.keyCabinet.MApplication;
import com.doumee.keyCabinet.R;
import com.doumee.keyCabinet.base.MyBaseActivity;
import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding;
import com.doumee.keyCabinet.event.TimeClockEvent;
import com.doumee.keyCabinet.utils.LMobileInfo;
import com.doumee.lib_coremodel.bean.event.ActionEventData;
import com.innohi.YNHAPI;
import org.greenrobot.eventbus.Subscribe;
@@ -44,7 +46,18 @@
        getDB().tvNo.setText("NO:"+ LMobileInfo.getDeviceUniqueId());
        getDB().tvV.setText("V"+ BuildConfig.VERSION_NAME);
        getDB().tv1.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(MApplication.getConfigBean().getId()==null){
                    //可以下拉
                    YNHAPI mAPI = YNHAPI.getInstance();
                    mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
                    return true;
                }
                return false;
            }
        });
    }
    @Override
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -6,9 +6,11 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Camera;
import android.opengl.Visibility;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -20,6 +22,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -60,6 +63,7 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -109,6 +113,7 @@
import com.example.datalibrary.model.User;
import com.example.datalibrary.utils.ToastUtils;
import com.example.datalibrary.view.PreviewTexture;
import com.innohi.YNHAPI;
import com.yanzhenjie.permission.runtime.Permission;
import org.greenrobot.eventbus.EventBus;
@@ -171,8 +176,21 @@
                        getVM().getFaceLD();
                    }
                    getVM().upBraceletLog();*/
                    case 1:
                        if(isShowing) {
                            EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
                            handler.sendEmptyMessageDelayed(1, 1000);
                        }
                        break;
                    case 2:
                        if(isShowing){
                            //重新发送钥匙查询
                            //发送查询钥匙号
                            EventBus.getDefault().post(new GetKeyStatusEvent());
                            handler.sendEmptyMessageDelayed(2,1200);
                        }
                        break;
                    default:
                        break;
                }
            }
@@ -193,12 +211,12 @@
        getDB().setModel(getVM());
        initRGBCheck();
        handler.sendEmptyMessageDelayed(0, 1000);
        //启动心跳
        /*//启动心跳
        Intent intent = new Intent(MainActivity.this, HeartbeatService.class);
        startService(intent);
        //启动更新人脸
        Intent intent2 = new Intent(MainActivity.this, FaceUpdateService.class);
        startService(intent2);
        startService(intent2);*/
        getPermission();
        Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
    }
@@ -212,10 +230,10 @@
        long availableMemory = memoryInfo.availMem/(1024*1024);
        long usedMemory = totalMemory - availableMemory;
        //getDB().tvM.setText("总内存:"+totalMemory+",使用内存:"+usedMemory+",可用内存:"+availableMemory);
        if((availableMemory<400&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
        if((availableMemory<100&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
                ("02:00:00".equals(StringUtil.getHM()))){
            //可用内存小于400M,或者每天凌晨2点,重启app
            //restartApp();
            restartApp();
        }
    }
@@ -270,7 +288,7 @@
                lastDownTime1 = System.currentTimeMillis();
                downCount1++;
                System.out.println();
                Timber.tag("==>").d(""+downCount1);
                //Timber.tag("==>").d(""+downCount1);
                if(downCount1>4) {
                    downCount1=0;
                    lastDownTime1=null;
@@ -296,24 +314,18 @@
                }
            }
        });
        getDB().tvVersion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo ä¸´æ—¶ä»£ç 
                //setJiuConfig();
                SpUtil.saveString("rbgCameraId","0");
            }
        });
        getDB().imgLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            public void onClick(View v1) {
                //todo ä¸´æ—¶ä»£ç 
                if (getDB().nsv.getVisibility()== View.VISIBLE) {
                    getDB().nsv.setVisibility(View.GONE);
                }else {
                    getDB().nsv.setVisibility(View.VISIBLE);
                }
                YNHAPI mAPI = YNHAPI.getInstance();
                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
            }
        });
        upErrInfo();
@@ -458,6 +470,9 @@
    protected void onResume() {
        super.onResume();
        isShowing = true;
        YNHAPI mAPI = YNHAPI.getInstance();
        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.ALWAYS_INVISIBLE);
        mAPI.setBootLaunchApk("com.doumee.keyCabinet", true);
        showTime = System.currentTimeMillis();
        if(!isFaceOk) {
            initLicense();
@@ -773,7 +788,63 @@
            waitBeans.clear();
            selectBeans.addAll(userBeans);
            finishCount=0;
            faceHandler.sendEmptyMessage(0);
            /*//删除全部
            FaceApi.getInstance().userClean();
            faceHandler.sendEmptyMessage(0);*/
            HashMap<String,String> uMap = new HashMap<>();
            for(FaceUserBean d:selectBeans){
                String key = d.getMemberId().toString()+"_"+d.getGroupId();
                uMap.put(key,"");
            }
            //删除不存在用户
            List<User> users = FaceApi.getInstance().getAllUserList();
            List<User> dels = new ArrayList<>();
            for(User u:users){
                String key = u.getUserId()+"_"+u.getGroupId();
                if(!uMap.containsKey(key)){
                    dels.add(u);
                }
            }
            if(dels.size()>0){
                UserInfoManager.getInstance().deleteUserListInfo(dels,
                        "", new UserInfoManager.UserInfoListener() {
                            @Override
                            public void userListDeleteSuccess() {
                                // ç”¨æˆ·åˆ—表删除成功
                                faceHandler.sendEmptyMessage(0);
                            }
                            @Override
                            public void userListDeleteFailure(String message) {
                                // ç”¨æˆ·åˆ—表删除失败
                                faceHandler.sendEmptyMessage(0);
                            }
                        },
                        new DBLoadListener() {
                            @Override
                            public void onStart(int successCount) {
                            }
                            @Override
                            public void onLoad(int finishCount, int successCount, float progress) {
                            }
                            @Override
                            public void onComplete(List<User> features, int successCount) {
                            }
                            @Override
                            public void onFail(int finishCount, int successCount, List<User> features) {
                            }
                        });
            }else {
                faceHandler.sendEmptyMessage(0);
            }
        }
    }
@@ -1041,14 +1112,21 @@
        }
    }
    private UpdateUtil updateUtil;
    private void checkUpdate(){
        //版本更新
        new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
            @Override
            public void isNeedUpdate(boolean isUpdate) {
                isUpdateVersion = isUpdate;
            }
        });
        if(updateUtil==null){
            updateUtil = new UpdateUtil(this);
            updateUtil.setShowToast(false);
        }
        if(!updateUtil.isShowing()){
            updateUtil.getServerVerCode(new UpdateUtil.VersionCallBack() {
                @Override
                public void isNeedUpdate(boolean isUpdate) {
                    isUpdateVersion = isUpdate;
                }
            });
        }
    }
    private PermissiondDialog permissiondDialog;
@@ -1080,7 +1158,7 @@
    }
    private int tipDownCount = 10;
    private int loopDownCount = 30;
    private int loopDownCount = 60;
    private boolean isShowTip;
    @Subscribe
    public void TimeClockEvent(TimeClockEvent e){
@@ -1095,9 +1173,12 @@
                }
            }
            if(loopDownCount==0){
                loopDownCount = SpUtil.getInt("loop_time",30);
                loopDownCount = SpUtil.getInt("loop_time",60);
                //定时拉取基本信息
                getVM().devLogin();
                getPermission();
                getVM().devHeart();
                EventBus.getDefault().post(new GetFacesEvent());
            }else {
                loopDownCount--;
            }
@@ -1112,8 +1193,12 @@
    public void OpenGridEvent(OpenGridEvent e){
        if(!isFinishing()){
            //开启柜门
            String code = "8A"+SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                    +SportUtils.intToHex(Integer.parseInt(e.getChannelCode()))+"11";
            String key = e.getKey();
            if(TextUtils.isEmpty(key)) {
                key = SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                        + SportUtils.intToHex(Integer.parseInt(e.getChannelCode()));
            }
            String code = "8A" + key + "11";
            code += SportUtils.getBCC(code);
            send485(0,code);
        }
@@ -1176,38 +1261,6 @@
        }
    }
    @Subscribe
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //在首页,校验关门的钥匙是否匹配
            if (e.getIsOpen() == 0) {
                //关门成功
                //查询钥匙号
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
                if (gridDo != null) {
                    getVM().addInfo("比较钥匙:当前:"+gridDo.getCurKeyCode()+", å…³è”钥匙:"+gridDo.getKeyCode());
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&
                            !TextUtils.isEmpty(gridDo.getKeyCode())&&
                            !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                        //钥匙不一样,开门
                        ToastView.show(MApplication.mContext,gridDo.getCabinetName()+"钥匙存放位置错误");
                        EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
                    }else {
                        if(isShowTip){
                            doRegister(5,null);
                        }
                        if(isShowing){
                            //在首页关门成功,需调用关门方法
                            getVM().closeGrid(gridDo);
                        }
                    }
                }
            }
        }
    }
    private SerialPortModel gridPort;
    private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
        @Override
@@ -1267,30 +1320,18 @@
                    if(gridDo!=null){
                        gridDo.setIsOpen("00".equals(open)?1:0);
                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                        //todo åŽ»æŽ‰
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙3:"+gridDo.getCurKeyCode()));
                        DaoManager.getCabinetGridDao().update(gridDo);
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                        if(gridDo.getIsOpen()==0) {
                            //开门失败
                            if (isShowing) {
                                //首页开门失败,钥匙不对
                                if (!TextUtils.isEmpty(gridDo.getCurKeyCode()) &&
                                        !TextUtils.isEmpty(gridDo.getKeyCode()) &&
                                        !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())) {
                                    //钥匙不一样,开门
                                    ToastView.show(MApplication.mContext, gridDo.getCabinetName() + "钥匙存放位置错误");
                                    EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(gridDo.getGridKey().substring(2, 4), 16) + "",
                                            Integer.parseInt(gridDo.getGridKey().substring(0, 2), 16) + ""));
                                }
                            }
                            EventBus.getDefault().post(new OpenErrEvent(key));
                        }else {
                            //开门成功
                            //开门返回
                            EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                        }
                    }
                    //开门返回
                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                }else if(data.length()==16){
                    //批量
                    //8A 02 00 00 00 00 11 99
@@ -1314,14 +1355,6 @@
                                updateList.add(gridDo);
                            }
                        }
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门更新库数据:版号:" +bh+","+updateList.size());
                        });
                        //todo åŽ»æŽ‰
                        CabinetGridDo gridDo = oldMap.get("0101");
                        if(gridDo!=null) {
                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙6:" + gridDo.getCurKeyCode()));
                        }
                        getVM().updateGrids(updateList);
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
@@ -1341,16 +1374,13 @@
                if(gridDo!=null){
                    gridDo.setIsOpen("00".equals(open)?1:0);
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    //todo åŽ»æŽ‰
                    EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙3:"+gridDo.getCurKeyCode()));
                    DaoManager.getCabinetGridDao().update(gridDo);
                }
                //关门返回
                EventBus.getDefault().post(new CloseGridOneResultEvent(key,"00".equals(open)?1:0));
                if(isShowing&&isShowTip){
                    //修改显示提醒
                    doRegister(5,null);
                    getVM().doAction(5);
                }
            }else if(data.startsWith("80")){
                //查询所有门状态
@@ -1393,12 +1423,6 @@
                        runOnUiThread(() -> {
                            getVM().addInfo("更新库数据:版号:" +bh+","+ addList.size()+","+updateList.size());
                        });
                        //todo åŽ»æŽ‰
                        CabinetGridDo gridDo = oldMap.get("0101");
                        if(gridDo!=null){
                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
                                    "=================>更新数据当前钥匙5:"+gridDo.getCurKeyCode()));
                        }
                        getVM().updateGrids(updateList);
                        if(isShowing){
@@ -1520,12 +1544,6 @@
                }
            }
        }
        //todo åŽ»æŽ‰
        CabinetGridDo gridDo = oldMap.get("0101");
        if(gridDo!=null) {
            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+
                    "=================>更新数据当前钥匙7:" + gridDo.getCurKeyCode()));
        }
        getVM().updateGrids(updateList);
        EventBus.getDefault().post(new KeyResultEvent());
@@ -1552,12 +1570,9 @@
            }
            try {
                runOnUiThread(() -> {
                    //getVM().addInfo("获取到酒精检测数据:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                    getVM().addInfo("获取到酒精检测数据:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                });
                String data = new String(bytes);
                runOnUiThread(() -> {
                    //getVM().addInfo("获取到酒精检测是否检测失败:" + (data.contains("blow fail")));
                });
                if(data.contains("blow fail")){
                    //检测失败
                    EventBus.getDefault().post(new JiujinResultEvent(false,null));
@@ -1691,18 +1706,35 @@
        sendPortHandlerMsg(2,"A002010000000003",time+400);
    }
    private String jiu_blow;
    private String jiu_mic_ad;
    private String jiu_alarm;
    private String jiu_unit;
    private void setJiuConfig(long time){
        CabinetConfigDataBean config = MApplication.getConfigBean().getCabinetConfigDataVO();
        //设置吹气时间
        sendPortHandlerMsg(3,"blow:"+config.getBlowTime(),time+100);
        //压力值
        sendPortHandlerMsg(3,"mic_ad:"+config.getPressure(),time+300);
        //浓度阈值
        sendPortHandlerMsg(3,"alarm:"+config.getConcentration(),time+600);
        //浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)
        sendPortHandlerMsg(3,"unit:"+config.getThreshold(),time+900);
        sendPortHandlerMsg(3,"read"+config.getThreshold(),time+1200);
        if(!config.getBlowTime().equals(jiu_blow)) {
            //设置吹气时间
            jiu_blow = config.getBlowTime();
            sendPortHandlerMsg(3, "blow:" + config.getBlowTime(), time += 100);
        }
        if(!config.getPressure().equals(jiu_mic_ad)) {
            //压力值
            jiu_mic_ad = config.getPressure();
            sendPortHandlerMsg(3, "mic_ad:" + config.getPressure(), time += 300);
        }
        if(!config.getConcentration().equals(jiu_alarm)) {
            //浓度阈值
            jiu_alarm = config.getConcentration();
            sendPortHandlerMsg(3, "alarm:" + config.getConcentration(), time += 300);
        }
        if("3".equals(config.getThreshold())){
            config.setThreshold("0");
        }
        if(!config.getThreshold().equals(jiu_unit)) {
            //浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)
            jiu_unit = config.getThreshold();
            sendPortHandlerMsg(3, "unit:" + config.getThreshold(), time += 300);
        }
    }
    private void sendPortHandlerMsg(int what,String obj,long time){
@@ -1715,15 +1747,15 @@
    private boolean isInitPort;
    //初始化串口
    private void initPort(){
        SpUtil.setString("port_grid","/dev/ttyS7");
        SpUtil.setString("port_key","/dev/ttyS1");
        SpUtil.setString("port_jiu","/dev/ttyS2");
        //SpUtil.setString("port_grid","/dev/ttyS7");
        //SpUtil.setString("port_key","/dev/ttyS1");
        //SpUtil.setString("port_jiu","/dev/ttyS2");
        gridPath = SpUtil.getString("port_grid");
        //getVM().addInfo("门串口链接:"+gridPath);
        getVM().addInfo("门串口链接:"+gridPath);
        keyPath = SpUtil.getString("port_key");
        //getVM().addInfo("钥匙串口链接:"+keyPath);
        getVM().addInfo("钥匙串口链接:"+keyPath);
        jiuPath = SpUtil.getString("port_jiu");
        //getVM().addInfo("酒精串口链接:"+jiuPath);
        getVM().addInfo("酒精串口链接:"+jiuPath);
        if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
@@ -1867,10 +1899,6 @@
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //todo åŽ»æŽ‰
                if(type==2){
                    return;
                }
                getVM().addInfo("发送指令:"+StringUtil.DateToStrSS(new Date())+"==>"+code);
            }
        });
@@ -1937,4 +1965,124 @@
        getVM().addInfo("串口全部链接成功:");
        return true;
    }
    //开门
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //开门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
        }
    }
    private Long keyTime;
    private HashMap<String,String> closeMap = new HashMap<>();
    /**
     * å…³é—¨
     * @param e
     */
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            closeMap.put(e.getKey(),"");
            //发送查询钥匙号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            handler.sendEmptyMessageDelayed(2,1200);
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()&&isShowing){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
            Message msg = Message.obtain();
            msg.what=1;
            msg.obj = e.getKey();
            handler.sendMessageDelayed(msg,1000);
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()&&isShowing){
            //校验时间
            if(keyTime==null){
                return;
            }
            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                //校验返回时间<命令时间
                return;
            }
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            HashMap<String,String> copyMap = new HashMap<>();
            copyMap.putAll(closeMap);
            closeMap.clear();
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                //要在范围内
                if(copyMap.containsKey(gridDo.getGridKey())){
                    boolean isFail = false;
                    if(TextUtils.isEmpty(gridDo.getGridKey())){
                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                            //未绑定的存放了钥匙
                            keys.add(gridDo.getGridKey());
                            if(sb.length()>0){
                                sb.append("、");
                            }
                            sb.append(gridDo.getCabinetName());
                            isFail = true;
                        }
                    }else {
                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                            if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())&&gridDo.getIsOpen()==0){
                                //钥匙不匹配
                                keys.add(gridDo.getGridKey());
                                if(sb.length()>0){
                                    sb.append("、");
                                }
                                sb.append(gridDo.getCabinetName());
                                isFail = true;
                            }
                        }
                    }
                    if(!isFail){
                        //关门成功
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                        getVM().closeGrid(gridDo);
                    }
                }
            }
            if(sb.length()>0){
                ToastView.show(MApplication.mContext, sb.toString() + "钥匙存放位置错误");
            }
            if(keys.size()>0){
                //开门
                EventBus.getDefault().post(new OpenGridListEvent(keys));
            }
        }
    }
}
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
@@ -71,7 +71,6 @@
    public void devLogin(){
        //清除登录信息
        MApplication.saveConfigBean(new DevConfigBean());
        EventBus.getDefault().post(new HttpEvent("获取钥匙柜基本信息-请求"));
        getRetrofitService(Apis.class).getCabinetInfoForDriver(LMobileInfo.getDeviceUniqueId())
                .compose(RxUtils.schedulersTransformer())
@@ -89,6 +88,7 @@
                                toast(MApplication.mContext.getString(R.string.guide_toast_1));
                            }
                        }else {
                            MApplication.saveConfigBean(new DevConfigBean());
                            toast(response.getMessage());
                        }
                    }
@@ -158,12 +158,6 @@
            DaoManager.getCabinetGridDao().insert(addList);
        }
        //todo åŽ»æŽ‰
        CabinetGridDo gridDo = oldMap.get("0101");
        if(gridDo!=null){
            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"=================>更新数据当前钥匙1:"+gridDo.getCurKeyCode()));
        }
        if(updateList.size()>0){
            CabinetGridDo[] upList = new CabinetGridDo[updateList.size()];
            for(int i=0;i<updateList.size();i++){
@@ -215,13 +209,13 @@
                                List<FaceUserBean> datas = new ArrayList<>();
                                if(faceBean!=null&&faceBean.getAutoFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getAutoFaceList()){
                                        bean.setGroupId("1");
                                        bean.setGroupId("0");
                                    }
                                    datas.addAll(faceBean.getAutoFaceList());
                                }
                                if(faceBean!=null&&faceBean.getDriverFaceList()!=null){
                                    for(FaceUserBean bean:faceBean.getDriverFaceList()){
                                        bean.setGroupId("0");
                                        bean.setGroupId("1");
                                    }
                                    datas.addAll(faceBean.getDriverFaceList());
                                }
@@ -330,7 +324,7 @@
                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                    @Override
                    public void onNext(@NonNull BaseResponse response) {
                        toast("关门接口调用成功");
                    }
                    @Override
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
@@ -14,6 +14,7 @@
import com.doumee.keyCabinet.ui.guide.GuideActivity;
import com.doumee.keyCabinet.ui.main.MainActivity;
import com.doumee.lib_coremodel.util.SpUtil;
import com.innohi.YNHAPI;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
@@ -86,22 +87,30 @@
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            //导出异常信息到SD卡中
            YNHAPI mAPI = YNHAPI.getInstance();
            mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
            dumpExceptionToSDCard(ex);
            //System.out.println("重启应用");
            // åˆ›å»ºä¸€ä¸ªæ–°çš„启动意图
            /*Intent intent = new Intent(mContext, MainActivity.class);
            // è®¾ç½®FLAG_ACTIVITY_CLEAR_TASK标志位
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            // ä½¿ç”¨PendingIntent包装启动意图
            PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
            // èŽ·å–AlarmManager实例
            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
            // åœ¨500毫秒后触发重启操作
            alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
            long time = SpUtil.getLong("err_app");
            SpUtil.saveLong("err_app",System.currentTimeMillis());
            if(System.currentTimeMillis()-time>60000){
                //报错间隔60秒,才重启
                //System.out.println("重启应用");
                // åˆ›å»ºä¸€ä¸ªæ–°çš„启动意图
                Intent intent = new Intent(mContext, MainActivity.class);
                // è®¾ç½®FLAG_ACTIVITY_CLEAR_TASK标志位
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                // ä½¿ç”¨PendingIntent包装启动意图
                PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
                // èŽ·å–AlarmManager实例
                AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
                // åœ¨500毫秒后触发重启操作
                alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);*/
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
            //这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("错误日志1"+e.getMessage());
@@ -263,7 +272,7 @@
            dumpPhoneInfo(print);
            print.println();
            ex.printStackTrace(print);
            SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
            //SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
            print.close();
        } catch (Exception e) {
            e.printStackTrace();
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/face/FaceSDKManager.java
@@ -66,7 +66,7 @@
            }
            return;
        }
        // todo å¢žåŠ åˆ¤ç©ºå¤„ç†
        if (listener != null) {
            listener.initStart();
        }
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateDialog.java
@@ -55,7 +55,7 @@
                }
            }
        });
        getWritePermision();
        //getWritePermision();
    }
    public void setOnOtemListener(UpdialogListener lister) {
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/UpdateUtil.java
@@ -57,6 +57,17 @@
        // thread.interrupt();
        // }
    }
    public boolean isShowing() {
        if(updateDialog!=null&&updateDialog.isShowing()){
            return true;
        }
        if(downloadDialog!=null&&downloadDialog.isShowing()){
            return true;
        }
        return false;
    }
    public static interface VersionCallBack{
        void isNeedUpdate(boolean isUpdate);
    }
@@ -81,8 +92,8 @@
                                    versionCallBack.isNeedUpdate(true);
                                    upgradeurl=data.getFullFileUrl();
                                    updatelog=data.getContent();
                                    newVerName = response.getData().getVersionInfo();
                                    doNewVersionUpdate(true);
                                    newVerName = data.getVersionInfo();
                                    doNewVersionUpdate(data.getIsForce()==1);
                                }else {
                                    versionCallBack.isNeedUpdate(false);
                                }
@@ -117,6 +128,7 @@
        }
    }
    private UpdateDialog updateDialog;
    // æ›´æ–°æ–°ç‰ˆæœ¬
    public void doNewVersionUpdate(boolean type) {
        StringBuffer sb = new StringBuffer();
@@ -132,7 +144,10 @@
        }
        // sb.append(updatelog+"\n\n\r");
        // new UpdateDialog(activity).show();
        final UpdateDialog updateDialog = new UpdateDialog(activity);
        if(updateDialog!=null&&updateDialog.isShowing()){
            updateDialog.dismiss();
        }
        updateDialog = new UpdateDialog(activity);
        updateDialog.setText(sb.toString(),newVerName);
        updateDialog.setOnOtemListener(new UpdateDialog.UpdialogListener() {
keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -17,6 +17,18 @@
        android:background="@color/white"
        >
        <EditText
            android:id="@+id/et_ewm"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text=""
            android:inputType="number"
            app:layout_constraintTop_toTopOf="@+id/viewBack"
            app:layout_constraintBottom_toBottomOf="@+id/viewBack"
            app:layout_constraintStart_toStartOf="parent"
            android:background="@null"
            />
        <View
            android:id="@+id/viewBack"
            android:layout_width="0dp"
@@ -482,20 +494,7 @@
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:background="@color/white"
            android:visibility="visible">
            <EditText
                android:id="@+id/et_ewm"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:text=""
                android:inputType="number"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:background="@null"
                android:layout_marginTop="20dp"
                />
            android:visibility="gone">
            <View
                android:id="@+id/v_c_sl"
@@ -703,10 +702,10 @@
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_jiujin_ok"
            android:paddingLeft="80dp"
            android:paddingRight="80dp"
            android:paddingTop="50dp"
            android:paddingBottom="50dp"
            android:paddingLeft="60dp"
            android:paddingRight="60dp"
            android:paddingTop="40dp"
            android:paddingBottom="40dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
@@ -715,8 +714,8 @@
            <pl.droidsonroids.gif.GifImageView
                android:id="@+id/img_progress"
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:src="@mipmap/zhuanquan"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
@@ -736,5 +735,23 @@
        </androidx.constraintlayout.widget.ConstraintLayout>
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/activity_vertical_margin"
            android:layout_marginRight="@dimen/activity_vertical_margin"
            android:text=""
            android:textColor="@color/white"
            android:textSize="24sp"
            android:padding="@dimen/activity_horizontal_margin"
            android:background="@drawable/toast_view_bg"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:gravity="center"
            android:visibility="gone"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
keyCabinet-android/app/src/main/res/layout/layout_download.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_width="450dp"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center"
keyCabinet-android/app/src/main/res/layout/main_activity.xml
@@ -22,21 +22,6 @@
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>
        <TextView
            android:id="@+id/tv_m"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="内存"
            android:textSize="30sp"
            android:textColor="@color/white"
            android:gravity="center"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:paddingLeft="0dp"
            android:paddingRight="10dp"
            android:visibility="gone"
            />
        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/img1"
            android:layout_width="match_parent"
@@ -420,5 +405,20 @@
            app:layout_constraintStart_toStartOf="parent"
            />
        <TextView
            android:id="@+id/tv_m"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="30sp"
            android:textColor="@color/black"
            android:gravity="center"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:paddingLeft="0dp"
            android:paddingRight="10dp"
            android:visibility="gone"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
@@ -37,18 +37,6 @@
            android:layout_marginLeft="15dp"
            android:layout_marginTop="10dp"
            android:paddingBottom="9dp"/>
        <TextView
            android:id="@+id/tv3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.keyCode}"
            android:textColor="#ff279baa"
            android:textSize="14sp"
            app:layout_constraintTop_toBottomOf="@+id/tv2"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="10dp"
            android:paddingBottom="9dp"/>
        <ImageView
            android:layout_width="45dp"
keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
@@ -88,7 +88,7 @@
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
                android:text="18656077929"
                android:text=""
                android:textColor="#111111"
                android:hint="请输入登录账号"
                android:textColorHint="#999999"
@@ -138,7 +138,7 @@
                android:layout_width="0dp"
                android:layout_height="75dp"
                android:background="@null"
                android:text="Whyc2025"
                android:text=""
                android:hint="请输入账号密码"
                android:textColorHint="#999999"
                android:textSize="24sp"
keyCabinet-android/app/src/main/res/layout/ui_update_dialog.xml
@@ -2,7 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rl_root"
    android:layout_width="match_parent"
    android:layout_width="450dp"
    android:layout_height="wrap_content">
    <androidx.constraintlayout.widget.ConstraintLayout
keyCabinet-android/app/src/main/res/values/strings.xml
@@ -114,8 +114,8 @@
    <string name="main_tip3">人脸库加载失败,共%1$d条数据, å·²åŠ è½½%2$d条数据</string>
    <string name="main_tip4">模型加载成功,欢迎使用</string>
    <string name="main_tip5">模型加载失败,请尝试重启应用</string>
    <string name="face_hy">会员</string>
    <string name="face_xy">管理员</string>
    <string name="face_hy">司机</string>
    <string name="face_xy">验证人</string>
    <string name="guide_2">设备未登录</string>
    <string name="face_login">人脸识别中</string>
    <string name="face_tip1">请正视前方,不要遮挡脸部</string>
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -309,15 +309,14 @@
    private static BDFaceImageInstance rgbInstance =null;
    private LivenessModel livenessModel;
    private String groupId;
    /**
     * 0:管理员,1:用户
     * @param groupId
     */
    public void setGroupId(String groupId){
        if(livenessModel!=null){
            livenessModel.setGroupId(groupId);
        }
        this.groupId = groupId;
    }
    /**
     * æ£€æµ‹-活体-特征-人脸检索流程
@@ -1215,7 +1214,7 @@
                    //System.out.println("==isOk==>匹配到数量"+featureResult.size());
                    User user = null;
                    Feature topFeature = null;
                    if(TextUtils.isEmpty(livenessModel.getGroupId())){
                    if(TextUtils.isEmpty(groupId)){
                        //为空,需要排序,优先取会员
                        for(Feature feat:featureResult) {
                            threholdScore = bdFaceCheckConfig.scoreThreshold;
@@ -1242,7 +1241,7 @@
                                //System.out.println("==isOk==>50");
                                // å½“前featureEntity åªæœ‰id+feature ç´¢å¼•,在数据库中查到完整信息
                                User userOld = FaceApi.getInstance().getUserListById(feat.getId());
                                if(livenessModel.getGroupId().equals(userOld.getGroupId())){
                                if(groupId.equals(userOld.getGroupId())){
                                    user = userOld;
                                    topFeature = feat;
                                    break;
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/base/BaseViewModel.java
@@ -228,6 +228,10 @@
        actionEvent.setValue(new ActionEventData(type));
    }
    public void doAction(int type,String obj){
        actionEvent.setValue(new ActionEventData(type,obj));
    }
    public LifecycleOwner getLifecycleOwner() {
        return lifecycleOwner;
    }
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/bean/event/ActionEventData.java
@@ -28,6 +28,13 @@
        this.data.put("type",type);
    }
    public ActionEventData(int type,String obj){
        this.action = ActionEvent.Action.DO;
        this.data = new HashMap<>();
        this.data.put("type",type);
        this.data.put("obj",obj);
    }
    public ActionEventData(int action,Object value) {
        this.action = action;
        this.data = new HashMap<>();
keyCabinet-android/lib_coremodel/src/main/java/com/doumee/lib_coremodel/util/SpUtil.java
@@ -104,6 +104,16 @@
        return getSharedPreferences().getInt(key, 0);
    }
    public static void saveLong(String key, Long value){
        SharedPreferences.Editor editor = getSharedPreferences().edit();
        editor.putLong(key, value);
        editor.commit();
    }
    public static Long getLong(String key){
        return getSharedPreferences().getLong(key, 0L);
    }
    public static boolean getBoolean(String key){
        return getSharedPreferences().getBoolean(key, false);
    }
keyCabinet-android/lib_coremodel/src/main/res/values/colors.xml
@@ -8,4 +8,5 @@
    <color name="line">#E5E5E5</color>
    <color name="bg">#fff4f6f9</color>
    <color name="f7">#F7F7F7</color>
    <color name="dialog_bg">#80000000</color>
</resources>
server/meeting/meeting_admin/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      config:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_dev
#        namespace: dev_renkang
        username: nacos
@@ -23,7 +23,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dev_renkang
        namespace: dmvisit
        username: nacos
server/meeting/meeting_admin/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
      username: nacos
      password: Atwl@2024
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
server/meeting/meeting_admin/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      config:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_dev
#        namespace: dev_renkang
        username: nacos
@@ -23,7 +23,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: wuhu_visit_dev
        namespace: dmvisit_dev
        username: nacos
server/meeting/meeting_admin/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      config:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_test
        username: nacos
        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_test
        username: nacos
        password: nacos
server/startsh/admin_start.sh
@@ -8,8 +8,15 @@
/usr/local/nacos/nacos/bin/startup.sh -m standalone
nohup java -jar /usr/local/jars/system_gateway.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/admin_timer.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/system_timer.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/admin_interface.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/meeting_admin.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/wuhuyancao/system_gateway.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/wuhuyancao/admin_timer.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/wuhuyancao/system_timer.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/wuhuyancao/admin_interface.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/wuhuyancao/meeting_admin.jar > /dev/null 2>&1 &
cd /usr/local/ortools/java_or-tools
tail -f /usr/local/jars/logs/visitsAdmin/info.2025-10-31.0.log
server/startsh/Æô¶¯½Å±¾ºÍÈÕÖ¾´¦Àí½Å±¾ËµÃ÷.txt
@@ -11,3 +11,9 @@
#按Esc键后再输入:wq!,回车保存
#查看是否创建成功
crontab -l
#JAVA spring boot中使用google的ortools(算法包)
Linux系统安装对应的版本服务:
https://developers.google.cn/optimization/install/java/pkg_linux?hl=zh-cn#ubuntu
 https://modelers.csdn.net/68db8ec14b11580edfa299c6.html?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-5-134512600-blog-119785705.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-5-134512600-blog-119785705.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=10
server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerHeaderFilter.java
@@ -1,6 +1,6 @@
package com.doumee.config.swagger;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,11 +1,11 @@
spring:
  cloud:
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: wuhu_visit_dev1
        username: nacos
server/system_gateway/src/main/resources/bootstrap-self.yml
@@ -1,11 +1,11 @@
spring:
  cloud:
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: wuhu_visit_dev
        username: nacos
server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,11 +1,11 @@
spring:
  cloud:
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        #        namespace: dmvisit
        namespace: wuhu_visit_test
        username: nacos
server/system_service/pom.xml
@@ -356,22 +356,5 @@
             </exclusions>
        </dependency>
-->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>4.31.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.ortools</groupId>
            <artifactId>ortools-java</artifactId>
            <version>9.14.6206</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
server/system_service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
@@ -150,7 +150,7 @@
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void create(CreateSystemUserDTO systemUser) {
    public void  create(CreateSystemUserDTO systemUser) {
        // éªŒè¯ç”¨æˆ·å
        SystemUser queryUserDto = new SystemUser();
        queryUserDto.setUsername(systemUser.getUsername());
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -790,7 +790,7 @@
                String t = reversedHex.substring(i*2,i*2+2);
                result += new StringBuilder(t).reverse().toString();
            }
            return result;
            return result.toUpperCase();
        }catch (Exception e){
        }
@@ -1130,7 +1130,7 @@
        WAIT_CALL(2, "已签到","已签到"),
        IN_WAIT(3, "入园等待","入园等待" ),
        CALLED(4, "已叫号","已叫号" ),
         WORKING(5, "作业中","作业中" ),
        WORKING(5, "作业中","作业中" ),
        DONE(6, "作业完成 ","作业完成" ),
        TRANSFERING(7, "转移中","转移中" ),
        EXCEPTION(8, "异常挂起","异常挂起" ),
@@ -1194,7 +1194,7 @@
        IN_CITY_CAR_USE(3, "公车市内用车 ", "公车市内用车 "),
        OUT_CITY_CAR_USE(4, "公车室外用车 ", "公车室外用车 "),
        CITY_WLC_BOOK(5, "市公司物流车预约 ", "5市公司物流车预约 "),
        PLATFROM_REASON(6, "月台入园原因审批 ", "月台入园原因审批 "),
        PLATFROM_REASON(6, "月台入园原因审批 ", "月台入园原因审批 ")
        ;
        // æˆå‘˜å˜é‡
        private String name;
@@ -1523,18 +1523,20 @@
    public  enum WarningConfig {
        ALARM_TEST(10002, "酒精测试"),
        GRID_TIME_OUT_INFO(10003, "开门超时未关闭"),
        KEY_TIME_OUT_BACK(10004, "钥匙超时未归还"),
        ALARM_TEST(10002, "【钥匙柜】酒精测试异常",0),
        GRID_TIME_OUT_INFO(10003, "【钥匙柜】开门超时未关闭",0),
        KEY_TIME_OUT_BACK(10004, "【钥匙柜】钥匙超时未归还",0),
        ;
        // æˆå‘˜å˜é‡
        private int key;
        private String info;
        private int processArea;
        // æž„造方法
        WarningConfig(int key,String info) {
        WarningConfig(int key,String info,int processArea) {
            this.key = key;
            this.info = info;
            this.processArea = processArea;
        }
@@ -1554,6 +1556,15 @@
            this.info = info;
        }
        public int getProcessArea() {
            return processArea;
        }
        public void setProcessArea(int processArea) {
            this.processArea = processArea;
        }
    }
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -16,7 +16,6 @@
import cn.hutool.core.date.DateUnit;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
/**
 * æ—¥æœŸå·¥å…·ç±»
 * @author: jiangping
@@ -2972,7 +2971,7 @@
//            Date date1 = getISO8601DateByStr("2024-06-14T08:46:36.014+08:00");
//            System.out.println(DateUtil.afterMinutesDate(-5));
            System.out.println(DateUtil.getFirstThisMonthDate());
            System.out.println(DateUtil.getWeekZhouOfDate(getDateFromString2("2025-11-06 00:00:00")));
//            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
//            System.out.println(DateUtil.getBeforMonthStr(new Date(),12));
@@ -3114,7 +3113,6 @@
        String temp = sdf.format(date);
        String firstDayInMoth = "";
        firstDayInMoth = temp + "-01";
        return firstDayInMoth;
    }
@@ -3147,7 +3145,8 @@
     */
    public static String getWeekZhouOfDate(Date dt) {
        String[] weekDays = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
        Calendar cal = Calendar.getInstance();
        TimeZone china = TimeZone.getTimeZone("Asia/Shanghai");
        Calendar cal = Calendar.getInstance(china);
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
server/system_service/src/main/java/com/doumee/core/utils/Monitor.java
@@ -1,7 +1,6 @@
package com.doumee.core.utils;
import com.doumee.core.utils.monitor.*;
import com.sun.jna.platform.mac.DiskArbitration;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -115,4 +115,7 @@
    @PostMapping("/timer/systemUserJob/jobForOpenProhibitStatus")
    ApiResponse jobForOpenProhibitStatus();
    @ApiOperation("【钥匙柜】定时发送钥匙未及时归还通知")
    @PostMapping("/timer/jkCabinet/timeOutUnBackAlarm")
    ApiResponse timeOutUnBackAlarm();
}
server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -12,11 +12,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
@@ -24,7 +24,7 @@
      #        group: dev
      #        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_dev
        username: nacos
        password: nacos
server/system_timer/src/main/resources/bootstrap-pro.yml
@@ -16,7 +16,7 @@
      username: nacos
      password: nacos
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
server/system_timer/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
@@ -22,7 +22,7 @@
      #        group: dev
      #        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_dev
        username: nacos
        password: nacos
server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
@@ -22,7 +22,7 @@
      #        group: dev
      #        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_test
        username: nacos
        password: nacos
server/visits/admin_timer/pom.xml
@@ -22,6 +22,18 @@
            <groupId>com.doumee</groupId>
            <artifactId>dmvisit_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>4.31.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
server/visits/admin_timer/src/main/java/com/doumee/api/JkCabinetTimerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.api;
import com.doumee.service.business.JkCabinetLogService;
import com.doumee.service.business.JkCustomerService;
import com.doumee.service.business.impl.JkCabinetGridServiceImpl;
import com.doumee.service.business.third.model.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "钥匙柜定时器")
@RestController
@RequestMapping("/timer/jkCabinet")
public class JkCabinetTimerController extends BaseController {
    @Autowired
    private JkCabinetLogService jkCabinetLogService;
    @Autowired
    private JkCabinetGridServiceImpl impl;
    @ApiOperation("定时发送钥匙未及时归还通知")
    @PostMapping("/timeOutUnBackAlarm")
    public ApiResponse timeOutUnBackAlarm() {
        jkCabinetLogService.timeOutUnBackAlarm(impl);
        return ApiResponse.success("定时发送钥匙未及时归还通知");
    }
}
server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_dev
        username: nacos
        password: nacos
server/visits/admin_timer/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
      username: nacos
      password: nacos
      #      config:
      #        server-addr: http://192.168.0.212:8848 #配置Nacos地址
      #        server-addr: http://192.168.0.7:8848 #配置Nacos地址
      #        namespace: dmvisit
      #        username: nacos
      #        password: nacos
server/visits/admin_timer/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: dmvisit
        username: nacos
        password: nacos
server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_test
        username: nacos
        password: nacos
server/visits/dmvisit_admin/pom.xml
@@ -49,6 +49,32 @@
                    <fork>true</fork>
                    <mainClass>com.doumee.VisitsAdminApplication</mainClass>
                    <layout>ZIP</layout>
                    <requiresUnpack>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-java</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-linux-x86-64</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-darwin-x86-64</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-win32-x86-64</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-linux-aarch64</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>com.google.ortools</groupId>
                            <artifactId>ortools-darwin-aarch64</artifactId>
                        </dependency>
                    </requiresUnpack>
                </configuration>
                <executions>
                    <execution>
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -7,6 +7,7 @@
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.config.jwt.JwtProperties;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
@@ -171,6 +172,14 @@
        String result = hkSyncPushService.dealVisitEvent(param,response);
        return ApiResponse.success(result);
    }
    @ApiOperation("【海康】其他订阅事件订阅推送对接处理接口")
    @PostMapping("/push/notice")
    @LoginNoRequired
    public ApiResponse pushNotice(@RequestBody EventVisitRequest param, HttpServletResponse response){
        String result = hkSyncPushService.dealVisitEvent(param,response);
        return ApiResponse.success(result);
    }
    @ApiOperation("【海康】访客ICCM事件订阅推送对接处理接口")
    @PostMapping("/push/visitIccm")
    @LoginNoRequired
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/cabinet/CabinetController.java
@@ -183,9 +183,9 @@
    @LoginNoRequired
    @ApiOperation("获取IC卡用户主键 - å¸æœº")
    @PostMapping("/getMemberIdByCode")
    public ApiResponse<Integer> getMemberIdByCode(@RequestParam String code) {
        this.saveInterfaceLog(Constants.strToJson("code",code), null,"getMemberIdByCode","获取IC卡用户主键 - å¸æœº");
        return ApiResponse.success(jkIccardService.getMemberIdByCode(code));
    public ApiResponse<Integer> getMemberIdByCode(@RequestBody QueryUserByCodeDTO dto) {
        this.saveInterfaceLog(JSONObject.toJSONString(dto), null,"getMemberIdByCode","获取IC卡用户主键 - å¸æœº");
        return ApiResponse.success(jkIccardService.getMemberIdByCode(dto));
    }
    private void saveInterfaceLog(String s, String result,String url,String name) {
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: wuhu_visit_dev1
        username: nacos
server/visits/dmvisit_admin/src/main/resources/bootstrap-pro.yml
@@ -14,7 +14,7 @@
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
server/visits/dmvisit_admin/src/main/resources/bootstrap-self.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
        namespace: wuhu_visit_dev
        username: nacos
server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,11 +10,11 @@
        # æš‚时关闭缓存
        enabled: false
    nacos:
      server-addr: http://192.168.0.212:8848 #配置Nacos地址
      server-addr: http://192.168.0.7:8848 #配置Nacos地址
      username: nacos
      password: nacos
#      config:
#        server-addr: http://192.168.0.212:8848 #配置Nacos地址
#        server-addr: http://192.168.0.7:8848 #配置Nacos地址
#        namespace: dmvisit
#        username: nacos
#        password: nacos
@@ -22,7 +22,7 @@
#        group: dev
#        data-id: com.doumee.meeting.admin
      discovery:
        server-addr: http://192.168.0.212:8848 #配置Nacos地址
        server-addr: http://192.168.0.7:8848 #配置Nacos地址
        namespace: wuhu_visit_test
        username: nacos
        password: nacos
server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: dev
    active: test
  application:
    name: visitsAdmin
    # å®‰å…¨é…ç½®
server/visits/dmvisit_screen/pom.xml
@@ -21,6 +21,18 @@
            <groupId>com.doumee</groupId>
            <artifactId>dmvisit_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>4.31.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
server/visits/dmvisit_service/pom.xml
@@ -21,6 +21,11 @@
            <groupId>com.doumee</groupId>
            <artifactId>system_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.google.ortools</groupId>
            <artifactId>ortools-java</artifactId>
            <version>9.14.6206</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -27,7 +27,7 @@
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -519,7 +519,6 @@
    /**
     * å®‰é˜²/消防 markdown
     * @param hiddenDanger
     * @return
     */
    public OapiMessageCorpconversationAsyncsendV2Request.Msg getAlarmNoticeMsg(String areaName,String submitTime,String infoType){
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseInfoRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.core.haikang.model.param.request.event.base;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitDataRequest;
import lombok.Data;
@Data
public class EventBaseInfoRequest {
    private String  eventId;//    String    äº‹ä»¶å”¯ä¸€æ ‡è¯†    æ˜¯    64
    private String  srcIndex;//    String    äº‹ä»¶æºç¼–号,物理设备是资源编号    æ˜¯    64
    private String  srcType;//    String    äº‹ä»¶æºç±»åž‹    æ˜¯    16
    private Integer  eventType    ;//Number    äº‹ä»¶ç±»åž‹    æ˜¯
    private String  srcName;//    String    äº‹ä»¶æºåç§°    å¦    64
    private Integer   status    ;//Number    äº‹ä»¶çŠ¶æ€    æ˜¯        0-瞬时1-开始2-停止3-事件脉冲4-事件联动结果更新5-异步图片上传
    private Integer  timeout    ;//Number    è„‰å†²è¶…æ—¶æ—¶é—´    æ˜¯        å•位:秒
    private String  happenTime    ;//String    äº‹ä»¶å‘生时间(设备时间)    æ˜¯    64
    private String   srcParentIndex    ;//String    äº‹ä»¶å‘生的事件源父设备编号    å¦    64
    private JSONObject data;
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.doumee.core.haikang.model.param.request.event.base;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
import lombok.Data;
import java.util.List;
@Data
public class EventBaseParamRequest {
    private String   sendTime;//    P    String    äº‹ä»¶ä»ŽæŽ¥æ”¶è€…(程序处理后)发出的时间    æ˜¯    32    äº‹ä»¶å‘送时间
    private String    ability;//    P    String    äº‹ä»¶ç±»åˆ«    æ˜¯    64    æ ‡è¯†åœè½¦åœºäº‹ä»¶
    private String[] uids;//    String[]    ç”¨æˆ·id    å¦    ä¸é™
    private String[] clients    ;//String[]    ç»„件标识    å¦    ä¸é™
    private List<EventBaseInfoRequest> events;//    P    Events[]    äº‹ä»¶ä¿¡æ¯    æ˜¯    ä¸é™
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/base/EventBaseRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.doumee.core.haikang.model.param.request.event.base;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitParamRequest;
import lombok.Data;
@Data
public class EventBaseRequest {
//    private String  parkIndexCodes    ;//    string    False    åœè½¦åº“唯一标识集合  å¤šä¸ªå€¼ä½¿ç”¨è‹±æ–‡é€—号分隔,不超过1000个
    private String   method    ;//    String    æ–¹æ³•名,用于标识报文用途    æ˜¯    16    äº‹ä»¶å›ºå®šOnEventNotify
    private EventBaseParamRequest params    ;//    Params    äº‹ä»¶å‚数信息    æ˜¯    ä¸é™    å…·ä½“参数信息
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitDataRequest.java
@@ -6,7 +6,6 @@
@Data
public class EventVisitDataRequest {
        private String   visitorId    ;//String    è®¿å®¢id    æ˜¯    64    å¯¹åº”访客来访记录中的orderId字段
        private String   personName;//    String    å§“名    æ˜¯    32
        private Integer  sex;//    Number    æ€§åˆ«    æ˜¯        1-男2-女
@@ -27,5 +26,4 @@
        private String   svrIndexCode;//    String    å›¾ç‰‡å­˜å‚¨æœåŠ¡å™¨å”¯ä¸€æ ‡è¯†    å¦
        private String   beVisitedPersonId;//    String    è¢«è®¿é—®äººId    æ˜¯
        private String   beVisitedPersonOrgId;//    String    è¢«è®¿é—®äººæ‰€å±žç»„织Id    æ˜¯
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitRequest.java
@@ -5,8 +5,7 @@
@Data
public class EventVisitRequest {
//    private String  parkIndexCodes    ;//    string    False    åœè½¦åº“唯一标识集合  å¤šä¸ªå€¼ä½¿ç”¨è‹±æ–‡é€—号分隔,不超过1000个
//    private String  parkIndexCodes;//    string    False    åœè½¦åº“唯一标识集合  å¤šä¸ªå€¼ä½¿ç”¨è‹±æ–‡é€—号分隔,不超过1000个
    private String   method    ;//    String    æ–¹æ³•名,用于标识报文用途    æ˜¯    16    äº‹ä»¶å›ºå®šOnEventNotify
    private EventVisitParamRequest params    ;//    Params    äº‹ä»¶å‚数信息    æ˜¯    ä¸é™    å…·ä½“参数信息
server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
@@ -5,7 +5,7 @@
import com.google.ortools.Loader;
import com.google.ortools.constraintsolver.*;
import lombok.extern.slf4j.Slf4j;
import com.google.protobuf.Internal.IntListAdapter.IntConverter;
import com.google.ortools.constraintsolver.mainJNI;
import java.util.ArrayList;
import java.util.List;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AbnormalOpenGridDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.business.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class AbnormalOpenGridDTO {
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
    @ApiModelProperty(value = "板号")
    private String boardCode;
    @ApiModelProperty(value = "通道号")
    private String channelCode;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AlcoholTestAlarmDTO.java
@@ -18,5 +18,8 @@
    @ApiModelProperty(value = "酒精度数")
    private String alcoholNum;
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
@@ -25,4 +25,6 @@
    @ApiModelProperty(value = "用户主键")
    private Integer memberId;
    @ApiModelProperty(value = "开启方式:0=系统开启;1=手动开启")
    private Integer openType;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
@@ -21,4 +21,6 @@
    @ApiModelProperty(value = "柜格主键列表")
    private List<Integer> gridIdList;
    @ApiModelProperty(value = "开启方式:0=系统开启;1=手动开启")
    private Integer openType;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/QueryUserByCodeDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.doumee.dao.business.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class QueryUserByCodeDTO {
    @ApiModelProperty(value = "IC卡号")
    private String code;
    @ApiModelProperty(value = "关联人员类型:0=司机;1=校验人员", example = "1")
    private Integer userType;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -44,7 +44,7 @@
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ApiModelProperty(value = "备注 è®°å½•开门方式")
    private String info;
    @ApiModelProperty(value = "钥匙柜编码(关联jk_cabinet)", example = "1")
@@ -90,6 +90,8 @@
    @ApiModelProperty(value = "操作后钥匙状态:0未变化;1已归还;2已借出;", example = "1")
    private Integer keyStatus;
    @ApiModelProperty(value = "是否发送通知:0=否;1=是;", example = "1")
    private Integer isNotice;
    @ApiModelProperty(value = "归还时间")
    @TableField(exist = false)
@@ -101,7 +103,7 @@
    private String companyName;
    @ApiModelProperty(value = "操作人名称", example = "1")
    @ExcelColumn(name="操作人",index = 1,width = 2)
    @ExcelColumn(name="操作人",index = 1,width = 12)
    @TableField(exist = false)
    private String memberName;
@@ -125,4 +127,8 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    @ApiModelProperty(value = "所在位置")
    @TableField(exist = false)
    private String location;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
@@ -79,7 +79,7 @@
    private String sortno;
    @ApiModelProperty(value = "经纬度", example = "1")
    @ExcelColumn(name="经纬度",index = 3,width = 10)
    @ExcelColumn(name="经纬度",index = 4,width = 10)
    @TableField(exist = false)
    private String locationInfo;
    @ApiModelProperty(value = "送货路线编码(关联jk_line)", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
@@ -78,6 +78,11 @@
    private Integer status;
    @ApiModelProperty(value = "标签明码 åŠ å¯†åŽç”Ÿæˆ rfid_lable", example = "1")
    @ExcelColumn(name="标签明码 åŠ å¯†åŽç”Ÿæˆ rfid_lable")
    private String rfidCode;
    @ApiModelProperty(value = "存放位置", example = "1")
    @TableField(exist = false)
    private String gridCode;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
@@ -35,7 +35,6 @@
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
@@ -44,7 +43,6 @@
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningEvent.java
@@ -72,6 +72,9 @@
    @ExcelColumn(name="所在位置",width=10,index = 5)
    private String region;
    @ApiModelProperty(value = "位置主键")
    private String regionId;
    @ApiModelProperty(value = "唯一标识")
    //@ExcelColumn(name="唯一标识")
    private String eventId;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningPush.java
@@ -82,7 +82,7 @@
    @ApiModelProperty(value = "所在位置")
    //@ExcelColumn(name="推送标识")
    private String pushId;
    @ApiModelProperty(value = "推送标识")
    @ApiModelProperty(value = "所在位置")
    @ExcelColumn(name="所在位置",width=10,index = 5)
    private String region;
@@ -94,6 +94,15 @@
    //@ExcelColumn(name="推送方式 0钉钉通知")
    private Integer pushType;
    @ApiModelProperty(value = "人员编码,多个以,分割", example = "1")
    //@ExcelColumn(name="推送方式 0钉钉通知")
    private String memberIds;
    @ApiModelProperty(value = "人员名称,多个以,分割", example = "1")
    //@ExcelColumn(name="推送方式 0钉钉通知")
    private String memberNames;
    @ApiModelProperty(value = "事件分类 0=安防事件;1=消防事件;2=车载事件;3=钥匙柜事件; 4=天气预警;", example = "1")
    @ExcelColumn(name="事件分类",valueMapping = "0=安防事件;1=消防事件;2=车载事件;3=钥匙柜事件;4=天气预警;",width=10,index = 3)
    @TableField(exist = false)
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/WarningRuleDetail.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -76,4 +77,11 @@
    @ExcelColumn(name="区域主键")
    private String regionId;
    @ApiModelProperty(value = "告警类型编码")
    @TableField(exist = false)
    private String code;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetLogService.java
@@ -2,6 +2,7 @@
import com.doumee.dao.business.dto.TelecomCabinetLogDTO;
import com.doumee.dao.business.vo.TelecomJkCabinetLogVO;
import com.doumee.service.business.impl.JkCabinetGridServiceImpl;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.model.JkCabinetLog;
@@ -103,4 +104,8 @@
     * @return
     */
    List<TelecomJkCabinetLogVO> getLogListForTelecom(TelecomCabinetLogDTO model);
    void timeOutUnBackAlarm(JkCabinetGridServiceImpl impl);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.dao.business.dto.QueryUserByCodeDTO;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.model.JkIccard;
@@ -97,5 +98,5 @@
    void updateStatusById(JkIccard jkIccard);
    Integer getMemberIdByCode(String code);
    Integer getMemberIdByCode(QueryUserByCodeDTO dto);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InoutRecordServiceImpl.java
@@ -24,7 +24,7 @@
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
@@ -1,6 +1,7 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.dingTalk.DingTalkStream;
@@ -25,6 +26,7 @@
import com.doumee.service.business.third.model.PageWrap;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -59,13 +61,24 @@
    private JkCabinetLogMapper jkCabinetLogMapper;
    @Autowired
    private WarningMapper warningMapper;
    private WarningEventMapper warningEventMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private WarningMapper warningMapper;
    @Autowired
    private WarningRuleMapper warningRuleMapper;
    @Autowired
    private WarningRuleDetailMapper warningRuleDetailMapper;
    @Autowired
    private WarningPushMapper warningPushMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DingTalk dingTalk;
@@ -179,7 +192,7 @@
        MPJLambdaWrapper<JkCabinetGrid> wrapper = new MPJLambdaWrapper<JkCabinetGrid>()
                .selectAll(JkCabinetGrid.class)
                .selectAs(JkCabinet::getName,JkCabinetGrid::getCabinetName)
                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
@@ -310,7 +323,7 @@
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                        .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                        .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                        .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
@@ -392,6 +405,8 @@
                    jkCabinetLog.setAuthType(Constants.TWO);
                    jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
                    jkCabinetLog.setStatus(Constants.ZERO);
                    jkCabinetLog.setIsNotice(Constants.ZERO);
                    jkCabinetLog.setInfo(Objects.isNull(dto.getOpenType())||Constants.equalsInteger(dto.getOpenType(),Constants.ZERO)?"系统开启":"手动开启");
                    if(Objects.nonNull(jkCabinetGrid.getKeyId())){
                        jkCabinetLog.setKeyId(jkCabinetGrid.getKeyId());
                        JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
@@ -406,6 +421,7 @@
                    jkCabinetLog.setType(Constants.ZERO);
                    jkCabinetLogs.add(jkCabinetLog);
                }
                jkCabinetLogMapper.insert(jkCabinetLogs);
            }
        }
@@ -464,18 +480,50 @@
                    }
                }
            }
            jkCabinetLog.setIsNotice(Constants.ZERO);
            jkCabinetLog.setType(Constants.ONE);
            jkCabinetLogMapper.insert(jkCabinetLog);
            //查询钥匙的开门记录 è¿›è¡Œæ·»åŠ å…³é—¨è®°å½•ä¸»é”®
            jkCabinetLogMapper.update(null,new UpdateWrapper<JkCabinetLog>().lambda()
                    .set(JkCabinetLog::getCloseLogId,jkCabinetLog.getId())
                    .eq(JkCabinetLog::getKeyId,jkCabinetLog.getKeyId())
                    .eq(JkCabinetLog::getType,Constants.ZERO)
                    .isNull(JkCabinetLog::getCloseLogId));
            if(Constants.equalsInteger(dto.getKeyStatus(),Constants.ONE)){
                jkCabinetLogMapper.update(null,new UpdateWrapper<JkCabinetLog>().lambda()
                        .set(JkCabinetLog::getCloseLogId,jkCabinetLog.getId())
                        .eq(JkCabinetLog::getKeyId,jkCabinetLog.getKeyId())
                        .eq(JkCabinetLog::getType,Constants.ONE)
                        .eq(JkCabinetLog::getKeyStatus,Constants.TWO)
                        .isNull(JkCabinetLog::getCloseLogId));
            }
        }
    }
//    public void saveAbnormalOpenGridLog(AbnormalOpenGridDTO dto){
//        if(Objects.isNull(dto)
//                || StringUtils.isBlank(dto.getBoardCode())
//                || StringUtils.isBlank(dto.getBoardCode())
//                || Objects.isNull(dto.getCabinetId())
//                || Objects.isNull(dto.getKeyStatus())
//                || Objects.isNull(dto.getAuthType())
//        ){
//            throw new BusinessException(ResponseStatus.BAD_REQUEST);
//        }
//        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
//                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
//                .eq(JkCabinetGrid::getId,dto.getGridId())
//                .last(" limit 1 ")
//        );
//        JkCabinetLog jkCabinetLog = new JkCabinetLog();
//        jkCabinetLog.setCreateDate(new Date());
//        jkCabinetLog.setIsdeleted(Constants.ZERO);
//        jkCabinetLog.setCabinetId(dto.getCabinetId());
//        jkCabinetLog.setGridId(jkCabinetGrid.getId());
//        jkCabinetLog.setAuthType(dto.getAuthType());
//        jkCabinetLog.setMemberId(dto.getMemberId());
//        jkCabinetLog.setKeyStatus(Constants.ZERO);
//        jkCabinetLog.setStatus(Constants.ZERO);
//
//    }
    /**
@@ -512,7 +560,7 @@
            }
            jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                    new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
                            .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                            .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                            .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                            .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                            .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
@@ -551,10 +599,8 @@
        if(Objects.isNull(jkCabinetGrid)){
            return ;
        }
//        LoginUserInfo loginUserInfo = openGridDriverDTO.getLoginUserInfo();
        JkCabinetLog jkCabinetLog = new JkCabinetLog();
        jkCabinetLog.setCreateDate(new Date());
//        jkCabinetLog.setCreator(loginUserInfo.getId());
        jkCabinetLog.setIsdeleted(Constants.ZERO);
        jkCabinetLog.setCabinetId(openGridDriverDTO.getCabinetId());
        jkCabinetLog.setGridId(jkCabinetGrid.getId());
@@ -562,6 +608,7 @@
        jkCabinetLog.setMemberId(openGridDriverDTO.getMemberId());
        jkCabinetLog.setType(Constants.ZERO);
        jkCabinetLog.setStatus(Constants.ZERO);
        jkCabinetLog.setInfo(Objects.isNull(openGridDriverDTO.getOpenType())||Constants.equalsInteger(openGridDriverDTO.getOpenType(),Constants.ZERO)?"系统开启":"手动开启");
        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
            jkCabinetLog.setKeyId(jkCabinetGrid.getKeyId());
            JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
@@ -573,6 +620,7 @@
                jkCabinetLog.setRoleType(jkKeys.getRoleType());
            }
        }
        jkCabinetLog.setIsNotice(Constants.ZERO);
        jkCabinetLogMapper.insert(jkCabinetLog);
    }
@@ -590,59 +638,195 @@
                            .eq(JkCabinetGrid::getId,dto.getGridId())
                            .last(" limit 1 ")
            );
            if(Objects.nonNull(jkCabinetGrid)){
                log.error("柜格开门超时未关闭告警信息:{}"+JSONObject.toJSONString(jkCabinetGrid));
                //规则类型
                Constants.WarningConfig warningConfig = Constants.WarningConfig.GRID_TIME_OUT_INFO;
                Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
                        .eq(Warning::getType,Constants.THREE).eq(Warning::getCode,Constants.WarningConfig.GRID_TIME_OUT_INFO.getKey()).eq(Warning::getIsdeleted,Constants.ZERO).last("limt 1"));
                        .eq(Warning::getIsdeleted,Constants.ZERO)
                        .eq(Warning::getStatus,Constants.ONE)
                        .eq(Warning::getCode,warningConfig.getKey())
                        .last("limit 1")
                );
                if(Objects.isNull(warning)){
                    return;
                }
                List<Member> memberList = this.getWarningList(warning);
                if(CollectionUtils.isEmpty(memberList)){
                List<Integer> ruleIdList =  this.processWarnFront(warningConfig);
                if(CollectionUtils.isEmpty(ruleIdList)){
                    return;
                }
                //todo å­˜å‚¨å¼‚常日志
                for (Integer ruleId:ruleIdList) {
                    WarningRule warningRule = warningRuleMapper.selectById(ruleId);
                    if(Objects.isNull(warningRule)){
                        continue;
                    }
                    List<Member> memberList = this.getWarningRuleMemberList(warningRule);
                    if(CollectionUtils.isEmpty(memberList)){
                        return;
                    }
                    String content = "【钥匙柜-"+jkCabinetGrid.getCabinetName()+"】下【柜格-"+jkCabinetGrid.getCode()+"】超时未关闭";
            }else{
                    JkCabinet jkCabinet = jkCabinetMapper.selectById(dto.getCabinetId());
                    //存储报警异常记录
                    WarningEvent warningEvent = new WarningEvent();
                    warningEvent.setCreateDate(new Date());
                    warningEvent.setWarningId(warning.getId());
                    warningEvent.setTitle(warningConfig.getInfo());
                    warningEvent.setContent(content );
                    warningEvent.setStatus(Constants.ZERO);
                    warningEvent.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"未知位置");
                    warningEventMapper.insert(warningEvent);
            }
        }
    }
                    try {
                        // å­˜å‚¨å¼‚常通知日志
                        WarningPush warningPush = new WarningPush();
                        warningPush.setCreateDate(new Date());
                        warningPush.setIsdeleted(Constants.ZERO);
                        warningPush.setWarningId(warning.getId());
                        warningPush.setTitle(warningConfig.getInfo());
                        warningPush.setContent(content);
                        warningPush.setStatus(Constants.ZERO);
                        warningPush.setPushType(Constants.ZERO);
                        warningPush.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"未知位置");
                        warningPush.setMemberIds(
                                StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
                        );
                        warningPush.setMemberIds(
                                StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
                        );
                        warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i->i.getName()).collect(Collectors.toList()),",")
                        );
                        //todo æš‚时关闭 é’‰é’‰é€šçŸ¥
                        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
                        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),content));
                        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
                        warningPushMapper.insert(warningPush);
                        warningEvent.setStatus(Constants.ONE);
                        warningEventMapper.updateById(warningEvent);
                    }catch (Exception e){
                        warningEvent.setStatus(Constants.TWO);
                        warningEventMapper.updateById(warningEvent);
                    }
    public List<Member> getWarningList(Warning warning){
        if(Constants.equalsInteger(warning.getStatus(),Constants.ZERO)){
            return null;
        }
        //查询通知人员
        List<WarningRule> warningRuleList = warningRuleMapper.selectList(new QueryWrapper<WarningRule>().lambda()
                .eq(WarningRule::getIsdeleted,Constants.ZERO)
                .apply(" id in ( select w.RULE_ID from warning_rule_detail w where w.WARNING_ID = '"+warning.getId()+"' and w.ISDELETED = 0  ) ")
        );
        List<Member> memberList = new ArrayList<>();
        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(warningRuleList)){
            List<String> memberIdStr =  warningRuleList.stream().map(i->i.getMemberIds()).collect(Collectors.toList());
            if(org.apache.commons.collections.CollectionUtils.isNotEmpty(memberIdStr)){
                List<String> memberIdList = new ArrayList<>();
                for (String s:memberIdStr) {
                    memberIdList.addAll(
                            Arrays.asList(s.split(","))
                    );
                }
                memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO)
                        .notIn(Member::getErpId)
                        .in(Member::getId,memberIdList)
                );
            }
        }
        return memberList;
    }
    public List<Integer> processWarnFront(Constants.WarningConfig warningConfig){
        List<WarningRuleDetail> warningRuleDetailList = warningRuleDetailMapper.selectJoinList(WarningRuleDetail.class,new MPJLambdaWrapper<WarningRuleDetail>()
                .selectAll(WarningRuleDetail.class)
                .leftJoin(Warning.class,Warning::getId,WarningRuleDetail::getWarningId)
                .eq(WarningRuleDetail::getIsdeleted,Constants.ZERO)
                .eq(Warning::getIsdeleted,Constants.ZERO)
                .eq(Warning::getStatus,Constants.ONE)
                .eq(Warning::getCode,warningConfig.getKey())
        );
        if(CollectionUtils.isEmpty(warningRuleDetailList)){
            return new ArrayList<>();
        }
        //所有报警规则配置信息
        List<Integer> ruleIdList = warningRuleDetailList.stream().map(i->i.getRuleId()).collect(Collectors.toList());;
        Set<Integer> ruleIdSet = new HashSet<>(ruleIdList);
        if(CollectionUtils.isNotEmpty(ruleIdSet)){
            List<Integer> resultList = new ArrayList<>();
            for (Integer ruleId:ruleIdSet) {
                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
                //查询其他规则信息
                List<WarningRuleDetail> warningRuleDetails = warningRuleDetailMapper.selectJoinList(WarningRuleDetail.class,new MPJLambdaWrapper<WarningRuleDetail>()
                        .selectAll(WarningRuleDetail.class)
                        .selectAs(Warning::getCode,WarningRuleDetail::getCode)
                        .leftJoin(Warning.class,Warning::getId,WarningRuleDetail::getWarningId)
                        .eq(WarningRuleDetail::getIsdeleted,Constants.ZERO)
                        .eq(Warning::getIsdeleted,Constants.ZERO)
                        .eq(Warning::getStatus,Constants.ONE)
                        .eq(WarningRuleDetail::getRuleId,ruleId)
                        .in(Warning::getCode,Constants.WarningConfig.ALARM_TEST.getKey(),
                                Constants.WarningConfig.GRID_TIME_OUT_INFO.getKey(),
                                Constants.WarningConfig.KEY_TIME_OUT_BACK.getKey()
                        )
                );
                //无任何规则 ç›´æŽ¥è·³è¿‡
                if(CollectionUtils.isEmpty(warningRuleDetails)){
                    return resultList;
                }else if(!Constants.equalsInteger(warningRuleDetails.stream().filter(i->!i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList()).size(),Constants.ZERO)){
                    List<WarningRuleDetail> wList = warningRuleDetails.stream().filter(i->!i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList());
                    //获取所有其他所有事件主键信息
                    List<Integer> warningIdList = wList.stream().map(i->i.getWarningId()).collect(Collectors.toList());
                    Set<Integer> setWarningIdList = new HashSet<>(warningIdList);
                    //获取时间内所有事件信息
                    List<WarningEvent> warningEventList = warningEventMapper.selectList(new QueryWrapper<WarningEvent>().lambda()
                            .eq(WarningEvent::getIsdeleted,Constants.ZERO)
                            .in(WarningEvent::getWarningId,setWarningIdList)
                            .apply(" DATE_ADD(CREATE_DATE , INTERVAL "+warningRule.getIntervalSec()+" SECOND) > now() ")
                    );
                    if(this.processWarnFlag(wList,warningEventList)){
                        resultList.add(ruleId);
                    };
                }else{
                    List<WarningRuleDetail> wList = warningRuleDetails.stream().filter(i->i.getCode().equals(warningConfig.getKey())).collect(Collectors.toList());
                    //获取本次事件主键信息
                    List<Integer> warningIdList = wList.stream().map(i->i.getWarningId()).collect(Collectors.toList());
                    Set<Integer> setWarningIdList = new HashSet<>(warningIdList);
                    //获取时间内所有事件信息
                    List<WarningEvent> warningEventList = warningEventMapper.selectList(new QueryWrapper<WarningEvent>().lambda()
                            .eq(WarningEvent::getIsdeleted,Constants.ZERO)
                            .in(WarningEvent::getWarningId,setWarningIdList)
                            .apply(" DATE_ADD(CREATE_DATE , INTERVAL "+warningRule.getIntervalSec()+" SECOND) > now() ")
                    );
                    if(this.processWarnFlag(wList,warningEventList)){
                        resultList.add(ruleId);
                    }
                }
            }
            return resultList;
        }
        return new ArrayList<>();
    }
    /**
     * åˆ¤æ–­å¤„理是否可以发送通知 å½“前告警配置的数据列表是否满足
     * @param warningRuleDetails
     * @return
     */
    public boolean processWarnFlag(List<WarningRuleDetail> warningRuleDetails,List<WarningEvent> warningEventList){
        if(CollectionUtils.isEmpty(warningEventList)){
            return false;
        }
        for (WarningRuleDetail warningRuleDetail:warningRuleDetails) {
            if(Objects.nonNull(warningRuleDetail.getRegionId())){
                if(warningEventList.stream().filter(i->Constants.equalsInteger(i.getWarningId(),warningRuleDetail.getWarningId())
                        && StringUtils.isNotBlank(i.getRegionId()) && i.getRegionId().equals(warningRuleDetail.getRegionId())
                ).collect(Collectors.toList()).size()<=Constants.ZERO){
                    return false;
                }
            }else{
                if(warningEventList.stream().filter(i->Constants.equalsInteger(i.getWarningId(),warningRuleDetail.getWarningId())
                ).collect(Collectors.toList()).size()<=Constants.ZERO){
                    return false;
                }
            }
        }
        return true;
    }
    public List<Member> getWarningRuleMemberList(WarningRule warningRule){
        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO)
                .isNotNull(Member::getErpId)
                .in(Member::getId,Arrays.asList(warningRule.getMemberIds().split(",")))
        );
        return memberList;
    }
    @Override
@@ -656,23 +840,97 @@
                            .last(" limit 1 ")
                    );
            JkCabinet jkCabinet = jkCabinetMapper.selectById(dto.getCabinetId());
            Constants.WarningConfig warningConfig = Constants.WarningConfig.ALARM_TEST;
            Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
                    .eq(Warning::getType,Constants.THREE).eq(Warning::getCode,Constants.WarningConfig.KEY_TIME_OUT_BACK.getKey()).eq(Warning::getIsdeleted,Constants.ZERO).last("limt 1"));
                    .eq(Warning::getIsdeleted,Constants.ZERO)
                    .eq(Warning::getStatus,Constants.ONE)
                    .eq(Warning::getCode,warningConfig.getKey())
                    .last("limit 1")
            );
            if(Objects.isNull(warning)){
                return;
            }
            List<Member> memberList = this.getWarningList(warning);
            if(CollectionUtils.isEmpty(memberList)){
            List<Integer> ruleIdList =  this.processWarnFront(warningConfig);
            if(CollectionUtils.isEmpty(ruleIdList)){
                return;
            }
            //todo å­˜å‚¨å¼‚常日志
            if(CollectionUtils.isEmpty(ruleIdList)){
                return;
            }
            for (Integer ruleId:ruleIdList) {
                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
                if (Objects.isNull(warningRule)) {
                    continue;
                }
                List<Member> memberList = this.getWarningRuleMemberList(warningRule);
            //存储异常日志
            if(Objects.nonNull(systemUser)){
                log.error("司机酒精检测,超出酒精值告警信息:{}"+JSONObject.toJSONString(systemUser));
                String content = "";
                if(Objects.nonNull(systemUser.getRealname())){
                    content = content + systemUser.getRealname();
                }
                if(Objects.nonNull(jkCabinet)){
                    content = content + "于"+jkCabinet.getName()+"钥匙柜";
                }
                content = content + "酒精检测异常";
                if(Objects.nonNull(dto.getAlcoholNum())){
                    content = content + ",酒精度数【"+dto.getAlcoholNum()+"°】";
                }
                //存储报警异常记录
                WarningEvent warningEvent = new WarningEvent();
                warningEvent.setCreateDate(new Date());
                warningEvent.setWarningId(warning.getId());
                warningEvent.setTitle(warningConfig.getInfo());
                warningEvent.setContent(content );
                warningEvent.setStatus(Constants.ZERO);
                warningEvent.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"未知位置");
                warningEventMapper.insert(warningEvent);
                try{
                    WarningPush warningPush = new WarningPush();
                    warningPush.setCreateDate(new Date());
                    warningPush.setIsdeleted(Constants.ZERO);
                    warningPush.setWarningId(warning.getId());
                    warningPush.setTitle(warningConfig.getInfo());
                    warningPush.setContent(content);
                    warningPush.setStatus(Constants.ZERO);
                    warningPush.setPushType(Constants.ZERO);
                    warningPush.setRegion(Objects.nonNull(jkCabinet)&&StringUtils.isNotBlank(jkCabinet.getLocation())?jkCabinet.getLocation():"未知位置");
                    warningPush.setMemberId(dto.getMemberId());
                    warningPush.setMemberIds(
                            StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
                    );
                    warningPush.setMemberIds(
                            StringUtils.join(memberList.stream().map(i->i.getId()).collect(Collectors.toList()),",")
                    );
                    warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i->i.getName()).collect(Collectors.toList()),",")
                    );
                    //todo æš‚时关闭 é’‰é’‰é€šçŸ¥
        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),warningConfig.getInfo()));
        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
                    warningPushMapper.insert(warningPush);
                    warningEvent.setStatus(Constants.ONE);
                    warningEventMapper.updateById(warningEvent);
                }catch (Exception e){
                    warningEvent.setStatus(Constants.TWO);
                    warningEventMapper.updateById(warningEvent);
                }
                //存储异常日志
                if(Objects.nonNull(systemUser)){
                    log.error("司机酒精检测,超出酒精值告警信息:{}"+JSONObject.toJSONString(systemUser));
                }
            }
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
@@ -1,14 +1,15 @@
package com.doumee.service.business.impl;
import cn.hutool.core.bean.BeanUtil;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dto.TelecomCabinetLogDTO;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.TelecomJkCabinetLogVO;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkCabinetLogMapper;
import com.doumee.service.business.JkCabinetLogService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -21,8 +22,10 @@
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * é’¥åŒ™æŸœå¼€å…³é—¨è®°å½•Service实现
@@ -35,6 +38,18 @@
    @Autowired
    private JkCabinetLogMapper jkCabinetLogMapper;
    @Autowired
    private WarningMapper warningMapper;
    @Autowired
    private WarningRuleMapper warningRuleMapper;
    @Autowired
    private WarningPushMapper warningPushMapper;
    @Autowired
    private WarningEventMapper warningEventMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(JkCabinetLog jkCabinetLog) {
        jkCabinetLogMapper.insert(jkCabinetLog);
@@ -154,6 +169,7 @@
                .ge(Objects.nonNull(model.getStartDate()),JkCabinetLog::getCreateDate, Utils.Date.getStart(model.getStartDate()))
                .le(Objects.nonNull(model.getEndDate()),JkCabinetLog::getCreateDate, Utils.Date.getEnd(model.getEndDate()))
                .eq(JkCabinetLog::getIsdeleted, Constants.ZERO)
                .eq(JkCabinetLog::getType,Constants.ONE)
                .eq(JkCabinetLog::getKeyStatus,Constants.TWO)
                .orderByDesc(JkCabinetLog::getCreateDate);
        List<JkCabinetLog> jkCabinetLogs = jkCabinetLogMapper.selectJoinList(JkCabinetLog.class,wrapper);
@@ -171,5 +187,108 @@
    @Override
    public void timeOutUnBackAlarm(JkCabinetGridServiceImpl impl){
        Constants.WarningConfig warningConfig = Constants.WarningConfig.KEY_TIME_OUT_BACK;
        Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
                .eq(Warning::getIsdeleted,Constants.ZERO)
                .eq(Warning::getStatus,Constants.ONE)
                .eq(Warning::getCode,warningConfig.getKey())
                .last("limit 1")
        );
        if(Objects.isNull(warning)){
            return;
        }
        MPJLambdaWrapper<JkCabinetLog> wrapper = new MPJLambdaWrapper<JkCabinetLog>()
                .selectAll(JkCabinetLog.class)
                .selectAs(Member::getName,JkCabinetLog::getMemberName)
                .selectAs(JkKeys::getCode,JkCabinetLog::getCarCode)
                .selectAs(JkCabinet::getLocation,JkCabinetLog::getLocation)
                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetLog::getCabinetId)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetLog::getKeyId)
                .leftJoin(Member.class,Member::getId,JkCabinetLog::getMemberId)
                .eq(JkCabinetLog::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetLog::getType,Constants.ONE)
                .eq(JkCabinetLog::getIsNotice,Constants.ZERO)
                .eq(JkKeys::getStatus,Constants.TWO)
                .isNull(JkCabinetLog::getCloseLogId)
                .apply(" now() >  DATE_ADD(t.CREATE_DATE, INTERVAL ifnull(t1.USE_TIME,0) MINUTE) ")
                .orderByDesc(JkCabinetLog::getCreateDate);
        List<JkCabinetLog> jkCabinetLogs = jkCabinetLogMapper.selectJoinList(JkCabinetLog.class,wrapper);
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(jkCabinetLogs)){
            List<Integer> ruleIdList =  impl.processWarnFront(warningConfig);
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ruleIdList)){
                return;
            }
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ruleIdList)){
                return;
            }
            for (Integer ruleId:ruleIdList) {
                WarningRule warningRule = warningRuleMapper.selectById(ruleId);
                if (Objects.isNull(warningRule)) {
                    continue;
                }
                List<Member> memberList = impl.getWarningRuleMemberList(warningRule);
                if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(memberList)) {
                    return;
                }
                for (JkCabinetLog jkCabinetLog:jkCabinetLogs) {
                    String content = "【车辆-"+jkCabinetLog.getCarCode()+"钥匙】由+"+(StringUtils.isNotBlank(jkCabinetLog.getMemberName())?jkCabinetLog.getMemberName():"未知人员")+"借出,超时未归还";
                    //存储报警异常记录
                    WarningEvent warningEvent = new WarningEvent();
                    warningEvent.setCreateDate(new Date());
                    warningEvent.setWarningId(warning.getId());
                    warningEvent.setTitle(warningConfig.getInfo());
                    warningEvent.setContent(content );
                    warningEvent.setStatus(Constants.ZERO);
                    warningEvent.setRegion( StringUtils.isNotBlank(jkCabinetLog.getLocation())?jkCabinetLog.getLocation():"未知位置");
                    warningEventMapper.insert(warningEvent);
                    try {
                        WarningPush warningPush = new WarningPush();
                        warningPush.setCreateDate(new Date());
                        warningPush.setIsdeleted(Constants.ZERO);
                        warningPush.setWarningId(warning.getId());
                        warningPush.setTitle(warningConfig.getInfo());
                        warningPush.setContent(content);
                        warningPush.setStatus(Constants.ZERO);
                        warningPush.setPushType(Constants.ZERO);
                        warningPush.setRegion(StringUtils.isNotBlank(jkCabinetLog.getLocation()) ? jkCabinetLog.getLocation() : "未知位置");
                        warningPush.setMemberIds(
                                StringUtils.join(memberList.stream().map(i -> i.getId()).collect(Collectors.toList()), ",")
                        );
                        warningPush.setMemberIds(
                                StringUtils.join(memberList.stream().map(i -> i.getId()).collect(Collectors.toList()), ",")
                        );
                        warningPush.setMemberNames(StringUtils.join(memberList.stream().map(i -> i.getName()).collect(Collectors.toList()), ",")
                        );
                        //todo æš‚时关闭 é’‰é’‰é€šçŸ¥
                        //            Boolean noticeFlag = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                        //                    StringUtils.join(memberList.stream().filter(i->StringUtils.isNotBlank(i.getDdId())).map(i->i.getDdId()).collect(Collectors.toList()),","),
                        //                dingTalk.getAlarmNoticeMsg(warningPush.getRegion(),DateUtil.getCurrDateTime(),content));
                        //            warningPush.setStatus(noticeFlag?Constants.ONE:Constants.TWO);
                        warningPushMapper.insert(warningPush);
                        warningEvent.setStatus(Constants.ONE);
                        warningEventMapper.updateById(warningEvent);
                    }catch (Exception e){
                        warningEvent.setStatus(Constants.TWO);
                        warningEventMapper.updateById(warningEvent);
                    }
                }
            }
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
@@ -85,7 +85,7 @@
            || Objects.isNull(jkCabinet.getSortType())
            || (
                Constants.equalsInteger(jkCabinet.getNoType(),Constants.ONE)
                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) || StringUtils.isBlank(jkCabinet.getNoPrefix()) )
                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) )
                )
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -134,7 +134,7 @@
            if(Constants.equalsInteger(jkCabinet.getNoType(),Constants.ZERO)){
                grid.setCode(StringUtils.leftPad(startNo.toString(),maxNum.toString().length()+1,"0"));
            }else{
                grid.setCode(jkCabinet.getNoPrefix() +  StringUtils.leftPad(startNo.toString(),jkCabinet.getNoLength(),"0"));
                grid.setCode(StringUtils.isNotBlank(jkCabinet.getNoPrefix())?jkCabinet.getNoPrefix():"" +  StringUtils.leftPad(startNo.toString(),jkCabinet.getNoLength(),"0"));
            }
            jkCabinetGridList.add(grid);
@@ -412,7 +412,7 @@
                jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class, new MPJLambdaWrapper<JkCabinetGrid>()
                .selectAll(JkCabinetGrid.class)
                .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
@@ -504,7 +504,7 @@
            List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .isNotNull(Member::getFaceImg)
                    .apply(" FIND_IN_SET( id ,'"+jkCabinet.getManagerId()+"') ")
                    .apply(" FIND_IN_SET( id ,'"+jkCabinet.getAuthMemberId()+"') ")
            );
            if(CollectionUtils.isNotEmpty(memberList)){
                for (Member member:memberList) {
@@ -541,7 +541,7 @@
                            .selectAll(JkCabinetGrid.class)
                            .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                            .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
                            .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                            .selectAs(JkKeys::getRfidLable,JkCabinetGrid::getKeyCode)
                            .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                            .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                            .eq(JkCabinetGrid::getCabinetId,jkCabinet.getId())
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
@@ -4,6 +4,7 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.dto.QueryUserByCodeDTO;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.third.model.LoginUserInfo;
@@ -181,16 +182,24 @@
    @Override
    public Integer getMemberIdByCode(String code){
    public Integer getMemberIdByCode(QueryUserByCodeDTO dto){
        if(Objects.isNull(dto)
        || Objects.isNull(dto.getUserType())
        || StringUtils.isBlank(dto.getCode())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        JkIccard jkIccard = jkIccardMapper.selectOne(new QueryWrapper<JkIccard>().lambda()
                .eq(JkIccard::getIsdeleted,Constants.ZERO)
                .eq(JkIccard::getStatus,Constants.ONE)
                .eq(JkIccard::getCode,code)
                .eq(JkIccard::getUserType,dto.getUserType())
                .eq(JkIccard::getCode,dto.getCode())
                .last(" limit 1 ")
        );
        if(Objects.isNull(jkIccard)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(jkIccard.getStatus(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前IC卡已被禁用!");
        }
        return jkIccard.getMemberId();
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
@@ -49,7 +49,7 @@
        || Objects.isNull(jkKeys.getCarId())
        || Objects.isNull(jkKeys.getRoleType())
        || StringUtils.isBlank(jkKeys.getCode())
        || StringUtils.isBlank(jkKeys.getRfidLable())
        || StringUtils.isBlank(jkKeys.getRfidCode())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
@@ -65,10 +65,15 @@
        if(Objects.nonNull(carsKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前车辆已被钥匙["+carsKeys.getCode()+"]绑定使用!");
        }
        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getRfidLable,jkKeys.getRfidLable()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getRfidCode,jkKeys.getRfidCode()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        if(Objects.nonNull(rfidKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前RFID标签已被钥匙["+rfidKeys.getCode()+"]使用!");
        }
        String lable = Constants.getRFIDNumber(jkKeys.getRfidCode());
        if(StringUtils.isEmpty(lable)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"RFID标签设置失败【格式不正确】");
        }
        jkKeys.setRfidLable(lable);
        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
        jkKeys.setCreateDate(new Date());
        jkKeys.setEditDate(jkKeys.getCreateDate());
@@ -114,10 +119,15 @@
                || Objects.isNull(jkKeys.getCarId())
                || Objects.isNull(jkKeys.getRoleType())
                || StringUtils.isBlank(jkKeys.getCode())
                || StringUtils.isBlank(jkKeys.getRfidLable())
                || StringUtils.isBlank(jkKeys.getRfidCode())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        String lable = Constants.getRFIDNumber(jkKeys.getRfidCode());
        if(StringUtils.isEmpty(lable)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"RFID标签设置失败【格式不正确】");
        }
        jkKeys.setRfidLable(lable);
        //查询编号是否重复
        if(jkKeysMapper.selectCount(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getCode,jkKeys.getCode()).eq(JkKeys::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙编号已存在!");
@@ -134,6 +144,7 @@
        if(Objects.nonNull(rfidKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前RFID标签已被钥匙["+rfidKeys.getCode()+"]使用!");
        }
        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
        jkKeys.setEditDate(new Date());
        jkKeys.setEditor(loginUserInfo.getId());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -1323,7 +1323,7 @@
                .leftJoin(Category.class,Category::getId,JkLine::getCategoryId )
                .leftJoin(Cars.class,Cars::getId,JkLine::getCarId)
                .and(StringUtils.isNotBlank(telecomLineInfoDTO.getSearchInfo()),i->i.like(Cars::getCode,telecomLineInfoDTO.getSearchInfo()).or().like(JkLine::getName,telecomLineInfoDTO.getSearchInfo()))
                .eq(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo())
                .like(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo())
                .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkLine::getCategoryId, telecomLineInfoDTO.getCategoryId())
                .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkLine::getId, telecomLineInfoDTO.getLineId());
@@ -1370,7 +1370,7 @@
                .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED= 0 and  jc.SKETCH_ID = t.id),0)" ,JkSketch::getCustomerNum)
                .select(" ifnull((select count(1) from jk_sketch_line jc where   jc.TYPE = 0  and  jc.SKETCH_ID = t.id),0)" ,JkSketch::getBeforeLineNum)
                .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId )
                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
        List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper);
        if(CollectionUtils.isEmpty(sketchList)){
            return telecomLineCountVO;
@@ -1439,7 +1439,7 @@
        MPJLambdaWrapper<JkSketch> sketchMPJLambdaWrapper = new MPJLambdaWrapper<JkSketch>().selectAll(JkSketch.class )
                .selectAs(Category::getName,JkSketch::getCategoryName)
                .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId )
                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
        List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper);
        if(CollectionUtils.isEmpty(sketchList)){
            return new ArrayList<TelecomCategoryDataVO>();
@@ -1503,7 +1503,7 @@
                .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkSketchLine::getCategoryId,telecomLineInfoDTO.getCategoryId())
                .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkSketchLine::getLineId,telecomLineInfoDTO.getLineId())
                .apply(" ( t.TYPE = t1.OPT_STATUS ) ")
                .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
                .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo());
        List<JkSketchLine> returnLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper);
//        //优化前数据
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformLogServiceImpl.java
@@ -15,7 +15,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
server/visits/openapi/pom.xml
@@ -21,6 +21,18 @@
            <groupId>com.doumee</groupId>
            <artifactId>dmvisit_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.protobuf</groupId>
                    <artifactId>protobuf-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>4.31.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
server/visits/pom.xml
@@ -32,7 +32,6 @@
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
           <!-- <version>2.2.7.RELEASE</version>-->
        </dependency>
        <!--<dependency>
            <groupId>org.springframework.cloud</groupId>
@@ -41,7 +40,6 @@
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <!-- <version>2.2.7.RELEASE</version>-->
        </dependency>
        <!-- æŽ¥å£æ–‡æ¡£ -->