跳到正文
选择国家与语言当前国家: 中国

德勤 Virtual Internship / 任务 05

实习猿原创实训 · 任务 05

运营异常工作台交付提案

把前四项证据变成有边界、可估算、可验收的交付方案。

先查看已完成的成果,再使用材料完成自己的交付。

先阅读完整成果

材料

learner/materials/stakeholder-brief.md 阅读完整文件下载文件

工作台需求访谈纪要

运营负责人:早上先看尚未交付的到期订单,再看站点与线路。已交付迟交订单用于复盘,不应盖过仍在积压的订单。希望按站点、服务等级和履约状态筛选,打开订单看时间线。需要显示复盘截止时间与数据更新时间。

站点负责人:不能拿不同服务结构的总迟交率直接排绩效。南湾 express 数据少,需要补足后再比较。线路备注只是线索,不能让系统自动把延迟归因给某个员工。

安全负责人:operator 只能读取所属站点,导出另需 supervisor 或 service 权限,服务端每次请求都检查权限和 session。身份来自企业现有身份服务,不新增密码库。屏幕上选择站点不等于获得权限。

交付负责人:第一期做只读工作台、订单证据时间线与受控导出设计;不要加入退款、调度写入或客户通知。上线依赖客户提供身份服务、网关和订单接口。需要估算工时、明确验收、失败处理与回退。没有给定预算、合同 SLA、生产并发数或上线日期,方案须提出待确认项,不自行写成客户已确认。

learner/checkpoints/security-findings.csv 阅读完整文件下载文件
request_idatusersessionfindingstatusrowsbytes
Q00582026-09-10T09:41:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00592026-09-10T09:42:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00602026-09-10T09:43:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00612026-09-10T09:44:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00622026-09-10T09:45:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00632026-09-10T09:46:00Zop-7sus-7unauthorised_export;hub_scope_violation200120096000
Q00692026-09-10T11:15:00Zop-2expired-2expired_or_missing_session2005010000
learner/checkpoints/standardized-comparison.csv 阅读完整文件下载文件
hubstandardized_late_ratestatus
东城0.49024可比较
南湾待补样本
海港0.689189可比较
西岭0.386363可比较
learner/checkpoints/order-review.csv 阅读完整文件下载文件
order_idhubserviceroutecreated_atdue_atcohortlate_minutesoverdue_minutes
O0001海港standardR112026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0002海港standardR122026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late500
O0003海港standardR112026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0004海港standardR122026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0005海港standardR112026-09-05T10:00:00Z2026-09-06T10:00:00Zdelivered_late500
O0006海港standardR122026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0007海港standardR112026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0008海港standardR122026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late500
O0009海港standardR112026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0010海港standardR122026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0011海港standardR112026-09-11T08:00:00Z2026-09-12T08:00:00Zdelivered_late500
O0012海港standardR122026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0013海港standardR112026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0014海港standardR122026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late500
O0015海港standardR112026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0016海港standardR122026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0017海港standardR112026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late500
O0018海港standardR122026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0019海港standardR112026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0020海港standardR122026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late500
O0021海港standardR112026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0022海港standardR122026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0023海港standardR112026-09-10T12:00:00Z2026-09-11T12:00:00Zdelivered_late500
O0024海港standardR122026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0025海港standardR112026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0026海港standardR122026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late500
O0027海港standardR112026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0028海港standardR122026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0029海港standardR112026-09-03T10:00:00Z2026-09-04T10:00:00Zdelivered_late500
O0030海港standardR122026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0031海港standardR112026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0032海港standardR122026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late500
O0033海港standardR112026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0034海港standardR122026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0035海港standardR112026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0036海港standardR122026-09-10T09:00:00Z2026-09-11T09:00:00Zon_time00
O0037海港standardR112026-09-11T10:00:00Z2026-09-12T10:00:00Zon_time00
O0038海港standardR122026-09-12T11:00:00Z2026-09-13T11:00:00Zdelivered_late500
O0039海港standardR112026-09-13T12:00:00Z2026-09-14T12:00:00Zon_time00
O0040海港standardR122026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0041海港expressR112026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0042海港expressR122026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late500
O0043海港expressR112026-09-03T08:00:00Z2026-09-03T16:00:00Zdelivered_late500
O0044海港expressR122026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late500
O0045海港expressR112026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late500
O0046海港expressR122026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late500
O0047海港expressR112026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late500
O0048海港expressR122026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late500
O0049海港expressR112026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late500
O0050海港expressR122026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late500
O0051海港expressR112026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late500
O0052海港expressR122026-09-12T09:00:00Z2026-09-12T17:00:00Zdelivered_late500
O0053海港expressR112026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late500
O0054海港expressR122026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late500
O0055海港expressR112026-09-02T12:00:00Z2026-09-02T20:00:00Zdelivered_late500
O0056海港expressR122026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late500
O0057海港expressR112026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late500
O0058海港expressR122026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0059海港expressR112026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late500
O0060海港expressR122026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0061东城standardR212026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0062东城standardR222026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late700
O0063东城standardR212026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0064东城standardR222026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0065东城standardR212026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0066东城standardR222026-09-06T11:00:00Z2026-09-07T11:00:00Zdelivered_late700
O0067东城standardR212026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0068东城standardR222026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0069东城standardR212026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0070东城standardR222026-09-10T07:00:00Z2026-09-11T07:00:00Zdelivered_late700
O0071东城standardR212026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0072东城standardR222026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0073东城standardR212026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0074东城standardR222026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late700
O0075东城standardR212026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0076东城standardR222026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0077东城standardR212026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0078东城standardR222026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0079东城standardR212026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0080东城standardR222026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0081东城expressR212026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0082东城expressR222026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late700
O0083东城expressR212026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0084东城expressR222026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late700
O0085东城expressR212026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late700
O0086东城expressR222026-09-06T11:00:00Z2026-09-06T19:00:00Zon_time00
O0087东城expressR212026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late700
O0088东城expressR222026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late700
O0089东城expressR212026-09-09T06:00:00Z2026-09-09T14:00:00Zon_time00
O0090东城expressR222026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late700
O0091东城expressR212026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late700
O0092东城expressR222026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0093东城expressR212026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late700
O0094东城expressR222026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late700
O0095东城expressR212026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0096东城expressR222026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late700
O0097东城expressR212026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late700
O0098东城expressR222026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0099东城expressR212026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late700
O0100东城expressR222026-09-07T09:00:00Z2026-09-07T17:00:00Zdelivered_late700
O0101东城expressR212026-09-08T10:00:00Z2026-09-08T18:00:00Zon_time00
O0102东城expressR222026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late700
O0103东城expressR212026-09-10T12:00:00Z2026-09-10T20:00:00Zdelivered_late700
O0104东城expressR222026-09-11T13:00:00Z2026-09-11T21:00:00Zon_time00
O0105东城expressR212026-09-12T06:00:00Z2026-09-12T14:00:00Zdelivered_late700
O0106东城expressR222026-09-13T07:00:00Z2026-09-13T15:00:00Zdelivered_late700
O0107东城expressR212026-09-01T08:00:00Z2026-09-01T16:00:00Zon_time00
O0108东城expressR222026-09-02T09:00:00Z2026-09-02T17:00:00Zdelivered_late700
O0109东城expressR212026-09-03T10:00:00Z2026-09-03T18:00:00Zdelivered_late700
O0110东城expressR222026-09-04T11:00:00Z2026-09-04T19:00:00Zcancelled00
O0111东城expressR212026-09-05T12:00:00Z2026-09-05T20:00:00Zdelivered_late700
O0112东城expressR222026-09-06T13:00:00Z2026-09-06T21:00:00Zdelivered_late700
O0113东城expressR212026-09-07T06:00:00Z2026-09-07T14:00:00Zon_time00
O0114东城expressR222026-09-08T07:00:00Z2026-09-08T15:00:00Zdelivered_late700
O0115东城expressR212026-09-09T08:00:00Z2026-09-09T16:00:00Zoverdue_open07680
O0116东城expressR222026-09-10T09:00:00Z2026-09-10T17:00:00Zon_time00
O0117东城expressR212026-09-11T10:00:00Z2026-09-11T18:00:00Zdelivered_late700
O0118东城expressR222026-09-12T11:00:00Z2026-09-12T19:00:00Zdelivered_late700
O0119东城expressR212026-09-13T12:00:00Z2026-09-13T20:00:00Zon_time00
O0120东城expressR222026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0121西岭standardR312026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0122西岭standardR322026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late900
O0123西岭standardR312026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0124西岭standardR322026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0125西岭standardR312026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0126西岭standardR322026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0127西岭standardR312026-09-07T12:00:00Z2026-09-08T12:00:00Zdelivered_late900
O0128西岭standardR322026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0129西岭standardR312026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0130西岭standardR322026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0131西岭standardR312026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0132西岭standardR322026-09-12T09:00:00Z2026-09-13T09:00:00Zdelivered_late900
O0133西岭standardR312026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0134西岭standardR322026-09-01T11:00:00Z2026-09-02T11:00:00Zon_time00
O0135西岭standardR312026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0136西岭standardR322026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0137西岭standardR312026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late900
O0138西岭standardR322026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0139西岭standardR312026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0140西岭standardR322026-09-07T09:00:00Z2026-09-08T09:00:00Zon_time00
O0141西岭standardR312026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0142西岭standardR322026-09-09T11:00:00Z2026-09-10T11:00:00Zdelivered_late900
O0143西岭standardR312026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0144西岭standardR322026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0145西岭standardR312026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0146西岭standardR322026-09-13T07:00:00Z2026-09-14T07:00:00Zon_time00
O0147西岭standardR312026-09-01T08:00:00Z2026-09-02T08:00:00Zdelivered_late900
O0148西岭standardR322026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0149西岭standardR312026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0150西岭standardR322026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0151西岭standardR312026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0152西岭standardR322026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late900
O0153西岭standardR312026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0154西岭standardR322026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0155西岭standardR312026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0156西岭standardR322026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0157西岭expressR312026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0158西岭expressR322026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late900
O0159西岭expressR312026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0160西岭expressR322026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0161西岭expressR312026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late900
O0162西岭expressR322026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late900
O0163西岭expressR312026-09-07T12:00:00Z2026-09-07T20:00:00Zon_time00
O0164西岭expressR322026-09-08T13:00:00Z2026-09-08T21:00:00Zon_time00
O0165西岭expressR312026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late900
O0166西岭expressR322026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late900
O0167西岭expressR312026-09-11T08:00:00Z2026-09-11T16:00:00Zon_time00
O0168西岭expressR322026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0169西岭expressR312026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late900
O0170西岭expressR322026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late900
O0171西岭expressR312026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0172西岭expressR322026-09-03T13:00:00Z2026-09-03T21:00:00Zon_time00
O0173西岭expressR312026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late900
O0174西岭expressR322026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0175西岭expressR312026-09-06T08:00:00Z2026-09-06T16:00:00Zon_time00
O0176西岭expressR322026-09-07T09:00:00Z2026-09-07T17:00:00Zon_time00
O0177西岭expressR312026-09-08T10:00:00Z2026-09-08T18:00:00Zdelivered_late900
O0178西岭expressR322026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late900
O0179西岭expressR312026-09-10T12:00:00Z2026-09-10T20:00:00Zon_time00
O0180西岭expressR322026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0181南湾standardR412026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0182南湾standardR422026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late1100
O0183南湾standardR412026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0184南湾standardR422026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0185南湾standardR412026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0186南湾standardR422026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0187南湾standardR412026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0188南湾standardR422026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late1100
O0189南湾standardR412026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0190南湾standardR422026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0191南湾standardR412026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0192南湾standardR422026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0193南湾standardR412026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0194南湾standardR422026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late1100
O0195南湾standardR412026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0196南湾standardR422026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0197南湾standardR412026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0198南湾standardR422026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0199南湾standardR412026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0200南湾standardR422026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late1100
O0201南湾standardR412026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0202南湾standardR422026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0203南湾standardR412026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0204南湾standardR422026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0205南湾standardR412026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0206南湾standardR422026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late1100
O0207南湾standardR412026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0208南湾standardR422026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0209南湾standardR412026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0210南湾standardR422026-09-14T21:00:00Z2026-09-15T21:00:00Zcancelled00
O0211南湾expressR412026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0212南湾expressR422026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late1100
O0213南湾expressR412026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0214南湾expressR422026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0215南湾expressR412026-09-05T10:00:00Z2026-09-05T18:00:00Zon_time00
O0216南湾expressR422026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
learner/checkpoints/hub-metrics.csv 阅读完整文件下载文件
hubtotaleligiblelatelate_rateon_timedelivered_lateoverdue_opencancellednot_maturedelivered_late_minutesopen_overdue_minutes
东城6055310.5636362428332196033720
南湾363270.2187525613166012540
海港6055320.5818182329332145032760
西岭6055200.3636363517332153032760
learner/checkpoints/service-review.csv 阅读完整文件下载文件
hubserviceeligiblelatelate_ratetargetgap_ppreview
东城express37260.7027030.160.27优先处理
东城standard1850.2777780.117.778优先处理
南湾express410.250.115.0待补样本
南湾standard2860.2142860.111.429需要复核
海港express18181.00.190.0优先处理
海港standard37140.3783780.127.838优先处理
西岭express22110.50.140.0优先处理
西岭standard3390.2727270.117.273优先处理
learner/materials/access-policy.json 阅读完整文件下载文件
{
  "session_ttl_minutes": 30,
  "export_roles": [
    "supervisor",
    "service"
  ],
  "operator_hub": {
    "op-1": "海港",
    "op-2": "东城",
    "op-3": "西岭",
    "op-4": "南湾",
    "op-7": "海港"
  },
  "network_note": "经企业 VPN 访问网关;IP 为文档保留地址,不能证明真实地理位置或攻击者身份。",
  "service_accounts": [
    "svc-archive"
  ]
}

步骤

  1. 逐条提取访谈需求,并与任务二、三、四发现关联。写出目标用户、主要场景和不在第一期的动作。
  1. 画信息层级:站点汇总→订单列表→证据时间线。实现站点、服务、状态筛选及空结果状态,让交付对象可操作。
  1. 编写接口契约:分页、筛选、as_of、数据版本、权限、401/403/503。认证从身份服务接入,前端隐藏按钮不能代替服务端检查。
  1. 把 R1–R6 需求映射到接口、页面和验收用例;包含取消/未来事件、小样本、空结果、过期 session、数据延迟。
  1. 分解设计、前后端、集成、测试及交接工时,合计后给出资源与依赖假设。相对周次与实际工时必须一致,不凭空写合同上线日期。
  1. 写完整 proposal.md:目标范围、架构与数据流、契约、验收、工时、计划、运维和待确认项,附需求追踪 CSV 与可操作成果。

完整成果

冷链履约异常工作台交付提案

1. 目标、用户与范围

运营人员需要先处理未交付逾期订单,并追溯其原始事件。站点负责人需要看分层迟交指标,安全负责人需要可靠的导出与会话控制。第一期交付只读工作台、指标 API、事件时间线和受控导出设计;退款、写回调度、客户通知和员工绩效排名不在范围。

R1:按站点、服务等级与状态筛选订单,优先展示 overdue_open。R2:可打开订单事件及截止点,未来事件不参与历史指标。R3:取消/未到期不入成熟分母。R4:分服务比较和样本量提示。R5:服务端角色、站点及 session 检查。R6:加载、空结果、错误与数据延迟状态明确,保留刷新时间。

2. 信息结构与完整交互

页面先展示截止点、成熟数、迟交数和开放逾期数,再展示站点图与可筛选订单列表。三个筛选使用 AND 关系,结果数量与订单表同步。订单行展开显示 created、picked_up、delivered 或 cancelled 的完整时间线,明确哪些事件晚于复盘截止点。无结果显示“没有符合条件的订单”,可一键恢复全部。

资料包内工作台可直接筛选与展开全部 216 个订单。生产加载期间禁用重复请求,成功后更新时间;503 时保留上次成功快照并显示数据版本与失败原因,身份过期则清除敏感内容并转企业登录。离线工作台没有生产身份服务或真实导出权限,接口验收在下述集成范围内执行。

3. 架构与数据流

来源 A/B → 事件校验与冲突隔离 → 不可变标准事件层 → 按 as_of 聚合的订单视图 → 内网只读 API → 工作台。业务 orders 主表补充 route 和 due_at,事件只决定可见状态。记录 dataset_version、ingested_at 与 source_line,以便对账和重跑。新批次失败时不覆盖上一已核对版本。

企业身份服务颁发受控 session;网关验证 session,API 对每次请求再检查角色与站点范围。浏览器请求的 hub 不是授权依据。operator 仅可访问所属站点;supervisor 与受批次约束的 service 可按授权导出。数据服务不保存用户密码。导出写审计事件,包含 request_id、user、scope、rows、bytes 与 dataset_version,不记录密码和 session 密钥。

4. 接口契约

GET /v1/orders?hub=&service=&cohort=&as_of=&cursor=&limit=50:返回 items、next_cursor、total、as_of、dataset_version、updated_at。limit 为 1–100;cursor 为服务端稳定排序游标,同一次分页使用同一快照,避免刷新导致重复/漏项。未知筛选 400,无匹配 200 加空 items。

GET /v1/orders/{order_id}/events?as_of=:返回有序事件与 visible_at_cutoff。权限检查先于返回数据,不存在 404,无权限 403。GET /v1/metrics:返回成熟分母、迟交分子、分层结果和小样本状态,沿用同一快照。

POST /v1/exports:需 supervisor/service,body 含 scope、as_of、dataset_version;成功创建 202 与 job_id,完成后在授权范围内提供下载;operator 403。客户端提交 request_key 用于重复请求去重,服务端审计导出批次,不能以 UI 隐藏替代权限。

统一错误:400 参数、401 缺失/过期 session、403 无权限、404 不存在、409 快照不匹配、429 限流、503 数据源不可用。响应提供 request_id 与可显示的错误原因,不泄露凭据。

5. 需求到验收

R1:选择海港+express+overdue_open,仅出现匹配订单,恢复全部回到 216。R2:打开订单事件线,与标准事件逐条匹配;未来交付不改变历史状态。R3:216 = 12 取消 + 7 未到期 + 107 准时 + 80 已交付迟交 + 10 未交付逾期。成熟 197、迟交 90。R4:南湾 express n=4 显示待补样本,站点标准化值为空;目标差距 5/15 的边界正确。R5:operator 导出 403,过期 session 401,合法 supervisor 导出 202;operator 选择他站点仍 403。R6:空筛选、503、429、加载、恢复与更新时间逐项验收。

每条需求在 requirements-traceability.csv 映射到接口与用例。离线交互与算法测试能够检查资料成果;R5、生产错误与负载验收必须在后端接入后执行,不把本地页面当成生产权限实现。

6. 工作量与里程碑

工作项人时交付门禁
需求、口径与交互设计16R1–R6、身份协议、数据契约获确认
数据接入、聚合与快照28质量对账、未来事件及重跑测试通过
前端工作台与可访问性24筛选、时间线、空结果及键盘验收
API、权限与导出审计24401/403、站点隔离和批次审计通过
身份/网关集成与发布准备16客户接入、回退与监控准备完毕
集成、安全和 UAT 测试24R1–R6 全部验收,问题闭环
运维文档与交接8操作手册、值班和回退演练
合计140依赖满足后方可排期

计划由一位工程师每周投入 35 h,连续四个工作周完成 140 人时。W1:设计 16+数据 19;W2:数据 9+前端 24+API 2;W3:API 22+集成 13;W4:集成 3+测试 24+交接 8。周末与客户审批等待不计入工时;安全审查若排队则调整日历,不能压缩验收。工程能力与 35 h投入是假设,需负责人确认,未给定生产日期或合同金额。

7. 运维、支持与回退

监控新批次隔离率、快照更新时间、API 错误、越权拒绝及导出量。用工单记录影响站点、request_id、版本与复现步骤。严重访问故障由技术值班分诊,运营负责人确认业务影响;支持时段、响应目标、数据保留周期与费用另行确认,不承诺未商定 SLA。

回退先将读取切回上一核对快照,保留源数据与隔离记录;API 版本回退仍须保留新加的访问检查,不能为了恢复导出而开放 operator。恢复后以同口径复算 197/90 并对照版本,通知运营负责人确认。发布前另做备份与恢复演练。

8. 依赖和待确认项

客户需提供身份协议、允许角色/站点映射、网关访问、源接口可用性和留存要求。并发用户、数据到达延迟、刷新频率、导出上限、审计留存及支持时段在 W1 定稿。当前使用记录回放进行验收,不据此声称已处理生产流量或已改善履约指标。

下载文件操作完整工作台

参考答案

instructor/answers/api-contract.json 阅读完整文件下载文件
{
  "version": "1.0",
  "as_of": "2026-09-15T00:00:00Z",
  "dataset_version": "coldchain-v1",
  "routes": [
    {
      "method": "GET",
      "path": "/v1/orders",
      "query": [
        "hub",
        "service",
        "cohort",
        "as_of",
        "cursor",
        "limit"
      ],
      "limit": {
        "min": 1,
        "max": 100
      },
      "response": [
        "items",
        "total",
        "next_cursor",
        "as_of",
        "dataset_version",
        "updated_at"
      ],
      "errors": [
        400,
        401,
        403,
        409,
        429,
        503
      ]
    },
    {
      "method": "GET",
      "path": "/v1/orders/{order_id}/events",
      "response": [
        "events",
        "visible_at_cutoff"
      ],
      "errors": [
        401,
        403,
        404,
        503
      ]
    },
    {
      "method": "GET",
      "path": "/v1/metrics",
      "response": [
        "eligible",
        "late",
        "by_hub",
        "by_service",
        "sample_status"
      ],
      "errors": [
        400,
        401,
        403,
        409,
        503
      ]
    },
    {
      "method": "POST",
      "path": "/v1/exports",
      "roles": [
        "supervisor",
        "service"
      ],
      "body": [
        "scope",
        "as_of",
        "dataset_version",
        "request_key"
      ],
      "accepted_status": 202,
      "errors": [
        400,
        401,
        403,
        409,
        429,
        503
      ]
    }
  ]
}
instructor/answers/requirements-traceability.csv 阅读完整文件下载文件
requirementoutcomeendpointtestverification
R1组合筛选与逾期优先GET /v1/orders海港+express+overdue_open;恢复216离线交互已实现;生产分页待集成
R2事件追溯与历史截止GET /v1/orders/{id}/events未来交付不改变截止点状态离线时间线及算法测试
R3履约指标分母GET /v1/metrics成熟197、迟交90完整复算与独立计数
R4小样本与服务结构GET /v1/metrics南湾express n4;站点标准化为空公式及边界测试
R5授权与会话POST /v1/exportsoperator403;过期401;合法202契约与调查测试;无生产后端
R6空结果与错误恢复所有接口无结果恢复;503保留快照;429重试离线空结果可查;网络错误待集成
完整参考实现 阅读完整文件下载文件
"""Reference implementation for the Ape Intern cold-chain operations lab."""
import csv,json
from collections import defaultdict,Counter
from datetime import datetime,timezone
from pathlib import Path
from urllib.parse import urlparse,parse_qs
UTC=timezone.utc
KINDS={'OPEN':'created','COLLECT':'picked_up','DROP':'delivered','VOID':'cancelled'}
HUBS={'海港','东城','西岭','南湾'}
def parse_time(value):
    t=datetime.fromisoformat(value.replace('Z','+00:00'))
    if t.tzinfo is None:raise ValueError('timezone_required')
    return t.astimezone(UTC)
def iso(t):return t.isoformat(timespec='seconds').replace('+00:00','Z')
def readcsv(p):
    with Path(p).open(encoding='utf-8-sig',newline='') as f:return list(csv.DictReader(f))
def writecsv(p,rows,fields=None):
    rows=list(rows)
    with Path(p).open('w',encoding='utf-8-sig',newline='') as f:
        w=csv.DictWriter(f,fieldnames=fields or list(rows[0]));w.writeheader();w.writerows(rows)
def dump(p,value):Path(p).write_text(json.dumps(value,ensure_ascii=False,indent=2)+'\n')
def _normalize(record,source):
    if source=='A':
        e=dict(event_id=record['event_id'],order_id=record['order_ref'],hub=record['hub'],service=record['service'],kind=record['event'],happened_at=iso(parse_time(record['event_time'])))
    else:
        ms=record['at_ms']
        if type(ms) is not int:raise ValueError('epoch_must_be_integer')
        e=dict(event_id=record['id'],order_id=record['shipment']['number'],hub=record['shipment']['station'],service=record['shipment']['product'],kind=KINDS[record['action']],happened_at=iso(datetime.fromtimestamp(ms/1000,UTC)))
    if e['kind'] not in KINDS.values():raise ValueError('unsupported_event')
    if e['hub'] not in HUBS or e['service'] not in {'standard','express'}:raise ValueError('unknown_dimension')
    if not e['event_id'] or not e['order_id']:raise ValueError('empty_key')
    return e

def normalize(record,source):
    try:return _normalize(record,source)
    except (KeyError,TypeError,OverflowError) as error:raise ValueError(str(error).strip("'")) from error

def ingest(data):
    grouped=defaultdict(list);rejected=[];duplicates=[]
    for source,name in [('A','dispatch-a.jsonl'),('B','courier-b.jsonl')]:
        for line,text in enumerate((data/name).read_text().splitlines(),1):
            loc={'source':name,'line':line}
            try:
                event=normalize(json.loads(text),source);grouped[event['event_id']].append((event,loc))
            except (ValueError,KeyError,TypeError,OverflowError) as ex:
                rejected.append(dict(loc,reason=str(ex).strip("'")))
    accepted=[]
    for eid,items in grouped.items():
        distinct={json.dumps(e,sort_keys=True,ensure_ascii=False) for e,loc in items}
        if len(distinct)>1:
            rejected.extend(dict(loc,reason='immutable_id_conflict') for e,loc in items);continue
        accepted.append(items[0][0])
        duplicates.extend(dict(loc,event_id=eid,reason='exact_replay') for e,loc in items[1:])
    accepted.sort(key=lambda e:(e['happened_at'],e['event_id']))
    return accepted,rejected,duplicates

def classify_order(order,events,cutoff):
    # Only facts available at cutoff can influence a retrospective result.
    visible=[e for e in events if parse_time(e['happened_at'])<=cutoff]
    visible.sort(key=lambda e:parse_time(e['happened_at']))
    delivered=[parse_time(e['happened_at']) for e in visible if e['kind']=='delivered']
    cancelled=any(e['kind']=='cancelled' for e in visible)
    due=parse_time(order['due_at'])
    if cancelled:state='cancelled'
    elif due>cutoff:state='not_mature'
    elif not delivered:state='overdue_open'
    elif min(delivered)>due:state='delivered_late'
    else:state='on_time'
    delay=round((min(delivered)-due).total_seconds()/60) if state=='delivered_late' else 0
    overdue=round((cutoff-due).total_seconds()/60) if state=='overdue_open' else 0
    return dict(order,cohort=state,late_minutes=delay,overdue_minutes=overdue)

def aggregate(rows,keys):
    groups=defaultdict(list)
    for row in rows:groups[tuple(row[k] for k in keys)].append(row)
    result=[]
    for dims,records in sorted(groups.items()):
        counts=Counter(r['cohort'] for r in records)
        eligible=sum(counts[x] for x in ['on_time','delivered_late','overdue_open'])
        late=counts['delivered_late']+counts['overdue_open']
        result.append(dict(zip(keys,dims),total=len(records),eligible=eligible,late=late,late_rate=round(late/eligible,6) if eligible else None,on_time=counts['on_time'],delivered_late=counts['delivered_late'],overdue_open=counts['overdue_open'],cancelled=counts['cancelled'],not_mature=counts['not_mature'],delivered_late_minutes=sum(r['late_minutes'] for r in records),open_overdue_minutes=sum(r['overdue_minutes'] for r in records)))
    return result

def service_band(rate,n,rules):
    if n<rules['min_sample']:return '待补样本'
    gap=(rate-rules['late_target'])*100
    if gap>rules['priority_gap_pp']:return '优先处理'
    if gap>rules['review_gap_pp']:return '需要复核'
    return '达到阈值'
def fairness(hub_tiers,rules):
    rows=[]
    for x in hub_tiers:
        rate=x['late_rate'];rows.append(dict(hub=x['hub'],service=x['service'],eligible=x['eligible'],late=x['late'],late_rate=rate,target=rules['late_target'],gap_pp=round((rate-rules['late_target'])*100,3) if rate is not None else None,review=service_band(rate,x['eligible'],rules)))
    standardized=[]
    for hub in sorted(HUBS):
        parts=[r for r in rows if r['hub']==hub]
        enough=len(parts)==2 and all(r['eligible']>=rules['min_sample'] for r in parts)
        value=sum(r['late_rate']*rules[r['service']+'_weight'] for r in parts) if enough else None
        standardized.append(dict(hub=hub,standardized_late_rate=round(value,6) if value is not None else None,status='可比较' if enough else '待补样本'))
    return rows,standardized

def investigate(logs,policy):
    logins={};findings=[]
    for row in sorted(logs,key=lambda r:(r['at'],r['request_id'])):
        t=parse_time(row['at']);status=int(row['status']);route=urlparse(row['path']);query=parse_qs(route.query)
        if route.path=='/login' and status==200:logins[(row['user'],row['session'])]=t;continue
        if status!=200:continue
        types=[]
        if route.path=='/export' and row['role'] not in policy['export_roles']:types.append('unauthorised_export')
        hub=query.get('hub',[''])[0]
        if row['role']=='operator' and hub and hub!=policy['operator_hub'].get(row['user']):types.append('hub_scope_violation')
        login=logins.get((row['user'],row['session']))
        if login is None or (t-login).total_seconds()>policy['session_ttl_minutes']*60:types.append('expired_or_missing_session')
        if types:findings.append(dict(request_id=row['request_id'],at=row['at'],user=row['user'],session=row['session'],finding=';'.join(types),status=status,rows=int(row['rows']),bytes=int(row['bytes'])))
    return findings

def solve(data,out):
    data=Path(data);out=Path(out);out.mkdir(parents=True,exist_ok=True)
    events,rejects,dups=ingest(data)
    (out/'canonical-events.jsonl').write_text(''.join(json.dumps(e,ensure_ascii=False)+'\n' for e in events))
    writecsv(out/'rejected.csv',rejects);writecsv(out/'duplicates.csv',dups)
    rules=json.loads((data/'rules.json').read_text());cutoff=parse_time(rules['cutoff'])
    by_order=defaultdict(list)
    for e in events:by_order[e['order_id']].append(e)
    orders=readcsv(data/'orders.csv')
    records=[classify_order(o,by_order[o['order_id']],cutoff) for o in orders]
    writecsv(out/'order-review.csv',records)
    hubs=aggregate(records,['hub']);tiers=aggregate(records,['hub','service']);routes=aggregate(records,['route'])
    writecsv(out/'hub-metrics.csv',hubs);writecsv(out/'route-metrics.csv',routes)
    bands,std=fairness(tiers,rules)
    writecsv(out/'service-review.csv',bands);writecsv(out/'standardized-comparison.csv',std)
    findings=investigate(readcsv(data/'access-log.csv'),json.loads((data/'access-policy.json').read_text()))
    writecsv(out/'security-findings.csv',findings)
    summary=dict(orders=len(orders),accepted_events=len(events),rejected=len(rejects),duplicates=len(dups),cohorts=dict(Counter(r['cohort'] for r in records)),hubs=hubs,service_review=bands,standardized=std,security=dict(flagged_requests=len(findings),potential_export_rows=sum(f['rows'] for f in findings if 'unauthorised_export' in f['finding']),potential_export_bytes=sum(f['bytes'] for f in findings if 'unauthorised_export' in f['finding']),findings=findings))
    dump(out/'results.json',summary)
    return summary
if __name__=='__main__':
    import sys
    print(json.dumps(solve(sys.argv[1],sys.argv[2]),ensure_ascii=False,indent=2))

把“后端会校验”写进提案不等于后端已经实现;离线工作台用于检查阅读与筛选体验,生产集成仍按验收契约交付。

每项 20 分,14 分及以上且没有关键口径错误再进入下一次 Review。原始数据被改写、静默丢记录、分母含未到期、把 401 算成泄露、用小样本硬排站点或把前端筛选当授权,均须修正后再验收。

  • 证据到需求闭环 5 分
  • 架构与权限边界 5 分
  • 估算与依赖一致 5 分
  • 完整提案与可操作成果 5 分