Parcourir la source

微信二维码登陆

tudc il y a 4 ans
Parent
commit
fe2f5f6727

+ 64 - 7
tianhu-system/src/main/java/com/tianhu/system/controller/SysUserController.java

@@ -1,12 +1,14 @@
 package com.tianhu.system.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.tianhu.common.core.constant.CacheConstants;
+import com.tianhu.common.core.constant.Constants;
 import com.tianhu.common.core.constant.SalaryConstants;
 import com.tianhu.common.core.constant.UserConstants;
 import com.tianhu.common.core.domain.R;
 import com.tianhu.common.core.exception.BaseException;
 import com.tianhu.common.core.utils.CommonUtil;
-import com.tianhu.common.core.utils.DateUtils;
+import com.tianhu.common.core.utils.IdUtils;
 import com.tianhu.common.core.utils.SecurityUtils;
 import com.tianhu.common.core.utils.StringUtils;
 import com.tianhu.common.core.utils.poi.ExcelUtil;
@@ -14,6 +16,7 @@ import com.tianhu.common.core.web.controller.BaseController;
 import com.tianhu.common.core.web.domain.AjaxResult;
 import com.tianhu.common.log.annotation.Log;
 import com.tianhu.common.log.enums.BusinessType;
+import com.tianhu.common.redis.service.RedisService;
 import com.tianhu.common.security.annotation.PreAuthorize;
 import com.tianhu.common.security.service.TokenService;
 import com.tianhu.system.api.domain.SysDept;
@@ -29,10 +32,12 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -69,6 +74,10 @@ public class SysUserController extends BaseController
     private IPubVerifyCodeService iPubVerifyCodeService;
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private ISysWeChatService iSysWeChatService;
 
 
     //    下载模板
@@ -107,17 +116,18 @@ public class SysUserController extends BaseController
      * 获取当前用户信息
      */
     @PostMapping("/zcInfo")
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public R<Map<String, Object>> info(@RequestParam(value = "type", required = false) String type,
                                        @RequestParam(value = "code", required = false) String code,
+                                       @RequestParam(value = "unionId", required = false) String unionId,
                                        @RequestParam(value = "username") String username,
                                        @RequestParam(value = "shortMessageCode", required = false) String shortMessageCode)
     {
         Map<String, Object> resMap = new HashMap<>();
 
         SysUser sysUser = userService.selectUserByUserName(username);
-        // 短信验证码登陆
-        if ("1".equals(type)) {
+        // 短信验证码登陆 或者 验证码注册
+        if ("1".equals(type) || "2".equals(type)) {
             // 验证短信验证码
             if(CommonUtil.isNotEmpty(shortMessageCode)){
                 LambdaQueryWrapper<PubVerifyCode> pubVerifyCode = new LambdaQueryWrapper<>();
@@ -145,7 +155,40 @@ public class SysUserController extends BaseController
             }
 
             // 未注册账号,自动注册一个账号
-            if (StringUtils.isNull(sysUser)) {
+            if ("1".equals(type) && StringUtils.isNull(sysUser)) {
+                sysUser = new SysUser();
+                sysUser.setUserName(username);
+                sysUser.setNickName(username);
+                String password = configService.selectConfigByKey("sys.user.initPassword");
+                sysUser.setPassword(SecurityUtils.encryptPassword(password));
+                userService.insertUser(sysUser);
+                sysUser = userService.selectUserByUserName(username);
+
+                LoginUser sysUserVo = new LoginUser();
+                sysUserVo.setSysUser(sysUser);
+                resMap.put("code", "0");
+                resMap.put("message", "用户未绑定企业");
+                resMap.put("loginUser", sysUserVo);
+                return R.ok(resMap);
+            }
+
+            // 扫码后注册
+            if ("2".equals(type)) {
+                if (StringUtils.isNotNull(sysUser)) {
+                    return R.fail("手机号已被注册!");
+                }
+                if (StringUtils.isEmpty(unionId)) {
+                    return R.fail("unionId数据错误!");
+                }
+
+                //查询微信关联表找到员工信息
+                LambdaQueryWrapper<SysWeChat> weChatLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                weChatLambdaQueryWrapper.eq(SysWeChat::getSwcWxUuid, unionId);
+                List<SysWeChat> list = iSysWeChatService.findSysWeChats(weChatLambdaQueryWrapper);
+                if (list.size() != 0) {
+                    return R.fail("此微信已绑定账号!");
+                }
+
                 sysUser = new SysUser();
                 sysUser.setUserName(username);
                 sysUser.setNickName(username);
@@ -154,6 +197,14 @@ public class SysUserController extends BaseController
                 userService.insertUser(sysUser);
                 sysUser = userService.selectUserByUserName(username);
 
+                String  wechatId  =  IdUtils.fastSimpleUUID();
+                SysWeChat sysWeChat = new SysWeChat();
+                sysWeChat.setSwcId(wechatId);
+                sysWeChat.setSwcUserId(String.valueOf(sysUser.getUserId()));
+                sysWeChat.setSwcStatus("00");
+                sysWeChat.setSwcWxUuid(unionId);
+                iSysWeChatService.createSysWeChat(sysWeChat);
+
                 LoginUser sysUserVo = new LoginUser();
                 sysUserVo.setSysUser(sysUser);
                 resMap.put("code", "0");
@@ -161,6 +212,7 @@ public class SysUserController extends BaseController
                 resMap.put("loginUser", sysUserVo);
                 return R.ok(resMap);
             }
+
         // 密码登陆
         } else {
             if (StringUtils.isNull(sysUser))
@@ -237,9 +289,12 @@ public class SysUserController extends BaseController
     }
 
     @PostMapping("/chooseCompanyLogin")
-    @Transactional
-    public R<LoginUser> info(@RequestParam(value = "companyId") String companyId)
+    public R<LoginUser> chooseCompanyLogin(@RequestBody Map<String, String> param, HttpServletRequest request)
     {
+        String companyId = param.get("companyId");
+        if (StringUtils.isEmpty(companyId)) {
+            return R.fail("请选择登陆企业!");
+        }
         LoginUser loginUser = tokenService.getLoginUser();
         LambdaQueryWrapper<SysUserCompanyRel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(SysUserCompanyRel::getSucrUserId, loginUser.getUserid());
@@ -267,6 +322,8 @@ public class SysUserController extends BaseController
         loginUser.setPermissions(permissions);
         loginUser.setSysUser(sysUser);
 
+        String token = SecurityUtils.getToken(request);
+        redisService.setCacheObject(CacheConstants.LOGIN_TOKEN_KEY + token, loginUser, Constants.TOKEN_EXPIRE * 60, TimeUnit.SECONDS);
         return R.ok(loginUser);
     }
 

+ 104 - 73
tianhu-system/src/main/java/com/tianhu/system/controller/WxApiController.java

@@ -1,20 +1,17 @@
 package com.tianhu.system.controller;
 
 import com.alibaba.fastjson.JSONObject;
-import com.tianhu.common.core.constant.Constants;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.tianhu.common.core.domain.R;
-import com.tianhu.common.core.enums.UserStatus;
 import com.tianhu.common.core.utils.StringUtils;
 import com.tianhu.common.security.service.TokenService;
-import com.tianhu.system.api.RemoteLogService;
+import com.tianhu.system.api.domain.SysDept;
 import com.tianhu.system.api.domain.SysUser;
 import com.tianhu.system.api.model.LoginUser;
 import com.tianhu.system.domain.SysCompany;
+import com.tianhu.system.domain.SysUserCompanyRel;
 import com.tianhu.system.domain.SysWeChat;
-import com.tianhu.system.service.IOwnSysUserService;
-import com.tianhu.system.service.ISysCompanyService;
-import com.tianhu.system.service.ISysPermissionService;
-import com.tianhu.system.service.ISysWeChatService;
+import com.tianhu.system.service.*;
 import com.tianhu.system.utils.HttpUtil;
 import com.tianhu.system.utils.SysConstant;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,9 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 微信扫码登录
@@ -66,22 +61,22 @@ public class WxApiController {
     private TokenService tokenService;
 
     @Autowired
-    private IOwnSysUserService iOwnSysUserService;
-
-    @Autowired
     private ISysPermissionService permissionService;
 
     @Autowired
-    private RemoteLogService remoteLogService;
-
+    private ISysUserService userService;
     @Autowired
-    private ISysCompanyService iSysCompanyService;
+    private ISysUserCompanyRelService userCompanyRelService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private ISysCompanyService companyService;
 
     /**
      * 获取二维码
      */
     @GetMapping("/login")
-    public String qrCode(@RequestParam String state) throws UnsupportedEncodingException {
+    public String qrCode() throws UnsupportedEncodingException {
         //%s表示占位符,需要我们设定值,其他则是固定式
         String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                 "?appid=%s" +
@@ -95,7 +90,7 @@ public class WxApiController {
         //自己设置的
 //        String state = "http://tianhu.adm.minpay.cc";
         //给上面路径中的%s占位符赋值
-        String retUrl = String.format(baseUrl, WEB_APP_ID, redirectUrl, state);
+        String retUrl = String.format(baseUrl, WEB_APP_ID, redirectUrl, "00");
         //将结果返回,就可以生成二维码
         return retUrl;
     }
@@ -104,9 +99,9 @@ public class WxApiController {
      * code回调
      */
     @GetMapping("/callback")
-    public R callback(@RequestParam String code, @RequestParam String hostname) throws Exception {
+    public R callback(@RequestParam String code) throws Exception {
         //向认证服务器发送请求换取access_token和open_id
-        /*String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
+        String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                 "?appid=%s" +
                 "&secret=%s" +
                 "&code=%s" +
@@ -119,68 +114,104 @@ public class WxApiController {
         JSONObject obj = JSONObject.parseObject(retUrl);
         //判断是否有unionid
         Object unionId = obj.get("unionid");
+
+        Map<String, Object> resMap = new HashMap<>();
+        resMap.put("unionId", unionId);
         if (unionId != null) {
-            SysWeChat sysWeChat = new SysWeChat();
-            sysWeChat.setSwcWxUuid(obj.getString("unionid"));
             //查询微信关联表找到员工信息
-            List<SysWeChat> list = iSysWeChatService.selectSysWeChatList(sysWeChat);
+            LambdaQueryWrapper<SysWeChat> weChatLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            weChatLambdaQueryWrapper.eq(SysWeChat::getSwcWxUuid, unionId);
+            List<SysWeChat> list = iSysWeChatService.findSysWeChats(weChatLambdaQueryWrapper);
+            // 已扫码
             if (list.size() == 1) {
-                //员工id
-                String staffCode = list.get(0).getSwcUserId();
-                //获取当前操作人员
-                LoginUser userInfo = tokenService.getLoginUser();
-                String companyId = userInfo.getSysUser().getCompanyId();
-                SysCompany company = iSysCompanyService.getById(companyId);
-                if (StringUtils.isNull(company)){
-                    return R.fail("企业不存在");
-                }else{
-                    //停用提示异常
-                    if("01".equals(company.getScyStatus())){
-                        return R.fail("企业状态异常,登录失败");
-                    //删除重新绑定
-                    }else if("99".equals(company.getScyStatus())){
-                        return R.fail("未绑定登录用户,请关注公众号绑定用户");
+                // 判断是否绑定登陆用户
+                SysWeChat weChat = list.get(0);
+                // 已绑定用户
+                if (StringUtils.isNotEmpty(weChat.getSwcUserId())) {
+                    SysUser sysUser = userService.selectUserById(Long.parseLong(weChat.getSwcUserId()));
+                    // 查询是否实名认证
+                    LambdaQueryWrapper<SysUserCompanyRel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                    lambdaQueryWrapper.eq(SysUserCompanyRel::getSucrUserId, sysUser.getUserId());
+                    List<SysUserCompanyRel> userCompanyRelList = userCompanyRelService.findSysUserCompanyRels(lambdaQueryWrapper);
+
+                    // 未认证
+                    if (userCompanyRelList.size() == 0) {
+                        resMap.put("code", "0");
+                        resMap.put("message", "用户未绑定企业");
+                        LoginUser sysUserVo = new LoginUser();
+                        sysUserVo.setSysUser(sysUser);
+                        resMap.put("loginUser", sysUserVo);
+                        tokenService.createToken(sysUserVo);
+                        // 只绑定了一家企业
+                    } else if (userCompanyRelList.size() == 1) {
+                        resMap.put("code", "1");
+                        resMap.put("message", "用户已绑定一家企业");
+
+                        // 绑定企业
+                        sysUser.setCompanyId(userCompanyRelList.get(0).getSucrCompanyId());
+                        // 不是平台
+                        if(!SysConstant.PLATFORM_NO.equals(sysUser.getCompanyId()) ){
+                            // 绑定部门
+                            sysUser.setDeptId(userCompanyRelList.get(0).getSucrDeptId());
+                            SysDept dept = deptService.selectDeptById(userCompanyRelList.get(0).getSucrDeptId());
+                            sysUser.setDept(dept);
+                            // 存放企业类型
+                            SysCompany company = companyService.getById(userCompanyRelList.get(0).getSucrCompanyId());
+                            sysUser.setCompanyType(company.getScyType());
+                            if ("01".equals(company.getScyStatus()) || "99".equals(company.getScyStatus())) {
+                                return R.fail("企业状态异常,请联系管理员!");
+                            }
+                            sysUser.setCompanyStatus(company.getScyStatus());
+                            // 平台用户
+                        } else {
+                            sysUser.setCompanyType("00");
+                            sysUser.setCompanyStatus("00");
+                        }
+                        // 角色集合
+                        Set<String> roles = permissionService.getRolePermission(sysUser.getUserId(), sysUser.getCompanyId());
+                        Set<String> permissions = this.getPermissions(sysUser);
+
+                        LoginUser sysUserVo = new LoginUser();
+                        sysUserVo.setRoles(roles);
+                        sysUserVo.setPermissions(permissions);
+                        sysUserVo.setSysUser(sysUser);
+
+                        resMap.put("loginUser", sysUserVo);
+                        tokenService.createToken(sysUserVo);
+                        // 绑定多加企业
+                    } else {
+                        LoginUser sysUserVo = new LoginUser();
+                        sysUserVo.setSysUser(sysUser);
+                        resMap.put("loginUser", sysUserVo);
+                        tokenService.createToken(sysUserVo);
+
+                        List<String> companyIdList = new ArrayList<>();
+                        for (SysUserCompanyRel companyRel : userCompanyRelList) {
+                            companyIdList.add(companyRel.getSucrCompanyId());
+                        }
+                        LambdaQueryWrapper<SysCompany> companyLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                        companyLambdaQueryWrapper.in(SysCompany::getScyId, companyIdList);
+                        List<SysCompany> companyList = companyService.findSysCompanys(companyLambdaQueryWrapper);
+
+                        resMap.put("code", "2");
+                        resMap.put("message", "用户已绑定" + userCompanyRelList.size() + "家企业");
+                        resMap.put("companyList", companyList);
                     }
+                    return R.ok(resMap);
+                // 未绑定用户
+                } else {
+                    resMap.put("code", "3");
+                    return R.ok(resMap);
                 }
-                // 查询用户信息
-                SysUser sysUser = iOwnSysUserService.selectUserByStaff(staffCode);
-                //没有登录用户
-                if (StringUtils.isNull(sysUser)) {
-                    return R.fail("未绑定登录用户,请关注公众号绑定用户");
-                }
-                if (!companyId.equals(sysUser.getCompanyId()))
-                {
-                    return R.fail("未绑定登录用户,请关注公众号绑定用户");
-                }
-                if (UserStatus.DELETED.getCode().equals(sysUser.getDelFlag()))
-                {
-                    return R.fail("未绑定登录用户,请关注公众号绑定用户");
-                }
-                if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus()))
-                {
-                    return R.fail("用户状态异常,登录失败");
-                }
-                remoteLogService.saveLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功", companyId);
-                // 角色集合
-                Set<String> roles = permissionService.getRolePermission(sysUser.getUserId());
-                //权限集合
-                Set<String> permissions = this.getPermissions(sysUser);
-                //创建登录用户
-                LoginUser sysUserVo = new LoginUser();
-                sysUserVo.setSysUser(sysUser);
-                sysUserVo.setRoles(roles);
-                sysUserVo.setPermissions(permissions);
-                //返回登录用户信息
-                return R.ok(tokenService.createToken(sysUserVo));
+            // 未绑定用户
             } else {
-                //没有员工信息或有多个员工信息
-                return R.fail("未绑定登录用户,请关注公众号绑定用户");
+                resMap.put("code", "3");
+                return R.ok(resMap);
             }
         } else {
             //没有unionid
-            return R.fail("未绑定登录用户,请关注公众号绑定用户");
-        }*/
-        return R.ok();
+            return R.fail("用户信息获取失败");
+        }
     }
 
     /**

+ 68 - 159
tianhu-system/src/main/java/com/tianhu/system/domain/SysWeChat.java

@@ -1,180 +1,89 @@
 package com.tianhu.system.domain;
 
-import com.tianhu.common.core.annotation.Excel;
-import com.tianhu.common.core.web.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 
 /**
- * 微信关联信息 对象 sys_we_chat
+ * <p>
+ * 微信关联信息表 
+ * </p>
  *
- * @author huyi
- * @date 2021-05-28
+ * @author cuixq
+ * @since 2021-08-23
  */
-public class SysWeChat extends BaseEntity
-{
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_we_chat")
+public class SysWeChat implements Serializable {
+
     private static final long serialVersionUID = 1L;
 
-    /** 主键 */
+    /**
+     * 主键
+     */
+    @TableId("swc_id")
     private String swcId;
 
-    /** 微信OPENID */
-    private String swcOpenid;
-
-    /** 公司ID */
-    @Excel(name = "公司ID")
-    private String swcCompanyId;
-
-    /** 绑定员工id */
-    @Excel(name = "绑定员工id")
+    /**
+     * 绑定员工id
+     */
+    @TableField("swc_user_id")
     private String swcUserId;
 
-    /** 绑定员工名称 */
-    @Excel(name = "绑定员工名称")
-    private String swcUserName;
-
-    /** 微信MINOPENID */
-    @Excel(name = "微信MINOPENID")
-    private String swcWxMinopenid;
-
-    /** 微信UUID */
-    @Excel(name = "微信UUID")
+    /**
+     * 微信UUID
+     */
+    @TableField("swc_wx_uuid")
     private String swcWxUuid;
 
-    /** 用户手机号 */
-    @Excel(name = "用户手机号")
+    /**
+     * 用户手机号
+     */
+    @TableField("swc_phone")
     private String swcPhone;
 
-    /** 用户头像 */
-    @Excel(name = "用户头像")
+    /**
+     * 用户头像
+     */
+    @TableField("swc_headpath")
     private String swcHeadpath;
 
-    /** 状态:00正常、01冻结 */
-    @Excel(name = "状态:00正常、01冻结")
+    /**
+     * 创建者
+     */
+    @TableField("create_by")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @TableField("update_by")
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 状态:00正常、01冻结
+     */
+    @TableField("swc_status")
     private String swcStatus;
 
-    /** 微信名称 */
-    @Excel(name = "微信名称")
-    private String swcWxName;
-
-    public void setSwcId(String swcId)
-    {
-        this.swcId = swcId;
-    }
-
-    public String getSwcId()
-    {
-        return swcId;
-    }
-    public void setSwcOpenid(String swcOpenid)
-    {
-        this.swcOpenid = swcOpenid;
-    }
-
-    public String getSwcOpenid()
-    {
-        return swcOpenid;
-    }
-    public void setSwcCompanyId(String swcCompanyId)
-    {
-        this.swcCompanyId = swcCompanyId;
-    }
-
-    public String getSwcCompanyId()
-    {
-        return swcCompanyId;
-    }
-    public void setSwcUserId(String swcUserId)
-    {
-        this.swcUserId = swcUserId;
-    }
-
-    public String getSwcUserId()
-    {
-        return swcUserId;
-    }
-    public void setSwcUserName(String swcUserName)
-    {
-        this.swcUserName = swcUserName;
-    }
-
-    public String getSwcUserName()
-    {
-        return swcUserName;
-    }
-    public void setSwcWxMinopenid(String swcWxMinopenid)
-    {
-        this.swcWxMinopenid = swcWxMinopenid;
-    }
-
-    public String getSwcWxMinopenid()
-    {
-        return swcWxMinopenid;
-    }
-    public void setSwcWxUuid(String swcWxUuid)
-    {
-        this.swcWxUuid = swcWxUuid;
-    }
-
-    public String getSwcWxUuid()
-    {
-        return swcWxUuid;
-    }
-    public void setSwcPhone(String swcPhone)
-    {
-        this.swcPhone = swcPhone;
-    }
-
-    public String getSwcPhone()
-    {
-        return swcPhone;
-    }
-    public void setSwcHeadpath(String swcHeadpath)
-    {
-        this.swcHeadpath = swcHeadpath;
-    }
-
-    public String getSwcHeadpath()
-    {
-        return swcHeadpath;
-    }
-    public void setSwcStatus(String swcStatus)
-    {
-        this.swcStatus = swcStatus;
-    }
-
-    public String getSwcStatus()
-    {
-        return swcStatus;
-    }
-    public void setSwcWxName(String swcWxName)
-    {
-        this.swcWxName = swcWxName;
-    }
-
-    public String getSwcWxName()
-    {
-        return swcWxName;
-    }
 
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-                .append("swcId", getSwcId())
-                .append("swcOpenid", getSwcOpenid())
-                .append("swcCompanyId", getSwcCompanyId())
-                .append("swcUserId", getSwcUserId())
-                .append("swcUserName", getSwcUserName())
-                .append("swcWxMinopenid", getSwcWxMinopenid())
-                .append("swcWxUuid", getSwcWxUuid())
-                .append("swcPhone", getSwcPhone())
-                .append("swcHeadpath", getSwcHeadpath())
-                .append("createBy", getCreateBy())
-                .append("createTime", getCreateTime())
-                .append("updateBy", getUpdateBy())
-                .append("updateTime", getUpdateTime())
-                .append("swcStatus", getSwcStatus())
-                .append("swcWxName", getSwcWxName())
-                .toString();
-    }
-}
+}

+ 8 - 53
tianhu-system/src/main/java/com/tianhu/system/mapper/SysWeChatMapper.java

@@ -1,61 +1,16 @@
 package com.tianhu.system.mapper;
 
-import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.tianhu.system.domain.SysWeChat;
 
 /**
- * 微信关联信息 Mapper接口
+ * <p>
+ * 微信关联信息表  Mapper 接口
+ * </p>
  *
- * @author huyi
- * @date 2021-05-28
+ * @author cuixq
+ * @since 2021-08-23
  */
-public interface SysWeChatMapper
-{
-    /**
-     * 查询微信关联信息
-     *
-     * @param swcId 微信关联信息 ID
-     * @return 微信关联信息
-     */
-    public SysWeChat selectSysWeChatById(String swcId);
+public interface SysWeChatMapper extends BaseMapper<SysWeChat> {
 
-    /**
-     * 查询微信关联信息 列表
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 微信关联信息 集合
-     */
-    public List<SysWeChat> selectSysWeChatList(SysWeChat sysWeChat);
-
-    /**
-     * 新增微信关联信息
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
-     */
-    public int insertSysWeChat(SysWeChat sysWeChat);
-
-    /**
-     * 修改微信关联信息
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
-     */
-    public int updateSysWeChat(SysWeChat sysWeChat);
-
-    /**
-     * 删除微信关联信息
-     *
-     * @param swcId 微信关联信息 ID
-     * @return 结果
-     */
-    public int deleteSysWeChatById(String swcId);
-
-    /**
-     * 批量删除微信关联信息
-     *
-     * @param swcIds 需要删除的数据ID
-     * @return 结果
-     */
-    public int deleteSysWeChatByIds(String[] swcIds);
-}
+}

+ 33 - 35
tianhu-system/src/main/java/com/tianhu/system/service/ISysWeChatService.java

@@ -1,61 +1,59 @@
 package com.tianhu.system.service;
 
-import java.util.List;
+
+import com.keao.tianhu.starter.mybatis.plus.entity.QueryRequest;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.tianhu.system.domain.SysWeChat;
 
+
+import java.util.List;
+
 /**
- * 微信关联信息 Service接口
+ * ClassName: ISysWeChatService<br>
+ * Description: SysWeChatService接口 <br>
+ * Company: keao
  *
- * @author huyi
- * @date 2021-05-28
+ * @author cuixq
+ * @version v1.0.0    2021-08-23  cuixq    由Generator自动创建
  */
-public interface ISysWeChatService
-{
-    /**
-     * 查询微信关联信息
-     *
-     * @param swcId 微信关联信息 ID
-     * @return 微信关联信息
-     */
-    public SysWeChat selectSysWeChatById(String swcId);
-
+public interface ISysWeChatService extends IService<SysWeChat> {
     /**
-     * 查询微信关联信息 列表
+     * 查询(分页)
      *
-     * @param sysWeChat 微信关联信息
-     * @return 微信关联信息 集合
+     * @param request QueryRequest
+     * @param wrapper LambdaQueryWrapper<SysWeChat>
+     * @return IPage<SysWeChat>
      */
-    public List<SysWeChat> selectSysWeChatList(SysWeChat sysWeChat);
+    IPage<SysWeChat> findSysWeChats(QueryRequest request, LambdaQueryWrapper<SysWeChat> wrapper);
 
     /**
-     * 新增微信关联信息
+     * 查询(所有)
      *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
+     * @param wrapper LambdaQueryWrapper<SysWeChat>
+     * @return List<SysWeChat>
      */
-    public int insertSysWeChat(SysWeChat sysWeChat);
+    List<SysWeChat> findSysWeChats(LambdaQueryWrapper<SysWeChat> wrapper);
 
     /**
-     * 修改微信关联信息
+     * 新增
      *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
+     * @param sysWeChat sysWeChat
      */
-    public int updateSysWeChat(SysWeChat sysWeChat);
+    void createSysWeChat(SysWeChat sysWeChat);
 
     /**
-     * 批量删除微信关联信息
+     * 修改
      *
-     * @param swcIds 需要删除的微信关联信息 ID
-     * @return 结果
+     * @param sysWeChat sysWeChat
      */
-    public int deleteSysWeChatByIds(String[] swcIds);
+    void updateSysWeChat(SysWeChat sysWeChat);
 
     /**
-     * 删除微信关联信息 信息
+     * 删除
      *
-     * @param swcId 微信关联信息 ID
-     * @return 结果
+     * @param wrapper LambdaQueryWrapper<SysWeChat>
      */
-    public int deleteSysWeChatById(String swcId);
-}
+    void deleteSysWeChat(LambdaQueryWrapper<SysWeChat> wrapper);
+}

+ 39 - 71
tianhu-system/src/main/java/com/tianhu/system/service/impl/SysWeChatServiceImpl.java

@@ -1,96 +1,64 @@
 package com.tianhu.system.service.impl;
 
-import java.util.List;
-import com.tianhu.common.core.utils.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.tianhu.system.mapper.SysWeChatMapper;
 import com.tianhu.system.domain.SysWeChat;
+import com.tianhu.system.mapper.SysWeChatMapper;
 import com.tianhu.system.service.ISysWeChatService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.keao.tianhu.starter.mybatis.plus.entity.QueryRequest;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+
+
+import java.util.List;
 
 /**
- * 微信关联信息 Service业务层处理
+ * ClassName: SysWeChatServiceImpl<br>
+ * Description: ISysWeChatService实现 <br>
+ * Company: keao
  *
- * @author huyi
- * @date 2021-05-28
+ * @author cuixq
+ * @version v1.0.0    2021-08-23  cuixq    由Generator自动创建
  */
 @Service
-public class SysWeChatServiceImpl implements ISysWeChatService
-{
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
+public class SysWeChatServiceImpl extends ServiceImpl<SysWeChatMapper, SysWeChat> implements ISysWeChatService {
+
     @Autowired
     private SysWeChatMapper sysWeChatMapper;
 
-    /**
-     * 查询微信关联信息
-     *
-     * @param swcId 微信关联信息 ID
-     * @return 微信关联信息
-     */
     @Override
-    public SysWeChat selectSysWeChatById(String swcId)
-    {
-        return sysWeChatMapper.selectSysWeChatById(swcId);
+    public IPage<SysWeChat> findSysWeChats(QueryRequest request, LambdaQueryWrapper<SysWeChat> wrapper) {
+        Page<SysWeChat> page = new Page<>(request.getPageNum(), request.getPageSize());
+        return this.page(page, wrapper);
     }
 
-    /**
-     * 查询微信关联信息 列表
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 微信关联信息
-     */
     @Override
-    public List<SysWeChat> selectSysWeChatList(SysWeChat sysWeChat)
-    {
-        return sysWeChatMapper.selectSysWeChatList(sysWeChat);
+    public List<SysWeChat> findSysWeChats(LambdaQueryWrapper<SysWeChat> wrapper) {
+		return this.list(wrapper);
     }
 
-    /**
-     * 新增微信关联信息
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
-     */
     @Override
-    public int insertSysWeChat(SysWeChat sysWeChat)
-    {
-        sysWeChat.setCreateTime(DateUtils.getNowDate());
-        return sysWeChatMapper.insertSysWeChat(sysWeChat);
+    @Transactional(rollbackFor = Exception.class)
+    public void createSysWeChat(SysWeChat sysWeChat) {
+        this.save(sysWeChat);
     }
 
-    /**
-     * 修改微信关联信息
-     *
-     * @param sysWeChat 微信关联信息
-     * @return 结果
-     */
     @Override
-    public int updateSysWeChat(SysWeChat sysWeChat)
-    {
-        sysWeChat.setUpdateTime(DateUtils.getNowDate());
-        return sysWeChatMapper.updateSysWeChat(sysWeChat);
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSysWeChat(SysWeChat sysWeChat) {
+        this.saveOrUpdate(sysWeChat);
     }
 
-    /**
-     * 批量删除微信关联信息
-     *
-     * @param swcIds 需要删除的微信关联信息 ID
-     * @return 结果
-     */
     @Override
-    public int deleteSysWeChatByIds(String[] swcIds)
-    {
-        return sysWeChatMapper.deleteSysWeChatByIds(swcIds);
-    }
-
-    /**
-     * 删除微信关联信息 信息
-     *
-     * @param swcId 微信关联信息 ID
-     * @return 结果
-     */
-    @Override
-    public int deleteSysWeChatById(String swcId)
-    {
-        return sysWeChatMapper.deleteSysWeChatById(swcId);
-    }
-}
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteSysWeChat(LambdaQueryWrapper<SysWeChat> wrapper) {
+	    this.remove(wrapper);
+	}
+}

+ 0 - 175
tianhu-system/src/main/java/com/tianhu/system/utils/DdApiUtils.java

@@ -1,175 +0,0 @@
-package com.tianhu.system.utils;
-
-import com.dingtalk.api.DefaultDingTalkClient;
-import com.dingtalk.api.DingTalkClient;
-import com.dingtalk.api.request.OapiGettokenRequest;
-import com.dingtalk.api.request.OapiV2UserGetRequest;
-import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
-import com.dingtalk.api.response.OapiGettokenResponse;
-import com.dingtalk.api.response.OapiV2UserGetResponse;
-import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
-import com.tianhu.common.core.domain.R;
-import com.taobao.api.ApiException;
-import com.tianhu.common.core.exception.BaseException;
-import com.tianhu.common.core.utils.CommonUtil;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 钉钉免登录工具类
- *
- * @author dudm@minpay.cc
- * @date 2021-07-06
- */
-public class DdApiUtils {
-
-    /**
-     * 钉钉微应用appKey
-     */
-    private static String DD_APP_KEY = "dingzsrp6tjsroooaih6";
-
-    /**
-     * 钉钉微应用appSecret
-     */
-    private static String DD_APP_SECRET = "jjpDc786GFQ6OWXulDZUwuIydJvrc2PIl3NtdIpbqZNkcKeHDQGIkxOrAJ5JfWGU";
-
-    /**
-     * 获取企业应用凭证 url
-     */
-    private static String GET_TOKEN_URL = "https://oapi.dingtalk.com/gettoken";
-
-    /**
-     * 获取钉钉userId url
-     */
-    private static String GET_USERID_URL = "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo";
-
-    /**
-     * 获取用户信息 url
-     */
-    private static String GET_USERINFO_URL = "https://oapi.dingtalk.com/topapi/v2/user/get";
-
-    /**
-     * 请求类型 get
-     */
-    private static String METHOD_GET = "GET";
-
-    /**
-     * 钉钉access_token缓存key
-     */
-    private static String DD_ACCESS_TOKEN = "dd_access_token";
-
-    /**
-     * 状态值 0:正常
-     */
-    private static String STATE_VALUE = "0";
-
-    /**
-     * 钉钉mobile参数
-     */
-    private static String MOBILE = "mobile";
-
-    /**
-     * 钉钉name参数
-     */
-    private static String NAME = "name";
-
-    /**
-     * 获取企业凭证access_token
-     *
-     * @param
-     * @return
-     */
-    public static String getToken() {
-        //获取缓存token
-        String token = DictUtils.getCache(DD_ACCESS_TOKEN);
-        if(!CommonUtil.isEmpty(token)){
-            return token;
-        }
-        //缓存中获取不到调用api
-        try {
-            DingTalkClient client = new DefaultDingTalkClient(GET_TOKEN_URL);
-            OapiGettokenRequest req = new OapiGettokenRequest();
-            req.setAppkey(DD_APP_KEY);
-            req.setAppsecret(DD_APP_SECRET);
-            req.setHttpMethod(METHOD_GET);
-            OapiGettokenResponse rsp = client.execute(req);
-            System.out.println("获取钉钉access_token返回:" + rsp.getBody());
-            //判断api获取是否正常
-            if(!STATE_VALUE.equals(CommonUtil.objToString(rsp.getErrcode()))){
-                //钉钉返回错误信息
-                throw new BaseException(CommonUtil.objToString(rsp.getErrmsg()));
-            }
-            //通过api获取到的access_token
-            token = rsp.getAccessToken();
-            //超时时间
-            Long time = rsp.getExpiresIn();
-            //缓存access_token
-            DictUtils.setCache(DD_ACCESS_TOKEN, token, time, TimeUnit.SECONDS);
-            return token;
-        } catch (ApiException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    /**
-     * 获取钉钉userId
-     *
-     * @param code   钉钉授权码
-     * @param token  企业凭证access_token
-     * @return
-     */
-    public static String getUserId(String code, String token) {
-        try {
-            DingTalkClient client = new DefaultDingTalkClient(GET_USERID_URL);
-            OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
-            req.setCode(code);
-            OapiV2UserGetuserinfoResponse rsp = client.execute(req, token);
-            System.out.println("获取钉钉userId返回:" + rsp.getBody());
-            //判断api获取是否正常
-            if(!STATE_VALUE.equals(CommonUtil.objToString(rsp.getErrcode()))){
-                //钉钉返回错误信息
-                throw new BaseException(CommonUtil.objToString(rsp.getErrmsg()));
-            }
-            //钉钉userId
-            String userId = rsp.getResult().getUserid();
-            return userId;
-        } catch (ApiException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    /**
-     * 获取用户详细信息
-     *
-     * @param userId   钉钉userId
-     * @param token    企业凭证access_token
-     * @return
-     */
-    public static R getUserInfo(String userId, String token) {
-        try {
-            DingTalkClient client = new DefaultDingTalkClient(GET_USERINFO_URL);
-            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
-            req.setUserid(userId);
-            OapiV2UserGetResponse rsp = client.execute(req, token);
-            System.out.println("获取钉钉用户详情返回:" + rsp.getBody());
-            //判断api获取是否正常
-            if(!STATE_VALUE.equals(CommonUtil.objToString(rsp.getErrcode()))){
-                //钉钉返回错误信息
-                throw new BaseException(CommonUtil.objToString(rsp.getErrmsg()));
-            }
-            String mobile = rsp.getResult().getMobile();
-            String name = rsp.getResult().getName();
-            Map<String, Object> map = new HashMap();
-            map.put(NAME,name);
-            map.put(MOBILE,mobile);
-            return R.ok(map);
-        } catch (ApiException e) {
-            e.printStackTrace();
-            return R.ok();
-        }
-    }
-}

+ 15 - 115
tianhu-system/src/main/resources/mapper/system/SysWeChatMapper.xml

@@ -1,119 +1,19 @@
-<?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">
+<?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.tianhu.system.mapper.SysWeChatMapper">
 
-    <resultMap type="SysWeChat" id="SysWeChatResult">
-        <result property="swcId"    column="swc_id"    />
-        <result property="swcOpenid"    column="swc_openid"    />
-        <result property="swcCompanyId"    column="swc_company_id"    />
-        <result property="swcUserId"    column="swc_user_id"    />
-        <result property="swcUserName"    column="swc_user_name"    />
-        <result property="swcWxMinopenid"    column="swc_wx_minopenid"    />
-        <result property="swcWxUuid"    column="swc_wx_uuid"    />
-        <result property="swcPhone"    column="swc_phone"    />
-        <result property="swcHeadpath"    column="swc_headpath"    />
-        <result property="createBy"    column="create_by"    />
-        <result property="createTime"    column="create_time"    />
-        <result property="updateBy"    column="update_by"    />
-        <result property="updateTime"    column="update_time"    />
-        <result property="swcStatus"    column="swc_status"    />
-        <result property="swcWxName"    column="swc_wx_name"    />
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.tianhu.system.domain.SysWeChat">
+        <id column="swc_id" property="swcId" />
+        <result column="swc_user_id" property="swcUserId" />
+        <result column="swc_wx_uuid" property="swcWxUuid" />
+        <result column="swc_phone" property="swcPhone" />
+        <result column="swc_headpath" property="swcHeadpath" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="swc_status" property="swcStatus" />
     </resultMap>
 
-    <sql id="selectSysWeChatVo">
-        select swc_id, swc_openid, swc_company_id, swc_user_id, swc_user_name, swc_wx_minopenid, swc_wx_uuid, swc_phone, swc_headpath, create_by, create_time, update_by, update_time, swc_status, swc_wx_name from sys_we_chat
-    </sql>
-
-    <select id="selectSysWeChatList" parameterType="SysWeChat" resultMap="SysWeChatResult">
-        <include refid="selectSysWeChatVo"/>
-        <where>
-            <if test="swcCompanyId != null  and swcCompanyId != ''"> and swc_company_id = #{swcCompanyId}</if>
-            <if test="swcUserId != null  and swcUserId != ''"> and swc_user_id = #{swcUserId}</if>
-            <if test="swcUserName != null  and swcUserName != ''"> and swc_user_name like concat('%', #{swcUserName}, '%')</if>
-            <if test="swcWxMinopenid != null  and swcWxMinopenid != ''"> and swc_wx_minopenid = #{swcWxMinopenid}</if>
-            <if test="swcWxUuid != null  and swcWxUuid != ''"> and swc_wx_uuid = #{swcWxUuid}</if>
-            <if test="swcPhone != null  and swcPhone != ''"> and swc_phone = #{swcPhone}</if>
-            <if test="swcHeadpath != null  and swcHeadpath != ''"> and swc_headpath = #{swcHeadpath}</if>
-            <if test="swcStatus != null  and swcStatus != ''"> and swc_status = #{swcStatus}</if>
-            <if test="swcWxName != null  and swcWxName != ''"> and swc_wx_name like concat('%', #{swcWxName}, '%')</if>
-        </where>
-    </select>
-
-    <select id="selectSysWeChatById" parameterType="String" resultMap="SysWeChatResult">
-        <include refid="selectSysWeChatVo"/>
-        where swc_id = #{swcId}
-    </select>
-
-    <insert id="insertSysWeChat" parameterType="SysWeChat">
-        insert into sys_we_chat
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="swcId != null">swc_id,</if>
-            <if test="swcOpenid != null">swc_openid,</if>
-            <if test="swcCompanyId != null">swc_company_id,</if>
-            <if test="swcUserId != null">swc_user_id,</if>
-            <if test="swcUserName != null">swc_user_name,</if>
-            <if test="swcWxMinopenid != null">swc_wx_minopenid,</if>
-            <if test="swcWxUuid != null">swc_wx_uuid,</if>
-            <if test="swcPhone != null">swc_phone,</if>
-            <if test="swcHeadpath != null">swc_headpath,</if>
-            <if test="createBy != null">create_by,</if>
-            <if test="createTime != null">create_time,</if>
-            <if test="updateBy != null">update_by,</if>
-            <if test="updateTime != null">update_time,</if>
-            <if test="swcStatus != null">swc_status,</if>
-            <if test="swcWxName != null">swc_wx_name,</if>
-        </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="swcId != null">#{swcId},</if>
-            <if test="swcOpenid != null">#{swcOpenid},</if>
-            <if test="swcCompanyId != null">#{swcCompanyId},</if>
-            <if test="swcUserId != null">#{swcUserId},</if>
-            <if test="swcUserName != null">#{swcUserName},</if>
-            <if test="swcWxMinopenid != null">#{swcWxMinopenid},</if>
-            <if test="swcWxUuid != null">#{swcWxUuid},</if>
-            <if test="swcPhone != null">#{swcPhone},</if>
-            <if test="swcHeadpath != null">#{swcHeadpath},</if>
-            <if test="createBy != null">#{createBy},</if>
-            <if test="createTime != null">#{createTime},</if>
-            <if test="updateBy != null">#{updateBy},</if>
-            <if test="updateTime != null">#{updateTime},</if>
-            <if test="swcStatus != null">#{swcStatus},</if>
-            <if test="swcWxName != null">#{swcWxName},</if>
-        </trim>
-    </insert>
-
-    <update id="updateSysWeChat" parameterType="SysWeChat">
-        update sys_we_chat
-        <trim prefix="SET" suffixOverrides=",">
-            <if test="swcOpenid != null">swc_openid = #{swcOpenid},</if>
-            <if test="swcCompanyId != null">swc_company_id = #{swcCompanyId},</if>
-            <if test="swcUserId != null">swc_user_id = #{swcUserId},</if>
-            <if test="swcUserName != null">swc_user_name = #{swcUserName},</if>
-            <if test="swcWxMinopenid != null">swc_wx_minopenid = #{swcWxMinopenid},</if>
-            <if test="swcWxUuid != null">swc_wx_uuid = #{swcWxUuid},</if>
-            <if test="swcPhone != null">swc_phone = #{swcPhone},</if>
-            <if test="swcHeadpath != null">swc_headpath = #{swcHeadpath},</if>
-            <if test="createBy != null">create_by = #{createBy},</if>
-            <if test="createTime != null">create_time = #{createTime},</if>
-            <if test="updateBy != null">update_by = #{updateBy},</if>
-            <if test="updateTime != null">update_time = #{updateTime},</if>
-            <if test="swcStatus != null">swc_status = #{swcStatus},</if>
-            <if test="swcWxName != null">swc_wx_name = #{swcWxName},</if>
-        </trim>
-        where swc_id = #{swcId}
-    </update>
-
-    <delete id="deleteSysWeChatById" parameterType="String">
-        delete from sys_we_chat where swc_id = #{swcId}
-    </delete>
-
-    <delete id="deleteSysWeChatByIds" parameterType="String">
-        delete from sys_we_chat where swc_id in
-        <foreach item="swcId" collection="array" open="(" separator="," close=")">
-            #{swcId}
-        </foreach>
-    </delete>
-
-</mapper>
+</mapper>