钉钉数字化应用演进——函数计算到连接平台解决厕所缺纸

简介: 2018年SKFI与钉钉一起共创了理想办公室的1号样板间,当时分享的一个案例就是保洁阿姨都称为了钉钉中级数字化管理师。厕所都可以用钉钉扫码报告异常、打分和换纸提醒之类的功能对应着。很多企业、政府单位来此参观,觉得数字化做得很好。但实际上,不可能所有单位的保洁阿姨都称为钉钉中级数字化管理师啊~,面向未来的数字化也应该是学习成本较低的形态。本文介绍一个数字化企业中钉钉应用演进的小例子,多次吐槽最早的设计,本文将演进思路和方法分享给大家。

场景介绍

作为一个商业环境的重要配备,商用厕所的管理直接体现了服务商水平的高低。纸巾、热水、气味控制等等方面,甚至将占空比控制接入数据系统。在甲方的要求下,我们也进行了这样的项目实施。

image.png

但事实上维持厕所不缺纸更为重要。

传统模式

每个厕所或者厕格配备纸巾盒,要为其即时更新是代价非常高昂的,因为管理人员无法实时得知其消耗情况。

image.png

一般而言,超过200个厕纸分发点需要高频度巡检才能保证每个点位都能及时更换。但事实上,巡检的频率是固定的,只能按照最快消耗的频率进行工作安排。

对于纸巾盒数量超过1000个的大型园区、商场,服务人员只能划定区域进行工作分配,为了防止遗漏,还会在每个厕格配置定位联系卡。

管理要求较高的企业,都会进行表格登记,在运行一定时期后进行统计分析,以求调整巡检频度或采购计划。

2018年的数字化

我们在进行钉钉理想办公室共创建设的时候,把传统的管理过程引入到了数字化系统中,并集成在钉钉的工作流当中。

这让我们的项目仅有50个管理点位情况下也能在数字化系统的帮助下,不额外增加人手也可以实现大型商业厕所的管理要求。

DINGTALK_IM_2436803133.JPG

但这还是原先的传统管理思路,人在驱动人去做事情,并非事件驱动人。一旦发生员工更新以及没有及时完成人员培训即上岗,对于这样的数据系统会因为数据没有持续更新而失效。


2022年的演进方向

我们进行了一系列尝试在每个纸巾盒中按照了传感器。

image.pngimage.png

为了保障电力供应,我们采用了18650电池,每小时监测6秒。电力可以支持半年以上。

当数据反馈为准备状态时,会通过阿里云IoT触发事件,接着用函数计算调用钉钉的服务端API生成一个任务给执行人。执行人的钉钉会收到信息,只需要完成更换,当前任务就会自动更新状态。

将人员从数据系统中解放出来,重新关注业务本质。


数字化应用演进

回顾业务本质

缺纸就换纸,尽量保证任何运营期间所有的节点都有纸巾。所以需要巡检,而最小频度实际上取决于用纸最快的点位。这样就会造成大量的人力浪费或者服务缺位。


第一次数据化演进

为了保障耗材的供应和备货,大型的商业空间会对其进行数据采集,用最原始的手写表格,运行一定周期后进行数据分析。对于数据的利用往往取决于管理者的兴致。

数据可以优化巡检分区,按照高频区域、低频区域设置不同的巡检周期。

数据也可以优化耗材采购计划,有效控制库存和供应。


把纸面搬上电脑,把表格变成电子表格

办公室的行政工作人员逐渐官僚化,对于大量数据汇总感觉到厌倦,他们推动了让一线人员进行数据采集。让各个部门的工作人员制作各自采集的纸质数据,变成电子表格。

然而这些信息的数据化并没有解放行政人员,他们依然要处理来自各个信息孤岛的各类异构数据。

管理层对于数据化的执着,源自于掌控感,逼迫各个层级几乎每时每刻都在开始为数据忙碌,业务只不过是为了产生数据。


数据驱动业务

技术部门为了凸显自身价值,开始大规模的进行各方面的数据采集和分析,当然首先建设的是各种数据录入的终端和应用,之后是数据系统。

随着物联网技术的发展企业的技术部门或者行政部门选择的外部供应商开始将数据采集工作纳入到日常中。

管理层需要数据的时候,甚至可以看到每个区域的实时热力图,任意时间的回顾分析。

厕所运营数据这样边缘的信息已开始并没有在行政人员的计划中,随着各方面数据化的完成,部门出于对自身权力扩张的需要,将数据采集深入到商业区管理的方方面面。在他们的意识中,信息即权力。


业务自驱动

数据化所到之处,除了大量产生数据之外,也诞生了大量的数据汇总、可视化、一系列可供决策的数据分析。

然而企业为数据的采集投入了大量的人力,系统上了之后一线工作人员不但要关注业务本身,还需要关注自己在数据系统上留下的记录。

有些极端的企业,甚至规定没有在系统上记录的工作就认为没有进行过。

因为之前的数据化过程中,系统围绕着开发人员的思路进行设计,并没有把使用者当成自己的用户。在他们眼中,这些系统的使用者只不过是没有感情的机器。

数据化演进中人逐渐回到了业务的中心,人做了什么是因为岗位需要,而不是因为需要创造数据。系统负责帮助工作人员监测需要关注的节点和业务,数据的采集和系统流程应该留给系统本身去做。


阿里云技术栈介绍

钉钉开放平台

钉钉开放平台目前包含了常用API、酷应用、连接平台和企业网关构成。

在连接平台推出以前,需要实现任务创建需要调用钉钉服务端API。

主要是用创建任务的服务端API

参考代码如下:

publicvoidcreateTodo() throwsException {
Configconfig=newConfig();
config.protocol="https";
config.regionId="central";
com.aliyun.dingtalktodo_1_0.Clientclient=newcom.aliyun.dingtalktodo_1_0.Client(config);
CreateTodoTaskHeaderscreateTodoTaskHeaders=newCreateTodoTaskHeaders();
createTodoTaskHeaders.xAcsDingtalkAccessToken="accessToken";
CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigsnotifyConfigs=newCreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
                .setDingNotify("1");
CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrldetailUrl=newCreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
                .setAppUrl("https://www.dingtalk.com")
                .setPcUrl("https://www.dingtalk.com");
CreateTodoTaskRequestcreateTodoTaskRequest=newCreateTodoTaskRequest()
                 .setSourceId("isv_dingtalkTodo1")
                .setSubject("钉钉企业待办")
                .setCreatorId("E9C********N7QiEiE")
                .setDescription("创建钉钉待办任务")
                .setDueTime(1661767200000L)
                .setExecutorIds(java.util.Arrays.asList(
"tXg************RAiEiE"                ))
                .setParticipantIds(java.util.Arrays.asList(
"tXg************RAiEiE"                ))
                .setDetailUrl(detailUrl)
                .setIsOnlyShowExecutor(true)
                .setPriority(40)
                .setNotifyConfigs(notifyConfigs);
try {
CreateTodoTaskResponsecreateTodo=client.createTodoTaskWithOptions("E9C********N7QiEiE", createTodoTaskRequest, createTodoTaskHeaders, newRuntimeOptions());
System.out.println(JSON.toJSONString(createTodo.getBody()));
        } catch (TeaExceptionerr) {
if (!com.aliyun.teautil.Common.empty(err.code) &&!com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题System.out.println(err.code);
System.out.println(err.message);
            }
        } catch (Exception_err) {
TeaExceptionerr=newTeaException(_err.getMessage(), _err);
if (!com.aliyun.teautil.Common.empty(err.code) &&!com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题System.out.println(err.code);
System.out.println(err.message);
            }
        }
    }

更新任务的参考代码如下:

publicvoidupdateTodo() throwsException {
Configconfig=newConfig();
config.protocol="https";
config.regionId="central";
com.aliyun.dingtalktodo_1_0.Clientclient=newcom.aliyun.dingtalktodo_1_0.Client(config);
UpdateTodoTaskHeadersupdateTodoTaskHeaders=newUpdateTodoTaskHeaders();
updateTodoTaskHeaders.xAcsDingtalkAccessToken="accessToken";
UpdateTodoTaskRequestupdateTodoTaskRequest=newUpdateTodoTaskRequest()
                .setOperatorId("E9C********N7QiEiE")
                .setSubject("更新钉钉企业待办")
                .setDescription("更新钉钉企业待办")
                .setDueTime(1661767200000L)
                .setDone(true)
                .setExecutorIds(java.util.Arrays.asList(
"tXg************RAiEiE"                ))
                .setParticipantIds(java.util.Arrays.asList(
"tXg************RAiEiE"                ));
try {
UpdateTodoTaskResponseupdateTodoTaskResponse=client.updateTodoTaskWithOptions("E9C********N7QiEiE", "task6b9d*************316fe89acd", updateTodoTaskRequest, updateTodoTaskHeaders, newRuntimeOptions());
System.out.println(JSON.toJSONString(updateTodoTaskResponse.getBody()));
        } catch (TeaExceptionerr) {
if (!com.aliyun.teautil.Common.empty(err.code) &&!com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题System.out.println(err.code);
System.out.println(err.message);
            }
        } catch (Exception_err) {
TeaExceptionerr=newTeaException(_err.getMessage(), _err);
if (!com.aliyun.teautil.Common.empty(err.code) &&!com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题System.out.println(err.code);
System.out.println(err.message);
            }
        }
    }

函数计算

直接使用内置运行时创建node.js的函数容器即可,用层的方式可以在没有预留实例的情况下,将启动速度降低到100ms以内,与钉钉的接口部分采用回调的方式可以避免响应超时。


阿里云IoT

通过HaaS Python接入阿里云IoT,使用MQTT推送状态到阿里云IoT,函数计算可以使用阿里云IoT的事件作为触发器。

硬件配置采用ESP32和意法半导体ToF传感器,通过Wi-Fi接入。


钉钉连接平台介绍

通过简单的低代码配置,快速实现钉钉官方应用与SaaS应用、企业自建应用及生态应用之间互联互通,集成多方能力,形成丰富自动化连接场景,降低人力成本。让企业工作更简单、更自动。


基于钉钉连接平台实施

image.png

配置硬件

钉钉连接平台极度简化了系统结构,不再需要接入阿里云IoT触发。只需要使用硬件接入网络后调用http模组访问webhook即可。


创建连接器

image.png

创建触发事件image.png

创建执行动作

image.png由于之前用API更复杂,在这样的低代码环境下非常迅速地完成了部署。大大降低了系统复杂度。


写在最后


作为一个工程师,所有地设计为用户服务,而不是给用户增加麻烦。很多时候客户、用户是分离的,不能只想着给钱的客户,而忽略的使用者。

同样,有效的数据化不单服务于管理。把业务本身还给业务,不要让数据化绑架业务,让数据化为业务服务。

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
8月前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
799 30
|
9月前
|
存储 人工智能 Serverless
函数计算进化之路:AI 应用运行时的状态剖析
AI应用正从“请求-响应”迈向“对话式智能体”,推动Serverless架构向“会话原生”演进。阿里云函数计算引领云上 AI 应用 Serverless 运行时技术创新,实现性能、隔离与成本平衡,开启Serverless AI新范式。
847 12
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
1405 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
1052 31
|
12月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
1400 0
|
9月前
|
人工智能 运维 安全
聚焦 AI 应用基础设施,云栖大会 Serverless AI 全回顾
2025 年 9 月 26 日,为期三天的云栖大会在杭州云栖小镇圆满闭幕。随着大模型技术的飞速发展,我们正从云原生时代迈向一个全新的 AI 原生应用时代。为了解决企业在 AI 应用落地中面临的高成本、高复杂度和高风险等核心挑战,阿里云基于函数计算 FC 发布一系列重磅服务。本文将对云栖大会期间 Serverless+AI 基础设施相关内容进行全面总结。
|
9月前
|
人工智能 Kubernetes 安全
重塑云上 AI 应用“运行时”,函数计算进化之路
回顾历史,电网的修建,深刻地改变了世界的经济地理和创新格局。今天,一个 AI 原生的云端运行时的进化,其意义也远不止于技术本身。这是一次设计哲学的升华:从“让应用适应平台”到“让平台主动理解和适应智能应用”的转变。当一个强大、易用、经济且安全的 AI 运行时成为像水电一样的基础设施时,它将极大地降低创新的门槛。一个独立的开发者、一个小型创业团队,将有能力去创造和部署世界级的 AI 应用。这才是技术平权的真谛,是激发全社会创新潜能的关键。
|
人工智能 运维 安全
阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
海牙湾(G-Town)是一家以“供应链+场景+技术+AI”为核心驱动力的科技公司,致力于为各行业提供数字化转型解决方案。通过采用阿里云Serverless架构,解决了弹性能力不足、资源浪费与运维低效的问题。SAE全托管特性降低了技术复杂度,并计划进一步探索Serverless与AI结合,推动智能数字化发展。海牙湾业务覆盖金融、美妆、能源等领域,与多家知名企业建立战略合作,持续优化用户体验和供应链决策能力,保障信息安全并创造可量化的商业价值。未来,公司将深化云原生技术应用,助力更多行业实现高效数字化转型。
839 19
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
719 12
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速

热门文章

最新文章