DigitalPlatform / dp2

Integrated Library System / 图书馆集成系统
http://digitalplatform.github.io/dp2
Apache License 2.0
107 stars 54 forks source link

如何通过脚本设置馆藏地借书权限 #644

Open Hopeshine opened 4 years ago

Hopeshine commented 4 years ago

设置馆藏地的借书权限,指限制某馆藏地的图书只能被某类型的读者所借。 设置馆藏地的还书权限,则是限制某馆藏地的图书只能在某几台电脑上还。

当几个互相独立的单位共用一套系统时,以上所提的借还权限限制具有一定的现实意义。

由于借还过程中校验条码是根据dp2内务工具条上所选择的“分馆”的条码规则来进行的,所以给馆藏地配置借还书权限主要是围绕为馆藏地配置借书管控代码,并将馆藏地“升级”为全局的“分馆”级别,从而根据相关规则来判定是否可以借还。

这里的“升级”为“分馆”只是用来说明用馆藏地的规则来校验借还的过程,并不是馆藏地就真的变成了分馆,成了总分馆模式。

本文只将如何配置馆藏地借书权限限制,有关馆藏地的还书权限的配置,请参考文档。

馆藏地借书权限限制的配置

配置步骤:在【条码校验】属性页设定相关条码校验函数--在【馆藏地】属性页配置相关借书管控代码,以限定可借的读者--在前端电脑的内务【全局】属性页增加附件馆藏地并打开前端校验开关--前端电脑实现馆藏地借书管控

举例说明:非总分馆系统馆藏地借书权限的配置

例如:某图书馆馆藏有东区图书馆,东区阅览室;西区图书馆、西区阅览室。东区图书馆和东区阅览室需要限定读者类型为“初中生”和“初中教师”可借,西区图书馆和西区阅览室需要限定读者类型为“高中生”和“高中教师”可借。


一、校验函数配置:

<barcodeValidation>
    <validator location="东区*"> 
 //这里一定要配置为“东区*”,因为需要管控以“东区”开头的相关馆藏地的借书,这样设置后这些馆藏的规则相同。如果这些馆藏有规则不同的,需要单独设定为location来管控
        <patron>
            <range value="DP001-DP999" />
        </patron>
//一般情况下,读者校验规则是与分馆相关联的。因为第三步将会升级“东区*”馆藏为“分馆”地位,所以读者条码也与该馆藏地相关联。
        <entity>
            <range value="DT001-DT999" />
        </entity>
    </validator>
    <validator location="西区*">
        <patron>
            <range value="XP001-XP999" />
        <entity>
            <range value="XT001-XT999" />
        </entity>
    </validator>
</barcodeValidation>

二、借书管控配置

在【系统管理】-【馆藏地】属性页,依次为需要管控的馆藏地配置管制代码。假定这里以“读者类型”为例作为限制。

双击“东区图书馆”在【允许外借】下面的文本框里输入:

javascript:
if (patron.readerType =="初中生"||patron.readerType =="初中教师") //判断读者类型
{ 
    result = "yes"; //返回值
}
else
{
    result = "no";
    message = "读者为(" +patron.readerType+ ")无法借阅";  //提示信息
}

再为“东区阅览室”配置,配好后的可以在【馆藏地】属性页直接看到是经过了配置: 同样的道理为“西区图书馆”和“西区阅览室”配置可借读者管控代码。

然后点击左下方的【保存】按钮。 以上两步可以由图书馆系统管理员通过dp2内务来操作,所有的配置是保存在服务器上的。

另外,一定要删除 library.xml 中的原有的 ItemCanBorrow() 和 ItemCanReturn() 脚本函数代码,否则配置java函数后,非流通馆藏的配置就失效了。

三、创建附加馆藏地并打开前端校验开关

创建附加馆藏地并打开前端校验开关需要在借书的前端电脑上进行,有几台电脑参与借书,就需要配置几台电脑。

点击【帮助】-【参数配置】-【全局】属性页,在【附加的馆藏地】问板框里,输入可以代表馆藏地的名称,以将馆藏地“升级”为“分馆”地位。设置后点【确定】

设置好附加馆藏地后,在内务的工具条的【选择分馆】列表中就可以看到已经设置的附加馆藏地了。用户选择需要的附加馆藏地作为当前“分馆”。

这里需要注意: 1.由于我们的馆藏地命名很规整,东区的馆藏地都是以“东区”开头,所以这里可以“东区”作为附加馆藏地。这样进入系统选择“东区”分馆代码后,可以为所有以“东区”开头的馆藏地借书;

2.如果馆藏地命名不规整,则需要将不规整的馆藏地都罗列在这里,作为不同的附加馆藏地。操作时需要在不同的分馆代码之间切换。

点击【帮助】-【参数配置】-【种册】/【快捷出纳】/【读者】三个属性页,分别勾选“校验输入的条码号”选项。如此设置后,当进入内务并选择分馆代码“东区”后,借还时、读者记录或册记录报存时,系统会已第一步设置的校验函数来前端校验。

第三步所设置的附加馆藏地和打开前端校验,一经设置,会一直保存在前端电脑上。

四、前端电脑实现馆藏地借书管控

经过以上配置,前端电脑就可以实现根据馆藏地借书管控了。用户操作时只要确定是处在需要的分馆下并打开前端校验功能就可以了。


上述借书限制javascript代码中,除了可以读者类型作为限制借书的条件以外,读者记录的其他字段也可以调用。只要替换代码中的“patron.readerType”就好。

patron对象下有很多成员,每个成员获取的读者信息不同。下面为可用的Patron对象成员详细列表

对象成员 获取读者内容
patron.barcode 读者条形码
patron.state 读者状态
patron.readerType 读者类型
patron.createDate 创建日期
patron.expireDate 失效日期
patron.name 读者姓名
patron.namePinyin 姓名拼音
patron.gende 读者性别
patron.dateOfBirth 出生日期
patron.refID 读者参考ID
patron.idCardNumber 读者身份证号
patron.department 读者部门
patron.post 读者职务
patron.address 读者地址信息
patron.tel 读者电话
patron.email 读者电话
patron.cardNumber 读者证号
patron.fingerprint 读者指纹信息
patron.rights 读者权限
patron.friends 读者好友
patron.access 存取定义
patron.DbName 读者记录所在的读者库
patron.Path 读者记录路径
renyh commented 4 years ago

下面 馆藏地的借还限制脚本,在内务借还没问题,但在OPAC显示这条册条码时报错,如下图

javascript:
if (patron.readerType =="初中生"||patron.readerType =="初中教师") //判断读者类型
{ 
    result = "yes"; //返回值
}
else
{
    result = "no";
    message = "读者为(" +patron.readerType+ ")无法借阅";  //提示信息
}

image

image


原因分析与解决办法:

两边调用的环境不太一样。报错很清楚,说 patron 这个对象为 null。加上判断语句就可以了 就是说有些情况下,发生调用的时候,patron 这个对象无法确定,所以只能为 null。javascript 代码要适应这种情况就可以了 脚本改为下面,则可以适应OPAC匿名帐户public的情况

javascript:
if (patron !=null)
{
  if (patron.readerType =="初中生"||patron.readerType =="初中教师") //判断读者类型
  { 
      result = "yes"; //返回值
  }
  else
  {
      result = "no";
      message = "读者为(" +patron.readerType+ ")无法借阅";    //提示信息
  }
}

image

image


需要测试一下不同的身份登录,也就是 public,具体的读者,和工作人员。三种情况下看看 JavaScript 是怎么执行的

当OPAC的登录身份为匿名public 或者 工作人员时,javescript中的patron对象为null。当登录身份为具体的读者时,patron对象不为空。 这样馆藏地js脚本中要检查patron为null的情况,以适应不同的登录身份。

DigitalPlatform commented 3 years ago

ItemCanBorrow() 脚本函数会优先于“馆藏地是否允许外借”(包括 javascript 脚本)起作用

维护中有时会发现馆藏地是否允许外借参数不起作用,感到很迷惑。这是因为 library.xml 中存在 ItemCanBorrow() 脚本函数,系统优先采用了 ItemCanBorrow() 脚本的缘故。这时候删除 ItemCanBorrow() 脚本函数即可(改名让它不起作用也可以)。