
# 一、应用场景
当公司存在**多个系统**(业务系统、OA系统等多种系统),**出纳**需要付款时,便需要在金蝶EAS新增**出纳付款单或者在网银系统中创建付款信息**,这样手工创建时,一付款效率低下、二容易出错。
为了提供出纳付款的准确性和付款效率,系统集成方案便提上日程。**金蝶EAS与其他异构系统集成方案有多种**,如WebService、OpenApi和中间表等多种方案。每种方案的优劣,可以参考该网址:[集成入门-02苍穹集成服务云介绍 (kdcloud.com) ](https://club.kdcloud.com/school/96656967854552832 )(虽然是苍穹的,但是金蝶EAS一样可以参考该内容对比每种方案优劣性)。
一般需求,通过集成需要达到以下效果:
1. 外部系统(非金蝶EAS系统)将付款数据推送到金蝶EAS付款单中;
2. 关键信息(收款人名称、收款账户)禁止人为修改;
3. 有新的付款单可以通过邮件等通知到出纳人员;
4. 出纳在金蝶EAS提交付款单,银企付款如失败,则通知出纳人员;如付款成功,则将信息外发给业务系统。
# 二、实现步骤
## 2.1 中间表设计
在数据库中创建两张表,分别用于存储业务系统和金蝶EAS付款单的对接数据。
创建的表至少需要有以下字段,(演示中创建有下划线的字段):
### 表1:
表名:CT_T_TEMP(中间表根据实际业务需求设计)
|序号|字段名称|字段说明|是否必传|
|-|-|-|-|
|++1++|++FID++|++记录业务系统的唯一标识,数据库设置主键++|++是++|
|++2++|++FCOMPANY_NUMBER++|++对方系统中的公司编码++|++是++|
|3|FPAY_TYPE|记录业务系统中定义的付款方式|否|
|4|FEXPECT_DATE|记录业务系统的放款时间|否|
|5|FPAY_TYPE|记录付款类型(如1、2、3)|否|
### 表2:
表名:CT_T_TEMPENTRY
|序号|字段名称|字段说明|是否必传|
|-|-|-|-|
|++1++|++FID++|++记录业务系统的唯一标识,数据库设置主键++|++是++|
|++2++|++FCUSTOMER_NAME++|++收款人名称++|++是++|
|++3++|++FBANK_NAME++|++收款银行名称++|++是++|
|++4++|++FACCOUNT_NUMBER++|++收款人账户++|++是++|
|++5++|++FPAY_AMOUNT++|++记录付款金额++|++是++|
|6|FBILLID|设置数据库主键面会出现编码排序问题|否|
|7|FBUSINESS_TYPE|记录业务类型|否|
|8|FSOURCE|记录来源系统,用于记录生成数据的系统|否|
|9|FCURRENCY|记录币别|否|
|10|FEXCHANGERATE|记录汇率|否|
### 创建表的SQL语句
```SQL
USE [MyTest]
GO
/****** Object: Table [dbo].[CT_T_TEMP] Script Date: 2021/9/16 22:26:44
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CT_T_TEMP](
[FID] [nvarchar](50) NOT NULL,
[FCOMPANY_NUMBER] [nvarchar](50) NULL,
CONSTRAINT [PK_CT_T_TEMP] PRIMARY KEY CLUSTERED
(
[FID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [MyTest]
GO
/****** Object: Table [dbo].[CT_T_TEMPENTRY] Script Date: 2021/9/16 22:27:41
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CT_T_TEMPENTRY](
[FID] [nvarchar](50) NULL,
[FCUSTOMER_NAME] [nvarchar](50) NULL,
[FBANK_NAME] [nvarchar](50) NULL,
[FACCOUNT_NUMBER] [nvarchar](50) NULL,
[FPAY_AMOUNT] [nvarchar](50) NULL,
[FBILLID] [int] IDENTITY(1,1) NOT NULL,
[FSOURCE] [nvarchar](50) NULL,
CONSTRAINT [PK_CT_T_TEMPENTRY] PRIMARY KEY CLUSTERED
(
[FBILLID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
```
## 2.2金蝶EAS付款单生成
### 2.2.1 金蝶EAS集成平台配置-数据中心连接


### 2.2.2 金蝶EAS集成平台配置-源系统视图


执行脚本:
```sql
CREATE VIEW V_OA_SOURCE
AS
(
SELECT
E.FID AS HEADPK,--业务系统id,
H.FCOMPANY_NUMBER,-- 公司编码,
H.FID AS ENTRYPK,
E.FCUSTOMER_NAME,--收款客户
E.FBANK_NAME,--银行名称
E.FACCOUNT_NUMBER,--收款人账号
E.FPAY_AMOUNT,--付款金额
E.FSOURCE-- 0:OA;1:业务系统;
FROM
CT_T_TEMPENTRY E
INNER JOIN CT_T_TEMP H ON H.FID = E.FID
);
CREATE VIEW V_OA_SOURCE_ALL
AS
(
SELECT H.FBILLID headpk from CT_T_TEMPENTRY H
);
```
### 2.2.3 金蝶EAS集成平台配置-业务单据设置


### 2.2.4 金蝶EAS集成平台配置-单据转换规则配置







**++特殊说明:由于我的的是测试环境,可以考虑增加字段来保留系统来源字段,结算方式根据真实的生产环境设置。++**



### 2.2.4 金蝶EAS集成平台配置-设置调度规则


Cron表达式生成工具:[:在线Cron表达式生成器 - 码工具 (matools.com)](https://www.matools.com/cron/)

### 2.2.5 金蝶EAS集成平台配置-测试数据生成


获取数据源时报错:

在中间库执行以下脚本:
```sql
ALTER TABLE T_EIP_wIgAAAAAJxKeCejJ --T_EIP_wIgAAAAAJxKeCejJ增量表名,在中间库查找
ALTER COLUMN headpk nvarchar(100) COLLATE Chinese_PRC_CI_AS
```



## 2.3 金蝶EAS付款单生成提醒
自动生成付款单,这里使用的预警任务进行的相关提醒。





具体设置可以参考:
[定时任务设置只预警一次 (kingdee.com)](https://wenku.my7c.com/article/168151288490664960)
[在线Cron表达式生成器 - 码工具 (matools.com) ](https://www.matools.com/cron/)
## 2.4 金蝶EAS付款单禁止编辑关键字段





相关代码如下:
```java
var source = pluginCtx.getKDBizPromptBox("prmtDesc").getValue(); //来源系统在我当
前的环境里没有这个字段,演示时使用了摘要字段
if(source == "OA"){
pluginCtx.getKDBizPromptBox("txtPayeeAccountBank").setEnabled(false);
pluginCtx.getKDBizPromptBox("txtPayeeBank").setEnabled(false);
pluginCtx.getKDComboBox("comboPayeeType").setEnabled(false);
pluginCtx.getKDBizPromptBox("f7ActualBankAcct").setEnabled(false);
pluginCtx.getKDTextField("kDTxtBankAcctName").setEnabled(false);
pluginCtx.getKDTextField("kDTxtBankNumber").setEnabled(false);
pluginCtx.getKDBizPromptBox("prmtRemitAB").setEnabled(false);
pluginCtx.getKDTable("kdtEntries").setEnabled(false);
pluginCtx.getKDTable