Procházet zdrojové kódy

用户相关接口+支付

wulei před 3 měsíci
rodič
revize
e61caac297
27 změnil soubory, kde provedl 953 přidání a 140 odebrání
  1. 4 0
      snowy-admin-web/src/api/biz/bizUserApi.js
  2. 131 0
      snowy-admin-web/src/views/biz/member/index.vue
  3. 13 0
      snowy-common/pom.xml
  4. 132 0
      snowy-common/src/main/java/vip/xiaonuo/common/util/CommonWxUtil.java
  5. 39 0
      snowy-common/src/main/java/vip/xiaonuo/common/wx/WxPayAutoCertificateConfig.java
  6. 37 0
      snowy-common/src/main/java/vip/xiaonuo/common/wx/WxPayConfig.java
  7. 7 0
      snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java
  8. 4 0
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java
  9. 24 0
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthWxParam.java
  10. 22 0
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthInfo.java
  11. 3 0
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java
  12. 33 30
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java
  13. 8 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/BizOrgService.java
  14. 52 47
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java
  15. 45 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java
  16. 9 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java
  17. 8 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/BizUserMapper.java
  18. 15 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml
  19. 22 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/SmsSendParam.java
  20. 44 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/WxUserRegisterParam.java
  21. 86 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizMemberUserResult.java
  22. 18 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java
  23. 175 61
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java
  24. 9 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java
  25. 4 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java
  26. 6 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java
  27. 3 0
      snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java

+ 4 - 0
snowy-admin-web/src/api/biz/bizUserApi.js

@@ -22,6 +22,10 @@ export default {
 	userPage(data) {
 		return request('page', data, 'get')
 	},
+	// 获取会员人员分页
+	memberPage(data) {
+		return request('memberPage', data, 'get')
+	},
 	// 提交表单 edit为true时为编辑,默认为新增
 	submitForm(data, edit = false) {
 		return request(edit ? 'edit' : 'add', data)

+ 131 - 0
snowy-admin-web/src/views/biz/member/index.vue

@@ -0,0 +1,131 @@
+<template>
+	<a-card :bordered="false" class="xn-mb10">
+		<a-form ref="searchFormRef" name="advanced_search" class="ant-advanced-search-form" :model="searchFormState">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item name="searchKey" :label="$t('common.searchKey')">
+						<a-input v-model:value="searchFormState.searchKey" :placeholder="'请输入姓名或账号'" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item name="userStatus" :label="$t('user.userStatus')">
+						<a-select
+							v-model:value="searchFormState.userStatus"
+							:placeholder="$t('user.placeholderUserStatus')"
+							:getPopupContainer="(trigger) => trigger.parentNode"
+						>
+							<a-select-option v-for="item in statusData" :key="item.value" :value="item.value">{{
+								item.label
+							}}</a-select-option>
+						</a-select>
+					</a-form-item>
+				</a-col>
+				<a-col :span="8">
+					<a-button type="primary" @click="tableRef.refresh(true)">
+						<template #icon><SearchOutlined /></template>
+						查询
+					</a-button>
+					<a-button class="snowy-button-left" @click="reset">
+						<template #icon><redo-outlined /></template>
+						重置
+					</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
+	<a-card :bordered="false">
+		<s-table ref="tableRef" :columns="columns" :data="loadData" bordered :row-key="(record) => record.id">
+			<template #bodyCell="{ column, record, index }">
+				<template v-if="column.dataIndex === 'serial'">
+					{{ index + 1 }}
+				</template>
+				<template v-if="column.dataIndex === 'gender'">
+					{{ $TOOL.dictTypeData('GENDER', record.gender) }}
+				</template>
+				<template v-if="column.dataIndex === 'userStatus'">
+					<a-tag :color="record.userStatus === 'ENABLE' ? 'blue' : 'pink'">{{
+						$TOOL.dictTypeData('COMMON_STATUS', record.userStatus)
+					}}</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a @click="formRef.onOpen(record)" v-if="hasPerm('bizUserEdit')">余额调整</a>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+</template>
+<script setup name="bizUser">
+	import tool from '@/utils/tool'
+	import bizUserApi from '@/api/biz/bizUserApi'
+
+	const columns = [
+		{
+			title: '序号',
+			dataIndex: 'serial',
+			align: 'center',
+			width: '50px'
+		},
+		{
+			title: '账号',
+			dataIndex: 'account',
+			ellipsis: true
+		},
+		{
+			title: '姓名',
+			dataIndex: 'name'
+		},
+		{
+			title: '性别',
+			dataIndex: 'gender',
+			width: '50px'
+		},
+		{
+			title: '手机',
+			dataIndex: 'phone',
+			ellipsis: true
+		},
+		{
+			title: '账户余额',
+			dataIndex: 'accountBalance'
+		},
+		{
+			title: '代金券余额',
+			dataIndex: 'voucherBalance'
+		},
+		{
+			title: '状态',
+			dataIndex: 'userStatus',
+			width: '80px'
+		}
+	]
+	if (hasPerm(['balanceAdjustment'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: '150px'
+		})
+	}
+	const statusData = tool.dictList('COMMON_STATUS')
+	const searchFormRef = ref()
+	const searchFormState = ref({})
+	const tableRef = ref(null)
+	const formRef = ref(null)
+	// 表格查询 返回 Promise 对象
+	const loadData = (parameter) => {
+		return bizUserApi.memberPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			return res
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+</script>
+
+<style scoped>
+	.snowy-button-left {
+		margin-left: 8px;
+	}
+</style>

+ 13 - 0
snowy-common/pom.xml

@@ -16,6 +16,19 @@
 
     <dependencies>
 
+
+        <!-- 微信支付V3 目前新版本-->
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.12</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.4.9</version>
+        </dependency>
+
         <!-- nashorn-core -->
         <dependency>
             <groupId>org.openjdk.nashorn</groupId>

+ 132 - 0
snowy-common/src/main/java/vip/xiaonuo/common/util/CommonWxUtil.java

@@ -0,0 +1,132 @@
+package vip.xiaonuo.common.util;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.utils.URIBuilder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.common.cache.CommonCacheOperator;
+import vip.xiaonuo.common.exception.CommonException;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author wulei
+ * @date 2024/11/1
+ * @Version 1.0
+ * @Description 获取微信openId 工具类
+ */
+@Slf4j
+@Component
+public class CommonWxUtil {
+
+    private static final String APP_ID = "wx3f94e7be85c27ff7";
+
+    private static final String SECRET = "9c9c0dee6be8a67d9946f0deb762ac7e";
+
+    private static final String GRANT_TYPE = "client_credential";
+
+    private static final String GET_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
+
+    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
+
+    @Resource
+    private CommonCacheOperator commonCacheOperator;
+
+    /**
+     * 获取微信openId
+     *
+     * @param code         小程序code 码
+     * @param getOpenIdUrl 交换openId 地址
+     * @param appId        appId
+     * @param secret       secret
+     * @return openId
+     */
+    public String getOpenId(String code, String getOpenIdUrl, String appId, String secret) {
+        try {
+            // 使用 URIBuilder 构建 URL
+            URIBuilder uriBuilder = new URIBuilder(getOpenIdUrl);
+            uriBuilder.addParameter("appid", appId)
+                    .addParameter("secret", secret)
+                    .addParameter("js_code", code)
+                    .addParameter("grant_type", "authorization_code");
+            String url = uriBuilder.build().toString();
+            String responseBody = HttpUtil.get(url);
+            if (responseBody == null || responseBody.isEmpty()) {
+                return null;
+            }
+            JSONObject jsonObjectBody = JSONObject.parseObject(responseBody);
+            if (jsonObjectBody.containsKey("openid")) {
+                return jsonObjectBody.getString("openid");
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 调用微信接口获取accessToken
+     *
+     * @return
+     * @throws Exception
+     */
+    public String getAccessToken() throws Exception {
+        String accessToken = "";
+        StringBuffer requestParam = new StringBuffer();
+        requestParam.append(ACCESS_TOKEN_URL)
+                .append("?appid=")
+                .append(APP_ID)
+                .append("&secret=")
+                .append(SECRET)
+                .append("&grant_type=")
+                .append(GRANT_TYPE);
+        try {
+            String responseBody = HttpUtil.get(requestParam.toString());
+            log.info("Calling WeChat to obtain return value information:{}", responseBody);
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            accessToken = jsonObject.getString("access_token");
+        } catch (Exception e) {
+            throw new CommonException("微信获取授权token异常,请联系管理员");
+        }
+        return accessToken;
+    }
+
+    /**
+     * 调用微信接口获取手机号
+     *
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    public String getPhoneNumber(String code) throws Exception {
+        String accessToken = getAccessToken();
+        if (StrUtil.isEmpty(accessToken)) {
+            throw new CommonException("微信获取授权token异常,请联系管理员");
+        }
+        String phoneNumber = "";
+        Map<String, String> map = new LinkedHashMap<>();
+        map.put("code", code);
+        try {
+            String post = HttpUtil.post(GET_PHONE_URL + accessToken, JSONObject.toJSONString(map));
+            JSONObject jsonObject = JSONObject.parseObject(post);
+            if (jsonObject.getInteger("errcode") != 0) {
+                throw new CommonException("微信获取授权手机号异常,请联系管理员");
+            }
+            JSONObject phoneInfo = (JSONObject) jsonObject.get("phone_info");
+            phoneNumber = phoneInfo.getString("phoneNumber");
+        } catch (Exception e) {
+            log.error("Exception in calling WeChat to obtain phoneNumber:{}", e.getMessage());
+            throw new CommonException("微信获取授权手机号异常,请联系管理员");
+        }
+        return phoneNumber;
+    }
+
+
+
+}

+ 39 - 0
snowy-common/src/main/java/vip/xiaonuo/common/wx/WxPayAutoCertificateConfig.java

@@ -0,0 +1,39 @@
+package vip.xiaonuo.common.wx;
+
+import com.wechat.pay.java.core.RSAAutoCertificateConfig;
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author wulei
+ * @date 2024/11/1
+ * @Version 1.0
+ * @Description TODO
+ */
+
+@Configuration
+public class WxPayAutoCertificateConfig {
+
+    @Resource
+    private WxPayConfig wxPayConfig;
+
+    /**
+     * 初始化商户配置
+     *
+     * @return
+     */
+    @Bean
+    public RSAAutoCertificateConfig rsaAutoCertificateConfig() {
+        // 这里把Config作为配置Bean是为了避免多次创建资源,一般项目运行的时候这些东西都确定了
+        // 具体的参数改为申请的数据,可以通过读配置文件的形式获取
+        RSAAutoCertificateConfig config = new RSAAutoCertificateConfig.Builder()
+                .merchantId(wxPayConfig.getMerchantId())
+                .privateKey(wxPayConfig.getPrivateKey())
+                .merchantSerialNumber(wxPayConfig.getMchSerialNo())
+                .apiV3Key(wxPayConfig.getApiV3Key())
+                .build();
+        return config;
+    }
+
+}

+ 37 - 0
snowy-common/src/main/java/vip/xiaonuo/common/wx/WxPayConfig.java

@@ -0,0 +1,37 @@
+package vip.xiaonuo.common.wx;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wulei
+ * @date 2024/11/1
+ * @Version 1.0
+ * @Description TODO
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "wx.pay")
+public class WxPayConfig {
+    //APPID
+    private String appId;
+    //APP SECRET
+    private String appSecret;
+    //商户号
+    private String merchantId;
+    //商户API私钥地址
+    private String privateKey;
+    //商户证书序列号
+    private String mchSerialNo;
+    //商户APIv3密钥
+    private String apiV3Key;
+    //支付通知地址
+    private String payNotifyUrl;
+    //openid交换地址
+    private String getOpenIdUrl;
+    //授权类型
+    private String grantType;
+
+
+}

+ 7 - 0
snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java

@@ -48,4 +48,11 @@ public interface SysRoleApi {
      * @date 2022/11/1 15:58
      **/
     void grantForGenMenuAndButton(String menuId);
+
+    /**
+     * 用户授权角色
+     */
+    void grantUserRole(String userId, String roleId);
+
+
 }

+ 4 - 0
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java

@@ -120,4 +120,8 @@ public class AuthClientController {
     public CommonResult<SaBaseClientLoginUser> getLoginUser() {
         return CommonResult.data(authService.getClientLoginUser());
     }
+
+
+
+
 }

+ 24 - 0
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/param/AuthWxParam.java

@@ -0,0 +1,24 @@
+package vip.xiaonuo.auth.modular.login.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wulei
+ * @date 2025/2/5
+ * @Version 1.0
+ * @Description TODO
+ */
+@Setter
+@Getter
+public class AuthWxParam {
+
+    @Schema(description = "微信code", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "code不能为空")
+    private String code;
+
+
+
+}

+ 22 - 0
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthInfo.java

@@ -0,0 +1,22 @@
+package vip.xiaonuo.auth.modular.login.result;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wulei
+ * @date 2025/2/5
+ * @Version 1.0
+ * @Description 微信授权信息
+ */
+@Setter
+@Getter
+public class WxAuthInfo {
+
+    @Schema(description = "openId", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String openId;
+
+
+
+}

+ 3 - 0
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java

@@ -82,4 +82,7 @@ public interface AuthService {
      * @date 2022/7/9 14:44
      */
     String doLoginById(String userId, String device, String type);
+
+
+
 }

+ 33 - 30
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java

@@ -81,6 +81,7 @@ public class AuthServiceImpl implements AuthService {
     @Resource
     private CommonCacheOperator commonCacheOperator;
 
+
     @Override
     public AuthPicValidCodeResult getPicCaptcha(String type) {
         // 生成验证码,随机4位字符
@@ -140,17 +141,17 @@ public class AuthServiceImpl implements AuthService {
     private void validValidCode(String phoneOrEmail, String validCode, String validCodeReqNo) {
         // 依据请求号,取出缓存中的验证码进行校验
         Object existValidCode;
-        if(ObjectUtil.isEmpty(phoneOrEmail)) {
+        if (ObjectUtil.isEmpty(phoneOrEmail)) {
             existValidCode = commonCacheOperator.get(AUTH_VALID_CODE_CACHE_KEY + validCodeReqNo);
         } else {
             existValidCode = commonCacheOperator.get(AUTH_VALID_CODE_CACHE_KEY + phoneOrEmail + StrUtil.UNDERLINE + validCodeReqNo);
         }
         // 为空则直接验证码错误
-        if(ObjectUtil.isEmpty(existValidCode)) {
+        if (ObjectUtil.isEmpty(existValidCode)) {
             throw new CommonException(AuthExceptionEnum.VALID_CODE_ERROR.getValue());
         }
         // 移除该验证码
-        if(ObjectUtil.isEmpty(phoneOrEmail)) {
+        if (ObjectUtil.isEmpty(phoneOrEmail)) {
             commonCacheOperator.remove(AUTH_VALID_CODE_CACHE_KEY + validCodeReqNo);
         } else {
             commonCacheOperator.remove(AUTH_VALID_CODE_CACHE_KEY + phoneOrEmail + StrUtil.UNDERLINE + validCodeReqNo);
@@ -169,23 +170,23 @@ public class AuthServiceImpl implements AuthService {
      **/
     private void validPhoneValidCodeParam(String phoneOrEmail, String validCode, String validCodeReqNo, String type) {
         // 验证码正确则校验手机号格式
-        if(ObjectUtil.isEmpty(phoneOrEmail)) {
+        if (ObjectUtil.isEmpty(phoneOrEmail)) {
             // 执行校验验证码
             validValidCode(null, validCode, validCodeReqNo);
         } else {
-            if(!PhoneUtil.isMobile(phoneOrEmail) && !CommonEmailUtil.isEmail(phoneOrEmail)) {
+            if (!PhoneUtil.isMobile(phoneOrEmail) && !CommonEmailUtil.isEmail(phoneOrEmail)) {
                 throw new CommonException(AuthExceptionEnum.PHONE_FORMAT_ERROR.getValue());
             }
             // 执行校验验证码
             validValidCode(phoneOrEmail, validCode, validCodeReqNo);
 
             // 根据手机号获取用户信息,判断用户是否存在,根据B端或C端判断
-            if(SaClientTypeEnum.B.getValue().equals(type)) {
-                if(ObjectUtil.isEmpty(loginUserApi.getUserByPhone(phoneOrEmail))) {
+            if (SaClientTypeEnum.B.getValue().equals(type)) {
+                if (ObjectUtil.isEmpty(loginUserApi.getUserByPhone(phoneOrEmail))) {
                     throw new CommonException(AuthExceptionEnum.PHONE_ERROR.getValue());
                 }
             } else {
-                if(ObjectUtil.isEmpty(clientLoginUserApi.getClientUserByPhone(phoneOrEmail))) {
+                if (ObjectUtil.isEmpty(clientLoginUserApi.getClientUserByPhone(phoneOrEmail))) {
                     throw new CommonException(AuthExceptionEnum.PHONE_ERROR.getValue());
                 }
             }
@@ -203,25 +204,25 @@ public class AuthServiceImpl implements AuthService {
         // 获取设备
         String device = authAccountPasswordLoginParam.getDevice();
         // 默认指定为PC,如在小程序跟移动端的情况下,自行指定即可
-        if(ObjectUtil.isEmpty(device)) {
+        if (ObjectUtil.isEmpty(device)) {
             device = AuthDeviceTypeEnum.PC.getValue();
         } else {
             AuthDeviceTypeEnum.validate(device);
         }
         // 校验验证码
         String defaultCaptchaOpen = devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_CAPTCHA_OPEN_KEY);
-        if(ObjectUtil.isNotEmpty(defaultCaptchaOpen)) {
-            if(Convert.toBool(defaultCaptchaOpen)) {
+        if (ObjectUtil.isNotEmpty(defaultCaptchaOpen)) {
+            if (Convert.toBool(defaultCaptchaOpen)) {
                 // 获取验证码
                 String validCode = authAccountPasswordLoginParam.getValidCode();
                 // 获取验证码请求号
                 String validCodeReqNo = authAccountPasswordLoginParam.getValidCodeReqNo();
                 // 开启验证码则必须传入验证码
-                if(ObjectUtil.isEmpty(validCode)) {
+                if (ObjectUtil.isEmpty(validCode)) {
                     throw new CommonException(AuthExceptionEnum.VALID_CODE_EMPTY.getValue());
                 }
                 // 开启验证码则必须传入验证码请求号
-                if(ObjectUtil.isEmpty(validCodeReqNo)) {
+                if (ObjectUtil.isEmpty(validCodeReqNo)) {
                     throw new CommonException(AuthExceptionEnum.VALID_CODE_REQ_NO_EMPTY.getValue());
                 }
                 // 执行校验验证码
@@ -237,9 +238,9 @@ public class AuthServiceImpl implements AuthService {
             throw new CommonException(AuthExceptionEnum.PWD_DECRYPT_ERROR.getValue());
         }
         // 根据账号获取用户信息,根据B端或C端判断
-        if(SaClientTypeEnum.B.getValue().equals(type)) {
+        if (SaClientTypeEnum.B.getValue().equals(type)) {
             SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserByAccount(account);
-            if(ObjectUtil.isEmpty(saBaseLoginUser)) {
+            if (ObjectUtil.isEmpty(saBaseLoginUser)) {
                 throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue());
             }
             if (!saBaseLoginUser.getPassword().equals(passwordHash)) {
@@ -253,7 +254,7 @@ public class AuthServiceImpl implements AuthService {
             return execLoginB(saBaseLoginUser, device);
         } else {
             SaBaseClientLoginUser saBaseClientLoginUser = clientLoginUserApi.getClientUserByAccount(account);
-            if(ObjectUtil.isEmpty(saBaseClientLoginUser)) {
+            if (ObjectUtil.isEmpty(saBaseClientLoginUser)) {
                 throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue());
             }
             if (!saBaseClientLoginUser.getPassword().equals(passwordHash)) {
@@ -273,22 +274,22 @@ public class AuthServiceImpl implements AuthService {
         // 设备
         String device = authPhoneValidCodeLoginParam.getDevice();
         // 默认指定为PC,如在小程序跟移动端的情况下,自行指定即可
-        if(ObjectUtil.isEmpty(device)) {
+        if (ObjectUtil.isEmpty(device)) {
             device = AuthDeviceTypeEnum.PC.getValue();
         } else {
             AuthDeviceTypeEnum.validate(device);
         }
         // 根据手机号获取用户信息,根据B端或C端判断
-        if(SaClientTypeEnum.B.getValue().equals(type)) {
+        if (SaClientTypeEnum.B.getValue().equals(type)) {
             SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserByPhone(phone);
-            if(ObjectUtil.isEmpty(saBaseLoginUser)) {
+            if (ObjectUtil.isEmpty(saBaseLoginUser)) {
                 throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue());
             }
             // 执行B端登录
             return execLoginB(saBaseLoginUser, device);
         } else {
             SaBaseClientLoginUser saBaseClientLoginUser = clientLoginUserApi.getClientUserByPhone(phone);
-            if(ObjectUtil.isEmpty(saBaseClientLoginUser)) {
+            if (ObjectUtil.isEmpty(saBaseClientLoginUser)) {
                 throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue());
             }
             // 执行C端登录
@@ -305,25 +306,25 @@ public class AuthServiceImpl implements AuthService {
         long disableTime = StpUtil.getDisableTime(userAccount);
         if (disableTime > 0) {
             if (disableTime > 60) {
-                throw new CommonException(userAccount + "账号已被封禁, 请再"+ disableTime/60+ "分钟后重新尝试登录!!");
+                throw new CommonException(userAccount + "账号已被封禁, 请再" + disableTime / 60 + "分钟后重新尝试登录!!");
             }
-            throw new CommonException(userAccount + "账号已被封禁, 请再"+ disableTime+ "秒后重新尝试登录!!");
+            throw new CommonException(userAccount + "账号已被封禁, 请再" + disableTime + "秒后重新尝试登录!!");
         }
     }
 
     // redis中保存登录错误次数
-    private void saveLoginTimes(String userAccount){
+    private void saveLoginTimes(String userAccount) {
         String loginErrorKey = LOGIN_ERROR_TIMES_KEY_PREFIX + userAccount;
         Integer number = (Integer) commonCacheOperator.get(loginErrorKey);
         if (number == null) {
             // 如果redis中没有保存,代表失败第一次
             number = 2;
-            commonCacheOperator.put(loginErrorKey, number,5 * 60);
+            commonCacheOperator.put(loginErrorKey, number, 5 * 60);
             return;
         }
         if (number < 5) {
             number++;
-            commonCacheOperator.put(loginErrorKey, number,5 * 60);
+            commonCacheOperator.put(loginErrorKey, number, 5 * 60);
             return;
         }
         // 第五次封禁账号,第六次进入isDisableTime方法,返回用户还需等待时间
@@ -351,7 +352,7 @@ public class AuthServiceImpl implements AuthService {
      **/
     private String execLoginB(SaBaseLoginUser saBaseLoginUser, String device) {
         // 校验状态
-        if(!saBaseLoginUser.getEnabled()) {
+        if (!saBaseLoginUser.getEnabled()) {
             throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue());
         }
         // 执行登录
@@ -390,7 +391,7 @@ public class AuthServiceImpl implements AuthService {
         // 设置权限码
         saBaseLoginUser.setPermissionCodeList(permissionCodeList);
         // 权限码列表存入缓存
-        commonCacheOperator.put(CacheConstant.AUTH_B_PERMISSION_LIST_CACHE_KEY + saBaseLoginUser.getId(),permissionCodeList);
+        commonCacheOperator.put(CacheConstant.AUTH_B_PERMISSION_LIST_CACHE_KEY + saBaseLoginUser.getId(), permissionCodeList);
         // 获取角色码
         saBaseLoginUser.setRoleCodeList(roleCodeList);
         // 缓存用户信息,此处使用TokenSession为了指定时间内无操作则自动下线
@@ -405,7 +406,7 @@ public class AuthServiceImpl implements AuthService {
      **/
     private String execLoginC(SaBaseClientLoginUser saBaseClientLoginUser, String device) {
         // 校验状态
-        if(!saBaseClientLoginUser.getEnabled()) {
+        if (!saBaseClientLoginUser.getEnabled()) {
             throw new CommonException(AuthExceptionEnum.ACCOUNT_DISABLED.getValue());
         }
         // 执行登录
@@ -444,7 +445,7 @@ public class AuthServiceImpl implements AuthService {
         // 设置权限码
         saBaseClientLoginUser.setPermissionCodeList(permissionCodeList);
         // 权限码列表存入缓存
-        commonCacheOperator.put(CacheConstant.AUTH_C_PERMISSION_LIST_CACHE_KEY + saBaseClientLoginUser.getId(),permissionCodeList);
+        commonCacheOperator.put(CacheConstant.AUTH_C_PERMISSION_LIST_CACHE_KEY + saBaseClientLoginUser.getId(), permissionCodeList);
         // 获取角色码
         saBaseClientLoginUser.setRoleCodeList(roleCodeList);
         // 缓存用户信息,此处使用TokenSession为了指定时间内无操作则自动下线
@@ -502,7 +503,7 @@ public class AuthServiceImpl implements AuthService {
     @Override
     public String doLoginById(String userId, String device, String type) {
         // 根据id获取用户信息,根据B端或C端判断
-        if(SaClientTypeEnum.B.getValue().equals(type)) {
+        if (SaClientTypeEnum.B.getValue().equals(type)) {
             SaBaseLoginUser saBaseLoginUser = loginUserApi.getUserById(userId);
             if (ObjectUtil.isEmpty(saBaseLoginUser)) {
                 throw new CommonException(AuthExceptionEnum.ACCOUNT_ERROR.getValue());
@@ -518,4 +519,6 @@ public class AuthServiceImpl implements AuthService {
             return execLoginC(saBaseClientLoginUser, device);
         }
     }
+
+
 }

+ 8 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/BizOrgService.java

@@ -85,6 +85,13 @@ public interface BizOrgService extends IService<BizOrg> {
      **/
     BizOrg queryEntity(String id);
 
+    /**
+     * 根据门店编码获取门店信息
+     * @param code
+     * @return
+     */
+    BizOrg queryByOrgCode(String code);
+
     /**
      * 获取所有机构
      *
@@ -172,4 +179,5 @@ public interface BizOrgService extends IService<BizOrg> {
      * @date 2022/4/24 20:08
      */
     Page<BizUser> userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam);
+
 }

+ 52 - 47
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/org/service/impl/BizOrgServiceImpl.java

@@ -82,13 +82,13 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         // 查询部分字段
         queryWrapper.lambda().select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName, BizOrg::getCode, BizOrg::getAddress,
                 BizOrg::getCategory, BizOrg::getSortCode);
-        if(ObjectUtil.isNotEmpty(bizOrgPageParam.getParentId())) {
+        if (ObjectUtil.isNotEmpty(bizOrgPageParam.getParentId())) {
             queryWrapper.lambda().eq(BizOrg::getParentId, bizOrgPageParam.getParentId());
         }
-        if(ObjectUtil.isNotEmpty(bizOrgPageParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizOrgPageParam.getSearchKey())) {
             queryWrapper.lambda().like(BizOrg::getName, bizOrgPageParam.getSearchKey());
         }
-        if(ObjectUtil.isAllNotEmpty(bizOrgPageParam.getSortField(), bizOrgPageParam.getSortOrder())) {
+        if (ObjectUtil.isAllNotEmpty(bizOrgPageParam.getSortField(), bizOrgPageParam.getSortOrder())) {
             CommonSortOrderEnum.validate(bizOrgPageParam.getSortOrder());
             queryWrapper.orderBy(true, bizOrgPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
                     StrUtil.toUnderlineCase(bizOrgPageParam.getSortField()));
@@ -97,7 +97,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         }
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             queryWrapper.lambda().in(BizOrg::getId, loginUserDataScope);
         } else {
             return new Page<>();
@@ -113,14 +113,14 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         Set<BizOrg> bizOrgSet = CollectionUtil.newHashSet();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             loginUserDataScope.forEach(orgId -> bizOrgSet.addAll(this.getParentListById(allOrgList, orgId, true)));
         } else {
             return CollectionUtil.newArrayList();
         }
         List<TreeNode<String>> treeNodeList = bizOrgSet.stream().map(bizOrg ->
-                new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(),
-                        bizOrg.getName(), bizOrg.getSortCode()).setExtra(JSONUtil.parseObj(bizOrg)))
+                        new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(),
+                                bizOrg.getName(), bizOrg.getSortCode()).setExtra(JSONUtil.parseObj(bizOrg)))
                 .collect(Collectors.toList());
         return TreeUtil.build(treeNodeList, "0");
     }
@@ -131,8 +131,8 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         BizOrgCategoryEnum.validate(bizOrgAddParam.getCategory());
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizOrgAddParam.getParentId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizOrgAddParam.getParentId())) {
                 throw new CommonException("您没有权限在该机构下增加机构,机构id:{}", bizOrgAddParam.getParentId());
             }
         } else {
@@ -143,7 +143,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         // 重复名称
         boolean repeatName = this.count(new LambdaQueryWrapper<BizOrg>().eq(BizOrg::getParentId, bizOrg.getParentId())
                 .eq(BizOrg::getName, bizOrg.getName())) > 0;
-        if(repeatName) {
+        if (repeatName) {
             throw new CommonException("存在重复的同级机构,名称为:{}", bizOrg.getName());
         }
         bizOrg.setCode(RandomUtil.randomString(10));
@@ -160,11 +160,11 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         BizOrg bizOrg = this.queryEntity(bizOrgEditParam.getId());
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizOrg.getId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizOrg.getId())) {
                 throw new CommonException("您没有权限编辑该机构,机构id:{}", bizOrg.getId());
             }
-            if(!loginUserDataScope.contains(bizOrg.getParentId())) {
+            if (!loginUserDataScope.contains(bizOrg.getParentId())) {
                 throw new CommonException("您没有权限编辑该机构下的机构,机构id:{}", bizOrg.getParentId());
             }
         } else {
@@ -173,13 +173,13 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         BeanUtil.copyProperties(bizOrgEditParam, bizOrg);
         boolean repeatName = this.count(new LambdaQueryWrapper<BizOrg>().eq(BizOrg::getParentId, bizOrg.getParentId())
                 .eq(BizOrg::getName, bizOrg.getName()).ne(BizOrg::getId, bizOrg.getId())) > 0;
-        if(repeatName) {
+        if (repeatName) {
             throw new CommonException("存在重复的同级机构,名称为:{}", bizOrg.getName());
         }
         List<BizOrg> originDataList = this.list();
         boolean errorLevel = this.getChildListById(originDataList, bizOrg.getId(), true).stream()
                 .map(BizOrg::getId).collect(Collectors.toList()).contains(bizOrg.getParentId());
-        if(errorLevel) {
+        if (errorLevel) {
             throw new CommonException("不可选择上级机构:{}", this.getById(originDataList, bizOrg.getParentId()).getName());
         }
         this.updateById(bizOrg);
@@ -192,11 +192,11 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     @Override
     public void delete(List<BizOrgIdParam> bizOrgIdParamList) {
         List<String> orgIdList = CollStreamUtil.toList(bizOrgIdParamList, BizOrgIdParam::getId);
-        if(ObjectUtil.isNotEmpty(orgIdList)) {
+        if (ObjectUtil.isNotEmpty(orgIdList)) {
             // 校验数据范围
             List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-            if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-                if(!loginUserDataScope.containsAll(orgIdList)) {
+            if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+                if (!loginUserDataScope.containsAll(orgIdList)) {
                     throw new CommonException("您没有权限删除这些机构,机构id:{}", orgIdList);
                 }
             } else {
@@ -209,29 +209,29 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
                     .map(BizOrg::getId).collect(Collectors.toList())));
             // 机构下有人不能删除(直属机构)
             boolean hasOrgUser = bizUserService.count(new LambdaQueryWrapper<BizUser>().in(BizUser::getOrgId, toDeleteOrgIdList)) > 0;
-            if(hasOrgUser) {
+            if (hasOrgUser) {
                 throw new CommonException("请先删除机构下的人员");
             }
             // 机构下有人不能删除(兼任机构)
             List<String> positionJsonList = bizUserService.list(new LambdaQueryWrapper<BizUser>()
                     .isNotNull(BizUser::getPositionJson)).stream().map(BizUser::getPositionJson).collect(Collectors.toList());
-            if(ObjectUtil.isNotEmpty(positionJsonList)) {
+            if (ObjectUtil.isNotEmpty(positionJsonList)) {
                 List<String> positionOrgIdList = CollectionUtil.newArrayList();
                 positionJsonList.forEach(positionJson -> JSONUtil.toList(JSONUtil.parseArray(positionJson), JSONObject.class)
                         .forEach(jsonObject -> positionOrgIdList.add(jsonObject.getStr("orgId"))));
                 boolean hasPositionUser = CollectionUtil.intersectionDistinct(toDeleteOrgIdList, CollectionUtil.removeNull(positionOrgIdList)).size() > 0;
-                if(hasPositionUser) {
+                if (hasPositionUser) {
                     throw new CommonException("请先删除机构下的人员");
                 }
             }
             // 机构下有角色不能删除
             boolean hasRole = sysRoleApi.orgHasRole(toDeleteOrgIdList);
-            if(hasRole) {
+            if (hasRole) {
                 throw new CommonException("请先删除机构下的角色");
             }
             // 机构下有岗位不能删除
             boolean hasPosition = bizPositionService.count(new LambdaQueryWrapper<BizPosition>().in(BizPosition::getOrgId, toDeleteOrgIdList)) > 0;
-            if(hasPosition) {
+            if (hasPosition) {
                 throw new CommonException("请先删除机构下的岗位");
             }
             // 执行删除
@@ -250,12 +250,17 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     @Override
     public BizOrg queryEntity(String id) {
         BizOrg bizOrg = this.getById(id);
-        if(ObjectUtil.isEmpty(bizOrg)) {
+        if (ObjectUtil.isEmpty(bizOrg)) {
             throw new CommonException("机构不存在,id值为:{}", id);
         }
         return bizOrg;
     }
 
+    @Override
+    public BizOrg queryByOrgCode(String code) {
+        return baseMapper.selectOne(new LambdaQueryWrapper<BizOrg>().eq(BizOrg::getCode, code).last("limit 1"));
+    }
+
     @Override
     public List<BizOrg> getAllOrgList() {
         return this.list(new LambdaQueryWrapper<BizOrg>().orderByAsc(BizOrg::getSortCode));
@@ -265,17 +270,17 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     public String getOrgIdByOrgFullNameWithCreate(String orgFullName) {
         List<BizOrg> cachedAllOrgList = this.getAllOrgList();
         List<Tree<String>> treeList = TreeUtil.build(cachedAllOrgList.stream().map(bizOrg ->
-                new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
+                        new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
                 .collect(Collectors.toList()), "0");
         return findOrgIdByOrgName("0", StrUtil.split(orgFullName, StrUtil.DASHED).iterator(), cachedAllOrgList, treeList);
     }
 
     public String findOrgIdByOrgName(String parentId, Iterator<String> iterator, List<BizOrg> cachedAllOrgList, List<Tree<String>> treeList) {
         String orgName = iterator.next();
-        if(ObjectUtil.isNotEmpty(treeList)) {
+        if (ObjectUtil.isNotEmpty(treeList)) {
             List<Tree<String>> findList = treeList.stream().filter(tree -> tree.getName().equals(orgName)).collect(Collectors.toList());
-            if(ObjectUtil.isNotEmpty(findList)) {
-                if(iterator.hasNext()) {
+            if (ObjectUtil.isNotEmpty(findList)) {
+                if (iterator.hasNext()) {
                     return findOrgIdByOrgName(findList.get(0).getId(), iterator, cachedAllOrgList, findList.get(0).getChildren());
                 } else {
                     return findList.get(0).getId();
@@ -283,7 +288,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
             }
         }
         String orgId = this.doCreateOrg(parentId, orgName, cachedAllOrgList);
-        if(iterator.hasNext()) {
+        if (iterator.hasNext()) {
             return findOrgIdByOrgName(orgId, iterator, cachedAllOrgList, CollectionUtil.newArrayList());
         } else {
             return orgId;
@@ -302,7 +307,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         bizOrg.setName(orgName);
         bizOrg.setCode(RandomUtil.randomString(10));
         bizOrg.setParentId(parentId);
-        bizOrg.setCategory("0".equals(parentId)?BizOrgCategoryEnum.COMPANY.getValue():BizOrgCategoryEnum.DEPT.getValue());
+        bizOrg.setCategory("0".equals(parentId) ? BizOrgCategoryEnum.COMPANY.getValue() : BizOrgCategoryEnum.DEPT.getValue());
         bizOrg.setSortCode(99);
         this.save(bizOrg);
         // 发布增加事件
@@ -323,7 +328,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
         // 定义机构集合
         Set<BizOrg> bizOrgSet = CollectionUtil.newHashSet();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             // 获取所有机构
             List<BizOrg> allOrgList = this.list();
             loginUserDataScope.forEach(orgId -> bizOrgSet.addAll(this.getParentListById(allOrgList, orgId, true)));
@@ -335,7 +340,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode);
         List<BizOrg> bizOrgList = this.list(lambdaQueryWrapper);
         List<TreeNode<String>> treeNodeList = bizOrgList.stream().map(bizOrg ->
-                new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
+                        new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
                 .collect(Collectors.toList());
         return TreeUtil.build(treeNodeList, "0");
     }
@@ -345,7 +350,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         LambdaQueryWrapper<BizOrg> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope);
         } else {
             return CollectionUtil.newArrayList();
@@ -353,10 +358,10 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         // 查询部分字段
         lambdaQueryWrapper.select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName,
                 BizOrg::getCategory, BizOrg::getSortCode);
-        if(ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getParentId())) {
+        if (ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getParentId())) {
             lambdaQueryWrapper.eq(BizOrg::getParentId, bizOrgSelectorOrgListParam.getParentId());
         }
-        if(ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizOrgSelectorOrgListParam.getSearchKey())) {
             lambdaQueryWrapper.like(BizOrg::getName, bizOrgSelectorOrgListParam.getSearchKey());
         }
         lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode);
@@ -368,7 +373,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
         LambdaQueryWrapper<BizUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             lambdaQueryWrapper.in(BizUser::getOrgId, loginUserDataScope);
         } else {
             return new Page<>();
@@ -386,7 +391,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
                 return new Page<>();
             }
         }
-        if(ObjectUtil.isNotEmpty(bizOrgSelectorUserParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizOrgSelectorUserParam.getSearchKey())) {
             lambdaQueryWrapper.like(BizUser::getName, bizOrgSelectorUserParam.getSearchKey());
         }
         lambdaQueryWrapper.orderByAsc(BizUser::getSortCode);
@@ -407,9 +412,9 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     public List<BizOrg> getChildListById(List<BizOrg> originDataList, String id, boolean includeSelf) {
         List<BizOrg> resultList = CollectionUtil.newArrayList();
         execRecursionFindChild(originDataList, id, resultList);
-        if(includeSelf) {
+        if (includeSelf) {
             BizOrg self = this.getById(originDataList, id);
-            if(ObjectUtil.isNotEmpty(self)) {
+            if (ObjectUtil.isNotEmpty(self)) {
                 resultList.add(self);
             }
         }
@@ -420,9 +425,9 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     public List<BizOrg> getParentListById(List<BizOrg> originDataList, String id, boolean includeSelf) {
         List<BizOrg> resultList = CollectionUtil.newArrayList();
         execRecursionFindParent(originDataList, id, resultList);
-        if(includeSelf) {
+        if (includeSelf) {
             BizOrg self = this.getById(originDataList, id);
-            if(ObjectUtil.isNotEmpty(self)) {
+            if (ObjectUtil.isNotEmpty(self)) {
                 resultList.add(self);
             }
         }
@@ -432,7 +437,7 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
 
     public void execRecursionFindChild(List<BizOrg> originDataList, String id, List<BizOrg> resultList) {
         originDataList.forEach(item -> {
-            if(item.getParentId().equals(id)) {
+            if (item.getParentId().equals(id)) {
                 resultList.add(item);
                 execRecursionFindChild(originDataList, item.getId(), resultList);
             }
@@ -441,9 +446,9 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
 
     public void execRecursionFindParent(List<BizOrg> originDataList, String id, List<BizOrg> resultList) {
         originDataList.forEach(item -> {
-            if(item.getId().equals(id)) {
+            if (item.getId().equals(id)) {
                 BizOrg parent = this.getById(originDataList, item.getParentId());
-                if(ObjectUtil.isNotEmpty(parent)) {
+                if (ObjectUtil.isNotEmpty(parent)) {
                     resultList.add(parent);
                 }
                 execRecursionFindParent(originDataList, item.getParentId(), resultList);
@@ -454,18 +459,18 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
     @Override
     public BizOrg getById(List<BizOrg> originDataList, String id) {
         int index = CollStreamUtil.toList(originDataList, BizOrg::getId).indexOf(id);
-        return index == -1?null:originDataList.get(index);
+        return index == -1 ? null : originDataList.get(index);
     }
 
     @Override
     public BizOrg getParentById(List<BizOrg> originDataList, String id) {
         BizOrg self = this.getById(originDataList, id);
-        return ObjectUtil.isNotEmpty(self)?self:this.getById(originDataList, self.getParentId());
+        return ObjectUtil.isNotEmpty(self) ? self : this.getById(originDataList, self.getParentId());
     }
 
     @Override
     public BizOrg getChildById(List<BizOrg> originDataList, String id) {
         int index = CollStreamUtil.toList(originDataList, BizOrg::getParentId).indexOf(id);
-        return index == -1?null:originDataList.get(index);
+        return index == -1 ? null : originDataList.get(index);
     }
 }

+ 45 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java

@@ -31,9 +31,11 @@ import vip.xiaonuo.biz.modular.org.entity.BizOrg;
 import vip.xiaonuo.biz.modular.position.entity.BizPosition;
 import vip.xiaonuo.biz.modular.user.entity.BizUser;
 import vip.xiaonuo.biz.modular.user.param.*;
+import vip.xiaonuo.biz.modular.user.result.BizMemberUserResult;
 import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult;
 import vip.xiaonuo.biz.modular.user.service.BizUserService;
 import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.annotation.CommonNoRepeat;
 import vip.xiaonuo.common.pojo.CommonResult;
 
 import java.io.IOException;
@@ -63,10 +65,24 @@ public class BizUserController {
     @SaCheckPermission("/biz/user/page")
     @GetMapping("/biz/user/page")
     public CommonResult<Page<BizUser>> page(BizUserPageParam bizUserPageParam) {
-
         return CommonResult.data(bizUserService.page(bizUserPageParam));
     }
 
+    /**
+     * 获取会员分页
+     *
+     * @author xuyuxiang
+     * @date 2022/4/24 20:00
+     */
+    @Operation(summary = "获取会员信息分页")
+    @SaCheckPermission("/biz/user/memberPage")
+    @GetMapping("/biz/user/memberPage")
+    public CommonResult<Page<BizMemberUserResult>> memberPage(BizUserPageParam bizUserPageParam) {
+        return CommonResult.data(bizUserService.memberPage(bizUserPageParam));
+    }
+
+
+
     /**
      * 添加人员
      *
@@ -293,4 +309,32 @@ public class BizUserController {
     public CommonResult<Page<BizUser>> userSelector(BizUserSelectorUserParam bizUserSelectorUserParam) {
         return CommonResult.data(bizUserService.userSelector(bizUserSelectorUserParam));
     }
+
+
+    /**
+     * 小程序注册
+     * @return
+     */
+    @Operation(summary = "小程序注册")
+    @GetMapping("/auth/c/wxRegister")
+    @CommonNoRepeat
+    public CommonResult<String> wxRegister(WxUserRegisterParam wxUserRegisterParam) {
+        bizUserService.wxRegister(wxUserRegisterParam);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 短信发送
+     * @return
+     */
+    @Operation(summary = "短信发送")
+    @GetMapping("/auth/c/smsSend")
+    @CommonNoRepeat
+    public CommonResult<String> smsSend(SmsSendParam smsSendParam) {
+        bizUserService.smsSend(smsSendParam);
+        return CommonResult.ok();
+    }
+
+
 }

+ 9 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java

@@ -73,6 +73,10 @@ public class BizUser extends CommonEntity {
     @Schema(description = "用户推荐码")
     private String userReferralCode;
 
+    /**推荐人用户id*/
+    @Schema(description = "推荐人用户id")
+    private String referralUser;
+
     /**用户类型: 1. 管理员 2.门店 3.会员*/
     @Schema(description = "用户类型: 1. 管理员 2.门店 3.会员")
     private Integer userType;
@@ -85,6 +89,11 @@ public class BizUser extends CommonEntity {
     @Schema(description = "代金券余额")
     private BigDecimal voucherBalance;
 
+    /**openId*/
+    @Schema(description = "openId")
+    private String openId;
+
+
     /** 昵称 */
     @Schema(description = "昵称")
     @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)

+ 8 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/BizUserMapper.java

@@ -12,8 +12,13 @@
  */
 package vip.xiaonuo.biz.modular.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.param.BizUserPageParam;
+import vip.xiaonuo.biz.modular.user.result.BizMemberUserResult;
 
 /**
  * 人员Mapper接口
@@ -23,4 +28,7 @@ import vip.xiaonuo.biz.modular.user.entity.BizUser;
  **/
 public interface BizUserMapper extends BaseMapper<BizUser> {
 
+
+    Page<BizMemberUserResult> memberPage(@Param("page") Page page, @Param("ew") QueryWrapper<BizUser> queryWrapper);
+
 }

+ 15 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml

@@ -2,4 +2,19 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.biz.modular.user.mapper.BizUserMapper">
 
+    <select id="memberPage" resultType="vip.xiaonuo.biz.modular.user.result.BizMemberUserResult">
+        select
+            ID,
+            ACCOUNT,
+            NAME,
+            GENDER,
+            PHONE,
+            USER_REFERRAL_CODE,
+            USER_TYPE,
+            ACCOUNT_BALANCE,
+            VOUCHER_BALANCE,
+            CREATE_TIME
+        FROM SYS_USER
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 22 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/SmsSendParam.java

@@ -0,0 +1,22 @@
+package vip.xiaonuo.biz.modular.user.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wulei
+ * @date 2025/2/5
+ * @Version 1.0
+ * @Description TODO
+ */
+@Setter
+@Getter
+public class SmsSendParam {
+
+    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "手机号不能为空")
+    private String phone;
+
+}

+ 44 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/WxUserRegisterParam.java

@@ -0,0 +1,44 @@
+package vip.xiaonuo.biz.modular.user.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wulei
+ * @date 2025/2/5
+ * @Version 1.0
+ * @Description TODO
+ */
+@Setter
+@Getter
+public class WxUserRegisterParam {
+
+    @Schema(description = "微信code", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "openId不能为空")
+    private String openId;
+
+    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "手机号不能为空")
+    private String phone;
+
+    @Schema(description = "角色类型 1.消费者 2.门店", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "角色类型不能为空")
+    private String roleType;
+
+    @Schema(description = "name", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "姓名不能为空")
+    private String name;
+
+    @Schema(description = "短信验证码")
+    private String messageCode;
+
+    @Schema(description = "推荐人编码")
+    private String referralCode;
+
+    @Schema(description = "门店编码")
+    private String orgCode;
+
+
+}

+ 86 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizMemberUserResult.java

@@ -0,0 +1,86 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.user.result;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.biz.modular.org.entity.BizOrg;
+import vip.xiaonuo.biz.modular.position.entity.BizPosition;
+import vip.xiaonuo.common.handler.CommonSm4CbcTypeHandler;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 人员实体
+ *
+ * @author xuyuxiang
+ * @date 2022/4/21 16:13
+ **/
+@Getter
+@Setter
+public class BizMemberUserResult extends CommonEntity {
+
+    /** id */
+    @TableId
+    @Schema(description = "id")
+    private String id;
+
+    /** 账号 */
+    @Schema(description = "账号")
+    private String account;
+
+    /** 姓名 */
+    @Schema(description = "姓名")
+    private String name;
+
+    /**用户推荐码*/
+    @Schema(description = "用户推荐码")
+    private String userReferralCode;
+
+    /**推荐人用户id*/
+    @Schema(description = "推荐人用户id")
+    private String referralUser;
+
+    /**用户类型: 1. 管理员 2.门店 3.会员*/
+    @Schema(description = "用户类型: 1. 管理员 2.门店 3.会员")
+    private Integer userType;
+
+    /**账户余额*/
+    @Schema(description = "账户余额")
+    private BigDecimal accountBalance;
+
+    /**代金券余额*/
+    @Schema(description = "代金券余额")
+    private BigDecimal voucherBalance;
+
+    /** 性别 */
+    @Schema(description = "性别")
+    @TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)
+    @Trans(type = TransType.DICTIONARY, key = "GENDER")
+    private String gender;
+
+    /** 用户状态 */
+    @Schema(description = "用户状态")
+    private String userStatus;
+
+}

+ 18 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java

@@ -20,6 +20,7 @@ import vip.xiaonuo.biz.modular.org.entity.BizOrg;
 import vip.xiaonuo.biz.modular.position.entity.BizPosition;
 import vip.xiaonuo.biz.modular.user.entity.BizUser;
 import vip.xiaonuo.biz.modular.user.param.*;
+import vip.xiaonuo.biz.modular.user.result.BizMemberUserResult;
 import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult;
 
 import java.io.IOException;
@@ -41,6 +42,13 @@ public interface BizUserService extends IService<BizUser> {
      */
     Page<BizUser> page(BizUserPageParam bizUserPageParam);
 
+    /**
+     * 获取会员信息分页
+     * @param bizUserPageParam
+     * @return
+     */
+    Page<BizMemberUserResult> memberPage(BizUserPageParam bizUserPageParam);
+
     /**
      * 添加人员
      *
@@ -83,7 +91,7 @@ public interface BizUserService extends IService<BizUser> {
 
     /**
      * 禁用人员
-     * 
+     *
      * @author xuyuxiang
      * @date 2022/7/5 18:20
      **/
@@ -178,4 +186,13 @@ public interface BizUserService extends IService<BizUser> {
      * @date 2022/4/24 20:08
      */
     Page<BizUser> userSelector(BizUserSelectorUserParam bizUserSelectorUserParam);
+
+    /**
+     * 小程序注册
+     * @param wxUserRegisterParam
+     */
+    void wxRegister(WxUserRegisterParam wxUserRegisterParam);
+
+
+    void smsSend(SmsSendParam smsSendParam);
 }

+ 175 - 61
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java

@@ -29,6 +29,7 @@ import cn.hutool.core.lang.tree.TreeNode;
 import cn.hutool.core.lang.tree.TreeUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.PhoneUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
@@ -65,16 +66,21 @@ import vip.xiaonuo.biz.modular.user.enums.BizRoleCategoryEnum;
 import vip.xiaonuo.biz.modular.user.enums.BizUserStatusEnum;
 import vip.xiaonuo.biz.modular.user.mapper.BizUserMapper;
 import vip.xiaonuo.biz.modular.user.param.*;
+import vip.xiaonuo.biz.modular.user.result.BizMemberUserResult;
 import vip.xiaonuo.biz.modular.user.result.BizUserExportResult;
 import vip.xiaonuo.biz.modular.user.result.BizUserRoleResult;
 import vip.xiaonuo.biz.modular.user.service.BizUserService;
+import vip.xiaonuo.common.cache.CommonCacheOperator;
+import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.excel.CommonExcelCustomMergeStrategy;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.listener.CommonDataChangeEventCenter;
 import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.common.pojo.CommonEntity;
 import vip.xiaonuo.common.util.*;
 import vip.xiaonuo.dev.api.DevConfigApi;
+import vip.xiaonuo.dev.api.DevSmsApi;
 import vip.xiaonuo.sys.api.SysRoleApi;
 import vip.xiaonuo.sys.api.SysUserApi;
 
@@ -117,6 +123,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     @Resource
     private BizPositionService bizPositionService;
 
+    @Resource
+    private CommonCacheOperator commonCacheOperator;
+    @Resource
+    private DevSmsApi devSmsApi;
+
+
     @Override
     public Page<BizUser> page(BizUserPageParam bizUserPageParam) {
         QueryWrapper<BizUser> queryWrapper = new QueryWrapper<BizUser>().checkSqlInjection();
@@ -139,9 +151,11 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         }
         // 排除超管
         queryWrapper.lambda().ne(BizUser::getAccount, BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue());
+        //排除会员
+        queryWrapper.lambda().ne(BizUser::getUserType, 3);
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             queryWrapper.lambda().in(BizUser::getOrgId, loginUserDataScope);
         } else {
             queryWrapper.lambda().eq(BizUser::getId, StpUtil.getLoginIdAsString());
@@ -149,12 +163,28 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
+    @Override
+    public Page<BizMemberUserResult> memberPage(BizUserPageParam bizUserPageParam) {
+        QueryWrapper<BizUser> queryWrapper = new QueryWrapper<BizUser>().checkSqlInjection();
+        if (ObjectUtil.isNotEmpty(bizUserPageParam.getSearchKey())) {
+            queryWrapper.lambda().and(q -> q.like(BizUser::getAccount, bizUserPageParam.getSearchKey())
+                    .or().like(BizUser::getName, bizUserPageParam.getSearchKey()));
+        }
+        if (ObjectUtil.isNotEmpty(bizUserPageParam.getUserStatus())) {
+            queryWrapper.lambda().eq(BizUser::getUserStatus, bizUserPageParam.getUserStatus());
+        }
+        queryWrapper.lambda().eq(BizUser::getUserType, 3);
+        queryWrapper.lambda().eq(CommonEntity::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        queryWrapper.lambda().orderByDesc(CommonEntity::getCreateTime);
+        return baseMapper.memberPage(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(BizUserAddParam bizUserAddParam) {
         checkParam(bizUserAddParam);
         BizUser bizUser = BeanUtil.toBean(bizUserAddParam, BizUser.class);
-        if(ObjectUtil.isEmpty(bizUser.getAvatar())) {
+        if (ObjectUtil.isEmpty(bizUser.getAvatar())) {
             // 设置默认头像
             bizUser.setAvatar(CommonAvatarUtil.generateImg(bizUser.getName()));
         }
@@ -171,8 +201,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     private void checkParam(BizUserAddParam bizUserAddParam) {
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUserAddParam.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUserAddParam.getOrgId())) {
                 throw new CommonException("您没有权限在该机构下增加人员,机构id:{}", bizUserAddParam.getOrgId());
             }
         } else {
@@ -182,8 +212,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 .eq(BizUser::getAccount, bizUserAddParam.getAccount())) > 0) {
             throw new CommonException("存在重复的账号,账号为:{}", bizUserAddParam.getAccount());
         }
-        if(ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) {
-            if(!PhoneUtil.isMobile(bizUserAddParam.getPhone())) {
+        if (ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) {
+            if (!PhoneUtil.isMobile(bizUserAddParam.getPhone())) {
                 throw new CommonException("手机号码:{}格式错误", bizUserAddParam.getPhone());
             }
             if (this.count(new LambdaQueryWrapper<BizUser>()
@@ -191,8 +221,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 throw new CommonException("存在重复的手机号,手机号为:{}", bizUserAddParam.getPhone());
             }
         }
-        if(ObjectUtil.isNotEmpty(bizUserAddParam.getEmail())) {
-            if(!CommonEmailUtil.isEmail(bizUserAddParam.getEmail())) {
+        if (ObjectUtil.isNotEmpty(bizUserAddParam.getEmail())) {
+            if (!CommonEmailUtil.isEmail(bizUserAddParam.getEmail())) {
                 throw new CommonException("邮箱:{}格式错误", bizUserAddParam.getEmail());
             }
             if (this.count(new LambdaQueryWrapper<BizUser>()
@@ -209,7 +239,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         checkParam(bizUserEditParam);
         boolean updateSuperAdminAccount = bizUser.getAccount().equals(BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue()) &&
                 !bizUserEditParam.getAccount().equals(BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue());
-        if(updateSuperAdminAccount) {
+        if (updateSuperAdminAccount) {
             throw new CommonException("不可修改系统内置超管人员账号");
         }
         BeanUtil.copyProperties(bizUserEditParam, bizUser);
@@ -222,12 +252,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     private void checkParam(BizUserEditParam bizUserEditParam) {
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUserEditParam.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUserEditParam.getOrgId())) {
                 throw new CommonException("您没有权限编辑该机构下的人员,机构id:{}", bizUserEditParam.getOrgId());
             }
         } else {
-            if(!bizUserEditParam.getId().equals(StpUtil.getLoginIdAsString())) {
+            if (!bizUserEditParam.getId().equals(StpUtil.getLoginIdAsString())) {
                 throw new CommonException("您没有权限编辑该机构下的人员,机构id:{}", bizUserEditParam.getOrgId());
             }
         }
@@ -236,8 +266,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 .ne(BizUser::getId, bizUserEditParam.getId())) > 0) {
             throw new CommonException("存在重复的账号,账号为:{}", bizUserEditParam.getAccount());
         }
-        if(ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) {
-            if(!PhoneUtil.isMobile(bizUserEditParam.getPhone())) {
+        if (ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) {
+            if (!PhoneUtil.isMobile(bizUserEditParam.getPhone())) {
                 throw new CommonException("手机号码:{}格式错误", bizUserEditParam.getPhone());
             }
             if (this.count(new LambdaQueryWrapper<BizUser>()
@@ -246,8 +276,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 throw new CommonException("存在重复的手机号,手机号为:{}", bizUserEditParam.getPhone());
             }
         }
-        if(ObjectUtil.isNotEmpty(bizUserEditParam.getEmail())) {
-            if(!CommonEmailUtil.isEmail(bizUserEditParam.getEmail())) {
+        if (ObjectUtil.isNotEmpty(bizUserEditParam.getEmail())) {
+            if (!CommonEmailUtil.isEmail(bizUserEditParam.getEmail())) {
                 throw new CommonException("邮箱:{}格式错误", bizUserEditParam.getEmail());
             }
             if (this.count(new LambdaQueryWrapper<BizUser>()
@@ -262,23 +292,23 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     @Override
     public void delete(List<BizUserIdParam> bizUserIdParamList) {
         List<String> bizUserIdList = CollStreamUtil.toList(bizUserIdParamList, BizUserIdParam::getId);
-        if(ObjectUtil.isNotEmpty(bizUserIdList)) {
+        if (ObjectUtil.isNotEmpty(bizUserIdList)) {
             boolean containsSuperAdminAccount = this.listByIds(bizUserIdList).stream().map(BizUser::getAccount)
                     .collect(Collectors.toSet()).contains(BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue());
-            if(containsSuperAdminAccount) {
+            if (containsSuperAdminAccount) {
                 throw new CommonException("不可删除系统内置超管人员");
             }
             // 获取这些人员的的机构id集合
             Set<String> userOrgIdList = this.listByIds(bizUserIdList).stream().map(BizUser::getOrgId).collect(Collectors.toSet());
             // 校验数据范围
             List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-            if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-                if(!loginUserDataScope.containsAll(userOrgIdList)) {
+            if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+                if (!loginUserDataScope.containsAll(userOrgIdList)) {
                     throw new CommonException("您没有权限删除这些机构下的人员,机构id:{}",
                             CollectionUtil.subtract(userOrgIdList, loginUserDataScope));
                 }
             } else {
-                if(bizUserIdList.size() != 1 || !bizUserIdList.get(0).equals(StpUtil.getLoginIdAsString())) {
+                if (bizUserIdList.size() != 1 || !bizUserIdList.get(0).equals(StpUtil.getLoginIdAsString())) {
                     throw new CommonException("您没有权限删除这些机构下的人员,机构id:{}", userOrgIdList);
                 }
             }
@@ -286,7 +316,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             this.update(new LambdaUpdateWrapper<BizUser>().in(BizUser::getDirectorId, bizUserIdList).set(BizUser::getDirectorId, null));
 
             // 清除【将这些人员作为兼任岗位的主管】的信息
-            this.list(new LambdaQueryWrapper<BizUser>() .isNotNull(BizUser::getPositionJson)).forEach(bizUser -> {
+            this.list(new LambdaQueryWrapper<BizUser>().isNotNull(BizUser::getPositionJson)).forEach(bizUser -> {
                 List<JSONObject> handledJsonObjectList = JSONUtil.toList(JSONUtil.parseArray(bizUser.getPositionJson()),
                         JSONObject.class).stream().peek(jsonObject -> {
                     String directorId = jsonObject.getStr("directorId");
@@ -320,12 +350,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         BizUser bizUser = this.detail(bizUserIdParam);
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUser.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUser.getOrgId())) {
                 throw new CommonException("您没有权限禁用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         } else {
-            if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
+            if (!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
                 throw new CommonException("您没有权限禁用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         }
@@ -339,12 +369,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         BizUser bizUser = this.detail(bizUserIdParam);
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUser.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUser.getOrgId())) {
                 throw new CommonException("您没有权限启用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         } else {
-            if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
+            if (!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
                 throw new CommonException("您没有权限启用该机构下的人员:{},机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         }
@@ -358,12 +388,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         BizUser bizUser = this.detail(bizUserIdParam);
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUser.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUser.getOrgId())) {
                 throw new CommonException("您没有权限为该机构下的人员:{}重置密码,机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         } else {
-            if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
+            if (!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
                 throw new CommonException("您没有权限为该机构下的人员:{}重置密码,机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         }
@@ -383,12 +413,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         BizUser bizUser = this.queryEntity(bizUserGrantRoleParam.getId());
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(!loginUserDataScope.contains(bizUser.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (!loginUserDataScope.contains(bizUser.getOrgId())) {
                 throw new CommonException("您没有权限为该机构下的人员:{}授权角色,机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         } else {
-            if(!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
+            if (!bizUser.getId().equals(StpUtil.getLoginIdAsString())) {
                 throw new CommonException("您没有权限为该机构下的人员:{}授权角色,机构id:{}", bizUser.getName(), bizUser.getOrgId());
             }
         }
@@ -404,12 +434,12 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             queryWrapper.lambda().ne(BizUser::getAccount, BizBuildInEnum.BUILD_IN_USER_ACCOUNT.getValue());
             // 校验数据范围
             List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-            if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
                 queryWrapper.lambda().in(BizUser::getOrgId, loginUserDataScope);
             } else {
                 queryWrapper.lambda().eq(BizUser::getId, StpUtil.getLoginIdAsString());
             }
-            if(ObjectUtil.isNotEmpty(bizUserExportParam.getUserIds())) {
+            if (ObjectUtil.isNotEmpty(bizUserExportParam.getUserIds())) {
                 queryWrapper.lambda().in(BizUser::getId, StrUtil.split(bizUserExportParam.getUserIds(), StrUtil.COMMA));
             } else {
                 if (ObjectUtil.isNotEmpty(bizUserExportParam.getSearchKey())) {
@@ -423,7 +453,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             }
             String fileName = "SNOWY系统B端人员信息清单.xlsx";
             List<BizUser> bizUserList = this.list(queryWrapper);
-            if(ObjectUtil.isEmpty(bizUserList)) {
+            if (ObjectUtil.isEmpty(bizUserList)) {
                 throw new CommonException("无数据可导出");
             }
             transService.transBatch(bizUserList);
@@ -432,11 +462,11 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                     .map(bizUser -> {
                         BizUserExportResult bizUserExportResult = new BizUserExportResult();
                         BeanUtil.copyProperties(bizUser, bizUserExportResult);
-                        bizUserExportResult.setGroupName(ObjectUtil.isNotEmpty(bizUserExportResult.getOrgName())?
-                                bizUserExportResult.getOrgName():"无组织");
+                        bizUserExportResult.setGroupName(ObjectUtil.isNotEmpty(bizUserExportResult.getOrgName()) ?
+                                bizUserExportResult.getOrgName() : "无组织");
                         // 状态枚举转为文字
                         bizUserExportResult.setUserStatus(bizUserExportResult.getUserStatus()
-                                .equalsIgnoreCase(BizUserStatusEnum.ENABLE.getValue())?"正常":"停用");
+                                .equalsIgnoreCase(BizUserStatusEnum.ENABLE.getValue()) ? "正常" : "停用");
                         // 将base64转为byte数组
                         if (ObjectUtil.isNotEmpty(bizUser.getAvatar())) {
                             bizUserExportResult.setAvatar(ImgUtil.toBytes(ImgUtil.toImage(StrUtil
@@ -498,7 +528,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                             WriteCellData<?> cellData = context.getFirstCellData();
                             WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
                             Integer rowIndex = context.getRowIndex();
-                            if(rowIndex == 0) {
+                            if (rowIndex == 0) {
                                 WriteFont headWriteFont = new WriteFont();
                                 headWriteFont.setFontName("宋体");
                                 headWriteFont.setBold(true);
@@ -511,7 +541,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                     .registerWriteHandler(new AbstractRowHeightStyleStrategy() {
                         @Override
                         protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
-                            if(relativeRowIndex == 0) {
+                            if (relativeRowIndex == 0) {
                                 // 表头第一行
                                 row.setHeightInPoints(34);
                             } else {
@@ -519,6 +549,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                                 row.setHeightInPoints(30);
                             }
                         }
+
                         @Override
                         protected void setContentColumnHeight(Row row, int relativeRowIndex) {
                             // 内容行
@@ -551,7 +582,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             // 构造填充的参数
             Map<String, Object> map = BeanUtil.beanToMap(bizUser);
             String avatarBase64;
-            if(ObjectUtil.isNotEmpty(bizUser.getAvatar())) {
+            if (ObjectUtil.isNotEmpty(bizUser.getAvatar())) {
                 avatarBase64 = bizUser.getAvatar();
             } else {
                 avatarBase64 = CommonAvatarUtil.generateImg(bizUser.getName());
@@ -560,11 +591,11 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             ImageEntity imageEntity = new ImageEntity(ImgUtil.toBytes(ImgUtil.toImage(StrUtil
                     .split(avatarBase64, StrUtil.COMMA).get(1)), ImgUtil.IMAGE_TYPE_PNG), 120, 160);
             map.put("avatar", imageEntity);
-            if(ObjectUtil.isNotEmpty(bizUser.getBirthday())) {
+            if (ObjectUtil.isNotEmpty(bizUser.getBirthday())) {
                 try {
                     // 年龄
                     long age = cn.hutool.core.date.DateUtil.betweenYear(cn.hutool.core.date.DateUtil.parseDate(bizUser.getBirthday()), DateTime.now(), true);
-                    if(age != 0) {
+                    if (age != 0) {
                         map.put("age", age + "岁");
                     }
                 } catch (Exception ignored) {
@@ -587,10 +618,10 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             CommonResponseUtil.renderError(response, "导出失败");
         } finally {
             // 删除临时文件
-            if(ObjectUtil.isNotEmpty(destTemplateFile)) {
+            if (ObjectUtil.isNotEmpty(destTemplateFile)) {
                 FileUtil.del(destTemplateFile);
             }
-            if(ObjectUtil.isNotEmpty(resultFile)) {
+            if (ObjectUtil.isNotEmpty(resultFile)) {
                 FileUtil.del(resultFile);
             }
         }
@@ -599,7 +630,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     @Override
     public BizUser queryEntity(String id) {
         BizUser bizUser = this.getById(id);
-        if(ObjectUtil.isEmpty(bizUser)) {
+        if (ObjectUtil.isEmpty(bizUser)) {
             throw new CommonException("人员不存在,id值为:{}", id);
         }
         return bizUser;
@@ -614,7 +645,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
         // 定义机构集合
         Set<BizOrg> bizOrgSet = CollectionUtil.newHashSet();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             // 获取所有机构
             List<BizOrg> allOrgList = bizOrgService.list();
             loginUserDataScope.forEach(orgId -> bizOrgSet.addAll(bizOrgService.getParentListById(allOrgList, orgId, true)));
@@ -626,7 +657,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode);
         List<BizOrg> bizOrgList = bizOrgService.list(lambdaQueryWrapper);
         List<TreeNode<String>> treeNodeList = bizOrgList.stream().map(bizOrg ->
-                new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
+                        new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(), bizOrg.getName(), bizOrg.getSortCode()))
                 .collect(Collectors.toList());
         return TreeUtil.build(treeNodeList, "0");
     }
@@ -636,7 +667,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         LambdaQueryWrapper<BizOrg> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             lambdaQueryWrapper.in(BizOrg::getId, loginUserDataScope);
         } else {
             return new Page<>();
@@ -644,10 +675,10 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         // 查询部分字段
         lambdaQueryWrapper.select(BizOrg::getId, BizOrg::getParentId, BizOrg::getName,
                 BizOrg::getCategory, BizOrg::getSortCode);
-        if(ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getParentId())) {
+        if (ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getParentId())) {
             lambdaQueryWrapper.eq(BizOrg::getParentId, bizUserSelectorOrgListParam.getParentId());
         }
-        if(ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizUserSelectorOrgListParam.getSearchKey())) {
             lambdaQueryWrapper.like(BizOrg::getName, bizUserSelectorOrgListParam.getSearchKey());
         }
         lambdaQueryWrapper.orderByAsc(BizOrg::getSortCode);
@@ -659,7 +690,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         LambdaQueryWrapper<BizPosition> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             lambdaQueryWrapper.in(BizPosition::getOrgId, loginUserDataScope);
         } else {
             return new Page<>();
@@ -667,10 +698,10 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         // 查询部分字段
         lambdaQueryWrapper.select(BizPosition::getId, BizPosition::getOrgId, BizPosition::getName,
                 BizPosition::getCategory, BizPosition::getSortCode);
-        if(ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getOrgId())) {
             lambdaQueryWrapper.eq(BizPosition::getOrgId, bizUserSelectorPositionParam.getOrgId());
         }
-        if(ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizUserSelectorPositionParam.getSearchKey())) {
             lambdaQueryWrapper.like(BizPosition::getName, bizUserSelectorPositionParam.getSearchKey());
         }
         lambdaQueryWrapper.orderByAsc(BizPosition::getSortCode);
@@ -682,9 +713,9 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     public Page<BizUserRoleResult> roleSelector(BizUserSelectorRoleParam bizUserSelectorRoleParam) {
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
-            if(ObjectUtil.isNotEmpty(bizUserSelectorRoleParam.getOrgId())) {
-                if(loginUserDataScope.contains(bizUserSelectorRoleParam.getOrgId())) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            if (ObjectUtil.isNotEmpty(bizUserSelectorRoleParam.getOrgId())) {
+                if (loginUserDataScope.contains(bizUserSelectorRoleParam.getOrgId())) {
                     return BeanUtil.toBean(sysRoleApi.roleSelector(bizUserSelectorRoleParam.getOrgId(), bizUserSelectorRoleParam.getCategory(),
                             bizUserSelectorRoleParam.getSearchKey(), loginUserDataScope, true), Page.class);
                 } else {
@@ -710,7 +741,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         LambdaQueryWrapper<BizUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
-        if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
             lambdaQueryWrapper.in(BizUser::getOrgId, loginUserDataScope);
         } else {
             return new Page<>();
@@ -728,10 +759,93 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 return new Page<>();
             }
         }
-        if(ObjectUtil.isNotEmpty(bizUserSelectorUserParam.getSearchKey())) {
+        if (ObjectUtil.isNotEmpty(bizUserSelectorUserParam.getSearchKey())) {
             lambdaQueryWrapper.like(BizUser::getName, bizUserSelectorUserParam.getSearchKey());
         }
+        //排除会员
+        lambdaQueryWrapper.ne(BizUser::getUserType, 3);
         lambdaQueryWrapper.orderByAsc(BizUser::getSortCode);
         return this.page(CommonPageRequest.defaultPage(), lambdaQueryWrapper);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void wxRegister(WxUserRegisterParam wxUserRegisterParam) {
+        // 校验短信验证码
+        String messageCode = commonCacheOperator.get(wxUserRegisterParam.getPhone()) + "";
+        if (ObjectUtil.isEmpty(messageCode)) {
+            throw new CommonException("验证码不存在");
+        }
+        if (ObjectUtil.notEqual(messageCode, wxUserRegisterParam.getMessageCode())) {
+            throw new CommonException("验证码错误");
+        }
+//        //校验通过删除缓存
+//        commonCacheOperator.remove(wxUserRegisterParam.getPhone());
+
+        String roleId = "";
+        // 保存用户信息
+        BizUser bizUser = new BizUser();
+        if (ObjectUtil.equal(wxUserRegisterParam.getRoleType(), "2")) {
+            if (ObjectUtil.isEmpty(wxUserRegisterParam.getOrgCode())) {
+                throw new CommonException("门店编码不能为空");
+            }
+            //校验门店编码是否正确
+            BizOrg bizOrg = bizOrgService.queryByOrgCode(wxUserRegisterParam.getOrgCode());
+            if (ObjectUtil.isNull(bizOrg)) {
+                throw new CommonException("门店编码错误");
+            }
+            // 门店角色
+            bizUser.setUserType(2);
+            //门店id
+            bizUser.setOrgId(bizOrg.getId());
+            roleId = "1886699979674595330";
+        } else {
+            //会员角色
+            bizUser.setUserType(3);
+            //门店id 挂载最外层
+            bizUser.setOrgId("1543842934270394368");
+            roleId = "1886674709466906625";
+        }
+        // 校验推荐人
+        if (ObjectUtil.isNotEmpty(wxUserRegisterParam.getReferralCode())) {
+            BizUser referralUser = baseMapper.selectOne(new LambdaQueryWrapper<BizUser>()
+                    .eq(BizUser::getUserReferralCode, wxUserRegisterParam.getReferralCode())
+                    .last("limit 1"));
+            if (ObjectUtil.isNull(referralUser)) {
+                throw new CommonException("推荐人不存在");
+            }
+        }
+        // 校验openId或者手机号是否存在
+        if (ObjectUtil.isNull(baseMapper.selectOne(new LambdaQueryWrapper<BizUser>()
+                .eq(BizUser::getOpenId, wxUserRegisterParam.getOpenId())
+                .or()
+                .eq(BizUser::getAccount, wxUserRegisterParam.getPhone())
+                .last("limit 1")))) {
+            throw new CommonException("该手机号已注册,请勿重复注册");
+        }
+        bizUser.setAccount(wxUserRegisterParam.getPhone());
+        bizUser.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(wxUserRegisterParam.getPhone()));
+        // 设置默认密码
+        bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
+        // 设置状态
+        bizUser.setUserStatus("ENABLE");
+        //生成推荐码
+        bizUser.setUserReferralCode(DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN) + RandomUtil.randomNumbers(4));
+        bizUser.setName(wxUserRegisterParam.getName());
+        this.save(bizUser);
+        sysRoleApi.grantUserRole(bizUser.getId(), roleId);
+    }
+
+    @Override
+    public void smsSend(SmsSendParam smsSendParam) {
+        // 查询缓存是否存在
+        String messageCode = commonCacheOperator.get(smsSendParam.getPhone()) + "";
+        if (ObjectUtil.isNotEmpty(messageCode)) {
+            throw new CommonException("请勿重复发送");
+        }
+        String code = RandomUtil.randomNumbers(5);
+        //发送短信
+        devSmsApi.sendSmsAliyun(smsSendParam.getPhone(), null, "SMS_465365543", "{\"code\":\"" + code + "\"}");
+        commonCacheOperator.put(smsSendParam.getPhone(), code, 300);
+    }
 }

+ 9 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java

@@ -107,4 +107,13 @@ public class SysRoleApiProvider implements SysRoleApi {
         }
         sysRelationService.saveRelationBatchWithAppend(superAdminRoleId, menuIdList, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue(), extJsonList);
     }
+
+    @Override
+    public void grantUserRole(String userId, String roleId) {
+        SysRelation sysRelation = new SysRelation();
+        sysRelation.setObjectId(userId);
+        sysRelation.setTargetId(roleId);
+        sysRelation.setCategory(SysRelationCategoryEnum.SYS_USER_HAS_ROLE.getValue());
+        sysRelationService.save(sysRelation);
+    }
 }

+ 4 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java

@@ -73,6 +73,10 @@ public class SysUser extends CommonEntity {
     @Schema(description = "用户推荐码")
     private String userReferralCode;
 
+    /**推荐人用户id*/
+    @Schema(description = "推荐人用户id")
+    private String referralUser;
+
     /**用户类型: 1. 管理员 2.门店 3.会员*/
     @Schema(description = "用户类型: 1. 管理员 2.门店 3.会员")
     private Integer userType;

+ 6 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java

@@ -239,6 +239,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         } else {
             queryWrapper.lambda().orderByAsc(SysUser::getSortCode);
         }
+        //排除会员
+        queryWrapper.lambda().ne(SysUser::getUserType, 3);
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
@@ -255,6 +257,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         sysUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
         // 设置状态
         sysUser.setUserStatus(SysUserStatusEnum.ENABLE.getValue());
+        //生成推荐码
+        sysUser.setUserReferralCode(DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN)+ RandomUtil.randomNumbers(4));
         this.save(sysUser);
 
         // 发布增加事件
@@ -1514,6 +1518,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             if (ObjectUtil.isNotEmpty(sysUserSelectorUserParam.getSearchKey())) {
                 lambdaQueryWrapper.like(SysUser::getName, sysUserSelectorUserParam.getSearchKey());
             }
+            //排除会员
+            lambdaQueryWrapper.ne(SysUser::getUserType, 3);
             lambdaQueryWrapper.orderByAsc(SysUser::getSortCode);
             return this.page(CommonPageRequest.defaultPage(), lambdaQueryWrapper);
         }

+ 3 - 0
snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java

@@ -122,6 +122,9 @@ public class GlobalConfigure implements WebMvcConfigurer {
             "/auth/c/getPhoneValidCode",
             "/auth/c/doLogin",
             "/auth/c/doLoginByPhone",
+            /* 小程序注册使用 */
+            "/auth/c/wxRegister",
+            "/auth/c/smsSend",
 
             "/auth/b/getPicCaptcha",
             "/auth/b/getPhoneValidCode",