当前位置: 首页 > news >正文

泛微OAe9-自定义资源看板

泛微OAe9-自定义资源看板

文章目录

    • 泛微OAe9-自定义资源看板
      • 前言
      • 一、搭建车辆信息资源
        • 1 后端->建模引擎->表单:新建车辆信息
        • 2 后端->建模引擎->模块:新建车辆信息模块
        • 3 后端->建模引擎->查询:新建车辆信息查询
        • 4 搭建车辆信息的浏览框:车辆信息_clxx
      • 二、搭建车辆预约
        • 1 后端->建模引擎->表单:新建用车申请
        • 2 后端->建模引擎->模块:用车申请模块-最关键
          • 2.1 新建模块,最重要
          • 2.2 冲突字段字段属性
          • 2.3 配置数据审批
      • 三、搭建资源看板
      • 四、验证

前言

OA中,有一个很好用的功能:会议室预约。对于一间设立的会议室,同一时间段内,肯定会有不同的人预约同一间会议室,并且,在资源看板里,能看清各个时间段会议室的占用情况,可是会议室资源是有限的,显然不可能让多个人在同一时间段内预约同一间会议室,如会议室已占用,其他人再次申请时,应当拒绝预约。

废话不多说,下面我引入一个实际的案例,展示如何自定义搭建一个资源看板,下面我举例公司的用车预约:即把公司的车辆当作一间会议室去预约,当公司员工有出差自驾需求时,可自行预约。


一、搭建车辆信息资源

对于车辆的预约,肯定是先有车辆,才能预约,站在数据库的角度,则对应一张车辆表、一张预约表。

1 后端->建模引擎->表单:新建车辆信息

在这里插入图片描述

字段可自定义,此处我展示我所建立的字段:

在这里插入图片描述

对于车辆表,肯定需要有一个唯一标识,此处我把车牌号、车辆id作为一辆车的唯一标识。即在车辆表里,不能插入同一个车牌号的不同车辆(实际情况下车牌号如同人的身份证号,可以唯一区分每一辆车)。

在这里插入图片描述

2 后端->建模引擎->模块:新建车辆信息模块

对于模块,同步搭建即可,这里对应插入数据时显示的模板,再者把模块的权限维护好,比如车辆管理员可插入数据等,此处不过多赘述。

在这里插入图片描述


3 后端->建模引擎->查询:新建车辆信息查询

车辆信息查询和模块类似,不必进行过多的配置,这里重点需要配置好权限。

在这里插入图片描述

对于车牌号,可以设置成自定义链接,点击车牌号的时候,可以跳转到显示模板,展示车辆的各项属性信息:
车牌号的自定义链接:

/spa/cube/index.html#/main/cube/card?type=$type$&modeId=$modeId$&formId=$formId$&billid=$billid$&opentype=$opentype$&customid=$customid$&viewfrom=$viewfrom$

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


4 搭建车辆信息的浏览框:车辆信息_clxx

步骤1-3搭建的车辆信息,本质上是作为一个浏览按钮字段,在用车预约的时候,车辆资源引用,具体引用见下文用车预约。

浏览框截图:

在这里插入图片描述


二、搭建车辆预约

车辆预约就是用车申请,需按照车辆资源的步骤配置一遍。

1 后端->建模引擎->表单:新建用车申请

在这里插入图片描述

字段说明:

  • 车辆资源:必须,并且是浏览按钮,需引用上面的车辆信息。
    在这里插入图片描述
  • 冲突字段:必须,文本框,用于预约时判断是否冲突。
  • 审批流程:必须,浏览按钮-流程,预约单填写成功后,可自动触发审批流,若不触发审批流也可以不用此字段。
  • 用车人:必须,单人力资源,车辆预约人。
  • 用车部门:必须,部门。
  • 标题:非必须,自定义标题,建议加一个标题字段。
  • 用车开始日期:必须,日期字段。
  • 用车开始时间:必须,时间字段。
  • 预计用车结束日期:必须,日期字段。
  • 预计用车结束时间:必须,时间字段。
  • 用车说明:非必须,多文本。
  • 申请号:非必须,如有审批流程字段,本字段也需加上,用于判断流程是否为触发流程,下文演示。
  • 备注:非必须。

重复校验建议把所有字段加上,出现预约单一模一样时,直接阻断提交。

在这里插入图片描述


2 后端->建模引擎->模块:用车申请模块-最关键

先是正常配置三个布局:
在这里插入图片描述

2.1 新建模块,最重要

新建模块内,需对开始日期,结束日期做一些约束,比如:结束日期肯定不能在开始日期前。新建模块内,也需配置冲突字段的逻辑,需查预约表,判断当前预约单是否冲突。

模板及 fieldid 截图:fieldid会在字段属性、插入代码中使用。
在这里插入图片描述

代码块的日期约束:

window.checkCustomize = function(){ var flag = true;var value = ModeForm.getFieldValue("field108183"); // 冲突字段if(value !="" ){flag = false; // 冲突字段有值,代表冲突,不可提交//alert("您预约的时间与"+value+"冲突!请重新选择预约时间!");ModeForm.showModalMsg("系统提示","<div style='color:red;'>您用车的时间有冲突!请重新选择用车时间!</div>", 2);ModeForm.changeFieldValue("field108184",{value:""});ModeForm.changeFieldValue("field108185",{value:""});ModeForm.changeFieldValue("field108186",{value:""});ModeForm.changeFieldValue("field108187",{value:""});ModeForm.changeFieldValue("field108183",{value:""});}// 用车开始日期、时间,必须在结束日期、时间之后var ycksrq = ModeForm.getFieldValue("field108184"); // 用车开始日期var yckssj = ModeForm.getFieldValue("field108185"); // 用车开始时间var yjycjsrq = ModeForm.getFieldValue("field108186"); // 预计用车结束日期var yjycjssj = ModeForm.getFieldValue("field108187"); // 预计用车结束时间var startTime = ycksrq +" "+ yckssj;var endTime = yjycjsrq +" "+ yjycjssj;var sum = compareDates(startTime, endTime);if(sum == 1 || sum == 0) { // 用车结束日期,不能在开始日期之前ModeForm.showModalMsg("系统提示","<div style='color:red;'>结束时间需大于开始时间!</div>", 2);flag = false;}return flag;  // 同步提交
}
ModeForm.bindFieldChangeEvent("field108184,field108185,field108186,field108187",function(obj,id,value){   // 用车开始日期、时间,必须在结束日期、时间之后var ycksrq2 = ModeForm.getFieldValue("field108184"); // 用车开始日期var yckssj2 = ModeForm.getFieldValue("field108185"); // 用车开始时间var yjycjsrq2 = ModeForm.getFieldValue("field108186"); // 预计用车结束日期var yjycjssj2 = ModeForm.getFieldValue("field108187"); // 预计用车结束时间var startTime2 = ycksrq2 +" "+ yckssj2;var endTime2 = yjycjsrq2 +" "+ yjycjssj2;var sum2 = compareDates(startTime2, endTime2);if(sum2 == 1 || sum2 == 0) { // 用车结束日期,不能在开始日期之前ModeForm.showModalMsg("系统提示","<div style='color:red;'>结束时间需大于开始时间!</div>", 2);}
});function compareDates(dateStr1, dateStr2) {// 将字符串转换为日期对象const date1 = new Date(dateStr1.replace(" ", "T"));const date2 = new Date(dateStr2.replace(" ", "T"));// 比较日期对象if (date1 > date2) {return 1;} else if (date1 < date2) {return -1;} else {return 0;}
}

2.2 冲突字段字段属性

冲突字段的字段属性:读者也可以自行更改sql,sql就是用于判断新预约和预约表里历史数据,是否冲突。
方案一:

select ycsm from uf_ycsq where (((ycksrq+' '+yckssj)>=('$108184$'+' '+'$108185$') and (ycksrq+' '+yckssj)<('$108186$'+' '+'$108187$'))or ((ycksrq+' '+yckssj)<('$108184$'+' '+'$108185$') and (yjycjsrq+' '+yjycjssj)>('$108184$'+' '+'$108185$'))
) and clzy=$108179$

方案二:本人分析对于冲突的情况,有如下4种,4种情况组合起来,就是冲突的逻辑。
在这里插入图片描述
对于其它方案,读者自行分析。


2.3 配置数据审批

由于我演示的案例设置了自动触发审批流,因此需要在模块里进行配置,配置后,每新建一个预约单,都有发起审批流,给相应的人审批。

在这里插入图片描述
上文用车申请的申请号字段,就是用于触发审批流时,自动生成一个申请号,然后对接到流程里,这样就能区别是自动触发的还是手动新建流程的。


三、搭建资源看板

在这里插入图片描述

四、验证

此时可以在前端的维护里,查看到车辆预约的资源看板,也可以在里面进行相应的预约。
在这里插入图片描述

如果在同一时间段内预约了同一辆车,则会有冲突提醒:
在这里插入图片描述

演示结束。

相关文章:

  • HALCON第一讲->数据结构、语法规则与思路
  • 算法学习笔记:2.大根堆算法——数据流的中位数​​or最后一块石头的重量
  • [Java恶补day23] 35. 搜索插入位置
  • 界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现服务安排?
  • ICMP协议深度解析
  • 安装 LibreOffice
  • 《一本书看透A股》速读笔记
  • 第三十八课:实战案例-飞鸟和飞机的识别
  • 《性能之巅》第三章 操作系统
  • AI时代,学习力进化指南:如何成为知识的主人?
  • Java(网络编程)
  • unittest 和 pytest 框架
  • 浅谈软件开发工作流
  • Vue3 Router 使用指南:从基础到高级用法
  • openEuler虚拟机中容器化部署
  • springboot+mybatis面试题
  • CQF预备知识:Python相关库 -- 插值过渡指南 scipy.interpolate
  • 接口测试常用工具及测试方法(基础篇)
  • [SKE]CPU 与 GPU 之间数据加密传输的认证与异常处理
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • 定制研发服务/泰州网站排名seo
  • Wordpress 免费收款插件/网站seo怎么做
  • 英文做影评的网站/大连企业网站建站模板
  • 国外广告联盟的真实收入/aso优化服务平台
  • 中山做百度网站的公司/1688黄页大全进口
  • 建盏公司最新消息/杭州seo靠谱