package com.zt.life.core.service;
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
import com.zt.common.constant.Constant;
|
import com.zt.common.constant.Status;
|
import com.zt.common.db.query.QueryFilter;
|
import com.zt.common.entity.MapData;
|
import com.zt.common.exception.RenException;
|
import com.zt.common.service.BaseService;
|
import com.zt.common.utils.CommonUtils;
|
import com.zt.common.utils.TreeUtils;
|
import com.zt.core.context.UserContext;
|
import com.zt.core.sys.model.SysDept;
|
import com.zt.core.sys.service.ISysDeptService;
|
import com.zt.life.core.constant.Cache;
|
import com.zt.life.core.dao.ZtProductDao;
|
import com.zt.life.core.dto.SearchNodesDto;
|
import com.zt.life.core.enums.CompanyType;
|
import com.zt.life.core.model.ZtProduct;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.stereotype.Service;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 产品结构树,id为数据主键,productId为产品主键
|
* <p>
|
* 本类隐藏id,手工将productId作为id返回给外部使用
|
*
|
* @author zt generator
|
* @since 1.0.0 2020-07-15
|
*/
|
@Service
|
public class ZtProductService extends BaseService<ZtProductDao, ZtProduct> {
|
|
@Value("${zt.oss.local-area}")
|
private String localArea;
|
|
@Autowired
|
private ISysDeptService sysDeptService;
|
|
public List<ZtProduct> getAllNodes() {
|
List<ZtProduct> all = baseDao.getAllNodes();
|
return all;
|
}
|
|
public List<ZtProduct> getTreeNodes(String pid) {
|
Date beginDate = new Date();
|
List<ZtProduct> list = baseDao.getTreeNodes(pid);
|
Date nowDate = new Date();
|
String msg = "产品层级查询时间:" + CommonUtils.getDatePoor(nowDate, beginDate) + "\r\n";
|
System.out.println(msg);
|
return list;
|
}
|
|
public List<ZtProduct> getLevelList(String l1) {
|
List<ZtProduct> productList = baseDao.getLevelList(l1);
|
return productList;
|
}
|
|
public List<ZtProduct> page(QueryFilter queryFilter) {
|
return query(queryFilter);
|
}
|
|
|
/**
|
* 查询所有,包含历史版本
|
*
|
* @return
|
*/
|
public List<ZtProduct> getAll() {
|
// 这里手动缓存,不然在当前方法内调用缓存无效
|
List<ZtProduct> all = null;//(List<ZtProduct>) CacheUtils.get(Cache.ZTPRODUCT, "all");
|
if (all == null) {
|
all = baseDao.getAll();
|
//CacheUtils.put(Cache.ZTPRODUCT, "all", all);
|
}
|
return all.stream().map(product -> {
|
try {
|
ZtProduct p = product.clone();
|
p.setId(p.getProductId()); // 将productId设置给id
|
return p;
|
} catch (CloneNotSupportedException e) {
|
}
|
return null;
|
}).collect(Collectors.toList());
|
}
|
|
public List<ZtProduct> getShipList(String area) {
|
// String area = null;
|
// if (localArea.equals("qd") || localArea.equals("sy"))
|
// area = localArea;
|
List<ZtProduct> list = baseDao.getShipList(area);
|
return list;
|
}
|
|
public List<ZtProduct> getSubList(String pid) {
|
Date beginDate = new Date();
|
List<ZtProduct> list = baseDao.getSubList(pid);
|
Date nowDate = new Date();
|
String msg = "子节点查询时间:" + CommonUtils.getDatePoor(nowDate, beginDate) + "\r\n";
|
System.out.println(msg);
|
return list;
|
}
|
|
public List<ZtProduct> getListByIds(String ids) {
|
List<ZtProduct> list = baseDao.getListByIds(ids);
|
return list;
|
}
|
|
public Map getProductMapByIds(String ids) {
|
List<ZtProduct> list = baseDao.getListByIds(ids);
|
Map<String, String> map = new Hashtable();
|
for (ZtProduct data : list) {
|
map.put(data.getId().toString(), data.getName());
|
}
|
return map;
|
}
|
|
/**
|
* 获取树,懒加载
|
*
|
* @param parentId
|
* @return
|
*/
|
public List<ZtProduct> getProductTree(Long parentId) {
|
List<ZtProduct> list = new ArrayList<>();
|
if (parentId == 0L) { // 首先只查询两级
|
List<ZtProduct> list2 = this.getWithDescendant(0L);
|
list.addAll(TreeUtils.build(list2));
|
list.stream().forEach(product -> product.getChildren().stream().forEach(product1 -> {
|
product1.setHasChildren(product1.getChildren().size() > 0);
|
product1.getChildren().clear();
|
}));
|
} else {
|
list.addAll(this.getChildren(parentId));
|
Map<Long, Boolean> childrenMap = new HashMap<>();
|
this.getAll().stream().forEach(product -> {
|
if (!childrenMap.containsKey(product.getParentProductId())) {
|
childrenMap.put(product.getParentProductId(), true);
|
}
|
});
|
list.stream().forEach(product -> product.setHasChildren(childrenMap.containsKey(product.getId())));
|
}
|
return list;
|
}
|
|
public List<ZtProduct> getAllProduct() {
|
List<ZtProduct> all = baseDao.getAll();
|
return all;
|
}
|
|
public Long getProductIdByNameSql(Long pid, String level, String name) {
|
return baseDao.getProductIdByNameSql(pid, level, name);
|
}
|
|
public Long getProductIdByName(List<ZtProduct> all, Long pid, String level, String name) {
|
List<ZtProduct> list = all.stream().filter(product ->
|
product.getLevel().equals(level)
|
&& product.getName().equals(name)
|
&& ("," + product.getParentProductIds() + ",").contains("," + pid + ",")
|
).collect(Collectors.toList());
|
if (list.size() > 0) {
|
return list.get(0).getProductId();
|
}
|
return null;
|
}
|
|
public Long getProductIdById(List<ZtProduct> all, String level, String name) {
|
List<ZtProduct> list = all.stream().filter(product ->
|
product.getLevel().equals(level)
|
&& product.getName().equals(name)
|
).collect(Collectors.toList());
|
if (list.size() > 0) {
|
return list.get(0).getProductId();
|
}
|
return null;
|
}
|
|
/**
|
* 产品结构树
|
*
|
* @param parentIds
|
* @param showLevel
|
* @return
|
*/
|
public List<ZtProduct> getProductTree(String parentIds, String showLevel) {
|
ZtProduct currentUserTZtProduct = null;// 当前用户所属的T
|
long companyId = UserContext.getUser().getCompanyId();
|
// companyId = 1304648154755698690L;
|
if (companyId > 0) {
|
SysDept dept = sysDeptService.get(companyId);
|
if (dept == null) {
|
throw new RenException("用户所属单位不存在!");
|
}
|
if (CompanyType.T.getValue().equals(dept.getNature())) {// T用户登录
|
List<ZtProduct> list = this.getAll().stream().filter(product -> dept.getCode().equals(product.getCode())).collect(Collectors.toList());
|
if (list.size() > 0) {
|
currentUserTZtProduct = list.get(0);
|
}
|
}
|
}
|
List<ZtProduct> list = new ArrayList<>();
|
if (StringUtils.isBlank(parentIds) || "0".equals(parentIds)) {
|
final ZtProduct productTmp = currentUserTZtProduct;
|
if (productTmp == null) {
|
list.addAll(this.getWithDescendant(0L));
|
} else {
|
list.addAll(this.getAll().stream().filter(product -> productTmp.getParentProductId().equals(product.getProductId())).collect(Collectors.toList()));
|
list.addAll(this.getWithDescendant(productTmp.getProductId()));
|
}
|
} else {
|
String[] ids = parentIds.split(",");
|
for (String id : ids) {
|
try {
|
list.addAll(this.getWithDescendant(Long.parseLong(id)));
|
} catch (NumberFormatException e) {
|
}
|
}
|
}
|
if (StringUtils.isBlank(showLevel)) {
|
showLevel = "equipment";
|
}
|
// int level = Integer.parseInt(showLevel.substring(1));
|
// list = list
|
// .stream()
|
// .filter(product -> Status.ENABLE.getValue().equals(product.getStatus())
|
// && Integer.parseInt(product.getLevel().substring(1)) <= level).collect(Collectors.toList());
|
List<ZtProduct> trees = TreeUtils.build(list);
|
return trees;
|
}
|
|
@CacheEvict(value = Cache.ZTPRODUCT, allEntries = true)
|
public void insert(ZtProduct entity) {
|
if (entity.getId() == null || entity.getId() == 0L) {
|
entity.setId(IdWorker.getId());
|
entity.setProductId(entity.getId());// 初始productId和id一致
|
}
|
if (entity.getPid() == null) {
|
entity.setPid(Constant.Sys.DEPT_ROOT);
|
}
|
ZtProduct parent = getByProductId(entity.getPid());
|
|
if (parent != null) {
|
entity.setParentProductIds(parent.getParentProductIds() + "," + entity.getId());
|
} else {
|
entity.setParentProductIds(Constant.Sys.DEPT_ROOT + "");
|
}
|
entity.setStatus(Status.ENABLE.getValue());
|
entity.setVersion(1);
|
setProductId(entity, parent);
|
baseDao.insert(entity);
|
}
|
|
@Override
|
@CacheEvict(value = Cache.ZTPRODUCT, allEntries = true)
|
public void update(ZtProduct entity) {
|
// 这里id为productId,需要转换一下
|
ZtProduct p = getByProductId(entity.getId());
|
if (p == null) {
|
throw new RenException("产品节点不存在");
|
}
|
entity.setId(p.getId());// 设置为原始id,通过id保存
|
ZtProduct parent = getByProductId(entity.getPid());
|
setProductId(entity, parent);
|
super.update(entity);
|
}
|
|
@CacheEvict(value = Cache.ZTPRODUCT, allEntries = true)
|
public void deleteLogic(Long[] ids) {
|
for (int i = 0; i < ids.length; i++) {
|
Long id = ids[i];
|
List<ZtProduct> subList = getChildren(id);
|
if (subList.size() > 0) {
|
throw new RenException("请先删除下级节点!");
|
}
|
ZtProduct p = getByProductId(id);
|
deleteLogic(p);
|
}
|
}
|
|
@Override
|
@Cacheable(value = Cache.ZTPRODUCT, key = "'id:' + #id")
|
public ZtProduct get(Long id) {
|
ZtProduct product = this.getByProductId(id);
|
//product.setId(product.getProductId());
|
return product;
|
}
|
|
@Cacheable(value = Cache.ZTPRODUCT, key = "'product:' + #id")
|
public ZtProduct getByProductId(Long productId) {
|
String msg = "";
|
Date beginDate = new Date();
|
if (productId == null || productId == 0) {
|
return new ZtProduct();
|
}
|
//ZtProduct bean = baseDao.getByProductId(productId);
|
ZtProduct bean = baseDao.getOneByProductId(productId);
|
if (bean != null) {
|
List<ZtProduct> list = baseDao.getByProductIdList(bean.getParentProductIds());
|
list.add(bean);
|
for (ZtProduct ztProduct : list) {
|
if ("model".equals(ztProduct.getLevel())) {
|
bean.setModelName(ztProduct.getName());
|
} else if ("side".equals(ztProduct.getLevel())) {
|
bean.setShipName(ztProduct.getName());
|
bean.setShipId(ztProduct.getDataId());
|
bean.setShipProductId(ztProduct.getProductId());
|
} else if ("system1".equals(ztProduct.getLevel())) {
|
bean.setSysName(ztProduct.getName());
|
bean.setSysId(ztProduct.getDataId());
|
bean.setSysProductId(ztProduct.getProductId());
|
} else if ("system2".equals(ztProduct.getLevel())) {
|
bean.setSubSysName(ztProduct.getName());
|
bean.setSubSysId(ztProduct.getDataId());
|
bean.setSubSysProductId(ztProduct.getProductId());
|
} else if ("equipment".equals(ztProduct.getLevel())) {
|
bean.setDeviceName(ztProduct.getName());
|
bean.setDeviceId(ztProduct.getDataId());
|
bean.setDeviceProductId(ztProduct.getProductId());
|
}
|
}
|
}
|
if (bean == null) {
|
bean = new ZtProduct();
|
}
|
msg = "产品节点路徑查询时间:" + CommonUtils.getDatePoor(new Date(), beginDate) + "\r\n";
|
System.out.println(msg);
|
return bean;
|
}
|
|
/**
|
* 通过id查找所有祖先,按照祖先的层级排序
|
*
|
* @param id
|
* @return
|
*/
|
public List<ZtProduct> getAncestor(Long id) {
|
return TreeUtils.getAncestor(getAll(), id);
|
}
|
|
/**
|
* 获取自己和所有下级
|
*
|
* @param id
|
* @return
|
*/
|
public List<ZtProduct> getWithDescendant(Long id) {
|
return TreeUtils.getWithDescendant(getAll(), id);
|
}
|
|
@Cacheable(value = Cache.ZTPRODUCT, key = "'withdescendant:' + #id")
|
public List<Long> getWithDescendantIds(Long id) {
|
return this.getWithDescendant(id).stream().map(dept -> dept.getId()).collect(Collectors.toList());
|
}
|
|
/**
|
* 获取下级
|
*
|
* @param id
|
* @return
|
*/
|
public List<ZtProduct> getDescendant(Long id) {
|
return TreeUtils.getDescendant(getAll(), id);
|
}
|
|
/**
|
* 获取某产品的子节点
|
*
|
* @param id
|
* @return
|
*/
|
public List<ZtProduct> getChildren(Long id) {
|
return getAll().stream().filter(dept -> dept.getPid().equals(id)).collect(Collectors.toList());
|
}
|
|
/**
|
* 改换装,升级产品节点版本
|
*
|
* @param product
|
*/
|
public void replace(ZtProduct product) {
|
if (product.getProductId() == null) {
|
throw new RenException("缺少产品ZtProductId");
|
}
|
ZtProduct db = this.getByProductId(product.getProductId());
|
if (db == null) {
|
throw new RenException("产品节点不存在");
|
}
|
// 设置原来的版本无效
|
db.setStatus(Status.DISABLE.getValue());
|
baseDao.updateById(db);
|
|
// 添加新版本
|
product.setVersion(db.getVersion() + 1);
|
product.setStatus(Status.ENABLE.getValue());
|
baseDao.insert(product);
|
}
|
|
public void setProductId(ZtProduct product, ZtProduct parent) {
|
String level = product.getLevel();
|
String parentLevel = parent.getLevel();
|
// 型号
|
if (StringUtils.equals("L1", level)) {
|
|
}
|
// X号
|
if (StringUtils.equals("L2", level)) {
|
product.setShipId(product.getId());
|
product.setShipProductId(product.getId());
|
}
|
// 系统
|
if (StringUtils.equals("L3", level)) {
|
// 系统
|
if (StringUtils.equals("L2", parentLevel)) {
|
product.setShipId(parent.getShipId());
|
product.setShipProductId(parent.getShipProductId());
|
product.setSysId(product.getId());
|
product.setSysProductId(product.getId());
|
}
|
// 子系统
|
if (StringUtils.equals("L3", parentLevel)) {
|
product.setShipId(parent.getShipId());
|
product.setShipProductId(parent.getShipProductId());
|
product.setSysId(parent.getId());
|
product.setSysProductId(parent.getId());
|
product.setSubSysId(product.getId());
|
product.setSubSysProductId(product.getId());
|
}
|
}
|
// 设备
|
if (StringUtils.equals("L4", level)) {
|
product.setDeviceId(product.getId());
|
product.setDeviceProductId(product.getId());
|
// 父节点为系统
|
if (StringUtils.equals("L3", parentLevel)) {
|
ZtProduct sup_parent = getByProductId(parent.getPid());
|
String supParentLevel = sup_parent.getLevel();
|
// 父节点的节点为X号,则父节点为系统
|
if (StringUtils.equals("L2", supParentLevel)) {
|
product.setShipId(sup_parent.getShipId());
|
product.setShipProductId(sup_parent.getShipProductId());
|
product.setSysId(sup_parent.getId());
|
product.setSysProductId(sup_parent.getId());
|
}
|
// 父节点的父节点为系统,则父节点为子系统
|
if (StringUtils.equals("L3", supParentLevel)) {
|
product.setShipId(sup_parent.getShipId());
|
product.setShipProductId(sup_parent.getShipProductId());
|
product.setSysId(sup_parent.getSysId());
|
product.setSysProductId(parent.getSysProductId());
|
product.setSubSysId(sup_parent.getId());
|
product.setSubSysProductId(sup_parent.getId());
|
}
|
|
}
|
// 父节点为设备,沿用父节点系统/子系统编号
|
if (StringUtils.equals("L4", parentLevel)) {
|
product.setShipId(parent.getShipId());
|
product.setShipProductId(parent.getShipProductId());
|
product.setSysId(parent.getSysId());
|
product.setSysProductId(parent.getSysProductId());
|
product.setSubSysId(product.getSubSysId());
|
product.setSubSysProductId(product.getSubSysProductId());
|
}
|
}
|
}
|
|
public Map<String, String> getMapAllNodeByShipId(Boolean idToNmae, Long shipId) {
|
Map<String, String> result = new HashMap<>();
|
List<MapData> list = baseDao.getAllNodeByShipId(shipId.toString());
|
for (MapData item : list) {
|
if (idToNmae)
|
result.put(item.getId(), item.getName());
|
else
|
result.put(item.getName(), item.getId());
|
}
|
return result;
|
}
|
|
public Long getIdByName(String name) {
|
return baseDao.getIdByName(name);
|
}
|
|
public String getNameById(String id) {
|
return baseDao.getNameById(id);
|
}
|
|
public String getNameListById(Long id) {
|
return baseDao.getNameListById(id);
|
}
|
|
public void deleteTable(String tableName) {
|
baseDao.deleteTable(tableName);
|
|
}
|
|
public List<SearchNodesDto> searchNodes(String pid, String name) {
|
List<SearchNodesDto> list = baseDao.searchNodes(pid, name);
|
String ids = "'0'";
|
if (list.size() > 0) {
|
for (SearchNodesDto searchNodesDto : list) {
|
ids = ids + ",'" + searchNodesDto.getGroups().replace(",","','")+"'";
|
}
|
if (!"0".equals(ids)) {
|
|
List<MapData> list2 = baseDao.getNamesByIds(ids);
|
for (SearchNodesDto searchNodesDto : list) {
|
String names = "";
|
String[] idArr = searchNodesDto.getGroups().split(",");
|
for (String s : idArr) {
|
Optional<MapData> map = list2.stream().filter(item -> item.getId().equals(s)).findFirst();
|
if (map != null && map.isPresent()) {
|
names = names + "/" + map.get().getName();
|
}
|
}
|
searchNodesDto.setName(names+"/"+searchNodesDto.getName());
|
}
|
}
|
}
|
return list;
|
}
|
|
public List<MapData> getNameAll() {
|
return baseDao.getNameAll();
|
}
|
|
}
|