NXT-FE / blog

能效通前端团队博客
MIT License
4 stars 0 forks source link

手工录入巡检逻辑 #12

Open liuxinqiong opened 7 years ago

liuxinqiong commented 7 years ago

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

业务逻辑

本地数据对象

数据来源

进入巡检

  1. 先判断handInputSubmitData数据是否为空
    • 为空默认不进入巡检
    • 不为空继续上一次未完成的巡检
  2. 进入巡检,记录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对象有什么用?

结束巡检

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

借宝地记录一下逻辑,免得后期迭代又要梳理一遍,同时大家可以帮忙看看逻辑有没有bug!