feat(borrow): 拒收须告知发起方(责任回到他手上,不能静默)
背景
----
双向握手补上了「接收人确认」,却只做了单向告知:接收人能看到待办,发起方却
对结果一无所知。**被拒绝时物品责任仍在发起方手上** —— 他若不主动查列表,
就会误以为已经交接出去,责任链出现静默断点。
(ACCEPTED 不需要告知:东西已经交出去了,发起方无需动作。)
改动
----
· trans_borrow_transfer 新增 reject_seen_at(NULL 且 REJECTED = 尚未告知)。
★ 为什么需要持久标记而不是前端去重:换台电脑、换个浏览器就会重新提醒;
而这条信息的分量(责任归属)值得一个持久标记。
★ 存量已拒绝的流水一律标记为已告知:它们产生于本功能上线之前,
追溯提醒只会打扰(实测仅 1 条:#22,验收时的测试数据)。
· get_unseen_rejects(user_id):返回「我发起、被拒、尚未告知我」的转交,
并批量解析物料名 —— 只说「某笔转交被拒」发起方仍不知是哪件东西还在
自己手上,必须让他一眼认出来。
· ack_rejects(user_id, ids):发起方确认后写 reject_seen_at,幂等。
· GET .../transfer/pending-count 的响应并入 rejects:与待接收数量共用同一次
轮询,前端不必多打一个请求。
· POST .../transfer/reject-ack:无 permission_required,同 accept/reject。
顺带补一处同源显示缺口
----
流转时间线里,被拒绝的转交与成功的长得一模一样 —— 发起方翻记录时同样会
误判。现将转交状态一并带出时间线事件。
验证(15 项断言全通过)
----
发起方收到待告知的拒绝(含物料名/接收人/拒绝原因);接收人与无关人看不到;
ack 后不再提醒且幂等;ACCEPTED 不产生告知;None/非法 user_id 均安全返回;
库存零副作用、数据零残留。
This commit is contained in:
@ -752,18 +752,45 @@ def get_pending_transfer_count():
|
||||
<int:transfer_id>,Werkzeug 会按转换器精确分派。
|
||||
"""
|
||||
try:
|
||||
count = TransService.count_pending_transfers(get_jwt_identity())
|
||||
identity = get_jwt_identity()
|
||||
count = TransService.count_pending_transfers(identity)
|
||||
# ★ 一并返回「我发起、被对方拒绝、尚未告知我」的转交:
|
||||
# 被拒时物品责任仍在我手上,不告知就会误以为已经交接出去。
|
||||
# 与待接收数量合并进同一次轮询,避免前端多打一个请求。
|
||||
rejects = TransService.get_unseen_rejects(identity)
|
||||
return jsonify({
|
||||
'code': 200,
|
||||
'msg': 'success',
|
||||
'count': count,
|
||||
'data': {'count': count},
|
||||
'rejects': rejects,
|
||||
'data': {'count': count, 'rejects': rejects},
|
||||
}), 200
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500
|
||||
|
||||
|
||||
# --- 确认已知悉「转交被拒」(清除发起方的待告知提醒)---
|
||||
@trans_bp.route('/borrow/transfer/reject-ack', methods=['POST'])
|
||||
@jwt_required()
|
||||
def ack_transfer_rejects():
|
||||
"""
|
||||
发起方在前端看到「您的转交被拒绝」提醒并确认后调用,写 reject_seen_at。
|
||||
|
||||
★ 为什么需要这个接口:提醒必须能标记「已告知」,否则发起方每次登录都会
|
||||
收到同一条 —— 从「提醒」退化成「骚扰」。
|
||||
★ 无 permission_required:同 accept/reject,是员工处置自己名下资产。
|
||||
请求体:{ ids: [12, 13] },留空表示该用户全部待告知的拒绝。
|
||||
"""
|
||||
try:
|
||||
data = request.get_json() or {}
|
||||
marked = TransService.ack_rejects(get_jwt_identity(), data.get('ids'))
|
||||
return jsonify({'code': 200, 'msg': 'success', 'data': {'marked': marked}}), 200
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500
|
||||
|
||||
|
||||
# --- 借出单的流转历史(转交链 + 逐次归还)---
|
||||
@trans_bp.route('/borrow/<int:borrow_id>/history', methods=['GET'])
|
||||
@jwt_required()
|
||||
|
||||
Reference in New Issue
Block a user