package com.template.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.template.annotation.DESRespondSecret;
import com.template.api.SmartDepartmentControllerAPI;
import com.template.common.utils.*;
import com.template.config.ControlConfig;
import com.template.model.pojo.SmartAuthority;
import com.template.model.pojo.SmartDepartment;
import com.template.model.pojo.SmartUser;
import com.template.model.request.insertDepartmentRequest;
import com.template.model.request.updateDepartmentRequest;
import com.template.model.result.CommonResult;
import com.template.model.result.PageUtils;
import com.template.model.vo.*;
import com.template.services.SmartAuthorityService;
import com.template.services.SmartDepartmentService;
import com.template.services.SmartUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.template.common.utils.AesTestOne.decrypt;
/**
*
* 前端控制器
*
*
* @author ceshi
* @since 2023-12-04
*/
@RestController
//返回参数加密注解
@DESRespondSecret
public class SmartDepartmentController implements SmartDepartmentControllerAPI {
@Resource
private ControlConfig controlConfig;
@Autowired
private SmartUserService smartUserService;
@Autowired
private SmartAuthorityService smartAuthorityService;
@Autowired
private SmartDepartmentService smartDepartmentService;
/**
* 新增部门
*
* @param smartDepartment 部门数据
* @param bindingResult
* @return
*/
@Override
@DESRespondSecret(validated = true)
public CommonResult insertSmartDepartment(insertDepartmentRequest smartDepartment, BindingResult bindingResult) throws Exception {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
//百胜不允许部门名称重复
int exist = smartDepartmentService.existDataByName(smartDepartment.getName());
if (exist > 0) {
return CommonResult.fail("同级部门中," + smartDepartment.getName() + "部门名称数据已存在,请勿重复添加!");
}
SmartDepartment sd = new SmartDepartment();
sd.setParentId(smartDepartment.getParentId());
sd.setName(smartDepartment.getName());
//region 百胜添加部门数据
String appId = controlConfig.getAppId();
String schoolno = controlConfig.getSchoolCode();
String timestamp = TimeExchange.DateNowTimeStamo();
String appSecret = controlConfig.getAppSecret();
String url = controlConfig.getUrl() + "department/create";
JSONObject jsonobject = new JSONObject();
jsonobject.put("appid", appId);
String str = "{\"department_name\":\"" + smartDepartment.getName() + "\"}";
String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
jsonobject.put("data", aesStr);
jsonobject.put("schoolno", schoolno);
jsonobject.put("timestamp", timestamp);
String md5Str = "appid=" + appId + "&data={\"department_name\":\"" + smartDepartment.getName() + "\"}" + "&schoolno=" + schoolno + "×tamp=" + timestamp + "&key=" + appSecret;
String sign = CommonUtil.MD5(md5Str);
//sign签名
jsonobject.put("sign", sign);
//返回的结果中 code为1表示成功
String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());
if (bsResult.contains("添加成功")) {
ObjectMapper objectMapper = new ObjectMapper();
BsDepartmentVo department = objectMapper.readValue(bsResult, BsDepartmentVo.class);
// URL解码
String decodedUrl = URLDecoder.decode(department.getData(), "UTF-8");
BsDepartmentNoVo departmentData = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsDepartmentNoVo.class);
sd.setBsDepartmentNo(departmentData.getDepartment_no());
}
//endregion
int result = smartDepartmentService.insertSmartDepartment(sd);
return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
}
/**
* 更新部门
*
* @param udr 部门数据
* @param bindingResult
* @return
*/
@Override
@DESRespondSecret(validated = true)
public CommonResult updateSmartDepartmentById(updateDepartmentRequest udr, BindingResult bindingResult) throws Exception {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
SmartDepartment oldData = smartDepartmentService.getSmartById(udr.getId());
if (oldData == null) {
return CommonResult.fail("部门数据无效,修改失败");
}
//百胜不允许部门名称重复
SmartDepartment exist = smartDepartmentService.getSmartByName(udr.getName());
if (exist != null && !exist.getId().equals(udr.getId())) {
return CommonResult.fail(udr.getName() + "部门名称数据已存在,请勿重复添加!");
}
SmartDepartment sd = new SmartDepartment();
sd.setId(udr.getId());
sd.setParentId(udr.getParentId());
sd.setName(udr.getName());
sd.setBsDepartmentNo(oldData.getBsDepartmentNo());
//region 百胜添加部门数据
String appId = controlConfig.getAppId();
String schoolno = controlConfig.getSchoolCode();
String timestamp = TimeExchange.DateNowTimeStamo();
String appSecret = controlConfig.getAppSecret();
String url = controlConfig.getUrl() + "department/update";
JSONObject jsonobject = new JSONObject();
jsonobject.put("appid", appId);
String str = "{\"department_no\":\"" + oldData.getBsDepartmentNo() + "\",\"department_name\":\"" + udr.getName() + "\"}";
String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
jsonobject.put("data", aesStr);
jsonobject.put("schoolno", schoolno);
jsonobject.put("timestamp", timestamp);
String md5Str = "appid=" + appId + "&data={\"department_no\":\"" + oldData.getBsDepartmentNo() + "\",\"department_name\":\"" + udr.getName() + "\"}" + "&schoolno=" + schoolno + "×tamp=" + timestamp + "&key=" + appSecret;
String sign = CommonUtil.MD5(md5Str);
//sign签名
jsonobject.put("sign", sign);
//返回的结果中 code为1表示成功
String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());
if (!bsResult.contains("更新成功")) {
return CommonResult.fail("修改失败");
}
//endregion
int result = smartDepartmentService.updateSmartDepartment(sd);
return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
}
/**
* 部门分页数据查询
*
* @param currentPage 当前页数
* @param pageCount 一页数据条数
* @param name 查询名称
* @return
*/
@Override
@DESRespondSecret(validated = true)
public CommonResult queryPageSmartDepartments(int currentPage, int pageCount, String name) {
PageUtils result = smartDepartmentService.queryPageSmartDepartments(currentPage, pageCount, name);
return CommonResult.ok(result);
}
@Override
@DESRespondSecret(validated = true)
public CommonResult deleteSmartDepartmentById(int id) {
SmartDepartment data = smartDepartmentService.getSmartById(id);
if (data == null) {
return CommonResult.fail("当前数据不存在,删除失败!");
}
int result = smartDepartmentService.deleteSmartDepartmentById(id);
return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
}
/**
* 根据部门名称查询部门树形图结构数据
*
* @param name 部门名称
* @return
*/
@Override
@DESRespondSecret(validated = true)
public CommonResult queryDepartmentTree(String name, String userhead) {
//region 角色判断
String userID = AesUtils.decrypt(userhead);
SmartUser operateData = smartUserService.getSmartById(Integer.valueOf(userID));
if (operateData == null) {
return CommonResult.fail("用户信息不合法,无法查看");
}
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", operateData.getId());
List authorities = smartAuthorityService.getAuthorByKey(queryWrapper);
if (authorities == null) {
return CommonResult.fail("当前用户权限不足,无法查看对应部门数据");
}
if (authorities.size() <= 0) {
return CommonResult.fail("当前用户权限不足,无法查看对应部门数据");
}
List viewAuthors = new ArrayList<>();//部门查看权限
List manageAuthors = new ArrayList<>();//部门管理权限
for (SmartAuthority author : authorities) {
List views = StringUtils.hasText(author.getDepartmentView().trim()) ? Arrays.asList(author.getDepartmentView().trim().split(",")) : new ArrayList<>();
if (views != null && views.size() > 0) {
viewAuthors.addAll(views);
}
List manages = StringUtils.hasText(author.getDepartmentManage().trim()) ? Arrays.asList(author.getDepartmentManage().trim().split(",")) : new ArrayList<>();
if (manages != null && manages.size() > 0) {
manageAuthors.addAll(manages);
}
}
List result = smartDepartmentService.getSmartsByName(name);
//region 往上查找上一级
List newViewAthors = new ArrayList<>();
List newManageAthors = new ArrayList<>();
if (!viewAuthors.contains("1")) {
//region
for (String view : viewAuthors) {
Optional department = result.stream().filter(e -> e.getId().equals(Integer.valueOf(view))).findFirst();
if (department != null && department.isPresent()) {
newViewAthors.add(String.valueOf(department.get().getParentId()));
newViewAthors.addAll(queryAllParentId(department.get().getParentId(), result));
}
}
//endregion
}
newViewAthors.addAll(viewAuthors);
if (!manageAuthors.contains("1")) {
//region
for (String view : manageAuthors) {
Optional department = result.stream().filter(e -> e.getId().equals(Integer.valueOf(view))).findFirst();
if (department != null && department.isPresent()) {
newManageAthors.add(String.valueOf(department.get().getParentId()));
newManageAthors.addAll(queryAllParentId(department.get().getParentId(), result));
}
}
//endregion
}
newManageAthors.addAll(manageAuthors);
//endregion
newViewAthors = (newViewAthors != null && newViewAthors.size() > 0) ? newViewAthors.stream().distinct().collect(Collectors.toList()) : newViewAthors;
newManageAthors = (newManageAthors != null && newManageAthors.size() > 0) ? newManageAthors.stream().distinct().collect(Collectors.toList()) : newManageAthors;
//endregion
List zeroResult = result.stream().filter(e -> e.getParentId().intValue() == 0).collect(Collectors.toList());
List departments = new ArrayList<>();
if (ObjectUtils.isEmpty(name)) {
for (SmartDepartment data : zeroResult) {
long existViewData = newViewAthors == null ? 0 : newViewAthors.stream().filter(e -> e.equals(data.getId().toString())).count();
long existManageData = newManageAthors == null ? 0 : newManageAthors.stream().filter(e -> e.equals(data.getId().toString())).count();
if (existViewData <= 0 && existManageData <= 0 && data.getParentId().intValue() != 0) {
continue;
}
DepartmentTreeVo newData = new DepartmentTreeVo().builder()
.id(data.getId())
.name(data.getName())
.parentId(data.getParentId())
.isManage(existManageData > 0 ? 1 : 0)
.build();
List departmentTrees = QueryDepartmentTreeRecords(newData.getId(), result, newViewAthors, newManageAthors);
newData.setChildren(departmentTrees);
departments.add(newData);
}
} else {
for (SmartDepartment data : result) {
long existViewData = newViewAthors == null ? 0 : newViewAthors.stream().filter(e -> e.equals(data.getId().toString())).count();
long existManageData = newManageAthors == null ? 0 : newManageAthors.stream().filter(e -> e.equals(data.getId().toString())).count();
if (existViewData <= 0 && existManageData <= 0) {
continue;
}
DepartmentTreeVo newData = new DepartmentTreeVo().builder()
.id(data.getId())
.name(data.getName())
.parentId(data.getParentId())
.isManage(existManageData > 0 ? 1 : 0)
.build();
departments.add(newData);
}
}
return CommonResult.ok(departments);
}
private List queryAllParentId(Integer parentId, List lists) {
List newIds = new ArrayList<>();
Optional department = lists.stream().filter(e -> e.getId().equals(parentId)).findFirst();
if (department != null && department.isPresent()) {
if(department.get().getParentId().intValue() != 0){
newIds.add(String.valueOf(department.get().getParentId()));
}
List queryList = queryAllParentId(department.get().getParentId(), lists);
newIds.addAll(queryList);
}
return newIds;
}
/**
* 根据父级ID获取树形数据
*
* @param parentID 父级ID
* @param lists 数据集合
* @return
*/
private List QueryDepartmentTreeRecords(Integer parentID, List lists, List viewDatas, List manageDatas) {
List newTrees = new ArrayList<>();
List datas = lists.stream().filter(e -> e.getParentId().equals(parentID)).collect(Collectors.toList());
for (SmartDepartment data : datas) {
long existViewData = viewDatas == null ? 0 : viewDatas.stream().filter(e -> e.equals(data.getId().toString())).count();
long existManageData = manageDatas == null ? 0 : manageDatas.stream().filter(e -> e.equals(data.getId().toString())).count();
if (existViewData <= 0 && existManageData <= 0) {
continue;
}
DepartmentTreeVo item = DepartmentTreeVo.builder()
.id(data.getId())
.parentId(parentID)
.name(data.getName())
.isManage(existManageData > 0 ? 1 : 0)
.build();
List news = QueryDepartmentTreeRecords(item.getId(), lists, viewDatas, manageDatas);
if (news == null || news.size() == 0) {
newTrees.add(item);
continue;
} else {
item.setChildren(news);
newTrees.add(item);
}
}
return newTrees;
}
/**
* 根据部门名称查询部门树形图结构数据
*
* @param name 部门名称
* @return
*/
@Override
@DESRespondSecret(validated = true)
public CommonResult queryAllDepartmentTree(String name, String userhead) {
//region 角色判断
String userID = AesUtils.decrypt(userhead);
SmartUser operateData = smartUserService.getSmartById(Integer.valueOf(userID));
if (operateData == null) {
return CommonResult.fail("用户信息不合法,无法查看");
}
//endregion
List result = smartDepartmentService.getSmartsByName(name);
List zeroResult = result.stream().filter(e -> e.getParentId().intValue() == 0).collect(Collectors.toList());
List departments = new ArrayList<>();
if (ObjectUtils.isEmpty(name)) {
for (SmartDepartment data : zeroResult) {
DepartmentTreeVo newData = new DepartmentTreeVo().builder()
.id(data.getId())
.name(data.getName())
.parentId(data.getParentId())
.isManage(1)
.build();
List departmentTrees = QueryAllDepartmentTreeRecords(newData.getId(), result);
newData.setChildren(departmentTrees);
departments.add(newData);
}
} else {
for (SmartDepartment data : result) {
DepartmentTreeVo newData = new DepartmentTreeVo().builder()
.id(data.getId())
.name(data.getName())
.parentId(data.getParentId())
.isManage(1)
.build();
departments.add(newData);
}
}
return CommonResult.ok(departments);
}
/**
* 根据父级ID获取树形数据
*
* @param parentID 父级ID
* @param lists 数据集合
* @return
*/
private List QueryAllDepartmentTreeRecords(Integer parentID, List lists) {
List newTrees = new ArrayList<>();
List datas = lists.stream().filter(e -> e.getParentId().equals(parentID)).collect(Collectors.toList());
for (SmartDepartment data : datas) {
DepartmentTreeVo item = DepartmentTreeVo.builder()
.id(data.getId())
.parentId(parentID)
.name(data.getName())
.isManage(1)
.build();
List news = QueryAllDepartmentTreeRecords(item.getId(), lists);
if (news == null || news.size() == 0) {
newTrees.add(item);
continue;
} else {
item.setChildren(news);
newTrees.add(item);
}
}
return newTrees;
}
}