「我在淘天做技术」假如你五行属商家,如何算好账?

news2024/9/20 5:27:21

「我在淘天做技术」假如你五行属商家,如何算好账?

给讲讲大家淘天淘工厂财务开发的相关内容。

财务开发好陌生,是什么?好了,现在假如你五行属商家,并且就在淘宝上卖东西。当消费者买了你的东西,淘宝是不是需要给你结算这笔交易订单的钱,另外淘宝是不是还要收你一笔服务费?那财务开发的一部分职责,就是主要和作为商家的你打钱扣钱打交道的。 另外这里我们不讨论直接扣消费者钱的那一部分,所以我们其实高并发还好,但依然有着不小挑战。

而这里笔者之所以“大言不惭“在叨叨,其一是为了说明财务管理不是简单的报表和 SQL,在业务和技术上都有非常多挑战,其二希望能给各位同学带来一点兴趣,从而可以加入我们一起迎接挑战:)

作者:王艺辉(晓灰)

一、前言

个人吃穿用度、迎来送往,都得花钱。节日红包、工资年终,也记账上。那么一家企业更是如此,新开了什么项目,办了什么活动,哪里该收钱,哪里该花钱,更是一分不能漏,一厘不能错。比如

  • 消费者在淘宝上买的东西到了,还是包邮的,他没有付钱,但是你作为商家会被收取物流费、仓内操作费、包裹的材料费;

  • 消费者在淘宝上要买冰箱,下单的时候平台顺便送冰格或保鲜膜,他也不会付钱,消费者未必会想到为什么他们可以在一起买一送一件赠品。不过这自然是平台在背后有这个营销活动,而撮合了这笔交易的同时你作为商家要出一笔服务费;

  • 再比如消费者买东西需要评价,有时候页面上会提示消费者评价了返红包给消费者,同样地我们需要扣你钱然后再把这笔钱当作红包给消费者;

  • 又比如消费者买东西有运费险不需要消费者单独付钱,但是如果是你提供运费险,是肯定要给保险公司打钱的;

  • 另外如果是收钱,需要给消费者开发票;如果是打钱,需要给淘天开发票。

诸如此类,而淘天本身也可以理解为一个大的商家,他和你与钱打交道的这个过程可以简单描述流程如下:

报价可以简单理解为我们会在你作为商家入驻平台或者后续报名活动时与商家签订相关协议,明确各项费用的收取标准。那么我们作为财务开发,如何从技术系统上管好公司这些打钱收钱的事?

二、定义问题

2.1 业务问题

✪ 2.1.1 你问:为什么扣我这么多钱?

如前所述,双方会明确报价,但是你怎么知道淘天有没有算错,从而多扣钱呢?所以你有必要对淘天给你的账单,看和你预期的支出是否一致。而且更重要的是,你还得算好账,你要知道对于每个提供给消费者的商品链接目前投入了多少钱、已经赚了多少钱、还有多少钱没到账,不然你如何知道还要不要投入钱到这个商品链接上,或者要怎么继续投入?这个专业一点说,就是你作为商家也有自己的财务团队,他们会通过对公司各项业务数据的统计和分析,计算公司的投资回报率(Return on investment,ROI),定期为公司提供详细的财务报告,以便公司领导层了解公司的经营状况,为公司的发展制定合适的策略。所以我们作为财务开发不仅这个钱不能搞错了或者搞迟了,还得有凭有据--也就是要有清晰明确的账单,以及对应的经营分析数据。

✪ 2.1.2 淘天问:我 ROI 怎么样?

那我们在的独立核算的 BU 业务自然更关注成本支出的细节,计算我们自己的 ROI,出财报以及决策后续如何投资。所以我们作为财务开发需要保证对外对内的数据都一致,并且对内的数据会实际用于分析决策以及稽核。

应收应付 vs 实收实付

另外具体在处理公司财务时,我们还需要区分应收应付和实收实付。

应收应付是指公司在一段时间内应该收到或支付的款项,而实收实付是指公司实际收到或支付的款项。你打给别人钱,他的账户被银行冻结了收不回来,这就是应付而未付;同理,你收别人钱,结果他账户没有这么多钱,这就是应收而未收;而那些没有成功结算的钱我们称之为不可结算。就像商家会问“为什么扣我这么多钱?”一样,我们的财务需要应收应付来看当前公司的财务情况,也要关注不可结算及时追回该结算的钱。

当然,如果财报里只有实收实付本身也是有合规性风险的。所以我们作为财务开发要通过合理的设计,清楚的记录应收应付,并且确保应收应付与实收实付最后能准确对应,避免出现资金的损失。

业财一体

业财一体的概念诞生于国内复杂的商业活动,本身是一个很大的概念,相比字面的简洁,其阐释是复杂的。这里做个人不准确的一些阐述。

  • 业:指的是企业所有的经营活动和企业运营活动;

  • 财:财务会计(帮企业数钱)和管理会计(帮企业赚钱)。

业财一体的核心目标是建立财务和业务运营两个领域数据的映射关系,从而允许从财务角度及时和准确地解读业务运营中存在的问题。

业财一体目前具体在淘工厂技术领域的正向实现可以简单表示为以下流程

  • 收单: 收集基本业财数据;

  • 业财链路:补全业财数据;

  • 业财集成:生成应收应付单;

  • 销账: 根据应收应付单结算。

所以我们作为财务开发要实现业财一体,这样才能解决账单、财报等数据从哪里来的问题。

✪ 2.1.2 淘天问:代码不到位,资损两行泪

而说到资损,就不得不提到一句中国的俗话,“常在河边走,哪能不湿鞋”;或者说外国的墨菲定律,“该发生的一定会发生”。也就是说,代码总有出 bug 的时候、业务逻辑总有少考虑的时候、三方系统调用总会不符合预期的时候等等等等,但是一定不能出资损。

所以作为财务开发的你要如何做到无资损?

2.2 技术难点

说完了上面业务上给你提的问题,实际开发中你就要问这些问题了:

  • 业务和财务的数据分散在各处,怎么关联?

  • 上百个结算场景,怎么快速接入?

  • 上百个账单类目,怎么快速接入?

  • 几百亿条账单,hold 得住吗?

  • 上百个账单类目,财务时不时要换角度看怎么办?

  • 流程这么长,怎么样让所有数据都对得上?

三、核心技术

别一个头两个大了,我们都有解决办法。

3.1 接的快: 淘宝 TMF 2.0

TMF,全称为 Trade Module Framwork,诞生自阿里巴巴交易中台的业务场景。2017 年双 11,阿里的交易峰值达到了 32.5 万笔/秒,同时系统需要支撑全集团几十个事业部的所有交易类需求:要考虑如何能更快响应需求、加快发布周期;如何能为新小业务提供快速支撑、降低准入门槛;是否足够开放使得业务方能做到自助式扩展;新需求是否已经在其他事业部有可复用资产等问题。TMF 核心架构如下:

由此诞生的 TMF 成功为快速接入多个业务流程到平台提供了一套解决方案。我们模拟一下它在财务结算场景下的技术实现流程:

  1. 物流费的业务方找到你,你按照业财一体的流程实现了一笔交易物流费的收单、业财链路、业财集成与销账。

  2. 买冰箱送冰格这个营销活动的业务方希望你也找到你,你发现收单的某些信息可以复用,其他流程也是,而销账这个流程几乎整个都可以复用,你想起来设计模式里面的策略模式和责任链模式,于是封装了一系列策略接口,让不同的业务实现不同的策略接口,并通过判断业务身份决定走哪些业务逻辑。

  3. 业务越来越多,你会发现流程中多出了一个又一个的策略点需要对应的业务方开发实现,这时候业务方需要理解具体的结算流程才能实现这一个个点,接入和 debug 门槛过高。于是你引入了 TMF2.0,将你的策略接口封装入一个个模版类,并开发扩展点,接入者只需要实现扩展点即可,而对于某些必要要指定的逻辑通过模型的校验逻辑、抽象方法等会“强迫”接入方实现。

  4. 模版类也越来越多,业务方开发仍然需要梳理清楚自己需要实现哪些扩展点,这时你进一步将扩展点的类生成逻辑封装到可交互的 GUI 中(我们是 IDEA 插件),业务方只需要填写一些信息,就能生成对应的类和部分通用代码,这样对于新手他就知道自己要实现哪些扩展点;对于老手也避免了复制黏贴。

  5. 业务逻辑更加复杂,以至于模版类越写越长,于是可以再用 TMF 将策略接口和模版类都封装成解决某个通用业务问题的产品,让有业务开发者直接以 JAR 包的形式实现产品的特定逻辑,进而启动应用时加载对应 JAR 包事实上我们还没有走到第 5 步。

如此我们就解决了结算场景如何快速接入的问题。

3.2 对的清: 钱账票一体化

就像开篇介绍的报价-计费-结算-账单-发票流程一样,这其中钱账票在业务链路上是天然的顺序关系,所以是否能将这整个过程自动化,即智能感知市场报价,根据交易计费、结算后,自动化地生成账单和发票是一个业务上、效率上和数据质量上都值得思考的问题。特别是数据质量上,只有大家的数据尽可能少的从外部传入,都是在业务流程上自上而下消费,数据一致性的问题才能自然而然解决。钱账票一体化在业务流程上的表示:

✪ 3.2.1 底层数据模型的统一

举个账单中常见的数据模型例子,将其表示为二维表格的形式:

可以看到,除了抽象出的 owner_id、 bill_type、bill_id,对于不同的账单,它们各自的属性并不一致,想要统一这些账单就需要使用阿里云的 TabelStore 的 Schma-Free 特性,即对于 TableStore 的宽行模型来说,每一行都可以有不同的属性列,数据列的个数也没有限制。这个特性很好地满足了账单存储时不同属性列难以抽象统一的问题,同时业务变更时,也可以进行任意的属性列变更。统一后的架构如下图所示,其中选用 hologres 作为聚合数据的数据库是利用了其列存适合 OLAP 的特性。

✪ 3.2.2 明细数据查询、下载的统一

TableStore 支持 JDBC 的语法,我们是可以直接利用已有的 SQL 生成工具如 Mybatis Plus。但其实还有更简便的方法,即因为实际上后续业务查询的都是一张表,所以我们可以实际上写好一个组装查询参数的生成工具类,可以接收 JSON 组装包括不同账单类型在内的查询参数进行查询和导出。以物流服务费的查询为例,JSON 配置如下:

{    "billType":"XXX_FEE",    "billName":"XXX账单",    "fields":[        {            "field":"a_field",            "translate":"a字段"        },        {            "field":"b_field",            "translate":"b字段"        }    ],    "search":[        {            "queryType":"TERM_QUERY",            "targetColumnName":"id",            "name":"主键"        }    ],    "order":[        {            "orderType":"DESC",            "targetColumnName":"a_field"        }    ]}

这串 JSON 起到的作用生成一个面向 OTS 的查询参数,告诉 OTS 我们要查哪些字段,where 条件是什么,按照什么排序。

✪ 3.2.3 聚合数据模块渲染的统一

对数据看板设计图:

做如下抽象:

抽象出模型后,配合对应的模块加载器,实现输入一段结构体的 JSON,输出前端所需要的所有结构和数据的功能。如此前端的页面结构就可以让后端决定,前端只需要负责对应模块的渲染逻辑即可。通过这样的方式可以大大加速后续新增经典图形模块的接入速度,同时对于页面结构的变动也不再需要麻烦前端反复变更,后端一方就可以控制。此外,除了页面结构本身,页面中的金额名称、图标等也都由后端在 Diamond 中控制,如果有变更,更改起来十分的高效。

如此我们解决了如何快速接入百亿级别账单,以及让所有数据都对得上的问题,特别地,对于财务时不时要换角度看我们还对前端图形做了抽象。

3.3 行的稳: 事前、事中、事后

✪ 3.3.1 事前约定与评估

正式开发之前,每一个业务的接入或变更,都需要经过业务方、产品经理和领域资深同学的评估,并且将结论落实到文档中以便后续查阅和对焦。另一方面,实际开发中,标准化命名和类型约定将节省大量繁琐的工作。

✪ 3.3.2 事中测试、Code Review

测试

在实际业务开发中,账单涉及数据时间跨度长,计费规则也常变,如何既覆盖各种异常 case,同时长期保证 transformation 的数据质量值得思考。而测试是帮助我们将发现问题的时间尽可能提前的好手段,同时也是保障长期不会出意外变更问题的必要手段。不过实际生产中,除了普通的单元测试,我们可能还需要根据业务需要自己开发工具。比如在简单的参数化测试基础上:

@ParameterizedTest@CsvSource(value = {    "1,2",    "3,4"})void should_show_how_to_parse_multi_args_with_csv(Integer in,Integer out){  assertEquals(out,in + 1);}

相比 @CsvSource 再开发 @JsonFileSource 允许传入 JSON 格式的对象,并将每个历史上变动的计费逻辑都覆盖到,于是我们对数据处理正确的信心大大增加了。

Code Review

CR 的重要性毋庸置疑,不仅是代码上线的最后一关,也是让 CR 双方快速学习的重要手段。在淘天,代码写得好的前辈很多,新人来淘天才能看到他们写的优秀代码,也才能让自己被他们 CR。

✪ 3.3.3 事后自动化测试、资损监控

自动化测试

之前写的测试在实际生产过程中,每次的变更都会触发其运行,从而起到保证原有逻辑不受意外变更、保驾护航的作用。

另外当我们把数据导入数据仓库时,ETL 中的每个步骤中都可能会遇到数据质量错误,比如:

  • 与源系统的连接错误,抽取数据可能会失败;

  • 由于数据类型冲突,数据转换可能会失败;

  • 由于数据生产者新增或变更了存储逻辑,导致处理后的数据异常。

数据任务监控

对于 ETL 过程中不是单点的错误,我们监控一些数据任务的指标,比如数量、特征值、非空值等。而对于长期维护数据消费逻辑的过程中,每一条记录的数据质量保证,最好还得基于约定和测试。

数据核对

核对是对代码执行逻辑是否符合预期的事后保障。比如你认为当前 1 笔交易应该产生 2 笔资金流,你就可以通过对既成事实的交易数和资金流数目进行核对,从而知道事实上运行的系统是否保证了 1 笔交易应该产生 2 笔资金流的逻辑。

如此,我们尽力地保证了没有资损。也就是保证了所有资金流都是准确的。

四、总结

公司的财务管理远不止打钱收钱,远不止业财一体和钱账票一体化,而仅仅业财一体也是非常大的话题,非几本书不能讲清楚。而笔者能力也有限,不能完全保证表达的概念都准确,希望大家批判地阅读。不过笔者简要介绍的我们做的业财一体和钱账票一体化,不知道有没有引起优秀的你们一点点兴趣,快来加入我们吧!

如果你对财务技术感兴趣,欢迎来信邮箱:xiaohui.wyh@taobao.com 多多交流,希望能和你一起共事!

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

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

相关文章

金融帝国实验室(Capitalism Lab)V10版本即将推出全新公司徽标(2023-11-13)

>〔在即将推出的V10版本中,我们将告别旧的公司徽标,采用全新光鲜亮丽、富有现代气息的设计,与金融帝国实验室(Capitalism Lab)的沉浸式体验完美互补!〕 ————————————— >〔《公司详细信…

软件外包开发的需求表达方法

软件开发需求的有效表达对于项目的成功至关重要。无论选择哪种需求表达方法,清晰、详细、易于理解是关键。与开发团队建立良好的沟通渠道,确保他们对需求有充分的理解,并随着项目的推进及时调整和更新需求文档。以下是一些常用的需求表达方法…

冒泡排序算法原理和代码实现,就是这么简单!

冒泡排序,是比较简单的一种排序算法。 它的命名源于它的算法原理:重复的从前往后(或者从后往前),依次比较记录中相邻的两个元素,如果他们顺序错误就把它们交换过来,直到没有再需要交换的元素&am…

群晖NAS:内网穿透、异地组网 frp

群晖NAS:内网穿透、异地组网 星空-远程访问(推荐高速) https://ip4.ink/ cpolar极点云(简单易用) https://www.cpolar.com/ 内网穿透矿神教程 https://imnks.com/4406.html 1、公网最好了,IPV4参考&…

说说 Real DOM 和 Virtual DOM 的区别?优缺点?

一、是什么 Real DOM,真实 DOM,意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实 DOM 结构,如下: Virtual Dom,本质上是以 JavaScript 对象形式存在的对 DOM 的描述 创建虚拟 DOM 目的就是为了更好将虚拟的节点渲染到页面视图中,虚拟…

数字孪生智慧园区:大数据驱动下的运营管理革新

随着物联网、大数据、云计算等技术的飞速发展,数字孪生技术应运而生,它将物理世界与数字世界紧密连接起来,为各行各业提供了前所未有的解决方案。智慧园区作为城市的重要组成部分,通过数字孪生技术,可以实现更加高效、…

Go,14周年[译]

国内的双十一购物狂欢已没有了当年的那种热闹与喧嚣,但大洋彼岸的Go团队却始终保持稳中有增的开发和语言演进节奏。今晨Go核心团队的Russ Cox[1]代表Go语言项目团队在Go官博上发表了《Fourteen Years of Go》[2]的博文,纪念Go语言开源14周年[3]&#xff…

腾讯云服务器多少钱一年?腾讯云优惠服务器有哪些?

随着互联网的发展,越来越多的企业和个人选择将自己的业务部署在云服务器上。腾讯云作为国内领先的云服务提供商之一,其服务器价格也备受关注。 对于腾讯云优惠服务器,腾讯云会不定期推出一些促销活动,例如新用户优惠、老用户回馈…

桥接模式(结构型)

目录 一、前言 二、桥接模式 三、总结 一、前言 桥接模式(Bridge Pattern)是一种常用的设计模式,它可以将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式通常用于需要在多个维度上扩展一个类的情况,或…

仿京东拼多多商品分类页-(RecyclerView悬浮头部实现、xml绘制ItemDecoration)

文章目录 前言效果图思路方式一:通过xml布局来实现方式二:通过ItemDecoration方式来实现 实现步骤1、数据项格式2、左侧列表适配器3、右侧列表适配器4、头部及悬浮头部绘制4.1头部偏移高度为要绘制xml布局的高度--getItemOffsets()4.2 绘制固定头部--onD…

Node.js 框架 star 星数量排名——NestJs跃居第二

文章目录 什么是NodeJs?什么是NodeJs框架?图表数据框架排名 什么是NodeJs? Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得我们可以在服务器端使用JavaScript开发高效、可扩展的应用程序。作为一个快速、轻量级的平台,Node.js在Web开发领…

CTFhub-RCE-php://input

我们需要使用php://input来构造发送的指令 查看phpinfo&#xff0c;找到一下字段 证明是可以使用php://input 1. 使用Burpsuite抓包并转至Repeater 2. 构造包 方法&#xff1a;POST 目标&#xff1a;/?filephp://input Body&#xff1a;<?php system("ls /"…

元宇宙时代,数字员工正成为企业服务的黄金担当!

未来&#xff0c;你的同事可能不是“人” 自2021年“元宇宙”爆火之后&#xff0c;作为连接现实世界和元宇宙的媒介之一&#xff0c;虚拟人开始大量跑步入场。伴随着虚拟数字人相关技术包括CG、语音识别、图像识别、动捕等的共同成熟&#xff0c;让数字虚拟产业在今年渐入佳境…

(免费领源码)Springboot宠物医院管理系统的设计与实现84724-计算机毕业设计项目选题推荐

摘 要 现如今生活质量提高&#xff0c;人们追求精神健康&#xff0c;与家中宠物朝夕相处&#xff0c;感情深厚&#xff0c;宠物渐渐成了我们身边的朋友。因而宠物生病了&#xff0c;需要去看病&#xff0c;自古医院救死扶伤&#xff0c;生命无贵贱&#xff0c;无论人类还是动物…

一文详解进销存管理系统!

一、什么是进销存管理系统&#xff1f; 进销存软件是一种针对制造业企业设计的管理软件系统&#xff0c;旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化供应链&#xff0c;并增强企业的整体运营效…

如何使用Cpolar+Tipask,在ubuntu系统上搭建一个私人问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…

Nat. Med. | 成年人的城市生活环境对心理健康的影响

今天为大家介绍的是来自Jiayuan Xu和Gunter Schumann团队的一篇论文。城市居民暴露于许多可能相互结合和相互作用的环境因素&#xff0c;这些因素可能影响心理健康。目前尚未有工作尝试建模城市生活的复杂实际暴露与大脑和心理健康之间的关系&#xff0c;以及这如何受遗传因素调…

每日互动(个推)全新推出AITA智选人群工具,助力品牌营销升级

11月9日&#xff0c;在2023年世界互联网大会“新产品新技术特色场景发布活动”上&#xff0c;数据智能服务商每日互动&#xff08;个推&#xff09;全新打造的AITA智选人群工具首次正式对外发布。作为每日互动在品牌营销领域的大模型应用最新成果&#xff0c;AITA智选人群工具将…

【学习笔记】 - GIT的基本操作,IDEA接入GIT以及上传hub

用github蛮多&#xff0c;但git没怎么用&#xff0c;看着视频对着写点笔记以及操作 一、GIT文件的三种状态和模式 已提交(committed) 已提交表示数据已经安全的保存在本地数据库中。 已修改(modified) 已修改表示修改了文件&#xff0c;但还没保存到数据库中。…

速锐得HJ1239车载终端TBOX柴油商用车远程排放管理工况模型应用

其实排放模型&#xff0c;并不是生涩难懂的问题&#xff0c;首先我们准备好一台TBOX&#xff0c;比如无论是海康、华为、速锐得、博世、联电、LG、西门子都可以做到&#xff0c;在满足TBOX具备4G物联网2路CAN支持远程升级控车&#xff0c;支持国四国五国六车型&#xff0c;带定…