481 lines
12 KiB
JavaScript
481 lines
12 KiB
JavaScript
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
|
|
}
|