Просмотр исходного кода

树形菜单的搜索改为级联搜索 + 微信小程序登录相关

何力凯 3 недель назад
Родитель
Сommit
4ffa4bb42c
19 измененных файлов с 896 добавлено и 17 удалено
  1. 135 12
      zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysLoginController.java
  2. 8 0
      zkqy-business/src/main/java/com/zkqy/business/controller/CommonController.java
  3. 1 0
      zkqy-business/src/main/java/com/zkqy/business/mapper/DragTreeMapper.java
  4. 4 1
      zkqy-business/src/main/resources/mapper/dragmapper/DragTreeMapper.xml
  5. 31 0
      zkqy-common/src/main/java/com/zkqy/common/core/domain/entity/SysUser.java
  6. 3 0
      zkqy-common/src/main/java/com/zkqy/common/core/domain/model/LoginBody.java
  7. 1 1
      zkqy-framework/src/main/java/com/zkqy/framework/config/SecurityConfig.java
  8. 13 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/CommonEntity.java
  9. 72 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/DragTreeExecMapper.java
  10. 2 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/ICommonService.java
  11. 127 0
      zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/CommonServiceImpl.java
  12. 158 0
      zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/DragTreeExecMapper.xml
  13. 269 0
      zkqy-system/src/main/java/com/zkqy/system/domain/DragTree.java
  14. 38 0
      zkqy-system/src/main/java/com/zkqy/system/domain/TreeNodeForCommon.java
  15. 4 0
      zkqy-system/src/main/java/com/zkqy/system/mapper/SysUserMapper.java
  16. 0 1
      zkqy-system/src/main/java/com/zkqy/system/service/ISysMenuService.java
  17. 5 0
      zkqy-system/src/main/java/com/zkqy/system/service/ISysUserService.java
  18. 10 0
      zkqy-system/src/main/java/com/zkqy/system/service/impl/SysUserServiceImpl.java
  19. 15 2
      zkqy-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 135 - 12
zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysLoginController.java

@@ -7,10 +7,13 @@ import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.zkqy.business.service.IMobilePageDataService;
+import com.zkqy.common.config.ZkqyConfig;
 import com.zkqy.common.core.domain.entity.SysTenant;
 import com.zkqy.common.utils.StringUtils;
+import com.zkqy.common.utils.file.FileUploadUtils;
 import com.zkqy.framework.web.service.TokenService;
 import com.zkqy.system.service.*;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
@@ -28,6 +31,7 @@ import com.zkqy.common.utils.SecurityUtils;
 import com.zkqy.framework.web.service.SysLoginService;
 import com.zkqy.framework.web.service.SysPermissionService;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -37,6 +41,7 @@ import javax.validation.Valid;
  *
  * @author ruoyi
  */
+@Slf4j
 @RestController
 public class SysLoginController {
 
@@ -171,23 +176,22 @@ public class SysLoginController {
      * @return 结果
      */
     @GetMapping("/tenantLogin/mobile")
-    public AjaxResult tenantLogin(@RequestParam("phonenumber") String phonenumber) {
+    public AjaxResult tenantLogin(@RequestParam("phonenumber") String phonenumber,@RequestParam("openid") String openid) {
         // 根据手机号查询到用户信息
         if (StringUtils.isEmpty(phonenumber)) {
             return AjaxResult.error("请输入手机号码");
         }
         // 开发人员特判,fjqy的小程序
         Long tenantId = 0l;
-        if (phonenumber.equals("17395716650") || phonenumber.equals("19967487908")){
-            tenantId = 216l;
-        }else {
-            //同一个手机号只能对应一个账户
-            SysUser user = userService.selectUserByPhonenumber(phonenumber);
-            if (user == null || user.getUserId() == null) {
-                return AjaxResult.error("未查询到对应手机号的用户");
-            }
-            tenantId = user.getTenantId();
-        }
+        //同一个手机号只能对应一个账户
+        SysUser user = userService.selectUserByPhonenumber(phonenumber);
+        if (user == null || user.getUserId() == null) {
+            return AjaxResult.error("未查询到对应手机号的用户");
+        }
+        // 更新用户的openid
+        user.setOpenid(openid);
+        userService.updateUserStatus(user);
+        tenantId = user.getTenantId();
         SysTenant sysTenant = sysTenantService.selectSysTenantByTenantId(tenantId);
         if (sysTenant == null || sysTenant.getTenantId() == null){
             return AjaxResult.error("该租户信息不存在");
@@ -198,12 +202,131 @@ public class SysLoginController {
         return AjaxResult.success(sysTenant.getTenantWechatIndexUrl());
     }
 
+    // 手机号和密码登录小程序
+    @PostMapping("/tenantLogin/mobile/common")
+    public AjaxResult tenantLoginCommon(@RequestBody LoginBody loginBody) {
+        String username = loginBody.getUsername();
+        String password = loginBody.getPassword();
+        String openid = loginBody.getOpenid();
+        if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(openid)){
+            return AjaxResult.error("输入参数缺失");
+        }
+        // 现根据手机号找到用户,然后核对账号密码
+        try  {
+            SysUser user = userService.selectUserByPhonenumber(username);
+            if (user == null || user.getUserId() == null){
+                return AjaxResult.error("未查询到对应手机号用户");
+            }
+            boolean b = SecurityUtils.matchesPassword(password, user.getPassword());
+            if (!b){
+                return AjaxResult.error("密码错误");
+            }
+            if (user.getTenantId() == null){
+                return AjaxResult.error("用户未绑定租户");
+            }
+            Long tenantId = user.getTenantId();
+            SysTenant sysTenant = sysTenantService.selectSysTenantByTenantId(tenantId);
+            String tenantWechatIndexUrl = sysTenant.getTenantWechatIndexUrl();
+            // 更新用户的openid
+            user.setOpenid(openid);
+            userService.updateUserStatus(user);
+            return AjaxResult.success("登录成功",  tenantWechatIndexUrl);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error("该手机号绑定了多个用户,请练习管理员");
+        }
+    }
+    /**
+     * 根据openid查询租户小程序首页信息是否存在
+     * @param openid
+     * @return
+     */
+    @GetMapping("/tenantLogin/mobile/openid")
+    public AjaxResult getMiniProgramHomeInfoByOpenId(String openid) {
+        SysUser user  = userService.selectUserByOpenid(openid);
+        if (user != null && user.getTenantId() != null){
+            SysTenant sysTenant = sysTenantService.selectSysTenantByTenantId(user.getTenantId());
+            if (sysTenant != null && StringUtils.isNotBlank(sysTenant.getTenantWechatIndexUrl())){
+                return AjaxResult.success("登录成功",  sysTenant.getTenantWechatIndexUrl());
+            }
+        }else{
+            return AjaxResult.error("未查询到该用户信息");
+        }
+        return AjaxResult.error("请求失败,请联系管理员");
+    }
+
+    /**
+     * 根据openid获取用户信息
+     */
+    @GetMapping("/mobile/getUserInfo")
+    public AjaxResult mobileGetUserInfo(String openid) {
+        SysUser sysUser = userService.selectUserByOpenid(openid);
+        Long tenantId = sysUser.getTenantId();
+        SysTenant sysTenant = sysTenantService.selectSysTenantByTenantId(tenantId);
+        sysUser.setTenantWechatIndexUrl(sysTenant.getTenantWechatIndexUrl());
+        if (sysUser != null){
+            return AjaxResult.success(sysUser);
+        }else{
+            return AjaxResult.error("未查询到该用户信息");
+        }
+    }
+    @GetMapping("/mobile/logout")
+    public AjaxResult mobileGetUserInfo123(String openid) {
+        if (StringUtils.isBlank(openid)){
+            return AjaxResult.error("请输入openid");
+        }
+        userService.mobileLogout(openid);
+        return AjaxResult.success("退出成功");
+    }
+
+
+    // 微信用户头像上传,然后保存到数据库里面
+    @PostMapping("/wx/uploadAvatar")
+    public AjaxResult wxUploadFile(MultipartFile file,String openid) throws Exception {
+        if (file == null){
+            return AjaxResult.error("请上传文件");
+        }
+        String fileName = "";
+        try {
+            // 上传文件路径
+            String filePath = ZkqyConfig.getUploadPath();
+            // 上传并返回新文件名称
+            fileName = FileUploadUtils.upload(filePath, file);
+        } catch (Exception e) {
+            return AjaxResult.error(e.getMessage());
+        }
+//        return AjaxResult.success();
+        SysUser user = userService.selectUserByOpenid(openid);
+        user.setWxAvatar(fileName);
+        int i = userService.updateUserStatus(user);
+        if (i > 0){
+            return AjaxResult.success("成功",fileName);
+        }else{
+            return AjaxResult.error("更新用户头像失败");
+        }
+    }
+
+    // 获取微信用户的code
+    @GetMapping("/wx/getOpenId")
+    public AjaxResult getCode(String code) {
+        if (StringUtils.isBlank(code)){
+            return AjaxResult.error("用户code未上传");
+        }
+        String tokenUrl = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appid,  appSecret,code);
+        JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
+        if (token.containsKey("errcode")){
+            log.info(token.get("errcode").toString());
+            return AjaxResult.error("获取用户信息失败");
+        }
+        return AjaxResult.success("成功",token.get("openid").toString());
+    }
+
     /**
      * 微信小程序获取手机号
      * @param
      * @return
      */
-    @PostMapping("/getPhoneNumber")
+    @PostMapping("/wx/getPhoneNumber")
     public Object getPhoneNumber(@RequestBody Map<String,Object> data)
     {
         //通过appid和secret来获取token

+ 8 - 0
zkqy-business/src/main/java/com/zkqy/business/controller/CommonController.java

@@ -9,6 +9,7 @@ import com.zkqy.common.core.domain.AjaxResult;
 import com.zkqy.common.core.page.TableDataInfo;
 import com.zkqy.common.enums.BusinessType;
 import com.zkqy.common.exception.tenantdatassource.TenantDataSource;
+import com.zkqy.common.utils.StringUtils;
 import com.zkqy.execution.produce.dispersed.entity.CommonEntity;
 import com.zkqy.execution.produce.dispersed.entity.TableSql;
 import com.zkqy.execution.produce.dispersed.service.ICommonService;
@@ -43,6 +44,8 @@ public class CommonController extends BaseController {
 
     @Autowired
     private ISaleProductsService saleProductsService;
+    @Autowired
+    private ICommonService iCommonService;
 
     /**
      * 共通查询
@@ -116,6 +119,11 @@ public class CommonController extends BaseController {
 //            return null;
 //        }
         TableSql tableSql = iTableSqlService.selectTableSqlByTSqlKey(commonEntity.getQueryMap().get("sqlkey").toString());
+        String queryType = commonEntity.getQueryType();
+        if (StringUtils.isNotEmpty(queryType) && queryType.equals("tree")){
+            Map<String, Object> queryMap = iCommonService.treeQueryParamsBuild(commonEntity.getQueryMap(), tableSql.gettId());
+            commonEntity.setQueryMap(queryMap);
+        }
         String tableFormat = dragTableService.getTableFormatBySqlKey(tableSql.getSqlKey());
         startPage();  // 校验是否sqlserver 否执行 是执行另一种方式的分页
         return getDataTable(commonService.queryGroupTableList(commonEntity, tableSql, tableFormat));

+ 1 - 0
zkqy-business/src/main/java/com/zkqy/business/mapper/DragTreeMapper.java

@@ -101,4 +101,5 @@ public interface DragTreeMapper
     List<Map<String, String>> selectTreeNodeList(@Param("tableName") String tableName);
 
 
+    DragTree selectDragTreeByTId(Long tID);
 }

+ 4 - 1
zkqy-business/src/main/resources/mapper/dragmapper/DragTreeMapper.xml

@@ -64,7 +64,10 @@
         where tree_table_key = #{id}
     </select>
 
-
+    <select id="selectDragTreeByTId" resultType="com.zkqy.business.entity.DragTree">
+        <include refid="selectDragTreeVo"/>
+        where table_id = #{tID}
+    </select>
 
     <select id="selectList" resultType="java.util.HashMap">
         ${executeSql}

+ 31 - 0
zkqy-common/src/main/java/com/zkqy/common/core/domain/entity/SysUser.java

@@ -59,6 +59,8 @@ public class SysUser extends BaseEntity
     /** 用户头像 */
     private String avatar;
 
+    private String wxAvatar;
+
     /** 密码 */
     private String password;
 
@@ -105,6 +107,11 @@ public class SysUser extends BaseEntity
 //    @Excel(name = "是否可登录工具端", readConverterExp = "0=允许,1=禁止")
     private  String isCanTools;
 
+    private String openid;
+
+    // 这个字段不在这个表中,临时使用
+    private String tenantWechatIndexUrl;
+
     public SysUser()
     {
 
@@ -383,4 +390,28 @@ public class SysUser extends BaseEntity
             .append("tenantName",getTenantName())
             .toString();
     }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getWxAvatar() {
+        return wxAvatar;
+    }
+
+    public void setWxAvatar(String wxAvatar) {
+        this.wxAvatar = wxAvatar;
+    }
+
+    public String getTenantWechatIndexUrl() {
+        return tenantWechatIndexUrl;
+    }
+
+    public void setTenantWechatIndexUrl(String tenantWechatIndexUrl) {
+        this.tenantWechatIndexUrl = tenantWechatIndexUrl;
+    }
 }

+ 3 - 0
zkqy-common/src/main/java/com/zkqy/common/core/domain/model/LoginBody.java

@@ -37,6 +37,9 @@ public class LoginBody {
 //    @NotNull(message = "请合法访问!")
     private String tenantID;
 
+    // 微信小程序的id 小程序登陆时使用
+    private String openid;
+
     /**
      * 唯一标识
      */

+ 1 - 1
zkqy-framework/src/main/java/com/zkqy/framework/config/SecurityConfig.java

@@ -117,7 +117,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 //模拟登录授权
                 .antMatchers("/pageTransfer","/lims/Login/","pageTransferTo","/jl_inspection","/system/inspection/list","/bpleavefactory/bpleavefactory/list",
                         "/qualityinspectioninformation/qualityinspectioninformation/list/getOne",
-                        "/getPhoneNumber","/tenantLogin/mobile").permitAll()
+                        "/wx/getPhoneNumber","/tenantLogin/mobile","/tenantLogin/mobile/common","/wx/getOpenId","/tenantLogin/mobile/openid","/wx/uploadAvatar","/mobile/getUserInfo","/mobile/logout").permitAll()
 
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()

+ 13 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/entity/CommonEntity.java

@@ -29,6 +29,11 @@ public class CommonEntity extends BaseEntity implements Serializable,Cloneable {
      */
     private Map<String, Object> queryMap;
 
+    /**
+     * 查询类型 树形(tree),普通(默认)
+     */
+    private String queryType;
+
     /**
      * 条件Map(例如修改时前端回传的唯一id标识,删除同理)
      */
@@ -176,6 +181,14 @@ public class CommonEntity extends BaseEntity implements Serializable,Cloneable {
     public void setCalculateResultMap(Map<String, Object> calculateResultMap) {
         this.calculateResultMap = calculateResultMap;
     }
+
+    public String getQueryType() {
+        return queryType;
+    }
+
+    public void setQueryType(String queryType) {
+        this.queryType = queryType;
+    }
 }
 /*
 

+ 72 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/mapper/DragTreeExecMapper.java

@@ -0,0 +1,72 @@
+package com.zkqy.execution.produce.dispersed.mapper;
+
+import com.zkqy.system.domain.DragTree;
+import com.zkqy.system.domain.TreeNodeForCommon;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+/**
+ * 拖拽树结构Mapper接口
+ * 
+ * @author hmc
+ * @date 2025-03-05
+ */
+@Mapper
+public interface DragTreeExecMapper
+{
+    /**
+     * 查询拖拽树结构
+     * 
+     * @param id 拖拽树结构主键
+     * @return 拖拽树结构
+     */
+    public DragTree selectDragTreeById(Long id);
+
+    public DragTree selectDragTreeByTID(@Param("tID") Long id);
+
+    /**
+     * 查询拖拽树结构列表
+     * 
+     * @param dragTree 拖拽树结构
+     * @return 拖拽树结构集合
+     */
+    public List<DragTree> selectDragTreeList(DragTree dragTree);
+
+    /**
+     * 新增拖拽树结构
+     * 
+     * @param dragTree 拖拽树结构
+     * @return 结果
+     */
+    public int insertDragTree(DragTree dragTree);
+
+    /**
+     * 修改拖拽树结构
+     * 
+     * @param dragTree 拖拽树结构
+     * @return 结果
+     */
+    public int updateDragTree(DragTree dragTree);
+
+    /**
+     * 删除拖拽树结构
+     * 
+     * @param id 拖拽树结构主键
+     * @return 结果
+     */
+    public int deleteDragTreeById(Long id);
+
+    /**
+     * 批量删除拖拽树结构
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteDragTreeByIds(Long[] ids);
+
+
+    List<TreeNodeForCommon> fetchTreeNodesFromDB(@Param("treeName") String treeName, @Param("primaryKey") String primaryKey, @Param("showLabel") String showLabel, @Param("recursiveCol") String recursiveCol);
+}

+ 2 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/ICommonService.java

@@ -99,4 +99,6 @@ public interface ICommonService {
     CommonEntity queryDropDownBoxData(List<CommonEntity> commonEntityList);
 
     CommonEntity queryCommonByCalculateBtn(CommonEntity commonEntity, String dfVueTemplate);
+
+    Map<String,Object> treeQueryParamsBuild(Map<String, Object> queryMap, Long tID);
 }

+ 127 - 0
zkqy-process-execution/src/main/java/com/zkqy/execution/produce/dispersed/service/impl/CommonServiceImpl.java

@@ -16,6 +16,9 @@ import com.zkqy.execution.produce.dispersed.entity.TableSql;
 import com.zkqy.execution.produce.dispersed.mapper.CommonMapper;
 import com.zkqy.execution.produce.dispersed.mapper.TableSqlMapper;
 import com.zkqy.execution.produce.dispersed.service.ICommonService;
+import com.zkqy.system.domain.DragTree;
+import com.zkqy.system.domain.TreeNodeForCommon;
+import com.zkqy.execution.produce.dispersed.mapper.DragTreeExecMapper;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -48,6 +51,8 @@ public class CommonServiceImpl implements ICommonService {
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private DragTreeExecMapper dragTreeExecMapper;
 
     @Override
     public List<CommonEntity> selectList(CommonEntity commonEntity) {
@@ -369,6 +374,16 @@ public class CommonServiceImpl implements ICommonService {
             String executeEndTimeSql = endTimeSql.replace("#{field}", item).replace("#{endTime}", endtime.get("endTime").toString());
             equivalent.set(executeBeginTimesql + executeEndTimeSql);
         });
+        // 树形表单搜索查询
+        String queryType = commonEntity.getQueryType();
+        if (StringUtils.isNotEmpty(queryType) && queryType.equals("tree")) {
+            Object treeQuery = queryMap.get("treeQuery");
+            queryMap.remove("treeQuery");
+            if (treeQuery != null && StringUtils.isNotEmpty(treeQuery.toString()) ){
+                String querySqlWhere = equivalent.get() + " and " + treeQuery.toString();
+                equivalent.set(querySqlWhere);
+            }
+        }
         // 删除时间范围查询
         queryMap.remove("timehorizon");
         // 其他查询条件拼接
@@ -419,6 +434,118 @@ public class CommonServiceImpl implements ICommonService {
         return commonEntities;
     }
 
+    public Map<String,Object> treeQueryParamsBuild(Map<String, Object> queryMap, Long tID) {
+        // 根据tID先找到某个menuid 然后根据menuid找到 drag_tree
+        DragTree dragTree = dragTreeExecMapper.selectDragTreeByTID(tID);
+
+        String treeTableJoinTable = dragTree.getTreeTableJoinTable(); // 关联表名称
+        String treeTableJoinTableCondition = dragTree.getTreeTableJoinTableCondition(); // 关联表字段
+
+        //树的结构示例如下 id(树主键),name(展示列),parentId(递归列)
+        //如果根据label查询 要查询到当前匹配的名称,以及所有子节点的值,最后得到一个list<String>,用来存放所有匹配到的值
+        //如果是根据value查询,要查询到当前匹配的主键,以及所有对应子节点的值,最后得到一个list用来存放所有匹配到的值
+        //得到查询字段
+        String treeName = dragTree.getTreeTableName();
+        String primaryKey = dragTree.getTreeTablePrimaryKey();
+        String showLabel = dragTree.getTreeShowLabel();
+        String recursiveCol = dragTree.getTreeTableDgl();
+        String conditionType = dragTree.getTreeTableCondition();
+        // 模拟从数据库获取树数据(实际应用中需替换为真实数据访问逻辑)
+        List<TreeNodeForCommon> allNodes = dragTreeExecMapper.fetchTreeNodesFromDB(treeName, primaryKey, showLabel, recursiveCol);
+
+        // 构建树结构:创建ID到节点的映射和父节点到子节点的映射
+        Map<String, TreeNodeForCommon> nodeMap = new HashMap<>();
+        Map<String, List<TreeNodeForCommon>> parentChildMap = new HashMap<>();
+
+        for (TreeNodeForCommon node : allNodes) {
+            nodeMap.put(node.getId(), node);
+            parentChildMap.computeIfAbsent(node.getParentId(), k -> new ArrayList<>()).add(node);
+        }
+
+        // 根据查询类型处理
+        List<String> resList = new ArrayList<>();
+        String searchValue = "";
+        if (StringUtils.isNotEmpty(conditionType)) {
+            if ("value".equals(conditionType)) {
+                searchValue = queryMap.get(primaryKey).toString();
+                queryMap.remove(primaryKey);
+                String searchValueReplace = searchValue.replace("'","");
+                resList = queryByValue(searchValueReplace, nodeMap, parentChildMap);
+            } else if ("label".equals(conditionType)) {
+                searchValue = queryMap.get(showLabel).toString();
+                queryMap.remove(showLabel);
+                String searchValueReplace = searchValue.replace("'","");
+                resList = queryByLabel(searchValueReplace, nodeMap, parentChildMap);
+            }
+        }
+        if (!resList.isEmpty()){
+            String inClause = String.format("%s.%s in ('%s')",
+                    treeTableJoinTable,
+                    treeTableJoinTableCondition,
+                    String.join("','", resList));
+            queryMap.put("treeQuery",inClause);
+        }
+        return queryMap;
+    }
+    // 根据主键值(value)查询
+    private List<String> queryByValue(String value, Map<String, TreeNodeForCommon> nodeMap,
+                                      Map<String, List<TreeNodeForCommon>> parentChildMap) {
+        List<String> result = new ArrayList<>();
+        TreeNodeForCommon matchedNode = nodeMap.get(value);
+        if (matchedNode != null) {
+            // 收集匹配节点及其所有子节点的ID
+            collectChildrenIds(matchedNode, parentChildMap, result);
+        }
+        return result;
+    }
+    // 根据标签(label)查询
+    private List<String> queryByLabel(String keyword, Map<String, TreeNodeForCommon> nodeMap,
+                                      Map<String, List<TreeNodeForCommon>> parentChildMap) {
+        Set<String> resultSet = new HashSet<>();
+        for (TreeNodeForCommon node : nodeMap.values()) {
+            if (node.getName().contains(keyword)) {
+                // 收集匹配节点及其所有子节点的名称
+                collectChildrenNames(node, parentChildMap, resultSet);
+            }
+        }
+        return new ArrayList<>(resultSet);
+    }
+    // 递归收集子节点ID(BFS非递归实现)
+    private void collectChildrenIds(TreeNodeForCommon startNode, Map<String, List<TreeNodeForCommon>> parentChildMap,
+                                    List<String> result) {
+        Queue<TreeNodeForCommon> queue = new LinkedList<>();
+        queue.add(startNode);
+
+        while (!queue.isEmpty()) {
+            TreeNodeForCommon current = queue.poll();
+            result.add(current.getId());
+
+            // 添加所有子节点到队列
+            List<TreeNodeForCommon> children = parentChildMap.get(current.getId());
+            if (children != null) {
+                queue.addAll(children);
+            }
+        }
+    }
+
+    // 递归收集子节点名称(BFS非递归实现)
+    private void collectChildrenNames(TreeNodeForCommon startNode, Map<String, List<TreeNodeForCommon>> parentChildMap,
+                                      Set<String> resultSet) {
+        Queue<TreeNodeForCommon> queue = new LinkedList<>();
+        queue.add(startNode);
+
+        while (!queue.isEmpty()) {
+            TreeNodeForCommon current = queue.poll();
+            resultSet.add(current.getName());
+
+            // 添加所有子节点到队列
+            List<TreeNodeForCommon> children = parentChildMap.get(current.getId());
+            if (children != null) {
+                queue.addAll(children);
+            }
+        }
+    }
+
     @Override
     public List<CommonEntity> queryGroupTableList1(CommonEntity commonEntity, TableSql tableSql, String tableFormat) {
         //前端传递过来的参数

+ 158 - 0
zkqy-process-execution/src/main/resources/mapper/bpm/dispersed/DragTreeExecMapper.xml

@@ -0,0 +1,158 @@
+<?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.zkqy.execution.produce.dispersed.mapper.DragTreeExecMapper">
+
+    <resultMap type="com.zkqy.system.domain.DragTree" id="DragTreeResult">
+        <result property="id"    column="id"    />
+        <result property="menuId"    column="menu_id"    />
+        <result property="menuName"    column="menu_name"    />
+        <result property="treeDesc"    column="tree_desc"    />
+        <result property="treeTableName"    column="tree_table_name"    />
+        <result property="treeTablePrimaryKey"    column="tree_table_primary_key"    />
+        <result property="treeTableDgl"    column="tree_table_dgl"    />
+        <result property="treeTableCondition"    column="tree_table_condition"    />
+        <result property="treeTableJoinTable"    column="tree_table_join_table"    />
+        <result property="allJson"    column="all_json"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createById"    column="create_by_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateById"    column="update_by_id"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="tableId" column="table_id"/>
+        <result property="tableNameDes" column="table_name_des"/>
+        <result property="treeTableKey" column="tree_table_key"/>
+        <result property="treeShowLabel" column="tree_show_label"/>
+        <result property="treeTableJoinTableCondition" column="tree_table_join_table_condition"/>
+    </resultMap>
+
+    <sql id="selectDragTreeVo">
+        select id, menu_id, menu_name, tree_desc, tree_table_name, tree_table_primary_key, tree_table_dgl, tree_table_condition, tree_table_join_table, table_name_des, del_flag, create_by, create_by_id, create_time, update_by, update_by_id, update_time,table_id,tree_table_key,tree_show_label,tree_table_join_table_condition from {DBNAME}.drag_tree
+    </sql>
+
+    <select id="selectDragTreeList" parameterType="com.zkqy.system.domain.DragTree" resultMap="DragTreeResult">
+        <include refid="selectDragTreeVo"/>
+        <where>
+            <if test="menuId != null "> and menu_id = #{menuId}</if>
+            <if test="menuName != null  and menuName != ''"> and menu_name like concat('%', #{menuName}, '%')</if>
+            <if test="treeDesc != null  and treeDesc != ''"> and tree_desc = #{treeDesc}</if>
+            <if test="treeTableName != null  and treeTableName != ''"> and tree_table_name like concat('%', #{treeTableName}, '%')</if>
+            <if test="treeTablePrimaryKey != null  and treeTablePrimaryKey != ''"> and tree_table_primary_key = #{treeTablePrimaryKey}</if>
+            <if test="treeTableDgl != null  and treeTableDgl != ''"> and tree_table_dgl = #{treeTableDgl}</if>
+            <if test="treeTableCondition != null  and treeTableCondition != ''"> and tree_table_condition = #{treeTableCondition}</if>
+            <if test="treeTableJoinTable != null  and treeTableJoinTable != ''"> and tree_table_join_table = #{treeTableJoinTable}</if>
+            <if test="tableNameDes != null  and tableNameDes != ''"> and table_name_des = #{tableNameDes}</if>
+            <if test="createById != null "> and create_by_id = #{createById}</if>
+            <if test="updateById != null "> and update_by_id = #{updateById}</if>
+            <if test="tableId != null">and table_id=#{tableId}</if>
+            <if test="treeTableKey!=null">and tree_table_key=#{treeTableKey}</if>
+            <if test="treeShowLabel!=null">and tree_show_label=#{treeShowLabel}</if>
+            <if test="treeTableJoinTableCondition!=null">and tree_table_join_table_condition=#{treeTableJoinTableCondition}</if>
+        </where>
+    </select>
+
+    <select id="selectDragTreeById" parameterType="Long" resultMap="DragTreeResult">
+        <include refid="selectDragTreeVo"/>
+        where id = #{id}
+    </select>
+    <select id="fetchTreeNodesFromDB" resultType="com.zkqy.system.domain.TreeNodeForCommon">
+        select ${primaryKey} as 'id', ${showLabel} as 'name', ${recursiveCol} as 'parentId'
+        from {DBNAME}.${treeName}
+    </select>
+    <select id="selectDragTreeByTID" resultType="com.zkqy.system.domain.DragTree">
+        <include refid="selectDragTreeVo"/>
+        where table_id = #{tID}
+    </select>
+
+    <insert id="insertDragTree" parameterType="com.zkqy.system.domain.DragTree" useGeneratedKeys="true" keyProperty="id">
+        insert into {DBNAME}.drag_tree
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="menuId != null">menu_id,</if>
+            <if test="menuName != null and menuName != ''">menu_name,</if>
+            <if test="treeDesc != null and treeDesc != ''">tree_desc,</if>
+            <if test="treeTableName != null and treeTableName != ''">tree_table_name,</if>
+            <if test="treeTablePrimaryKey != null">tree_table_primary_key,</if>
+            <if test="treeTableDgl != null">tree_table_dgl,</if>
+            <if test="treeTableCondition != null">tree_table_condition,</if>
+            <if test="treeTableJoinTable != null">tree_table_join_table,</if>
+            <if test="tableNameDes != null">`table_name_des`,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createById != null">create_by_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateById != null">update_by_id,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="tableId != null">table_id,</if>
+            <if test="treeTableKey!=null">tree_table_key,</if>
+            <if test="treeShowLabel!=null">tree_show_label,</if>
+            <if test="treeTableJoinTableCondition!=null">tree_table_join_table_condition,</if>
+            <if test="treeTableJoinTablePrimaryKey!=null">tree_table_join_table_primary_key,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="menuId != null">#{menuId},</if>
+            <if test="menuName != null and menuName != ''">#{menuName},</if>
+            <if test="treeDesc != null and treeDesc != ''">#{treeDesc},</if>
+            <if test="treeTableName != null and treeTableName != ''">#{treeTableName},</if>
+            <if test="treeTablePrimaryKey != null">#{treeTablePrimaryKey},</if>
+            <if test="treeTableDgl != null">#{treeTableDgl},</if>
+            <if test="treeTableCondition != null">#{treeTableCondition},</if>
+            <if test="treeTableJoinTable != null">#{treeTableJoinTable},</if>
+            <if test="tableNameDes != null">#{tableNameDes},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createById != null">#{createById},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateById != null">#{updateById},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="tableId != null">#{tableId},</if>
+            <if test="treeTableKey!=null">#{treeTableKey},</if>
+            <if test="treeShowLabel!=null">#{treeShowLabel},</if>
+            <if test="treeTableJoinTableCondition!=null">#{treeTableJoinTableCondition},</if>
+            <if test="treeTableJoinTablePrimaryKey!=null">#{treeTableJoinTablePrimaryKey},</if>
+        </trim>
+    </insert>
+
+    <update id="updateDragTree" parameterType="com.zkqy.system.domain.DragTree">
+        update {DBNAME}.drag_tree
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="menuId != null">menu_id = #{menuId},</if>
+            <if test="menuName != null and menuName != ''">menu_name = #{menuName},</if>
+            <if test="treeDesc != null and treeDesc != ''">tree_desc = #{treeDesc},</if>
+            <if test="treeTableName != null and treeTableName != ''">tree_table_name = #{treeTableName},</if>
+            <if test="treeTablePrimaryKey != null">tree_table_primary_key = #{treeTablePrimaryKey},</if>
+            <if test="treeTableDgl != null">tree_table_dgl = #{treeTableDgl},</if>
+            <if test="treeTableCondition != null">tree_table_condition = #{treeTableCondition},</if>
+            <if test="treeTableJoinTable != null">tree_table_join_table = #{treeTableJoinTable},</if>
+            <if test="tableNameDes != null">`table_name_des`= #{tableNameDes},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createById != null">create_by_id = #{createById},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateById != null">update_by_id = #{updateById},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="tableId != null">table_id=#{tableId},</if>
+            <if test="treeTableKey!=null">tree_table_key=#{treeTableKey},</if>
+            <if test="treeShowLabel!=null">tree_show_label=#{treeShowLabel},</if>
+            <if test="treeTableJoinTableCondition!=null">tree_table_join_table_condition=#{treeTableJoinTableCondition},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDragTreeById" parameterType="Long">
+        delete from {DBNAME}.drag_tree where id = #{id}
+    </delete>
+
+    <delete id="deleteDragTreeByIds" parameterType="String">
+        delete from {DBNAME}.drag_tree where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 269 - 0
zkqy-system/src/main/java/com/zkqy/system/domain/DragTree.java

@@ -0,0 +1,269 @@
+package com.zkqy.system.domain;
+
+import com.zkqy.common.annotation.Excel;
+import com.zkqy.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+
+/**
+ * 拖拽树结构对象 drag_tree
+ * 
+ * @author hmc
+ * @date 2025-03-05
+ */
+public class DragTree extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    private  String treeShowLabel;
+
+    private String  treeTableJoinTableCondition;
+    private String  treeTableJoinTablePrimaryKey;
+
+    public String getTreeShowLabel() {
+        return treeShowLabel;
+    }
+
+    public void setTreeShowLabel(String treeShowLabel) {
+        this.treeShowLabel = treeShowLabel;
+    }
+
+    /** 唯一标识符,自增主键 */
+    private Long id;
+
+    private  String  treeTableKey;
+
+    public String getTreeTableKey() {
+        return treeTableKey;
+    }
+
+    public void setTreeTableKey(String treeTableKey) {
+        this.treeTableKey = treeTableKey;
+    }
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long menuId;
+
+    private String tableId;
+
+    private  String tableNameDes;
+
+    public String getTableNameDes() {
+        return tableNameDes;
+    }
+
+    public void setTableNameDes(String tableNameDes) {
+        this.tableNameDes = tableNameDes;
+    }
+
+    /** 菜单名称 */
+    @Excel(name = "菜单名称")
+    private String menuName;
+
+    /** 树形描述 */
+    @Excel(name = "树形描述")
+    private String treeDesc;
+
+    /** 树形组件绑定的表格 */
+    @Excel(name = "树形组件绑定的表格")
+    private String treeTableName;
+
+    /** 树形表格组件绑定表格的主键 */
+    @Excel(name = "树形表格组件绑定表格的主键")
+    private String treeTablePrimaryKey;
+
+    /** 递归列 */
+    @Excel(name = "递归列")
+    private String treeTableDgl;
+
+    /** 查询条件选的是 label 还是 value */
+    @Excel(name = "查询条件选的是 label 还是 value")
+    private String treeTableCondition;
+
+    /** 关联右侧查询表的表名称 */
+    @Excel(name = "关联右侧查询表的表名称")
+    private String treeTableJoinTable;
+
+    /** 整体的json */
+    @Excel(name = "整体的json")
+    private String allJson;
+
+    /** 删除标志(0:否 2:是) */
+    private String delFlag;
+
+    /** 创建者id */
+    @Excel(name = "创建者id")
+    private Long createById;
+
+    /** 更新者id */
+    @Excel(name = "更新者id")
+    private Long updateById;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setMenuId(Long menuId) 
+    {
+        this.menuId = menuId;
+    }
+
+    public Long getMenuId() 
+    {
+        return menuId;
+    }
+    public void setMenuName(String menuName) 
+    {
+        this.menuName = menuName;
+    }
+
+    public String getMenuName() 
+    {
+        return menuName;
+    }
+    public void setTreeDesc(String treeDesc) 
+    {
+        this.treeDesc = treeDesc;
+    }
+
+    public String getTreeDesc() 
+    {
+        return treeDesc;
+    }
+    public void setTreeTableName(String treeTableName) 
+    {
+        this.treeTableName = treeTableName;
+    }
+
+    public String getTreeTableName() 
+    {
+        return treeTableName;
+    }
+    public void setTreeTablePrimaryKey(String treeTablePrimaryKey) 
+    {
+        this.treeTablePrimaryKey = treeTablePrimaryKey;
+    }
+
+    public String getTreeTablePrimaryKey() 
+    {
+        return treeTablePrimaryKey;
+    }
+    public void setTreeTableDgl(String treeTableDgl) 
+    {
+        this.treeTableDgl = treeTableDgl;
+    }
+
+    public String getTreeTableDgl() 
+    {
+        return treeTableDgl;
+    }
+    public void setTreeTableCondition(String treeTableCondition) 
+    {
+        this.treeTableCondition = treeTableCondition;
+    }
+
+    public String getTreeTableCondition() 
+    {
+        return treeTableCondition;
+    }
+    public void setTreeTableJoinTable(String treeTableJoinTable) 
+    {
+        this.treeTableJoinTable = treeTableJoinTable;
+    }
+
+    public String getTreeTableJoinTable() 
+    {
+        return treeTableJoinTable;
+    }
+    public void setAllJson(String allJson) 
+    {
+        this.allJson = allJson;
+    }
+
+    public String getAllJson() 
+    {
+        return allJson;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+    public void setCreateById(Long createById) 
+    {
+        this.createById = createById;
+    }
+
+    public Long getCreateById() 
+    {
+        return createById;
+    }
+    public void setUpdateById(Long updateById) 
+    {
+        this.updateById = updateById;
+    }
+
+    public Long getUpdateById() 
+    {
+        return updateById;
+    }
+
+
+    public String getTableId() {
+        return tableId;
+    }
+
+    public void setTableId(String tableId) {
+        this.tableId = tableId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("menuId", getMenuId())
+            .append("menuName", getMenuName())
+            .append("treeDesc", getTreeDesc())
+            .append("treeTableName", getTreeTableName())
+            .append("treeTablePrimaryKey", getTreeTablePrimaryKey())
+            .append("treeTableDgl", getTreeTableDgl())
+            .append("treeTableCondition", getTreeTableCondition())
+            .append("treeTableJoinTable", getTreeTableJoinTable())
+            .append("allJson", getAllJson())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createById", getCreateById())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateById", getUpdateById())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+
+    public String getTreeTableJoinTableCondition() {
+        return treeTableJoinTableCondition;
+    }
+
+    public void setTreeTableJoinTableCondition(String treeTableJoinTableCondition) {
+        this.treeTableJoinTableCondition = treeTableJoinTableCondition;
+    }
+
+    public String getTreeTableJoinTablePrimaryKey() {
+        return treeTableJoinTablePrimaryKey;
+    }
+
+    public void setTreeTableJoinTablePrimaryKey(String treeTableJoinTablePrimaryKey) {
+        this.treeTableJoinTablePrimaryKey = treeTableJoinTablePrimaryKey;
+    }
+}

+ 38 - 0
zkqy-system/src/main/java/com/zkqy/system/domain/TreeNodeForCommon.java

@@ -0,0 +1,38 @@
+package com.zkqy.system.domain;
+
+// 树节点结构
+public class TreeNodeForCommon {
+        private String id;       // 树主键
+        private  String name;     // 展示名称
+        private String parentId; // 父节点ID(递归列)
+
+        public TreeNodeForCommon(String id, String name, String parentId) {
+            this.id = id;
+            this.name = name;
+            this.parentId = parentId;
+        }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+}

+ 4 - 0
zkqy-system/src/main/java/com/zkqy/system/mapper/SysUserMapper.java

@@ -193,4 +193,8 @@ public interface SysUserMapper {
     List<SysUser> selectUserListFjqy(List<String> userIds);
 
     SysUser selectUserByPhonenumber(@Param("phonenumber") String phonenumber);
+
+    SysUser selectUserByOpenid(@Param("openid") String openid);
+
+    void mobileLogout(@Param("openid") String openid);
 }

+ 0 - 1
zkqy-system/src/main/java/com/zkqy/system/service/ISysMenuService.java

@@ -167,7 +167,6 @@ public interface ISysMenuService
      */
     public boolean checkMenuNameUnique(SysMenu menu);
 
-    public boolean checkMenuNameUniqueMuti(SysMenu menu);
 
     /**
      * 动态表格菜单列表

+ 5 - 0
zkqy-system/src/main/java/com/zkqy/system/service/ISysUserService.java

@@ -253,4 +253,9 @@ public interface ISysUserService {
     public SysUser selectUserInfoByTenantCode(String tenantCode, String userName);
 
     SysUser selectUserByPhonenumber(String phonenumber);
+
+    SysUser selectUserByOpenid(String openid);
+
+
+    void mobileLogout(String openid);
 }

+ 10 - 0
zkqy-system/src/main/java/com/zkqy/system/service/impl/SysUserServiceImpl.java

@@ -555,4 +555,14 @@ public class SysUserServiceImpl implements ISysUserService {
         return userMapper.selectUserByPhonenumber(phonenumber);
     }
 
+    @Override
+    public SysUser selectUserByOpenid(String openid) {
+        return userMapper.selectUserByOpenid(openid);
+    }
+
+    @Override
+    public void mobileLogout(String openid) {
+        userMapper.mobileLogout(openid);
+    }
+
 }

+ 15 - 2
zkqy-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="phonenumber"  column="phonenumber"  />
         <result property="sex"          column="sex"          />
         <result property="avatar"       column="avatar"       />
+        <result property="wxAvatar"       column="wx_avatar"       />
         <result property="password"     column="password"     />
         <result property="status"       column="status"       />
         <result property="delFlag"      column="del_flag"     />
@@ -27,6 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="remark"       column="remark"       />
 		<result property="tenantName"   column="tenant_name"  />
 		<result property="isCanTools"  column="is_can_tools"/>
+		<result property="openid"  column="openid"/>
         <association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
 		<association property="tenant"  column="tenant_id" javaType="SysTenant" resultMap="tenantResult" />
         <collection  property="roles"   javaType="java.util.List"           resultMap="RoleResult" />
@@ -93,7 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 	
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.is_can_tools,
+        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar,u.wx_avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.is_can_tools,u.openid,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
 		te.tenant_id, te.tenant_name, te.tenant_code, te.owner,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,
@@ -289,6 +291,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
  			<if test="remark != null">remark = #{remark},</if>
 			<if test="isCanTools!=null">is_can_tools=#{isCanTools},</if>
+			<if test="openid!=null">openid=#{openid},</if>
+			<if test="wxAvatar!=null">wx_avatar=#{wxAvatar},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}
@@ -305,7 +309,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<update id="resetUserPwd" parameterType="SysUser">
  		update sys_user set password = #{password} where user_name = #{userName}
 	</update>
-	
+	<update id="mobileLogout">
+		update sys_user
+		set openid = null
+		where openid = #{openid}
+	</update>
+
 	<delete id="deleteUserById" parameterType="Long">
  		update sys_user set del_flag = '2' where user_id = #{userId}
  	</delete>
@@ -375,5 +384,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectUserVo"/>
 		where phonenumber = #{phonenumber}
 	</select>
+	<select id="selectUserByOpenid" resultType="com.zkqy.common.core.domain.entity.SysUser">
+		<include refid="selectUserVo"/>
+		where openid = #{openid}
+	</select>
 
 </mapper>