当前位置: 首页 > ds >正文

物流项目第七期(路线规划之Neo4j的应用)

本项目专栏:

物流项目_Auc23的博客-CSDN博客

关于Neo4j的可以看这一期:

Neo4j入门第二期(Spring Data Neo4j的使用)-CSDN博客

需求分析

对于运输路线规划,总的需求有两个,一个是机构管理,一个是路线管理。

IService

package com.sl.transport.service;import com.sl.transport.entity.node.BaseEntity;/*** 基础服务实现*/
public interface IService<T extends BaseEntity> {/*** 根据业务id查询数据** @param bid 业务id* @return 节点数据*/T queryByBid(Long bid);/*** 新增节点** @param t 节点数据* @return 新增的节点数据*/T create(T t);/*** 更新节点** @param t 节点数据* @return 更新的节点数据*/T update(T t);/*** 根据业务id删除数据** @param bid 业务id* @return 是否删除成功*/Boolean deleteByBid(Long bid);}
/*** 基础服务的实现*/
public class ServiceImpl<M extends BaseRepository<T, Long>, T extends BaseEntity> implements IService<T> {@Autowiredprivate M repository;@Overridepublic T queryByBid(Long bid) {return this.repository.findByBid(bid).orElse(null);}@Overridepublic T create(T t) {t.setId(null); //主键id由neo4j生成,不能设置值return this.repository.save(t);}@Overridepublic T update(T t) {//先查询,后更新T entity = this.queryByBid(t.getBid());if (ObjectUtil.isEmpty(entity)) {return null;}//将更新的数据复制到entity中BeanUtil.copyProperties(t, entity, CopyOptions.create().ignoreNullValue().setIgnoreProperties("id", "bid"));//更新return this.repository.save(entity);}@Overridepublic Boolean deleteByBid(Long bid) {return this.repository.deleteByBid(bid) > 0;}
}

 AgencyServiceImpl

package com.sl.transport.service.impl;import com.sl.transport.entity.node.AgencyEntity;
import com.sl.transport.repository.AgencyRepository;
import com.sl.transport.service.AgencyService;
import org.springframework.stereotype.Service;@Service
public class AgencyServiceImpl extends ServiceImpl<AgencyRepository, AgencyEntity> implements AgencyService {}

机构同步

业务流程

/*** 对于权限管家系统消息的处理*/
@Slf4j
@Component
public class AuthMQListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = Constants.MQ.Queues.AUTH_TRANSPORT),exchange = @Exchange(name = "${rabbitmq.exchange}", type = ExchangeTypes.TOPIC),key = "#"))public void listenAgencyMsg(String msg) {//{"type":"ORG","operation":"ADD","content":[{"id":"977263044792942657","name":"55","parentId":"0","managerId":null,"status":true}]}log.info("接收到消息 -> {}", msg);JSONObject jsonObject = JSONUtil.parseObj(msg);String type = jsonObject.getStr("type");if (!StrUtil.equalsIgnoreCase(type, "ORG")) {//非机构消息return;}String operation = jsonObject.getStr("operation");JSONObject content = (JSONObject) jsonObject.getJSONArray("content").getObj(0);String name = content.getStr("name");Long parentId = content.getLong("parentId");IService iService;BaseEntity entity;if (StrUtil.endWith(name, "转运中心")) {//一级转运中心iService = OrganServiceFactory.getBean(OrganTypeEnum.OLT.getCode());entity = new OLTEntity();entity.setParentId(0L);} else if (StrUtil.endWith(name, "分拣中心")) {//二级转运中心iService = OrganServiceFactory.getBean(OrganTypeEnum.TLT.getCode());entity = new TLTEntity();entity.setParentId(parentId);} else if (StrUtil.endWith(name, "营业部")) {//网点iService = OrganServiceFactory.getBean(OrganTypeEnum.AGENCY.getCode());entity = new AgencyEntity();entity.setParentId(parentId);} else {return;}//设置参数entity.setBid(content.getLong("id"));entity.setName(name);entity.setStatus(content.getBool("status"));switch (operation) {case "ADD": {iService.create(entity);break;}case "UPDATE": {iService.update(entity);break;}case "DEL": {iService.deleteByBid(entity.getBid());break;}}}}

机构管理

*** @author zzj* @version 1.0*/
public interface OrganService {/*** 无需指定type,根据id查询** @param bid 机构id* @return 机构信息*/OrganDTO findByBid(Long bid);/*** 无需指定type,根据ids查询** @param bids 机构ids* @return 机构信息*/List<OrganDTO> findByBids(List<Long> bids);/*** 查询所有的机构,如果name不为空的按照name模糊查询** @param name 机构名称* @return 机构列表*/List<OrganDTO> findAll(String name);/*** 查询机构树* @return 机构树*/String findAllTree();
}
@Service
public class OrganServiceImpl implements OrganService {@Resourceprivate OrganRepository organRepository;@Resourceprivate ObjectMapper objectMapper;@Overridepublic OrganDTO findByBid(Long bid) {OrganDTO organDTO = this.organRepository.findByBid(bid);if (ObjectUtil.isNotEmpty(organDTO)) {return organDTO;}throw new SLException(ExceptionEnum.ORGAN_NOT_FOUND);}@Overridepublic List<OrganDTO> findByBids(List<Long> bids) {List<OrganDTO> organDTOS = this.organRepository.findByBids(bids);if (ObjectUtil.isNotEmpty(organDTOS)) {return organDTOS;}throw new SLException(ExceptionEnum.ORGAN_NOT_FOUND);}@Overridepublic List<OrganDTO> findAll(String name) {return this.organRepository.findAll(name);}@Overridepublic String findAllTree() {return "";}
}
@Component
public class OrganRepositoryImpl implements OrganRepository {@Resourceprivate Neo4jClient neo4jClient;@Overridepublic OrganDTO findByBid(Long bid) {String cypherQuery = StrUtil.format("MATCH (n)\n" +"WHERE n.bid = {}\n" +"RETURN n", bid);return CollUtil.getFirst(executeQuery(cypherQuery));}@Overridepublic List<OrganDTO> findByBids(List<Long> bids) {String cypherQuery = StrUtil.format("MATCH (n)\n" +"WHERE n.bid in {}\n" +"RETURN n", bids);return executeQuery(cypherQuery);}@Overridepublic List<OrganDTO> findAll(String name) {name = StrUtil.removeAll(name, '\'', '"');String cypherQuery = StrUtil.isEmpty(name) ?"MATCH (n) RETURN n" :StrUtil.format("MATCH (n) WHERE n.name CONTAINS '{}' RETURN n", name);return executeQuery(cypherQuery);}private List<OrganDTO> executeQuery(String cypherQuery) {return ListUtil.toList(this.neo4jClient.query(cypherQuery).fetchAs(OrganDTO.class) //设置响应的类型.mappedBy((typeSystem, record) -> { //对结果进行封装处理Map<String, Object> map = record.get("n").asMap();OrganDTO organDTO = BeanUtil.toBean(map, OrganDTO.class);InternalPoint2D location = (InternalPoint2D) map.get("location");if (ObjectUtil.isNotEmpty(location)) {organDTO.setLongitude(location.x());organDTO.setLatitude(location.y());}//获取类型String type = CollUtil.getFirst(record.get("n").asNode().labels());organDTO.setType(OrganTypeEnum.valueOf(type).getCode());return organDTO;}).all());}
}

http://www.xdnf.cn/news/9406.html

相关文章:

  • 本地socket排查
  • 详解MySQL调优
  • 高频面试--MySQL
  • 【Python打卡Day31】文件的拆分与使用@浙大疏锦行
  • 【C语言练习】066. 使用typedef定义新类型
  • 【每天一个知识点】智能体(Agent)”与“思维链(Chain of Thought, CoT)
  • 为什么选择迪宇电力厂家的绝缘胶垫?有什么优势以及产品参数
  • Python应用嵌套猜数字小游戏
  • 数据库大学实验二
  • PyTorch入门-Transorforms
  • 2.2.1 05年T3
  • python处理signal(信号)
  • 基于大模型的慢性胃炎全周期预测与诊疗方案研究报告
  • 联合索引与最左前缀原则详解
  • Springboot-基础
  • LY/T 2714-2016 木塑门套线检测
  • Spring Boot整合Spring AI全攻略:构建智能应用的工程实践
  • Java 并发编程通关秘籍——08死锁
  • webpack CDN打包优化
  • 有什么excel.js支持IE11,可以显示EXCEL单元格数据,支持单元格合并,边框线,单元格背景
  • LangGraph + LLM + stream_mode
  • WPF命令与MVVM模式:打造优雅的应用程序架构
  • 【AI News | 20250527】每日AI进展
  • springboot--实战--大事件--用户接口开发
  • 【机器学习基础】机器学习入门核心算法:支持向量机(SVM)
  • MySQL-查询测试
  • cf1703F
  • leetcode hot100刷题日记——18.搜索插入位置
  • Redis学习打卡-Day8-Redis实践
  • docker环境搭建与常用指令