-
Notifications
You must be signed in to change notification settings - Fork 54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
借阅双链相关代码重构 #1183
Comments
读者记录改进点:
册记录改进点:
预约队列记录改进点:
违约金记录改进点:
出纳日志记录(mongodb)改进点:
2024/5/22 发现写入mongodb的borrow的BorrowDate是一个默认值,说明如下:
Borrow() API 操作日志记录Return() API 操作日志记录改进点:
Reservation() API 操作日志记录改进点:
Amerce() API 操作日志记录改进点:
WriteRes() API 操作日志记录改进点:
|
Borrow() API改进点:
Return() API改进点:
VerifyBarcode() API改进点:
2024/5/22 用接口测试符合预期。 SearchCharging() API改进点:
2024/5/22 在接口用partronBarcode参数用4种形状测试均符合预期。但如果action参数为空时,会报异常(todo) |
根据操作日志记录重建 mongodb 出纳动作库这个批处理任务的算法有改进。 原先是处理操作日志记录 borrow 和 return 动作。现在还要处理 setReaderInfo 和 setEntity 动作。 处理 borrow 和 return 动作新算法要从日志记录中的读者和册记录中尽量提取参考 ID(以 处理 setReaderInfo 和 setEntity 动作除了原来算法应该具备的功能,修改和删除 mongodb 动作记录中匹配的两类条码号以外,新算法还要
查找替换批处理曾设想过在新旧版本日志动作切换的时刻,执行一次批处理查找替换 mongodb 中的两类条码号。现在看来没有必要了,因为 处理 setReaderInfo 和 setEntity 动作的时候已经分散解决了这个问题。 |
SetReaderInfo() API 的一些改进change 动作权限检查: 当前账户是否具备修改 barcode 元素的权限。比如,账户权限中包含 setreaderinfo,或者包含 setreaderinfo:barcode,就表示可以修改证条码号字段。 如果读者记录中具有在借信息(borrow 元素),change 动作依然可以自动处理好相关册记录的 borrower 元素联动修改。(旧版本在这种情况下会直接报错拒绝,并返回出错信息建议前端改用 changereaderbarcode 动作) 字段限制: 如果数据库中已经存在的读者记录中 refID 元素为空,则允许修改 refID 元素内容为任意值。但如果已经存在的读者记录中 refID 元素不为空,则不允许修改 refID 元素内容。如果试图修改,SetReaderInfo() API 会返回 result.Value 值 1,表示部分元素的修改被拒绝。(而改用 changereaderrefid 动作可以修改 refID 元素值,包括已经存在的记录中 refID 元素值不为空的情形。changereaderrefid 动作是最新版新增的动作) 此动作不允许修改 foregift 字段。 此动作不允许修改 hire 元素的 expireDate 属性值。也就是说,hire 元素的文本可以修改,但无法改变已经存在的 expreDate 属性值。 changereaderbarcode 动作权限检查: 当前账户具备修改 barcode 元素的权限,或者具备 changereaderbarcode 权限。(可以理解为 changereaderbarcode 权限提升了当前账户的修改读者记录字段的能力) 如果读者记录中具有在借信息(borrow 元素),change 动作依然可以自动处理好相关册记录的 borrower 元素联动修改。这一点旧版本已经做到了。 字段限制: 此动作的旧版本似乎可以修改 barcode 以外的一些字段。最新版改变了这一行为,改为,只允许修改 barcode 和 comment 字段。 changestate 动作权限检查: 当前账户具备修改 state 元素的权限,或者具备 changereaderstate 权限。(可以理解为 changereaderstate 权限提升了当前账户的修改读者记录字段的能力) 字段限制: 只允许修改 state 和 comment 字段。 changeforegift 动作权限检查: 当前账户具备修改 foregift 元素的权限,或者具备 changereaderforegift 权限。(可以理解为 changereaderforegift 权限提升了当前账户的修改读者记录字段的能力) 字段限制: 只允许修改 foregift 和 comment 字段。 changereaderrefid 动作权限检查: 当前账户具备修改 refID 元素的权限,或者具备 changereaderrefid 权限。(可以理解为 changereaderrefid 权限提升了当前账户的修改读者记录字段的能力) 如果读者记录中具有在借信息(borrow 元素),changereaderrefid 动作依然可以自动处理好相关册记录的 borrower 元素联动修改。(注: 最新版的册记录中 borrower 元素值为 字段限制: 只允许修改 refID 和 comment 字段。 自动修改册记录中 borrower 元素过程出错处理在自动修改册记录中 borrower 元素的过程中如果出错,最新版会返回 result.Value 值 1,表示成功但部分修改没有兑现。同时会把错误情况写入错误日志中年。(旧版本这种情况 API 会返回报错,并且读者记录已经被修改了,但没有写入操作日志,处在一种尴尬的状态) |
RepairBorrowInfo() API从读者一侧修复API 参数说明: 建议的测试场景如下:
期待的返回值是 result.Value 为 -1,result.ErrorInfo 中提示请求参数不正确“读者记录中并不存在有关册记录的 xxx 的借阅信息”。 从册一侧修复API 参数说明: 建议的测试场景如下:
期待的返回值是 result.Value 为 -1,result.ErrorInfo 中提示请求参数不正确“册记录中的 borrower 并未指向指定的读者 xxx”。 读者记录中 borrow 元素中 barcode 和 refID 属性值不一致的情况当出现 borrow 元素中 barcode 和 refID 属性值指向的不是同一条册记录的情况,优先依据 refID 属性。 如果 borrow 元素缺乏 refID 属性,只有 barcode 属性,那就不会出现不一致的情况,这时候依据 barcode 属性。 对于 RepairBorrowInfo() API 和 Borrow() Return() API 里面的判断都是采用这种策略。 操作日志readerRecord 和 itemRecord 元素特点从读者一侧修复的时候: recordRecord 元素必然会有文本内容(代表读者记录 XML),也会有 recPath 属性值。也就是说读者记录一定是存在的。 itemRecord 元素一定会存在,也会有 recPath 属性值。元素文本值可能会表示没有修改以前的册记录 XML,也可能会表示修改后的册记录 XML,这要看 changed 属性,如果 changed 属性值为 'false',则表示册记录在操作中没有被修改过(缺省为修改过)。也就是说册记录一定是存在的。如果册记录不存在,API 会报错,那样就不会创建操作日志记录了。 从册一侧修复的时候: recordRecord 元素一定会存在,但文本内容(代表读者记录 XML)可能为空。recPath 属性值也可能为空。changed 属性值恒为 'false'。existing 属性值可能为 'false',这时候元素文本内容也会为空。也就是说读者记录可能存在,也可能不存在。 itemRecord 元素一定会存在,也会有 recPath 属性值。元素文本值表示修改后的册记录 XML。changed 属性不存在,代表册记录在操作中一定会被修改。也就是说册记录一定是存在的。如果册记录不存在,API 会报错,那样就不会创建操作日志记录了。 |
记录中的operation算法更新用途读者/书目/册(及订购/期/评注)记录中的operations/operation元素,用于记录这条记录是谁创建的,该修改过,还可用于统计工作量,参于编辑的每个人做的都要留下痕迹。 以前版本效果1)之前版本读者没有operation元素。书目 和 册(订购/期刊/评注)有。 新版本算法1)为读者增加了operation,包括create和change两种。 测试要点1)创建人与时间 测试结果 2024/5/20-1143 针对 评注 测试1-4要点,符合预期。注:创建者可以修改自己创建的记录,其它人需要具有managecomment权限才能修改他人的记录。
|
修改数据记录相关 API 改进这次也顺便对几个负责修改数据记录的 API 进行了改进。SetBiblioInfo() SetReaderInfo() SetEntities() SetOrders() SetIssues() SetComments()。 new 和 change 两种动作之间的异同早期为修改记录类的 API 都提供了一个 strAction 参数和一个 strRecPath 参数,分别指定要进行的操作,和要修改的记录的路径。 最早的设想场景如下:当 strAction 值为 "new" 时,strRecPath 值为类似“中文图书/?” 这样的表示追加的记录路径;当 strAction 值为 "change" 时,strRecPath 值为类似 "中文图书/100" 这样的表示确定位置的记录路径。 后来随着不断应用实践,逐渐扩展了应用场景,当 strAction 值为 "new" 时,也可能在 strRecPath 值中表达确定位置的记录路径,表示“这是向一个确定位置创建新记录的操作,前端能确保这个位置现在并不存在记录”;和当 strAction 值为 "change" 时,也可能在 strRecPath 值中表达追加的记录路径(不确定位置),表示“这是向一个不确定位置追加新记录的操作,前端能确保这个位置现在并不存在记录,实际上这个位置是服务器临时来决定”。 后面这种用法主要是因为前端利用 API 编程的时候,不想专门去请求检测一下某个位置是否已经存在记录、然后决定用 strAction 的 "new" 还是 "change",而是希望服务器在执行修改 API 的时候灵活处理。这样可以减少一次查询请求。那么从语义上来说,有一种强烈倾向,就是不再区分 "new" 和 "change" 动作,或者说中立一点统一叫"set" 更好。 但这次重构代码,经过深入测试和研讨以后,发现原教旨主义的 "new" 和 "change" 还是有重要区别的,不能简单混为一谈。首先,记录被创建或者修改以后,operations 元素下要添加或者覆盖适当类型的 operation 元素。到底是当作创建还是修改?另外,操作日志中记载的动作,到底是当作创建还是修改? 经过思考,最后决定,operations 元素下添加或者覆盖 operation 元素的操作类型问题,要看修改的记录这个位置,修改以前是否存在原来的记录。如果存在,表明发生了某种覆盖,那就是 change(modify) 动作;如果不存在,表明属于新创建,那就是 create 动作。也就是说,和请求中 strAction 参数值无关。 操作日志中记载的动作,则可以沿用请求中 strAction 参数值。但需要全面检查一下,看看操作日志记录是否到达一种要求:和动作无关,操作日志记录准确记载了被修改位置,修改前的记录内容,和修改后的记录内容,就可以了。 有一个例外情况,就是当请求的 strStyle 参数中含有 "force" 子参数的时候,无论 strAction 参数值为 "new" 还是 "change",都不会使用记录所在位置原来的记录中的 operations/operation 元素,而是要用请求传来的新记录内容。也就是说,可以把这种情况理解为一个超级用户,具备覆盖记录中所有字段的权力,为了从备份数据中恢复记录到数据库中,是把数据记录完全覆盖到指定的位置,等于把原来存在的记录内容彻底冲走了,或者理解为先彻底删除了原记录,然后写入新记录内容。 那 "force" 情况下写入的记录中是否要在 operations 元素下记载这次写入操作的时间呢?一种做法是不做任何记载,理由是,这是“恢复”操作,要还原到备份时候的样子;另外一种做法是给 operations 下追加或者覆盖一个动作为 "restore" 的 operation 元素。 记录中除了 operations 元素,一些当前账户不允许修改的字段如何处理?如果是非 "force" 情况,则要保留原来记录中的这些字段,如果原记录不存在,则这些字段就不存在,或者如果此时 strAction 为 "new" 要按照新创建记录时候的原则给这些字段赋必要的初始值。 一个例子是读者记录中的 password 元素。如果原记录中有 password 元素,则修改发生后,原来的 password 元素依然不变;如果原记录不存在,并且 strAction 为 "new",那么需要按照新创建读者记录时候的规则,利用记录中的 birthDate 构造出初始密码建立一个 password 元素。 如果是 "force" 情况,此时可以理解为具有 supervisor 权限,可以改写任何字段,那么不必考虑原记录中的任何字段,用新记录内容全部覆盖上去即可。 这里涉及到一个关联的话题,就是这些用于恢复的数据记录是如何得到的?原则上应该用相当于 supervisor 的读权限,准确来说就是 backup 权限来从数据库中读取获得。然后用这样的记录去进行恢复操作,把数据恢复到数据库中,这样才能保证比如读者记录中的 password 这样的元素不会丢失。 试想一下,如果当初备份的时候用的是一个普通账户,那么读取读者记录的时候势必得不到 password 元素(被服务器返回前自动过滤了),而用这样的记录再去进行恢复操作,按照上面介绍的算法,最后保存进去的记录就是缺乏 password 元素的,等于恢复以后,password 元素丢了。 注意上面介绍的是普通导出+恢复操作。而如果是普通导出+普通导入,因为普通导入的时候,覆盖的时候本来就没法覆盖数据库中原记录的 password 元素,那么最终导入完成后的结果就是皆大欢喜,数据库记录中的 password 元素最终没有丢失。不过,这是说覆盖操作,数据库中原记录还在。如果换成,导入以前把数据库内的原有记录都删除了(注意删除本身需要超级用户权限,因为一般账户可能会有一些字段不具备写权限导致无法删除记录),再进行导入,那么原记录已经没有了,导入进去最终数据库记录里面就没有 password 元素。 测试要点
|
一直以来 dp2library 中的借阅双链都是使用的读者证条码号和册条码号。由于允许存在没有册条码号的册记录,为了允许这部分册进行借还,双链中也允许用
@refID:xxx
形态使用册记录的参考 ID。但不允许没有证条码号的读者记录。这样的缺点是,当读者记录修改了证条码号字段内容以后,或者册记录修改了册条码号字段内容以后,双链的关系就被破坏。若修改的同时要自动去修改双链中的连接字段内容,则寻找双链的连接字段的过程会比较复杂,难以实现。
现计划对双链进行改造,全面允许使用读者记录和册记录的参考 ID。并兼容以前的证条码号和册条码号用法。这样等系统运行一段时间以后,读者以前借阅的图书都被还回了,新产生的借阅信息链可以确保都是新的参考 ID 形态,这样等读者记录和册记录修改条码号字段以后,双链依然可以保持正确。
本 issue 将记载代码重构中涉及到的数据格式变动,给出测试建议。
The text was updated successfully, but these errors were encountered: