Files
nxxmdata/bank-backend/controllers/completedSupervisionController.js

481 lines
12 KiB
JavaScript
Raw Normal View History

2025-09-24 17:49:32 +08:00
const { CompletedSupervision, User } = require('../models')
const { Op } = require('sequelize')
// 获取监管任务已结项列表
const getCompletedSupervisions = async (req, res) => {
try {
const {
page = 1,
limit = 10,
search = '',
contractNumber = '',
settlementStatus = ''
} = req.query
const offset = (page - 1) * limit
const where = {}
// 搜索条件
if (search) {
where[Op.or] = [
{ applicationNumber: { [Op.like]: `%${search}%` } },
{ customerName: { [Op.like]: `%${search}%` } },
{ productName: { [Op.like]: `%${search}%` } }
]
}
// 合同编号筛选
if (contractNumber) {
where.contractNumber = contractNumber
}
// 结清状态筛选
if (settlementStatus) {
where.settlementStatus = settlementStatus
}
const { count, rows } = await CompletedSupervision.findAndCountAll({
where,
include: [
{
model: User,
as: 'creator',
attributes: ['id', 'username', 'real_name']
},
{
model: User,
as: 'updater',
attributes: ['id', 'username', 'real_name']
}
],
order: [['importTime', 'DESC']],
limit: parseInt(limit),
offset: parseInt(offset)
})
const totalPages = Math.ceil(count / limit)
res.json({
success: true,
message: '获取监管任务已结项列表成功',
data: {
tasks: rows,
pagination: {
current: parseInt(page),
pageSize: parseInt(limit),
total: count,
totalPages,
hasNextPage: parseInt(page) < totalPages,
hasPrevPage: parseInt(page) > 1
}
}
})
} catch (error) {
console.error('获取监管任务已结项列表失败:', error)
res.status(500).json({
success: false,
message: '获取监管任务已结项列表失败',
error: error.message
})
}
}
// 根据ID获取监管任务已结项详情
const getCompletedSupervisionById = async (req, res) => {
try {
const { id } = req.params
const task = await CompletedSupervision.findByPk(id, {
include: [
{
model: User,
as: 'creator',
attributes: ['id', 'username', 'real_name']
},
{
model: User,
as: 'updater',
attributes: ['id', 'username', 'real_name']
}
]
})
if (!task) {
return res.status(404).json({
success: false,
message: '监管任务已结项不存在'
})
}
res.json({
success: true,
message: '获取监管任务已结项详情成功',
data: task
})
} catch (error) {
console.error('获取监管任务已结项详情失败:', error)
res.status(500).json({
success: false,
message: '获取监管任务已结项详情失败',
error: error.message
})
}
}
// 创建监管任务已结项
const createCompletedSupervision = async (req, res) => {
try {
const {
applicationNumber,
contractNumber,
productName,
customerName,
idType,
idNumber,
assetType,
assetQuantity,
totalRepaymentPeriods,
settlementStatus,
settlementDate,
settlementAmount,
remainingAmount,
settlementNotes
} = req.body
// 验证必填字段
const requiredFields = [
'applicationNumber', 'contractNumber', 'productName',
'customerName', 'idType', 'idNumber', 'assetType',
'assetQuantity', 'totalRepaymentPeriods'
]
for (const field of requiredFields) {
if (!req.body[field]) {
return res.status(400).json({
success: false,
message: `${field} 是必填字段`
})
}
}
// 验证申请单号唯一性
const existingTask = await CompletedSupervision.findOne({
where: { applicationNumber }
})
if (existingTask) {
return res.status(400).json({
success: false,
message: '申请单号已存在'
})
}
// 验证状态枚举值
const validStatuses = ['settled', 'unsettled', 'partial']
if (settlementStatus && !validStatuses.includes(settlementStatus)) {
return res.status(400).json({
success: false,
message: '结清状态值无效'
})
}
// 验证证件类型枚举值
const validIdTypes = ['ID_CARD', 'PASSPORT', 'OTHER']
if (!validIdTypes.includes(idType)) {
return res.status(400).json({
success: false,
message: '证件类型值无效'
})
}
const task = await CompletedSupervision.create({
applicationNumber,
contractNumber,
productName,
customerName,
idType,
idNumber,
assetType,
assetQuantity,
totalRepaymentPeriods,
settlementStatus: settlementStatus || 'unsettled',
settlementDate: settlementDate || null,
importTime: req.body.importTime || new Date(),
settlementAmount: settlementAmount || null,
remainingAmount: remainingAmount || null,
settlementNotes: settlementNotes || null,
createdBy: req.user.id
})
// 获取创建的任务详情(包含关联数据)
const createdTask = await CompletedSupervision.findByPk(task.id, {
include: [
{
model: User,
as: 'creator',
attributes: ['id', 'username', 'real_name']
}
]
})
res.status(201).json({
success: true,
message: '创建监管任务已结项成功',
data: createdTask
})
} catch (error) {
console.error('创建监管任务已结项失败:', error)
res.status(500).json({
success: false,
message: '创建监管任务已结项失败',
error: error.message
})
}
}
// 更新监管任务已结项
const updateCompletedSupervision = async (req, res) => {
try {
const { id } = req.params
const updateData = req.body
const task = await CompletedSupervision.findByPk(id)
if (!task) {
return res.status(404).json({
success: false,
message: '监管任务已结项不存在'
})
}
// 验证状态枚举值
if (updateData.settlementStatus) {
const validStatuses = ['settled', 'unsettled', 'partial']
if (!validStatuses.includes(updateData.settlementStatus)) {
return res.status(400).json({
success: false,
message: '结清状态值无效'
})
}
}
// 验证证件类型枚举值
if (updateData.idType) {
const validIdTypes = ['ID_CARD', 'PASSPORT', 'OTHER']
if (!validIdTypes.includes(updateData.idType)) {
return res.status(400).json({
success: false,
message: '证件类型值无效'
})
}
}
// 如果申请单号有变化,检查唯一性
if (updateData.applicationNumber && updateData.applicationNumber !== task.applicationNumber) {
const existingTask = await CompletedSupervision.findOne({
where: {
applicationNumber: updateData.applicationNumber,
id: { [Op.ne]: id }
}
})
if (existingTask) {
return res.status(400).json({
success: false,
message: '申请单号已存在'
})
}
}
await task.update({
...updateData,
updatedBy: req.user.id
})
// 获取更新后的任务详情
const updatedTask = await CompletedSupervision.findByPk(id, {
include: [
{
model: User,
as: 'creator',
attributes: ['id', 'username', 'real_name']
},
{
model: User,
as: 'updater',
attributes: ['id', 'username', 'real_name']
}
]
})
res.json({
success: true,
message: '更新监管任务已结项成功',
data: updatedTask
})
} catch (error) {
console.error('更新监管任务已结项失败:', error)
res.status(500).json({
success: false,
message: '更新监管任务已结项失败',
error: error.message
})
}
}
// 删除监管任务已结项
const deleteCompletedSupervision = async (req, res) => {
try {
const { id } = req.params
const task = await CompletedSupervision.findByPk(id)
if (!task) {
return res.status(404).json({
success: false,
message: '监管任务已结项不存在'
})
}
await task.destroy()
res.json({
success: true,
message: '删除监管任务已结项成功'
})
} catch (error) {
console.error('删除监管任务已结项失败:', error)
res.status(500).json({
success: false,
message: '删除监管任务已结项失败',
error: error.message
})
}
}
// 获取监管任务已结项统计信息
const getCompletedSupervisionStats = async (req, res) => {
try {
const stats = await CompletedSupervision.findAll({
attributes: [
'settlementStatus',
[CompletedSupervision.sequelize.fn('COUNT', CompletedSupervision.sequelize.col('id')), 'count']
],
group: ['settlementStatus'],
raw: true
})
const totalCount = await CompletedSupervision.count()
res.json({
success: true,
message: '获取监管任务已结项统计成功',
data: {
stats,
totalCount
}
})
} catch (error) {
console.error('获取监管任务已结项统计失败:', error)
res.status(500).json({
success: false,
message: '获取监管任务已结项统计失败',
error: error.message
})
}
}
// 批量更新结清状态
const batchUpdateStatus = async (req, res) => {
try {
const { ids, settlementStatus } = req.body
if (!Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
success: false,
message: '请选择要更新的任务'
})
}
if (!settlementStatus) {
return res.status(400).json({
success: false,
message: '请选择要更新的状态'
})
}
const validStatuses = ['settled', 'unsettled', 'partial']
if (!validStatuses.includes(settlementStatus)) {
return res.status(400).json({
success: false,
message: '结清状态值无效'
})
}
const updateData = {
settlementStatus,
updatedBy: req.user.id
}
// 如果状态是已结清,设置结清日期
if (settlementStatus === 'settled') {
updateData.settlementDate = new Date()
}
await CompletedSupervision.update(updateData, {
where: { id: { [Op.in]: ids } }
})
res.json({
success: true,
message: '批量更新结清状态成功'
})
} catch (error) {
console.error('批量更新结清状态失败:', error)
res.status(500).json({
success: false,
message: '批量更新结清状态失败',
error: error.message
})
}
}
// 批量删除监管任务已结项
const batchDelete = async (req, res) => {
try {
const { ids } = req.body
if (!Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
success: false,
message: '请选择要删除的任务'
})
}
await CompletedSupervision.destroy({
where: { id: { [Op.in]: ids } }
})
res.json({
success: true,
message: '批量删除监管任务已结项成功'
})
} catch (error) {
console.error('批量删除监管任务已结项失败:', error)
res.status(500).json({
success: false,
message: '批量删除监管任务已结项失败',
error: error.message
})
}
}
module.exports = {
getCompletedSupervisions,
getCompletedSupervisionById,
createCompletedSupervision,
updateCompletedSupervision,
deleteCompletedSupervision,
getCompletedSupervisionStats,
batchUpdateStatus,
batchDelete
}