免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

用友U8二次开发:基于CO方式的采购请购单增删改审接口实践

用友U8二次开发:基于CO方式的采购请购单增删改审接口实践 简介面向用友U8及用友CO开发者的采购请购单增删改审接口开发源码包基于CO方式实现采购业务单据的定制化处理适合需要在U8系统中扩展或改造请购单流程的ERP实施与二次开发人员。包内含73个文件约1.05MB主要涵盖U8Login.dll等动态库、16个C#源码文件、XML配置与接口定义、工程解决方案及Demo示例并附带说明.txt便于快速理解模块结构与调用关系。除编译好的exe/pdb外还保留了Dapper依赖包与完整VS工程文件开发者可直接打开调试、学习登录验证与增删改审的核心实现思路。压缩包配合Demo演示程序展示了从界面操作到后端接口调用的完整链路可帮助中高级开发人员减少逆向排查时间快速落地自己的单据管理功能。已有162人学习下载适合作为U8二次开发入门及CO方式接口改造的参考样例。 做用友U8二次开发的同行应该都遇到过这类需求OA审批流程跑完了采购申请需要自动同步到U8生成请购单SRM系统里供应商确认好的采购需求要批量写入U8还有从MES或WMS直接发起缺料请购的场景。如果全靠人工录入不仅效率低还容易在单据号、部门、存货编码上出错。我最近整理了一套基于CO方式的U8采购请购单增删改审接口开发源码覆盖新增、删除、修改、审核四个完整操作正好把这几个高频场景一次性解决掉。这篇就聊聊整个开发思路、关键技术点和踩坑经验给后面要做同类接口的朋友一个参考。源码最终打包成rar压缩包里面包含完整的接口工程代码、示例调用程序和数据库脚本。对正在做U8供应链集成的实施顾问、企业IT开发以及准备接U8采购模块的项目组成员来说这套东西可以直接落地。1. 接口方案选型与整体设计思路1.1 为什么选CO方式而不是直接操作数据库外部系统要操作U8的请购单最粗暴的做法是直接连U8数据库往PO_AppVouch和PO_AppVouchs两张表里插数据。我见过不少企业这么干前期确实快后期坑特别多。一是绕过了U8的单据号生成规则很容易和界面录入的单据撞号二是U8很多核心校验逻辑比如存货档案状态、部门权限、审批流判断都挂在业务层直接写库根本不会触发三是缓存和触发器不同步用户在U8界面上看不到刚插入的单据严重时还会出现数据不一致。CO方式走的是另一条路。它把U8核心业务单据的操作能力封装成组件对象接口外部系统通过标准参数调用这些接口就能驱动U8内部的业务逻辑。等于把单据号生成、合法性校验、审批状态流转这些脏活累活都交给U8自己处理我们的代码只需要关心参数怎么组织、返回值怎么解析。相比直接操作数据库CO方式的稳定性和可维护性高很多。U8版本升级时只要组件接口没有大改代码基本不用动。这也是我最终选择CO方式的原因。为了更直观地说明选型逻辑我把几种常见方案的优劣对比一下实现方式开发速度稳定性维护成本适用场景直接写SQL操作数据库快差容易产生脏数据高版本升级大概率要返工只读查询、临时数据修复U8API中等较好但部分单据支持不完整中受API版本影响标准功能覆盖较全的单据CO组件方式中等好复用U8自身业务逻辑低核心业务单据的完整操作1.2 接口整体架构与调用流程整个接口的调用链路大概是这样的外部业务系统发起请求先经过一层接口网关做身份认证和基础参数校验再把请求送入业务逻辑层。业务逻辑层负责把外部系统的字段翻译成U8能识别的数据格式然后调用CO业务组件。CO组件完成操作后统一返回响应结果包含U8的单据号、审核状态和错误码。这个链路里两个设计点特别重要。第一参数映射层要独立出去不要和业务逻辑混在一起。因为外部系统传过来的字段命名习惯跟U8完全不一样比如外部叫申请部门U8里对应的是cDepCode如果不做映射层后面字段一多代码就会乱成一团。第二所有操作必须放在统一事务上下文里保证U8内部数据的强一致性不能出现主表写入了、子表没写入的半截数据。具体到这次开发的请购单接口我把功能拆成了四类操作新增请购单、修改请购单、删除请购单、审核请购单。外部系统按接口规范传参返回结果里带U8单据号和当前审核状态。这样设计的好处是外部系统完全不需要关心U8后台的复杂表结构和组件调用细节只需要按照约定好的协议传参和接参。2. 新增、修改、删除、审核四个核心操作的细节拆解2.1 新增请购单字段映射与预校验是重中之重新增请购单是四个操作里最常用、也最容易出问题的一个。接口入参至少要覆盖这些核心字段请购部门编码、请购人编码、需求日期、存货编码、数量、备注。有些企业还会有自定义项比如项目编号、预算科目这类扩展字段我建议在接口设计时预留一个自定义字段集合避免后期频繁改接口结构。实际开发中遇到最多的不是代码逻辑写不对而是入参数据本身不合法。比如存货编码在U8存货档案里不存在、存货已经停用、部门传的是名称而不是编码、数量传了负数、需求日期格式不对。这些问题如果在接口层提前拦截返回给外部系统一个明确的错误码和中文提示能省掉大量联调时间。我的做法是在调用CO组件之前先做一轮预校验查存货档案、查部门档案、查人员档案、校验数量和日期格式。校验不通过就直接返回不再走组件调用。这轮预校验虽然多花几次查询但换来的是接口整体稳定性非常值得。2.2 修改请购单审核状态决定操作方式修改请购单有一个绕不开的特殊情况请购单的修改权限和审核状态强相关。未审核的请购单直接改已审核的请购单必须先弃审改完后重新审核。这个规则如果不在接口层处理好外部系统轻则改不动重则改了不生效数据还是旧的。我在设计修改接口时做了这样的处理先查询目标请购单的当前审核状态如果是已审核状态先调用弃审操作再执行修改最后根据外部系统的参数决定是否需要重新审核。整个过程放在同一个事务上下文里任何一步失败就整体回滚不会留下已弃审但没改成功的中间状态。另外修改接口入参里我加了一个版本标记字段类似乐观锁的概念。外部系统更新时带上这个标记接口层判断当前数据是否还是之前查询的版本不是就直接拒绝。这个设计能有效避免两个系统同时修改同一张单据导致覆盖丢失的问题。2.3 删除请购单不是简单执行DELETE删除请购单比想象中要谨慎很多。U8请购单一旦被下游采购订单引用就不能再直接删除了。删除操作只对未审核且未被下游引用的请购单有效。已审核的请购单必须先弃审存在下游单据关联的接口要直接拒绝删除并把关联单号返回给外部系统由业务人员人工确认处理方案。我见过一些二次开发删除就是用SQL直接DELETE这种做法风险极高。如果这张请购单已经生成了采购订单直接把主表数据删掉采购订单就成了孤儿单后续收料、对账、结算全部乱套。所以在删除接口实现里一定要检查下游关联关系。我的做法是先查请购单状态再查下游订单来源记录只要任何一个环节不满足条件就返回明确错误码。这看起来是多写了几段查询但保护的是整条供应链数据链路的完整性。2.4 审核请购单防止重复审核审核接口逻辑相对简单但有一个很典型的问题——重复审核。外部系统可能因为网络超时重发请求导致同一张请购单被审核两次。U8的审核操作本身有幂等性但接口层的判断还是要做如果请购单已经是审核通过状态直接返回成功如果状态是未审核才真正执行审核动作。这样外部系统重试时不会产生任何副作用。审核通过后的联动也要考虑进去。有的企业配置了请购单审核后自动生成采购订单的流程接口审核一旦触发这个联动就有可能出现订单生成失败的情况。此时接口不能只返回审核成功要把下游的异常信息也带出来方便后续排查。还有一个容易忽略的细节审核操作需要记录审核人和审核时间。如果接口调用方没有传审核人编码系统里要有一个默认的配置项兜底否则审核历史里会出现空操作员查追溯链路的时候非常麻烦。3. 关键实现细节与代码框架3.1 请购单核心表结构与字段说明不管用哪种方式做接口都要对U8后台的数据表结构有基本了解。请购单涉及两张核心表PO_AppVouch是主表存请购单头信息PO_AppVouchs是子表存请购单行信息也就是存货明细。两张表通过ID字段关联。下面是整理的关键字段清单表名作用关键字段PO_AppVouch请购单主表ID、cCode请购单号、cDepCode部门编码、cPersonCode请购人、dDate制单日期、审核状态字段、cVerifier审核人、dVerifyDate审核日期PO_AppVouchs请购单子表ID、iRowNo行号、cInvCode存货编码、iQuantity数量、dRequireDate需求日期、iPrice参考单价、cMemo备注需要说明一下不同U8版本的字段命名可能会有差异像审核状态字段有的版本叫iVerifyState有的叫verifystate。开发前建议先用数据库工具连上测试环境把实际字段确认一遍不要凭经验直接写死。3.2 CO方式接口调用的代码骨架整体代码是基于常见实践补充的框架具体的类名和参数名需要根据实际U8版本调整。核心流程是初始化登录上下文、创建业务对象、组织表头和表体数据、调用保存、返回结果。public class U8PurchaseRequestService { private U8LoginContext _loginContext; /// summary /// 初始化U8登录上下文相当于在U8客户端登录一个操作员 /// /summary public bool Initialize(string account, string userId, string password) { // 1. 创建登录上下文对象 // 2. 设置账套号、操作员编码、密码 // 3. 调用Login方法登录成功后保存上下文实例 // 说明这里的上下文建议用静态字段缓存不要每次请求都新建 } /// summary /// 新增请购单 /// /summary public ApiResult CreateRequest(PurchaseRequestDto dto) { // 1. 预校验部门档案、存货档案、数量、日期格式 // 2. 创建请购单业务对象设置表头字段 // 3. 遍历dto.Details逐行设置表体字段 // 4. 调用Save方法U8内部自动生成请购单号 // 5. 从返回结果中取出cCode封装成ApiResult返回 } /// summary /// 修改请购单已审核单据自动走弃审-修改-审核链路 /// /summary public ApiResult UpdateRequest(string requestCode, PurchaseRequestDto dto) { // 1. 查询单据当前审核状态 // 2. 如果已审核调用UnVerify方法弃审 // 3. 修改表头表体数据调用Save // 4. 根据入参autoVerify决定是否重新审核 // 5. 整个流程包裹在事务中任一步异常则回滚 } /// summary /// 审核请购单带幂等处理 /// /summary public ApiResult VerifyRequest(string requestCode) { // 1. 查询单据当前状态 // 2. 如果已审核直接返回成功不重复执行 // 3. 如果未审核调用审核方法 // 4. 捕获下游联动异常合并到返回信息中 } }这段代码里最核心的思路就是把U8组件操作全部封装在Service类内部外部系统只面对标准化的数据对象。整套代码里不出现任何SQL所有数据操作都通过组件完成这也是CO方式区别于直接写库的核心所在。源码包里还有完整的DTO定义、统一返回结构体和错误码枚举拿来可以直接改改就用。3.3 事务一致性与错误码设计接口开发最容易翻车的就是事务控制。U8的CO组件本身有事务机制但外部系统调用多步骤操作时必须保证每一步都成功或者全部回滚。我的做法是在Service层加一个事务包装器统一捕获异常并回滚。这里有一个很实际的坑U8组件在事务执行过程中如果抛异常有些对象锁不会自动释放必须在finally代码块里做清理否则第二次调用会报对象被锁定或者无法获取连接。这个坑我踩过两次排查了很久才发现是没释放对象锁导致的。错误码设计上建议定义一套统一的三位错误码至少覆盖这几类参数错误、业务预校验不通过、U8组件内部异常、网络超时、未知异常。每个错误码对应一个人类可读的中文提示。外部系统联调时最怕收到一堆看不懂的堆栈信息明确的错误码能极大缩短问题定位时间。比如返回1001对方马上知道是部门编码不存在而不是拿着日志到处问。4. 常见问题、排查技巧与上线经验4.1 高频报错与解决思路开发期间和上线初期我碰到过不少问题这里挑几个出现频率最高的整理成速查表方便大家直接照着排查。报错现象可能原因排查方向保存报单据号重复当前流水号被占用或并发冲突检查U8单据号规则设置确认是否有其他程序直接写库导致流水号错乱审核失败提示无操作权限接口登录的操作员没有审核权限确认接口配置的操作员角色检查U8权限管理里的审核授权删除提示已被下游单据关联请购单已生成采购订单或下游单据查询下游关联单号转发给业务人员人工确认外部系统重发请求导致重复操作接口未做幂等处理在接口层按单据号做唯一性判断已处理过的请求直接返回成功调用组件时报对象被锁定上一次调用的对象未释放检查代码是否在finally中释放对象尤其是异常路径新增后U8界面看不到数据登录了错误的账套或仓库权限不足确认接口登录的账套与外部系统配置的一致检查数据权限4.2 并发和性能优化接口上线后最常见的性能问题来自大量并发请求。尤其是月末、季末外部系统批量同步请购单如果每个请求都串行调用U8组件接口响应会越来越慢严重时还会把U8应用服务器拖垮。我的建议是在外部系统和接口之间加一层消息队列先削峰再处理。请求先进入队列接口服务端按固定并发数消费既保护了U8应用也保证了整体吞吐量。另一个优化点是复用登录上下文。很多新手容易犯的错误是每次调用接口都重新登录U8登录过程开销不小高并发下会浪费大量性能。正确做法是把登录上下文做成连接池初始化一批后重复使用。同时要做好心跳检测长期不用的连接要定时清理防止U8端会话过期导致调用失败。4.3 上线前的自测清单与回环验证接口测试不能只看正常流程异常场景也必须全部过一遍否则上线后每次报错都手忙脚乱。我每次上线前都会跑一遍自测清单这里直接列出来供参考正常新增请购单并审核通过核对U8界面数据和接口返回一致新增时传不存在的存货编码确认返回明确错误码而不是报堆栈异常修改已审核单据确认自动走弃审-修改-审核链路删除已关联采购订单的请购单确认被接口拦截并返回关联单号重复审核同一张单据确认接口直接返回成功且不产生副作用外部系统断网后重发请求确认幂等处理生效。这版清单之外一定要做一次完整的业务回环验证从外部系统发起请购申请到U8生成请购单再到审核后生成采购订单全链路走通一遍。很多问题单测是发现不了的只有把整条业务链路串起来跑才能看到真实的隐患。我在一个项目里就遇到过审核成功但下游采购订单没生成的情况最后排查下来是审核触发规则配置的问题这种问题不做回环测试根本发现不了。这套接口做完之后我最大的体会是U8二次开发里最花时间的往往不是写代码而是把U8自身的业务规则彻底理清楚。一个请购单的增删改审背后牵扯的是部门权限、存货档案、审核状态机、下游单据关联这些交叉规则。把这些规则在接口层全部消化干净外部系统接入才会真正省心。源码包里我同步放了一份接口设计说明文档记录的就是这些规则的整理过程和接口边界定义有条件的朋友可以拿去看一看。后面有机会我准备把供应商协同和采购订单方向的接口也用同样的思路整理出来到时候再和大家继续交流。本文还有配套的精品资源点击获取
返回列表