在此我就找一个接口来展示就行了,因为不便做DEMO,大家就凑合看下截图吧
这里我展示的场景是这样的
OA中有多个流程使用到合同编号,比如收入合同、支出合同、外协合同、框架协议等,为了规范管理,我们均使用统一的接口来生成合同编号(由活字格应用进行生成),返回给OA系统中流程使用,这里我们用的OA系统是泛微
首先我们设计好数据库
顺便给一个生成合同号的存储过程吧
ALTER PROCEDURE [dbo].[生成合同编号]
@申请人 nvarchar(50) = null,
@合同类型 nvarchar(50),
@主合同编号 nvarchar(50) = null,
@返回合同编号 nvarchar(50) out
AS
BEGIN
--处理主合同编号及返回合同编号的传入值
set @主合同编号 = ISNULL(@主合同编号,'')
set @返回合同编号 = ISNULL(@返回合同编号,'')
declare @已使用 bit
declare @失败 bit = 0
declare @主合同类型 nvarchar(50)
declare @年份 int = YEAR(getdate())
declare @年份连接符 nvarchar(50)
declare @流水号 nvarchar(50)
--如果传入的返回合同编号不为空,则对其进行是否使用判断,如果未使用,则不重新生成新的编号
if len(@返回合同编号) > 12
begin
select @已使用 = 已使用 from 合同编号表 where 合同编号 = @返回合同编号
if @已使用 = 0
begin
--返回前先更新相关信息为最新传入值,因为未使用,所以后边传入的值会覆盖先前值
update 合同编号表 set 申请人 = @申请人,年份 = @年份,合同类型 = @合同类型,主合同编号 = @主合同编号 where 合同编号 = @返回合同编号
return
end
end
--初始化年份连接符,一般格式为(2022)
set @年份连接符 = '(' + cast(@年份 as nvarchar(50)) + ')'
--生成3位数流水号,后续如果只使用2位,直接使用right取右边2位即可
select @流水号 = Replace(str(cast(isnull(max(流水号),'000') as int) + 1,3),' ',0) from 合同编号表 where 合同类型 = @合同类型 and (主合同编号 = @主合同编号) and 年份 = @年份
--对生成的流水号排除4
if right(cast(@流水号 as nvarchar(50)),1) = '4'
set @流水号 = Replace(str(cast(@流水号 as int) + 1,3),' ',0)
--@合同类型:SR:收入合同;WX:居间、设计外协合同;CG:设备材料采购合同;JA:工程分包合同;QT:其它支出合同;KJ:框架性协议
--收入类型合同,不存在不成功
if @合同类型 = 'SR'
begin
if @主合同编号 = ''
--没有主合同时直接编号
set @返回合同编号 = '晨光设' + @年份连接符 + @流水号 + '号'
else
--有主合同时在主合同编号后加上2位流水号
set @返回合同编号 = @主合同编号 + '-' + RIGHT(@流水号,2)
end
--设备材料采购、工程分包、居间、设计外协合同,如果主合同为空则失败,否则成功
if @合同类型 = 'CG' or @合同类型 = 'JA' or @合同类型 = 'WX'
begin
if @主合同编号 = ''
begin
set @失败 = 1
set @返回合同编号 = ''
end
else
begin
select @主合同类型 = 合同类型 from 合同编号表 where 合同编号 = @主合同编号
--主合同类型为收入合同,则在主合同后加上-CG之类的合同类型标识,后追加流水号,如果主合同类型为其它类型,则直接在主合同号后边追加2位流水号
if @主合同类型 = 'SR'
set @返回合同编号 = @主合同编号 + '-' + @合同类型 + '-' + @流水号
else
set @返回合同编号 = @主合同编号 + '-' + right(@流水号,2)
end
end
--其它支出类型合同,不存在不成功
if @合同类型 = 'QT'
begin
if @主合同编号 = ''
set @返回合同编号 = '晨光设[其它]' + @年份连接符 + @流水号 + '号'
else
set @返回合同编号 = @主合同编号 + '-' + right(@流水号,2)
end
--框架性协议,不存在不成功
if @合同类型 = 'KJ'
begin
if @主合同编号 = ''
set @返回合同编号 = '晨光设[合作]' + @年份连接符 + @流水号 + '号'
else
set @返回合同编号 = @主合同编号 + '-' + right(@流水号,2)
end
--------------------------------将合同号写入到表----------------------------------------------
if @失败 = 0
insert into 合同编号表 (申请人, 年份, 合同类型, 主合同编号, 流水号, 合同编号, 已使用)
values(@申请人,@年份,@合同类型,@主合同编号,@流水号,@返回合同编号,0)
END
数据库这块就准备差不多了
然后在活字格中创建一个服务端命令
服务端命令就这些了,注意我使用的“路飞”大神的收费插件“返回结果命令”实现的跨域。
接下来展示OA端如何调用
$.ajax({
type:"post",
url:"http://10.20.16.9/pm/ServerCommand/GenerateContractNo",
data:{
"申请人":sqr,
"合同类型":"SR",
"主合同编号":zhtbh,
"原合同编号":yhtbh
},
success:function(result){
console.log(result.合同编号);
WfForm.changeFieldValue("field15113",{value:result.合同编号});
}
});
就一个AJAX语句就拿到自动生成的合同编号并填入到相应表单中,简直不要太简单。
这个方案中最为关键的就是如何解决跨域问题,以往活字格是没有这个功能的,在今年8.0.12以后陆续出现2位大神的跨域功能,一是“路飞”大神率先推出本功能的收费插件,二是“豪豪”大神也针对跨域推出了收费插件,大家有需要可以去购买使用。
|