OpenApi保存操作单据中包含基础资料报错问题解决方案原创
金蝶云社区-丨Nick丨
丨Nick丨
1人赞赏了该文章 505次浏览 未经作者许可,禁止转载编辑于2023年07月10日 15:41:38

前言

在调用保存操作时,单据中存在基础资料字段,保存时有时会报

"rowMsg":["“编码=demo1,符合F7过滤条件”的基础资料1在系统中不唯一,重复的基础资料1内码:[1707883952544429056, 1726141666663869440]"]

image.png

类似的错误

原因

传入的基础资料编码在系统中确实存在多个,因为对于普通基础资料而言,同一编码可以有多个状态,可以暂存多条相同编码的数据,但是只有一天是审核态的为有效数据,这在页面的f7使用中是会有这个过滤,但是对于接口来说是不区分的

解决

利用API的保存插件二次处理,查到该编码对应的真实有效的基础资料数据Id,即可唯一确定数据是哪一条

实现

实现ApiSavePlugin 在preHandleRequestData方法中处理数据即可

代码

public class ApisaveDemoPlugin implements ApiSavePlugin {

	@Override
	public List<Map<String, Object>> preHandleRequestData(List<Map<String, Object>> reqData) {
		for (Map<String, Object> data : reqData) {
			Map<String, Object> basedatafield = (Map<String, Object>) data.get("basedatafield");
			Object number = basedatafield.get("number");// 获取传入的基础资料编码
			QFilter qFilter = new QFilter("number", QCP.equals, number);
			qFilter.and(new QFilter("status", QCP.equals, "C"));// 添加过滤条件为审核
			DynamicObject basedata = QueryServiceHelper.queryOne("demo006", "Id", qFilter.toArray());
			basedatafield.put("Id", basedata.get("Id"));// 获取查询出的数据的Id并添加到参数中
			basedatafield.remove("number");// 去掉原本的编码参数因为Id是最准的
		}
		return reqData;
	}

}

效果

image.png

image.png

图标赞 1
1人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!