前言
基于致远的OA产品,CAP业务定制平台模块设计解决实际业务需求的记录。
需求来源
QQ群友
需求说明
A8 应用设计里面的表单 可以校验不能重复提交吗?
一个人 当月只能提交一次
解决思路
不可重复提交的前提是,在本次提交时,首先获取之前提交的历史数据标识,并通过表单的校验规则,对获取的标识进行判断。
实施方案
方案一:流程生成底表,再关联底表标识
步骤①
新建流程表,并根据不可重复规则要求定义出标识字段;
如上面需求中,可定义 {提交人} 选人控件、{提交日期} 日期控件;
增加辅助字段 {提交年度} 数字控件、{提交月份} 数字控件;
设置计算公式:
{提交年度}=year({提交日期})
{提交月份}=month({提交日期})
增加判断字段 {是否重复提交} 文本控件;
设置校验规则:
公式为: {是否重复提交} =null
提示为:本月已经提交数据,请不要重复提交!
表单样式如下:
步骤②
新建关联底表,底表字段包含关键字段 {提交人} 、 {提交日期} 、{提交年度} 、{提交月份} 、{是否重复提交},其他字段根据实际自行设置;表单样式如下:
其中 {是否重复提交} 设置计算公式为 ‘已有相同数据’ ;
其他字段如 {提交人} 、{提交日期} 、{提交年度} 、{提交月份} 由流程表结束后,触发新建底表时传入数据值;
步骤③
设置业务关联关系;
流程表结束后新建底表业务关系如下:
流程表打开自动关联底表业务关系如下:
步骤④
结果验证
本月第一次新发起流程表:
正常提交发送。
本月相同人员再次发起流程表:
在 {是否重复提交} 字段框中显示"已有相同数据",并在提交时系统提示校验结果:
满足需求!
方案二:使用groovy自定义函数
步骤①
新建流程表单,设置关键字段 {提交人} 选人控件、 {提交日期} 日期控件;
并增加判断字段 {是否已有数据} 文本控件;
设置校验规则:
公式为:{是否已有数据} = null
提示为:本月已提交数据,请不要重复提交!
表单样式如下:
步骤②
查看新设计表单的数据字典,并编写SQL查询语句
根据要求,如果通过查询语句能够找到记录,说明已经提交过数据,如果没有记录,则说明没有提交过数据。
select id from formmain_0072
where field0001 in
(select id from org_member where name=${提交人})
and year(field0002)=year(${提交日期})
and month(field0002)=month(${提交日期})
步骤③
打开表单,设置字段 {是否已有数据} 的计算公式,编写groovy自定义函数;
代码如下:
def member = param[0];
def date = param[1];
def sqljdbc = "jdbc:mysql://IP:port/yourDatabase?useUnicode=true&characterEncoding=UTF-8";
def sqluser = "yourUser";
def sqlpwd = "yourPassword";
def sqldriver = "com.mysql.jdbc.Driver";
def sqlStr = """select id from formmain_0072 where field0001 in (select id from org_member where name=${member}) and year(field0002)=year(${date}) and month(field0002)=month(${date})""";
def findResult = groovy.sql.Sql.newInstance(sqljdbc,sqluser,sqlpwd,sqldriver).withCloseable {sql -> return sql.firstRow(sqlStr)};
return findResult?'已有数据':'';
其中sqljdbc、sqluser、sqlpwd、sqldriver改成对应连接数据库的信息即可;
另外,对于MySQL8版本,需要在sqljdbc中增加一些参数(useSSL=false&allowPublicKeyRetrieval=true),虽然不影响使用,但会有错误信息持续输出到日志文件中;
def member = param[0];
def date = param[1];
def sqljdbc = "jdbc:mysql://192.168.56.149:3306/obxoa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true";
def sqluser = "root";
def sqlpwd = "123456789";
def sqldriver = "com.mysql.jdbc.Driver";
def sqlStr = """select id from formmain_0072 where field0001 in (select id from org_member where name=${member}) and year(field0002)=year(${date}) and month(field0002)=month(${date})""";
def findResult = groovy.sql.Sql.newInstance(sqljdbc,sqluser,sqlpwd,sqldriver).withCloseable {sql -> return sql.firstRow(sqlStr)};
return findResult?'已有数据':'';
步骤④
结果验证
本月第一次发起流程表单:
正常提交发送。
本月相同人员再次发起流程表单:
在 {是否已有数据} 字段框中显示"已有数据",并在提交时系统提示校验结果:
满足需求!