dp2circulation的读者信息窗中,工具条增加了一个“创建交费请求”的下拉菜单,里面有一项“交押金”。使用这个命令,可以为该读者创建一个押金的缴费记录,也就是在读者记录的<overdues>元素内创建一个<overdue>元素。
这个“交押金”命令仅仅在读者记录里面创建了一个可交费的事项,但是并不等于立即交费。如果要交费,还需去“交费窗”,在那里进行交费。
创建交费请求和交费分开,是为了管理上的严密考虑的,因为这两种操作所需要的权限是不同的,后者需要的权限更高一些。
读者记录中有了押金需交费的信息后,如果读者不履行交费手续,就无法借书,这和读者记录中超期违约金信息但是没有缴纳的时候类似。
当在交费窗中交费成功后,读者记录中会出现一个<foregift>元素,里面有押金的当前余额。如果多次交押金,<foregift>元素中的余额会自动累加。撤回交费时,读者记录内<foregift>元素内的余额会自动减掉最近一次所交的值。当然,如果交费的记录经过结帐后,就不能撤回了。
读者记录中通过<foregift>元素保留余额值的处理办法,和租金不一样。租金在读者记录中是看不出当前额度的,在读者记录中只能看到交费时间和失效期。在读者记录中看不到也没有问题,因为在违约金库中可以查到。而在押金处理中,考虑到操作效率,在读者记录中冗余设计了这个<foregift>元素,从概念上说,违约金库中的相关记录和读者记录中<foregift>元素的值,应当是可以互相对照的。
创建押金交费记录的操作不能简单重复。当读者记录的<overdues>元素中有“押金”类型的未交费信息时候,服务器会警告,不让前端重复创建缴费记录。
但读者一旦缴费后,当相关信息从读者<overdues>元素中消失后,创建押金交费记录的操作就可以重复进行了,而不管当前读者是不是还有押金没有用完,都可以重复创建。不过这个问题可以通过相关脚本函数上增加功能来防范,后面会提到。
每次创建押金交费具体是多少金额?这由dp2libraryws服务器端的library.xml文件中的新增一个脚本函数GetForegift()来决定。这个函数很重要,如果没有配置这个函数,创建押金缴费记录的操作就不能成功。
// parameters:
// strAction 为foregift和return之一
public int GetForegift(
string strAction,
XmlDocument readerdom,
string strExistPrice,
out string strPrice,
out string strError)
{
strPrice = "";
strError = "";
if (strAction == "foregift")
strPrice = "CNY100.00";
else if (strAction == "return")
{
// 将形如"-123.4+10.55-20.3"的价格字符串反转正负号
// parameters:
// bSum 是否要顺便汇总? true表示要汇总
int nRet = PriceUtil.NegativePrices(strExistPrice,
true,
out strPrice,
out strError);
if (nRet == -1)
return -1;
return 0;
// strPrice = "%return_foregift_price%";
}
else {
strError = "无法识别的strAction参数值 '" + strAction + "'";
return -1;
}
return 0;
}
这里是一个示范的函数,编写得很简单。
参数strAction的值表示需要执行何种操作。如果为"foregift",表示为创建押金交费记录;如果为"return",表示为创建押金退费记录。
函数在每次需要创建交费记录的时候一律给出一个100元的金额。但是如果要防止多次创建交费记录,函数里面可以根据strExistPrice参数传递过来的读者记录中<foregift>元素内的最后余额,给出合理的判断,例如金额在某个值以上,就提示说不必交费了,在这个值以下,才允许创建交费记录,而且也不一定每次都是100元。这个函数还可以根据读者记录(readerdom)内的其他信息进行判断,例如根据读者类型的不同,要求交费的额度不同。
函数在每次需要创建退费记录的时候,将参数strExistPrice中的金额值反转为负数,也就是创建一个金额为负数的交费记录,也就是退费的意思了。由于strExistPrice参数值可能为一个若干单个金额值用加减号连起来的复杂字符串,所以要用PriceUtil.NegativePrices()函数进行处理。
创建退费记录的时候,函数也可以直接为strPrice参数设置值 "%return_foregift_price%",这是一个宏字符串,表示用当前的读者记录内的<foregift>元素内的金额值反转为负数的意思,系统会自动处理。
~
为了让押金信息发挥一定的作用,在library.xml中,根元素下,新增了以下配置内容:
<foregift borrowStyle="" />
这是和押金用途有关的配置。当borrowStyle属性的值(一个逗号分割的字符串)包含checkSum的时候,系统就会针对借阅图书启动检查册价格总额是否高于读者押金当前余额的功能,缺省情况下是不启用的。也就是说,虽然读者数据中有了押金相关信息,但是如果不在这里配置一下,相关功能是不启用的。
但,一旦借书时册价格总额检查功能启用了,如果一个读者记录里面没有<foregift>字段,那么该读者就无法借书,直到这个读者创建了押金缴费记录并且去缴费了才行。
目前读者记录中的<foregift>字段是通过创建押金交费记录、然后读者交费,间接由服务器创建的,图书馆工作人员没有其他手段去直接创建这个元素。即便目前读者信息窗界面上看到了字段的文字框,并且似乎其值可以修改,但是保存后你会发现<foregift>元素的值其实并没有被修改。
~
目前的押金相关功能,要求library.xml中决定押金金额的脚本函数GetForegift(),必须创建带有CNY一种币种的金额字符串。并且册记录中的<price>元素内的价格字符串,也必须是CNY一种币种,或者前缀为空的纯数字也行。尚不能支持两种以上的币种混合。
如果出现多币种的情况,服务器会拒绝借书,而不是允许借书。如果出现这样的情况,需要对相关数据进行必要的修改,统一币种。
对于册记录中价格字符串为空的,当作0处理,不报错。读者记录中缺<foregift>元素的,也当作押金余额为0处理。
~
为了加快程序处理速度,读者记录中<borrow>元素中的已经借阅图书的信息中,这次扩充了一个price属性,就是从册信息中每次复制来的<price>元素内容。当计算读者借阅的当前图书价格和以前借阅的其他册图书价格的总和的时候,以前的册的价格,是从读者记录的<borrow>元素中获得,而不是直接去找那些册记录。
这种机制有一定的副作用:如果发现读者在借的册价格不正确,光修改册记录中的<price>元素内容是不够的,还需要直接修改读者记录中缓存的价格。不过,这种修改只能由系统管理员利用dp2rms工具才能完成了。
~
目前押金金额除了可以用来在借书的时候对所借册的总价格进行限制外,还没有开发其他的用途。读者在交纳违约金的时候,还不能从押金中进行扣款。