Skip to content

介绍

  • 添加一种单据类型在云ERP里审核
  • 本次以《库内周转调拨申请单》(DBQ)举例

整体流程

  1. 找到 .NET 对应审核页面的查询逻辑(一般是 sqlname),以 MyBatis XML 配置文件的方式改写
  2. 云ERP后台直接使用 @IISMapper 注解查询分公司数据(无需再经过 erp 的 java 后台中转,少一次 HTTP 调用)
  3. 云ERP 的 Nacos 配置中加上单据类型,前端待办中心即可看到新增的标签

相应配置查询

  • 查单据类型 DBQ,单据的 billid 格式是 ${公司编码}${单据类型}${规则序号},通过查看单号即可拿到单据类型,查询sql: SELECT BRANCHID,billid from TB_GOS_PURSTKTURNFLITTINGSUM WHERE ROWNUM < 10;

  • 通过单据类型查询 startIdPurStkTurnFlitting_Audit,查询sql: SELECT BRANCHID,startid from TB_SYS_BILLDEFINE WHERE billtypecode = 'DBQ'; 可以查到

Nacos 配置

bpm.bill.config.bill-types 下新增一段配置:

yaml
DBQ:
  module-name: 采购中心
  sync: false
  web-erp-only: false
  remark: 库内周转调拨申请单
  startIds: PurStkTurnFlitting_Audit

字段说明:

  • module-name:前端展示的分组名称(如 采购中心、销售中心)
  • sync:是否同步审核(一般填 false)
  • web-erp-only:是否仅云ERP处理(一般填 false)
  • remark:单据名称备注
  • startIds:工作流启动ID,与 IIS 侧的流程配置对应,也是 SQL 中待办过滤的条件值

只需要加 bill-types,不需要加到 old-mc-billsnew-mc-billsmc-audit-bills 等分类列表中。 那些列表是控制跳转移动商务/AC系统审核的,云ERP自己审核的单据不需要配置。 参考同类单据:采购中心的 HET(采购订单)、PCJ(客户商品价格申请单)。

一般需要加的三个接口

接口方法用途备注
/auditListPOST待办主单列表(分页,带权限过滤)需要加接口
/auditDetPOST勾选主单后累加查询商品明细需要加接口
/auditInfoGET单据详情(主单+明细)有详情的是云erp有的单子有详情页面可以公用,否则需要加接口

Mapper 层要点

java
@Mapper
@IISMapper    // 关键注解:标记为IIS分公司查询,SQL通过HTTP下发到分公司执行
public interface PurStkTurnFlittingQueryMapper {
    List<PurStkTurnFlittingAuditMapperVO> queryAuditList(PurStkTurnFlittingAuditDTO req);
    List<PurStkTurnFlittingAuditDetVO> queryAuditDet(@Param("billIds") List<String> billIds);
    PurStkTurnFlittingAuditMapperVO queryAuditInfo(@Param("billId") String billId);
}
  • 核心1:利用 @IISMapper 注解实现分公司查询,最终会调用到 .net 项目。
  • 核心2:BranchId 由 BranchIdInterceptor 拦截器从请求头 branchid 自动设置到 BranchIdContext, 前端请求无需在 Service 中手动设置。定时任务等非请求场景才需要手动 set/clear。

Mapper XML 要点

待办过滤 SQL 片段(核心,必须包含)

每个 Mapper XML 中需要内联定义待办过滤 SQL 片段(weberp-server 中没有公共 SQL 片段文件):

xml
<sql id="todoExistsFilterDistributed">
    exists (
        select 1 from Tb_Gos_Bpm_Ru_Todo todo
        inner join (
            select startid from tb_sys_bpm_cfg_base where startid = '${startId}'
            union
            select cb.startid from tb_sys_bpm_cfg_base cb
            inner join tb_sys_bpm_cfg_relation r
            on r.startid = cb.startid and r.relationcode = '${startId}' and r.relationtype = 1
        ) b on todo.startid = b.startid
        where (todo.user_id = #{${staffIdParam}} or todo.group_id = #{${staffIdParam}})
        and (todo.proc_inst_id = ${tableAlias}.workflowguid or todo.rel_proc_inst_id = ${tableAlias}.workflowguid)
        and not exists (select processinstanceid, taskid
            from tb_sys_workflow_async_task t
            where (t.processinstanceid = todo.proc_inst_id or t.processinstanceid = todo.rel_proc_inst_id)
            and t.taskid = todo.task_id)
    )
</sql>

列表查询(queryAuditList)引用方式

xml
<select id="queryAuditList" resultType="...MapperVO">
    select ... from TB_GOS_XXX a
    where a.deleteflag = 0
        and
        <include refid="当前Mapper全限定名.todoExistsFilterDistributed">
            <property name="startId" value="与nacos的startIds一致"/>
            <property name="staffIdParam" value="loginStaffId"/>
            <property name="tableAlias" value="a"/>
        </include>
        <include refid="queryCondition"/>
    order by a.pk desc
</select>

三个 property 说明:

  • startId:与 Nacos 配置的 startIds 一致(如 PurStkTurnFlitting_Audit
  • staffIdParam:DTO 中员工ID字段名(loginStaffId 来自 PageInfo 父类)
  • tableAlias:主表别名(如 a

注意事项

  1. 时间类型的序列化,目前借助了 common-web-config 里的 SqlOnlyInvocationHandler 处理,使用了下面的 LenientDateDeserializer 兼容多种时间格式,需要 61 版本以上。

页脚:版权前显示的信息