package com.hxzk.gps.service.impl.Company;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hxzk.gps.controller.Company.Results.*;
import com.hxzk.gps.controller.System.SystemLogUtil;
import com.hxzk.gps.entity.Company.TbCompany;
import com.hxzk.gps.entity.Department.TbDepartment;
import com.hxzk.gps.entity.Department.TbDepartMentIcon;
import com.hxzk.gps.entity.Map.TbMarsHomeset;
import com.hxzk.gps.entity.Menu.Menu;
import com.hxzk.gps.entity.Person.TbPerson;
import com.hxzk.gps.entity.Role.Rolemenu;
import com.hxzk.gps.entity.ThreeModel.TbThreemodel;
import com.hxzk.gps.entity.User.TbUser;
import com.hxzk.gps.entity.Role.Role;
import com.hxzk.gps.entity.WarnTongJi.WarnTongjiCompany;
import com.hxzk.gps.mapper.Company.TbCompanyMapper;
import com.hxzk.gps.service.Company.TbCompanyService;
import com.hxzk.gps.service.Department.TbDepartmentService;
import com.hxzk.gps.service.Department.TbDepartMentIconService;
import com.hxzk.gps.service.Map.TbMarsHomesetService;
import com.hxzk.gps.service.Menu.MenuService;
import com.hxzk.gps.service.Person.TbPersonService;
import com.hxzk.gps.service.Role.RoleMenuService;
import com.hxzk.gps.service.ThreeModel.TbThreemodelService;
import com.hxzk.gps.service.User.TbUserService;
import com.hxzk.gps.service.Role.IRoleService;
import com.hxzk.gps.service.WarnTongJi.WarnTongjiCompanyService;
import com.hxzk.gps.util.AuToComplete;
import com.hxzk.gps.util.GetUser.UserInfoUtil;
import com.hxzk.gps.util.MessageUtils.MessageUtils;
import com.hxzk.gps.util.Result.ReturnMessage;
import com.hxzk.gps.util.Result.TableDto;
import com.hxzk.gps.util.Time.TimeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
*
* 公司服务实现类
*
*
* @author YuZhiTong
* @since 2025-04-17
*/
@Service
@Slf4j
public class TbCompanyServiceImpl extends ServiceImpl implements TbCompanyService {
//
@Autowired
TbCompanyMapper companyMapper;
@Autowired
TbDepartMentIconService tbDepartMentIconService;
@Autowired
TbDepartmentService departmentService;
@Autowired
TbPersonService personService;
@Autowired
TbUserService userService;
@Autowired
IRoleService roleService;
@Autowired
MenuService menuService;
@Autowired
RoleMenuService roleMenuService;
@Autowired
TbMarsHomesetService marsHomesetService;
@Autowired
WarnTongjiCompanyService warnTongjiCompanyService;
@Autowired
TbThreemodelService tbThreemodelService;
@Value("${upload.dir-IP}")
private String uploadIp;
@Value("${upload.dir-Map-Three}")
private String dirMapThree;
/*
* 公司列表信息
* */
@Override
public CompanyResult FindCompanyInfo(CompanyTreeTableDto companyTreeTableDto) {
// 创建查询包装器
QueryWrapper queryWrapper = new QueryWrapper<>();
// 处理部门 ID 为空的情况
if (StringUtils.isEmpty(companyTreeTableDto.getDepartmentId())) {
List list = getChildCompanyIds(UserInfoUtil.getUserCompanyId());
queryWrapper.in("parentid", list);
} else {
queryWrapper.eq("parentid", companyTreeTableDto.getDepartmentId());
}
// 处理公司名称查询条件
Optional.ofNullable(companyTreeTableDto.getCompanyname()).ifPresent(companyname ->
queryWrapper.like("companyname", companyname));
// 使用PageHelper进行分页查询
Page page = PageHelper.startPage(companyTreeTableDto.getPageNum(), companyTreeTableDto.getPageSize())
.doSelectPage(() -> baseMapper.selectList(queryWrapper));
// 封装公司列表
TableDto tableDto = new TableDto(page.getResult(), page.getPageNum(), page.getPageSize(), page.getTotal());
// 获取成功消息
String message = MessageUtils.getMessage("Success");
// 返回结果 - 需要根据CompanyResult的构造函数调整参数
return new CompanyResult(200, message, tableDto);
}
@Override
public CompanyDepartmentResult FindUserDepartmentCompany() {
// 获取当前登录公司
TbCompany currentCompany = getCurrentCompany();
if (currentCompany == null) {
return new CompanyDepartmentResult(404, new ArrayList<>(), "未找到公司");
}
// 获取所有相关公司
List allCompanies = getAllRelatedCompanies(currentCompany);
// 构建子项列表
List childItems = buildChildItems(allCompanies, currentCompany.getId());
// 构建数据项
DataItem dataItem = buildDataItem(currentCompany, childItems);
// 构建最终结果
List dataItems = new ArrayList<>();
dataItems.add(dataItem);
return new CompanyDepartmentResult(200, dataItems, "查询成功");
}
private List buildChildItems(List allCompanies, int parentId) {
List childItems = new ArrayList<>();
for (TbCompany company : allCompanies) {
if (company.getParentid() == parentId) {
// 递归获取子公司列表
List children = buildChildItems(allCompanies, company.getId());
// 创建 ChildItem 对象并正确赋值子列表
childItems.add(new ChildItem(String.valueOf(company.getId()), company.getCompanyname(),company.getLogo(),children));
}
}
return childItems;
}
private DataItem buildDataItem(TbCompany currentCompany, List childItems) {
return new DataItem(String.valueOf(currentCompany.getId()), UserInfoUtil.getUserCompany(),currentCompany.getLogo(), childItems);
}
//获取递归子公司的ID
@Override
public List getChildCompanyIds(String companyid) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", companyid);
TbCompany company = baseMapper.selectOne(queryWrapper);
List allCompanies = getAllRelatedCompanies(company);
List list = new ArrayList<>();
for (TbCompany tbCompany : allCompanies) {
list.add(tbCompany.getId());
}
return list;
}
@Override
public List getChildCompanyNames(String companyname) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("companyname", companyname);
TbCompany company = baseMapper.selectOne(queryWrapper);
List allCompanies = getAllRelatedCompanies(company);
List list = new ArrayList<>();
for (TbCompany tbCompany : allCompanies) {
list.add(tbCompany.getCompanyname());
}
return list;
}
/*
* 根据参数ID查询公司名称
* @return 返回公司名称
* @author YuZhiTong
* @since 2025-05-19
* */
@Override
public String getChildCompanyName(String id) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id",id);
return baseMapper.selectOne(queryWrapper).getCompanyname();
}
/*
* 公司下拉列表
* @param company 公司信息
* @return 公司下拉列表
* @author YuZhiTong
* @since 2025-05-19
* */
@Override
public List CompanyAutocomplete(TbCompany company) {
List list = getChildCompanyIds(String.valueOf(Optional.ofNullable(company.getId()).orElse(Integer.valueOf(UserInfoUtil.getUserCompanyId()))));
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("parentid", list).or().eq("id",Optional.ofNullable(company.getId()).orElse(Integer.valueOf(UserInfoUtil.getUserCompanyId())));
List companyList = baseMapper.selectList(queryWrapper);
List addCustomerList = companyList.stream()
.map(companys -> {
AuToComplete addCustomer = new AuToComplete();
addCustomer.setValue(companys.getCompanyname());
addCustomer.setLink(String.valueOf(companys.getId()));
return addCustomer;
})
.collect(Collectors.toList());
return addCustomerList;
}
@Override
public List FenceCompanyAutocomplete() {
List list = getChildCompanyIds(UserInfoUtil.getUserCompanyId());
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("parentid", list).or().eq("id",UserInfoUtil.getUserCompanyId());
List companyList = baseMapper.selectList(queryWrapper);
List addCustomerList = companyList.stream()
.map(companys -> {
AuToComplete addCustomer = new AuToComplete();
addCustomer.setValue(companys.getCompanyname());
addCustomer.setLink(String.valueOf(companys.getId()));
return addCustomer;
})
.collect(Collectors.toList());
return addCustomerList;
}
@Override
@Transactional
public ReturnMessage add(TbCompany company) {
boolean isSuccess = false;
try {
// 检查公司是否已存在
if (isCompanyExist(company)) {
return ReturnMessage.ReturnMessageError("CompanyRepeat");
}
// 设置公司基本信息
setCompanyBasicInfo(company);
baseMapper.insert(company);
// 获取新创建的公司信息
TbCompany companyMars = getNewCreatedCompany(company.getCompanyname());
// 初始化相关配置
initCompanyConfigurations(company, companyMars);
// 初始化默认角色
initCompanyRoles(companyMars);
// 初始化部门和图标
initDepartmentsAndIcons(company, companyMars);
// initThreeModel(companyMars);
isSuccess = true;
} catch (Exception e) {
log.error("新增公司失败: {}", e);
throw new RuntimeException("新增公司失败", e);
}
return SystemLogUtil.handleAddResult(isSuccess, "CompanyAdd", company.getCompanyname());
}
@Override
public ReturnMessage update(TbCompany company) {
/*
声明操作状态
* */
boolean isSuccess = false;
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id",company.getId());
try {
company.setAddtime(TimeUtil.GetTime());
baseMapper.update(company,queryWrapper);
isSuccess = true;
}catch (Exception e){
}
return SystemLogUtil.handleUpdateResult(isSuccess,"CompanyUpdate",company.getCompanyname());
}
@Override
@Transactional
public ReturnMessage delete(TbCompany company) {
try {
// 先检查公司是否可以删除
ReturnMessage checkResult = checkCompanyCanDelete(company.getId());
if (!checkResult.getCode().equals(200)) {
return checkResult;
}
// 执行删除操作
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", company.getId());
boolean isSuccess = baseMapper.delete(queryWrapper) > 0;
if (isSuccess) {
// 删除成功,记录日志
return SystemLogUtil.handleDeleteResult(true, "CompanyDelete", company.getCompanyname());
} else {
return ReturnMessage.ReturnMessageError("CompanyDeleteFailed");
}
} catch (Exception e) {
log.error("删除公司失败: {}", e.getMessage(), e);
return ReturnMessage.ReturnMessageError("CompanyDeleteException");
}
}
@Override
public ReturnMessage checkCompanyCanDelete(Integer companyId) {
try {
// 创建绑定数据汇总对象
CompanyDeleteCheckResult.BindingDataSummary bindingData = new CompanyDeleteCheckResult.BindingDataSummary();
// 检查是否存在子部门
QueryWrapper deptQuery = new QueryWrapper<>();
deptQuery.eq("companyid", companyId);
Long deptCount = departmentService.getBaseMapper().selectCount(deptQuery);
bindingData.setDepartmentCount(deptCount);
// 检查是否存在人员
QueryWrapper personQuery = new QueryWrapper<>();
personQuery.eq("companyid", companyId);
Long personCount = personService.getBaseMapper().selectCount(personQuery);
bindingData.setPersonCount(personCount);
// 检查是否存在用户
QueryWrapper userQuery = new QueryWrapper<>();
userQuery.eq("companyid", companyId);
Long userCount = userService.getBaseMapper().selectCount(userQuery);
bindingData.setUserCount(userCount);
// 检查是否存在角色
QueryWrapper roleQuery = new QueryWrapper<>();
roleQuery.eq("companyid", companyId);
Long roleCount = roleService.getBaseMapper().selectCount(roleQuery);
bindingData.setRoleCount(roleCount);
// 检查是否存在部门图标
QueryWrapper iconQuery = new QueryWrapper<>();
iconQuery.eq("companyid", companyId);
Long iconCount = tbDepartMentIconService.getBaseMapper().selectCount(iconQuery);
bindingData.setIconCount(iconCount);
// 检查是否存在车辆(如果有车辆服务)
try {
QueryWrapper