sap关账+策略模式(避免大量if elseif)
旧代码
@Transactional(rollbackFor = Exception.class)public AjaxResult purchaseOrderReceiptOutSourceAfterSapCloseAccountingPeriod(Long id) {SysPurorderPostingLog sysPurorderPostingLog = sysPurorderPostingLogMapper.selectSysPurorderPostingLogById(id);if (Objects.isNull(sysPurorderPostingLog)) {throw new ServiceException("未找到过账日志信息");}if (SysConstants.SYS_SUCCESS.equals(sysPurorderPostingLog.getStatus())) {throw new ServiceException("该日志已成功过账, 禁止重复过账");}//根据不同类型补充过账if (InventoryOperation.PURCHASE_RECEIPT.getCode().equals(sysPurorderPostingLog.getInterfaceType())) {//采购订单return getPurchaseReceipt(sysPurorderPostingLog);} else if (InventoryOperation.TRANSFER_IN_SKIP.getCode().equals(sysPurorderPostingLog.getInterfaceType())) {//301预留AjaxResult ajaxResult = wmsFactoryTransferService.sapFactoryTransferOutSourcePosting(Long.valueOf(sysPurorderPostingLog.getOrderId()));if (ajaxResult.isSuccess()) {String requestJson = (String) ajaxResult.get("requestJson");String responseJson = (String) ajaxResult.get("responseJson");sysPurorderPostingLog.setOperParam(requestJson);sysPurorderPostingLog.setJsonResult(responseJson);sysPurorderPostingLog.setStatus(SysConstants.SYS_SUCCESS);sysPurorderPostingLog.setUpdateTime(new Date());sysPurorderPostingLogMapper.updateSysPurorderPostingLog(sysPurorderPostingLog);return AjaxResult.success("过账成功");}} else {throw new ServiceException("未知的过账类型");}return AjaxResult.error("过账失败");}
步骤
1.定义策略接口:创建一个接口,定义所有具体策略类必须实现的方法。
public interface PostingStrategy {AjaxResult executePosting(SysPurorderPostingLog sysPurorderPostingLog);
}
2.实现具体策略类:为每种过账类型实现具体的策略类。
2.1采购订单过账策略
public class PurchaseReceiptPostingStrategy implements PostingStrategy {@Overridepublic AjaxResult executePosting(SysPurorderPostingLog sysPurorderPostingLog) {// 具体的采购订单过账逻辑return getPurchaseReceipt(sysPurorderPostingLog); // 假设这个方法已经存在}
}
2.2 301预留过账策略
package com.kpl.sys.domain;import com.kpl.common.constant.SysConstants;
import com.kpl.common.core.domain.AjaxResult;
import com.kpl.sys.mapper.SysPurorderPostingLogMapper;
import com.kpl.sys.service.PostingStrategy;
import com.kpl.wms.service.impl.WmsFactoryTransferServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Date;/*** 实现具体策略类:为每种过账类型实现具体的策略类 + 301预留*/
@Component
public class FactoryTransferPostingStrategy implements PostingStrategy {@Autowiredprivate WmsFactoryTransferServiceImpl wmsFactoryTransferService;@Autowiredprivate SysPurorderPostingLogMapper sysPurorderPostingLogMapper;@Overridepublic AjaxResult executePosting(SysPurorderPostingLog sysPurorderPostingLog) {AjaxResult ajaxResult = wmsFactoryTransferService.sapFactoryTransferOutSourcePosting(Long.valueOf(sysPurorderPostingLog.getOrderId()));if (ajaxResult.isSuccess()) {String requestJson = (String) ajaxResult.get("requestJson");String responseJson = (String) ajaxResult.get("responseJson");sysPurorderPostingLog.setOperParam(requestJson);sysPurorderPostingLog.setJsonResult(responseJson);sysPurorderPostingLog.setStatus(SysConstants.SYS_SUCCESS);sysPurorderPostingLog.setUpdateTime(new Date());sysPurorderPostingLogMapper.updateSysPurorderPostingLog(sysPurorderPostingLog);return AjaxResult.success("过账成功");}return AjaxResult.error("过账失败");}
}
3.上下文类:创建一个上下文类来管理策略对象,并提供设置和获取策略的方法。
package com.kpl.sys.domain;import com.kpl.common.core.domain.AjaxResult;
import com.kpl.common.exception.ServiceException;
import com.kpl.sys.service.PostingStrategy;
import lombok.Data;
import lombok.Setter;
import org.springframework.stereotype.Component;/*** 上下文类:创建一个上下文类来管理策略对象,并提供设置和获取策略的方法*/
@Setter
@Component
public class PostingContext {private PostingStrategy postingStrategy;public AjaxResult executePosting(SysPurorderPostingLog sysPurorderPostingLog) {if (postingStrategy == null) {throw new ServiceException("策略模式不存在!");}return postingStrategy.executePosting(sysPurorderPostingLog);}
}
4.重构原方法:使用上下文类来调用适当的策略。
/*** 关账过账** @param id* @return*/@Override@Transactional(rollbackFor = Exception.class)public AjaxResult purchaseOrderReceiptOutSourceAfterSapCloseAccountingPeriod(Long id) {SysPurorderPostingLog sysPurorderPostingLog = sysPurorderPostingLogMapper.selectSysPurorderPostingLogById(id);if (Objects.isNull(sysPurorderPostingLog)) {throw new ServiceException("未找到过账日志信息");}if (SysConstants.SYS_SUCCESS.equals(sysPurorderPostingLog.getStatus())) {throw new ServiceException("该日志已成功过账, 禁止重复过账");}//使用策略模式PostingContext context = new PostingContext();PostingStrategy strategy = null;switch (sysPurorderPostingLog.getInterfaceType()) {case "101P":strategy = applicationContext.getBean(PurchaseReceiptPostingStrategy.class);break;case "301i":strategy = applicationContext.getBean(FactoryTransferPostingStrategy.class);break;default:throw new ServiceException("未知的过账类型");}context.setPostingStrategy(strategy);return context.executePosting(sysPurorderPostingLog);}
相关文章:
sap关账+策略模式(避免大量if elseif)
旧代码 Transactional(rollbackFor Exception.class)public AjaxResult purchaseOrderReceiptOutSourceAfterSapCloseAccountingPeriod(Long id) {SysPurorderPostingLog sysPurorderPostingLog sysPurorderPostingLogMapper.selectSysPurorderPostingLogById(id);if (Object…...
EverArt MCP 服务器安装调试笔记 -cline
EverArt MCP 服务器安装调试笔记 问题描述 用户在使用 EverArt MCP 服务器时遇到报错:“MCP error -1: Connection closed”。 调试过程 检查配置文件 cline_mcp_settings.json: 确认 everart 服务器的配置信息,包括 command、args 和 env 是否正确。…...
1035.不相交的线
1035.不相交的线 力扣题目链接(opens new window) 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j]且绘制的直线…...
Django-ORM-select_related
Django-ORM-select_related 作用使用场景示例无 select_related 的查询有 select_related 的查询 如何理解 "只发起一次查询,包含所有相关作者信息"1. select_related 的工作原理2. 具体示例解析3. 为什么只发起一次查询 数据库中的books量巨大࿰…...
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MD&A词频统计两种方式)(吴非、赵宸宇、甄红线300关键词三种方法) 1、时间:2001-2023年 2、来源:上市公司年报 3、参考文献: …...
IO多路复用实现并发服务器
一.select函数 select 的调用注意事项 在使用 select 函数时,需要注意以下几个关键点: 1. 参数的修改与拷贝 readfds 等参数是结果参数 : select 函数会直接修改传入的 fd_set(如 readfds、writefds 和 exceptfds…...
React 如何实现组件懒加载以及懒加载的底层机制
前言 在现代前端开发中,性能优化始终是一个核心课题。React 作为当下流行的前端库之一,提供了一些非常有用的工具和技术来提升应用的性能,其中懒加载(Lazy Loading)就是一项不可忽视的重要技术。通过懒加载࿰…...
《论语别裁》第01章 学而(22) 种瓜者
下面一节,等于一个结论: 曾子曰:慎终追远,民德归厚矣。 古人对于这一句的解释,我也有点意见。拿孝道来讲,过去讲中国文化的孝道,本来很重要,我们看历史上给皇帝的奏议,常…...
如何设置GET请求的参数?
在使用PHP爬虫时,设置GET请求的参数是与目标网站交互的关键步骤。通过正确设置GET请求的参数,可以向目标网站发送查询请求并获取相应的数据。以下是如何在PHP中设置GET请求参数的详细说明,包括使用cURL和GuzzleHttp库的示例。 一、使用cURL设…...
C++20 模块:告别头文件,迎接现代化的模块系统
文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…...
SpringBoot集成Swagger指南
在Spring Boot项目中集成Swagger可以帮助你自动生成API文档,并且提供一个交互式的UI界面,方便开发者测试和调试API。以下是集成Swagger的步骤: 1. 添加Swagger依赖 首先,在你的pom.xml文件中添加Swagger的依赖项。通常使用的是s…...
有必要使用 Oracle 向量数据库吗?
向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索,进化到了可以直接基于语义的数据检索。这在AI时代至关重要! 回到标题问题:是否有必要使用 Oracle 向量数据库? 这实际还要取决于你的具体应用需求。 客观来讲…...
仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播
仅仅使用pytorch来手撕transformer架构(2):编码器模块和编码器类的实现和向前传播 往期文章: 仅仅使用pytorch来手撕transformer架构(1):位置编码的类的实现和向前传播 最适合小白入门的Transformer介绍 仅仅使用pytorch来手撕transformer…...
rust语言match模式匹配涉及转移所有权Error Case
struct S{data:String, }//注意:因为String默认是移动语义,从而决定结构体S也是移动语义,可采用(1)或(2)两种方法解决编译错误;关键思路:放弃获取结构体S的字段data的所有权,改为借用。fn process(s_ref:&a…...
小肥柴慢慢手写数据结构(C篇)(4-3 关于栈和队列的讨论)
小肥柴慢慢学习数据结构笔记(C篇)(4-3 关于栈和队列的讨论) 目录1 双端栈/队列2 栈与队列的相互转化2-1 栈转化成队列2-2 队列转化成栈 3 经典工程案例3-1 生产者和消费者模型(再次重温环形缓冲区)3-2 MapR…...
大模型在甲状腺癌诊疗全流程预测及方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 国内外研究现状 二、大模型预测甲状腺癌的理论基础 2.1 甲状腺癌相关医学知识 2.2 大模型技术原理与特点 2.3 大模型在医疗领域的应用潜力 三、术前预测方案 3.1 预测模型构建 3.1.1 数据收集与预处理 …...
java-单列模式-final-继承-多态
内存存储区域 引用变量和普通变量引用变量放在栈中,基本数据类型的内容是在堆内存中。 对象放在堆内存中,其引用变量放在栈中,指向堆内存存放对象的地址。 静态变量放在静态区中,静态变量在程序的执行始中中分配一次,…...
Python:正则表达式
正则表达式的基础和应用 一、正则表达式核心语法(四大基石) 1. 元字符(特殊符号) 定位符 ^:匹配字符串开始位置 $:匹配字符串结束位置 \b:匹配单词边界(如 \bword\b 匹配…...
网络通信中的带宽(Bandwidth)概念
在计算机网络中,带宽是指单位时间内可以传输的数据量,通常以比特每秒(bps)或字节每秒(Bps)为单位。 1. 理论计算 链路带宽:链路带宽是指网络链路的物理传输能力,通常由网络设备的规…...
基于杀伤链的勒索软件控制框架
40s说清楚勒索软件如何工作 基于杀伤链的勒索软件控制框架开发了4种缓解策略(预防、阻止、检测&响应、重建),覆盖18个控制域90项控制措施,以正确管理与勒索软件攻击杀伤链各阶段相关的风险。 注:本文节选出自《基于杀伤链的勒索软件防御指…...
Windows编程----结束进程
进程有启动就有终止,通过CreateProcess函数可以启动一个新的子进程,但是如何终结子进程呢?主要有四种方法: 通过主线程的入口函数(main函数、WinMain函数)的return关键字终止进程 一个应用程序只有一个入…...
三、Docker 集群管理与应用
(一)项目案例 1、准备主机 (1)关闭防火墙,或者开放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于节点之间的通信)、UDP端口4789(用于overlay网络流…...
无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升
目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目:ENHANCING NIGHTTIME VEHICLE D…...
SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】
系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录一、前言 🍃二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…...
NO.33十六届蓝桥杯备战|函数|返回值|声明|调用|引用|函数重载(C++)
返回值 我们在设计的函数的时候,函数在经过计算后,有时候需要带回⼀些计算好的数据,这时候往往使⽤return 来返回,这⾥我们就讨论⼀下使⽤ return 返回。 return 后边可以是⼀个数值,也可以是⼀个表达式,…...
5G工业路由器赋能无人码头,港口物流智能化管理
全球贸易发展促使港口需提升运营效率,传统港口面临诸多难题,无人码头成为转型关键方向。5G 工业路由器为其提供有力通信支持,引领港口物流变革。 随着无人码头建设在全球兴起,如荷兰鹿特丹港、中国上海洋山港等。码头作业设备需实…...
机试准备第14天
首先进行树的学习。树的存储分为链式存储与顺序存储。完全二叉树是可以顺序存储的,将各个节点从上往下,从左往右存储。 第一题是找位置,好兄弟给的一道题,一遍过了。 #include <stdio.h> #include <map> #include &…...
【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities
OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth?2. OAuth 2.0 是如何工作的?3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…...
有关Java中的多线程
学习目标 ● 掌握线程相关概念 ● 掌握线程的基本使用 ● 掌握线程池的使用 ● 了解解决线程安全方式 1.为什么要学习线程? ● 从1946年2月14日世界上第一台计算机在美国宾夕法尼亚大学诞生到今天,计算和处理的模式早已从单用户单任务的串行模式发展到了多用户多…...
【eNSP实战】配置交换机端口安全
拓扑图 目的:让交换机端口与主机mac绑定,防止私接主机。 主机PC配置不展示,按照图中配置即可。 开始配置之前,使用PC1 ping 一遍PC2、PC3、PC4、PC5,让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…...
