You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
12 KiB

3 months ago
package com.example.web.service;
import com.example.web.entity.Login;
import com.example.web.entity.Rootdb;
import com.example.web.entity.UsersManagements;
import com.example.web.entity.Managers;
import com.example.web.mapper.LoginMapper;
import com.example.web.mapper.RootdbMapper;
import com.example.web.mapper.UsersManagementsMapper;
import com.example.web.mapper.SupplyUsersManagementsMapper;
import com.example.web.mapper.ManagersMapper;
import com.example.web.mapper.SupplyManagersMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class LoginService {
@Autowired
private LoginMapper loginMapper;
@Autowired
private RootdbMapper rootdbMapper;
@Autowired
private UsersManagementsMapper usersManagementsMapper; // 销售端 usermanagements
@Autowired
private SupplyUsersManagementsMapper supplyUsersManagementsMapper; // 采购端 usermanagements
@Autowired
private ManagersMapper managersMapper; // 销售端 managers
@Autowired
private SupplyManagersMapper supplyManagersMapper; // 采购端 managers
public Map<String, Object> authenticate(String projectName, String userName, String password) {
Map<String, Object> result = new HashMap<>();
try {
System.out.println("=== 开始认证过程 ===");
System.out.println("工位名: " + projectName + ", 用户名: " + userName);
// 1. 验证登录信息
Login loginInfo = loginMapper.findByProjectNameAndUserName(projectName, userName);
System.out.println("登录信息查询结果: " + (loginInfo != null ? "成功" : "失败"));
if (loginInfo == null) {
result.put("success", false);
result.put("message", "用户名或工位名不存在");
result.put("errorType", "user");
return result;
}
// 2. 验证密码
boolean passwordCorrect = loginInfo.getPassword().equals(password);
System.out.println("密码验证: " + (passwordCorrect ? "正确" : "错误"));
if (!passwordCorrect) {
result.put("success", false);
result.put("message", "密码错误");
result.put("errorType", "password");
return result;
}
// 3. 获取权限信息
Rootdb rootInfo = rootdbMapper.findByProjectName(projectName);
System.out.println("权限信息查询结果: " + (rootInfo != null ? "成功" : "失败"));
System.out.println("权限等级: " + (rootInfo != null ? rootInfo.getRoot() : "无"));
if (rootInfo == null) {
result.put("success", false);
result.put("message", "未找到该职位的权限信息");
return result;
}
// 4. 🔥 关键修改:使用 loginId 来查询负责人信息
String loginId = String.valueOf(loginInfo.getId()); // 获取 login 表的 id
System.out.println("登录ID (loginId): " + loginId);
boolean isSupplySide = isSupplySideProject(projectName);
System.out.println("🔄 系统识别: " + (isSupplySide ? "采购端" : "销售端"));
UsersManagements userManagement = null;
boolean fromManagersTable = false;
// 4.1 首先尝试从 managers 表查询(使用 loginId 作为 managerId)
List<Managers> managersList;
if (isSupplySide) {
managersList = supplyManagersMapper.selectByUserNameAndManagerId(userName, loginId);
} else {
managersList = managersMapper.selectByUserNameAndManagerId(userName, loginId);
}
if (managersList != null && !managersList.isEmpty()) {
// 从 managers 表找到数据
Managers manager = managersList.get(0);
if (managersList.size() > 1) {
System.out.println("找到多个 managers 记录,数量: " + managersList.size());
// 选择最新的记录
manager = managersList.stream()
.sorted((m1, m2) -> {
if (m1.getUpdated_at() != null && m2.getUpdated_at() != null) {
return m2.getUpdated_at().compareTo(m1.getUpdated_at());
}
return 0;
})
.findFirst()
.orElse(managersList.get(0));
}
// 将 Managers 转换为 UsersManagements
userManagement = convertManagerToUserManagement(manager);
fromManagersTable = true;
System.out.println("✅ 从 managers 表获取用户管理信息");
} else {
// 4.2 如果 managers 表没有数据,再从 usermanagements 表查询(使用 loginId 作为 managerId)
List<UsersManagements> userManagementsList;
if (isSupplySide) {
userManagementsList = supplyUsersManagementsMapper.findByUserNameAndManagerId(userName, loginId);
} else {
userManagementsList = usersManagementsMapper.findByUserNameAndManagerId(userName, loginId);
}
if (userManagementsList != null && !userManagementsList.isEmpty()) {
if (userManagementsList.size() > 1) {
System.out.println("找到多个 usermanagements 记录,数量: " + userManagementsList.size());
userManagement = userManagementsList.stream()
.sorted((u1, u2) -> {
if (u1.getUpdated_at() != null && u2.getUpdated_at() != null) {
return u2.getUpdated_at().compareTo(u1.getUpdated_at());
}
return 0;
})
.findFirst()
.orElse(userManagementsList.get(0));
} else {
userManagement = userManagementsList.get(0);
}
System.out.println("✅ 从 usermanagements 表获取用户管理信息");
}
}
if (userManagement == null) {
result.put("success", false);
result.put("message", "未找到对应的负责人信息,请检查用户名和密码是否正确!");
return result;
}
// 打印用户管理信息详情
System.out.println("用户管理信息详情:");
System.out.println(" - 数据来源: " + (fromManagersTable ? "managers表" : "usermanagements表"));
System.out.println(" - managerId: " + userManagement.getManagerId());
System.out.println(" - managercompany: " + userManagement.getManagercompany());
System.out.println(" - managerdepartment: " + userManagement.getManagerdepartment());
System.out.println(" - organization: " + userManagement.getOrganization());
System.out.println(" - role: " + userManagement.getRole());
System.out.println(" - userName: " + userManagement.getUserName());
System.out.println(" - assistant: " + userManagement.getAssistant());
// 5. 生成token(包含端信息)
String token = generateToken(userName, projectName, isSupplySide);
System.out.println("生成的token: " + token);
// 6. 构建返回结果
result.put("success", true);
result.put("token", token);
result.put("root", rootInfo.getRoot());
result.put("user", buildUserResponse(userManagement));
result.put("isSupplySide", isSupplySide);
result.put("fromManagersTable", fromManagersTable); // 新增:标识数据来源
result.put("loginId", loginId); // 返回 loginId
// 返回完整的认证信息供前端使用
Map<String, Object> authInfo = new HashMap<>();
authInfo.put("managerId", userManagement.getManagerId() != null ? userManagement.getManagerId() : "");
authInfo.put("company", userManagement.getManagercompany() != null ? userManagement.getManagercompany() : "");
authInfo.put("department", userManagement.getManagerdepartment() != null ? userManagement.getManagerdepartment() : "");
authInfo.put("organization", userManagement.getOrganization() != null ? userManagement.getOrganization() : "");
authInfo.put("role", userManagement.getRole() != null ? userManagement.getRole() : "");
authInfo.put("userName", userManagement.getUserName() != null ? userManagement.getUserName() : "");
authInfo.put("assistant", userManagement.getAssistant() != null ? userManagement.getAssistant() : "");
result.put("authInfo", authInfo);
System.out.println("✅ 返回完整认证信息: " + authInfo);
System.out.println("最终返回结果: " + result);
System.out.println("=== 认证过程结束 ===");
} catch (Exception e) {
System.err.println("认证过程中发生异常: " + e.getMessage());
e.printStackTrace();
result.put("success", false);
result.put("message", "登录过程中发生错误: " + e.getMessage());
}
return result;
}
/**
* Managers 实体转换为 UsersManagements 实体
*/
private UsersManagements convertManagerToUserManagement(Managers manager) {
UsersManagements userManagement = new UsersManagements();
userManagement.setId(manager.getManager_id());
userManagement.setUserId(manager.getId()); // 使用企业id作为userId
userManagement.setManagerId(manager.getManagerId());
userManagement.setManagercompany(manager.getManagercompany());
userManagement.setManagerdepartment(manager.getManagerdepartment());
userManagement.setOrganization(manager.getOrganization());
userManagement.setRole(manager.getRole());
userManagement.setRoot(manager.getRoot());
userManagement.setCreated_at(manager.getCreated_at());
userManagement.setUpdated_at(manager.getUpdated_at());
userManagement.setUserName(manager.getUserName());
userManagement.setAssistant(manager.getAssistant());
return userManagement;
}
/**
* 判断是否为采购端工位
*/
private boolean isSupplySideProject(String projectName) {
if (projectName == null) {
return false;
}
String lowerProjectName = projectName.toLowerCase();
return lowerProjectName.contains("supply") ||
lowerProjectName.contains("purchase") ||
lowerProjectName.contains("procurement") ||
lowerProjectName.contains("采购");
}
/**
* 生成token包含端信息
*/
private String generateToken(String userName, String projectName, boolean isSupplySide) {
String side = isSupplySide ? "supply" : "sales";
return System.currentTimeMillis() + "-" + userName + "-" + projectName + "-" + side;
}
private Map<String, Object> buildUserResponse(UsersManagements userManagement) {
Map<String, Object> user = new HashMap<>();
user.put("managerId", userManagement.getManagerId() != null ? userManagement.getManagerId() : "");
user.put("managercompany", userManagement.getManagercompany() != null ? userManagement.getManagercompany() : "");
user.put("managerdepartment", userManagement.getManagerdepartment() != null ? userManagement.getManagerdepartment() : "");
user.put("organization", userManagement.getOrganization() != null ? userManagement.getOrganization() : "");
user.put("role", userManagement.getRole() != null ? userManagement.getRole() : "");
user.put("userName", userManagement.getUserName() != null ? userManagement.getUserName() : "");
user.put("assistant", userManagement.getAssistant() != null ? userManagement.getAssistant() : "");
System.out.println("构建的用户响应: " + user);
return user;
}
}