From 46e8af542c02d801bea9fa8cf8f55974dcfa8554 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期二, 30 十二月 2025 11:03:00 +0800
Subject: [PATCH] 更改头部

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java |  815 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 591 insertions(+), 224 deletions(-)

diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 43c2c6f..5b8ff5b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2,13 +2,16 @@
 
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.PhoneUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
 import com.dingtalk.api.response.OapiV2UserGetResponse;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.config.DataSyncConfig;
 import com.doumee.core.annotation.excel.ExcelImporter;
@@ -22,6 +25,13 @@
 import com.doumee.core.haikang.model.param.respose.UserAddResponse;
 import com.doumee.core.haikang.model.param.respose.UserDelResponse;
 import com.doumee.core.haikang.service.HKService;
+import com.doumee.core.jiandaoyun.api.arch.DeptApiClient;
+import com.doumee.core.jiandaoyun.constants.HttpConstant;
+import com.doumee.core.jiandaoyun.model.dept.DeptEntityModel;
+import com.doumee.core.jiandaoyun.model.request.MemberPushData;
+import com.doumee.core.jiandaoyun.model.request.UserPushData;
+import com.doumee.core.jiandaoyun.model.user.UserEntityModel;
+import com.doumee.dao.web.response.DDAuthorizeVO;
 import com.doumee.service.business.third.TmsService;
 import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
@@ -57,17 +67,21 @@
 import com.doumee.service.business.third.model.response.TmsEmployeeListResponse;
 import com.doumee.service.system.SystemLoginService;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.taobao.api.ApiException;
+import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.util.DataUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -76,6 +90,7 @@
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -83,6 +98,7 @@
  * @author 姹熻箘韫�
  * @date 2023/11/30 15:33
  */
+@Slf4j
 @Service
 public class MemberServiceImpl implements MemberService {
 
@@ -91,6 +107,9 @@
 
     @Autowired
     private MemberJoinMapper memberJoinMapper;
+
+    @Autowired
+    private JkCabinetMapper jkCabinetMapper;
 
     @Autowired
     private TrainTimeMapper trainTimeMapper;
@@ -147,7 +166,7 @@
 
     @Autowired
     private DingTalk dingTalk;
-    
+
     @Value("${debug_model}")
     private Boolean isDebug;
     @Override
@@ -163,18 +182,18 @@
         Member insert = initAddMemberModel(member,loginUserInfo);
         //娴峰悍浜哄憳鏂板涓氬姟
         try {
-             if(dealHkUserBiz(insert)){
-                memberMapper.insert(insert);
-                //鍒涘缓绯荤粺鐧婚檰璐﹀彿锛堥粯璁ゆ棤浠讳綍瑙掕壊锛�
+//             if(dealHkUserBiz(insert)){
+            memberMapper.insert(insert);
+            //鍒涘缓绯荤粺鐧婚檰璐﹀彿锛堥粯璁ゆ棤浠讳綍瑙掕壊锛�
 //                if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
-                    //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
-                    systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
-                    //澶勭悊鍩硅鏈夋晥鏈熶笟鍔�
-                    dealTrainTIme(member,0,loginUserInfo);
+            //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
+            systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
+            //澶勭悊鍩硅鏈夋晥鏈熶笟鍔�
+            dealTrainTIme(member,0,loginUserInfo);
 //                }
-            }else{
-                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
-            }
+//            }else{
+//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
+//            }
         }catch (BusinessException e){
             //濡傛灉鍙戠敓寮傚父锛屽垹闄ゅ凡缁忓垱寤虹殑浜哄憳淇℃伅
             deleteHkUserBiz(new String[]{insert.getHkId()});
@@ -187,6 +206,7 @@
         }
         return insert;
     }
+
     public static SystemUser createSystemUser(Member insert,SystemDictDataBiz systemDictDataBiz) {
         SystemUser user = new SystemUser();
         // 鐢熸垚瀵嗙爜鐩�
@@ -219,9 +239,9 @@
 
     private Member initAddMemberModel(Member member, LoginUserInfo loginUserInfo) {
         Member insert=  new Member();
-        insert.setCreator(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
+        insert.setCreator(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
         insert.setCreateDate(new Date());
-        insert.setEditor(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
+        insert.setEditor(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
         insert.setEditDate(new Date());
         insert.setHkOrgId(member.getHkOrgId());
         insert.setIsdeleted(Constants.ZERO);
@@ -231,12 +251,14 @@
         insert.setCode(member.getCode());
         insert.setType(Constants.TWO);
         insert.setHkDate(new Date());
-        insert.setWorkStatus(Constants.ZERO);//榛樿鍦ㄨ亴
-        insert.setCanVisit(Constants.ZERO);//榛樿涓嶅彲璁块棶
+        insert.setDdId(member.getDdId());
+        insert.setErpId(member.getErpId());
+        insert.setWorkStatus(Constants.formatIntegerNum(member.getWorkStatus()));//榛樿鍦ㄨ亴
+        insert.setCanVisit(Constants.formatIntegerNum(member.getCanVisit()));//榛樿涓嶅彲璁块棶
         insert.setAuthStatus(Constants.ZERO);
         insert.setName(member.getName());
         insert.setHkId(UUID.randomUUID().toString().replace("-",""));
-        insert.setHkStatus(Constants.ONE);
+        insert.setHkStatus(Constants.ZERO);
         insert.setSex(Constants.getSexByCardNo( member.getIdcardNo()));//鏍规嵁韬唤璇佸彿鑾峰彇鎬у埆
         insert.setJobDate(member.getJobDate());
         insert.setIsDangyuan(member.getIsDangyuan());
@@ -357,7 +379,7 @@
 
     private void isMemberParamValid(Member member) {
         if(member.getCompanyId() == null){
-            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鎵�灞炵粍缁囦笉瀛樺湪锛�");
         }
         if (StringUtils.isBlank(member.getPhone())||!PhoneUtil.isPhone(member.getPhone())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢佃瘽鍙风爜鏍煎紡鏈夎");
@@ -379,13 +401,13 @@
                 .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+member.getPhone()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
         }
-        Company company = companyMapper.selectById(member.getCompanyId());
+        Company company = member.getCompany()!=null ?member.getCompany(): companyMapper.selectById(member.getCompanyId());
         if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
-            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭凡琚垹闄わ紝璇峰埛鏂伴〉闈㈤噸璇曪紒");
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭凡琚垹闄わ紒");
         }
-        if(StringUtils.isBlank(company.getHkId())){
-            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭湭鍚屾瀹夐槻骞冲彴锛岃鍏堝墠寰�銆愮粍缁囩鐞嗐�戣彍鍗曡繘琛岀淮鎶わ紒");
-        }
+//        if(StringUtils.isBlank(company.getHkId())){
+//            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭湭鍚屾瀹夐槻骞冲彴锛岃鍏堝墠寰�銆愮粍缁囩鐞嗐�戣彍鍗曡繘琛岀淮鎶わ紒");
+//        }
         member.setHkOrgId(company.getHkId());
         member.setCompanyType(company.getType());
         if(Constants.equalsInteger(company.getType(),Constants.ONE)){
@@ -469,7 +491,7 @@
             isNeedUpdateUser = true;
         }
         if(StringUtils.isNotBlank(member.getCode()) && StringUtils.equals(member.getPhone(),model.getCode())){
-                // 楠岃瘉宸ュ彿
+            // 楠岃瘉宸ュ彿
             SystemUser queryUserDto = new SystemUser();
             queryUserDto = new SystemUser();
             queryUserDto.setDeleted(Boolean.FALSE);
@@ -483,7 +505,7 @@
         }
         if(member.getCompanyId()!=null && !Constants.equalsInteger(member.getCompanyId(),model.getCompanyId())){
             //濡傛灉缁勭粐鍙戠敓鍙樺寲
-            Company company = companyMapper.selectById(member.getCompanyId());
+            Company company = member.getCompany()!=null ?member.getCompany(): companyMapper.selectById(member.getCompanyId());
             if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭凡琚垹闄わ紝璇峰埛鏂伴〉闈㈤噸璇曪紒");
             }
@@ -500,15 +522,15 @@
         if(isNeedUpdateUser){
             //鏇存柊绯荤粺鐢ㄦ埛璐﹀彿淇℃伅
             systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
-                            .set(SystemUser::getUpdateUser,member.getLoginUserInfo().getId())
-                            .set(SystemUser::getUpdateTime,new Date())
-                            .set(StringUtils.isNotBlank(member.getFaceImg()),SystemUser::getAvatar,member.getFaceImg())
-                            .set(StringUtils.isNotBlank(member.getName()),SystemUser::getPinyin,Constants.getChinesePingyin(member.getName()))
-                            .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getMobile,member.getPhone())
-                            .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getUsername,member.getPhone())
-                            .set(StringUtils.isNotBlank(member.getName()),SystemUser::getRealname,member.getName())
-                            .set(member.getCompanyId() !=null,SystemUser::getCompanyId,member.getCompanyId())
-                            .set(StringUtils.isNotBlank(member.getCode()),SystemUser::getEmpNo,member.getCode())
+                    .set(SystemUser::getUpdateUser,member.getLoginUserInfo()!=null?member.getLoginUserInfo().getId():null)
+                    .set(SystemUser::getUpdateTime,new Date())
+                    .set(StringUtils.isNotBlank(member.getFaceImg()),SystemUser::getAvatar,member.getFaceImg())
+                    .set(StringUtils.isNotBlank(member.getName()),SystemUser::getPinyin,Constants.getChinesePingyin(member.getName()))
+                    .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getMobile,member.getPhone())
+                    .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getUsername,member.getPhone())
+                    .set(StringUtils.isNotBlank(member.getName()),SystemUser::getRealname,member.getName())
+                    .set(member.getCompanyId() !=null,SystemUser::getCompanyId,member.getCompanyId())
+                    .set(StringUtils.isNotBlank(member.getCode()),SystemUser::getEmpNo,member.getCode())
                     .eq(SystemUser::getMemberId,model.getId()));
         }
         if(Constants.equalsInteger(model.getCompanyType(),Constants.ZERO)
@@ -516,7 +538,7 @@
                 && member.getTrainStartTime()!=null){
             TrainTime trainTime = new TrainTime();
             trainTime.setIsdeleted(Constants.ZERO);
-            trainTime.setCreator(member.getLoginUserInfo().getId());
+            trainTime.setCreator(member.getLoginUserInfo()!=null?member.getLoginUserInfo().getId():null);
             trainTime.setCreateDate(new Date());
             trainTime.setEdirot(trainTime.getCreator());
             trainTime.setEditDate(trainTime.getCreateDate());
@@ -601,7 +623,7 @@
         Member member=new Member();
         member.setId(id);
         member.setIsdeleted(Constants.ONE);
-        member.setEditor(loginUserInfo.getId());
+        member.setEditor(loginUserInfo!=null?loginUserInfo.getId():null);
         member.setEditDate(date);
         member.setHkStatus(Constants.ZERO);
         member.setRemark("浜哄憳宸插垹闄わ紝绛夊緟鍒犻櫎闂ㄧ鏉冮檺");
@@ -625,20 +647,20 @@
         );
         if (carsList!=null && carsList.size()>0){
             for(Cars car :carsList){
-               if(Constants.equalsInteger(car.getAuthStatus(),Constants.ONE)){
-                   carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
-                           .eq(Cars::getId,car.getId())
-                           .set(Cars::getStartTime,null)
+                if(Constants.equalsInteger(car.getAuthStatus(),Constants.ONE)){
+                    carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
+                                    .eq(Cars::getId,car.getId())
+                                    .set(Cars::getStartTime,null)
 //                           .set(Cars::getMemberId,null)
-                           .set(Cars::getEndTime,null)
-                           .set(Cars::getAuthTimeType,null)
-                           .set(Cars::getAuthStatus,Constants.ZERO)
-                           .set(Cars::getEditDate,member.getEditDate())
-                           .set(Cars::getEdirot,member.getEditor())
-                   );
-                   //鍒犻櫎宸叉巿鏉冧笅鍙戠殑鍖呮湡鎺堟潈
-                   CarsServiceImpl.dealCancelBookBiz(car.getCode(),date,parkBookMapper);
-               }
+                                    .set(Cars::getEndTime,null)
+                                    .set(Cars::getAuthTimeType,null)
+                                    .set(Cars::getAuthStatus,Constants.ZERO)
+                                    .set(Cars::getEditDate,member.getEditDate())
+                                    .set(Cars::getEdirot,member.getEditor())
+                    );
+                    //鍒犻櫎宸叉巿鏉冧笅鍙戠殑鍖呮湡鎺堟潈
+                    CarsServiceImpl.dealCancelBookBiz(car.getCode(),date,parkBookMapper);
+                }
             }
         }
     }
@@ -675,14 +697,14 @@
             }
         }
         if(Constants.equalsInteger(memberRole.getTimeType(),Constants.ZERO) ){
-           memberRole.setStartTime(null);
-           memberRole.setEndTime(null);
+            memberRole.setStartTime(null);
+            memberRole.setEndTime(null);
         }
         for (Integer id : memberRole.getIds()){
             Member member = memberMapper.selectById(id);
             if(member==null || member.getIsdeleted().equals(Constants.ONE)){
                 //濡傛灉鍛樺伐淇℃伅涓嶅悎娉曠洿鎺ヨ烦杩�
-               continue;
+                continue;
             }
             if(StringUtils.isBlank(member.getFaceId()) || !Constants.equalsInteger(member.getFaceStatus(),Constants.ONE)){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鐢ㄦ埛銆�"+member.getName()+"銆戠殑浜鸿劯淇℃伅涓嶆弧瓒虫巿鏉冩潯浠讹紝璇疯繑鍥炲畬鍠勫悗鍐嶈繘琛岃鎿嶄綔锛�");
@@ -721,7 +743,7 @@
             saveUserActionBiz(member,memberRole.getLoginUserInfo(), Constants.UserActionType.AUTH_ROLE,userActionJoinMapper,null);
             //閲嶆柊鎺堟潈
             HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,member,deviceRoleMapper,empowerMapper,deviceMapper);
-         }
+        }
     }
 
     public static   Integer   getRoleIdByParam(Integer[] param, Member member,MemberRoleMapper memberRoleMapper,DeviceRoleMapper deviceRoleMapper) {
@@ -736,7 +758,7 @@
             //妫�鏌ョ敤鎴锋儏鍐垫潈闄愬師鏈氨鏄┖鐨勶紝 鍒欐棤闇�澶勭悊
             return  0;
         }
-         if((param == null || param.length==0 ) &&( roleList!=null && roleList.size()>0) ){
+        if((param == null || param.length==0 ) &&( roleList!=null && roleList.size()>0) ){
             //濡傛灉娓呯┖鍘熸潵鏈夋潈闄愶紝鎺ュ彛杩涜鏉冮檺鍒犻櫎鍘熸湁鏉冮檺鍗冲彲
             memberRoleMapper.delete(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
             return 1;
@@ -823,14 +845,14 @@
     @Override
     public     void empowerByList(Member member) {
         if(member.getIdList()!=null && member.getIdList().size() >0){
-             List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
-                     .in(Member::getId,member.getIdList())
-                     .eq(Member::getIsdeleted,Constants.ZERO));
-             if(members!=null){
-                 for(Member m : members){
-                     HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,m,deviceRoleMapper,empowerMapper,deviceMapper);
-                 }
-             }
+            List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                    .in(Member::getId,member.getIdList())
+                    .eq(Member::getIsdeleted,Constants.ZERO));
+            if(members!=null){
+                for(Member m : members){
+                    HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,m,deviceRoleMapper,empowerMapper,deviceMapper);
+                }
+            }
         }
     }
 
@@ -943,45 +965,47 @@
         }
         //鏍¢獙鍙傛暟 骞朵笖鏇存柊systemuser 鎵嬫満鍙峰拰宸ュ彿淇℃伅锛堝鏋滈渶瑕佷慨鏀圭殑璇濓級
         Member model =   isMemberUpdateParamValid(updateMember);
-        updateMember.setEditor(loginUserInfo.getId());
+        updateMember.setEditor(loginUserInfo!=null?loginUserInfo.getId():null);
         updateMember.setEditDate(new Date());
         //娴峰悍浜哄憳鏂板涓氬姟
-        if(dealHkUserForUpdateBiz(updateMember)){
-            updateMember.setHkId(null);
-            updateMember.setAuthStatus(Constants.ZERO);
-            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
-                    .set(Member::getStartTime,null)
-                    .set(Member::getEndTime,null)
-                    .set(Member::getRoleId,null)
-                    .set(StringUtils.isNotBlank(updateMember.getPhone()),Member::getPhone,updateMember.getPhone())
-                    .set(StringUtils.isNotBlank(updateMember.getName()),Member::getName,updateMember.getName())
-                    .set(Member::getEditDate,updateMember.getEditDate())
-                    .set(Member::getEditor,updateMember.getEditor())
-                    .set(StringUtils.isNotBlank(updateMember.getName()),Member::getPinyin,Constants.getChinesePingyin(updateMember.getName()))
-                    .set(StringUtils.isNotBlank(updateMember.getIdcardNo()),Member::getIdcardNo,updateMember.getIdcardNo())
-                    .set(StringUtils.isNotBlank(updateMember.getIdcardDecode()),Member::getIdcardDecode,updateMember.getIdcardDecode())
-                    .set( Member::getAuthStatus,Constants.ZERO)
-                    .set(updateMember.getHkStatus()!=null,Member::getHkStatus,updateMember.getHkStatus())
-                    .set(updateMember.getSex()!=null,Member::getSex,updateMember.getSex())
-                    .set(updateMember.getFaceStatus()!=null,Member::getFaceStatus,updateMember.getFaceStatus())
-                    .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
-                    .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
-                    .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
-                    .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
-                    .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
-                    .set(Member::getCode,updateMember.getCode())
+//        if(dealHkUserForUpdateBiz(updateMember)){
+        updateMember.setHkId(null);
+        updateMember.setAuthStatus(Constants.ZERO);
+        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                .set(Member::getStartTime,null)
+                .set(Member::getEndTime,null)
+                .set(Member::getRoleId,null)
+                .set(StringUtils.isNotBlank(updateMember.getPhone()),Member::getPhone,updateMember.getPhone())
+                .set(StringUtils.isNotBlank(updateMember.getName()),Member::getName,updateMember.getName())
+                .set(Member::getEditDate,updateMember.getEditDate())
+                .set(Member::getEditor,updateMember.getEditor())
+                .set(StringUtils.isNotBlank(updateMember.getName()),Member::getPinyin,Constants.getChinesePingyin(updateMember.getName()))
+                .set(StringUtils.isNotBlank(updateMember.getIdcardNo()),Member::getIdcardNo,updateMember.getIdcardNo())
+                .set(StringUtils.isNotBlank(updateMember.getIdcardDecode()),Member::getIdcardDecode,updateMember.getIdcardDecode())
+                .set( Member::getAuthStatus,Constants.ZERO)
+                .set(updateMember.getHkStatus()!=null,Member::getHkStatus,updateMember.getHkStatus())
+                .set(updateMember.getSex()!=null,Member::getSex,updateMember.getSex())
+                .set(updateMember.getCanVisit()!=null,Member::getCanVisit,updateMember.getCanVisit())
+                .set(updateMember.getFaceStatus()!=null,Member::getFaceStatus,updateMember.getFaceStatus())
+                .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
+                .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
+                .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
+                .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
+                .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
+                .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
+                .set(Member::getCode,updateMember.getCode())
 //                    .set(StringUtils.isNotBlank(updateMember.getCode()),Member::getCode,updateMember.getCode())
-                    .set( updateMember.getPositionId()!=null,Member::getPositionId,updateMember.getPositionId())
-                    .set( updateMember.getIsDangyuan()!=null,Member::getIsDangyuan,updateMember.getIsDangyuan())
-                    .set( updateMember.getJobDate()!=null,Member::getJobDate,updateMember.getJobDate())
-                    .eq(Member::getId,updateMember.getId()));
-            dealTrainTIme(updateMember,1,loginUserInfo);
-            cancelAllMemberEmpower(updateMember,memberRoleMapper,empowerMapper);
-            //璁板綍鎿嶄綔鏃ュ織
-            saveUserActionBiz(updateMember,loginUserInfo,Constants.UserActionType.EDIT,userActionJoinMapper,null);
-        }else{
-            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
-        }
+                .set( updateMember.getPositionId()!=null,Member::getPositionId,updateMember.getPositionId())
+                .set( updateMember.getIsDangyuan()!=null,Member::getIsDangyuan,updateMember.getIsDangyuan())
+                .set( updateMember.getJobDate()!=null,Member::getJobDate,updateMember.getJobDate())
+                .eq(Member::getId,updateMember.getId()));
+        dealTrainTIme(updateMember,1,loginUserInfo);
+        cancelAllMemberEmpower(updateMember,memberRoleMapper,empowerMapper);
+        //璁板綍鎿嶄綔鏃ュ織
+        saveUserActionBiz(updateMember,loginUserInfo,Constants.UserActionType.EDIT,userActionJoinMapper,null);
+//        }else{
+//            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
+//        }
     }
 
     private void dealTrainTIme(Member updateMember, int i,LoginUserInfo loginUserInfo) {
@@ -1007,7 +1031,7 @@
 
     public static void saveUserActionBiz(Member updateMember,LoginUserInfo user, Constants.UserActionType type,UserActionJoinMapper userActionMapper,String content) {
         updateMember.setEditDate(updateMember.getEditDate()==null?new Date():updateMember.getEditDate());
-       UserAction userAction=new UserAction();
+        UserAction userAction=new UserAction();
         userAction.setIsdeleted(Constants.ZERO);
         userAction.setCreateDate(updateMember.getEditDate());
         userAction.setCreator(updateMember.getEditor());
@@ -1025,39 +1049,39 @@
         QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
         wrapper.lambda().ne(Member::getRemark,"浜鸿劯宸插悓姝ユ渶鏂�");
         List<Member> list =memberMapper.selectList(wrapper);
-       if(list!=null){
-           String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
-                   +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
-           for(Member m : list){
-             String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
-             if(StringUtils.isNotBlank(faceId)){
-                 Member update = new Member();
-                 update.setId(m.getId());
-                 update.setFaceId(faceId);
-                 update.setRemark("浜鸿劯宸插悓姝ユ渶鏂�");
-                 update.setFaceStatus(Constants.ONE);
-                 memberMapper.updateById(update);
-                 return true;
-             }
-           }
-       }
-       return false;
+        if(list!=null){
+            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+            for(Member m : list){
+                String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
+                if(StringUtils.isNotBlank(faceId)){
+                    Member update = new Member();
+                    update.setId(m.getId());
+                    update.setFaceId(faceId);
+                    update.setRemark("浜鸿劯宸插悓姝ユ渶鏂�");
+                    update.setFaceStatus(Constants.ONE);
+                    memberMapper.updateById(update);
+                    return true;
+                }
+            }
+        }
+        return false;
     }
     @Override
     public void delHkForce(Member member) {
-      Member model  =memberMapper.selectById(member.getId());
-       if(model ==null) {
+        Member model  =memberMapper.selectById(member.getId());
+        if(model ==null) {
             throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝浜哄憳淇℃伅涓嶅瓨鍦紒");
-       }
+        }
         if(!Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍙湁閽堝绂昏亴浜哄憳鍙繘琛岃鎿嶄綔锛�");
-       }
+        }
         if(Constants.equalsInteger(model.getHkStatus(),Constants.ONE)){
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ヤ汉鍛樺凡琚垹闄わ紒");
-       }
+        }
         if(StringUtils.isBlank(model.getHkId())){
             throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝璇ヤ汉鍛橀潪瀹夐槻骞冲彴鍒涘缓浜哄憳锛屼笉鑳借繘琛岃鎿嶄綔锛�");
-       }
+        }
         HkSyncEmpowerServiceImpl.doHkDeleteUser(model.getId(),model.getHkId(),new Date(),memberMapper,memberCardMapper);
     }
     @Override
@@ -1066,23 +1090,23 @@
         if(model ==null) {
             throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝浜哄憳淇℃伅涓嶅瓨鍦紒");
         }
-       if(model.getCompanyId()!=null) {
-           if(Constants.equalsInteger(member.getHeadStatus(),Constants.ONE)){
-               //濡傛灉鏄彇娑堜富绠�
-               companyMapper.update(null,new UpdateWrapper<Company>().lambda()
-                       .eq(Company::getId,model.getCompanyId())
-                       .set(Company::getHeadId,member.getId()));
-               //璁板綍鎿嶄綔鏃ュ織
-               saveUserActionBiz(member,member.getLoginUserInfo(), Constants.UserActionType.BE_HEAD,userActionJoinMapper,null);
-           }else{
-               //濡傛灉鏄涓轰富绠�
-               companyMapper.update(null,new UpdateWrapper<Company>().lambda()
-                       .eq(Company::getId,model.getCompanyId())
-                       .set(Company::getHeadId,null)
-               );
-               saveUserActionBiz(member,member.getLoginUserInfo(),Constants.UserActionType.NOT_HEAD,userActionJoinMapper,null);
-           }
-       }
+        if(model.getCompanyId()!=null) {
+            if(Constants.equalsInteger(member.getHeadStatus(),Constants.ONE)){
+                //濡傛灉鏄彇娑堜富绠�
+                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
+                        .eq(Company::getId,model.getCompanyId())
+                        .set(Company::getHeadId,member.getId()));
+                //璁板綍鎿嶄綔鏃ュ織
+                saveUserActionBiz(member,member.getLoginUserInfo(), Constants.UserActionType.BE_HEAD,userActionJoinMapper,null);
+            }else{
+                //濡傛灉鏄涓轰富绠�
+                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
+                        .eq(Company::getId,model.getCompanyId())
+                        .set(Company::getHeadId,null)
+                );
+                saveUserActionBiz(member,member.getLoginUserInfo(),Constants.UserActionType.NOT_HEAD,userActionJoinMapper,null);
+            }
+        }
     }
 
     @Override
@@ -1206,6 +1230,21 @@
                 queryWrapper.apply(" find_in_set('"+companySpecialId+"',REPLACE(t3.company_path,'/',',')) ");
             }
         }
+        if(null != member.getQueryAuth() && Constants.equalsInteger(member.getQueryAuth(),Constants.ONE)){
+            List<JkCabinet> jkCabinets = jkCabinetMapper.selectList(new QueryWrapper<JkCabinet>().lambda()
+                    .eq(JkCabinet::getIsdeleted,Constants.ZERO)
+                    .isNotNull(JkCabinet::getAuthMemberId)
+            );
+            if(CollectionUtils.isNotEmpty(jkCabinets)){
+                List<String> memberIdList = new ArrayList<>();
+                List<String> authMemberId = jkCabinets.stream().map(i->i.getAuthMemberId()).collect(Collectors.toList());
+                for (String s:authMemberId) {
+                    memberIdList.addAll(Arrays.asList(s.split(","))) ;
+                }
+                queryWrapper.in(Member::getId,memberIdList);
+            }
+
+        }
         queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
         queryWrapper.eq(Member::getWorkStatus,Constants.ZERO);
         queryWrapper.orderByAsc(Member::getPinyin);
@@ -1250,12 +1289,12 @@
         List<Member> list =  memberJoinMapper.selectList(queryWrapper);
         if(list!=null){
             for(Member m : list){
-               if(m.getName()!=null){
-                   Member u = new Member();
-                   u.setId(m.getId());
-                   u.setPinyin(Constants.getChinesePingyin(m.getName()));
-                   memberMapper.updateById(u);
-               }
+                if(m.getName()!=null){
+                    Member u = new Member();
+                    u.setId(m.getId());
+                    u.setPinyin(Constants.getChinesePingyin(m.getName()));
+                    memberMapper.updateById(u);
+                }
             }
         }
 
@@ -1293,7 +1332,7 @@
         Utils.MP.blankToNull(pageWrap.getModel());
         if (pageWrap.getModel().getKeyword() != null) {
             queryWrapper.lambda().and( ms->ms.like(Member::getName,pageWrap.getModel().getKeyword())
-                            .or().like(Member::getPhone,pageWrap.getModel().getKeyword())
+                    .or().like(Member::getPhone,pageWrap.getModel().getKeyword())
                     .or().like(Member::getCode,pageWrap.getModel().getKeyword()));
         }
         if(pageWrap.getModel().getType() != null){
@@ -1526,7 +1565,8 @@
                 .eq(pageWrap.getModel().getHkStatus()!=null,Member::getHkStatus,pageWrap.getModel().getHkStatus())
 
                 .orderByAsc(Company::getSortnum)
-                .orderByAsc(Position::getSortnum);
+                .orderByAsc(Position::getSortnum)
+                .orderByAsc(Member::getId);
 //                .orderByAsc(!Constants.equalsInteger(pageWrap.getModel().getIsdeleted(),Constants.ONE),Member::getPinyin)
 //                .orderByDesc(Constants.equalsInteger(pageWrap.getModel().getIsdeleted(),Constants.ONE),Member::getEditDate);
         if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())==DataSyncConfig.origin.erp){
@@ -1552,7 +1592,7 @@
                     systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
             //闂ㄧ缁勪俊鎭�
             List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
-                            .select(DeviceRole::getId,DeviceRole::getName)
+                    .select(DeviceRole::getId,DeviceRole::getName)
                     .eq(DeviceRole::getIsdeleted,Constants.ZERO));
             for (Member memberInfoDTO:memberIPage.getRecords()) {
                 //鑾峰緱闂ㄧ缁勫悕绉版暟缁�
@@ -1618,8 +1658,8 @@
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
         queryWrapper.selectAll(Member.class)
                 .selectAs(Company::getName,Member::getCompanyName)
-        .selectAs(Position::getName,Member::getPositionName)
-         .leftJoin(Position.class,Position::getId,Member::getPositionId)
+                .selectAs(Position::getName,Member::getPositionName)
+                .leftJoin(Position.class,Position::getId,Member::getPositionId)
                 .selectAs(Member::getLastVisitDate,Member::getLastVisitDate)
                 .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 and v.status  in (7,8) ) as visitTimes");
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
@@ -1658,14 +1698,14 @@
                 .selectAs(Company::getCompanyNamePath,Member::getCompanyName)
                 .select(" (select ua.remark from user_action ua where ua.MEMBER_ID=t.id and ua.ISDELETED=0 and ua.type="+actiontype+"  order by ua.CREATE_DATE desc  limit 1) as optRemark")
                 .eq(Member::getIsdeleted,Constants.ZERO);
-                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
-                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
-                queryWrapper
+        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
+        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
+        queryWrapper
                 .and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Member::getPhone,pageWrap.getModel().getName())
                         .or().like(Member::getName,pageWrap.getModel().getName()))
                 .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),
                         ms->ms.like(Company::getName,pageWrap.getModel().getCompanyName())
-                        .or().like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName()))
+                                .or().like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName()))
                 .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                 .eq(Member::getStatus,Constants.Status.FREEZE.getValue())
                 .eq((pageWrap.getModel().getCompanyId())!=null,Company::getId,pageWrap.getModel().getCompanyId())
@@ -1773,7 +1813,7 @@
                 .apply("to_days(LAST_VISIT_DATE)+ "+days+" < to_days(now())" )
                 .orderByAsc(Member::getPinyin));
         if(CollectionUtils.isEmpty(memberList)){
-           return;
+            return;
         }
         List<Integer> memberIds = memberList.stream().map(m->m.getId()).collect(Collectors.toList());
         //鍐荤粨鐘舵��
@@ -1845,6 +1885,12 @@
         return wxAuthorizeVO;
     }
 
+    /**
+     * 寰俊鎺堟潈 鍐呴儴浜哄憳鐧诲綍
+     * @param wxAuthorizeVO
+     * @param openId
+     * @param source
+     */
     private void dealSystemUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
         SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                 .eq(SystemUser::getOpenid,openId)
@@ -1874,6 +1920,44 @@
             wxAuthorizeVO.setToken(token);
         }
     }
+
+    /**
+     * 閽夐拤鎺堟潈鑾峰彇鍐呴儴浜哄憳鐧诲綍淇℃伅
+     * @param ddAuthorizeVO
+     * @param unionId
+     * @param source
+     */
+    private void dealSystemUserAuthBizByDD(DDAuthorizeVO ddAuthorizeVO, String unionId, Integer source) {
+        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
+                .eq(SystemUser::getDdUnionId,unionId)
+                .in(SystemUser::getType,Constants.memberType.internal)
+                .eq(SystemUser::getDeleted,Constants.ZERO)
+                .last(" limit 1 "));
+        //闈炶瀹㈢敤鎴� 杩涜鍒ゆ柇鏄惁瀛樺湪鐢ㄦ埛
+        if(Objects.isNull(user)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄧ殑璐﹀彿鏆傛湭缁戝畾绯荤粺锛岃鑱旂郴绠$悊鍛�");
+        }else{
+            Member member = memberMapper.selectById(user.getMemberId());
+            if(member == null || member.getIsdeleted() == Constants.ONE){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璐﹀彿缁戝畾寮傚父锛岃鑱旂郴绠$悊鍛�");
+            }
+            if(member.getStatus() != Constants.ZERO){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄧ殑璐﹀彿宸茬鐢紝璇疯仈绯荤鐞嗗憳");
+            }
+            if(StringUtils.isNotBlank(member.getIdcardNo())){
+                member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
+            }
+            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
+                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+            member.setPrefixUrl(prefixUrl);
+            ddAuthorizeVO.setMember(member);
+            //鍙告満 涓� 鍐呴儴浜哄憳 鎻愪緵token
+            String token = systemLoginService.loginByUserId(user.getId());
+            ddAuthorizeVO.setToken(token);
+        }
+    }
+
+
     private void dealDriverUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
         SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                 .eq(SystemUser::getOpenid,openId)
@@ -1976,7 +2060,7 @@
     public List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO){
         List<Member> memberList = memberJoinMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
                 .selectAll(Member.class)
-                        .selectAs(Company::getName,Member::getCompanyName)
+                .selectAs(Company::getName,Member::getCompanyName)
                 .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                 .selectAs(Position::getName,Member::getPositionName)
                 .leftJoin(Position.class,Position::getId,Member::getPositionId)
@@ -2076,8 +2160,8 @@
                         .groupBy(Company::getId,Company::getName)
         );
         List<Map<String,Object>> retentionMaps = retentionJoinMapper.selectMaps(new MPJLambdaWrapper<Retention>()
-                        .select(" count(1) as memberCount, type as memberType ")
-                        .ne(Retention::getType,3)
+                .select(" count(1) as memberCount, type as memberType ")
+                .ne(Retention::getType,3)
                 .groupBy(Retention::getType)
         );
         stagingHeadVO.setCompanyUsers(companyMaps);
@@ -2092,7 +2176,7 @@
         if(importing!=null && importing){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ憳宸ュ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
         }
-        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_MEMBER,true);
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_MEMBER,true,30, TimeUnit.MINUTES);
         try {
             ExcelImporter ie = null;
             List<MemberImport> dataList =null;
@@ -2119,10 +2203,10 @@
                 model.setPhone(ScientificNotationTUtil.convertToString(model.getPhone()));
                 model.setIdcardNo(ScientificNotationTUtil.convertToString(model.getIdcardNo()));
                 if(StringUtils.isBlank(model.getName())
-                       &&StringUtils.isBlank(model.getIdcardNo())
+                        &&StringUtils.isBlank(model.getIdcardNo())
                         &&StringUtils.isBlank(model.getPhone())
                         &&StringUtils.isBlank(model.getCompanyName())){
-                      continue;
+                    continue;
                 }
                 Member member = checkModelParam(model,newList,i,loginUserInfo,list,companyList,companyType,positionList);
                 newList.add(member);
@@ -2156,8 +2240,8 @@
             for(Member insert: newList){
                 //鍒涘缓绯荤粺鐧婚檰璐﹀彿锛堥粯璁ゆ棤浠讳綍瑙掕壊锛�
 //                if(Constants.equalsInteger(insert.getCompanyType(),Constants.ONE)){
-                    //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
-                    userList.add(createSystemUser(insert,systemDictDataBiz));
+                //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
+                userList.add(createSystemUser(insert,systemDictDataBiz));
 //                }
             }
             if(userList.size()>0){
@@ -2291,7 +2375,7 @@
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public void registerDriver(RegisterDriverDTO registerDriverDTO){
         if(Objects.isNull(registerDriverDTO)
-        || StringUtils.isBlank(registerDriverDTO.getName())
+                || StringUtils.isBlank(registerDriverDTO.getName())
                 || StringUtils.isBlank(registerDriverDTO.getPassword())
                 || StringUtils.isBlank(registerDriverDTO.getValidCode())
                 || StringUtils.isBlank(registerDriverDTO.getPhone())
@@ -2307,7 +2391,7 @@
         };
         if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
                 .eq(SystemUser::getDeleted,Constants.ZERO)
-                        .and(i->i.eq(SystemUser::getMobile,registerDriverDTO.getPhone()).or().eq(SystemUser::getUsername,registerDriverDTO.getPhone()))
+                .and(i->i.eq(SystemUser::getMobile,registerDriverDTO.getPhone()).or().eq(SystemUser::getUsername,registerDriverDTO.getPhone()))
         )>Constants.ZERO){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵嬫満鍙峰凡娉ㄥ唽!");
         };
@@ -2345,23 +2429,207 @@
     /**
      * 鍚屾閽夐拤鍐呴儴鍛樺伐淇℃伅
      */
-    public void syncDDUserInfo() throws ApiException {
-        List<OapiV2UserGetResponse.UserGetResponse>  list = dingTalk.syncAllUserInfo();
-        if(CollectionUtils.isEmpty(list)){
-            return;
-        }
-        List<Member> addList = new ArrayList<>();
-        List<Member> updateList = new ArrayList<>();
-        List<String> delIds = new ArrayList<>();//淇敼涓轰娇鐢ㄩ拤閽塱d  erpId
-        List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
-                .eq(Member::getIsdeleted,Constants.ZERO)
-                .eq(Member::getType,Constants.TWO));
-        dealMemberChangeList(list,addList,updateList,delIds,allList);
+    @Override
+    public void syncDDUserInfo(){
+        try {
+            List<OapiV2UserGetResponse.UserGetResponse>  list = dingTalk.syncAllUserInfo();
+            if(CollectionUtils.isEmpty(list)){
+                return;
+            }
+            log.error("閽夐拤浜哄憳淇℃伅鍚屾琛屾暟锛�"+ list.size());
+            log.error("閽夐拤浜哄憳淇℃伅鍚屾鍐呭锛�"+ JSONObject.toJSONString(list));
+            List<Member> addList = new ArrayList<>();
+            List<Member> updateList = new ArrayList<>();
+            List<String> delIds = new ArrayList<>();//淇敼涓轰娇鐢ㄩ拤閽塱d  erpId
+            List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                    .eq(Member::getIsdeleted,Constants.ZERO)
+                    .eq(Member::getType,Constants.TWO));
+            dealMemberChangeList(list,addList,updateList,delIds,allList);
 
-        if(delIds.size()>0){
-            syncDelMember(delIds);
+            if(delIds.size()>0){
+                syncDelMember(delIds);
+            }
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鍚屾閽夐拤浜哄憳淇℃伅寮傚父锛�");
         }
 
+
+    }
+    @Override
+    @Async
+    public void  sendMemberInfoResult(String username, String info, int status){
+        try {
+            String url = systemDictDataBiz.queryByCode(Constants.JDY_CONFIG,Constants.JDY_MEMBER_PUSH_STATUS_URL).getCode();
+            log.error("==========鎺ㄩ�佷汉鍛榹}锛氬悓姝ョ粨鏋滃紑濮�=====status={},username={},info={},url={}",username,status,info,url);
+            JSONObject object = new JSONObject();
+            object.put("status",status);
+            object.put("username",username);
+            object.put("info",info);
+            String result = HttpsUtil.postJson(url,JSONObject.toJSONString(object));
+            log.error("==========鎺ㄩ�佷汉鍛榹}锛氬悓姝ョ粨鏋滅粨鏉�=====",result);
+        }catch (Exception e){
+
+        }
+    }
+
+    /**
+     * 澶勭悊绠�閬撲簯鐢ㄦ埛淇℃伅
+     * @param data
+     */
+    @Override
+    public void dealJdyMemberInfo(MemberPushData data){
+        if(StringUtils.isBlank(data.getUsername())
+                ||StringUtils.isBlank(data.getPhone())
+                ||StringUtils.isBlank(data.getName())){
+            throw  new BusinessException(ResponseStatus.JDY_BAD_REQUEST.getCode(),"浜哄憳淇℃伅涓嶅畬鏁达紒");
+        }
+        //鍐呴儴浜哄憳淇℃伅
+        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                .eq( Member::getErpId,data.getUsername() )
+                .eq( Member::getIsdeleted,Constants.ZERO )
+                .eq( Member::getType,Constants.TWO )
+                .last("limit 1"));
+        if(member == null){
+            //鏂板浜哄憳
+            if(data.getDeleter()!=null){
+                //濡傛灉鏄凡缁忓垹闄や汉鍛橈紝涓嶅鐞�
+                return;
+            }
+            member = getAddOrUpdateModelFromJDY(data,true);
+            this.create(member);
+        }else{
+            //鏇存柊浜哄憳
+            if(data.getDeleter()!=null){
+                //濡傛灉鏄凡缁忓垹闄や汉鍛橈紝涓嶅鐞�
+                this.deleteById(member.getId(),null);
+            }else{
+                //鏇存柊浜哄憳淇℃伅
+                Member updateMember =getAddOrUpdateModelFromJDY(data,false);
+                updateMember.setId(member.getId());
+                this.updateById(updateMember);
+            }
+        }
+
+    }
+
+    private Member getAddOrUpdateModelFromJDY(MemberPushData data, boolean add) {
+        Member member =  new Member();
+        member.setName(data.getName());
+        member.setType(Constants.TWO);
+        member.setIdcardType(Constants.ZERO);
+        member.setIdcardNo(data.getIdcardno());
+        member.setPhone(data.getPhone());
+        if(StringUtils.isNotBlank(data.getSex())){
+            member.setSex(StringUtils.equals(data.getSex(),"鐢�")?0:1);
+        }
+        if(StringUtils.isNotBlank(data.getStatus())){
+            member.setWorkStatus(StringUtils.equals(data.getStatus(),"鍦ㄨ亴")?0:1);
+        }
+        if(StringUtils.isNotBlank(data.getCan_visit())){
+            member.setCanVisit(StringUtils.equals(data.getCan_visit(),"鍙嫓璁�")?1:0);
+        }
+        member.setErpId(data.getUsername());
+        if(data.getDepartment()!=null){
+            member.setErpOrgId(data.getDepartment().getDept_no());
+        }
+        member.setHkStatus(Constants.ZERO);//寰呮洿鏂�
+        if(data.getImgurl()!=null &&data.getImgurl().size()>0){
+            String imgurl = data.getImgurl().get(0).getUrl();
+            if(StringUtils.isNotBlank(imgurl)){
+                member.setImgurl(getMemberImgByJdyImg(imgurl));
+                member.setFaceStatus(Constants.ZERO);
+                member.setFaceImg(member.getImgurl());
+            }
+        }
+        member.setCreateDate(DateUtil.getISO8601DateByStr(data.getCreateTime()));
+        member.setEditDate(DateUtil.getISO8601DateByStr(data.getUpdateTime()));
+        member.setCode(data.getCode());
+        member.setJobDate(DateUtil.getISO8601DateByStr(data.getJob_date()));
+        member.setIsdeleted(Constants.ZERO);
+        if(add ){
+            SystemUser c=   getSystemuserByErpId(data.getCreator());//鏌ヨ鍒涘缓浜�
+            if(c!=null){
+                member.setCreator(c.getId());
+            }
+        }
+        SystemUser up=   getSystemuserByErpId(data.getUpdater()); //鏌ヨ鏇存柊浜�
+        if(up!=null){
+            member.setEditor(up.getId());
+        }
+        //鏌ヨ缁勭粐淇℃伅
+        Company depart = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
+                .eq( Company::getErpId,data.getDepartment().getDept_no() )
+                .eq( Company::getIsdeleted,Constants.ZERO ));
+        if(depart!=null){
+            member.setCompanyId(depart.getId());
+        }
+        member.setCompany(depart);
+        return  member;
+    }
+
+    private String getMemberImgByJdyImg(String imgurl) {
+        try {
+            String folder =   systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+            FtpUtil ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
+                    Integer.parseInt(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode()),
+                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode(),
+                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
+            String date = DateUtil.getNowShortDate()+"/";
+            String name = UUID.randomUUID().toString();
+            if(ftp.uploadOnlineFile(imgurl,folder+date,name)){
+                log.error("=======涓婁紶绠�閬撲簯鍥剧墖鎴愬姛锛歳esult:{}=url:{}",date+name,imgurl);
+                return date+name;
+            }
+        }catch (Exception e){
+            log.error("=======涓婁紶绠�閬撲簯鍥剧墖澶辫触锛歶rl锛歿}",imgurl);
+        }
+        return null;
+
+    }
+
+    private SystemUser getSystemuserByErpId(UserPushData user) {
+        if(user!=null &&StringUtils.isNotBlank(user.getUsername())){
+            return   systemUserMapper.selectJoinOne(SystemUser.class,new MPJLambdaWrapper<SystemUser>().
+                    selectAll(SystemUser.class )
+                    .leftJoin(Member.class,Member::getId,SystemUser::getMemberId)
+                    .eq(SystemUser::getDeleted,Boolean.FALSE)
+                    .eq(Member::getErpId,user.getUsername())
+                    .last("limit 1"));
+        }
+       return null;
+    }
+
+    @Override
+    public String syncJdyUserInfo() {
+        DeptApiClient deptApiClient = new DeptApiClient(HttpConstant.API_KEY, HttpConstant.HOST);
+        try {
+            Map<String, Object> result =  deptApiClient.deptMemberList(1,true,deptApiClient.getDefaultVersion());
+            if(result!=null && result.get("users")!=null ){
+                TypeReference<List<UserEntityModel>> typeReference =     new TypeReference<List<UserEntityModel>>(){};
+                Object obj = result.get("users");
+                List<UserEntityModel> list =  com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(obj), typeReference.getType());
+                if(list !=null && list.size()>0){
+                    List<Member> addList = new ArrayList<>();
+                    List<Member> updateList = new ArrayList<>();
+                    List<String> delIds = new ArrayList<>();//淇敼涓轰娇鐢ㄩ拤閽塱d  erpId
+                    List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                            .eq(Member::getIsdeleted,Constants.ZERO)
+                            .eq(Member::getType,Constants.TWO));
+                    dealMemberChangeListJdy(list,addList,updateList,delIds,allList);
+                    if(delIds.size()>0){
+                        syncDelMember(delIds);
+                    }
+                    return "鍚屾鏁版嵁锛氭柊澧炪��"+addList.size()+"銆戞潯锛屾洿鏂般��"+updateList.size()+"銆戞潯锛屽垹闄ゃ��"+delIds.size()+"銆戞潯";
+                }else{
+                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍚屾閽夐拤鏁版嵁涓虹┖锛�");
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍚屾鏁版嵁寮傚父锛�");
+        }
+
+        return null;
     }
 
     private void syncDelMember(List<String> delIds) {
@@ -2397,24 +2665,63 @@
             }
         }
     }
-
+    private void dealMemberChangeListJdy(List<UserEntityModel> list, List<Member> addList, List<Member> updateList, List<String> delIds, List<Member> allList) {
+        Date date = new Date();
+        for(UserEntityModel respone : list){
+            //鏍规嵁erpid鏌ヨ浼佷笟淇℃伅锛屽垽鏂槸鏂板杩樻槸鏇存柊
+            Member param = new Member();
+            param.setErpId(respone.getUsername());
+            param.setName(respone.getName());
+            param.setDdId(respone.getIntegrate_id());
+            param.setCompanyIdList(respone.getDepartments());
+            Member member = findMemberByERPId(allList,respone.getUsername());
+            if(member == null){
+                //濡傛灉鏄柊澧�  //灏佽鏂板缁勭粐瀵硅薄鏁版嵁
+                addList.add(syncDDAddMemberModel(param,new Member()));
+            }else{
+                updateList.add(syncDDEditMemberModel(param,member));
+            }
+        }
+        if(allList!=null && allList.size()>0){
+            for(Member m : allList){
+                if(!isMemberDeletedJdy(m,list)){
+                    delIds.add(m.getErpId());
+                }
+            }
+        }
+    }
     private Member getAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
-        return  syncDDAddMemberModel(deptGetResponse,member);
+        Member param = new Member();
+        param.setErpId(deptGetResponse.getUnionid());
+        param.setPhone(deptGetResponse.getMobile());
+        param.setName(deptGetResponse.getName());
+        param.setCode(deptGetResponse.getJobNumber());
+        param.setDdId(deptGetResponse.getUserid());
+        param.setCompanyIdList(deptGetResponse.getDeptIdList());
+        return  syncDDAddMemberModel(param,member);
     }
 
 
     private Member getUpdateMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
-        return  syncDDEditMemberModel(deptGetResponse,member);
+        Member param = new Member();
+        param.setErpId(deptGetResponse.getUnionid());
+        param.setPhone(deptGetResponse.getMobile());
+        param.setName(deptGetResponse.getName());
+        param.setCode(deptGetResponse.getJobNumber());
+        param.setDdId(deptGetResponse.getUserid());
+        param.setCompanyIdList(deptGetResponse.getDeptIdList());
+        return  syncDDEditMemberModel(param,member);
     }
 
 
-    private Member syncDDAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
+    private Member syncDDAddMemberModel(Member deptGetResponse,Member member) {
         member.setCreateDate(new Date());
-        member.setErpId(deptGetResponse.getUserid());
-        member.setPhone(deptGetResponse.getMobile());
+        member.setErpId(deptGetResponse.getErpId());
+        member.setPhone(deptGetResponse.getPhone());
         member.setName(deptGetResponse.getName());
-        member.setCode(deptGetResponse.getJobNumber());
-        isMemberParamValidDetail(member,deptGetResponse.getDeptIdList());
+        member.setCode(deptGetResponse.getCode());
+        member.setDdId(deptGetResponse.getDdId());
+        isMemberParamValidDetail(member,deptGetResponse.getCompanyIdList());
         //鑾峰彇鍑虹敓鏃ユ湡
         //鑴辨晱鎿嶄綔
         Member insert = initAddMemberModel(member,null);
@@ -2439,8 +2746,8 @@
         }
         if(Objects.nonNull(deptIdList)){
             List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
-                    .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
-                    .isNotNull(Company::getHkId)
+                            .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
+//                    .isNotNull(Company::getHkId) 鏆傛椂鏃犳硶鍚屾娴峰悍 鍏堟敞閲�
             );
             if(CollectionUtils.isNotEmpty(companyList)){
                 member.setHkOrgId(companyList.get(Constants.ZERO).getHkId());
@@ -2449,7 +2756,7 @@
         }
         member.setCompanyType(Constants.ONE);
         SystemUser queryUserDto = new SystemUser();
-        queryUserDto.setUsername(member.getPhone());
+        queryUserDto.setUsername(StringUtils.defaultString(member.getPhone(),member.getErpId()));
         queryUserDto.setDeleted(Boolean.FALSE);
         SystemUser user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
         if (user != null) {
@@ -2466,14 +2773,14 @@
             }
         }
     }
-    
-    public Member syncDDEditMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member updateMember) { 
+
+    public Member syncDDEditMemberModel(Member deptGetResponse1,Member updateMember) {
         updateMember.setEditDate(new Date());
-        updateMember.setErpId(deptGetResponse.getUserid());
-        updateMember.setPhone(deptGetResponse.getMobile());
-        updateMember.setName(deptGetResponse.getName());
-        updateMember.setCode(deptGetResponse.getJobNumber());
-       
+//        updateMember.setErpId(deptGetResponse.getErpId());
+//        updateMember.setPhone(deptGetResponse.getPhone());
+//        updateMember.setName(deptGetResponse.getName());
+//        updateMember.setCode(deptGetResponse.getCode());
+//        updateMember.setDdId(deptGetResponse.getDdId());
         updateMember.setHkId(null);
         updateMember.setAuthStatus(Constants.ZERO);
         Boolean hkFlag = dealHkUserForUpdateBiz(updateMember);
@@ -2495,6 +2802,7 @@
                 .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
                 .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
                 .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
+                .set(StringUtils.isNotBlank(updateMember.getDdId()),Member::getDdId,updateMember.getDdId())
                 .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
                 .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
                 .set(Member::getCode,updateMember.getCode())
@@ -2534,38 +2842,97 @@
         }
         return false;
     }
-
-
-    public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException {
-        JSONArray jsonArray = eventData.getJSONArray("userId");
-        if(jsonArray.isEmpty()){
-            return;
+    private boolean isMemberDeletedJdy(Member member, List<UserEntityModel> list) {
+        for(UserEntityModel m : list){
+            if(StringUtils.equals(m.getUsername(),member.getErpId())){
+                return  true;
+            }
         }
-        if(eventType.equals("user_leave_org")){
-            //鍒犻櫎瀵逛汉鍛樹俊鎭�
-            List<String> userIdList = new ArrayList<>();
-            for (int i = 0; i < jsonArray.size(); i++) {
-                String deptId = jsonArray.getString(i);
-                userIdList.add(deptId);
+        return false;
+    }
+
+    @Override
+    public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData)   {
+        try {
+            JSONArray jsonArray = eventData.getJSONArray("userId");
+            if(jsonArray.isEmpty()){
+                return;
             }
-            if(CollectionUtils.isNotEmpty(userIdList)){
-                syncDelMember(userIdList);
-            }
-        }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
-            for (int i = 0; i < jsonArray.size(); i++) {
-                Member member  = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
-                        .eq(Member::getIsdeleted,Constants.ZERO)
-                        .eq(Member::getErpId,jsonArray.getLong(i))
-                        .last(" limit 1")
-                );
-                OapiV2UserGetResponse.UserGetResponse deptGetResponse = dingTalk.syncUserInfo(jsonArray.getString(i));
-                if(Objects.isNull(member)){
-                    getAddMemberModel(deptGetResponse,member);
-                }else{
-                    getUpdateMemberModel(deptGetResponse,member);
+            if(eventType.equals("user_leave_org")){
+                //鍒犻櫎瀵逛汉鍛樹俊鎭�
+                List<String> userIdList = new ArrayList<>();
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    String deptId = jsonArray.getString(i);
+                    userIdList.add(deptId);
+                }
+                if(CollectionUtils.isNotEmpty(userIdList)){
+                    syncDelMember(userIdList);
+                }
+            }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    OapiV2UserGetResponse.UserGetResponse userGetResponse =  dingTalk.syncUserInfo(jsonArray.getString(i));
+                    Member member  = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                            .eq(Member::getIsdeleted,Constants.ZERO)
+                            .eq(Member::getErpId,userGetResponse.getUnionid())
+                            .last(" limit 1")
+                    );
+                    if(Objects.isNull(member)){
+                        member = new Member();
+                        getAddMemberModel(userGetResponse,member);
+                    }else{
+                        getUpdateMemberModel(userGetResponse,member);
+                    }
                 }
             }
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"鏁版嵁澶勭悊澶辫触锛�");
         }
+
+    }
+
+    /**
+     * 閽夐拤鎺堟潈鐧诲綍
+     * @param code
+     * @param source
+     * @return
+     */
+    @Override
+    public DDAuthorizeVO ddAuthorize(String code, Integer source)  {
+        try {
+            if(StringUtils.isBlank(code)||Objects.isNull(source)){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = dingTalk.getDDUserByCode(code);
+            if(Objects.isNull(userGetByCodeResponse)
+                    || StringUtils.isBlank(userGetByCodeResponse.getUnionid())){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閽夐拤鎺堟潈澶辫触");
+            }
+            String unionId = userGetByCodeResponse.getUnionid();
+
+            DDAuthorizeVO ddAuthorizeVO = new DDAuthorizeVO();
+            if(StringUtils.isBlank(unionId)){
+                return ddAuthorizeVO;
+            }
+            ddAuthorizeVO.setUnionId(unionId);
+//        if(source==1){
+//            //澶勭悊鏅�氳瀹汉鍛樿嚜鍔ㄦ巿鏉冮�昏緫
+//            dealVisitUserAuthBiz(wxAuthorizeVO,openId,source);
+//        }else if(source == 3){
+//            //澶勭悊tms绠℃帶浜哄憳鑷姩鎺堟潈閫昏緫
+//            dealGkUserAuthBiz(wxAuthorizeVO,openId,source);
+//        }else if(source == 0){
+//            //濡傛灉鏄徃鏈猴紝鍒欎粠system_user鏌ヨ
+//            dealDriverUserAuthBiz(wxAuthorizeVO,openId,source);
+//        }else{
+            //濡傛灉鏄唴閮ㄤ汉鍛橈紝鍒欎粠system_user鏌ヨ
+            dealSystemUserAuthBizByDD(ddAuthorizeVO,unionId,source);
+//        }
+            return ddAuthorizeVO;
+        }catch (Exception e){
+
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR);
+        }
+
     }
 
 

--
Gitblit v1.9.3