You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Twig实现图书馆用户逾期借阅统计的技术求助

图书馆订阅者逾期借阅统计(Twig实现方案)

需求说明

  • 判断指定订阅者是否存在逾期借阅记录
  • 统计逾期借阅的图书数量

订阅者数据示例

array(9) {
  ["id"]=>
  string(19) "8235798454376842909"
  ["username"]=>
  string(12) "Test xxxx"
  ["login"]=>
  string(11) "xxxx"
  ["role"]=>
  string(5) "guest"
  ["account"]=>
  string(4) "opac"
  ["details"]=>
  array(27) {
    ["lastname"]=>
    string(7) "xxxx"
    ["firstname"]=>
    string(4) "Test"
    ["subscriptions"]=>
    array(1) {
      [0]=>
      array(12) {
        ["subscription"]=>
        array(17) {
          ["ruleSetsLateLoan"]=>
          array(1) {
            [0]=>
            array(3) {
              ["id"]=>
              string(19) "6661733132890635183"
              ["name"]=>
              string(16) "Tous docs retard"
              ["deleted"]=>
              bool(false)
            }
          }
        }
        ["endDate"]=>
        string(10) "06-05-2022"
        ["startDate"]=>
        string(10) "06-05-2021"
      }
    }
    ["loans"]=>
    array(1) {
      [0]=>
      array(17) {
        ["objectType"]=>
        string(9) "User\\Loan"
        ["id"]=>
        string(19) "7348367352886005629"
        ["startDate"]=>
        string(10) "20-10-2021"
        ["endDate"]=>
        string(10) "10-11-2021"
        ["returnDate"]=>
        NULL
        ["returnLibrary"]=>
        string(22) "Bibliothèque Brassens"
        ["extendable"]=>
        bool(true)
        ["nonExtendabilityReason"]=>
        NULL
        ["bibrecordId"]=>
        string(18) "224787138527266506"
        ["bibrecordTitle"]=>
        string(33) "La jeune fille et la nuit : roman"
        ["bibrecordResponsibles"]=>
        string(15) "Guillaume Musso"
        ["bibrecordEditor"]=>
        string(13) "Calmann-Lévy"
        ["bibrecordPublishedDate"]=>
        NULL
        ["isElectronical"]=>
        bool(false)
        ["bibrecordCode"]=>
        string(13) "9782702163634"
        ["bibrecordType"]=>
        string(5) "Texte"
        ["late"]=>
        bool(true)
      }
    }
    ["subenddate"]=>
    string(10) "06-05-2022"
  }
}

Twig实现代码及说明

核心实现脚本

{# 初始化逾期计数器 #}
{% set overdue_count = 0 %}

{# 遍历所有借阅记录 #}
{% for loan in user.details.loans %}
    {# 将字符串格式的截止日期转为时间戳(避免字符串比较的格式问题)#}
    {% set loan_end_timestamp = loan.endDate|date('U') %}
    {# 获取当前日期的时间戳 #}
    {% set current_timestamp = 'now'|date('U') %}

    {# 判断条件:截止日期早于当前日期,且图书未归还 #}
    {% if loan_end_timestamp < current_timestamp and loan.returnDate is null %}
        {% set overdue_count = overdue_count + 1 %}
    {% endif %}
{% endfor %}

{# 输出统计结果 #}
<div class="overdue-status">
    {% if overdue_count > 0 %}
        <p>该订阅者共有 <strong>{{ overdue_count }}</strong> 本逾期图书</p>
    {% else %}
        <p>该订阅者无逾期借阅记录</p>
    {% endif %}
</div>

关键步骤解释

  1. 计数器初始化:用set标签创建overdue_count变量,初始值为0,用于累计逾期数量。
  2. 遍历借阅记录:通过for循环遍历订阅者的details.loans数组,处理每一条借阅数据。
  3. 日期转换与比较:
    • 用date('U')将借阅截止日期(字符串)和当前日期转为时间戳,避免字符串格式不一致导致的比较错误。
    • 时间戳是从1970年1月1日至今的秒数,数值比较更准确可靠。
  4. 逾期判断逻辑:只有当借阅截止日期早于当前日期,且图书未归还(returnDate为NULL)时,才计入逾期统计。
  5. 结果输出:根据计数器的值,显示对应的逾期状态提示,用<strong>强调逾期数量。

备选方案(字符串格式比较)

如果你的Twig环境无法使用时间戳,也可以统一日期格式后直接比较字符串:

{% set loan_end_date = loan.endDate|date('Y-m-d') %}
{% set current_date = 'now'|date('Y-m-d') %}

{% if loan_end_date < current_date and loan.returnDate is null %}
    {% set overdue_count = overdue_count + 1 %}
{% endif %}

这种方式要求日期格式统一为Y-m-d(年-月-日),才能保证字符串比较的正确性。

内容的提问来源于stack exchange,提问作者spip93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:54:24