BO、VO层应用实例

news2024/10/3 10:39:09

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


BO、VO层应用实例

BO(Business Object)层是一种用于处理业务逻辑的组件层。BO层主要负责封装和处理与业务相关的逻辑和数据操作,它通常位于应用程序的中间层,处于数据访问层(DAO层)和表示层(UI层)之间

需求分析:前端传递的时间类型为String类型,而我需要编写自定义sql进行联表查询,需要对时间类型进行转换为Timestamp类型和数据库匹配

  • Controller
    @GetMapping("list")
    @ApiOperation("拒付查询")
    public Result<PageResult<ResChargebackList>> list(ChargebackListQuery query) {
        return Result.succ(chargebackService.list(query));
    }
  • ChargebackListQuery(VO:request):接收前端参数并在不同层之间传递数据(前端请求参数)
@Data
public class ChargebackListQuery extends PageQuery {

    @ApiModelProperty("XXX")
    private String merchantNo;
    @ApiModelProperty("XXX")
    private String uniqueId;
    @ApiModelProperty("XXX")
    private String transactionId;
    @ApiModelProperty("XXX")
    private String transactionCardBrand;
    @ApiModelProperty("XXX")
    private Integer chargebackType;
    @ApiModelProperty("XXX")
    private String chargebackArn;
    @ApiModelProperty("XXX")
    private Integer warnFromState;
    @ApiModelProperty("XXX")
    private String channelName;
    @ApiModelProperty("交易开始时间")
    private String transactionAtStartTime;
    @ApiModelProperty("交易结束时间")
    private String transactionAtEndTime;
    @ApiModelProperty("拒付开始时间")
    private String chargeBackAtStartTime;
    @ApiModelProperty("拒付结束时间")
    private String chargeBackAtEndTime;
    @ApiModelProperty("导入开始时间")
    private String createAtStartTime;
    @ApiModelProperty("导入结束时间")
    private String createAtEndTime;
    @ApiModelProperty("XXX")
    private Integer settleStatus;

}
  • ResChargebackList(VO:response):接收前端参数并在不同层之间传递数据(后端响应参数)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ResChargebackList {

    protected Long id;
    @ApiModelProperty("XXX")
    protected String merchantNo;
    @ApiModelProperty("XXX")
    private Date transactionAt;
    @ApiModelProperty("XXX")
    protected String uniqueId;
    @ApiModelProperty("XXX")
    private String transactionCardBrand;
    @ApiModelProperty("XXX")
    private String transactionAmount;
    @ApiModelProperty("XXX")
    protected Date chargebackAt;
    @ApiModelProperty("XXX")
    protected String chargebackAmount;
    @ApiModelProperty("XXX")
    protected String chargebackCode;
    @ApiModelProperty("XXX")
    protected Integer chargebackType;
    @ApiModelProperty("XXX")
    protected String chargebackTypeValue;
    @ApiModelProperty("XXX")
    protected String chargebackArn;
    @ApiModelProperty("XXX")
    private String warnFromState;
    @ApiModelProperty("XXX")
    protected String channelRemark;
    @ApiModelProperty("XXX")
    protected String channelName;
    @ApiModelProperty("XXX")
    protected Date createAt;
    @ApiModelProperty("XXX")
    private String operator;
    @ApiModelProperty("XXX")
    private Integer settleStatus;

}
  • Service
public PageResult<ResChargebackList> list(ChargebackListQuery query) {
    // 将ChargebackListQuery对象转换为ChargebackListQueryBO对象
    ChargebackListQueryBO convert = ChargebackListQueryBO.convert(query);
    // 查询交易退款列表
    List<ResChargebackResponse> page = transactionChargebackRepo.queryList(convert);
    // 获取卡品牌列表
    List<SystemCardBrandNmae> cardBrandNameList = systemCardBrandRepo.getCardList();
    // 将查询结果进行转换和处理
    List<ResChargebackList> collect = page.stream().map(bean -> new ResChargebackList(
        bean.getId(),
        bean.getMerchantNo(),
        bean.getTransactionAt(),
        bean.getUniqueId(),
        convertChargebackType(cardBrandNameList, bean.getTransactionCardBrand()),
        Amount.getInstance(bean.getTransactionCurrency(), bean.getTransactionAmount()).show(),
        bean.getChargebackAt(),
        Amount.getInstance(bean.getChargebackCurrency(), bean.getChargebackAmount()).show(),
        bean.getChargebackCode(),
        bean.getChargebackType(), 
        ChargebackType.typeOf(bean.getChargebackType()).name,
        bean.getChargebackArn(),
        bean.getWarnFrom() == null ? EWarnFromStatus.NO.getValue() : EWarnFromStatus.YES.getValue(),
        bean.getChargebackRemark(),
        ManageTools.showChannel(bean.getCompanyCode(), bean.getChannelName()),
        bean.getCreateAt(),
        bean.getOperator(),
        bean.getSettleStatus()
    )).collect(Collectors.toList());
    // 构建分页结果对象
    return PageResult
        .<ResChargebackList>builder()
        .pageNo(Integer.parseInt(query.getPageNo()))
        .pageSize(Integer.parseInt(query.getPageSize()))
        .total(transactionChargebackRepo.chargebackCount(convert))
        .items(collect)
        .build();
}
  • BO(将前端传递的String时间,进行BO层转换为Timestamp类型,再传递给数据库处理)
@Data
public class ChargebackListQueryBO {

    @ApiModelProperty("XXX")
    private String merchantNo;
    @ApiModelProperty("XXX")
    private String uniqueId;
    @ApiModelProperty("XXX")
    private String transactionId;
    @ApiModelProperty("XXX")
    private String transactionCardBrand;
    @ApiModelProperty("XXX")
    private Integer chargebackType;
    @ApiModelProperty("XXX")
    private String chargebackArn;
    @ApiModelProperty("XXX")
    private Integer warnFromState;
    @ApiModelProperty("XXX")
    private String channelName;
    @ApiModelProperty("交易开始时间")
    private Timestamp transactionAtStartTime;
    @ApiModelProperty("交易结束时间")
    private Timestamp transactionAtEndTime;
    @ApiModelProperty("拒付开始时间")
    private Timestamp chargeBackAtStartTime;
    @ApiModelProperty("拒付结束时间")
    private Timestamp chargeBackAtEndTime;
    @ApiModelProperty("导入开始时间")
    private Timestamp createAtStartTime;
    @ApiModelProperty("导入结束时间")
    private Timestamp createAtEndTime;
    @ApiModelProperty("XXX")
    private Integer settleStatus;

    private Integer offset;
    private Integer limit;

    public void setOffset(String pageNo, String pageSize) {
        this.offset = (Integer.parseInt(pageNo) - 1) * Integer.parseInt(pageSize);
    }

    public void setLimit(String pageSize) {
        this.limit = Integer.parseInt(pageSize);
    }

    public static ChargebackListQueryBO convert(ChargebackListQuery chargebackListQuery) {
        ChargebackListQueryBO chargebackListQueryBO = new ChargebackListQueryBO();
        chargebackListQueryBO.setMerchantNo(chargebackListQuery.getMerchantNo());
        chargebackListQueryBO.setUniqueId(chargebackListQuery.getUniqueId());
        chargebackListQueryBO.setTransactionId(chargebackListQuery.getTransactionId());
        chargebackListQueryBO.setTransactionCardBrand(chargebackListQuery.getTransactionCardBrand());
        chargebackListQueryBO.setChargebackType(chargebackListQuery.getChargebackType());
        chargebackListQueryBO.setChargebackArn(chargebackListQuery.getChargebackArn());
        chargebackListQueryBO.setWarnFromState(chargebackListQuery.getWarnFromState());
        chargebackListQueryBO.setChannelName(chargebackListQuery.getChannelName());

        chargebackListQueryBO.setTransactionAtStartTime(
                chargebackListQuery.getTransactionAtStartTime() == null ? null : 		       Timestamp.valueOf(chargebackListQuery.getTransactionAtStartTime().replace("+", " "))
        );
        chargebackListQueryBO.setTransactionAtEndTime(
                chargebackListQuery.getTransactionAtEndTime() == null ? null : Timestamp.valueOf(chargebackListQuery.getTransactionAtEndTime().replace("+", " "))
        );
        chargebackListQueryBO.setChargeBackAtStartTime(
                chargebackListQuery.getChargeBackAtStartTime() == null ? null : Timestamp.valueOf(chargebackListQuery.getChargeBackAtStartTime().replace("+", " "))
        );
        chargebackListQueryBO.setChargeBackAtEndTime(
                chargebackListQuery.getChargeBackAtEndTime() == null ? null : Timestamp.valueOf(chargebackListQuery.getChargeBackAtEndTime().replace("+", " "))
        );
        chargebackListQueryBO.setCreateAtStartTime(
                chargebackListQuery.getCreateAtStartTime() == null ? null : Timestamp.valueOf(chargebackListQuery.getCreateAtStartTime().replace("+", " "))
        );
        chargebackListQueryBO.setCreateAtEndTime(
                chargebackListQuery.getCreateAtEndTime() == null ? null : Timestamp.valueOf(chargebackListQuery.getCreateAtEndTime().replace("+", " "))
        );
        chargebackListQueryBO.setSettleStatus(chargebackListQuery.getSettleStatus());
        chargebackListQueryBO.setOffset(chargebackListQuery.getPageNo(), chargebackListQuery.getPageSize());
        chargebackListQueryBO.setLimit(chargebackListQuery.getPageSize());

        return chargebackListQueryBO;
    }
}

此案例:DAO/PO/REPO、Impl不做展示,代码太多了~

  • DAO:Mapper
  • PO:数据库中的实体或表的映射
  • REPO、Impl:接口实现类

在这里插入图片描述


🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端项目-超级玛丽【附源码】

超级玛丽 【超级玛丽】是一个基于HTML5和JavaScript开发的经典电子游戏。玩家需要控制主角马里奥在各种关卡中跳跃、奔跑、消灭敌人&#xff0c;以完成游戏目标。玩家通过浏览器可以体验经典的超级玛丽关卡和冒险。 运行效果&#xff1a;方向键控制马里奥的左右移动、跳跃、奔…

【Unity学习笔记】第十二 · New Input System 及其系统结构 和 源码浅析

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132534422 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; 官方文档&#xff1a;Unity官方Input System手册与API官方测试用例&#xff1a;Unity-Technologies/InputS…

大语言模型无代码构建知识图谱(2)--环境准备

软件环境 需已安装MySQL数据库。需已安装HuggingFists系统&#xff0c;该系统将提供无代码的可视化数据开发环境。通过该系统利用大语言模型辅助知识图谱的构建。HuggingFists系统的安装可参考《HuggingFists-低代码玩转LLM RAG-准备篇》 流程环境 数据文件 进入HuggingFis…

源码透析MapperScannerRegistrar和MapperScannerConfigurer的区别及作用

文章目录 前言MapperScannerRegistrar使用方式实现原理 MapperScannerConfigurer使用方式实现原理 两者区别对比源码解析MapperScannerRegistrarMapperScannerConfigurerMapperFactoryBean 总结 本文里面涉及到的相关文章 MapperScan注解里面涉及到的Import注解解析可以查看系…

Flutter:跨平台移动应用开发的未来

Flutter&#xff1a;跨平台移动应用开发的未来 引言 Flutter的背景和概述 Flutter是由Google开发的一个开源UI工具包&#xff0c;用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布&#xff0c;并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来…

pip install flagai时出现Collecting PyYAML==5.4.1 (from flagai)等错误信息的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

7.【CPP】String类

一.汉字的编码 我们知道计算机存储英文字母&#xff0c;标点&#xff0c;数字用的是ascall码&#xff0c;128种用一个字节表示绰绰有余。而汉字远远不止128种&#xff0c;因此汉字需要两个字节表示。 1.gbk编码中汉字占两个字节。 2.utf-8中&#xff0c;一个汉字占三个字节。…

Oracle Linux 6.10 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

第十回 朱贵水亭施号箭 林冲雪夜上梁山-FreeBSD/Linux 控制台基础操作

林冲被众庄客捉住&#xff0c;吊在门楼下&#xff0c;正被打时&#xff0c;柴进来了&#xff0c;赶快把林冲救下来。原来这是柴进打猎用的小庄子&#xff0c; 林冲就把火烧草料场一事跟柴进详细的说了。柴进说兄弟真是命运多磨难啊。林冲住了几日&#xff0c;恐怕连累柴进&…

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…

网络编程 day6

网络聊天室项目 1.服务器端 #include <head.h> #define SER_IP "192.168.125.11" #define SER_PORT 6666 typedef struct Msg {char user[32]; //用户名int type; //1.登录、2.发消息、0.退出char text[1024]; //消息 } msg_t; typedef struct List…

Vue diff原理

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Med-YOLO:3D + 医学影像 + 检测框架

Med-YOLO&#xff1a;3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码&#xff1a;加强小目标检测总结 提出背景 论文链接&#xff1a;https://arxiv.org/abs/2312.07729 代码链接&#xff1a;https://github.com/JDSobek/MedYOLO 提出背景&…

助力焊接场景下自动化缺陷检测识别,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业焊接场景下工件表面焊接裂纹缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在工件表面焊接场景下常常有对工件表面缺陷智能自动化检测识别的需求&#xff0c;工业AI结合落地是一个比较有潜力的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行…

一周时间,开发了一款封面图生成工具

介绍 这是一款封面图的制作工具&#xff0c;根据简单的配置即可生成一张好看的封面图&#xff0c;目前已有七款主题可以选择。做这个工具的初衷来自平时写文章&#xff0c;都为封面图发愁&#xff0c;去图片 网站上搜索很难找到满意的&#xff0c;而且当你要的图如果要搭配上文…

【OCR项目】之用HALCON的深度学习工具进行文字识别,并导出到C++调用

前言 HALCON是一个强大的机器视觉工具&#xff0c;包含了2D&#xff0c;3D图像各种算子&#xff0c;以及各种任务的深度学习工具&#xff0c;包括目标检测&#xff0c;实例分割&#xff0c;文字识别等。 这次从实际生产的角度&#xff0c;来分享一下如何用HALCON进行文字识别…

基于 IDEA 创建 Maven 工程

1. 概念梳理Maven工程的GAVP Maven工程相对之前的项目&#xff0c;多出一组gavp属性&#xff0c;gav&#xff08;表示当前工程的坐标&#xff09;需要我们在创建项目的时候指定&#xff0c;p&#xff08;表示打包方式&#xff09;有默认值&#xff08;默认为 jar 包&#xff0…

web架构师编辑器内容-拖动元素改变元素的位置和大小的完成

拖动移动元素 改变编辑器的定位系统 我们目前的元素都是按照块级元素直接自上而下的排列在画布中&#xff0c;为了让元素实现精确的定位和调整&#xff0c;我们需要改变这些元素的定位实现。我们需要让这些元素画布区域来进行绝对定位。如果我们有一个元素有这些已经保存的 c…

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子&#xff0c;原本的下程序和串口1有问题&#xff0c;所以我用的是串口2&#xff0c;用的PA2和PA3 一&#xff0c;使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数&#xff0c;往届的题基本用的9600波特率&#xff0c;所以我这里设置为9600…

【Linux】Ubuntu的gnome切换KDE Plasma

文章目录 安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop&#xff08;作者没有成功&#xff09;aptitude安装kubuntu-desktop多次aptitude install&#xff08;特别重要特别重要&#xff09;其他kde软件包 卸载gnome桌面 Ubuntu自带的桌面环境是gnome&#xff…