Skip to content

两个人同时打开同一张订单编辑,会不会互相覆盖? ​

不会。安仕达对业务单据实行独占加锁:同一张单据在同一时刻只允许一个账户或站点进入编辑,不存在两个人各改一份再互相覆盖的情况。这是单据层的数据安全底线,不靠操作员自觉避让。

机制落在两处:

  • 单据主表的锁定人字段:fLockManId 记录当前占用编辑的操作员,避免多人同时编辑冲突,与审批所有者相互独立。单据操作技巧把这条写成单据的独占编辑原则——系统控制每个单据同一时间只允许一个操作员编辑。
  • 账套级加锁开关:系统维护 → 系统设置 → 设置系统特点 → 业务数据 → 单据设置,单据加锁设置区的【启用单据表加锁模式】(IsUseTableBillLock)。同页还有【初始化单据表加锁信息...】按钮,用于清理异常残留的锁信息,参数详见单据设置用户特点。

审批态再叠一层权限。按单据的状态和所有者,单据提交后进入申请中草稿,所有者 fOwnerID 自动切换为当前审批人,只有所有者能审批与处理,包括制单人在内的其余账号只读;驳回后所有者回退为制单人。编辑锁管占用,所有者管权责,两套机制各管一段。

编辑权还跟着单据状态走:草稿状态可任意编辑;已提交未审核的要先点【撤回申请】退回草稿再改;已审核单据不可直接修改,需要调整时按单据类型走取消生效或作废重开。也就是说,一张正在审核的订单,除了当前所有者,别人连改的入口都没有。

改动本身也留痕。单据从表有明细修改人 fChgManID 与明细修改时间 fChgTime,记录每一行最后一次是谁改的、什么时候改的;行版本号 fLineVer 记录明细修改次数,用于数据校验与变更追溯。即使出现争议,也能逐行还原改动过程,而不是只有一个最终结果。

至于订单列表自动刷新会不会打断正在审核的窗口,属于界面交互层的行为,不在单据加锁的保证范围内,以实际版本为准。可以确定的是:单据的锁不会因为列表刷新就释放给别人,已录入的明细也不会因此丢失——单据录入是逐行自动保存的,输入完一行切到下一行,该行数据即已落库。需要一边查单一边审单时,可切换为内嵌单据查询模式,查询窗口不弹出、不影响其他窗口工作,随时切回去继续处理。

这样设计的好处 ​

  • 冲突在打开单据时就被挡住:不是等到保存那一刻才发现数被人改过,审核过程中的单据不会被第二个账户抢走编辑权。
  • 锁与审批权限分开:fLockManId 只管编辑占用,fOwnerID 只管审批责任,人员离岗时可单独移交审批权,不必去动编辑锁。
  • 逐行自动保存加独占锁:异常退出最多损失当前尚未落行的那一行,不会整张单回滚,也不会出现两份互相覆盖的版本。

需要注意的边界 ​

加锁保证的是同一张单据不被两个账户同时编辑,不保证列表自动刷新不打断当前界面操作,这部分交互细节不要当成承诺。

超级管理员与总部运维账号可无视所有者权限查看、编辑、处理所有单据,用于异常单据干预;日常不要用它绕过审批流程。

单据设置参数全账套共用、不按操作员区分,改完点工具栏【保存】才写库,多数参数需要重启软件或重开业务窗口才生效。

在哪做 ​

环节入口
独占编辑原则与逐行保存单据操作技巧
加锁开关与锁信息初始化单据设置用户特点
锁定人、所有者与状态口径单据的状态和所有者