泛微OA常用的接口或方法(不公开)

泛微OA常用的接口或方法

记录一些平时工作用到的方法或属性,不公开,防忘记。

文章目录

    • 泛微OA常用的接口或方法
      • 1 获取当前操作者
      • 2 根据人员id获取人员卡片信息
      • 3 获取浏览按钮的文本值
      • 4 插入 js 发送 post 请求
      • 5 插入 js 配合建模、后端接口实现发送 post 请求
        • 1 建模准备
        • 2 数据准备
        • 4 前端 js 准备
        • 5 后端接口准备
      • 6 判断是否属于国内营销

1 获取当前操作者

// 不管是转发、分享流程都适用
wfform.getGlobalStore().commonParam.currentUserid

// 可能会失效的方法
WfForm.getBaseInfo().f_weaver_belongto_userid;
wfform.getGlobalStore().commonParam.currentUserid 

2 根据人员id获取人员卡片信息

在插入 js 代码中使用 get 请求获取数据:

http://192.168.8.62:8080/api/hrm/simpleinfo/getHrmSimpleInfo?userid=10795
function sendApi(value){
  const api="/api/hrm/simpleinfo/getHrmSimpleInfo?userid=" + value;
  fetch(api,{
    method:"GET",
    headers:{
      "Content-Type":"application/json"
    },
  }) .then(response => response.json())
    .then(data => {
      console.log(data) // data:所有数据
      console.log(data.simpleInfo.departmentName) // 部门
      console.log(data.simpleInfo.lastname) // 姓名
      console.log(data.simpleInfo.ip) // 当前登录的ip
      ...
     });
}

3 获取浏览按钮的文本值

let shenqrValue = WfForm.getBrowserShowName(shenqrId);  // 获取浏览按钮文本值
let shenqrValue = WfForm.getFieldValue(shenqrId); // 获取字段真实值(浏览按钮或者下拉框为数字)

4 插入 js 发送 post 请求

jQuery().ready(function(){
	let value = "xxx"
	let datalist = sendApi(value);
})


function sendApi(value){
  let api = "/api/comen/workflow/kpi/getGjKpi";
  fetch(api,{
    method:"POST",
    headers:{
      "Content-Type":"application/json"
    },
    // 请求体
    body:JSON.stringify({
      "zzType":value,
    })
  }) .then(response => response.json())
    .then(data => {
      if(data.data.length==0 && value!=""){
        alert(WfForm.getSelectShowName(zzId)+"暂无考核评价信息表数据")
        WfForm.changeFieldValue(zzId, {value:""});
      }
      console.log(data.data) // 响应的数据
      let zzDetailData=data.data;
      for(let i=0; i<zzDetailData.length; i++){
      	let detailRowData = {};
      	for(let key in zzDetailData[i]){
        	detailRowData[WfForm.convertFieldNameToId(key, "detail_2")] = {value: zzDetailData[i][key]};
      	}
      	WfForm.addDetailRow("detail_2",detailRowData);
     }
     });
}

5 插入 js 配合建模、后端接口实现发送 post 请求

首先看最终的效果:

插入 js 配合建模、后端接口实现发送 post 请求

简单描述:在流程表单中通过选择不同的岗位,实现明细表展示不同的内容。

1 建模准备

新建表单,字段有:把明细表中需要展出的字段(包括序号)

在这里插入图片描述
选择框中岗位 id、岗位名称,所有字段如下:

在这里插入图片描述

然后新建模块、查询,关于建模,此处不再一一演示步骤。

2 数据准备

插入数据时,需要注意岗位相关数据和岗位的选择框id、名称,要一一对应:

以大区总监及国家级经理举例:

在这里插入图片描述
在这里插入图片描述

此时数据准备完毕。

4 前端 js 准备

前端 js 准备就是发送 post 请求,向后端请求数据,然后展示。

jQuery().ready(function(){
    // 职责变化时触发
    var zzId = WfForm.convertFieldNameToId("khlxx"); // 考核类型
    WfForm.bindFieldChangeEvent(zzId, function(obj,id,value){
        WfForm.delDetailRow("detail_2", "all");
        let datalist=sendApi(value);
    })
})

function sendApi(value){
  	const api="/api/comen/workflow/kpi/getGjKpi";
 	fetch(api,{
   		method:"POST",
   		headers:{
     		"Content-Type":"application/json"
   		},
   		body:JSON.stringify({
     		"zzType":value,
   		})
 	}) .then(response => response.json())
    .then(data => {
    	if(data.data.length==0 && value!=""){
        alert(WfForm.getSelectShowName(zzId) + "暂无考核评价信息表数据")
        WfForm.changeFieldValue(zzId, {value:""});
      }
     // data就是我们请求的repos
     console.log(data.data)
     let zzDetailData = data.data;
     for(let i=0; i<zzDetailData.length; i++){
     	let detailRowData = {};
     	for(let key in zzDetailData[i]){ // 逐行给明细表赋值
     		detailRowData[WfForm.convertFieldNameToId(key, "detail_2")] = {value: zzDetailData[i][key]};
     	}
     	WfForm.addDetailRow("detail_2", detailRowData);
     }
   });
}

5 后端接口准备

要想在表单中选择不同的岗位,实现把建模中的数据显示出来,必然要通过 插入 js 发送 post 请求,请求后端的接口,得到响应的数据,然后展示出来即可。

KpiAction.java

// 记得把url放白名单
@Path("/comen/workflow/kpi")
public class KpiActionApi extends KpiAction {
}

KpiAction .java

public class KpiAction {

    private KpiService getService() {
        return ServiceUtil.getService(KpiServiceImpl.class);
    }

    /**
     * 获取绩效评价流程信息
     * @param params
     * @return
     */
    @POST
    @Path("/getGjKpi")
    @Produces(MediaType.APPLICATION_JSON)
    public String getGjKpi(Map<String, Object> params) {
        Map<String, Object> apiData = new HashMap<>();
        try {
            //获取当前用户
            apiData =getService().getGjKpi(params);
        } catch (Exception e) {
            e.printStackTrace();
            apiData.put("api_status", false);
            apiData.put("api_errormsg", "catch exception : " + e.getMessage());
        }
        return JSONObject.toJSONString(apiData);
    }
}

KpiService.java

public interface KpiService {
    /**
     * 获取国际考核基础信息
     * @param params
     * @return
     */
    Map<String, Object> getGjKpi(Map<String, Object> params);
}

KpiServiceImpl.java

public class KpiServiceImpl extends Service implements KpiService {
    @Override
    public Map<String, Object> getGjKpi(Map<String, Object> params) {
        return commandExecutor.execute(new KpiGjJxCmd(params));
    }
}

KpiGjJxCmd.java 需要返回的数据在此类定义:

public class KpiGjJxCmd extends AbstractCommonCommand<Map<String, Object>> {
    static final Logger logger = LoggerFactory.getLogger(KpiGjJxCmd.class);

    @Override
    public BizLogContext getLogContext() {
        return null;
    }

    public KpiGjJxCmd(Map<String, Object> params) {
        this.params = params;
    }

    @Override
    public Map<String, Object> execute(CommandContext commandContext) {
        Map<String, Object> apiData = new HashMap<>(3);
        try {
            String zzType = params.get("zzType").toString();
//            String sql="SELECT khwd ,khbz ,jsff,khqz FROM  uf_gjshjxpjlc where zzid="+zzType+" ORDER by xh ";
            String sql = "select khwd, khbz, jsff, khqz from uf_gjjxkhpj where zzid = " + zzType + " order by xh "; // 根据序号排队
            List<Map<String, String>> resultMap = WorkflowFunction.queryData(sql, new RecordSetDataSource());
            apiData.put("api_status", true);
            apiData.put("data", resultMap);
        } catch (Exception e) {
            //throw new ECException(this.getClass().getName() + "执行过程中异常", e);
            apiData.put("api_status", false);
            apiData.put("error", e.getMessage());
            logger.info("KpiGjShCmd...error:" + e.getMessage());
            return apiData;
        }
        
        return apiData;
    }
}

WorkflowFunction 工具类:见文章顶部下载附件。


6 判断是否属于国内营销

这里以国内营销举例,在流程中插入 sql 根据申请人部门判断是否属于国内营销。

  • 查看某个部门底下所有的下级部门,返回逗号分隔的字符串:
-- with:递归查询
-- cte:临时表

-- 创建临时结果集
-- id:部门id
-- supdepid:上级部门id
-- Level:部门层级
with cte([id],[supdepid],[Level]) 
	as 
	(
	select [id],[supdepid], 1 as [Level] from ecology.dbo.[HrmDepartment] where [id] = '620' -- 查询出该部门三项信息
	union all 
	select d.[id],d.[supdepid],c.[Level]+1 from ecology.dbo.[HrmDepartment] as d 
	inner join cte as c on d.[supdepid] = c.[id]
	)
	
select stuff((select ','+CAST(id AS VARCHAR) from cte order by [Level] for xml path('')),1,1,''); 
  • 以国内营销举例,在流程中插入 sql 根据申请人部门判断是否属于国内营销:
with cte([id],[supdepid],[Level]) 
	as 
	(
	select [id],[supdepid], 1 as [Level] from ecology.dbo.[HrmDepartment] where [id] = '620' -- 国内营销大部门的id为620
	union all 
	select d.[id],d.[supdepid],c.[Level]+1 from ecology.dbo.[HrmDepartment] as d 
	inner join cte as c on d.[supdepid] = c.[id]
	)
SELECT CASE WHEN EXISTS (select id FROM cte WHERE id = '$main.bum$')
THEN 0
ELSE 1
END AS sfcz
  • 以国内营销举例,在国内营销中部门 id 为 A、B 的剔除,除了国内营销部门 id 为 C、D 的也包含:
with cte([id],[supdepid],[Level]) 
	as 
	(
	select [id],[supdepid], 1 as [Level] from ecology.dbo.[HrmDepartment] where [id] in (620, C, D) -- 国内营销大部门的id为620
	union all 
	select d.[id],d.[supdepid],c.[Level]+1 from ecology.dbo.[HrmDepartment] as d 
	inner join cte as c on d.[supdepid] = c.[id]
	where d.[id] != 'A' and d.[id] != 'B'
	)
SELECT CASE WHEN EXISTS (select id FROM cte WHERE id = '$main.bum$')
THEN 0
ELSE 1
END AS sfcz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/476395.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Odoo 17 中为自定义模块添加设置菜单

Odoo 是一款极具影响力的开源企业资源规划和业务管理软件&#xff0c;用户可利用自定义模块灵活定制和增强其功能。在定制模块开发中&#xff0c;一个重要的方面是纳入设置菜单&#xff0c;使用户能够根据自己的独特需求对多个选项进行微调。 本文将引导您逐步了解如何在 Odoo…

Android Launcher开发注意事项

在开发Android Launcher时&#xff0c;需要关注性能、用户体验、权限管理、兼容性等方面&#xff0c;同时遵循相关的开发者政策和最佳实践。有几个重要的注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

『Mysql』Mysql四种分区方式及组合分区落地实现

&#x1f4e3;读完这篇文章里你能收获到 Mysql分区的概念Mysql分区四种分区方式的落地及案例Mysql分区的管理 文章目录 一、概念篇 1 分区是什么2 Mysql中分区原理3 Mysql中分区局限二、落地篇 1 Range分区2 Hash分区3 Key分区4 List分区5 组合分区三、Mysql如何管理分区 1 删…

【LAMMPS学习】三、构建LAMMPS(5)可选的构建设置

3、构建LAMMPS 3.5.可选的构建设置 LAMMPS 可以通过多种可选设置来构建。每个小节都解释了如何使用 CMake 和 make 进行构建。 3.5.1. C11 标准合规性 编译 LAMMPS 需要 C11 标准兼容编译器。 LAMMPS 2020 年 3 月 3 版是核心代码和大多数软件包与之前的 C98 标准兼容的最…

巨细!Python爬虫详解

爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在 FOAF 社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff1b;它是一种按照一定的规则&#xff0c;自动地抓取网络信息的程序或者脚本。 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那…

oracle设置主键自增步骤

设置主键自增步骤&#xff1a; 每一张表都要设置序列&#xff0c;然后设置触发器。比mysql繁琐。 一、设置序列 选中表后&#xff0c;—》 文件—》新建—》其他—》序列. 设置如下四个值即可。 crtls保存。 给序列起个名字&#xff0c;一定要全大写字母。 二、设置触发器…

摘录笔记——2024年3月20日

这位大佬介绍的技术PM方面心得&#xff0c;有一定的启发意义&#xff08;虽说我现在只是搬砖的&#xff0c;跟PM还有一定差距&#xff09;&#xff0c;现在摘录出来作为记录&#xff1a; 一文聊聊我理解的技术PM作为技术同学&#xff0c;不仅要写好自己的代码&#xff0c;做好…

Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块2、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文答…

Halcon 路标牌识别

文章目录 gray_closing_shape 使用选定的掩码执行灰度值关闭create_planar_uncalib_deformable_model 为未校准的透视匹配创建一个可变形的模型get_deformable_model_params 返回可变形模型的参数find_planar_uncalib_deformable_model 在图像中寻找平面投影不变变形模型的最佳…

详细剖析多线程(更新中...)

文章目录 前言一、认识线程1.1线程概念1.2为什么要有线程1.3线程和进程的区别&#xff08;经典面试题&#xff09; 二、创建线程2.1继承 Thread 类,重写run2.2实现 Runnable 接口,重写run2.3继承 Thread 类,重写run&#xff0c;匿名内部类2.4实现 Runnable 接口,重写run&#x…

电脑维修的相关资料,有需要的自取

电脑维修的相关资料&#xff0c;有需要的自取。 链接&#xff1a;https://pan.baidu.com/s/1X81sBNAOmomFvug6mK56Bw 提取码&#xff1a;52pj 爆笑幽默段子&#xff1a;电脑出故障了&#xff0c;准备拿去修&#xff0c;结果被女朋 友拦住了。女朋友&#xff1a;“你们男人一定…

登录与注册功能(简单版)(3)登录时使用Cookie增加记住我功能

目录 1、实现分析 2、步骤 1&#xff09;新建login.jsp 2&#xff09;修改LoginServlet&#xff1a; 3&#xff09;启动访问&#xff1a; 3、安全性考虑 4、最佳实践思路 1&#xff09;选择安全的认证机制 2&#xff09;强化会话管理 3&#xff09;安全地存储用户凭证…

数字化战略失配企业现状,可惜了!

尽管大部分的企业领导者已经意识到数字化转型对于企业革新业务模式、提升运营效率、抢占市场先机的关键作用&#xff0c;但是&#xff0c;认知上的转变并不等同于成功的实践。在实际操作中&#xff0c;往往出现战略与企业现状不符的现象&#xff0c;这无疑会使得所有的努力付诸…

矩形总面积(第十四届蓝桥杯JavaB组省赛真题)

测试用例范围比较大&#xff0c;所以全部用long类型&#xff0c;如果用int类型只能通过60%&#xff0c;建议在内存和运行时间允许的情况下&#xff0c;比赛题都用long。 重点在于计算相交的面积&#xff0c;这里找的两个相交点是左上角&#xff08;m1,n1&#xff09;和右下角&a…

公司系统中了.rmallox勒索病毒如何恢复数据?

早晨上班时刻&#xff1a; 当阳光逐渐洒满大地&#xff0c;城市的喧嚣开始涌动&#xff0c;某公司的员工们纷纷踏入办公大楼&#xff0c;准备开始新的一天的工作。他们像往常一样打开电脑&#xff0c;准备接收邮件、查看日程、浏览项目进展。 病毒悄然发作&#xff1a; 就在员…

万亿参数GPU!算力提升30倍!英伟达新核弹B200重磅发布!

关注文章底部的公众号,获取每日AI资讯 前沿 3月18日-21日期间,英伟达在美国圣何塞召开GTC大会。创始人黄仁勋也在GTC大会上,做了一场长达两小时的开幕演讲,展示了其在AI芯片、机器人、汽车等领域的最新研发成果和技术进展,号称让全世界用上AI。 全球头号人工智能领域开发…

加解密、签名、验签、数字签名、数字证书

说明&#xff1a;本文属于学习笔记&#xff0c;借鉴了很多经典网文&#xff0c;已记不清出处&#xff0c;如有侵权&#xff0c;请告知。 前言&#xff1a; 嵌入式开发时&#xff0c;绕不开数据安全问题。最近又在做OTA升级相关工作&#xff0c;因此&#xff0c;借此机会学习了加…

MySQL 索引:索引为什么使用 B+树?

Hash 索引不支持顺序和范围查询&#xff1b; 二叉查找树(BST)&#xff1a;解决了排序的问题&#xff0c;极端情况下可能会退化成线性链表&#xff0c;查询效率急剧下降&#xff1b; 平衡二叉树(AVL) &#xff1a;通过旋转解决了平衡的问题&#xff0c;但是旋转操作效率太低&am…

从点云创建 DSM:网格化和可视化实用指南

今天我将向您展示如何从点云创建数字表面模型&#xff08;DSM&#xff09;。首先&#xff0c;我们将尝试了解 DSM 是什么&#xff0c;然后我们将进入讨论的更实际部分。 什么是 DSM&#xff1f; DSM 是一个描述表面及其表面所有内容的模型。现在&#xff0c;为了更清楚地了解…

分布式异步任务框架celery

Celery介绍 github地址&#xff1a;GitHub - celery/celery: Distributed Task Queue (development branch) 文档地址&#xff1a;Celery - Distributed Task Queue — Celery 5.3.6 documentation 1.1 Celery是什么 celery时一个灵活且可靠的处理大量消息的分布式系统&…
最新文章