feat: 借库审批支持手动完结——已通过(status=1)单可强制完结,库管/主管/超管可见
This commit is contained in:
@ -277,6 +277,29 @@ def approve_borrow_request(request_id):
|
||||
return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500
|
||||
|
||||
|
||||
@trans_bp.route('/borrow/request/<int:request_id>/close', methods=['POST'])
|
||||
@jwt_required()
|
||||
@permission_required('op_borrow_approval')
|
||||
def close_borrow_request(request_id):
|
||||
"""
|
||||
手动完结已通过的借库审批单(status 1-已通过 → 3-已完成)
|
||||
参照出库审批的完结逻辑,供库管/主管在未走扫码借出时强制完结
|
||||
"""
|
||||
try:
|
||||
user_id, _ = get_current_user_info()
|
||||
if not user_id:
|
||||
return jsonify({'code': 401, 'msg': '用户未登录'}), 401
|
||||
|
||||
success, message, approval = BorrowApprovalService.mark_completed(request_id)
|
||||
if not success:
|
||||
return jsonify({'code': 400, 'msg': message}), 400
|
||||
|
||||
return jsonify({'code': 200, 'msg': message, 'data': approval.to_dict() if approval else None}), 200
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500
|
||||
|
||||
|
||||
# --- 获取借库审批单列表 ---
|
||||
@trans_bp.route('/borrow/request', methods=['GET'])
|
||||
@jwt_required()
|
||||
|
||||
@ -174,6 +174,14 @@ export function approveBorrowRequest(id: number, data: { action: 'approve' | 're
|
||||
})
|
||||
}
|
||||
|
||||
// 手动完结已通过的借库审批单(status 1 → 3)
|
||||
export function closeBorrowRequest(id: number) {
|
||||
return request({
|
||||
url: `/v1/transactions/borrow/request/${id}/close`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 借库选单专用库存列表(独立权限 op_borrow_apply)
|
||||
*/
|
||||
|
||||
@ -137,6 +137,19 @@
|
||||
驳回
|
||||
</el-button>
|
||||
</template>
|
||||
<!-- ★ 已通过的申请单:库管/主管可手动完结 -->
|
||||
<template v-else-if="row.status === 1">
|
||||
<el-button
|
||||
v-if="canCompleteRequest"
|
||||
type="danger"
|
||||
plain
|
||||
size="small"
|
||||
:loading="row._closing"
|
||||
@click="handleComplete(row)"
|
||||
>
|
||||
完结
|
||||
</el-button>
|
||||
</template>
|
||||
<span v-else style="color: #c0c4cc;">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -182,14 +195,44 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { Refresh, Warning } from '@element-plus/icons-vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { getBorrowApprovalList, approveBorrowRequest } from '@/api/transaction'
|
||||
import { getBorrowApprovalList, approveBorrowRequest, closeBorrowRequest } from '@/api/transaction'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
// ★ 完结权限:超管 / 审批操作(op_borrow_approval:operation) / 借库执行(op_borrow:operation)
|
||||
const canCompleteRequest = computed(() =>
|
||||
userStore.role === 'SUPER_ADMIN' ||
|
||||
userStore.hasPermission('op_borrow_approval:operation') ||
|
||||
userStore.hasPermission('op_borrow:operation') ||
|
||||
userStore.username === 'IRIS'
|
||||
)
|
||||
|
||||
// ★ 手动完结已通过的借库审批单(status 1 → 3,仿出库审批)
|
||||
const handleComplete = (row: any) => {
|
||||
ElMessageBox.confirm(
|
||||
`确定强制完结审批单【${row.request_no}】吗?\n\n完结后该单标记为「已完成」,不可再扫码借出。`,
|
||||
'⚠️ 强制完结确认',
|
||||
{ confirmButtonText: '确认完结', cancelButtonText: '取消', type: 'warning' }
|
||||
)
|
||||
.then(async () => {
|
||||
row._closing = true
|
||||
try {
|
||||
await closeBorrowRequest(row.id)
|
||||
ElMessage.success('审批单已完结')
|
||||
fetchData()
|
||||
} catch (e: any) {
|
||||
ElMessage.error(e?.response?.data?.msg || e?.msg || e?.message || '完结失败')
|
||||
} finally {
|
||||
row._closing = false
|
||||
}
|
||||
})
|
||||
.catch(() => {})
|
||||
}
|
||||
|
||||
// --- 状态 ---
|
||||
const list = ref<any[]>([])
|
||||
const loading = ref(false)
|
||||
|
||||
Reference in New Issue
Block a user