借阅操作是通过dp2libraryws的一个WebService API Borrow()来实现的。
public Result Borrow(
bool bRenew,
string strReaderBarcode,
string strItemBarcode,
bool bForce,
string [] saBorrowedItemBarcode,
string strStyle,
string strItemFormat,
out string strItemRecord,
string strReaderFormat,
out string strReaderRecord)
功能:借书
参数:
bRenew: 是否为续借。true表示为续借。
strReaderBarcode: 读者证条码
strItemBarcode: 册条码
bForce: 是否忽略某些故障强制进行借阅
saBorrowedItemBarcode: 同一读者先前已经借阅成功的册条码集合。仅仅用于在返回的读者html中显示出特定的颜色而已。
strStyle: 操作风格。这是一个逗号间隔的字符值列表。"item"表示将返回册记录;"reader"表示将返回读者记录。两个值可以组合使用。
strItemFormat: 规定strItemRecord参数所返回的数据格式。为html或者xml。
strItemRecord: 返回册记录
strReaderFormat: 规定strReaderRecord参数所返回的数据格式。为html或者xml。
strReaderRecord: 返回读者记录。
权限要求:无论工作人员还是读者,首先应具备borrow或renew权限。
对于读者,还需要他进行的借阅(续借)操作是针对自己的,即strReaderBarcode必须和账户信息中的证条码一致。
也就是说,读者不允许替他人借阅(续借)图书,这样规定是为了防止读者利用本功能捣乱。
===
整个操作期间,将处于一个写锁定范围内,利用读者证条码参数作为锁定依据。
利用读者证条码参数,从读者库中读出读者XML记录。
利用册条码参数,从实体库中读出实体XML记录。目前的版本,对于命中多条实体记录的,简单针对第一条进行处理,并且不会警告。即将改进这里,改进为警告、需要前端进一步选择。
---
检查借阅权限。
检查册记录中,<barcode>元素内容是否为空,如果为空,就报错。
如果不是续借,检查册记录中,是否已经有borrows/borrow元素并满足barcode内容等于欲借阅的册条码,如果有,就表示以前已经借阅过了此册,报错。
检查是否借阅证是否超期,借阅证是否有停借标志。超期通过读者记录中的<expireDate>元素内容和当前时间进行判断。停借标志是读者记录中的<state>元素内容,如果有这个内容,就表示停借,而元素的内容仅仅起到提示作用。
检查是否有已还超期记录。通过检查读者记录中overdues/overdue元素是否存在。如果存在,就表示有超期记录,读者需要先交罚款后,才能进行借阅。
检查是否有潜在的超期册。通过检查读者记录中borrows/borrow元素,通过联合borrowDate属性、borrowPeriod属性和当前时间进行判断,如果发现有已经超期的册,就报错。读者应当先还回这些已经超期的册,才能进行借阅。
如果不是续借,则检查借阅权限。从读者记录的<readerType>中获得读者类型;从册记录的<bookType>中获得册类型。从借阅权限参数表中,查出当前读者类型针对此册类型的“可借册数”和“可借总册数”两个参数。
从borrows/borrow元素中,统计出type属性值等于当前要借的册的册类型字符串的总数。看看这个已经借阅的总数加一,是否已经超过此类的可借册数参数值。如果超过,则报错。
统计borrows/borrow元素总数,看看是否超过上面获得的可借总册数参数值。如果超过,则报错。
---
在读者记录和册记录中添加借阅信息。