ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

小区物业管理系统设计与实现:B/S架构、JSP与数据库全解析

小区物业管理系统设计与实现:B/S架构、JSP与数据库全解析 简介这份资料是一份完整的小区物业管理系统毕业设计/课程论文文档面向计算机相关专业学生、开发者及物业管理信息化研究者。内容基于B/S架构系统讲解用户管理、数据库管理、网页生成等功能模块并结合SQL Server与JDBC、JSP与JavaBeans技术展开还包含需求分析、可行性分析、界面与功能要求等章节。文档以docx格式提供整个压缩包仅1个文件大小1.52MB便于下载与编辑使用。目前已有2209人学习适合需要参考物业管理类系统设计思路、撰写论文或完成课程设计的人群。读者可从中获得系统架构设计方案、数据库表结构设计理念及具体业务模块划分涵盖住户、房产、设备、仪表、停车、收费、投诉及报修等多类管理子系统的功能说明能有效支撑实际项目开发或文档撰写。1. 不只是论文一份能直接复现的小区物业管理系统设计小区物业管理系统设计与实现这个词条底下的资源包不少真正值得打开的却不多。这份文档属于“老技术栈、新价值”的那种——物业管理员每天抄水表、算费用、登记报修长期靠Excel和纸质台账来回倒腾而这套系统把住户、房产、设备、抄表、收费、投诉、报修、停车场管理全部收进一个基于B/S架构的Web平台。登录者分管理员、注册用户、游客三级页面用JSP生成业务逻辑交给JavaBeans数据层走JDBC连接SQL Server 2000。对正在做毕业设计、或者想帮小型物业公司做信息化的从业者来说它的价值不在代码能不能立即跑起来而在那套经过需求调研沉淀下来的数据模型和业务流程设计至今还能直接搬用。2. B/S架构与JSP技术选型这套老技术栈为什么能跑通物业全流程2.1 为什么物业管理系统要选B/S而不是C/S物业公司日常使用的电脑配置参差不齐前台接待、财务、维修班组分散在不同楼栋。如果做C/S架构每台机器都要装客户端版本一升级就得挨个重装这在物业场景里是灾难。B/S架构只用浏览器访问IE 6.0时代就能跑管理员、住户、游客三类角色统一通过网址进入系统免去客户端安装环节。文档里对硬件的描述很保守访问者机器“建议采用较高配置”开发机AMD 1.5G处理器加512M内存就能带起来放到今天任何一台机器都绰绰有余这也是B/S方案在低配置环境下依旧顺畅的原因。从数据安全角度看C/S模式下业务数据散落在各个客户端本地物业收费、住户身份证号、银行账号这类敏感信息很容易被拖走。B/S模式下所有数据集中在数据库服务器前端只做展示和交互权限控制在服务端统一执行管理员可对用户分类、添加、删除、修改普通注册用户只能查自己的缴费和投诉记录。这种集中管控模式与物业行业“多个经办人、一个管理员”的实际组织形态高度匹配。对比维度B/S架构C/S架构客户端安装只需浏览器零安装每台机器装客户端升级维护只改服务端即可逐台更新客户端数据存储集中在数据库服务器部分数据可能留在本地权限控制服务端统一管控控制分散易漏配适用场景物业多角色远程访问单网点内部高并发数据录入2.2 JSP、JavaBeans、JDBC三者的分工这套系统文档里明确写了技术组合前台页面用JSP制作JSP结合JavaBeans扩充网页功能JDBC负责与SQL Server 2000数据库打交道。JSP页面本质是JSP元素、Java程序片段和HTML文档的混合体以Java作为脚本语言。它解决的是“动态页面生成”问题——住户登录后看到的收费列表、投诉处理状态都是根据数据库里的实时数据拼出来的不是静态HTML。示例代码里会看到JSP中直接嵌Java代码的写法那是那个年代的主流风格今天的观点不推荐这么写但当时这套组合确实是Java Web开发的标准答案。JavaBeans是Java的组件规范在系统里承担两件事业务逻辑封装和数据访问。比如查住户信息、计算仪表本月费用、校验登录密码这些操作都写进Bean的方法里JSP页面只负责调用Bean后再渲染结果。这样做的好处是组件重用——多个页面都要查住户表只需要复用同一个住户Bean不需要每个页面重复写JDBC查询代码。文档里强调代码设计要“整洁、清晰、易读”强调可重用性、可移植性和可维护性指的就是这套分工。2.3 JDBC连接SQL Server 2000的关键写法老项目里数据库连接通常封装在独立JavaBean中常见做法是写一个DBConnection类提供静态方法所有数据访问类统一调用。以这份文档使用的SQL Server 2000为例驱动、URL、账号配置如下import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * JDBC连接SQL Server 2000的工具类 * 注意SQL Server 2000需要三个驱动包 * msbase.jar、mssqlserver.jar、msutil.jar放入WEB-INF/lib */ public class DBConnection { // SQL Server 2000的驱动类名不要写成新版驱动的com.microsoft.sqlserver.jdbc.SQLServerDriver private static final String DRIVER com.microsoft.jdbc.sqlserver.SQLServerDriver; // URL格式jdbc:microsoft:sqlserver://主机IP:端口;DatabaseName库名 private static final String URL jdbc:microsoft:sqlserver://localhost:1433;DatabaseNamexiaoquixinxi; private static final String USER sa; private static final String PASSWORD sa123; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }代码逻辑说明静态代码块在类第一次加载时注册驱动只执行一次getConnection方法每次调用返回新连接用完必须由调用方关闭。参数说明localhost要换成数据库服务器的实际IP如果数据库和Tomcat不在同一台机器这里写localhost会连接失败1433是SQL Server默认端口实例名或端口改了要同步改开发环境用sa账号没问题生产环境务必换最小权限专用账号。注意SQL Server 2000的连接串走的是jdbc:microsoft:sqlserver子协议与2005及以后版本的jdbc:sqlserver子协议完全不同这是老项目最常见的翻车点。2.4 Tomcat部署结构文档指定的应用服务器是Apache Tomcat 5.0运行环境JDK 1.4。整个Web应用放到Tomcat的webapps目录下目录结构大致如下webapps/xiaoqu/ ├── index.jsp ├── login.jsp ├── register.jsp ├── WEB-INF/ │ ├── web.xml │ └── lib/ │ ├── msbase.jar │ ├── mssqlserver.jar │ ├── msutil.jar │ └── jsp-api.jar └── META-INF/JSP文件放在应用根目录JavaBeans编译后的class文件或打包jar放进WEB-INF/classes或WEB-INF/libweb.xml配置欢迎页面和过滤器。数据库驱动三件套必须放在WEB-INF/lib下Tomcat的类加载器才能加载到放在其他位置会在运行时抛出ClassNotFoundException。后来我用高版本Tomcat复现这类老项目时JDK版本和Servlet API都不匹配JSP里的scriptlet片段经常报错。如果只是拆解设计建议直接按文档的版本组合搭环境要在新环境跑就参考第6章的迁移方案。3. 数据库设计拆解十三张表如何支撑物业核心流程3.1 数据字典里的核心表与职责分组文档的数据字典部分列出了十三张核心表用户表、住户表、房产资源表、物业设备表、停车场信息表、住户投诉表、住户报修表、设备维修表、水表资料表、电表资料表、气表资料表、物业收费表、仪表收费表。这些表按业务作用分成四组分组表名关键字段业务作用系统权限用户表登录名、登录密码、用户描述支撑管理员、注册用户、游客三类角色登录基础主数据住户表住户编号、物业地址、业主姓名、身份证号、入住时间登记业主身份与入住记录基础主数据房产资源表房间编号、物业地址、建筑面积、单价、总价、是否已售维护小区房产台账设施运维物业设备表设备编号、型号、品牌、购买日期、事故记录管理公共设备档案设施运维停车场信息表车位编号、车位位置、停车住户、开始/截止日期管理车位使用记录流程单据住户投诉表投诉编号、投诉日期、投诉内容、处理人员、处理情况记录投诉处理闭环流程单据住户报修表报修编号、报修内容、维修人员、服务费用、物料费用、合计费用记录住户报修与费用流程单据设备维修表维修编号、设备编号、维修费用、维修内容记录设备维修历史计量与收费水/电/气表资料表3张仪表编号、上月数据、本月数据、本月用量、单价、本月费用、抄表日期每月抄表与用量费用计算计量与收费物业收费表收费编号、收费项目、应收总额、已交金额、欠费金额、交费日期物业管理费收缴台账计量与收费仪表收费表收费编号、收费项目、应收总额、已交金额、欠费金额水电气费收缴台账这张表告诉你物业系统从第一天起就不是单表逻辑而是“主数据交易流水”的结构。住户、房产、设备属于主数据抄表和收费属于流水数据。主数据相对稳定流水数据不断追加这种分层在今天的新系统里依然成立。还要注意文档的数据字典把水电气合并描述为“仪表资料表”逻辑结构设计里又拆成三张独立表复现时以逻辑结构的拆法为准。3.2 住户、房产、收费三表关系与前因后果看字段设计能发现一条清晰的业务链路住户表通过住户编号、物业地址与房产资源表关联房产资源表记录单价和总价是否售出字段决定这套房能不能办理入住物业收费表通过住户姓名、物业地址、年份、月份关联到具体住户形成“谁住哪套房、应该交什么钱、交了没有”的完整链路。CREATE TABLE zhuhu ( zhuhu_id INT IDENTITY(1,1) PRIMARY KEY, -- 住户编号自增主键 wuye_address VARCHAR(200) NOT NULL, -- 物业地址与房产表关联 fangxing VARCHAR(50), -- 房型 jianzhu_mianji NUMERIC(10,2), -- 建筑面积 shiyong_mianji NUMERIC(10,2), -- 使用面积 yezhu_name VARCHAR(50) NOT NULL, -- 业主姓名 shenfenzheng VARCHAR(18), -- 身份证号 dianhua VARCHAR(20), -- 联系电话 ruzhu_time DATETIME, -- 入住时间 qianchu_time DATETIME -- 迁出时间 ); CREATE TABLE fangchan ( fangjian_id INT IDENTITY(1,1) PRIMARY KEY, -- 房间编号 wuye_address VARCHAR(200) NOT NULL, -- 物业地址唯一 jianzhu_mianji NUMERIC(10,2), danjia MONEY, -- 单价 zongjia MONEY, -- 总价 yishou CHAR(1) DEFAULT N -- 是否已售Y/N ); CREATE TABLE wuye_shoufei ( shoufei_id INT IDENTITY(1,1) PRIMARY KEY, -- 收费编号 zhuhu_name VARCHAR(50) NOT NULL, -- 住户姓名 wuye_address VARCHAR(200) NOT NULL, -- 物业地址 nianfen INT NOT NULL, -- 年份 yuefen INT NOT NULL, -- 月份 shoufei_xiangmu VARCHAR(100), -- 收费项目 yingshou MONEY, -- 应收总额 yijiao MONEY DEFAULT 0, -- 已交金额 qianfei MONEY, -- 欠费金额应收减已交 jiaofei_date DATETIME -- 交费日期 );参数与设计说明IDENTITY(1,1)是SQL Server的自增列写法对应文档里“主键是序号由系统自动生成”的描述业务层不用生成主键避免并发冲突。物业地址在住户表和房产表里是逻辑关联键实际项目更稳妥的做法是用房间编号做外键因为物业地址字符串可能因录入习惯不一致产生“3栋2单元101”和“3栋2单元101室”这种差异。yishou字段用CHAR(1)存Y/N是那个年代的习惯迁移到现代数据库时建议改成BIT类型。收费表的qianfei源自应收减已交文档明确列出应收总额、已交金额、欠费金额三个字段这是典型的冗余设计查询欠费时不用每次现场计算代价是写入顺序错了会出现三字段对不上的脏数据。注意物业地址在住户表和房产表之间是逻辑关联键建议在建表时直接以房间编号做外键减少录入偏差带来的关联失败。3.3 水电气表与用量计算的数据结构水表、电表、气表三张表结构几乎一样文档把三张表分开列而不是合成一张带仪表类型的通用表。这在当时是为了查询简单——每次打开对应页面无需带类型过滤条件代价是后续要加“暖表”时得再建一张几乎相同的表。核心字段序列是仪表编号、住户姓名、物业地址、年份、月份、上月数据、本月数据、本月用量、单价、本月费用、上月抄表日期、本月抄表日期、本月交费日期、办理人。从中可以看出计算链条UPDATE shuibiao SET benyue_yongliang benyue_shuju - shangyue_shuju, benyue_feiyong (benyue_shuju - shangyue_shuju) * danjia WHERE nianfen 2025 AND yuefen 1;本月用量等于本月数据减上月数据本月费用等于本月用量乘单价。这种批量更新语句在当年很常见但隐含一个前提上月数据必须在月初抄表时回填。如果某个月忘记抄表上月数据还是上上个月的计算结果会吞掉一个月的用量。我一般会在抄表页面加校验本月抄表日期与上月抄表日期相差超过30天就给出警告提醒抄表员核对上月读数来源。这三张表每月为每户生成一条新记录几百户的小区一年就是几千条流水SQL Server 2000处理这个量级没有压力需要关注的是对年份、月份建立复合索引否则年底做报表统计时全表扫描会让页面明显变慢。提示三张表结构高度重复迁移到现代系统时建议合并成一张meter_record表加meter_type字段区分水电气后续扩展其他计量类型不需要再改表结构。4. 功能模块实现三类角色与四组业务闭环怎么串起来4.1 三级权限模型与登录注册流程系统明确划分三类登录者管理员、注册用户、游客。游客只能浏览公告、小区留言和公开信息注册用户登录后可查询自己的收费、报修、投诉记录管理员额外拥有用户管理、信息分类、添加、删除、修改的权限。登录逻辑用JavaBeans封装非常直接。先按用户名查出用户记录比对密码再把用户类型写入SessionJSP页面通过Session里的角色标识决定渲染哪些菜单public class UserBean { // 校验用户名密码返回用户描述失败返回null public String checkLogin(String username, String password) { Connection conn null; PreparedStatement ps null; ResultSet rs null; try { conn DBConnection.getConnection(); String sql SELECT usermiaoshu FROM userpassword WHERE username? AND password?; // 用PreparedStatement避免SQL注入老项目里直接拼字符串的很多 ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); rs ps.executeQuery(); if (rs.next()) { return rs.getString(1); // 返回用户描述用于区分角色 } return null; } catch (Exception e) { e.printStackTrace(); return null; } finally { // 关闭ResultSet、PreparedStatement、Connection try { if (rs ! null) rs.close(); } catch (Exception e) {} try { if (ps ! null) ps.close(); } catch (Exception e) {} try { if (conn ! null) conn.close(); } catch (Exception e) {} } } }代码逻辑说明用户描述字段在此处同时承担角色标识的作用管理员、注册用户通过它区分。登录校验只做了比对没有密码加密这是当时项目的普遍状态。文档用户表字段只有登录名、登录密码、用户描述明文存储。血泪经验老系统被SQL注入洗库的案例不少改造第一步就是把password列换成密文并引入加盐哈希这条在复现时务必落实。角色控制落到页面上的常见做法是JSP开头判断Session% String userType (String) session.getAttribute(userType); if (userType null) { response.sendRedirect(login.jsp); // 未登录游客跳转登录页 return; } boolean isAdmin admin.equals(userType); %代码逻辑说明游客直接访问管理页面会被重定向到登录页管理员能看到“用户管理”“信息删除”入口普通注册用户只能看到个人查询入口。这种做法简单可靠后面做权限改造时只需要替换成Filter统一拦截角色判断逻辑本身不用变。4.2 住户与房产信息管理的录入与维护管理员进入住户信息管理页面完成业主入住登记。录入内容分两大块身份信息姓名、籍贯、出生年月、性别、身份证号、工作单位及地址、邮编和财务信息开户银行、银行账号加上入住时间、迁出时间。房产资源表维护房间编号、物业地址、建筑面积、使用面积、装修情况、单价、总价、是否已售、买主编号、买主姓名。录入页面常见的坑是身份证号和银行账号这类长数字被JSP转成浮点数导致精度丢失。那个年代的解决办法是把这些字段在数据库里定义成VARCHAR页面上也用文本输入框接收绝不用数值类型。文档把身份证号定义为varchar设计上是正确的做页面时不要让前端框架自作聪明地把它们转成number类型。编辑和删除操作同样交给独立JavaBeans方法。删除住户前必须检查关联数据——如果该住户已有收费记录、投诉记录或报修记录强行删除会造成外键悬空报表里出现“住户不存在”的历史流水。我建议在删除逻辑里加一道存在性查询文档没有明确写这一步但从数据字典的关联关系看这是必然需求。4.3 仪表抄表、收费计算与欠费查询这是整个系统业务量最大的模块。抄表员每月录入水电气表读数系统算出用量和费用收费员在收费模块录入应收、已交系统算出欠费金额住户登录后通过报表模块查询自己历史月度的缴费情况。页面交互大致是这样选择住户和仪表类型页面带出上月数据和上月抄表日期录入本月数据保存时计算本月用量和本月费用生成或更新仪表收费记录。计算部分写进JavaBeanspublic class MeterBean { // 根据本月读数计算用量和费用返回费用金额 public double calcMonthFee(double lastData, double thisData, double unitPrice) { if (thisData lastData) { // 读数回退可能是重装了表不能直接得出负用量 return -1; // 由调用方决定是否需要人工复核 } return (thisData - lastData) * unitPrice; } }参数说明单价每表单独保存水电气单价不同缴费月份要求与抄表月份一致。计算时对读数回退的防御很关键老式机械表换表后读数会清零直接相减会得出负用量页面应提示“读数异常”并让人工复核而不是默认取绝对值。收费模块的核心计算是欠费金额等于应收总额减已交金额。收费列表按物业地址分组显示各户总欠费住户端显示的是自己名下所有年份月份的明细两种查询场景需要不同SQL写法。4.4 投诉、报修、设备维修的闭环状态这三个模块有共同点都是“登记→处理→归档”的流转过程只是对象不同。住户投诉的字段涵盖投诉日期、接待人、投诉住户、物业地址、电话、投诉内容、处理人员、处理日期、处理情况住户报修多出服务费用、物料费用、合计费用设备维修关联设备编号、设备名称、维修费用和维修人员。报修费用合计逻辑简单合计费用等于服务费用加物料费用。但实际业务里还有一个隐性规则——同一户同一天报修多个项目时服务费用通常只收一次上门费物料费按项累计。如果系统只按单条记录存储这个规则只能在收费时人工调整。文档的设计颗粒度到单据级没有拆到维修项级这是老系统的普遍取舍改进时可以把报修单拆成“主表加明细表”两级结构。投诉和报修模块还承担物业服务质量统计的职责。报表统计子模块里列出设备维修统计、住户报修统计、住户投诉统计、物业设备统计、仪表数据统计统计口径完全依赖前面的状态字段是否及时更新——处理情况字段如果不写统计页面就会把投诉误判为未处理。所以录入规范比代码更重要处理人员、处理日期、处理情况三个字段必须联动校验要么都空要么都填。5. 避坑指南复现旧版JSP物业系统最常见的五个故障5.1 JDBC驱动加载失败报ClassNotFoundException现象启动Tomcat后访问JSP页面后台抛出java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver首页所有涉及数据库的区块全部报错。原因两种情况都有。一是msbase.jar、mssqlserver.jar、msutil.jar没放到WEB-INF/lib目录Tomcat的类加载器找不到二是驱动类名写错。SQL Server 2000的驱动类名是com.microsoft.jdbc.sqlserver.SQLServerDriver而2005及以上版本的驱动类名是com.microsoft.sqlserver.jdbc.SQLServerDriver两者差了一段把新版驱动类名拿去连2000就会报ClassNotFound。解决把三个JAR放对位置确认驱动类名和URL都保持老写法jdbc:microsoft:sqlserver://localhost:1433;DatabaseNamexiaoquixinxi。URL里的microsoft子协议同样只认2000版本2005之后要改成jdbc:sqlserver://这段代码在新老版本之间不能混用。5.2 JSP页面中文变成问号或菱形乱码现象页面能打开但中文全部显示成“??”或菱形字符从数据库读出来的住户姓名、物业地址全乱录进去的中文再读出来也错位。原因三层编码不一致。第一层JSP页面本身的pageEncoding没设Tomcat默认按ISO-8859-1处理第二层表单POST提交的数据没有在接收时设置request.setCharacterEncoding第三层SQL Server 2000数据库排序规则如果是默认的Latin1_General中文字段存进去就是乱的。解决JSP文件头部统一加% page contentTypetext/html; charsetGBK pageEncodingGBK%在接收请求的JavaBean或Filter里执行request.setCharacterEncoding(GBK)建库时指定Chinese_PRC_CI_AS排序规则。三个环节的字符集必须一致只改一处没用。这是老JSP项目里最玄学也最常见的坑遇到乱码先看数据库排序规则再看请求编码最后看页面编码。5.3 文档前后矛盾可行性分析写Access需求分析写SQL Server 2000现象按正文里的可行性分析去装Access做到一半发现后面的建表语句、JDBC连接全是SQL Server 2000的写法数据库对不上。原因文档不同章节引用了不同版本的材料属于原始文档的编辑疏漏不是技术问题。技术可行性那段写的是“运用Access的数据库技术”而运行要求里明确写着SQL SERVER 2000两者不一致。解决以3.1.3系统的运行要求为准数据库统一用SQL Server 2000。操作系统优先按Windows 2000 SP4Windows XP同样能跑。复现时不要被可行性分析那一小节带偏这也是老论文里常见的情况阅读时注意交叉验证。5.4 住户表字段太多录入页面又长又容易漏现象一个住户录入页面二十多个字段身份证号、银行账号全挤在一张表里录入员填到后面经常漏掉开户银行导致收费对账时查不到付款来源。原因住户表把身份信息、工作单位信息、银行账务信息全部堆在一张宽表里违背了文档自己提到的BCNF分解原则。开户银行、银行账号、工作单位这些属性更新频率低又与日常查询场景不相关放在住户主表里只增加录入负担和出错概率。解决按职责拆成住户基本信息表和住户扩展信息表。前者保留姓名、身份证号、电话、入住时间等高频字段后者存放工作单位、银行账号等低频字段通过住户编号一对一关联。文档里已经有住户编号这个主键拆表不需要改业务逻辑只是把录入页面拆成两个Tab反而更容易校验必填项。5.5 老版本Tomcat在新JDK环境部署失败现象Tomcat 5.0配JDK 1.4没有问题换到JDK 8或11后Tomcat 5.0起不来报UnsupportedClassVersionError或直接进程退出。原因Tomcat 5.0针对JDK 1.4设计class文件版本不兼容老Tomcat对高版本JDK的模块化支持也不完整。解决学习复现阶段按文档的版本组合搭环境JDK 1.4加Tomcat 5.0加SQL Server 2000。如果只是阅读设计文档可以完全跳过环境搭建。要体验系统流程又不愿装老系统直接走第6章的迁移路线把这套业务设计搬到现代技术栈上运行。6. 迁移到Spring Boot Vue老设计里有哪些值得带走的资产老项目的运行环境很难在今天原样复现但那套数据模型完全具备换壳升级的价值。近几年类似题目的毕业设计很多变成了“基于Spring Boot Vue的物业管理系统”点开数据库一看表结构还是当年那套住户表、房产表、收费表、报修表换了个马甲而已。这说明文档的数据字典经得起时间考验。6.1 数据库层保留主结构调整三个细节数据库结构基本保留只做三处调整一是主键保持自增整数CHAR(1)的Y/N改成BIT类型二是各表补上created_at和updated_at时间戳老设计里只有业务日期缺少记录创建与更新时间排查数据问题时很吃亏三是把水电气三张表合并成一张meter_record表加meter_type字段区分把物业收费和仪表收费统一成charge_record表加biz_type字段减少重复建表。6.2 业务层与权限层Service化与权限框架把收费计算和欠费计算从JavaBeans挪到独立Service层写成可以单元测试的方法这是老代码里最值钱也最容易出错的部分。权限模型从Session角色标识升级成Spring Security或Shiro的基于角色访问控制登录状态管理、密码加密一并解决。页面端可以保留原来的业务页面划分用Vue重写交互层抄表页面把“本月数据”和“上月数据”分开展示减少录错率。迁移时最容易翻车的就是第3章提到的月份冗余问题抄表记录落了月份月底汇总就少一条迁移脚本里要按年份加月份做唯一索引约束。这些年拆过的老系统里这套物业管理的业务设计算是相当完整的。让我印象最深的是水电气表里的“上月抄表日期”和“本月交费日期”这对字段——很多新项目反而不记抄表日期月底对账时说不清哪些户是逾期缴费。从那以后我每次给业务系统加计费功能都强制要求保留抄表时间和缴费时间两个时间戳只记金额不记时间点是给自己埋雷。希望帮到你。本文还有配套的精品资源点击获取
返回列表