Skip to content

手工录入巡检逻辑 #12

@liuxinqiong

Description

@liuxinqiong

由于公司业务特殊,使用场景多为停车场,地下室配电房等没有网络的环境,因此在进行手工巡检时无法在线提交,只能本地缓存,在ionic中使用离线方案便是localStorage缓存,由于巡检数据在提交成功时便会清空缓存数据,因此无需太担心localStorage只有5M存储空间的限制。在这里理理逻辑,一方面便于日后能回忆起逻辑,因为逻辑实在有点复杂,同时也可以帮助自己的编码的过程中思路更清晰,更容易知道有哪些疏忽的地方和可以优化存储或性能的地方。

业务逻辑

本地数据对象

  • keypcode大对象
    • 联网拉取最新数据并保存在本地,如果上一轮巡检未结束,放弃本次服务器数据
    • 不存在清空,条件允许的情况下,更新为服务器数据
  • handInputSubmitData数组
    • 设备巡检数据,每巡检完一个设备提交时,新增或更新数据项
    • 点击结束巡检清空
  • beginTime字符串
    • 新一轮巡检取当前时间并保存在本地
    • 点击结束巡检清空
  • handInputOfflineList数组
    • 每次巡检完成新增数据项
    • 数据提交服务器成功完成清空
  • handInputData数组
    • 已巡检设备数据和剩余未录入设备数
    • 点击结束巡检清空,新一轮巡检,这个数据就不重要了

数据来源

  • 接口:GetSystem,主要得到哪些设备可以录入和设备的可录入内容(包括录入项和检查项)
  • 有网络
    • 得到最新数据,同时保存在本地keypcode对象中,以便下次无网时依旧可以进行录入
    • 需求:用户没有结束巡检时,下次进入app直接进入巡检,因此必须使用上次巡检缓存的本地数据,此时不能使用服务器数据,因为会覆盖本地录入中的数据
  • 无网络
    • 直接使用缓存数据

进入巡检

  1. 先判断handInputSubmitData数据是否为空
  • 为空默认不进入巡检
  • 不为空继续上一次未完成的巡检
  1. 进入巡检,记录beginTime。
  • 新一轮巡检取当前时间
  • 继续巡检取保存在本地的时间

巡检中

设备巡检页面初始化

初始化有个细节,需要特别注意:

  1. 如果巡检没有结束,getSystem中返回的是keypcode中的缓存数据数据,由于不是点击巡检按钮结束巡检,keypcode中缓存数据并没有更新。因此如果没有结束巡检下次进入app直接继续上一轮巡检,需要使用handInputSubmitData更新keypcode中数据。
  2. 先根据deviceID查看handInputSubmitData缓存中是否巡检数据,如果有则需要进行更新操作,定义函数有dataEntryHandler(cacheData,updateData),用来进行数据加工,如果有数据更新则作为第二个参数传入。
设备巡检提交

考虑到用户一轮巡检时间可能很长,中途电话或手机其他功能的时候,操作系统可能将app清出内存,此时数据便损失,因此每个设备的巡检提交都应该保存本地。

数据加工处理后,录入项数据为空不提交,检查项也有一定规则,点击提交后步骤:

  1. 检查handInputSubmitData是否有该设备数据,存在更新,不存在新增,并保存在本地中。
  2. 更新系统、房间、设备(设备如果有数据,则需要将数据保存)的DataEntryCount值,代表还剩余多少个设备未巡检
  3. 更新DataEntry的值,用于页面数据更新。与handInputSubmitData的区别:
  • handInputSubmitData仅保存已提交设备数据,而DataEntry则包含所有设备数据
  • handInputSubmitData保存在本地,DataEntry保存在内存中。
  • 有了handInputSubmitData后,点击设备提交时同步更新DataEntry数据,应该就没那么必要了(之前逻辑,不考虑性能暂时保留)。

未录入设备标志同步,主要依靠handInputData对象数据进行更新。

  1. 每次提交数据时会对handInputData数据中对应的DataEntryCount--
  2. 保存到本地
  3. 暴露的getHandInputData方法,在有本地的数据的情况下,优先返回本地缓存数据,因为是未结束巡检
  4. 点击结束巡检按钮清空
  5. 标志更新,发布handInputDataChange事件
  • 设备提交时发布
  • 进入房间页发布,因为回退到系统模块页,房间页缓存会被清掉,通过强制同步(电梯房间,通用房间)
  • 电梯房间监听,普通房间rootItem指令监听
  • logHead.js、facilitySlide.js监听

defaultHandInputData数组和defaultDataEntry对象有什么用?

  • 实在想不起来了,只是当时觉得很重要的样子,现在发现好像没有什么用?因此每次巡检都会触发GetSystem接口,会调用dataReady更新数据,这里数据也就被更新了,当初为什么要备份他们呢?

结束巡检

  1. 用户点击巡检结束,handInputSubmitData中保存着已巡检设备的最新数据列表,根据handInputSubmitData数据,同时加上巡检开始和结束时间、巡检人等信息,构建handInputOfflineList数据项,开启提交任务。
  2. 这里有个细节,用户可能结束巡检,但是并没有在有网络的情况下进行提交,便开始了新一轮的巡检,此时自然希望看到上一轮的数据,因此这里需要使用handInputSubmitData更新keypcode中的数据,因为新一轮巡检的数据来源就是它。那么对于有网络的情况下,这样处理有没有影响呢?有网络时,巡检数据会自动提交,且此时进入巡检会拉取服务器最新数据覆盖keypcode数据,这里有个时间差问题,暂时不考虑。
  3. 更新完keypcode数据后,巡检结束需要清空handInputSubmitData数据,因为会通过handInputSubmitData是否有数据判断上一轮巡检是否点击结束。
  4. 考虑到用户可能在没网络的情况下巡检多次,因此本地缓存的提交任务列表handInputOfflineList是一个数组,点击巡检结束表示一轮正式完成,加入到handInputOfflineList数组中。
  5. 提交任务逻辑:无网时不提交,有网时将带提交数据提交,直到handInputOfflineList数组为空为止。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions