跳到主要内容

如何实现打卡定位提交校验功能

场景/功能描述

场景1:公司A的全体员工需要在B地址进行公司的季度大会宣导,需要统计员工考勤,如果打卡定位地点在目标B地址500米以内就允许提交打卡,否则不允许

场景2:公司A的某个部门员工需要去拜访客户,到达客户B地址的时候,需要员工进行打卡,如果打卡定位地点在目标B地址500米以内就允许提交打卡,否则不允许

思路流程

通过使用代码块+提交校验来进行实现

逻辑思路:通过使用代码块中调用地图的API接口去获取定位地址以及目标地址的经纬度,再通过计算两个地址的距离是否在500米以内,如果满足就返回true,反之返回false

image.png

配置过程

调用API接口准备工作

这里使用的是百度地图的地理编码API接口,所以以调用百度地图为例,其他地图类接口请自行查找。

百度地图开放平台:https://lbsyun.baidu.com

地理编码API接口文档:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base

使用接口前先根据使用准备流程申请完成

image.png

image.png

表单设计

这里以场景2为例:拜访客户,到达客户地点进行打卡,需要有一个维护客户信息地址的表单,如下图

考勤客户地址信息

image.png

image.png

外出考勤打卡

image.png

客户名称

数据关联字段,关联考勤客户地址信息的客户姓名

image.png

客户地址

单行文字字段,关联已有数据,带出对应客户名称的地址

image.png

代码块
代码注释

qf_field.{客户地址$$185A76DED$$}:表单客户地址字段

qf_field.{定位$$1853BE60C$$}:表单定位字段

ak:百度地图控制台应用中获取具体参数内容

const axios = require('axios');
const geolib = require('geolib');

// 输入的地址 A,插入表单客户地址字段
const addressA = qf_field.{客户地址$$185A76DED$$};

// 输入的地址 B,插入表单定位字段
const addressB = qf_field.{定位$$1853BE60C$$};

if(addressA==null || addressB==null){
qf_output={'istrue':false}
}else{
// 百度地图地理编码 API 的请求 URL,其中的ak从百度地图控制台应用中获取
const geocodeUrlA = `http://api.map.baidu.com/geocoding/v3/?address=${encodeURIComponent(
addressA
)}&output=json&ak=YGlUOz7nfpwS1ZRIePOqz2HQsG*****`;

const geocodeUrlB = `http://api.map.baidu.com/geocoding/v3/?address=${encodeURIComponent(
addressB
)}&output=json&ak=YGlUOz7nfpwS1ZRIePOqz2HQsG*****`;

axios
.all([
axios.get(geocodeUrlA),
axios.get(geocodeUrlB)
])
.then(axios.spread((responseA, responseB) => {
const resultA = responseA.data;
const resultB = responseB.data;
if (resultA.status === 0 && resultB.status === 0) {
const locationA = resultA.result.location;
const latitudeA = locationA.lat;
const longitudeA = locationA.lng;

const locationB = resultB.result.location;
const latitudeB = locationB.lat;
const longitudeB = locationB.lng;

const distance = geolib.getDistance(
{ latitude: latitudeA, longitude: longitudeA },
{ latitude: latitudeB, longitude: longitudeB }
);

// 判断距离是否小于等于 500 米
if (distance <= 500) {
const istrue=true;//距离小于等于 500 米
qf_output={istrue}

} else {
const istrue=false;//距离大于 500 米
qf_output={istrue}

}
}
}))
}
代码测试

image.png

字段接收配置

image.png

是否允许打卡

image.png

流程设计

外出考勤打卡

申请人节点——高级设置——提交校验

公式:AND(是否允许打卡=="true")

image.png

image.png

实现效果

由于定位字段需要移动端使用,所以具体测试在移动端测试

image.png