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

从一张表格开始做挖机报价系统

一、前言

历时4个月的挖机销售报价系统进入收尾阶段,由我直接负责与业务方对接,这中间各种折腾真是一言难尽,项目开发过程中还要维护POS系统以及牛奶配送系统,本项目我们采用的是迭代开发,今天讲一下具体的开发过程以及本项目业务架构。

注:这是我这5年在公司第三比较大的项目,第二个项目见 《窗帘销售平台技术架构的一点思考》,这也是我负责产品设计第二个项目。

二、迭代开发

上面方框中就是一个迭代周期,每一个迭代周期时间在1~2周左右,形成一个可演示版本,并且部署到澳洲生产环境机器上,交付给业务方进行试用,然后根据试用的结果再梳理出下一迭代需求。

1、需求阶段

业务方很难讲清楚需求,在第一次需求会上给我们看了一个Excel表格,有接近100多个字段,说他们主要是用这个表格来管理所有的挖机主机和零部件从采购、库存、客户、销售报价、出库、财务、售后一系列工作,现在需要开发一个软件来管理。

注:几乎所有业务方都很难讲清楚自己的需求,毕竟他们不是做系统的,我们做为专业人士要理解这一点,如果能够是需要尽量引导业务方讲出他真正需要做的功能。

3、设计阶段

我们团队总共8个人,人人都是产品经理,所有人都需要参加与需求方的沟通会以及考虑自己所负责模板的产品原型,在这过程中我更多的是负责思考整个项目要拆分成哪些功能模块,每个模块需要几个交互页面,页面之间逻辑是怎样的,业务流程是什么,数据流是怎样的,要建哪些表,表之间的关系以及明确每张表的关键字段,具体细节由各位开发自己去考虑。

4、开发阶段

团队分工合作,我一直认为如果做业务技术,团队成员水平一定是阶梯式的, 由技术扎实的开发负责基础架构搭建和技术难点解决,比如 报价模板在线签名,权限管理、延迟队列、库存管理抽像等,业务经验较丰富的负责核心业务开发,在开发过程中有业务逻辑问题反馈给我,我考虑清楚重新调整产品逻辑与页面原型。

注:架构中间件团队对技术人员的要求是不同的,这种团队需要开发人员水平比较均衡,在搭建业务技术团队的时候要招好两个角色,一个做技术架构,另一个更能从客户角度思考需求,一般来讲对技术比较痴迷人对业务逻辑不会有太大兴趣,而能更多从客户需求考虑的人只会把技术当成解决问题一个工具,所以一个比较完美的团队最好有这两个角色并且能通力合作。

5、测试阶段

我一直认为一个专业的测试是相当重要的,搞不清楚为何很多大厂在削减测试人员,以我这么多年带技术团队经验观察的结果,开发的思路和测试是完全不同的,要想让开发做到无Bug上线几乎是不现实的,尤其是像POS系统、报价系统这些直接影响销售收入的软件,如果没有测试把握完全无法想像。我对测试人员要求是必须搞清楚数据流,每一笔业务操作写到表的哪个字段都要搞清楚并且对产品功能逻辑问题进行有效反馈,然后我再重新考虑产品原型的调整,所以我比较清闲。

注:我一直认为一个技术管理者最重要的就是做好工作安排,老板是不会考核你个人的产出的,他要考核的是整个团队的产出,你撸不撸代码老板是不Care的,但团队成员理不清楚思路或者技术难点你必须搞定,这也是技术管理者该做的事情。

6、功能演示

做完一个小版本我们就给澳洲业务方做本次迭代的功能演示,然后业务方通过具像化可运行的产品去思考本次迭代的功能需要做哪些优化以及下一个迭代还要做哪些功能,这样版本从0.1演变到0.8,每个小版本都与业务方有充分沟通,整个产品进行逐步完善,再做两个小迭代,就可以交付正式使用。

注:这种迭代模式一个比较大的问题就是业务方经常对已经完成的功能模板提出新的需求。

三、业务架构

上图是报价系统的业务架构图,整个系统是以商品和客户为核心进行构建。

1、客户CRM模块

客户是CRM模块的核心,围绕着客户将其在系统中的每一个事件都进行汇总,并且记录每一事件中销售与客户的沟通记录,这样销售在跟进一个客户时,可以清晰地知道与客户交互的所有情况,我们会生成一个时间轴,什么时间接到客户电话,什么时间进行报价,什么时间与客户签订合同,以及这中间所有的沟通记录,然后给客户分成不同等级,当客户变成非活跃时,会及时提醒销售进行跟进。

2、商品模块

商品模块有点复杂,这与窗帘销售不太一样,想了很长时间才想清楚,主要是主机和零部件的管理是完全不同的,主机价值都比较高,对于每一台主机是需要全链路跟踪的,这个关键点在于主机的序列号,需要通过主机序列号串起从供应商发货到入库、在哪个仓库,在仓库哪个区位,然后报价生成合同生成时关联到起来一直到该主机出库甚至后续的售后,而对于零部件来讲就相对简单,采购后供应商可以分批次发货,在入库时需要指定放到哪个仓库哪个货架,但零部件在货架上多少数量是不需要管理的,也没有办法管理,只维护某个型号的零部件当前在哪个仓库哪个区位什么货架上即可。

注:在产品设计时一定要考虑哪些是必须要做的,哪些是不需要做的,很多功能做出来实际业务流程限于企业的管理成本也没有办法用起来。

3、财务模块

财务模板也想了很长一段时间才想清楚,还好我自学了一段时间会计,后来想明白了就比较简单了,其实把应付款和应收款管理好就可以,应付款对应采购合同,应收款对应销售合同,一个合同可以开1张或多张发票,一张发票可以进行一次或多次付款,只有财务进行发票确认的采购价和销售价才是最准确的,最终利润是根据发票上销售价减去采购价再扣减分摊的物流成本进行计算,这样我们就能够精确计算每一台主机的销售利润。

注:这张图是报价选商品的主流程,我们将服务、安装费都打包成基础产品,这样整个系统架构会更简单一些。

四、技术要点

1、采用最简单的单体前后端分离架构,除了牛奶那个系统其它系统我们都没用分布式架构,牛奶业务零售再过两个月左右就会完全停掉,到时再把系统架构整理出来,纪念一下我是如何搭建年销售额百亿的系统架构的,但这是一个有点悲伤的故事。

2、报价模板生成涉及到解析Word模板、动态生成PDF报价文件,在线签名,邮件发送给客户。

3、操作日志 解析BinLog 记录了每张表每个字段变更前后的值。

4、ToB的系统没有高并发的挑战,但业务复杂度是远远超过ToC的业务,这里仅简单介绍一下,实际项目中更复杂,每一个下拉框选择不同的类型都会触发一系列业务规则。

注:一个产品从0到1还是挺有难度的,需要理清客户真正需求,平衡好需求与开发进度的关系,如果掌握不了一个度,任何一个点你可能都需要花一两周时间去做,然后整个项目进度无限期拖延。

相关文章:

从一张表格开始做挖机报价系统

一、前言 历时4个月的挖机销售报价系统进入收尾阶段,由我直接负责与业务方对接,这中间各种折腾真是一言难尽,项目开发过程中还要维护POS系统以及牛奶配送系统,本项目我们采用的是迭代开发,今天讲一下具体的开发过程以…...

Qt扫盲-QTreeView 理论总结

QTreeView 理论使用总结 一、概述二、快捷键绑定三、提高性能四、简单实例1. 设计与概念2. TreeItem类定义3. TreeItem类的实现4. TreeModel类定义5. TreeModel类实现6. 在模型中设置数据 一、概述 QTreeView实现了 model 中item的树形表示。这个类用于提供标准的层次列表&…...

BF算法详解(JAVA语言实现)

目录 BF算法的介绍 图解 JAVA语言实现 BF算法的时间复杂度 BF算法的介绍 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继…...

零基础转行网络工程师,过来人给的一些建议

最近收到好多同学的一些提问,零基础没经验,能不能转行到网络工程师?薪资能有多少?发展前景怎么样? 应该有不少朋友都有这个疑问,那么,今天我尽量给大家做出一个详细的解答,希望能有…...

Vue中如何进行分布式搜索与全文搜索(如Elasticsearch)

在Vue中实现分布式搜索与全文搜索(使用Elasticsearch) 分布式搜索和全文搜索在现代应用程序中变得越来越重要,因为它们可以帮助用户快速查找和检索大量数据。Elasticsearch是一种强大的分布式搜索引擎,它可以用于实现高性能的全文…...

数据结构-图-最小生成树问题

最小生成树 并查集定义举例说明查找某个元素属于哪个集合代码实现路径压缩 Kruskal算法原理代码实现 Prim算法原理代码实现 并查集 定义 🚀在一些应用问题中,需要将n个不同的元素分成一些不相交的集合。开始时,每个元素自成一个单元素集合&…...

使用vite+npm封装组件库并发布到npm仓库

组件库背景:使用elementplusvue封装了一个通过表单组件。通过JSX对el-form下的el-input和el-button等表单进行统一封装,最后达到,通过数据即可一键生成页面表单的功能。 1.使用vite创建vue项目 npm create vitelatest elementplus-auto-form…...

85.最大矩形

单调栈&#xff0c;时间复杂度o(mn)&#xff0c;空间复杂度o(mn) class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int mmatrix.size();if(m0){return 0;}int nmatrix[0].size();//记录矩阵中每个元素左边连续1的数量vector<…...

Windows服务器 开机自启动服务

1、新建txt&#xff0c;并粘贴下面脚本 start cmd /k "cd /d D:\ahjd&&java -jar clips-admin.jar" start cmd /k "cd /d D:\ahjd\dist&&simple-http-server.exe -i -p 8000"说明&#xff0c;脚本格式为&#xff1a;start cmd /k “cd /d…...

《算法通关之路》chapter17一些通用解题模板

《算法通关之路》学习笔记&#xff0c;记录一下自己的刷题过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 1 二分法 1.1 普通二分法 # 查找nums数组中元素值为target的下标。如果不存在&#xff0c;则返回-1def bs(nums: list[int], target: int) -> int :l, h …...

常用求解器安装

1 建模语言pyomo Pyomo是一个Python建模语言&#xff0c;用于数学优化建模。它可以与不同的求解器&#xff08;如Gurobi&#xff0c;CPLEX&#xff0c;GLPK&#xff0c;SCIP等&#xff09;集成使用&#xff0c;以求解各种数学优化问题。可以使用Pyomo建立数学优化模型&#xf…...

第三章:最新版零基础学习 PYTHON 教程(第一节 - Python 运算符)

在Python编程中,运算符一般用于对值和变量进行操作。这些是用于逻辑和算术运算的标准符号。在本文中,我们将研究不同类型的Python 运算符。 运算符:这些是特殊符号。例如- + 、 * 、 / 等。操作数:它是应用运算符的值。目录 Python 中的运算符类型 Python 中的算术运算符…...

细粒度特征提取和定位用于目标检测:PPCNN

1、简介 近年来&#xff0c;深度卷积神经网络在计算机视觉上取得了优异的性能。深度卷积神经网络以精确地分类目标信息而闻名&#xff0c;并采用了简单的卷积体系结构来降低图层的复杂性。基于深度卷积神经网络概念设计的VGG网络。VGGNet在对大规模图像进行分类方面取得了巨大…...

【STM32单片机】数学自动出题器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED液晶显示出题器开机界面&#xff0c;默认结果范围为100&#xff0c;可按…...

C语言之动态内存管理篇(1)

目录 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 今天收假了&#xff0c;抓紧时间写几篇博客。我又来赶进度了。今天我们来讲解动态内存管理。&#x1f197;&#x1f197; 为什么存在动态内存分配 假设我们去实现一个…...

React18入门(第二篇)——React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下&#xff1a; React&#xff1a; V18.2.0Node.js: V16.14.0TypeScript&#xff1a;最新版工具&#xff1a; VsCode 本文将采用图文详解的方式&#xff0c;手把手带你快速完成在React项目中配置husky、prettier、commitLint&#xff0c;实现编码规范的统…...

【VINS】苹果手机采集单目相机+IMU数据离线运行VINS-Mono

0.准备工作 开个新坑&#xff0c;之前用Android手机做过离线采集数据的实验&#xff0c;这次用IPhone来测试&#xff01; 1.虚拟机配置Mac OS 下载一个Mac OS 的ios镜像&#xff0c;打开虚拟机按照跟Ubuntu差不多的方式安装&#xff0c;但是发现没有Mac OS的入口。 因为VMwa…...

数据结构 2.1 单链表

1.单链表 线性表&#xff1a;1.有限的序列 2.序列中的每一个元素都有唯一的前驱和后继&#xff0c;除了开头和结尾的两个节点。 顺序表&#xff1a;分配一块连续的内存去存放这些元素&#xff0c;eg、数组 链表&#xff1a;内存是不连续的&#xff0c;元素会各自被分配一块内…...

[Machine Learning]pytorch手搓一个神经网络模型

因为之前虽然写过一点点关于pytorch的东西&#xff0c;但是用的还是他太少了。 这次从头开始&#xff0c;尝试着搓出一个神经网络模型 &#xff08;因为没有什么训练数据&#xff0c;所以最后的训练部分使用可能不太好跑起来的代码作为演示&#xff0c;如果有需要自己连上数据…...

KdMapper扩展实现之Dell(pcdsrvc_x64.pkms)

1.背景 KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动&#xff0c;本文是利用其它漏洞&#xff08;参考《【转载】利用签名驱动漏洞加载未签名驱动》&#xff09;做相应的修改以实现类似功能。需要大家对KdMapper的代码有一定了解。 2.驱动信息 驱动名称pcds…...

python和go相互调用的两种方法

前言 Python 和 Go 语言是两种不同的编程语言&#xff0c;它们分别有自己的优势和适用场景。在一些项目中&#xff0c;由于团队内已有的技术栈或者某一部分业务的需求&#xff0c;可能需要 Python 和 Go 相互调用,以此来提升效率和性能。 性能优势 Go 通常比 Python 更高效&…...

c# 分部视图笔记

Html.Partial("**", 1) public ActionResult **(int page) { ViewBag.page page; return PartialView("**"); }...

Vue3最佳实践 第七章 TypeScript 中

Vue组件中TypeScript 在Vue组件中&#xff0c;我们可以使用TypeScript进行各种类型的设置&#xff0c;包括props、Reactive和ref等。下面&#xff0c;让我们详细地探讨一下这些设置。 设置描述设置props在Vue中&#xff0c;props本身就具有类型设定的功能。但如果你希望使用Ty…...

(三)行为模式:8、状态模式(State Pattern)(C++示例)

目录 1、状态模式&#xff08;State Pattern&#xff09;含义 2、状态模式的UML图学习 3、状态模式的应用场景 4、状态模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现状态模式的实例 1、状态模式&#xff08;State Pattern&#x…...

nginx的配置文件概述及简单demo(二)

默认配置文件 当安装完nginx后&#xff0c;它的目录下通常有默认的配置文件 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connection…...

Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建

前言: apollo planning2.0 在新版本中在降低学习和二次开发成本上进行了一些重要的优化,重要的优化有接口优化、task插件化、配置参数改造等。 GNU symbolic debugger,简称「GDB 调试器」,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端…...

flex 布局:元素/文字靠右

前言 略 使用flex的justify-content属性控制元素的摆放位置 靠右 <view class"more">展开更多<text class"iconfont20231007 icon-zhankai"></text></view>.more {display: flex;flex-direction: row;color: #636363;justify-co…...

java基础-第1章-走进java世界

一、计算机基础知识 常用的DOS命令 二、计算机语言介绍 三、Java语言概述 四、Java环境的搭建 JDK安装图解 环境变量的配置 配置环境变量意义 配置环境变量步骤 五、第一个Java程序 编写Java源程序 编译Java源文件 运行Java程序 六、Java语言运行机制 核心机制—Java虚拟机 核…...

jvm 堆内存 栈内存 大小设置

4种方式配置不同作用域的jvm的堆栈内存。 1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermSize=128M //非堆内…...

免杀对抗-反沙盒+反调试

反VT-沙盒检测-Go&Python 介绍&#xff1a; 近年来&#xff0c;各类恶意软件层出不穷&#xff0c;反病毒软件也更新了各种检测方案以提高检率。 其中比较有效的方案是动态沙箱检测技术&#xff0c;即通过在沙箱中运行程序并观察程序行为来判断程序是否为恶意程序。简单来说…...

卖游戏辅助的网站怎么建设/网页链接

文章目录一.Mybatis配置之属性优化1.1 配置解析1.2 默认配置环境1.2.1 事务管理器&#xff08;transactionManager&#xff09;了解即可。1.2.2 数据源&#xff08;dataSource&#xff09;1.3 属性&#xff08;properties&#xff09;一.Mybatis配置之属性优化 1.1 配置解析 …...

在线定制/白帽seo

#!/bin/bash #################################################### # version:1.01          # # link:http://www.cnblogs.com/netsa # # qq:402151718         # # author:bekey …...

室内设计书籍/南宁百度seo建议

1&#xff0c;引理 2&#xff0c;泰勒公式 3&#xff0c;应用...

网站开发php是什么意思/域名注册需要多少钱

一。CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用。 CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图形库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;它们…...

大连网龙建站优化推广/网店如何营销推广

更多代码请见&#xff1a;https://github.com/xubo245 基因数据处理系列 1.解释 重新运行&#xff0c;跟换了文件地址 后来终端&#xff0c;需要运行其他的2.代码&#xff1a; hadoopMaster:~/disk2/xubo/project/alignment/sparkBWA$ vi sparkBWA.sh for j in 10000 10000…...

柳江区城乡住房建设局网站/湖南关键词优化品牌价格

作者ChevyRay &#xff0c;2013年9月28日&#xff0c;snaker7译 原文地址&#xff1a;http://unitypatterns.com/introduction-to-coroutines/ 在Unity中&#xff0c;协程&#xff08;Coroutines&#xff09;的形式是我最喜欢的功能之一&#xff0c;几乎在所有的项目中&…...