Bläddra i källkod

Merge branch '门店-获取TUC仿石漆服务商人员25818' of http://git.dgtis.com/qxp/suishenbang-oneportal into uat

# Conflicts:
#	suishenbang-api/src/main/resources/application-uat.yml
njs 3 månader sedan
förälder
incheckning
930bd92ab3
22 ändrade filer med 1190 tillägg och 96 borttagningar
  1. 10 7
      suishenbang-admin/src/main/resources/application-prod.yml
  2. 10 0
      suishenbang-admin/src/main/resources/application-uat.yml
  3. 7 1
      suishenbang-admin/src/main/resources/templates/monitor/clearStorage/clearStorage.html
  4. 110 11
      suishenbang-common/src/main/java/com/dgtly/common/utils/http/HttpUtils.java
  5. 15 0
      suishenbang-quartz/src/main/java/com/dgtly/quartz/task/RyTask.java
  6. 349 0
      suishenbang-sync/suishenbang-sync-common/src/main/java/com/dgtly/sync/service/ShopUserTypeComponent.java
  7. 1 1
      suishenbang-sync/suishenbang-sync-common/src/main/java/com/dgtly/sync/utils/CustomerAccessTokenUtil.java
  8. 12 1
      suishenbang-system/src/main/java/com/dgtly/system/domain/SysUser.java
  9. 176 0
      suishenbang-system/src/main/java/com/dgtly/system/domain/SysUserShopExt.java
  10. 13 11
      suishenbang-system/src/main/java/com/dgtly/system/mapper/SysRoleMapper.java
  11. 12 8
      suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserRoleMapper.java
  12. 79 0
      suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserShopExtMapper.java
  13. 61 0
      suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserShopExtService.java
  14. 44 22
      suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserServiceImpl.java
  15. 97 0
      suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserShopExtServiceImpl.java
  16. 27 3
      suishenbang-system/src/main/resources/mapper/system/AssRelcustomerinfoMapper.xml
  17. 23 14
      suishenbang-system/src/main/resources/mapper/system/SysRoleMapper.xml
  18. 6 2
      suishenbang-system/src/main/resources/mapper/system/SysUserMapper.xml
  19. 13 9
      suishenbang-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
  20. 123 0
      suishenbang-system/src/main/resources/mapper/system/SysUserShopExtMapper.xml
  21. 1 1
      suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/JedisPoolUtil.java
  22. 1 5
      suishenbang-wxportal/suishenbang-wxportal-manager/pom.xml

+ 10 - 7
suishenbang-admin/src/main/resources/application-prod.yml

@@ -13,17 +13,20 @@ ruoyi:
   # 获取ip地址开关
   addressEnabled: false
   cloudPath: http://127.0.0.1:8000
-  #清空订单缓存
+  #清空订单缓存order
   clearCachePath: https://suishenbang.nipponpaint.com.cn/gateway/order/order/meta-hana-sales-order/clearCache
   orderGetDataHook: https://suishenbang.nipponpaint.com.cn/gateway/order/order/meta-hana-sales-order/orderGetDataHook
   deliverGetDataHook: https://suishenbang.nipponpaint.com.cn/gateway/order/order/meta-hana-sales-order/deliverGetDataHook
-#经销商微信接口相关配置
+#经销商微信接口相关配置
 customer:
   appid: ap4f8e6a38b6142187
   appsecret: d5c234b37e9f9ecb47a71ba6a788bd3e
   #正式域名 https://ac.nipponpaint.com.cn
   domain: https://ac.nipponpaint.com.cn
-
+shop:
+  appid: ap4f8e6a38b6142187
+  appsecret: d5c234b37e9f9ecb47a71ba6a788bd3e
+  tokenUrl: http://esbgateway.nipponpaint.com.cn/NPeportal/auth/jwt/v1/gettoken
 qiyeweixin:
   #企业微信id
   corpid: ww5444eb205d75e730
@@ -138,11 +141,11 @@ mybatis:
     configLocation: classpath:mybatis/mybatis-config.xml
 
 # PageHelper分页插件
-pagehelper: 
+pagehelper:
   helperDialect: mysql
   reasonable: true
   supportMethodsArguments: true
-  params: count=countSql 
+  params: count=countSql
 
 # Shiro
 shiro:
@@ -159,7 +162,7 @@ shiro:
     captchaType: math
   cookie:
     # 设置Cookie的域名 默认空,即当前访问的域名
-    domain: 
+    domain:
     # 设置cookie的有效访问路径
     path: /
     # 设置HttpOnly属性
@@ -179,7 +182,7 @@ shiro:
     kickoutAfter: false
 
 # 防止XSS攻击
-xss: 
+xss:
   # 过滤开关
   enabled: true
   # 排除链接(多个用逗号分隔)

+ 10 - 0
suishenbang-admin/src/main/resources/application-uat.yml

@@ -24,6 +24,11 @@ customer:
   appsecret: d5c234b37e9f9ecb47a71ba6a788bd3e
   #正式域名 https://ac.nipponpaint.com.cn
   domain: https://ac.nipponpaint.com.cn
+shop:
+  appid: ap4f8e6a38b6142187 #aq5e65db1640384765
+  appsecret: d5c234b37e9f9ecb47a71ba6a788bd3e  #f6ff802d16cf8e2718e90b7ba3252805
+  tokenUrl: http://esbgateway.nipponpaint.com.cn/NPeportal/auth/jwt/v1/gettoken
+
 
 #hana数据库数据同步配置
 hana:
@@ -117,6 +122,11 @@ spring:
     tmsToken: EZS2020
     suishenbang: https://suishenbangtest.nipponpaint.com.cn/oneportal
 
+  esb:
+    XAppId: Rg0YtNTe #yOQIfSJF
+    APiKey: VOw81LBuXDSSRx4v #aUK5WZTmWjzn1foC
+    shopStoneLikePaint: http://esbgateway.nipponpaint.com.cn/NPeportal/api/diydt/v3/texturewall/staff/list #http://esbgateway-test.nipponpaint.com.cn/NPeportal/api/diydt/v3/texturewall/staff/list
+
   mail:
     #邮件服务器地址
     host: mail.dgtis.com

+ 7 - 1
suishenbang-admin/src/main/resources/templates/monitor/clearStorage/clearStorage.html

@@ -6,6 +6,12 @@
 <body class="gray-bg">
 <div class="wrapper wrapper-content">
     <div class="col-sm-12">
+        <div class="row">
+            <label class="col-sm-1 control-label"></label>
+            <div class="col-sm-8">
+                <div style="color: #999999;">备注:0:会员看板,1:今年产品看板,2:去年产品看板,3:前年产品看板</div>
+            </div>
+        </div>
         <div class="row">
             <label class="col-sm-1 control-label"></label>
             <div class="col-sm-10">
@@ -51,7 +57,7 @@
         </div>
         <div class="row" style="margin-top: 10px;">
             <label class="col-sm-1 control-label"></label>
-            <button id="applyBtn" class="btn btn-success">
+            <button id="applyBtn" class="btn btn-success" style="margin-left: 15px;">
                 提交
             </button>
         </div>

+ 110 - 11
suishenbang-common/src/main/java/com/dgtly/common/utils/http/HttpUtils.java

@@ -1,17 +1,12 @@
 package com.dgtly.common.utils.http;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.io.*;
+import java.net.*;
+import java.nio.charset.StandardCharsets;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.text.ParseException;
+import java.util.Map;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
@@ -27,7 +22,7 @@ import org.springframework.http.HttpEntity;
 
 /**
  * 通用http发送方法
- * 
+ *
  * @author dgtly
  */
 public class HttpUtils
@@ -272,6 +267,110 @@ public class HttpUtils
         }
         return result.toString();
     }
+    /**
+     * @description: 向指定 URL 发送GET方法的请求
+     * @param: [url, headers, params]
+     * @return: java.lang.String
+     * @author: njs
+     * @date: 2025/8/18 16:19
+     */
+    public static String get(String url, Map<String, String> headers, Map<String, Object> params) {
+        StringBuilder result = new StringBuilder(1024); // 初始化容量
+        try {
+            // 构建带参数的URL
+            StringBuilder paramBuilder = new StringBuilder();
+            if (params != null && !params.isEmpty()) {
+                for (Map.Entry<String, Object> entry : params.entrySet()) {
+                   if(entry.getValue() != null){
+                    if (paramBuilder.length() != 0) {
+                        paramBuilder.append("&");
+                    }
+                       String key = entry.getKey();
+                       String value = String.valueOf(entry.getValue());
+
+
+                       try {
+                           // 对键进行编码(键通常不需要预先编码)
+                           String encodedKey = URLEncoder.encode(key, StandardCharsets.UTF_8.name());
+
+                           // 检查值是否已经URL编码过
+                           if (isUrlEncoded(value)) {
+                               // 如果已经编码过,直接使用
+                               paramBuilder.append(encodedKey).append("=").append(value);
+                           } else {
+                               // 如果未编码,进行编码
+                               String encodedValue = URLEncoder.encode(value, StandardCharsets.UTF_8.name());
+                               paramBuilder.append(encodedKey).append("=").append(encodedValue);
+                           }
+                       } catch (UnsupportedEncodingException e) {
+                           throw new RuntimeException("UTF-8 encoding not supported", e);
+                       }
+
+                   }
+                }
+            }
+            String urlNameString = url + "?" + paramBuilder.toString();
+            log.info("sendGet - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+
+            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
+            // 设置请求头
+            if (headers != null && !headers.isEmpty()) {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    connection.setRequestProperty(entry.getKey(), entry.getValue());
+                }
+            }
+
+            // 默认请求头
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/5.0 (compatible; Java client)");
+            connection.setConnectTimeout(10000);
+            connection.setReadTimeout(10000);
+            connection.connect();
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode >= 200 && responseCode < 300) {
+                try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+                    log.info("read success url - {}", realUrl);
+                    String line;
+                    while ((line = in.readLine()) != null) {
+                        result.append(line);
+                    }
+                    log.info("recv - {}", result);
+                }
+            } else {
+                log.error("调用HttpUtils.sendGet失败,响应码:{},url={}", responseCode, url);
+                throw new BusinessException("调用HttpUtils.sendGet失败,响应码:" + responseCode + ",url=" + url);
+            }
+
+        } catch (ConnectException e) {
+            log.error("调用HttpUtils.sendGet ConnectException, url={}", url, e);
+            throw new BusinessException("调用HttpUtils.sendGet ConnectException, url=" + url);
+        } catch (SocketTimeoutException e) {
+            log.error("调用HttpUtils.sendGet SocketTimeoutException, url={}", url, e);
+            throw new BusinessException("调用HttpUtils.sendGet SocketTimeoutException, url=" + url);
+        } catch (IOException e) {
+            log.error("调用HttpUtils.sendGet IOException, url={}", url, e);
+            throw new BusinessException("调用HttpUtils.sendGet IOException, url=" + url);
+        } catch (Exception e) {
+            log.error("调用HttpUtils.sendGet Exception, url={}", url, e);
+            throw new BusinessException("调用HttpUtils.sendGet Exception, url=" + url);
+        }
+
+        return result.toString();
+    }
+
+    // 简单检查是否已编码
+    // 改进的URL编码检测方法
+    private static boolean isUrlEncoded(String value) {
+        if (value == null || value.isEmpty()) {
+            return false;
+        }
+        // 检查是否包含URL编码特征字符
+        return value.contains("%") && value.matches(".*%[0-9A-Fa-f]{2}.*");
+    }
+
 
 
     /**
@@ -591,4 +690,4 @@ public class HttpUtils
 
 
 
-}
+}

+ 15 - 0
suishenbang-quartz/src/main/java/com/dgtly/quartz/task/RyTask.java

@@ -4,6 +4,7 @@ import com.dgtly.common.utils.StringUtils;
 import com.dgtly.sync.service.AnalysisDiyCustomerComponent;
 import com.dgtly.sync.service.HanaOrderComponent;
 import com.dgtly.sync.service.RelationCustomerOnlineComponent;
+import com.dgtly.sync.service.ShopUserTypeComponent;
 import com.dgtly.system.service.ISysUserOrderAuthorService;
 import com.dgtly.system.service.HanaSalesOrderService;
 import com.dgtly.wxportal.service.IWxSendMessageService;
@@ -11,6 +12,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.text.ParseException;
+
 /**
  * 定时任务调度测试
  *
@@ -33,6 +36,8 @@ public class RyTask
     private IWxSendMessageService wxSendMessageService;
     @Autowired
     private HanaSalesOrderService HanaSalesOrderService;
+    @Autowired
+    private ShopUserTypeComponent shopUserTypeComponent;
 
 //    private static RyTask ryTask;
 //    @PostConstruct
@@ -63,6 +68,16 @@ public class RyTask
     public void analyDiyCustomer1(){
         analysisDiyCustomerComponent.analyDiyCustomer1();
     }
+    /**
+     * @description: 获取TUC仿石漆服务商人员
+     * @param: []
+     * @return: void
+     * @author: njs
+     * @date: 2025/8/18 13:53
+     */
+    public void shopStoneLikePaint() throws ParseException {
+        shopUserTypeComponent.shopStoneLikePaint();
+    }
     /*立邦DIY人员定时同步*/
   /*  public void analyCwCustomer(){
         analysisDiyCustomerComponent.analyCwCustomer();

+ 349 - 0
suishenbang-sync/suishenbang-sync-common/src/main/java/com/dgtly/sync/service/ShopUserTypeComponent.java

@@ -0,0 +1,349 @@
+package com.dgtly.sync.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.dgtly.common.utils.ShiroSaltUtil;
+import com.dgtly.common.utils.UserIdentityUtil;
+import com.dgtly.common.utils.http.HttpUtils;
+import com.dgtly.common.utils.security.EncryptPassWordClass;
+import com.dgtly.sync.domain.Customers;
+import com.dgtly.sync.domain.SyncFailDetail;
+import com.dgtly.sync.domain.SyncLog;
+import com.dgtly.sync.mapper.SyncFailDetailMapper;
+import com.dgtly.sync.utils.CustomerAccessTokenUtil;
+import com.dgtly.system.domain.SysUser;
+import com.dgtly.system.domain.SysUserExt;
+import com.dgtly.system.domain.SysUserShopExt;
+import com.dgtly.system.mapper.*;
+import com.dgtly.system.service.ISysConfigService;
+import com.dgtly.system.service.impl.SysUserServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+public class ShopUserTypeComponent {
+
+    private static final Logger log = LoggerFactory.getLogger(ShopUserTypeComponent.class);
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private ISyncLogService syncLogService;
+    @Autowired
+    private SyncFailDetailMapper syncFailDetailMapper;
+
+    @Autowired
+    private SysUserExtMapper sysUserExtMapper;
+
+    @Autowired
+    private SysUserShopExtMapper userShopExtMapper;
+
+    @Autowired
+    private SysRoleMapper roleMapper;
+
+    @Autowired
+    private SysUserServiceImpl sysUserService;
+
+    @Autowired
+    private SysUserRoleMapper userRoleMapper;
+
+    @Value(value = "${shop.appid:none}")
+    private String appid;
+
+    @Value(value = "${shop.appsecret:none}")
+    private String appsecret;
+
+    @Value(value = "${shop.tokenUrl:none}")
+    private String tokenUrl;
+
+    @Value(value = "${spring.esb.XAppId}")
+    private String ssbAppid;
+
+    @Value(value = "${spring.esb.APiKey}")
+    private String ssbApiKey;
+
+    @Value(value = "${spring.esb.shopStoneLikePaint}")
+    private String stoneLikePaintUrl;
+
+
+
+    /**
+     * @description: 获取TUC仿石漆服务商人员
+     * @param: []
+     * @return: com.dgtly.sync.domain.SyncLog
+     * @author: njs
+     * @date: 2025/8/18 14:09
+     */
+    public void shopStoneLikePaint() throws ParseException {
+        //获取请求参数
+        Map<String, String> tokenHeaders =this.HeaderToMap();
+        Map<String, Object> params = new HashMap<>();
+        params.put("appid", appid);
+        params.put("appsecret", appsecret);
+        // 发送GET请求,包含URL、请求头和请求参数
+        String token = null;
+        try {
+            token = HttpUtils.get(tokenUrl, tokenHeaders, params);
+            if (token == null || token.isEmpty()) {
+                // 处理空返回值的情况
+                log.error("HTTP请求返回空结果");
+            }
+        } catch (Exception e) {
+            // 处理HTTP请求异常
+            log.error("HTTP请求失败: " + e.getMessage());
+            // 可以选择重试或抛出异常
+        }
+
+        JSONObject jsonObject = JSON.parseObject(token);
+        if(jsonObject !=null && jsonObject.containsKey("access_token")){
+            String shopToken = jsonObject.getString("access_token");
+            String url = stoneLikePaintUrl;
+            Map<String, String> stoneLikePaintHeaders =this.HeaderToMap();
+            Map<String, Object> stoneParams = new HashMap<>();
+            stoneParams.put("access_token", shopToken);
+            stoneParams.put("page", 1);
+            stoneParams.put("page_size", 100);
+            String dateString = userShopExtMapper.searchRunTime();
+            // 截取前3位毫秒数
+            String truncatedDate = dateString.substring(0, dateString.lastIndexOf('.') + 4);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
+            Date date = sdf.parse(truncatedDate);
+            String runTime = sdf.format(date);
+            //获取上次同步时间进行增量同步
+            if(runTime !=null && !runTime.isEmpty()){
+                 stoneParams.put("datetime_start", runTime);
+            }
+            String stoneLikePaintUser =HttpUtils.get(url, stoneLikePaintHeaders, stoneParams);
+            JSONObject stoneLikeJson = JSONObject.parseObject(stoneLikePaintUser);
+            if(stoneLikeJson !=null &&  stoneLikeJson.getString("code").equals("0")){
+                Integer count = stoneLikeJson.getInteger("count");
+                //TUC仿石漆服务商人员-0
+                Long roleId = roleMapper.selectRoleIdByRoleKey("shopStoneLikePaint");
+                if(count > 100){
+                    int num = 0;
+                    if (count % 100 != 0) {
+                        num = (count / 100) + 2;
+                    } else {
+                        num = (count / 100) + 1;
+                    }
+                    for (int i = 1; i < num; i++) {
+                        stoneParams.put("page", i);
+                        Map<String, String> headerUuid =this.HeaderToMap();
+                        try {
+                        String stoneLikeUser =HttpUtils.get(url, headerUuid, stoneParams);
+                        JSONObject stoneUserJson = JSONObject.parseObject(stoneLikeUser);
+                        if(stoneUserJson !=null &&  stoneUserJson.getString("code").equals("0")){
+                            JSONArray stoneUserArray = stoneUserJson.getJSONArray("data");
+                            buildShopUser(stoneUserArray,"0",roleId);
+                        }
+                        }catch (Exception e) {
+                            log.error("循环获取获取TUC仿石漆服务商人员列表接口错误!第" + i + "页");
+                            throw e;
+                        }
+                    }
+
+                }else{
+                    JSONArray stoneUserArray = stoneLikeJson.getJSONArray("data");
+                    buildShopUser(stoneUserArray,"0",roleId);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * @description: 构建门店用户信息
+     * @param: [json, Usertype, roleId, deptId]
+     * @return: void
+     * @author: njs
+     * @date: 2025/8/19 13:40
+     */
+    public void buildShopUser(JSONArray jsonArray,String usertype,Long roleId){
+        int count = 0;
+        List<SyncFailDetail> failDetails = new ArrayList<>();
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jo = jsonArray.getJSONObject(i);
+            Set<String> loginNameSet = sysUserService.selectAllUserLoginName();
+            loginNameSet = loginNameSet.stream().map(String::toUpperCase).collect(Collectors.toSet());
+            try {
+                String userName = jo.getString("staff_name");
+                String userPhone = jo.getString("staff_mobile");
+                //是否同步企业微信
+                Boolean isSync = jo.getBoolean("is_synced_to_wecom");
+                //是否有效用户
+                Boolean isActive = jo.getBoolean("is_active");
+                String subOfficeCode = jo.getString("office_code");
+                String subOfficeName = jo.getString("office_name");
+                String shopCode = jo.getString("organization_code");
+                String shopName = jo.getString("organization_name");
+                String dataUpdateTime = jo.getString("update_datetime");
+                String dataUserId = jo.getString("id");
+                /*人员信息是否有效,true有效,false无效。是否同步到企微 */
+                String loginName ="";
+                if(isActive && isSync){
+                    loginName = jo.getString("wecom_userid");
+                }else{
+                    //先判断该用户是否存在在处理离职和去掉角色,否则直接跳出循环不处理
+                    //离职掉该门店和用户关联关系
+                    if(!isActive){
+                        //用户无效后接口获取不到企微id,需从关联表查询
+                        loginName = userShopExtMapper.selectLoginNameByUserId(dataUserId,shopCode,usertype);
+                        if(loginName !=null && !loginName.isEmpty()){
+                            //查询用户信息
+                            SysUser user = sysUserMapper.selectUserByLoginName(loginName);
+                            userShopExtMapper.deleteUserShopExt(user.getUserId().toString(),loginName,shopCode,usertype);
+                            //去掉该用户和角色的关联关系
+                            userRoleMapper.deleteUserRoleByUserIdAndExt(user.getUserId(),roleId,usertype);
+                            //离职处理以及用户主信息是否有门店账号处理需要添加
+                            //查询门店用户表是否存在用户和其他门店的关联关系,如果存在就不离职,不存在查询是否有经销商的关联关系,如果存在就不离职,不存在就离职
+                            SysUserShopExt shop = new SysUserShopExt();
+                            shop.setUserId(user.getUserId().toString());
+                            shop.setDelFlag("0");
+                            List<SysUserShopExt>  shopExtList = userShopExtMapper.selectSysUserShopExtList(shop);
+                            if(shopExtList == null || shopExtList.size() == 0){
+                                    //在查用户经销商扩展信息
+                                    SysUserExt userCustomerExt = sysUserExtMapper.selectSysUserExtById(user.getUserId());
+                                    if(userCustomerExt != null){
+                                        //有经销商信息,无门店信息。去掉标记
+                                        user.setIsShopAccount("0");
+                                    }else{
+                                        //没有经销商信息也没有门店信息
+                                        //离职处理2
+                                        user.setQuit("2");
+                                    }
+                                    //修改用户信息
+                                    sysUserMapper.updateUser(user);
+
+                            }
+                        }
+                    }
+                    continue;
+                }
+
+
+                if (!loginNameSet.contains(loginName.toUpperCase().trim())) {
+
+                    /** =============用户基本信息构建 start===============*/
+                    SysUser user = new SysUser();
+                    user.setLoginName(loginName);
+                    log.info("门店新用户"+loginName +"门店类型身份"+usertype);
+                    user.setUserName(userName);
+                    user.setPhonenumber(userPhone);
+                    user.setPassword(loginName);
+                    user.setSalt(ShiroSaltUtil.randomSalt());
+                    user.setPassword(EncryptPassWordClass.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
+                    user.setIsShopAccount("1");
+                    user.setRoleId(roleId);
+                    /** =============用户基本信息构建 end===============*/
+                    insertUserAndExt(user);
+                    //查询用户信息
+                    SysUser userVoExt = sysUserMapper.selectUserByLoginName(loginName);
+                    // 新增用户与角色管理
+                    user.setUserId(userVoExt.getUserId());
+                    sysUserService.insertShopUserRole(user);
+                    /**======== 构建门店用户扩展信息表 start===============*/
+                    SysUserShopExt shopExt = new SysUserShopExt();
+                    shopExt.setLoginName(loginName);
+                    shopExt.setShopCode(shopCode);
+                    shopExt.setShopName(shopName);
+                    shopExt.setSubofficeCode(subOfficeCode);
+                    shopExt.setSubofficeName(subOfficeName);
+                    shopExt.setIsShopType(usertype);
+                    shopExt.setUserUpdateTime(dataUpdateTime);
+                    shopExt.setDelFlag("0");
+                    shopExt.setConstraintUserId(dataUserId);
+                    //用户id
+                    shopExt.setUserId(userVoExt.getUserId().toString());
+                    userShopExtMapper.insertSysUserShopExt(shopExt);
+                    count++;
+                    loginNameSet.add(loginName);
+                } else {
+                    /*已经存在的,需增加用户标识,然后增加门店用户扩展信息*/
+                    SysUser user = sysUserMapper.selectUserByLoginName(loginName);
+                    user.setPhonenumber(userPhone);
+                    //允许同步自动用户
+                    if (("0").equals(user.getIsSync())) {
+                        //查询该用户是否存在该接口返回中
+                        user.setPhonenumber(userPhone);
+                        user.setUserName(userName);
+                        user.setIsShopAccount("1");
+                        sysUserService.updateUserInfo(user);
+
+                        /**======== 构建门店用户扩展信息表 start===============*/
+                        //先删除用户门店扩展表,再插入
+                        userShopExtMapper.deletePhysicsUserShopExt(user.getUserId().toString(),loginName,shopCode,usertype);
+                        SysUserShopExt shopExt = new SysUserShopExt();
+                        shopExt.setLoginName(loginName);
+                        shopExt.setShopCode(shopCode);
+                        shopExt.setShopName(shopName);
+                        shopExt.setSubofficeCode(subOfficeCode);
+                        shopExt.setSubofficeName(subOfficeName);
+                        shopExt.setIsShopType(usertype);
+                        shopExt.setUserUpdateTime(dataUpdateTime);
+                        shopExt.setDelFlag("0");
+                        shopExt.setConstraintUserId(dataUserId);
+                        //用户id
+                        shopExt.setUserId(user.getUserId().toString());
+                        userShopExtMapper.insertSysUserShopExt(shopExt);
+                    }
+                }
+            }catch (Exception e){
+                log.error("门店用户数据分析异常"+e.getMessage());
+                e.printStackTrace();
+                SyncFailDetail syncFailDetail = new SyncFailDetail();
+                syncFailDetail.setFailReason(e.getMessage());
+                syncFailDetail.setDataJson(jo.toJSONString());
+                syncFailDetail.setFailLevel("1");
+                syncFailDetail.setExceptionType(e.getClass().getSimpleName());
+                failDetails.add(syncFailDetail);
+            }
+        }
+
+    }
+
+    /**
+     * @description: 新esbq请求头
+     * @param: []
+     * @return: java.util.Map<java.lang.String,java.lang.String>
+     * @author: njs
+     * @date: 2025/8/21 15:55
+     */
+    public  Map<String, String> HeaderToMap() {
+        String XAppId = ssbAppid;
+        String APiKey = ssbApiKey;
+        Map<String, String> headers = new HashMap<String, String>(2);
+        headers.put("X-App-Id", XAppId);
+        headers.put("X-Timestamp", new Date().toString());
+        headers.put("X-Sequence-No", UUID.randomUUID().toString());
+        headers.put("APIKey", APiKey);
+        headers.put("Accept-Encoding", "identity");
+        return headers;
+    }
+
+    /**
+     * @description: 新增用户和角色
+     * @param: [user]
+     * @return: java.lang.Integer
+     * @author: njs
+     * @date: 2025/8/20 9:32
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Integer insertUserAndExt(SysUser user) {
+        // 新增用户信息
+        int rows = sysUserMapper.insertUser(user);
+
+        return rows;
+    }
+}

+ 1 - 1
suishenbang-sync/suishenbang-sync-common/src/main/java/com/dgtly/sync/utils/CustomerAccessTokenUtil.java

@@ -162,7 +162,7 @@ public class CustomerAccessTokenUtil {
             }
         }catch (Exception e){
             reSetToken();
-            log.error("获取E签宝token错误",e);
+            log.error("获取token错误",e);
             throw e;
         }
         return accessToken;

+ 12 - 1
suishenbang-system/src/main/java/com/dgtly/system/domain/SysUser.java

@@ -16,7 +16,7 @@ import com.dgtly.common.core.domain.BaseEntity;
 
 /**
  * 用户对象 sys_user
- * 
+ *
  * @author dgtly
  */
 public class SysUser extends BaseEntity
@@ -142,8 +142,19 @@ public class SysUser extends BaseEntity
     //2离职
     private String quit;
 
+    //门店账号标识 1门店账号 0非门店账号
+    private String  isShopAccount;
+
     public String getQuit(){return  quit;}
 
+    public String getIsShopAccount() {
+        return isShopAccount;
+    }
+
+    public void setIsShopAccount(String isShopAccount) {
+        this.isShopAccount = isShopAccount;
+    }
+
     public  void setQuit(String quit){this.quit=quit;}
     public String getAuthorType() {
         return authorType;

+ 176 - 0
suishenbang-system/src/main/java/com/dgtly/system/domain/SysUserShopExt.java

@@ -0,0 +1,176 @@
+package com.dgtly.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dgtly.common.annotation.Excel;
+import com.dgtly.common.core.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 门店人员信息扩展对象 sys_user_shop_ext
+ *
+ * @author njs
+ * @date 2025-08-19
+ */
+public class SysUserShopExt extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private String userId;
+
+    /** 企微id */
+    @Excel(name = "企微id")
+    private String loginName;
+
+    /** 门店编码 */
+    @Excel(name = "门店编码")
+    private String shopCode;
+
+    /** 门店名称 */
+    @Excel(name = "门店名称")
+    private String shopName;
+
+    /** 0-(TUC仿石漆服务商人员) */
+    @Excel(name = "0-(TUC仿石漆服务商人员)")
+    private String isShopType;
+
+    /** 销售部编码 */
+    @Excel(name = "销售部编码")
+    private String subofficeCode;
+
+    /** 销售部名称 */
+    @Excel(name = "销售部名称")
+    private String subofficeName;
+
+    /** 用户更新时间 */
+    @Excel(name = "用户更新时间")
+    private String userUpdateTime;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /**立邦企微接口指定id*/
+    private String constraintUserId;
+
+    /** 删除时间 */
+    @Excel(name = "删除时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date delTime;
+
+    public void setUserId(String userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUserId()
+    {
+        return userId;
+    }
+    public void setLoginName(String loginName)
+    {
+        this.loginName = loginName;
+    }
+
+    public String getConstraintUserId() {
+        return constraintUserId;
+    }
+
+    public void setConstraintUserId(String constraintUserId) {
+        this.constraintUserId = constraintUserId;
+    }
+
+    public String getLoginName()
+    {
+        return loginName;
+    }
+    public void setShopCode(String shopCode)
+    {
+        this.shopCode = shopCode;
+    }
+
+    public String getShopCode()
+    {
+        return shopCode;
+    }
+    public void setShopName(String shopName)
+    {
+        this.shopName = shopName;
+    }
+
+    public String getShopName()
+    {
+        return shopName;
+    }
+    public void setIsShopType(String isShopType)
+    {
+        this.isShopType = isShopType;
+    }
+
+    public String getIsShopType()
+    {
+        return isShopType;
+    }
+    public void setSubofficeCode(String subofficeCode)
+    {
+        this.subofficeCode = subofficeCode;
+    }
+
+    public String getSubofficeCode()
+    {
+        return subofficeCode;
+    }
+    public void setSubofficeName(String subofficeName)
+    {
+        this.subofficeName = subofficeName;
+    }
+
+    public String getSubofficeName()
+    {
+        return subofficeName;
+    }
+    public void setUserUpdateTime(String userUpdateTime)
+    {
+        this.userUpdateTime = userUpdateTime;
+    }
+
+    public String getUserUpdateTime()
+    {
+        return userUpdateTime;
+    }
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setDelTime(Date delTime)
+    {
+        this.delTime = delTime;
+    }
+
+    public Date getDelTime()
+    {
+        return delTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("loginName", getLoginName())
+            .append("shopCode", getShopCode())
+            .append("shopName", getShopName())
+            .append("isShopType", getIsShopType())
+            .append("subofficeCode", getSubofficeCode())
+            .append("subofficeName", getSubofficeName())
+            .append("userUpdateTime", getUserUpdateTime())
+            .append("delFlag", getDelFlag())
+            .append("delTime", getDelTime())
+            .append("createTime", getCreateTime())
+            .toString();
+    }
+}

+ 13 - 11
suishenbang-system/src/main/java/com/dgtly/system/mapper/SysRoleMapper.java

@@ -5,14 +5,14 @@ import com.dgtly.system.domain.SysRole;
 
 /**
  * 角色表 数据层
- * 
+ *
  * @author dgtly
  */
 public interface SysRoleMapper
 {
     /**
      * 根据条件分页查询角色数据
-     * 
+     *
      * @param role 角色信息
      * @return 角色数据集合信息
      */
@@ -20,7 +20,7 @@ public interface SysRoleMapper
 
     /**
      * 根据用户ID查询角色
-     * 
+     *
      * @param userId 用户ID
      * @return 角色列表
      */
@@ -28,7 +28,7 @@ public interface SysRoleMapper
 
     /**
      * 通过角色ID查询角色
-     * 
+     *
      * @param roleId 角色ID
      * @return 角色对象信息
      */
@@ -36,7 +36,7 @@ public interface SysRoleMapper
 
     /**
      * 通过角色ID删除角色
-     * 
+     *
      * @param roleId 角色ID
      * @return 结果
      */
@@ -44,7 +44,7 @@ public interface SysRoleMapper
 
     /**
      * 批量角色用户信息
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */
@@ -52,7 +52,7 @@ public interface SysRoleMapper
 
     /**
      * 修改角色信息
-     * 
+     *
      * @param role 角色信息
      * @return 结果
      */
@@ -60,7 +60,7 @@ public interface SysRoleMapper
 
     /**
      * 新增角色信息
-     * 
+     *
      * @param role 角色信息
      * @return 结果
      */
@@ -68,17 +68,19 @@ public interface SysRoleMapper
 
     /**
      * 校验角色名称是否唯一
-     * 
+     *
      * @param roleName 角色名称
      * @return 角色信息
      */
     public SysRole checkRoleNameUnique(String roleName);
-    
+
     /**
      * 校验角色权限是否唯一
-     * 
+     *
      * @param roleKey 角色权限
      * @return 角色信息
      */
     public SysRole checkRoleKeyUnique(String roleKey);
+
+    Long selectRoleIdByRoleKey(String roleKey);
 }

+ 12 - 8
suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserRoleMapper.java

@@ -6,14 +6,14 @@ import com.dgtly.system.domain.SysUserRole;
 
 /**
  * 用户与角色关联表 数据层
- * 
+ *
  * @author dgtly
  */
 public interface SysUserRoleMapper
 {
     /**
      * 通过用户ID删除用户和角色关联
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -21,7 +21,7 @@ public interface SysUserRoleMapper
 
     /**
      * 批量删除用户和角色关联
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */
@@ -29,7 +29,7 @@ public interface SysUserRoleMapper
 
     /**
      * 通过角色ID查询角色使用数量
-     * 
+     *
      * @param roleId 角色ID
      * @return 结果
      */
@@ -37,15 +37,15 @@ public interface SysUserRoleMapper
 
     /**
      * 批量新增用户角色信息
-     * 
+     *
      * @param userRoleList 用户角色列表
      * @return 结果
      */
     public int batchUserRole(List<SysUserRole> userRoleList);
-    
+
     /**
      * 删除用户和角色关联信息
-     * 
+     *
      * @param userRole 用户和角色关联信息
      * @return 结果
      */
@@ -53,10 +53,14 @@ public interface SysUserRoleMapper
 
     /**
      * 批量取消授权用户角色
-     * 
+     *
      * @param roleId 角色ID
      * @param userIds 需要删除的用户数据ID
      * @return 结果
      */
     public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds);
+
+
+    void deleteUserRoleByUserIdAndExt(@Param("userId") Long userId,@Param("roleId") Long roleId,@Param("shopType") String shopType);
+
 }

+ 79 - 0
suishenbang-system/src/main/java/com/dgtly/system/mapper/SysUserShopExtMapper.java

@@ -0,0 +1,79 @@
+package com.dgtly.system.mapper;
+
+import com.dgtly.system.domain.SysUserShopExt;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 门店人员信息扩展Mapper接口
+ *
+ * @author njs
+ * @date 2025-08-19
+ */
+public interface SysUserShopExtMapper
+{
+    /**
+     * 查询门店人员信息扩展
+     *
+     * @param userId 门店人员信息扩展ID
+     * @return 门店人员信息扩展
+     */
+    public SysUserShopExt selectSysUserShopExtById(String userId);
+
+    /**
+     * 查询门店人员信息扩展列表
+     *
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 门店人员信息扩展集合
+     */
+    public List<SysUserShopExt> selectSysUserShopExtList(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 新增门店人员信息扩展
+     *
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    public int insertSysUserShopExt(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 修改门店人员信息扩展
+     *
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    public int updateSysUserShopExt(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 删除门店人员信息扩展
+     *
+     * @param userId 门店人员信息扩展ID
+     * @return 结果
+     */
+    public int deleteSysUserShopExtById(String userId);
+
+    /**
+     * 批量删除门店人员信息扩展
+     *
+     * @param userIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteSysUserShopExtByIds(String[] userIds);
+
+    /**
+     * @description: 查询上次同步的时间
+     * @param: []
+     * @return: java.lang.String
+     * @author: njs
+     * @date: 2025/8/19 15:41
+     */
+    String searchRunTime();
+
+    void deleteUserShopExt(@Param("userId") String userId,@Param("loginName") String loginName, @Param("shopCode") String shopCode,@Param("isShopType") String isShopType);
+
+    void deletePhysicsUserShopExt(@Param("userId") String userId,@Param("loginName") String loginName, @Param("shopCode") String shopCode,@Param("isShopType") String isShopType);
+
+
+    String  selectLoginNameByUserId(@Param("dataUserId") String dataUserId, @Param("shopCode") String shopCode,@Param("shopType") String shopType);
+}

+ 61 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/ISysUserShopExtService.java

@@ -0,0 +1,61 @@
+package com.dgtly.system.service;
+
+import com.dgtly.system.domain.SysUserShopExt;
+import java.util.List;
+
+/**
+ * 门店人员信息扩展Service接口
+ * 
+ * @author njs
+ * @date 2025-08-19
+ */
+public interface ISysUserShopExtService 
+{
+    /**
+     * 查询门店人员信息扩展
+     * 
+     * @param userId 门店人员信息扩展ID
+     * @return 门店人员信息扩展
+     */
+    public SysUserShopExt selectSysUserShopExtById(String userId);
+
+    /**
+     * 查询门店人员信息扩展列表
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 门店人员信息扩展集合
+     */
+    public List<SysUserShopExt> selectSysUserShopExtList(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 新增门店人员信息扩展
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    public int insertSysUserShopExt(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 修改门店人员信息扩展
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    public int updateSysUserShopExt(SysUserShopExt sysUserShopExt);
+
+    /**
+     * 批量删除门店人员信息扩展
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteSysUserShopExtByIds(String ids);
+
+    /**
+     * 删除门店人员信息扩展信息
+     * 
+     * @param userId 门店人员信息扩展ID
+     * @return 结果
+     */
+    public int deleteSysUserShopExtById(String userId);
+}

+ 44 - 22
suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserServiceImpl.java

@@ -20,7 +20,7 @@ import com.dgtly.system.service.ISysUserService;
 
 /**
  * 用户 业务层处理
- * 
+ *
  * @author dgtly
  */
 @Service
@@ -55,7 +55,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -68,7 +68,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -80,7 +80,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -92,7 +92,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -109,7 +109,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过手机号码查询用户
-     * 
+     *
      * @param phoneNumber 手机号码
      * @return 用户对象信息
      */
@@ -121,7 +121,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过邮箱查询用户
-     * 
+     *
      * @param email 邮箱
      * @return 用户对象信息
      */
@@ -133,7 +133,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -145,7 +145,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -161,7 +161,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param ids 需要删除的数据ID
      * @return 结果
      */
@@ -178,7 +178,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -221,7 +221,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -243,7 +243,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户个人详细信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -294,7 +294,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -304,9 +304,31 @@ public class SysUserServiceImpl implements ISysUserService
         return updateUserInfo(user);
     }
 
+    /**
+     * @description: 新增单用户用户id和角色
+     * @param: [user]
+     * @return: void
+     * @author: njs
+     * @date: 2025/8/21 10:12
+     */
+    public void insertShopUserRole(SysUser user)
+    {
+
+            // 新增用户与角色管理
+            List<SysUserRole> list = new ArrayList<SysUserRole>();
+            SysUserRole ur = new SysUserRole();
+            ur.setUserId(user.getUserId());
+            ur.setRoleId(user.getRoleId());
+            list.add(ur);
+            if (list.size() > 0) {
+                userRoleMapper.batchUserRole(list);
+            }
+
+    }
+
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserRole(SysUser user)
@@ -332,7 +354,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户岗位信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserPost(SysUser user)
@@ -358,7 +380,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验登录名称是否唯一
-     * 
+     *
      * @param loginName 用户名
      * @return
      */
@@ -411,7 +433,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     public void checkUserAllowed(SysUser user)
@@ -431,7 +453,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属角色组
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -453,7 +475,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属岗位组
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -475,7 +497,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 导入用户数据
-     * 
+     *
      * @param userList 用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
      * @param operName 操作用户
@@ -557,7 +579,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 用户状态修改
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */

+ 97 - 0
suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysUserShopExtServiceImpl.java

@@ -0,0 +1,97 @@
+package com.dgtly.system.service.impl;
+
+import java.util.List;
+import com.dgtly.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dgtly.system.mapper.SysUserShopExtMapper;
+import com.dgtly.system.domain.SysUserShopExt;
+import com.dgtly.system.service.ISysUserShopExtService;
+import com.dgtly.common.core.text.Convert;
+
+/**
+ * 门店人员信息扩展Service业务层处理
+ * 
+ * @author njs
+ * @date 2025-08-19
+ */
+@Service
+public class SysUserShopExtServiceImpl implements ISysUserShopExtService 
+{
+    @Autowired
+    private SysUserShopExtMapper sysUserShopExtMapper;
+
+    /**
+     * 查询门店人员信息扩展
+     * 
+     * @param userId 门店人员信息扩展ID
+     * @return 门店人员信息扩展
+     */
+    @Override
+    public SysUserShopExt selectSysUserShopExtById(String userId)
+    {
+        return sysUserShopExtMapper.selectSysUserShopExtById(userId);
+    }
+
+    /**
+     * 查询门店人员信息扩展列表
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 门店人员信息扩展
+     */
+    @Override
+    public List<SysUserShopExt> selectSysUserShopExtList(SysUserShopExt sysUserShopExt)
+    {
+        return sysUserShopExtMapper.selectSysUserShopExtList(sysUserShopExt);
+    }
+
+    /**
+     * 新增门店人员信息扩展
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    @Override
+    public int insertSysUserShopExt(SysUserShopExt sysUserShopExt)
+    {
+        sysUserShopExt.setCreateTime(DateUtils.getNowDate());
+        return sysUserShopExtMapper.insertSysUserShopExt(sysUserShopExt);
+    }
+
+    /**
+     * 修改门店人员信息扩展
+     * 
+     * @param sysUserShopExt 门店人员信息扩展
+     * @return 结果
+     */
+    @Override
+    public int updateSysUserShopExt(SysUserShopExt sysUserShopExt)
+    {
+        sysUserShopExt.setUpdateTime(DateUtils.getNowDate());
+        return sysUserShopExtMapper.updateSysUserShopExt(sysUserShopExt);
+    }
+
+    /**
+     * 删除门店人员信息扩展对象
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserShopExtByIds(String ids)
+    {
+        return sysUserShopExtMapper.deleteSysUserShopExtByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除门店人员信息扩展信息
+     * 
+     * @param userId 门店人员信息扩展ID
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserShopExtById(String userId)
+    {
+        return sysUserShopExtMapper.deleteSysUserShopExtById(userId);
+    }
+}

+ 27 - 3
suishenbang-system/src/main/resources/mapper/system/AssRelcustomerinfoMapper.xml

@@ -49,7 +49,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectAssRelcustomerinfoVo"/>
 
         WHERE
-            glfs != '开票方关联'
+        glfs != '开票方关联'
+        AND glfs != '用户关联'
         AND mainkunnr IN (
             SELECT
                 ar.mainkunnr
@@ -59,12 +60,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 1 = 1
             AND ( #{orgCode} = ar.mainkunnr OR #{orgCode} = ar.kunnr )
             and glfs  !='用户关联'
-            GROUP BY
+            and glfs != '开票方关联'
+        GROUP BY
                 ar.mainkunnr
             )
-                or user_id=#{userId}
         GROUP BY
             kunnr
+
+        union
+        select id, create_by, create_time, update_by, update_time, is_delete, mainkunnr, mainname1, kunnr, name1, glfs, glsj, enddate, ETL_createtime,user_id,customer_type from ass_relcustomerinfo
+        WHERE
+        glfs != '开票方关联'
+        AND glfs = '用户关联'
+        and   user_id=#{userId}
+        AND mainkunnr IN (
+        SELECT
+        ar.mainkunnr
+        FROM
+        ass_relcustomerinfo ar
+        WHERE
+        glfs != '开票方关联'
+        AND glfs = '用户关联'
+        and   user_id=#{userId}
+        GROUP BY
+        ar.mainkunnr
+        )
+
+        GROUP BY
+        kunnr
+
     </select>
 
     <select id="selectRelcustomerinfoByKunnr" resultMap="AssRelcustomerinfoResult">

+ 23 - 14
suishenbang-system/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -18,10 +18,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateTime"   column="update_time"    />
 		<result property="remark"       column="remark"         />
 	</resultMap>
-	
+
 	<sql id="selectRoleContactVo">
         select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,
-            r.status, r.del_flag, r.create_time, r.remark 
+            r.status, r.del_flag, r.create_time, r.remark
         from sys_role r
 -- 	        left join sys_user_role ur on ur.role_id = r.role_id
 -- 	        left join sys_user u on u.user_id = ur.user_id
@@ -31,9 +31,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	        left join sys_user u on u.user_id = ur.user_id
 	        left join sys_dept d on u.dept_id = d.dept_id
     </sql>
-    
+
     <sql id="selectRoleVo">
-		select r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status, r.del_flag, r.create_time, r.remark 
+		select r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status, r.del_flag, r.create_time, r.remark
         from sys_role r
 	</sql>
 
@@ -66,33 +66,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectRoleContactVo"/>
 		WHERE r.del_flag = '0' and ur.user_id = #{userId}
 	</select>
-	
+
 	<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		where r.del_flag = '0' and r.role_id = #{roleId}
 	</select>
-	
+
 	<select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		 where r.role_name=#{roleName}
 	</select>
-	
+
 	<select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		 where r.role_key=#{roleKey}
 	</select>
-	
+
 	<delete id="deleteRoleById" parameterType="Long">
  		delete from sys_role where role_id = #{roleId}
  	</delete>
- 	
+
  	<delete id="deleteRoleByIds" parameterType="Long">
  	    update sys_role set del_flag = '2' where role_id in
  		<foreach collection="array" item="roleId" open="(" separator="," close=")">
  			#{roleId}
-        </foreach> 
+        </foreach>
  	</delete>
- 	
+
  	<update id="updateRole" parameterType="SysRole">
  		update sys_role
  		<set>
@@ -107,7 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  		</set>
  		where role_id = #{roleId}
 	</update>
- 	
+
  	<insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
  		insert into sys_role(
  			<if test="roleId != null and roleId != 0">role_id,</if>
@@ -131,5 +131,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
-	
-</mapper> 
+
+	<select id="selectRoleIdByRoleKey" resultType="java.lang.Long">
+		SELECT
+			role_id
+		FROM
+			sys_role
+		WHERE
+			role_key = #{roleKey} and del_flag='0' limit 1
+	</select>
+
+</mapper>

+ 6 - 2
suishenbang-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -350,6 +350,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="isConsignee != null">is_consignee = #{isConsignee},</if>
  			<if test="isSync != null">is_sync = #{isSync},</if>
 			<if test="quit != null">quit = #{quit},</if>
+			<if test="isShopAccount != null">is_shop_account = #{isShopAccount},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}
@@ -418,6 +419,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">status,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
  			<if test="remark != null and remark != ''">remark,</if>
+			<if test="isShopAccount != null and isShopAccount != ''">is_shop_account,</if>
  			create_time
  		)values(
  			<if test="userId != null and userId != ''">#{userId},</if>
@@ -434,7 +436,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
- 			sysdate()
+			<if test="isShopAccount != null and isShopAccount != ''">#{isShopAccount},</if>
+
+		sysdate()
  		)
 	</insert>
 
@@ -443,7 +447,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectAllUserLoginName"  resultType="java.lang.String">
         select u.login_name
-        from sys_user u  where u.quit is null
+        from sys_user u  where u.quit is null and u.del_flag='0'
 	</select>
 
 	<select id="selectDiyUserLoginName"  resultType="java.lang.String">

+ 13 - 9
suishenbang-system/src/main/resources/mapper/system/SysUserRoleMapper.xml

@@ -12,25 +12,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<delete id="deleteUserRoleByUserId" parameterType="Long">
 		delete from sys_user_role where user_id=#{userId}
 	</delete>
-	
+
 	<select id="countUserRoleByRoleId" resultType="Integer">
-	    select count(1) from sys_user_role where role_id=#{roleId}  
+	    select count(1) from sys_user_role where role_id=#{roleId}
 	</select>
-	
+
 	<delete id="deleteUserRole" parameterType="Long">
  		delete from sys_user_role where user_id in
  		<foreach collection="array" item="userId" open="(" separator="," close=")">
  			#{userId}
-        </foreach> 
+        </foreach>
  	</delete>
-	
+
 	<insert id="batchUserRole">
 		insert into sys_user_role(user_id, role_id) values
 		<foreach item="item" index="index" collection="list" separator=",">
 			(#{item.userId},#{item.roleId})
 		</foreach>
 	</insert>
-	
+
 	<delete id="deleteUserRoleInfo" parameterType="SysUserRole">
 		delete from sys_user_role where 1=1
 		<if test="userId !=null and userId !='' ">
@@ -41,11 +41,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		</if>
 
 	</delete>
-	
+
 	<delete id="deleteUserRoleInfos">
 	    delete from sys_user_role where role_id=#{roleId} and user_id in
  	    <foreach collection="userIds" item="userId" open="(" separator="," close=")">
  	        #{userId}
-            </foreach> 
+            </foreach>
+	</delete>
+
+	<delete id="deleteUserRoleByUserIdAndExt">
+		delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} and shop_type=#{shopType}
 	</delete>
-</mapper> 
+</mapper>

+ 123 - 0
suishenbang-system/src/main/resources/mapper/system/SysUserShopExtMapper.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dgtly.system.mapper.SysUserShopExtMapper">
+
+    <resultMap type="SysUserShopExt" id="SysUserShopExtResult">
+        <result property="userId"    column="user_id"    />
+        <result property="loginName"    column="login_name"    />
+        <result property="shopCode"    column="shop_code"    />
+        <result property="shopName"    column="shop_name"    />
+        <result property="isShopType"    column="is_shop_type"    />
+        <result property="subofficeCode"    column="subOffice_code"    />
+        <result property="subofficeName"    column="subOffice_name"    />
+        <result property="userUpdateTime"    column="user_update_time"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="delTime"    column="del_time"    />
+        <result property="constraintUserId"    column="constraint_user_id"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectSysUserShopExtVo">
+        select user_id, login_name, shop_code, shop_name, is_shop_type, subOffice_code, subOffice_name, user_update_time, del_flag, del_time, create_time,constraint_user_id from sys_user_shop_ext
+    </sql>
+
+    <select id="selectSysUserShopExtList" parameterType="SysUserShopExt" resultMap="SysUserShopExtResult">
+        <include refid="selectSysUserShopExtVo"/>
+        <where>
+            <if test="userId != null  and userId != ''"> and user_id = #{userId}</if>
+            <if test="loginName != null  and loginName != ''"> and login_name like concat('%', #{loginName}, '%')</if>
+            <if test="shopCode != null  and shopCode != ''"> and shop_code = #{shopCode}</if>
+            <if test="shopName != null  and shopName != ''"> and shop_name like concat('%', #{shopName}, '%')</if>
+            <if test="isShopType != null  and isShopType != ''"> and is_shop_type = #{isShopType}</if>
+            <if test="subofficeCode != null  and subofficeCode != ''"> and subOffice_code = #{subofficeCode}</if>
+            <if test="subofficeName != null  and subofficeName != ''"> and subOffice_name like concat('%', #{subofficeName}, '%')</if>
+            <if test="userUpdateTime != null  and userUpdateTime != ''"> and user_update_time = #{userUpdateTime}</if>
+            <if test="delTime != null "> and del_time = #{delTime}</if>
+            <if test="constraintUserId != null and constraintUserId !='' "> and constraint_user_id = #{constraintUserId}</if>
+        </where>
+    </select>
+
+    <select id="selectSysUserShopExtById" parameterType="String" resultMap="SysUserShopExtResult">
+        <include refid="selectSysUserShopExtVo"/>
+        where user_id = #{userId} and delFlag='0'
+    </select>
+
+    <insert id="insertSysUserShopExt" parameterType="SysUserShopExt">
+        insert into sys_user_shop_ext
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null  and userId != ''">user_id,</if>
+            <if test="loginName != null  and loginName != ''">login_name,</if>
+            <if test="shopCode != null  and shopCode != ''">shop_code,</if>
+            <if test="shopName != null  and shopName != ''">shop_name,</if>
+            <if test="isShopType != null  and isShopType != ''">is_shop_type,</if>
+            <if test="subofficeCode != null  and subofficeCode != ''">subOffice_code,</if>
+            <if test="subofficeName != null  and subofficeName != ''">subOffice_name,</if>
+            <if test="userUpdateTime != null  and userUpdateTime != ''">user_update_time,</if>
+            <if test="delFlag != null  and delFlag != ''">del_flag,</if>
+            <if test="delTime != null ">del_time,</if>
+            <if test="constraintUserId != null ">constraint_user_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null  and userId != ''">#{userId},</if>
+            <if test="loginName != null  and loginName != ''">#{loginName},</if>
+            <if test="shopCode != null  and shopCode != ''">#{shopCode},</if>
+            <if test="shopName != null  and shopName != ''">#{shopName},</if>
+            <if test="isShopType != null  and isShopType != ''">#{isShopType},</if>
+            <if test="subofficeCode != null  and subofficeCode != ''">#{subofficeCode},</if>
+            <if test="subofficeName != null  and subofficeName != ''">#{subofficeName},</if>
+            <if test="userUpdateTime != null  and userUpdateTime != ''">#{userUpdateTime},</if>
+            <if test="delFlag != null  and delFlag != ''">#{delFlag},</if>
+            <if test="delTime != null ">#{delTime},</if>
+            <if test="constraintUserId != null ">#{constraintUserId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysUserShopExt" parameterType="SysUserShopExt">
+        update sys_user_shop_ext
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="loginName != null  and loginName != ''">login_name = #{loginName},</if>
+            <if test="shopCode != null  and shopCode != ''">shop_code = #{shopCode},</if>
+            <if test="shopName != null  and shopName != ''">shop_name = #{shopName},</if>
+            <if test="isShopType != null  and isShopType != ''">is_shop_type = #{isShopType},</if>
+            <if test="subofficeCode != null  and subofficeCode != ''">subOffice_code = #{subofficeCode},</if>
+            <if test="subofficeName != null  and subofficeName != ''">subOffice_name = #{subofficeName},</if>
+            <if test="userUpdateTime != null  and userUpdateTime != ''">user_update_time = #{userUpdateTime},</if>
+            <if test="delFlag != null  and delFlag != ''">del_flag = #{delFlag},</if>
+            <if test="delTime != null ">del_time = #{delTime},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+        </trim>
+        where user_id = #{userId}
+    </update>
+
+    <delete id="deleteSysUserShopExtById" parameterType="String">
+        delete from sys_user_shop_ext where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteSysUserShopExtByIds" parameterType="String">
+        delete from sys_user_shop_ext where user_id in
+        <foreach item="userId" collection="array" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+
+    <select id="searchRunTime" resultType="java.lang.String">
+        select max(user_update_time) from sys_user_shop_ext
+    </select>
+
+    <update id="deleteUserShopExt" >
+        update sys_user_shop_ext set del_flag = 2, del_time = now()
+           where user_id =#{userId} and login_name = #{loginName} and shop_code = #{shopCode} and  is_shop_type = #{isShopType}
+    </update>
+
+    <delete id="deletePhysicsUserShopExt">
+        delete from sys_user_shop_ext where user_id =#{userId} and login_name = #{loginName} and shop_code = #{shopCode} and  is_shop_type = #{isShopType}
+    </delete>
+
+    <select id="selectLoginNameByUserId" resultType="java.lang.String">
+        select login_name from sys_user_shop_ext
+          where constraint_user_id = #{dataUserId} and shop_code = #{shopCode} and  is_shop_type = #{isShopType} limit 1
+    </select>
+
+</mapper>

+ 1 - 1
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/JedisPoolUtil.java

@@ -11,7 +11,7 @@ public class JedisPoolUtil {
     private static volatile JedisPool jedisPool = null;
     private static final String HOST="127.0.0.1" ;
     private static final int PORT = 6379;
-    private static final String PASSWORD = "Ssbtest#1207";
+    private static final String PASSWORD = "Ssbprod#1207";
     private static final int TIMEOUT = 2000;
     private JedisPoolUtil() {}
     public static JedisPool getPool() {

+ 1 - 5
suishenbang-wxportal/suishenbang-wxportal-manager/pom.xml

@@ -44,11 +44,7 @@
             <groupId>com.dgtly</groupId>
             <artifactId>suishenbang-system</artifactId>
         </dependency>
-        <dependency>
-            <groupId>redis.clients</groupId>
-            <artifactId>jedis</artifactId>
-            <version>5.0.2</version>
-        </dependency>
+
 
 
     </dependencies>