瀏覽代碼

益寿缘-在其他地方注册或绑定销售

三七 12 小時之前
父節點
當前提交
4bb675dd42

+ 60 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -2,6 +2,7 @@ package com.fs.company.controller.company;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
+import com.baidu.dev2.thirdparty.jackson.databind.ObjectMapper;
 import com.fs.common.annotation.Log;
 import com.fs.common.constant.UserConstants;
 import com.fs.common.core.controller.BaseController;
@@ -17,6 +18,7 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.CompanyUserDelayTimeMapper;
 import com.fs.company.param.CompanyUserAreaParam;
+import com.fs.company.param.CompanyUserCodeParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.service.*;
 import com.fs.company.utils.DomainUtil;
@@ -26,7 +28,10 @@ import com.fs.course.config.CourseConfig;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
+import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
+import com.fs.qw.domain.QwCompany;
+import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
 import com.fs.system.service.ISysConfigService;
@@ -40,6 +45,8 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -73,6 +80,12 @@ public class CompanyUserController extends BaseController
     private ISysConfigService configService;
     @Autowired
     private RedisCache redisCache;
+
+    @Autowired
+    IQwCompanyService iQwCompanyService;
+
+    private static final String appLink = "https://jump.ylrztop.com/jumpapp/pages/index/index?link=";
+
     /**
      * 获取用户列表
      */
@@ -203,6 +216,53 @@ public class CompanyUserController extends BaseController
         return toAjax(companyUserService.insertUser(user));
     }
 
+    /**
+    * 生成创建销售的二维码
+    */
+
+    @PreAuthorize("@ss.hasPermi('company:user:addCodeUrl')")
+    @Log(title = "生成创建销售的二维码", businessType = BusinessType.INSERT)
+    @PostMapping("/addCodeUrl")
+    public R addCodeUrl( @RequestBody CompanyUserCodeParam user) throws Exception {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+
+        QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(user.getCorpId());
+        if (qwCompany == null || qwCompany.getCorpId() == null){
+            return R.error("企业信息不存在");
+        }
+
+        //部门
+        Long deptId = user.getDeptId();
+
+        //角色组
+        Long[] roleIds = user.getRoleIds();
+
+        //区域
+        String addressId = user.getAddressId();
+
+
+        Map<String, Object> stateMap = new HashMap<>();
+        stateMap.put("companyId", companyId);
+        stateMap.put("deptId", deptId);
+        stateMap.put("roleIds", roleIds); // 数组可以直接存放
+        stateMap.put("addressId", addressId);
+
+        // 使用JSON库将Map转换为字符串
+        ObjectMapper objectMapper = new ObjectMapper();
+        String status = objectMapper.writeValueAsString(stateMap);
+
+        // 如果要将status作为URL参数传递,记得进行URL编码!
+        String encodedStatus = URLEncoder.encode(status, StandardCharsets.UTF_8.toString());
+
+        String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+user.getCorpId()+"&redirect_uri=" +
+                "http://"+qwCompany.getRealmNameUrl()+"/qwh5/pages/user/index?corpId="+user.getCorpId() +
+                "&response_type=code&scope=snsapi_base&state="+encodedStatus+"&agentid="+qwCompany.getServerAgentId()+"#wechat_redirect";
+
+        R andUpload = QRCodeUtils.createAndUpload(url);
+        return  R.ok().put("data",andUpload);
+    }
     /**
      * 修改用户
      */

+ 19 - 2
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -13,7 +13,10 @@ import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
 import com.fs.course.service.*;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.utils.qrcode.QRCodeUtils;
+import com.fs.qw.domain.QwCompany;
 import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwMaterialService;
 import com.fs.qwApi.service.QwApiService;
@@ -225,10 +228,24 @@ public class CommonController {
         return R.ok();
     }
 
+    @Autowired
+    IQwCompanyService iQwCompanyService;
     @GetMapping("/testSop2")
     public R testSop2() throws Exception {
-//        qwSopLogsService.createCorpMassSending();
-        return R.ok();
+
+        String cropId="ww401085d7b785aae8";
+
+        QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(cropId);
+
+        String status="100_asddas_6666";
+
+        String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+cropId+"&redirect_uri=" +
+                "http://"+qwCompany.getRealmNameUrl()+"/qwh5/pages/user/index?corpId="+cropId +
+                "&response_type=code&scope=snsapi_base&state="+status+"&agentid="+qwCompany.getServerAgentId()+"#wechat_redirect";
+
+        R andUpload = QRCodeUtils.createAndUpload(url);
+
+        return R.ok().put("data",andUpload);
     }
 
     @Autowired

+ 15 - 1
fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java

@@ -1,9 +1,13 @@
 package com.fs.app.controller;
 
 import com.fs.common.BeanCopyUtils;
+import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
+import com.fs.company.param.CompanyUserCodeParam;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.ExternalContactDetailsParam;
@@ -51,6 +55,9 @@ public class QwUserController extends BaseController {
     @Autowired
     private ISopUserLogsInfoService iSopUserLogsInfoService;
 
+    @Autowired
+    private ICompanyUserService companyUserService;
+
     @GetMapping("/details")
     @ApiOperation("会员看课详情")
     public R getUserDetails(@ApiParam(value = "外部联系人id", required = true) @RequestParam Long contactId,
@@ -150,5 +157,12 @@ public class QwUserController extends BaseController {
         return R.error();
     }
 
-
+    /**
+    * 注册或者绑定销售
+    */
+    @PostMapping("/registerCompany")
+    @Log(title = "注册或者绑定销售", businessType = BusinessType.INSERT)
+    public R registerCompany(@RequestBody CompanyUserCodeParam userCodeParam) {
+        return companyUserService.registerCompany(userCodeParam);
+    }
 }

+ 131 - 0
fs-service/src/main/java/com/fs/company/param/CompanyUserCodeParam.java

@@ -0,0 +1,131 @@
+package com.fs.company.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.company.domain.CompanyDept;
+import com.fs.company.domain.CompanyPost;
+import com.fs.company.domain.CompanyRole;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class CompanyUserCodeParam {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+    * 注册类型 1、新注册 2、已有销售账号-绑定
+    */
+    private Integer bindType;
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+    /** 公司名称 */
+    private String companyName;
+
+
+    private String corpId;
+
+    /** 归属部门ID */
+    @Excel(name = "部门ID")
+    private Long deptId;
+
+    /** 用户账号 */
+    @Excel(name = "用户账号")
+    private String userName;
+
+    /** 用户昵称 */
+    @Excel(name = "用户昵称")
+    private String nickName;
+
+    /** 用户类型(00系统用户) */
+    @Excel(name = "用户类型", readConverterExp = "0=0系统用户")
+    private String userType;
+
+    /** 手机号码 */
+    @Excel(name = "手机号码")
+    private String phonenumber;
+    /** 岗位 */
+    private List<CompanyPost> posts;
+
+    /** 用户性别(0男 1女 2未知) */
+    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
+    private String sex;
+
+    /** 头像地址 */
+    @Excel(name = "头像地址")
+    private String avatar;
+
+
+    /** 密码 */
+    @Excel(name = "密码")
+    private String password;
+
+    /** 帐号状态(0正常 1停用) */
+    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    private String qwUserId;
+
+    private String qwUserIdByStr;
+
+    private Integer qwStatus;
+
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Integer isDel;
+
+    private String openId;
+
+
+    private CompanyDept dept;
+
+    /** 角色对象 */
+    private List<CompanyRole> roles;
+
+    /** 角色组 */
+    private Long[] roleIds;
+
+    /** 岗位组 */
+    private Long[] postIds;
+
+    private String postName;
+
+    private String deptName;
+
+    private String addressId;
+
+    //绑定二维码
+    private String bindCode;
+
+    /** 看课域名 */
+    private String domain;
+
+    /** 是否审核 */
+    private Integer isAudit;
+
+    /** 用户上级id */
+    private Long parentId;
+
+    /** 微信小程序OPENID(如果有小程序授权) */
+    private String  maOpenId;
+
+    /** 是否需要单独注册会员,1-是,0-否(用于个微销售分享看课) */
+    private Integer isNeedRegisterMember;
+
+    /** 是否允许所有方式注册会员,1-是,0-否,默认1(用于个微注册会员) */
+    private Integer isAllowedAllRegister;
+
+}

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -3,6 +3,7 @@ package com.fs.company.service;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.param.CompanyUserAreaParam;
+import com.fs.company.param.CompanyUserCodeParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.vo.*;
 import com.fs.his.vo.CitysAreaVO;
@@ -93,6 +94,7 @@ public interface ICompanyUserService {
     int checkUserName(String userName);
 
     public int insertUser(CompanyUser user);
+    public R registerCompany(CompanyUserCodeParam userCodeParam);
     public int updateUser(CompanyUser user);
 
 

+ 121 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -2,18 +2,23 @@ package com.fs.company.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.DataScope;
+import com.fs.common.constant.UserConstants;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.exception.file.OssException;
-import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.*;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
 import com.fs.company.param.CompanyUserAreaParam;
+import com.fs.company.param.CompanyUserCodeParam;
 import com.fs.company.param.CompanyUserQwParam;
+import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.*;
 import com.fs.course.service.IFsUserCompanyUserService;
@@ -21,8 +26,11 @@ import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsCityService;
 import com.fs.his.vo.CitysAreaVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.qw.domain.QwUser;
 import com.fs.qw.dto.UserProjectDTO;
 import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwOptionsVO;
 import com.fs.qw.vo.QwUserVO;
@@ -83,6 +91,18 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     @Autowired
     private IFsUserCompanyUserService userCompanyUserService;
 
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwUserService qwUserService;
+
     /**
      * 查询物业公司管理员信息
      *
@@ -264,6 +284,105 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return rows;
     }
 
+    @Override
+    public R registerCompany(CompanyUserCodeParam userCodeParam) {
+        CompanyUser user=new CompanyUser();
+
+        QwUser qwUser = qwUserMapper.selectQwUserByCorpIdAndUserId(userCodeParam.getCorpId(),userCodeParam.getQwUserIdByStr());
+
+        if (qwUser==null){
+            return R.error("无企微员工信息,无法处理,请先同步员工:"+ userCodeParam.getQwUserIdByStr()+"--"+userCodeParam.getCorpId());
+        }
+
+        if (qwUser.getCompanyUserId()!=null&&!qwUser.getCompanyUserId().equals(qwUser.getCompanyUserId())){
+            return R.error( qwUser.getQwUserName()+"已经被其他人绑定,请先解绑");
+        }
+
+        if (userCodeParam.getBindType()==1){
+
+            if (!PatternUtils.checkPassword(userCodeParam.getPassword())) {
+                return R.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+            }
+
+            //判断用户数量是否已达到上线
+            Integer count=companyUserService.selectCompanyUserCountByCompanyId(userCodeParam.getCompanyId());
+            Company company=companyService.selectCompanyById(userCodeParam.getCompanyId());
+
+            if(count>company.getLimitUserCount()){
+                return R.error("用户数量已达到上限");
+            }
+
+            if (UserConstants.NOT_UNIQUE.equals(String.valueOf(companyUserService.checkUserName(userCodeParam.getUserName()))))
+            {
+                return R.error("新增用户'" + userCodeParam.getUserName() + "'失败,登录账号已存在");
+            }
+            user.setNickName(userCodeParam.getNickName());
+            user.setUserName(userCodeParam.getUserName());
+            user.setSex(userCodeParam.getSex());
+            user.setStatus("1");
+            user.setDept(userCodeParam.getDept());
+            user.setRoleIds(userCodeParam.getRoleIds());
+            user.setAddressId(userCodeParam.getAddressId());
+            user.setCompanyId(userCodeParam.getCompanyId());
+            user.setCreateBy(userCodeParam.getQwUserId());
+            user.setPassword(SecurityUtils.encryptPassword(userCodeParam.getPassword()));
+            user.setCreateTime(new Date());
+            user.setUserType("01");//一般用户
+            user.setIsAudit(1);
+
+            int i = companyUserService.insertUser(user);
+            if (i>0){
+
+                CompanyUser companyUser = companyUserMapper.selectUserByUserName(userCodeParam.getUserName());
+
+                bindQwUserToCompanyUser(qwUser, companyUser);
+
+            }else {
+                return R.error("销售创建失败");
+            }
+
+            return R.ok();
+
+        }
+        else if (userCodeParam.getBindType()==2){
+
+            // 绑定到现有用户
+            CompanyUser companyUser = companyUserMapper.selectUserByUserName(userCodeParam.getUserName());
+            if (companyUser == null) {
+                return R.error("指定的用户不存在");
+            }
+
+            bindQwUserToCompanyUser(qwUser, companyUser);
+        }
+
+        return R.error();
+    }
+
+    private void bindQwUserToCompanyUser(QwUser qwUser, CompanyUser companyUser) {
+        // 更新公司用户的企微ID列表
+        Set<String> qwUserIdSet = new HashSet<>();
+
+        if (!StringUtil.strIsNullOrEmpty(companyUser.getQwUserId())) {
+            String[] existingIds = companyUser.getQwUserId().split(",");
+            qwUserIdSet.addAll(Arrays.stream(existingIds)
+                    .filter(id -> !id.isEmpty())
+                    .collect(Collectors.toSet()));
+        }
+
+        qwUserIdSet.add(String.valueOf(qwUser.getId()));
+        companyUser.setQwUserId(String.join(",", qwUserIdSet));
+        companyUser.setQwStatus(1);
+        companyUserMapper.updateCompanyUser(companyUser);
+
+        // 更新企微用户信息
+        QwUser qw = new QwUser();
+        qw.setCompanyUserId(companyUser.getUserId());
+        qw.setId(qwUser.getId());
+        qw.setStatus(1);
+        qw.setCompanyId(companyUser.getCompanyId());
+        qwUserService.updateQwUser(qw);
+    }
+
     /**
      * 修改保存用户信息
      *

+ 1 - 0
fs-service/src/main/java/com/fs/his/mapper/FsAppVersionMapper.java

@@ -66,6 +66,7 @@ public interface FsAppVersionMapper
 
     @Select("select * from fs_app_version where type=#{type} and app_type=3 order by version_code desc limit 1")
     FsAppVersion getNewUserAppVersion(Integer type);
+
     @Select("select * from fs_app_version where type=#{type} and app_type=#{appType} order by version_code desc limit 1")
     FsAppVersion getNewVersion1(@Param("appType")Integer appType, @Param("type") int type);
 }

+ 23 - 0
fs-service/src/main/java/com/fs/his/utils/qrcode/QRCodeUtils.java

@@ -1,5 +1,8 @@
 package com.fs.his.utils.qrcode;
 
+import com.fs.common.core.domain.R;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.google.zxing.*;
 import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
 import com.google.zxing.client.j2se.MatrixToImageConfig;
@@ -94,6 +97,26 @@ public class QRCodeUtils {
         MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, path);
     }
 
+    /**
+     * @title 生成二维码图片
+     * @description 根据文本内容生成默认格式的二维图图片 并直接上传云端 返回一张图片
+     * @param text 文本内容
+     */
+    public static R createAndUpload(String text) throws Exception {
+        // 生成二维码字节数据
+        BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT, ENCODE_HINTS);
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        MatrixToImageWriter.writeToStream(bitMatrix, FORMAT, outputStream);
+        byte[] qrCodeBytes = outputStream.toByteArray();
+
+        // 直接使用字节数组上传
+        String fileName = "qrcode_" + System.currentTimeMillis() + "." + FORMAT.toLowerCase();
+        CloudStorageService storage = OSSFactory.build();
+        String url = storage.upload(qrCodeBytes, fileName);
+
+        return R.ok().put("url", url);
+    }
+
     /**
      * @title 生成二维码图片
      * @description 根据文本内容生成二维码图片的字节输出流

+ 6 - 1
fs-service/src/main/resources/application-config-druid-syysy.yml

@@ -85,4 +85,9 @@ ipad:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:
-
+# 聚水潭API配置
+jst:
+  app_key: 5dea3c46f0214985b1fd43d6428b2b12 #聚水潭2025-09-03
+  app_secret: 3f382758a4f4470e80932a24912be0ce #聚水潭2025-09-0
+  authorization_code: 999999
+  shop_code: "18886784"