Browse Source

将 sys_customer 重构为 sys_employee, 新增登录策略并修改部分接口

Huanyi 2 ngày trước cách đây
mục cha
commit
fdedb16d48
43 tập tin đã thay đổi với 1028 bổ sung673 xóa
  1. 10 10
      ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java
  2. 48 17
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
  3. 14 16
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/WechatAppletAuthStrategy.java
  4. 1 1
      ruoyi-admin/src/main/resources/application.yml
  5. 10 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
  6. 2 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  7. 5 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java
  8. 20 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/EmployeeStatus.java
  9. 36 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserSource.java
  10. 0 16
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/CustomerService.java
  11. 16 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/EmployeeService.java
  12. 2 2
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
  13. 7 7
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/EmployeeNameTranslationImpl.java
  14. 1 1
      ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  15. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysComplaintController.java
  16. 0 120
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomerController.java
  17. 145 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysEmployeeController.java
  18. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysComplaint.java
  19. 15 12
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysEmployee.java
  20. 4 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysComplaintBo.java
  21. 18 15
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysEmployeeBo.java
  22. 8 8
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysComplaintVo.java
  23. 12 18
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysEmployeeVo.java
  24. 0 14
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCustomerMapper.java
  25. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysEmployeeMapper.java
  26. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysComplaintService.java
  27. 0 69
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomerService.java
  28. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysEmployeeService.java
  29. 30 30
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysComplaintServiceImpl.java
  30. 0 275
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomerServiceImpl.java
  31. 315 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysEmployeeServiceImpl.java
  32. 4 0
      ruoyi-modules/ruoyi-workflow/pom.xml
  33. 11 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpClientController.java
  34. 9 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpOrderController.java
  35. 5 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/ErpOrderQuery.java
  36. 1 1
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderVo.java
  37. 7 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/mapper/ErpOrderMapper.java
  38. 5 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpClientService.java
  39. 5 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpOrderService.java
  40. 8 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpClientServiceImpl.java
  41. 58 6
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpOrderServiceImpl.java
  42. 74 0
      ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/ErpOrderMapper.xml
  43. 26 23
      script/sql/sqlserver/v1/HS_ERP_Order-create.sql

+ 10 - 10
ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java

@@ -20,11 +20,11 @@ import org.dromara.common.log.event.LogininforEvent;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
 import org.dromara.common.web.config.properties.CaptchaProperties;
-import org.dromara.system.domain.SysCustomer;
+import org.dromara.system.domain.SysEmployee;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.domain.vo.SysOssVo;
-import org.dromara.system.mapper.SysCustomerMapper;
+import org.dromara.system.mapper.SysEmployeeMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.ISysUserService;
 import org.dromara.system.service.ISysUserService;
@@ -41,7 +41,7 @@ public class SysRegisterService {
 
 
     private final ISysUserService userService;
     private final ISysUserService userService;
     private final SysUserMapper userMapper;
     private final SysUserMapper userMapper;
-    private final SysCustomerMapper customerMapper;
+    private final SysEmployeeMapper employeeMapper;
     private final ISysOssService ossService;
     private final ISysOssService ossService;
     private final CaptchaProperties captchaProperties;
     private final CaptchaProperties captchaProperties;
 
 
@@ -121,15 +121,15 @@ public class SysRegisterService {
     }
     }
 
 
     public void wechatRegister(String openId, String unionId, String phone, String nickname, Long avatar) {
     public void wechatRegister(String openId, String unionId, String phone, String nickname, Long avatar) {
-        SysCustomer customer = new SysCustomer();
-        customer.setWechatOpenid(openId);
-        customer.setWechatUnionid(unionId);
-        customer.setPhone(phone);
-        customer.setUserName(StringUtils.isNotEmpty(nickname) ? nickname : "用户" + phone.substring(phone.length() - 4));
+        SysEmployee employee = new SysEmployee();
+        employee.setWechatOpenid(openId);
+        employee.setWechatUnionid(unionId);
+        employee.setPhone(phone);
+        employee.setName(StringUtils.isNotEmpty(nickname) ? nickname : "用户" + phone.substring(phone.length() - 4));
         if (avatar != null) {
         if (avatar != null) {
-            customer.setAvatar(avatar);
+            employee.setAvatar(avatar);
         }
         }
-        int result = customerMapper.insert(customer);
+        int result = employeeMapper.insert(employee);
         if (result <= 0) {
         if (result <= 0) {
             throw new UserException("用户注册失败");
             throw new UserException("用户注册失败");
         }
         }

+ 48 - 17
ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java

@@ -12,7 +12,9 @@ import org.dromara.common.core.constant.GlobalConstants;
 import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.PasswordLoginBody;
 import org.dromara.common.core.domain.model.PasswordLoginBody;
+import org.dromara.common.core.enums.EmployeeStatus;
 import org.dromara.common.core.enums.LoginType;
 import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.UserSource;
 import org.dromara.common.core.exception.user.CaptchaException;
 import org.dromara.common.core.exception.user.CaptchaException;
 import org.dromara.common.core.exception.user.CaptchaExpireException;
 import org.dromara.common.core.exception.user.CaptchaExpireException;
 import org.dromara.common.core.exception.user.UserException;
 import org.dromara.common.core.exception.user.UserException;
@@ -24,9 +26,11 @@ import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
 import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.system.domain.SysEmployee;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.vo.SysClientVo;
 import org.dromara.system.domain.vo.SysClientVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysEmployeeMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.service.IAuthStrategy;
 import org.dromara.web.service.IAuthStrategy;
@@ -46,6 +50,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
     private final CaptchaProperties captchaProperties;
     private final CaptchaProperties captchaProperties;
     private final SysLoginService loginService;
     private final SysLoginService loginService;
     private final SysUserMapper userMapper;
     private final SysUserMapper userMapper;
+    private final SysEmployeeMapper employeeMapper;
 
 
     @Override
     @Override
     public LoginVo login(String body, SysClientVo client) {
     public LoginVo login(String body, SysClientVo client) {
@@ -56,28 +61,27 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         String password = loginBody.getPassword();
         String password = loginBody.getPassword();
         String code = loginBody.getCode();
         String code = loginBody.getCode();
         String uuid = loginBody.getUuid();
         String uuid = loginBody.getUuid();
+        UserSource userSource = UserSource.getBySource(loginBody.getUserSource());
 
 
         boolean captchaEnabled = captchaProperties.getEnable();
         boolean captchaEnabled = captchaProperties.getEnable();
-        // 验证码开关
         if (captchaEnabled) {
         if (captchaEnabled) {
             validateCaptcha(tenantId, username, code, uuid);
             validateCaptcha(tenantId, username, code, uuid);
         }
         }
-        LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
-            SysUserVo user = loadUserByUsername(username);
-            loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
-            // 此处可根据登录用户的数据不同 自行创建 loginUser
-            return loginService.buildLoginUser(user);
-        });
+
+        LoginUser loginUser;
+        if (UserSource.SYS_EMPLOYEE.equals(userSource)) {
+            loginUser = loginByEmployee(username, password);
+        } else {
+            loginUser = loginBySysUser(tenantId, username, password);
+        }
+
         loginUser.setClientKey(client.getClientKey());
         loginUser.setClientKey(client.getClientKey());
         loginUser.setDeviceType(client.getDeviceType());
         loginUser.setDeviceType(client.getDeviceType());
         SaLoginParameter model = new SaLoginParameter();
         SaLoginParameter model = new SaLoginParameter();
         model.setDeviceType(client.getDeviceType());
         model.setDeviceType(client.getDeviceType());
-        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
-        // 例如: 后台用户30分钟过期 app用户1天过期
         model.setTimeout(client.getTimeout());
         model.setTimeout(client.getTimeout());
         model.setActiveTimeout(client.getActiveTimeout());
         model.setActiveTimeout(client.getActiveTimeout());
         model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
         model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
-        // 生成token
         LoginHelper.login(loginUser, model);
         LoginHelper.login(loginUser, model);
 
 
         LoginVo loginVo = new LoginVo();
         LoginVo loginVo = new LoginVo();
@@ -87,13 +91,40 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         return loginVo;
         return loginVo;
     }
     }
 
 
-    /**
-     * 校验验证码
-     *
-     * @param username 用户名
-     * @param code     验证码
-     * @param uuid     唯一标识
-     */
+    private LoginUser loginBySysUser(String tenantId, String username, String password) {
+        return TenantHelper.dynamic(tenantId, () -> {
+            SysUserVo user = loadUserByUsername(username);
+            loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+            return loginService.buildLoginUser(user);
+        });
+    }
+
+    private LoginUser loginByEmployee(String phone, String password) {
+        SysEmployee employee = employeeMapper.selectOne(new LambdaQueryWrapper<SysEmployee>().eq(SysEmployee::getPhone, phone));
+        if (ObjectUtil.isNull(employee)) {
+            log.info("登录员工:{} 不存在.", phone);
+            throw new UserException("user.not.exists", phone);
+        }
+        if (EmployeeStatus.DISABLED.getCode().equals(employee.getStatus())) {
+            log.info("登录员工:{} 已被停用.", phone);
+            throw new UserException("user.blocked", phone);
+        }
+        if (!BCrypt.checkpw(password, employee.getPassword())) {
+            log.info("登录员工:{} 密码错误.", phone);
+            throw new UserException("user.password.error", phone);
+        }
+        return buildEmployeeLoginUser(employee);
+    }
+
+    private LoginUser buildEmployeeLoginUser(SysEmployee employee) {
+        LoginUser loginUser = new LoginUser();
+        loginUser.setUserId(employee.getId());
+        loginUser.setUsername(employee.getPhone());
+        loginUser.setNickname(employee.getName());
+        loginUser.setUserType(UserSource.SYS_EMPLOYEE.getSource());
+        return loginUser;
+    }
+
     private void validateCaptcha(String tenantId, String username, String code, String uuid) {
     private void validateCaptcha(String tenantId, String username, String code, String uuid) {
         String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
         String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         String captcha = RedisUtils.getCacheObject(verifyKey);

+ 14 - 16
ruoyi-admin/src/main/java/org/dromara/web/service/impl/WechatAppletAuthStrategy.java

@@ -8,6 +8,7 @@ import cn.hutool.http.HttpResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.model.WechatAppletLoginBody;
 import org.dromara.common.core.domain.model.WechatAppletLoginBody;
+import org.dromara.common.core.enums.EmployeeStatus;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
@@ -15,8 +16,8 @@ import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.wechat.config.WechatConfig;
 import org.dromara.common.wechat.config.WechatConfig;
 import org.dromara.system.domain.vo.SysClientVo;
 import org.dromara.system.domain.vo.SysClientVo;
-import org.dromara.system.domain.vo.SysCustomerVo;
-import org.dromara.system.service.ISysCustomerService;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+import org.dromara.system.service.ISysEmployeeService;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.service.IAuthStrategy;
 import org.dromara.web.service.IAuthStrategy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -29,7 +30,7 @@ import java.util.Objects;
 public class WechatAppletAuthStrategy implements IAuthStrategy {
 public class WechatAppletAuthStrategy implements IAuthStrategy {
 
 
     private final WechatConfig wechatConfig;
     private final WechatConfig wechatConfig;
-    private final ISysCustomerService customerService;
+    private final ISysEmployeeService employeeService;
 
 
     @Override
     @Override
     public LoginVo login(String body, SysClientVo client) {
     public LoginVo login(String body, SysClientVo client) {
@@ -69,21 +70,20 @@ public class WechatAppletAuthStrategy implements IAuthStrategy {
 
 
         String unionId = response.containsKey("unionid") ? response.getStr("unionid") : "";
         String unionId = response.containsKey("unionid") ? response.getStr("unionid") : "";
 
 
-        SysCustomerVo customer = customerService.queryByWechatOpenid(openId);
+        SysEmployeeVo employee = employeeService.queryByWechatOpenid(openId);
 
 
-        if (Objects.isNull(customer)) {
+        if (Objects.isNull(employee)) {
             LoginVo loginVo = new LoginVo();
             LoginVo loginVo = new LoginVo();
             loginVo.setOpenid(openId);
             loginVo.setOpenid(openId);
             return loginVo;
             return loginVo;
         }
         }
 
 
-        // 检查客户账号状态,禁用则拒绝登录
-        if ("0".equals(customer.getStatus())) {
+        if (EmployeeStatus.DISABLED.getCode().equals(employee.getStatus())) {
             throw new ServiceException("您的账号已被封禁,请联系管理员");
             throw new ServiceException("您的账号已被封禁,请联系管理员");
         }
         }
 
 
         LoginVo loginVo = new LoginVo();
         LoginVo loginVo = new LoginVo();
-        loginVo.setAccessToken(generateToken(customer.getId(), client));
+        loginVo.setAccessToken(generateToken(employee.getId(), client));
         loginVo.setExpireIn(StpUtil.getTokenTimeout());
         loginVo.setExpireIn(StpUtil.getTokenTimeout());
         loginVo.setClientId(client.getClientId());
         loginVo.setClientId(client.getClientId());
         loginVo.setOpenid(openId);
         loginVo.setOpenid(openId);
@@ -110,17 +110,15 @@ public class WechatAppletAuthStrategy implements IAuthStrategy {
         return result;
         return result;
     }
     }
 
 
-    private String generateToken(Long customerId, SysClientVo client) {
-        // 构造登录用户对象
+    private String generateToken(Long employeeId, SysClientVo client) {
         org.dromara.common.core.domain.model.LoginUser loginUser = new org.dromara.common.core.domain.model.LoginUser();
         org.dromara.common.core.domain.model.LoginUser loginUser = new org.dromara.common.core.domain.model.LoginUser();
-        loginUser.setUserId(customerId);
+        loginUser.setUserId(employeeId);
         loginUser.setUserType(org.dromara.common.core.enums.UserType.APP_USER.getUserType());
         loginUser.setUserType(org.dromara.common.core.enums.UserType.APP_USER.getUserType());
 
 
-        // 查询客户信息补全基础数据
-        SysCustomerVo customer = customerService.queryById(customerId);
-        if (customer != null) {
-            loginUser.setUsername(customer.getUserName());
-            loginUser.setNickname(customer.getUserName());
+        SysEmployeeVo employee = employeeService.queryById(employeeId);
+        if (employee != null) {
+            loginUser.setUsername(employee.getName());
+            loginUser.setNickname(employee.getName());
         }
         }
 
 
         SaLoginParameter model = new SaLoginParameter();
         SaLoginParameter model = new SaLoginParameter();

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -248,7 +248,7 @@ websocket:
 --- # warm-flow工作流配置
 --- # warm-flow工作流配置
 warm-flow:
 warm-flow:
   # 是否开启工作流,默认true
   # 是否开启工作流,默认true
-  enabled: true
+  enabled: false
   # 是否开启设计器ui
   # 是否开启设计器ui
   ui: true
   ui: true
   # 是否显示流程图顶部文字
   # 是否显示流程图顶部文字

+ 10 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java

@@ -27,4 +27,14 @@ public interface CacheConstants {
      */
      */
     String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
     String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
 
 
+    /**
+     * 订单编号原子计数器 redis key
+     */
+    String ERP_ORDER_CODE_KEY = "erp:order:code:";
+
+    /**
+     * 订单编号恢复分布式锁 redis key
+     */
+    String ERP_ORDER_CODE_LOCK_KEY = "erp:order:code:lock:";
+
 }
 }

+ 2 - 2
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -87,9 +87,9 @@ public interface CacheNames {
     String SYS_AGREEMENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_agreement";
     String SYS_AGREEMENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_agreement";
 
 
     /**
     /**
-     * 客户昵称
+     * 员工姓名
      */
      */
-    String SYS_CUSTOMER_NAME = "sys_customer_name#30d";
+    String SYS_EMPLOYEE_NAME = "sys_employee_name#30d";
 
 
     /**
     /**
      * 联系电话
      * 联系电话

+ 5 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java

@@ -35,6 +35,11 @@ public class LoginBody implements Serializable {
      */
      */
     private String tenantId;
     private String tenantId;
 
 
+    /**
+     * 用户来源(sys_user / sys_employee)
+     */
+    private String userSource;
+
     /**
     /**
      * 验证码
      * 验证码
      */
      */

+ 20 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/EmployeeStatus.java

@@ -0,0 +1,20 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 员工账号状态
+ *
+ * @author Trae
+ */
+@Getter
+@AllArgsConstructor
+public enum EmployeeStatus {
+
+    DISABLED("0", "停用"),
+    ENABLED("1", "启用");
+
+    private final String code;
+    private final String desc;
+}

+ 36 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserSource.java

@@ -0,0 +1,36 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.dromara.common.core.utils.StringUtils;
+
+/**
+ * 用户来源
+ *
+ * @author Trae
+ */
+@Getter
+@AllArgsConstructor
+public enum UserSource {
+
+    /**
+     * 后台系统用户(sys_user 表)
+     */
+    SYS_USER("sys_user"),
+
+    /**
+     * 员工用户(sys_employee 表)
+     */
+    SYS_EMPLOYEE("sys_employee");
+
+    private final String source;
+
+    public static UserSource getBySource(String source) {
+        for (UserSource value : values()) {
+            if (StringUtils.equals(value.getSource(), source)) {
+                return value;
+            }
+        }
+        return SYS_USER;
+    }
+}

+ 0 - 16
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/CustomerService.java

@@ -1,16 +0,0 @@
-package org.dromara.common.core.service;
-
-/**
- * 通用 客户服务
- */
-public interface CustomerService {
-
-    /**
-     * 通过客户ID查询客户昵称
-     *
-     * @param customerId 客户ID
-     * @return 客户昵称
-     */
-    String selectUserNameById(Long customerId);
-
-}

+ 16 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/EmployeeService.java

@@ -0,0 +1,16 @@
+package org.dromara.common.core.service;
+
+/**
+ * 通用 员工服务
+ */
+public interface EmployeeService {
+
+    /**
+     * 通过员工ID查询员工姓名
+     *
+     * @param employeeId 员工ID
+     * @return 员工姓名
+     */
+    String selectNameById(Long employeeId);
+
+}

+ 2 - 2
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java

@@ -33,8 +33,8 @@ public interface TransConstant {
     String OSS_ID_TO_URL = "oss_id_to_url";
     String OSS_ID_TO_URL = "oss_id_to_url";
 
 
     /**
     /**
-     * 客户id转昵称
+     * 员工id转姓名
      */
      */
-    String CUSTOMER_ID_TO_NAME = "customer_id_to_name";
+    String EMPLOYEE_ID_TO_NAME = "employee_id_to_name";
 
 
 }
 }

+ 7 - 7
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/CustomerNameTranslationImpl.java → ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/EmployeeNameTranslationImpl.java

@@ -2,24 +2,24 @@ package org.dromara.common.translation.core.impl;
 
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.Convert;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-import org.dromara.common.core.service.CustomerService;
+import org.dromara.common.core.service.EmployeeService;
 import org.dromara.common.translation.annotation.TranslationType;
 import org.dromara.common.translation.annotation.TranslationType;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.common.translation.core.TranslationInterface;
 import org.dromara.common.translation.core.TranslationInterface;
 
 
 /**
 /**
- * 客户昵称翻译实现
+ * 员工姓名翻译实现
  */
  */
 @AllArgsConstructor
 @AllArgsConstructor
-@TranslationType(type = TransConstant.CUSTOMER_ID_TO_NAME)
-public class CustomerNameTranslationImpl implements TranslationInterface<String> {
+@TranslationType(type = TransConstant.EMPLOYEE_ID_TO_NAME)
+public class EmployeeNameTranslationImpl implements TranslationInterface<String> {
 
 
-    private final CustomerService customerService;
+    private final EmployeeService employeeService;
 
 
     @Override
     @Override
     public String translation(Object key, String other) {
     public String translation(Object key, String other) {
-        String userName = customerService.selectUserNameById(Convert.toLong(key));
-        return userName;
+        String name = employeeService.selectNameById(Convert.toLong(key));
+        return name;
     }
     }
 
 
 }
 }

+ 1 - 1
ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -4,4 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl
 org.dromara.common.translation.core.impl.OssUrlTranslationImpl
 org.dromara.common.translation.core.impl.OssUrlTranslationImpl
 org.dromara.common.translation.core.impl.UserNameTranslationImpl
 org.dromara.common.translation.core.impl.UserNameTranslationImpl
 org.dromara.common.translation.core.impl.NicknameTranslationImpl
 org.dromara.common.translation.core.impl.NicknameTranslationImpl
-org.dromara.common.translation.core.impl.CustomerNameTranslationImpl
+org.dromara.common.translation.core.impl.EmployeeNameTranslationImpl

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysComplaintController.java

@@ -40,7 +40,7 @@ public class SysComplaintController extends BaseController {
     }
     }
 
 
     /**
     /**
-     * 查询当前客户的投诉建议列表(小程序端)
+     * 查询当前员工的投诉建议列表(小程序端)
      * @Author: Trae
      * @Author: Trae
      */
      */
     @GetMapping("/myList")
     @GetMapping("/myList")
@@ -55,7 +55,7 @@ public class SysComplaintController extends BaseController {
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping
     @PostMapping
     public R<Void> submit(@Validated @RequestBody SysComplaintBo bo) {
     public R<Void> submit(@Validated @RequestBody SysComplaintBo bo) {
-        bo.setCustomerId(LoginHelper.getUserId());
+        bo.setEmployeeId(LoginHelper.getUserId());
         return toAjax(sysComplaintService.insertByBo(bo));
         return toAjax(sysComplaintService.insertByBo(bo));
     }
     }
 
 

+ 0 - 120
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomerController.java

@@ -1,120 +0,0 @@
-package org.dromara.system.controller.system;
-
-import cn.dev33.satoken.stp.StpUtil;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.system.domain.bo.SysCustomerBo;
-import org.dromara.system.domain.vo.SysCustomerVo;
-import org.dromara.system.service.ISysCustomerService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-
-/**
- * 客户管理
- *
- * @author Lion Li
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/customer")
-public class SysCustomerController extends BaseController {
-
-    private final ISysCustomerService sysCustomerService;
-
-    /**
-     * 获取当前登录客户信息
-     */
-    @GetMapping("/getInfo")
-    public R<SysCustomerVo> getMyInfo() {
-        Long customerId = LoginHelper.getUserId();
-        return R.ok(sysCustomerService.queryDetail(customerId));
-    }
-
-    /**
-     * 更新当前登录客户信息
-     */
-    @Log(title = "客户管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/updateProfile")
-    public R<Void> updateMyInfo(@RequestBody SysCustomerBo bo) {
-        Long customerId = LoginHelper.getUserId();
-        bo.setId(customerId);
-        return toAjax(sysCustomerService.updateByBo(bo));
-    }
-
-    /**
-     * 查询客户列表
-     */
-//     @SaCheckPermission("customer:customer:list")
-    @GetMapping("/list")
-    public TableDataInfo<SysCustomerVo> list(SysCustomerBo bo, PageQuery pageQuery) {
-        return sysCustomerService.queryPageList(bo, pageQuery);
-    }
-
-    /**
-     * 获取客户详细信息
-     *
-     * @param id 主键
-     */
-//     @SaCheckPermission("customer:customer:query")
-    @GetMapping("/{id}")
-    public R<SysCustomerVo> getInfo(@NotNull(message = "主键不能为空")
-                                    @PathVariable Long id) {
-        return R.ok(sysCustomerService.queryById(id));
-    }
-
-    /**
-     * 获取客户详细信息(含授权客户详情列表)
-     * @Author: Antigravity
-     */
-    @GetMapping("/detail/{id}")
-    public R<SysCustomerVo> getDetail(@NotNull(message = "主键不能为空") @PathVariable Long id) {
-        return R.ok(sysCustomerService.queryDetail(id));
-    }
-
-    /**
-     * 授权客户(支持多个,逗号分隔)
-     *
-     * @param id               客户ID
-     * @param authClientFRowIDs 授权客户 RowID 列表
-     * @Author: Antigravity
-     */
-//     @SaCheckPermission("customer:customer:auth")
-    @Log(title = "客户管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
-    @PutMapping("/auth")
-    public R<Void> auth(@NotNull(message = "客户ID不能为空") Long id,
-                        @NotEmpty(message = "授权客户 RowID 不能为空") String authClientFRowIDs) {
-        sysCustomerService.checkAuthClientConflict(id, authClientFRowIDs);
-        SysCustomerBo bo = new SysCustomerBo();
-        bo.setId(id);
-        bo.setAuthClientFRowID(authClientFRowIDs);
-        return toAjax(sysCustomerService.updateByBo(bo));
-    }
-
-    /**
-     * 修改客户状态(启用/禁用)
-     * @Author: Antigravity
-     */
-//     @SaCheckPermission("customer:customer:changeStatus")
-    @Log(title = "客户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
-    public R<Void> changeStatus(@NotNull(message = "客户ID不能为空") Long id,
-                                @NotNull(message = "状态不能为空") String status) {
-        return toAjax(sysCustomerService.changeStatus(id, status));
-    }
-}

+ 145 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysEmployeeController.java

@@ -0,0 +1,145 @@
+package org.dromara.system.controller.system;
+
+import cn.hutool.crypto.digest.BCrypt;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.bo.SysEmployeeBo;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+import org.dromara.system.service.ISysEmployeeService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * 员工管理
+ *
+ * @author Lion Li
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/employee")
+public class SysEmployeeController extends BaseController {
+
+    private final ISysEmployeeService sysEmployeeService;
+
+    /**
+     * 获取当前登录员工信息
+     */
+    @GetMapping("/getInfo")
+    public R<SysEmployeeVo> getMyInfo() {
+        Long employeeId = LoginHelper.getUserId();
+        return R.ok(sysEmployeeService.queryDetail(employeeId));
+    }
+
+    /**
+     * 更新当前登录员工信息
+     */
+    @Log(title = "员工管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/updateProfile")
+    public R<Void> updateMyInfo(@RequestBody SysEmployeeBo bo) {
+        Long employeeId = LoginHelper.getUserId();
+        bo.setId(employeeId);
+        return toAjax(sysEmployeeService.updateByBo(bo));
+    }
+
+    /**
+     * 查询员工列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SysEmployeeVo> list(SysEmployeeBo bo, PageQuery pageQuery) {
+        return sysEmployeeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取员工详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<SysEmployeeVo> getInfo(@NotNull(message = "主键不能为空")
+                                    @PathVariable Long id) {
+        return R.ok(sysEmployeeService.queryById(id));
+    }
+
+    /**
+     * 获取员工详细信息(含授权客户详情列表)
+     */
+    @GetMapping("/detail/{id}")
+    public R<SysEmployeeVo> getDetail(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(sysEmployeeService.queryDetail(id));
+    }
+
+    /**
+     * 新增员工
+     */
+    @Log(title = "员工管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping
+    public R<Void> add(@Validated @RequestBody SysEmployeeBo bo) {
+        bo.setPassword(BCrypt.hashpw(bo.getPassword()));
+        return toAjax(sysEmployeeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改员工
+     */
+    @Log(title = "员工管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysEmployeeBo bo) {
+        return toAjax(sysEmployeeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除员工
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "员工管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable List<Long> ids) {
+        return toAjax(sysEmployeeService.deleteWithValidByIds(ids, true));
+    }
+
+    /**
+     * 授权客户(支持多个,逗号分隔)
+     *
+     * @param id                 员工ID
+     * @param authClientFRowIDs  授权客户 RowID 列表
+     */
+    @Log(title = "员工管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/auth")
+    public R<Void> auth(@NotNull(message = "员工ID不能为空") Long id,
+                        @NotEmpty(message = "授权客户 RowID 不能为空") String authClientFRowIDs) {
+        sysEmployeeService.checkAuthClientConflict(id, authClientFRowIDs);
+        SysEmployeeBo bo = new SysEmployeeBo();
+        bo.setId(id);
+        bo.setAuthClientFRowIDs(authClientFRowIDs);
+        return toAjax(sysEmployeeService.updateByBo(bo));
+    }
+
+    /**
+     * 修改员工状态(启用/禁用)
+     */
+    @Log(title = "员工管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@NotNull(message = "员工ID不能为空") Long id,
+                                @NotNull(message = "状态不能为空") String status) {
+        return toAjax(sysEmployeeService.changeStatus(id, status));
+    }
+}

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysComplaint.java

@@ -42,9 +42,9 @@ public class SysComplaint extends TenantEntity {
     private String images;
     private String images;
 
 
     /**
     /**
-     * 投诉客户ID
+     * 投诉员工ID
      */
      */
-    private Long customerId;
+    private Long employeeId;
 
 
     /**
     /**
      * 状态(0-待处理 1-已处理)
      * 状态(0-待处理 1-已处理)

+ 15 - 12
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCustomer.java → ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysEmployee.java

@@ -11,35 +11,39 @@ import org.dromara.common.tenant.core.TenantEntity;
 import java.io.Serial;
 import java.io.Serial;
 
 
 /**
 /**
- * 客户表 sys_customer
+ * 员工表 sys_employee
  *
  *
  * @author Lion Li
  * @author Lion Li
  */
  */
-
 @Data
 @Data
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-@TableName("sys_customer")
-public class SysCustomer extends TenantEntity {
+@TableName("sys_employee")
+public class SysEmployee extends TenantEntity {
 
 
     @Serial
     @Serial
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
     /**
     /**
-     * 客户ID
+     * 员工ID
      */
      */
     @TableId(value = "id")
     @TableId(value = "id")
     private Long id;
     private Long id;
 
 
     /**
     /**
-     * 用户
+     * 
      */
      */
-    private String userName;
+    private String name;
 
 
     /**
     /**
-     * 手机号
+     * 电话
      */
      */
     private String phone;
     private String phone;
 
 
+    /**
+     * 密码
+     */
+    private String password;
+
     /**
     /**
      * 微信OpenID
      * 微信OpenID
      */
      */
@@ -51,10 +55,10 @@ public class SysCustomer extends TenantEntity {
     private String wechatUnionid;
     private String wechatUnionid;
 
 
     /**
     /**
-     * 授权客户ERP RowID
+     * 授权客户ERP RowID(多个逗号分隔)
      */
      */
-    @TableField("auth_client_frowid")
-    private String authClientFRowID;
+    @TableField("auth_client_frowids")
+    private String authClientFRowIDs;
 
 
     /**
     /**
      * 头像OSS ID
      * 头像OSS ID
@@ -63,7 +67,6 @@ public class SysCustomer extends TenantEntity {
 
 
     /**
     /**
      * 账号状态(0-禁用 1-启用)
      * 账号状态(0-禁用 1-启用)
-     * @Author: Antigravity
      */
      */
     private String status;
     private String status;
 
 

+ 4 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysComplaintBo.java

@@ -39,14 +39,14 @@ public class SysComplaintBo extends BaseEntity {
     private String images;
     private String images;
 
 
     /**
     /**
-     * 投诉客户ID
+     * 投诉员工ID
      */
      */
-    private Long customerId;
+    private Long employeeId;
 
 
     /**
     /**
-     * 客户姓名(模糊搜索用,不持久化)
+     * 员工姓名(模糊搜索用,不持久化)
      */
      */
-    private String customerName;
+    private String employeeName;
 
 
     /**
     /**
      * 状态(0-待处理 1-已处理)
      * 状态(0-待处理 1-已处理)

+ 18 - 15
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysCustomerBo.java → ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysEmployeeBo.java

@@ -6,37 +6,42 @@ import jakarta.validation.constraints.Size;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.system.domain.SysCustomer;
+import org.dromara.system.domain.SysEmployee;
 
 
 /**
 /**
- * 客户业务对象 sys_customer
+ * 员工业务对象 sys_employee
  *
  *
  * @author Lion Li
  * @author Lion Li
  */
  */
-
 @Data
 @Data
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SysCustomer.class, reverseConvertGenerate = false)
-public class SysCustomerBo extends BaseEntity {
+@AutoMapper(target = SysEmployee.class, reverseConvertGenerate = false)
+public class SysEmployeeBo extends BaseEntity {
 
 
     /**
     /**
-     * 客户ID
+     * 员工ID
      */
      */
     private Long id;
     private Long id;
 
 
     /**
     /**
-     * 用户
+     * 
      */
      */
-    @NotBlank(message = "用户名不能为空")
-    @Size(min = 0, max = 30, message = "用户名长度不能超过{max}个字符")
-    private String userName;
+    @NotBlank(message = "名不能为空")
+    @Size(min = 0, max = 30, message = "名长度不能超过{max}个字符")
+    private String name;
 
 
     /**
     /**
-     * 手机号
+     * 电话
      */
      */
-    @Size(min = 0, max = 11, message = "手机号长度不能超过{max}个字符")
+    @Size(min = 0, max = 11, message = "电话长度不能超过{max}个字符")
     private String phone;
     private String phone;
 
 
+    /**
+     * 密码
+     */
+    @Size(min = 0, max = 100, message = "密码长度不能超过{max}个字符")
+    private String password;
+
     /**
     /**
      * 微信OpenID
      * 微信OpenID
      */
      */
@@ -51,9 +56,8 @@ public class SysCustomerBo extends BaseEntity {
 
 
     /**
     /**
      * 授权客户ERP RowID(多个逗号分隔)
      * 授权客户ERP RowID(多个逗号分隔)
-     * @Author: Antigravity
      */
      */
-    private String authClientFRowID;
+    private String authClientFRowIDs;
 
 
     /**
     /**
      * 头像OSS ID
      * 头像OSS ID
@@ -62,7 +66,6 @@ public class SysCustomerBo extends BaseEntity {
 
 
     /**
     /**
      * 账号状态(0-禁用 1-启用)
      * 账号状态(0-禁用 1-启用)
-     * @Author: Antigravity
      */
      */
     private String status;
     private String status;
 
 

+ 8 - 8
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysComplaintVo.java

@@ -54,22 +54,22 @@ public class SysComplaintVo implements Serializable {
     private String imageUrls;
     private String imageUrls;
 
 
     /**
     /**
-     * 投诉客户ID
+     * 投诉员工ID
      */
      */
-    @ExcelProperty(value = "客户ID")
-    private Long customerId;
+    @ExcelProperty(value = "员工ID")
+    private Long employeeId;
 
 
     /**
     /**
-     * 客户昵称(通过客户ID翻译)
+     * 员工姓名(通过员工ID翻译)
      */
      */
-    @Translation(type = TransConstant.CUSTOMER_ID_TO_NAME, mapper = "customerId")
-    private String customerNickname;
+    @Translation(type = TransConstant.EMPLOYEE_ID_TO_NAME, mapper = "employeeId")
+    private String employeeName;
 
 
     /**
     /**
-     * 客户手机号
+     * 员工手机号
      * @Author: Antigravity
      * @Author: Antigravity
      */
      */
-    private String customerPhone;
+    private String employeePhone;
 
 
     /**
     /**
      * 状态(0-待处理 1-已处理)
      * 状态(0-待处理 1-已处理)

+ 12 - 18
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysCustomerVo.java → ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysEmployeeVo.java

@@ -6,7 +6,7 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.Data;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.common.translation.constant.TransConstant;
-import org.dromara.system.domain.SysCustomer;
+import org.dromara.system.domain.SysEmployee;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.io.Serializable;
 import java.io.Serializable;
@@ -14,34 +14,34 @@ import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
- * 客户视图对象 sys_customer
+ * 员工视图对象 sys_employee
  *
  *
  * @author Lion Li
  * @author Lion Li
  */
  */
 @Data
 @Data
 @ExcelIgnoreUnannotated
 @ExcelIgnoreUnannotated
-@AutoMapper(target = SysCustomer.class)
-public class SysCustomerVo implements Serializable {
+@AutoMapper(target = SysEmployee.class)
+public class SysEmployeeVo implements Serializable {
 
 
     @Serial
     @Serial
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
     /**
     /**
-     * 客户ID
+     * 员工ID
      */
      */
-    @ExcelProperty(value = "客户ID")
+    @ExcelProperty(value = "员工ID")
     private Long id;
     private Long id;
 
 
     /**
     /**
-     * 用户
+     * 
      */
      */
-    @ExcelProperty(value = "用户名")
-    private String userName;
+    @ExcelProperty(value = "名")
+    private String name;
 
 
     /**
     /**
-     * 手机号
+     * 电话
      */
      */
-    @ExcelProperty(value = "手机号")
+    @ExcelProperty(value = "电话")
     private String phone;
     private String phone;
 
 
     /**
     /**
@@ -56,34 +56,29 @@ public class SysCustomerVo implements Serializable {
 
 
     /**
     /**
      * 授权客户类型(多个逗号分隔)
      * 授权客户类型(多个逗号分隔)
-     * @Author: Antigravity
      */
      */
     @ExcelProperty(value = "授权客户类型")
     @ExcelProperty(value = "授权客户类型")
     private String authClientClass;
     private String authClientClass;
 
 
     /**
     /**
      * 授权加入时间(多个逗号分隔)
      * 授权加入时间(多个逗号分隔)
-     * @Author: Antigravity
      */
      */
     @ExcelProperty(value = "授权加入时间")
     @ExcelProperty(value = "授权加入时间")
     private String authClientEnterDate;
     private String authClientEnterDate;
 
 
     /**
     /**
      * 授权客户ERP RowID(多个逗号分隔)
      * 授权客户ERP RowID(多个逗号分隔)
-     * @Author: Antigravity
      */
      */
-    private String authClientFRowID;
+    private String authClientFRowIDs;
 
 
     /**
     /**
      * 授权客户名称(多个逗号分隔)
      * 授权客户名称(多个逗号分隔)
-     * @Author: Antigravity
      */
      */
     @ExcelProperty(value = "授权客户名称")
     @ExcelProperty(value = "授权客户名称")
     private String authClientName;
     private String authClientName;
 
 
     /**
     /**
      * 授权客户详情列表(仅详情接口填充)
      * 授权客户详情列表(仅详情接口填充)
-     * @Author: Antigravity
      */
      */
     private List<org.dromara.yingpaipay.api.erp.domain.vo.CommonErpClientVo> authClientList;
     private List<org.dromara.yingpaipay.api.erp.domain.vo.CommonErpClientVo> authClientList;
 
 
@@ -101,7 +96,6 @@ public class SysCustomerVo implements Serializable {
 
 
     /**
     /**
      * 账号状态(0-禁用 1-启用)
      * 账号状态(0-禁用 1-启用)
-     * @Author: Antigravity
      */
      */
     @ExcelProperty(value = "账号状态")
     @ExcelProperty(value = "账号状态")
     private String status;
     private String status;

+ 0 - 14
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCustomerMapper.java

@@ -1,14 +0,0 @@
-package org.dromara.system.mapper;
-
-import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-import org.dromara.system.domain.SysCustomer;
-import org.dromara.system.domain.vo.SysCustomerVo;
-
-/**
- * 客户管理 数据层
- *
- * @author Lion Li
- */
-public interface SysCustomerMapper extends BaseMapperPlus<SysCustomer, SysCustomerVo> {
-
-}

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysEmployeeMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysEmployee;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+
+/**
+ * 员工管理 数据层
+ *
+ * @author Lion Li
+ */
+public interface SysEmployeeMapper extends BaseMapperPlus<SysEmployee, SysEmployeeVo> {
+
+}

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysComplaintService.java

@@ -39,9 +39,9 @@ public interface ISysComplaintService {
     Boolean deleteWithValidByIds(Collection<Long> ids);
     Boolean deleteWithValidByIds(Collection<Long> ids);
 
 
     /**
     /**
-     * 分页查询当前客户的投诉建议列表(小程序端)
+     * 分页查询当前员工的投诉建议列表(小程序端)
      * @Author: Trae
      * @Author: Trae
      */
      */
-    TableDataInfo<SysComplaintVo> queryMyPageList(Long customerId, PageQuery pageQuery);
+    TableDataInfo<SysComplaintVo> queryMyPageList(Long employeeId, PageQuery pageQuery);
 
 
 }
 }

+ 0 - 69
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomerService.java

@@ -1,69 +0,0 @@
-package org.dromara.system.service;
-
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.system.domain.bo.SysCustomerBo;
-import org.dromara.system.domain.vo.SysCustomerVo;
-
-import java.util.Collection;
-
-/**
- * 客户管理 Service接口
- *
- * @author Lion Li
- */
-public interface ISysCustomerService {
-
-    /**
-     * 查询客户
-     */
-    SysCustomerVo queryById(Long id);
-
-    /**
-     * 查询客户详情(含授权客户完整信息列表)
-     * @Author: Antigravity
-     */
-    SysCustomerVo queryDetail(Long id);
-
-    /**
-     * 分页查询客户列表
-     */
-    TableDataInfo<SysCustomerVo> queryPageList(SysCustomerBo bo, PageQuery pageQuery);
-
-    /**
-     * 修改客户
-     */
-    Boolean updateByBo(SysCustomerBo bo);
-
-    /**
-     * 校验授权客户是否已被其他客户占用
-     * @Author: Trae
-     */
-    void checkAuthClientConflict(Long customerId, String authClientFRowIDs);
-
-    /**
-     * 校验并批量删除客户信息
-     */
-    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
-
-    /**
-     * 根据微信UnionID查询客户
-     */
-    SysCustomerVo queryByWechatUnionid(String wechatUnionid);
-
-    /**
-     * 根据微信OpenID查询客户
-     */
-    SysCustomerVo queryByWechatOpenid(String wechatOpenid);
-
-    /**
-     * 通过客户ID查询客户昵称
-     */
-    String selectUserNameById(Long customerId);
-
-    /**
-     * 修改客户状态(启用/禁用)
-     * @Author: Antigravity
-     */
-    Boolean changeStatus(Long id, String status);
-}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysEmployeeService.java

@@ -0,0 +1,76 @@
+package org.dromara.system.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.bo.SysEmployeeBo;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+
+import java.util.Collection;
+
+/**
+ * 员工管理 Service接口
+ *
+ * @author Lion Li
+ */
+public interface ISysEmployeeService {
+
+    /**
+     * 查询员工
+     */
+    SysEmployeeVo queryById(Long id);
+
+    /**
+     * 查询员工详情(含授权客户完整信息列表)
+     */
+    SysEmployeeVo queryDetail(Long id);
+
+    /**
+     * 根据电话查询员工
+     */
+    SysEmployeeVo queryByPhone(String phone);
+
+    /**
+     * 根据微信UnionID查询员工
+     */
+    SysEmployeeVo queryByWechatUnionid(String wechatUnionid);
+
+    /**
+     * 根据微信OpenID查询员工
+     */
+    SysEmployeeVo queryByWechatOpenid(String wechatOpenid);
+
+    /**
+     * 分页查询员工列表
+     */
+    TableDataInfo<SysEmployeeVo> queryPageList(SysEmployeeBo bo, PageQuery pageQuery);
+
+    /**
+     * 新增员工
+     */
+    Boolean insertByBo(SysEmployeeBo bo);
+
+    /**
+     * 修改员工
+     */
+    Boolean updateByBo(SysEmployeeBo bo);
+
+    /**
+     * 校验授权客户是否已被其他员工占用
+     */
+    void checkAuthClientConflict(Long employeeId, String authClientFRowIDs);
+
+    /**
+     * 校验并批量删除员工信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 通过员工ID查询员工姓名
+     */
+    String selectNameById(Long employeeId);
+
+    /**
+     * 修改员工状态(启用/禁用)
+     */
+    Boolean changeStatus(Long id, String status);
+}

+ 30 - 30
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysComplaintServiceImpl.java

@@ -9,11 +9,11 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.SysComplaint;
 import org.dromara.system.domain.SysComplaint;
-import org.dromara.system.domain.SysCustomer;
+import org.dromara.system.domain.SysEmployee;
 import org.dromara.system.domain.bo.SysComplaintBo;
 import org.dromara.system.domain.bo.SysComplaintBo;
 import org.dromara.system.domain.vo.SysComplaintVo;
 import org.dromara.system.domain.vo.SysComplaintVo;
 import org.dromara.system.mapper.SysComplaintMapper;
 import org.dromara.system.mapper.SysComplaintMapper;
-import org.dromara.system.mapper.SysCustomerMapper;
+import org.dromara.system.mapper.SysEmployeeMapper;
 import org.dromara.system.service.ISysComplaintService;
 import org.dromara.system.service.ISysComplaintService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
 public class SysComplaintServiceImpl implements ISysComplaintService {
 public class SysComplaintServiceImpl implements ISysComplaintService {
 
 
     private final SysComplaintMapper baseMapper;
     private final SysComplaintMapper baseMapper;
-    private final SysCustomerMapper customerMapper;
+    private final SysEmployeeMapper employeeMapper;
 
 
     @Override
     @Override
     public TableDataInfo<SysComplaintVo> queryPageList(SysComplaintBo bo, PageQuery pageQuery) {
     public TableDataInfo<SysComplaintVo> queryPageList(SysComplaintBo bo, PageQuery pageQuery) {
@@ -43,28 +43,28 @@ public class SysComplaintServiceImpl implements ISysComplaintService {
     }
     }
 
 
     /**
     /**
-     * 批量填充客户手机号
+     * 批量填充员工手机号
      */
      */
     private void fillCustomerPhone(List<SysComplaintVo> list) {
     private void fillCustomerPhone(List<SysComplaintVo> list) {
         if (list == null || list.isEmpty()) {
         if (list == null || list.isEmpty()) {
             return;
             return;
         }
         }
-        List<Long> customerIds = list.stream()
-            .map(SysComplaintVo::getCustomerId)
+        List<Long> employeeIds = list.stream()
+            .map(SysComplaintVo::getEmployeeId)
             .filter(id -> id != null)
             .filter(id -> id != null)
             .distinct()
             .distinct()
             .collect(Collectors.toList());
             .collect(Collectors.toList());
-        if (customerIds.isEmpty()) {
+        if (employeeIds.isEmpty()) {
             return;
             return;
         }
         }
-        Map<Long, String> phoneMap = customerMapper.selectList(
-            Wrappers.lambdaQuery(SysCustomer.class)
-                .select(SysCustomer::getId, SysCustomer::getPhone)
-                .in(SysCustomer::getId, customerIds)
-        ).stream().collect(Collectors.toMap(SysCustomer::getId, SysCustomer::getPhone, (v1, v2) -> v2, HashMap::new));
+        Map<Long, String> phoneMap = employeeMapper.selectList(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .select(SysEmployee::getId, SysEmployee::getPhone)
+                .in(SysEmployee::getId, employeeIds)
+        ).stream().collect(Collectors.toMap(SysEmployee::getId, SysEmployee::getPhone, (v1, v2) -> v2, HashMap::new));
         list.forEach(vo -> {
         list.forEach(vo -> {
-            if (vo.getCustomerId() != null) {
-                vo.setCustomerPhone(phoneMap.get(vo.getCustomerId()));
+            if (vo.getEmployeeId() != null) {
+                vo.setEmployeePhone(phoneMap.get(vo.getEmployeeId()));
             }
             }
         });
         });
     }
     }
@@ -72,16 +72,16 @@ public class SysComplaintServiceImpl implements ISysComplaintService {
     private LambdaQueryWrapper<SysComplaint> buildQueryWrapper(SysComplaintBo bo) {
     private LambdaQueryWrapper<SysComplaint> buildQueryWrapper(SysComplaintBo bo) {
         LambdaQueryWrapper<SysComplaint> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<SysComplaint> lqw = Wrappers.lambdaQuery();
         lqw.eq(StringUtils.isNotBlank(bo.getFeedbackType()), SysComplaint::getFeedbackType, bo.getFeedbackType());
         lqw.eq(StringUtils.isNotBlank(bo.getFeedbackType()), SysComplaint::getFeedbackType, bo.getFeedbackType());
-        if (StringUtils.isNotBlank(bo.getCustomerName())) {
-            List<Long> customerIds = customerMapper.selectList(
-                Wrappers.lambdaQuery(SysCustomer.class)
-                    .select(SysCustomer::getId)
-                    .like(SysCustomer::getUserName, bo.getCustomerName())
-            ).stream().map(SysCustomer::getId).collect(Collectors.toList());
-            if (customerIds.isEmpty()) {
-                customerIds = List.of(0L);
+        if (StringUtils.isNotBlank(bo.getEmployeeName())) {
+            List<Long> employeeIds = employeeMapper.selectList(
+                Wrappers.lambdaQuery(SysEmployee.class)
+                    .select(SysEmployee::getId)
+                    .like(SysEmployee::getName, bo.getEmployeeName())
+            ).stream().map(SysEmployee::getId).collect(Collectors.toList());
+            if (employeeIds.isEmpty()) {
+                employeeIds = List.of(0L);
             }
             }
-            lqw.in(SysComplaint::getCustomerId, customerIds);
+            lqw.in(SysComplaint::getEmployeeId, employeeIds);
         }
         }
         lqw.orderByDesc(SysComplaint::getId);
         lqw.orderByDesc(SysComplaint::getId);
         return lqw;
         return lqw;
@@ -90,10 +90,10 @@ public class SysComplaintServiceImpl implements ISysComplaintService {
     @Override
     @Override
     public SysComplaintVo queryById(Long id) {
     public SysComplaintVo queryById(Long id) {
         SysComplaintVo vo = baseMapper.selectVoById(id);
         SysComplaintVo vo = baseMapper.selectVoById(id);
-        if (vo != null && vo.getCustomerId() != null) {
-            SysCustomer customer = customerMapper.selectById(vo.getCustomerId());
-            if (customer != null) {
-                vo.setCustomerPhone(customer.getPhone());
+        if (vo != null && vo.getEmployeeId() != null) {
+            SysEmployee employee = employeeMapper.selectById(vo.getEmployeeId());
+            if (employee != null) {
+                vo.setEmployeePhone(employee.getPhone());
             }
             }
         }
         }
         return vo;
         return vo;
@@ -117,13 +117,13 @@ public class SysComplaintServiceImpl implements ISysComplaintService {
     }
     }
 
 
     /**
     /**
-     * 分页查询当前客户的投诉建议列表(小程序端)
+     * 分页查询当前员工的投诉建议列表(小程序端)
      * @Author: Trae
      * @Author: Trae
      */
      */
     @Override
     @Override
-    public TableDataInfo<SysComplaintVo> queryMyPageList(Long customerId, PageQuery pageQuery) {
+    public TableDataInfo<SysComplaintVo> queryMyPageList(Long employeeId, PageQuery pageQuery) {
         LambdaQueryWrapper<SysComplaint> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<SysComplaint> lqw = Wrappers.lambdaQuery();
-        lqw.eq(SysComplaint::getCustomerId, customerId);
+        lqw.eq(SysComplaint::getEmployeeId, employeeId);
         lqw.orderByDesc(SysComplaint::getCreateTime);
         lqw.orderByDesc(SysComplaint::getCreateTime);
         Page<SysComplaintVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         Page<SysComplaintVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
         return TableDataInfo.build(result);

+ 0 - 275
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomerServiceImpl.java

@@ -1,275 +0,0 @@
-package org.dromara.system.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.constant.CacheNames;
-import org.dromara.common.core.exception.ServiceException;
-import org.dromara.common.core.service.CustomerService;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.redis.utils.CacheUtils;
-import org.dromara.system.domain.SysCustomer;
-import org.dromara.system.domain.bo.SysCustomerBo;
-import org.dromara.system.domain.vo.SysCustomerVo;
-import org.dromara.system.mapper.SysCustomerMapper;
-import org.dromara.system.service.ISysCustomerService;
-import org.springframework.cache.annotation.Cacheable;
-import org.dromara.yingpaipay.api.erp.domain.vo.CommonErpClientVo;
-import org.springframework.stereotype.Service;
-
-import org.dromara.yingpaipay.api.erp.CommonErpClientService;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * 客户管理 Service业务层处理
- *
- * @author Lion Li
- */
-@RequiredArgsConstructor
-@Service
-public class SysCustomerServiceImpl implements ISysCustomerService, CustomerService {
-
-    private final SysCustomerMapper baseMapper;
-    private final CommonErpClientService commonErpClientService;
-
-    /**
-     * 查询客户
-     */
-    @Override
-    public SysCustomerVo queryById(Long id) {
-        SysCustomerVo vo = baseMapper.selectVoById(id);
-        fillAuthClientName(vo);
-        return vo;
-    }
-
-    /**
-     * 分页查询客户列表
-     */
-    @Override
-    public TableDataInfo<SysCustomerVo> queryPageList(SysCustomerBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<SysCustomer> lqw = buildQueryWrapper(bo);
-        Page<SysCustomerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        fillAuthClientName(result.getRecords());
-        return TableDataInfo.build(result);
-    }
-
-    /**
-     * 查询客户详情(含授权客户完整信息列表)
-     * @Author: Antigravity
-     */
-    @Override
-    public SysCustomerVo queryDetail(Long id) {
-        SysCustomerVo vo = baseMapper.selectVoById(id);
-        fillAuthClientDetail(vo);
-        return vo;
-    }
-
-    /**
-     * 批量填充授权客户信息(列表用,逗号分隔拼接名称/类型/时间)
-     * @Author: Antigravity
-     */
-    private void fillAuthClientName(List<SysCustomerVo> list) {
-        if (list == null || list.isEmpty()) {
-            return;
-        }
-        List<String> allIds = list.stream()
-            .map(SysCustomerVo::getAuthClientFRowID)
-            .filter(StringUtils::isNotBlank)
-            .flatMap(ids -> Arrays.stream(ids.split(",")))
-            .map(String::trim)
-            .filter(StringUtils::isNotBlank)
-            .distinct()
-            .collect(Collectors.toList());
-        if (allIds.isEmpty()) {
-            return;
-        }
-        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(allIds);
-        list.forEach(vo -> {
-            if (StringUtils.isBlank(vo.getAuthClientFRowID())) {
-                return;
-            }
-            List<String> ids = Arrays.stream(vo.getAuthClientFRowID().split(","))
-                .map(String::trim)
-                .filter(StringUtils::isNotBlank)
-                .collect(Collectors.toList());
-            List<CommonErpClientVo> clients = ids.stream()
-                .map(infoMap::get)
-                .filter(c -> c != null)
-                .collect(Collectors.toList());
-            vo.setAuthClientName(clients.stream().map(CommonErpClientVo::getName)
-                .collect(Collectors.joining(" / ")));
-            vo.setAuthClientClass(clients.stream().map(CommonErpClientVo::getClientClass)
-                .collect(Collectors.joining(" / ")));
-            vo.setAuthClientEnterDate(clients.stream()
-                .map(c -> c.getEnterDate() != null ? c.getEnterDate().toString() : "")
-                .collect(Collectors.joining(" / ")));
-        });
-    }
-
-    /**
-     * 单个填充授权客户简要信息(兼容旧逻辑)
-     * @Author: Antigravity
-     */
-    private void fillAuthClientName(SysCustomerVo vo) {
-        if (vo == null || StringUtils.isBlank(vo.getAuthClientFRowID())) {
-            return;
-        }
-        fillAuthClientName(Collections.singletonList(vo));
-    }
-
-    /**
-     * 填充授权客户完整详情列表(详情弹框用)
-     * @Author: Antigravity
-     */
-    private void fillAuthClientDetail(SysCustomerVo vo) {
-        if (vo == null || StringUtils.isBlank(vo.getAuthClientFRowID())) {
-            vo.setAuthClientList(Collections.emptyList());
-            return;
-        }
-        List<String> ids = Arrays.stream(vo.getAuthClientFRowID().split(","))
-            .map(String::trim)
-            .filter(StringUtils::isNotBlank)
-            .collect(Collectors.toList());
-        if (ids.isEmpty()) {
-            vo.setAuthClientList(Collections.emptyList());
-            return;
-        }
-        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(ids);
-        List<CommonErpClientVo> clients = ids.stream()
-            .map(infoMap::get)
-            .filter(c -> c != null)
-            .collect(Collectors.toList());
-        vo.setAuthClientList(clients);
-    }
-
-    private LambdaQueryWrapper<SysCustomer> buildQueryWrapper(SysCustomerBo bo) {
-        LambdaQueryWrapper<SysCustomer> lqw = Wrappers.lambdaQuery();
-        lqw.like(StringUtils.isNotBlank(bo.getUserName()), SysCustomer::getUserName, bo.getUserName());
-        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SysCustomer::getPhone, bo.getPhone());
-        lqw.eq(StringUtils.isNotBlank(bo.getWechatOpenid()), SysCustomer::getWechatOpenid, bo.getWechatOpenid());
-        lqw.orderByDesc(SysCustomer::getId);
-        return lqw;
-    }
-
-    /**
-     * 修改客户
-     */
-    @Override
-    public Boolean updateByBo(SysCustomerBo bo) {
-        SysCustomer update = MapstructUtils.convert(bo, SysCustomer.class);
-        boolean result = baseMapper.updateById(update) > 0;
-        if (result && bo.getId() != null) {
-            CacheUtils.evict(CacheNames.SYS_CUSTOMER_NAME, bo.getId());
-        }
-        return result;
-    }
-
-    /**
-     * 校验授权客户是否已被其他客户占用
-     * @param customerId       当前操作的客户ID
-     * @param authClientFRowIDs 待授权的客户RowID(逗号分隔)
-     * @Author: Trae
-     */
-    @Override
-    public void checkAuthClientConflict(Long customerId, String authClientFRowIDs) {
-        Set<String> newRowIds = Arrays.stream(authClientFRowIDs.split(","))
-            .map(String::trim)
-            .filter(StringUtils::isNotBlank)
-            .collect(Collectors.toSet());
-        if (newRowIds.isEmpty()) {
-            return;
-        }
-        List<SysCustomer> otherCustomers = baseMapper.selectList(
-            Wrappers.lambdaQuery(SysCustomer.class)
-                .select(SysCustomer::getId, SysCustomer::getAuthClientFRowID)
-                .ne(SysCustomer::getId, customerId)
-                .isNotNull(SysCustomer::getAuthClientFRowID)
-                .ne(SysCustomer::getAuthClientFRowID, "")
-        );
-        Set<String> conflictRowIds = new HashSet<>();
-        for (SysCustomer other : otherCustomers) {
-            if (StringUtils.isBlank(other.getAuthClientFRowID())) {
-                continue;
-            }
-            for (String id : other.getAuthClientFRowID().split(",")) {
-                String trimmed = id.trim();
-                if (newRowIds.contains(trimmed)) {
-                    conflictRowIds.add(trimmed);
-                }
-            }
-        }
-        if (conflictRowIds.isEmpty()) {
-            return;
-        }
-        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(new ArrayList<>(conflictRowIds));
-        String conflictNames = conflictRowIds.stream()
-            .map(id -> {
-                CommonErpClientVo vo = infoMap.get(id);
-                return vo != null ? vo.getName() : id;
-            })
-            .collect(Collectors.joining("、"));
-        throw new ServiceException("以下客户已被其他账号授权,请先取消后再操作:" + conflictNames);
-    }
-
-    /**
-     * 批量删除客户
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        return baseMapper.deleteByIds(ids) > 0;
-    }
-
-    @Override
-    public SysCustomerVo queryByWechatUnionid(String wechatUnionid) {
-        return baseMapper.selectVoOne(
-            Wrappers.lambdaQuery(SysCustomer.class)
-                .eq(SysCustomer::getWechatUnionid, wechatUnionid)
-        );
-    }
-
-    @Override
-    public SysCustomerVo queryByWechatOpenid(String wechatOpenid) {
-        return baseMapper.selectVoOne(
-            Wrappers.lambdaQuery(SysCustomer.class)
-                .eq(SysCustomer::getWechatOpenid, wechatOpenid)
-        );
-    }
-
-    @Cacheable(cacheNames = CacheNames.SYS_CUSTOMER_NAME, key = "#customerId")
-    @Override
-    public String selectUserNameById(Long customerId) {
-        SysCustomer customer = baseMapper.selectOne(
-            Wrappers.lambdaQuery(SysCustomer.class)
-                .select(SysCustomer::getUserName)
-                .eq(SysCustomer::getId, customerId)
-        );
-        return customer != null ? customer.getUserName() : null;
-    }
-
-    /**
-     * 修改客户状态(启用/禁用)
-     * @Author: Antigravity
-     */
-    @Override
-    public Boolean changeStatus(Long id, String status) {
-        SysCustomer customer = baseMapper.selectById(id);
-        if (customer == null) {
-            throw new org.dromara.common.core.exception.ServiceException("客户不存在");
-        }
-        customer.setStatus(status);
-        return baseMapper.updateById(customer) > 0;
-    }
-}

+ 315 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysEmployeeServiceImpl.java

@@ -0,0 +1,315 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.EmployeeService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.CacheUtils;
+import org.dromara.system.domain.SysEmployee;
+import org.dromara.system.domain.bo.SysEmployeeBo;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+import org.dromara.system.mapper.SysEmployeeMapper;
+import org.dromara.system.service.ISysEmployeeService;
+import org.dromara.yingpaipay.api.erp.CommonErpClientService;
+import org.dromara.yingpaipay.api.erp.domain.vo.CommonErpClientVo;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 员工管理 Service业务层处理
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Service
+public class SysEmployeeServiceImpl implements ISysEmployeeService, EmployeeService {
+
+    private final SysEmployeeMapper baseMapper;
+    private final CommonErpClientService commonErpClientService;
+
+    /**
+     * 查询员工
+     */
+    @Override
+    public SysEmployeeVo queryById(Long id) {
+        SysEmployeeVo vo = baseMapper.selectVoById(id);
+        fillAuthClientName(vo);
+        return vo;
+    }
+
+    /**
+     * 查询员工详情(仅返回 authClientFRowIDs,由前端调用 ERP 接口反查客户详情)
+     */
+    @Override
+    public SysEmployeeVo queryDetail(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 根据电话查询员工
+     */
+    @Override
+    public SysEmployeeVo queryByPhone(String phone) {
+        return baseMapper.selectVoOne(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .eq(SysEmployee::getPhone, phone)
+        );
+    }
+
+    /**
+     * 根据微信UnionID查询员工
+     */
+    @Override
+    public SysEmployeeVo queryByWechatUnionid(String wechatUnionid) {
+        return baseMapper.selectVoOne(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .eq(SysEmployee::getWechatUnionid, wechatUnionid)
+        );
+    }
+
+    /**
+     * 根据微信OpenID查询员工
+     */
+    @Override
+    public SysEmployeeVo queryByWechatOpenid(String wechatOpenid) {
+        return baseMapper.selectVoOne(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .eq(SysEmployee::getWechatOpenid, wechatOpenid)
+        );
+    }
+
+    /**
+     * 批量填充授权客户信息(列表用,逗号分隔拼接名称/类型/时间)
+     */
+    private void fillAuthClientName(List<SysEmployeeVo> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<String> allIds = list.stream()
+            .map(SysEmployeeVo::getAuthClientFRowIDs)
+            .filter(StringUtils::isNotBlank)
+            .flatMap(ids -> Arrays.stream(ids.split(",")))
+            .map(String::trim)
+            .filter(StringUtils::isNotBlank)
+            .distinct()
+            .collect(Collectors.toList());
+        if (allIds.isEmpty()) {
+            return;
+        }
+        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(allIds);
+        list.forEach(vo -> {
+            if (StringUtils.isBlank(vo.getAuthClientFRowIDs())) {
+                return;
+            }
+            List<String> ids = Arrays.stream(vo.getAuthClientFRowIDs().split(","))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toList());
+            List<CommonErpClientVo> clients = ids.stream()
+                .map(infoMap::get)
+                .filter(c -> c != null)
+                .collect(Collectors.toList());
+            vo.setAuthClientName(clients.stream().map(CommonErpClientVo::getName)
+                .collect(Collectors.joining(" / ")));
+            vo.setAuthClientClass(clients.stream().map(CommonErpClientVo::getClientClass)
+                .collect(Collectors.joining(" / ")));
+            vo.setAuthClientEnterDate(clients.stream()
+                .map(c -> c.getEnterDate() != null ? c.getEnterDate().toString() : "")
+                .collect(Collectors.joining(" / ")));
+        });
+    }
+
+    /**
+     * 单个填充授权客户简要信息(兼容旧逻辑)
+     */
+    private void fillAuthClientName(SysEmployeeVo vo) {
+        if (vo == null || StringUtils.isBlank(vo.getAuthClientFRowIDs())) {
+            return;
+        }
+        fillAuthClientName(Collections.singletonList(vo));
+    }
+
+    /**
+     * 填充授权客户完整详情列表(详情弹框用)
+     */
+    private void fillAuthClientDetail(SysEmployeeVo vo) {
+        if (vo == null || StringUtils.isBlank(vo.getAuthClientFRowIDs())) {
+            vo.setAuthClientList(Collections.emptyList());
+            return;
+        }
+        List<String> ids = Arrays.stream(vo.getAuthClientFRowIDs().split(","))
+            .map(String::trim)
+            .filter(StringUtils::isNotBlank)
+            .collect(Collectors.toList());
+        if (ids.isEmpty()) {
+            vo.setAuthClientList(Collections.emptyList());
+            return;
+        }
+        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(ids);
+        List<CommonErpClientVo> clients = ids.stream()
+            .map(infoMap::get)
+            .filter(c -> c != null)
+            .collect(Collectors.toList());
+        vo.setAuthClientList(clients);
+    }
+
+    /**
+     * 分页查询员工列表
+     */
+    @Override
+    public TableDataInfo<SysEmployeeVo> queryPageList(SysEmployeeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysEmployee> lqw = buildQueryWrapper(bo);
+        Page<SysEmployeeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        fillAuthClientName(result.getRecords());
+        return TableDataInfo.build(result);
+    }
+
+    private LambdaQueryWrapper<SysEmployee> buildQueryWrapper(SysEmployeeBo bo) {
+        LambdaQueryWrapper<SysEmployee> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysEmployee::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SysEmployee::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getWechatOpenid()), SysEmployee::getWechatOpenid, bo.getWechatOpenid());
+        lqw.orderByDesc(SysEmployee::getId);
+        return lqw;
+    }
+
+    /**
+     * 新增员工
+     */
+    @Override
+    public Boolean insertByBo(SysEmployeeBo bo) {
+        SysEmployee add = MapstructUtils.convert(bo, SysEmployee.class);
+        return baseMapper.insert(add) > 0;
+    }
+
+    /**
+     * 修改员工(仅更新非 null 字段,支持部分更新)
+     */
+    @Override
+    public Boolean updateByBo(SysEmployeeBo bo) {
+        SysEmployee update = MapstructUtils.convert(bo, SysEmployee.class);
+        LambdaUpdateWrapper<SysEmployee> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(SysEmployee::getId, update.getId());
+        if (ObjectUtil.isNotNull(update.getName())) {
+            wrapper.set(SysEmployee::getName, update.getName());
+        }
+        if (ObjectUtil.isNotNull(update.getPhone())) {
+            wrapper.set(SysEmployee::getPhone, update.getPhone());
+        }
+        if (ObjectUtil.isNotNull(update.getAvatar())) {
+            wrapper.set(SysEmployee::getAvatar, update.getAvatar());
+        }
+        if (ObjectUtil.isNotNull(update.getStatus())) {
+            wrapper.set(SysEmployee::getStatus, update.getStatus());
+        }
+        if (ObjectUtil.isNotNull(update.getAuthClientFRowIDs())) {
+            wrapper.set(SysEmployee::getAuthClientFRowIDs, update.getAuthClientFRowIDs());
+        }
+        if (ObjectUtil.isNotNull(update.getWechatOpenid())) {
+            wrapper.set(SysEmployee::getWechatOpenid, update.getWechatOpenid());
+        }
+        if (ObjectUtil.isNotNull(update.getWechatUnionid())) {
+            wrapper.set(SysEmployee::getWechatUnionid, update.getWechatUnionid());
+        }
+        boolean result = baseMapper.update(null, wrapper) > 0;
+        if (result && bo.getId() != null) {
+            CacheUtils.evict(CacheNames.SYS_EMPLOYEE_NAME, bo.getId());
+        }
+        return result;
+    }
+
+    /**
+     * 校验授权客户是否已被其他员工占用
+     */
+    @Override
+    public void checkAuthClientConflict(Long employeeId, String authClientFRowIDs) {
+        Set<String> newRowIds = Arrays.stream(authClientFRowIDs.split(","))
+            .map(String::trim)
+            .filter(StringUtils::isNotBlank)
+            .collect(Collectors.toSet());
+        if (newRowIds.isEmpty()) {
+            return;
+        }
+        List<SysEmployee> otherEmployees = baseMapper.selectList(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .select(SysEmployee::getId, SysEmployee::getAuthClientFRowIDs)
+                .ne(SysEmployee::getId, employeeId)
+                .isNotNull(SysEmployee::getAuthClientFRowIDs)
+                .ne(SysEmployee::getAuthClientFRowIDs, "")
+        );
+        Set<String> conflictRowIds = new HashSet<>();
+        for (SysEmployee other : otherEmployees) {
+            if (StringUtils.isBlank(other.getAuthClientFRowIDs())) {
+                continue;
+            }
+            for (String id : other.getAuthClientFRowIDs().split(",")) {
+                String trimmed = id.trim();
+                if (newRowIds.contains(trimmed)) {
+                    conflictRowIds.add(trimmed);
+                }
+            }
+        }
+        if (conflictRowIds.isEmpty()) {
+            return;
+        }
+        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(new ArrayList<>(conflictRowIds));
+        String conflictNames = conflictRowIds.stream()
+            .map(id -> {
+                CommonErpClientVo vo = infoMap.get(id);
+                return vo != null ? vo.getName() : id;
+            })
+            .collect(Collectors.joining("、"));
+        throw new ServiceException("以下客户已被其他员工授权,请先取消后再操作:" + conflictNames);
+    }
+
+    /**
+     * 批量删除员工
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Cacheable(cacheNames = CacheNames.SYS_EMPLOYEE_NAME, key = "#employeeId")
+    @Override
+    public String selectNameById(Long employeeId) {
+        SysEmployee employee = baseMapper.selectOne(
+            Wrappers.lambdaQuery(SysEmployee.class)
+                .select(SysEmployee::getName)
+                .eq(SysEmployee::getId, employeeId)
+        );
+        return employee != null ? employee.getName() : null;
+    }
+
+    /**
+     * 修改员工状态(启用/禁用)
+     */
+    @Override
+    public Boolean changeStatus(Long id, String status) {
+        SysEmployee employee = baseMapper.selectById(id);
+        if (employee == null) {
+            throw new ServiceException("员工不存在");
+        }
+        employee.setStatus(status);
+        return baseMapper.updateById(employee) > 0;
+    }
+}

+ 4 - 0
ruoyi-modules/ruoyi-workflow/pom.xml

@@ -78,6 +78,10 @@
             <groupId>org.dromara.warm</groupId>
             <groupId>org.dromara.warm</groupId>
             <artifactId>warm-flow-plugin-ui-sb-web</artifactId>
             <artifactId>warm-flow-plugin-ui-sb-web</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
 </project>
 </project>

+ 11 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpClientController.java

@@ -11,8 +11,10 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -52,4 +54,13 @@ public class ErpClientController {
         return R.ok(erpClientService.queryById(rowId));
         return R.ok(erpClientService.queryById(rowId));
     }
     }
 
 
+    /**
+     * 根据 ID 列表批量查询客户
+     */
+    @GetMapping("/listByIds")
+    public R<List<ErpClientVo>> listByIds(@RequestParam("rowIds") String rowIds) {
+        List<String> ids = Arrays.asList(rowIds.split(","));
+        return R.ok(erpClientService.queryByIds(ids));
+    }
+
 }
 }

+ 9 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpOrderController.java

@@ -52,6 +52,15 @@ public class ErpOrderController {
         return erpOrderService.queryPageList(query, pageQuery);
         return erpOrderService.queryPageList(query, pageQuery);
     }
     }
 
 
+    /**
+     * 按客户ID分页查询订单(不限制下单人,供客户卡片跳转使用)
+     */
+    @GetMapping("/listByClient")
+    public TableDataInfo<ErpOrderVo> listByClient(ErpOrderQuery query, PageQuery pageQuery) {
+        pageQuery.setPageSize(5);
+        return erpOrderService.queryPageListByClientId(query, pageQuery);
+    }
+
     /**
     /**
      * 按状态统计订单数量
      * 按状态统计订单数量
      */
      */

+ 5 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/ErpOrderQuery.java

@@ -37,4 +37,9 @@ public class ErpOrderQuery {
      */
      */
     private Integer status;
     private Integer status;
 
 
+    /**
+     * 客户ID
+     */
+    private String clientId;
+
 }
 }

+ 1 - 1
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderVo.java

@@ -41,7 +41,7 @@ public class ErpOrderVo implements Serializable {
     /**
     /**
      * 下单人名称
      * 下单人名称
      */
      */
-    @Translation(type = TransConstant.CUSTOMER_ID_TO_NAME, mapper = "placer")
+    @Translation(type = TransConstant.EMPLOYEE_ID_TO_NAME, mapper = "placer")
     @JsonProperty("placerName")
     @JsonProperty("placerName")
     private String placerName;
     private String placerName;
 
 

+ 7 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/mapper/ErpOrderMapper.java

@@ -38,4 +38,11 @@ public interface ErpOrderMapper extends BaseMapperPlus<ErpOrder, ErpOrderVo> {
      */
      */
     java.util.List<java.util.Map<String, Object>> countOrderStatus();
     java.util.List<java.util.Map<String, Object>> countOrderStatus();
 
 
+    /**
+     * 按客户ID分页查询订单(不限制下单人)
+     */
+    com.baomidou.mybatisplus.extension.plugins.pagination.Page<ErpOrderVo> selectOrderVoPageByClientId(
+            @org.apache.ibatis.annotations.Param("page") com.baomidou.mybatisplus.extension.plugins.pagination.Page<ErpOrderVo> page,
+            @org.apache.ibatis.annotations.Param("query") org.dromara.erp.domain.query.ErpOrderQuery query);
+
 }
 }

+ 5 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpClientService.java

@@ -29,4 +29,9 @@ public interface IErpClientService {
      */
      */
     ErpClientVo queryById(String rowId);
     ErpClientVo queryById(String rowId);
 
 
+    /**
+     * 根据ID列表批量查询客户
+     */
+    List<ErpClientVo> queryByIds(List<String> rowIds);
+
 }
 }

+ 5 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpOrderService.java

@@ -19,6 +19,11 @@ public interface IErpOrderService {
      */
      */
     TableDataInfo<ErpOrderVo> queryPageList(ErpOrderQuery query, PageQuery pageQuery);
     TableDataInfo<ErpOrderVo> queryPageList(ErpOrderQuery query, PageQuery pageQuery);
 
 
+    /**
+     * 按客户ID分页查询订单(不限制下单人)
+     */
+    TableDataInfo<ErpOrderVo> queryPageListByClientId(ErpOrderQuery query, PageQuery pageQuery);
+
     /**
     /**
      * 查询订单列表
      * 查询订单列表
      */
      */

+ 8 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpClientServiceImpl.java

@@ -71,6 +71,14 @@ public class ErpClientServiceImpl implements IErpClientService, CommonErpClientS
         return baseMapper.selectVoList(lqw);
         return baseMapper.selectVoList(lqw);
     }
     }
 
 
+    @Override
+    public List<ErpClientVo> queryByIds(List<String> rowIds) {
+        if (rowIds == null || rowIds.isEmpty()) {
+            return List.of();
+        }
+        return baseMapper.selectVoByIds(rowIds);
+    }
+
     private LambdaQueryWrapper<ErpClient> buildQueryWrapper(ErpClientQuery query) {
     private LambdaQueryWrapper<ErpClient> buildQueryWrapper(ErpClientQuery query) {
         LambdaQueryWrapper<ErpClient> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<ErpClient> lqw = Wrappers.lambdaQuery();
         lqw.like(StringUtils.isNotBlank(query.getName()), ErpClient::getName, query.getName());
         lqw.like(StringUtils.isNotBlank(query.getName()), ErpClient::getName, query.getName());

+ 58 - 6
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpOrderServiceImpl.java

@@ -1,14 +1,20 @@
 package org.dromara.erp.service.impl;
 package org.dromara.erp.service.impl;
 
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
+import com.baomidou.lock.executor.RedissonLockExecutor;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.erp.domain.ErpOrder;
 import org.dromara.erp.domain.ErpOrder;
 import org.dromara.erp.domain.query.ErpOrderQuery;
 import org.dromara.erp.domain.query.ErpOrderQuery;
 import org.dromara.erp.domain.vo.ErpOrderVo;
 import org.dromara.erp.domain.vo.ErpOrderVo;
@@ -17,10 +23,8 @@ import org.dromara.erp.service.IErpOrderService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.Date;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 
 /**
 /**
  * 订单 Service 业务层处理
  * 订单 Service 业务层处理
@@ -34,6 +38,7 @@ public class ErpOrderServiceImpl implements IErpOrderService {
     private final ErpOrderMapper baseMapper;
     private final ErpOrderMapper baseMapper;
     private final org.dromara.erp.mapper.ErpOrderDetailMapper erpOrderDetailMapper;
     private final org.dromara.erp.mapper.ErpOrderDetailMapper erpOrderDetailMapper;
     private final org.dromara.erp.mapper.ErpSaleOrderMasterMapper erpSaleOrderMasterMapper;
     private final org.dromara.erp.mapper.ErpSaleOrderMasterMapper erpSaleOrderMasterMapper;
+    private final LockTemplate lockTemplate;
 
 
     @Override
     @Override
     public TableDataInfo<ErpOrderVo> queryPageList(ErpOrderQuery query, PageQuery pageQuery) {
     public TableDataInfo<ErpOrderVo> queryPageList(ErpOrderQuery query, PageQuery pageQuery) {
@@ -46,6 +51,17 @@ public class ErpOrderServiceImpl implements IErpOrderService {
         return TableDataInfo.build(result);
         return TableDataInfo.build(result);
     }
     }
 
 
+    @Override
+    public TableDataInfo<ErpOrderVo> queryPageListByClientId(ErpOrderQuery query, PageQuery pageQuery) {
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<ErpOrderVo> result = baseMapper.selectOrderVoPageByClientId(pageQuery.build(), query);
+
+        List<ErpOrderVo> list = result.getRecords();
+        if (ObjectUtil.isNotEmpty(list)) {
+            fillOrderDetails(list);
+        }
+        return TableDataInfo.build(result);
+    }
+
     @Override
     @Override
     public List<ErpOrderVo> queryList(ErpOrderQuery query) {
     public List<ErpOrderVo> queryList(ErpOrderQuery query) {
         List<ErpOrderVo> list = baseMapper.selectOrderVoList(query);
         List<ErpOrderVo> list = baseMapper.selectOrderVoList(query);
@@ -105,6 +121,45 @@ public class ErpOrderServiceImpl implements IErpOrderService {
         return result;
         return result;
     }
     }
 
 
+    private String generateOrderCode() {
+        String dateStr = DateUtil.format(new Date(), "yyMMdd");
+        String redisKey = CacheConstants.ERP_ORDER_CODE_KEY + dateStr;
+        String lockKey = CacheConstants.ERP_ORDER_CODE_LOCK_KEY + dateStr;
+
+        try {
+            if (!RedisUtils.isExistsObject(redisKey)) {
+                LockInfo lockInfo = lockTemplate.lock(lockKey, 5000L, 3000L, RedissonLockExecutor.class);
+                if (lockInfo == null) {
+                    log.warn("订单号恢复锁获取超时,降级使用雪花ID");
+                    return "WD" + IdUtil.getSnowflakeNextIdStr();
+                }
+                try {
+                    if (!RedisUtils.isExistsObject(redisKey)) {
+                        LambdaQueryWrapper<ErpOrder> lqw = Wrappers.lambdaQuery();
+                        lqw.likeRight(ErpOrder::getCode, "WD" + dateStr)
+                           .orderByDesc(ErpOrder::getCreateTime);
+                        List<ErpOrder> orders = baseMapper.selectList(lqw);
+                        long lastSeq = 0L;
+                        if (!orders.isEmpty()) {
+                            String lastCode = orders.get(0).getCode();
+                            String numPart = lastCode.substring(lastCode.length() - 3);
+                            lastSeq = Long.parseLong(numPart);
+                        }
+                        RedisUtils.setAtomicValue(redisKey, lastSeq);
+                        RedisUtils.expire(redisKey, 60L * 60L * 25L);
+                    }
+                } finally {
+                    lockTemplate.releaseLock(lockInfo);
+                }
+            }
+            long seq = RedisUtils.incrAtomicValue(redisKey);
+            return "WD" + dateStr + String.format("%03d", seq);
+        } catch (Exception e) {
+            log.error("订单号生成失败,降级使用雪花ID", e);
+            return "WD" + IdUtil.getSnowflakeNextIdStr();
+        }
+    }
+
     @Override
     @Override
     @com.baomidou.dynamic.datasource.annotation.DSTransactional
     @com.baomidou.dynamic.datasource.annotation.DSTransactional
     public String insert(org.dromara.erp.domain.bo.ErpOrderBo bo) {
     public String insert(org.dromara.erp.domain.bo.ErpOrderBo bo) {
@@ -113,10 +168,7 @@ public class ErpOrderServiceImpl implements IErpOrderService {
             entity.setRowId(IdUtil.fastUUID());
             entity.setRowId(IdUtil.fastUUID());
         }
         }
         if (ObjectUtil.isEmpty(entity.getCode())) {
         if (ObjectUtil.isEmpty(entity.getCode())) {
-            String dateStr = new java.text.SimpleDateFormat("yyMMdd").format(new java.util.Date());
-            String redisKey = "erp:order:code:" + dateStr;
-            long seq = org.dromara.common.redis.utils.RedisUtils.incrAtomicValue(redisKey);
-            entity.setCode("WD" + dateStr + String.format("%03d", seq));
+            entity.setCode(generateOrderCode());
         }
         }
         if (entity.getPlacer() == null) {
         if (entity.getPlacer() == null) {
             try {
             try {

+ 74 - 0
ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/ErpOrderMapper.xml

@@ -278,4 +278,78 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY statusKey
         ORDER BY statusKey
     </select>
     </select>
 
 
+    <!-- 按客户ID分页查询订单(不限制下单人) -->
+    <select id="selectOrderVoPageByClientId" resultType="org.dromara.erp.domain.vo.ErpOrderVo">
+        SELECT 
+            o.FRowID as rowId,
+            o.FCode as code,
+            o.FPlacer as placer,
+            o.FPlaceTime as placeTime,
+            o.FIsConfirmed as isConfirmed,
+            o.FUrgentFlag as urgentFlag,
+            o.FErpDocCode as docCode,
+            o.CreateTime as createTime,
+            o.FClientID as clientId,
+            o.FClientName as clientName,
+            m.Finished as finished,
+            m.ExFinished as exFinished,
+            m.Reviewed as reviewed,
+            m.Approved as approved,
+            m.Canceled as canceled,
+            CASE 
+                WHEN m.Finished = 1 THEN 5
+                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
+                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
+                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
+                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
+                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
+                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
+                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                ELSE 0
+            END as status
+        FROM t_Applet_Order o
+        LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
+        <where>
+            <if test="query.clientId != null and query.clientId != ''">
+                AND o.FClientID = #{query.clientId}
+            </if>
+            <if test="query.status != null">
+                <choose>
+                    <when test="query.status == 0">
+                        AND o.FIsConfirmed = 0 
+                        AND (m.Finished IS NULL OR m.Finished = 0)
+                        AND (m.ExFinished IS NULL OR m.ExFinished = 0)
+                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
+                        AND (m.Approved IS NULL OR m.Approved = 0)
+                        AND (m.Canceled IS NULL OR m.Canceled = 0)
+                    </when>
+                    <when test="query.status == 1">
+                        AND o.FIsConfirmed = 1
+                        AND (m.Finished IS NULL OR m.Finished = 0)
+                        AND (m.ExFinished IS NULL OR m.ExFinished = 0)
+                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
+                        AND (m.Approved IS NULL OR m.Approved = 0)
+                        AND (m.Canceled IS NULL OR m.Canceled = 0)
+                    </when>
+                    <when test="query.status == 2">
+                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1
+                    </when>
+                    <when test="query.status == 3">
+                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1
+                    </when>
+                    <when test="query.status == 4">
+                        AND m.Finished = 0 AND m.ExFinished = 1
+                    </when>
+                    <when test="query.status == 5">
+                        AND m.Finished = 1
+                    </when>
+                    <when test="query.status == 6">
+                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1
+                    </when>
+                </choose>
+            </if>
+        </where>
+        ORDER BY o.CreateTime DESC
+    </select>
+
 </mapper>
 </mapper>

+ 26 - 23
script/sql/sqlserver/v1/HS_ERP_Order-create.sql

@@ -7,7 +7,7 @@ create table sys_complaint
     feedback_type   nvarchar(50)      DEFAULT ('') NULL,
     feedback_type   nvarchar(50)      DEFAULT ('') NULL,
     content         nvarchar(2000)    DEFAULT ('') NULL,
     content         nvarchar(2000)    DEFAULT ('') NULL,
     images          nvarchar(2000)    NULL,
     images          nvarchar(2000)    NULL,
-    customer_id     bigint            NULL,
+    employee_id     bigint            NULL,
     status          nvarchar(20)      DEFAULT ('0') NULL,
     status          nvarchar(20)      DEFAULT ('0') NULL,
     deal_result     nvarchar(2000)    NULL,
     deal_result     nvarchar(2000)    NULL,
     deal_images     nvarchar(2000)    NULL,
     deal_images     nvarchar(2000)    NULL,
@@ -33,7 +33,7 @@ EXEC sys.sp_addextendedproperty 'MS_Description', N'反馈内容', 'SCHEMA', N'd
 GO
 GO
 EXEC sys.sp_addextendedproperty 'MS_Description', N'图片OSS ID列表(JSON数组字符串)', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'images'
 EXEC sys.sp_addextendedproperty 'MS_Description', N'图片OSS ID列表(JSON数组字符串)', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'images'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'投诉客户ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'customer_id'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'投诉员工ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'employee_id'
 GO
 GO
 EXEC sys.sp_addextendedproperty 'MS_Description', N'状态(0-待处理 1-已处理)', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'status'
 EXEC sys.sp_addextendedproperty 'MS_Description', N'状态(0-待处理 1-已处理)', 'SCHEMA', N'dbo', 'TABLE', N'sys_complaint', 'COLUMN', N'status'
 GO
 GO
@@ -91,16 +91,17 @@ EXEC sys.sp_addextendedproperty 'MS_Description', N'联系电话管理表', 'SCH
 GO
 GO
 
 
 -- ----------------------------
 -- ----------------------------
--- 客户信息表
+-- 员工信息表
 -- ----------------------------
 -- ----------------------------
-create table sys_customer
+create table sys_employee
 (
 (
     id                  bigint            NOT NULL,
     id                  bigint            NOT NULL,
-    user_name           nvarchar(50)      DEFAULT ('') NULL,
+    name                nvarchar(50)      DEFAULT ('') NULL,
     phone               nvarchar(20)      DEFAULT ('') NULL,
     phone               nvarchar(20)      DEFAULT ('') NULL,
+    password            nvarchar(100)     DEFAULT ('') NULL,
     wechat_openid       nvarchar(100)     DEFAULT ('') NULL,
     wechat_openid       nvarchar(100)     DEFAULT ('') NULL,
     wechat_unionid      nvarchar(100)     DEFAULT ('') NULL,
     wechat_unionid      nvarchar(100)     DEFAULT ('') NULL,
-    auth_client_frowid  nvarchar(max)     NULL,
+    auth_client_frowids nvarchar(max)     NULL,
     avatar              bigint            NULL,
     avatar              bigint            NULL,
     status              char(1)           DEFAULT ('1') NULL,
     status              char(1)           DEFAULT ('1') NULL,
     tenant_id           nvarchar(20)      DEFAULT ('000000') NULL,
     tenant_id           nvarchar(20)      DEFAULT ('000000') NULL,
@@ -110,44 +111,46 @@ create table sys_customer
     create_time         datetime2(7),
     create_time         datetime2(7),
     update_by           bigint,
     update_by           bigint,
     update_time         datetime2(7),
     update_time         datetime2(7),
-    CONSTRAINT PK__sys_customer__id PRIMARY KEY CLUSTERED (id)
+    CONSTRAINT PK__sys_employee__id PRIMARY KEY CLUSTERED (id)
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
     ON [PRIMARY]
     ON [PRIMARY]
 )
 )
 ON [PRIMARY]
 ON [PRIMARY]
 GO
 GO
 
 
-EXEC sys.sp_addextendedproperty 'MS_Description', N'客户ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'id'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'员工ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'id'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'用户名', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'user_name'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'姓名', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'name'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'手机号', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'phone'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'电话', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'phone'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'微信OpenID', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'wechat_openid'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'密码', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'password'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'微信UnionID', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'wechat_unionid'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'微信OpenID', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'wechat_openid'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'授权客户ERP RowID', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'auth_client_frowid'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'微信UnionID', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'wechat_unionid'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'头像OSS ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'avatar'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'授权客户ERP RowID(多个逗号分隔)', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'auth_client_frowids'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'账号状态(0-禁用 1-启用)', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'status'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'头像OSS ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'avatar'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'tenant_id'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'账号状态(0-禁用 1-启用)', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'status'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'删除标志(0代表存在 1代表删除)', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'del_flag'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'tenant_id'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'create_dept'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'删除标志(0代表存在 1代表删除)', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'del_flag'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'create_by'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'create_dept'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'create_time'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'create_by'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'update_by'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'create_time'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer', 'COLUMN', N'update_time'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'update_by'
 GO
 GO
-EXEC sys.sp_addextendedproperty 'MS_Description', N'客户信息表', 'SCHEMA', N'dbo', 'TABLE', N'sys_customer'
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee', 'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'员工信息表', 'SCHEMA', N'dbo', 'TABLE', N'sys_employee'
 GO
 GO
 
 
 -- ----------------------------
 -- ----------------------------