-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
由于公司业务特殊,使用场景多为停车场,地下室配电房等没有网络的环境,因此在进行手工巡检时无法在线提交,只能本地缓存,在ionic中使用离线方案便是localStorage缓存,由于巡检数据在提交成功时便会清空缓存数据,因此无需太担心localStorage只有5M存储空间的限制。在这里理理逻辑,一方面便于日后能回忆起逻辑,因为逻辑实在有点复杂,同时也可以帮助自己的编码的过程中思路更清晰,更容易知道有哪些疏忽的地方和可以优化存储或性能的地方。
业务逻辑
本地数据对象
- keypcode大对象
- 联网拉取最新数据并保存在本地,如果上一轮巡检未结束,放弃本次服务器数据
- 不存在清空,条件允许的情况下,更新为服务器数据
- handInputSubmitData数组
- 设备巡检数据,每巡检完一个设备提交时,新增或更新数据项
- 点击结束巡检清空
- beginTime字符串
- 新一轮巡检取当前时间并保存在本地
- 点击结束巡检清空
- handInputOfflineList数组
- 每次巡检完成新增数据项
- 数据提交服务器成功完成清空
- handInputData数组
- 已巡检设备数据和剩余未录入设备数
- 点击结束巡检清空,新一轮巡检,这个数据就不重要了
数据来源
- 接口:GetSystem,主要得到哪些设备可以录入和设备的可录入内容(包括录入项和检查项)
- 有网络
- 得到最新数据,同时保存在本地keypcode对象中,以便下次无网时依旧可以进行录入
- 需求:用户没有结束巡检时,下次进入app直接进入巡检,因此必须使用上次巡检缓存的本地数据,此时不能使用服务器数据,因为会覆盖本地录入中的数据
- 无网络
- 直接使用缓存数据
进入巡检
- 先判断handInputSubmitData数据是否为空
- 为空默认不进入巡检
- 不为空继续上一次未完成的巡检
- 进入巡检,记录beginTime。
- 新一轮巡检取当前时间
- 继续巡检取保存在本地的时间
巡检中
设备巡检页面初始化
初始化有个细节,需要特别注意:
- 如果巡检没有结束,getSystem中返回的是keypcode中的缓存数据数据,由于不是点击巡检按钮结束巡检,keypcode中缓存数据并没有更新。因此如果没有结束巡检下次进入app直接继续上一轮巡检,需要使用handInputSubmitData更新keypcode中数据。
- 先根据deviceID查看handInputSubmitData缓存中是否巡检数据,如果有则需要进行更新操作,定义函数有dataEntryHandler(cacheData,updateData),用来进行数据加工,如果有数据更新则作为第二个参数传入。
设备巡检提交
考虑到用户一轮巡检时间可能很长,中途电话或手机其他功能的时候,操作系统可能将app清出内存,此时数据便损失,因此每个设备的巡检提交都应该保存本地。
数据加工处理后,录入项数据为空不提交,检查项也有一定规则,点击提交后步骤:
- 检查handInputSubmitData是否有该设备数据,存在更新,不存在新增,并保存在本地中。
- 更新系统、房间、设备(设备如果有数据,则需要将数据保存)的DataEntryCount值,代表还剩余多少个设备未巡检
- 更新DataEntry的值,用于页面数据更新。与handInputSubmitData的区别:
- handInputSubmitData仅保存已提交设备数据,而DataEntry则包含所有设备数据
- handInputSubmitData保存在本地,DataEntry保存在内存中。
- 有了handInputSubmitData后,点击设备提交时同步更新DataEntry数据,应该就没那么必要了(之前逻辑,不考虑性能暂时保留)。
未录入设备标志同步,主要依靠handInputData对象数据进行更新。
- 每次提交数据时会对handInputData数据中对应的DataEntryCount--
- 保存到本地
- 暴露的getHandInputData方法,在有本地的数据的情况下,优先返回本地缓存数据,因为是未结束巡检
- 点击结束巡检按钮清空
- 标志更新,发布handInputDataChange事件
- 设备提交时发布
- 进入房间页发布,因为回退到系统模块页,房间页缓存会被清掉,通过强制同步(电梯房间,通用房间)
- 电梯房间监听,普通房间rootItem指令监听
- logHead.js、facilitySlide.js监听
defaultHandInputData数组和defaultDataEntry对象有什么用?
- 实在想不起来了,只是当时觉得很重要的样子,现在发现好像没有什么用?因此每次巡检都会触发GetSystem接口,会调用dataReady更新数据,这里数据也就被更新了,当初为什么要备份他们呢?
结束巡检
- 用户点击巡检结束,handInputSubmitData中保存着已巡检设备的最新数据列表,根据handInputSubmitData数据,同时加上巡检开始和结束时间、巡检人等信息,构建handInputOfflineList数据项,开启提交任务。
- 这里有个细节,用户可能结束巡检,但是并没有在有网络的情况下进行提交,便开始了新一轮的巡检,此时自然希望看到上一轮的数据,因此这里需要使用handInputSubmitData更新keypcode中的数据,因为新一轮巡检的数据来源就是它。那么对于有网络的情况下,这样处理有没有影响呢?有网络时,巡检数据会自动提交,且此时进入巡检会拉取服务器最新数据覆盖keypcode数据,这里有个时间差问题,暂时不考虑。
- 更新完keypcode数据后,巡检结束需要清空handInputSubmitData数据,因为会通过handInputSubmitData是否有数据判断上一轮巡检是否点击结束。
- 考虑到用户可能在没网络的情况下巡检多次,因此本地缓存的提交任务列表handInputOfflineList是一个数组,点击巡检结束表示一轮正式完成,加入到handInputOfflineList数组中。
- 提交任务逻辑:无网时不提交,有网时将带提交数据提交,直到handInputOfflineList数组为空为止。
Reactions are currently unavailable