refactor(valuation): 重构评估状态逻辑并添加创建时间筛选

统一评估状态为 pending/completed 并兼容旧状态
添加创建时间范围筛选条件
移除发票状态中的 rejected 选项
更新前端路由配置
This commit is contained in:
邹方成 2025-11-26 17:05:22 +08:00
parent 9359666805
commit df7ff7af23
10 changed files with 30 additions and 19 deletions

View File

@ -203,7 +203,7 @@ async def _perform_valuation_calculation(user_id: int, data: UserValuationCreate
},
'market_data': list(input_data.get('market_data', {}).keys()),
},
status='success'
status='pending'
)
result = await valuation_controller.update(valuation_id, update_data)
logger.info(

View File

@ -106,7 +106,7 @@ async def delete_invoice(id: int = Query(...)):
@invoice_router.post("/update-status", summary="更新发票状态", response_model=BasicResponse[InvoiceOut], dependencies=[DependAuth, DependPermission])
async def update_invoice_status(data: UpdateStatus):
"""
更新发票状态pending|invoiced|rejected|refunded
更新发票状态pending|invoiced|refunded
"""
out = await invoice_controller.update_status(data)
return Success(data=out or {}, msg="更新成功" if out else "未找到")

View File

@ -92,6 +92,8 @@ async def get_valuations(
submitted_end: Optional[str] = Query(None, description="提交时间结束毫秒或ISO"),
audited_start: Optional[str] = Query(None, description="审核时间开始证书修改时间毫秒或ISO"),
audited_end: Optional[str] = Query(None, description="审核时间结束证书修改时间毫秒或ISO"),
create_start: Optional[str] = Query(None, description="创建时间开始毫秒或ISO"),
create_end: Optional[str] = Query(None, description="创建时间结束毫秒或ISO"),
page: int = Query(1, ge=1, description="页码"),
size: int = Query(10, ge=1, le=100, description="每页数量")
):
@ -108,6 +110,8 @@ async def get_valuations(
submitted_end=submitted_end,
audited_start=audited_start,
audited_end=audited_end,
create_start=create_start,
create_end=create_end,
page=page,
size=size
)

View File

@ -22,7 +22,7 @@ class UserValuationController:
"""用户创建估值评估"""
valuation_data = data.model_dump()
valuation_data['user_id'] = user_id
valuation_data['status'] = "success" # 根据计算结果显示设置状态
valuation_data['status'] = status
# 添加计算结果到数据库
if calculation_result:

View File

@ -159,9 +159,17 @@ class ValuationController:
if query.is_active is not None:
queryset = queryset.filter(is_active=query.is_active)
# 添加状态筛选
# 添加状态筛选(支持 completed 聚合以及旧值兼容)
if hasattr(query, 'status') and query.status:
queryset = queryset.filter(status=query.status)
s = query.status
if s == 'completed':
queryset = queryset.filter(status__in=['success'])
elif s == 'approved':
queryset = queryset.filter(status='success')
elif s == 'rejected':
queryset = queryset.filter(status='fail')
else:
queryset = queryset.filter(status=s)
if getattr(query, 'phone', None):
queryset = queryset.filter(user__phone__icontains=query.phone)
@ -180,8 +188,8 @@ class ValuationController:
except Exception:
return None
s_dt = _parse_time(getattr(query, 'submitted_start', None))
e_dt = _parse_time(getattr(query, 'submitted_end', None))
s_dt = _parse_time(getattr(query, 'submitted_start', None) or getattr(query, 'create_start', None))
e_dt = _parse_time(getattr(query, 'submitted_end', None) or getattr(query, 'create_end', None))
if s_dt:
queryset = queryset.filter(created_at__gte=s_dt)
if e_dt:

View File

@ -30,7 +30,7 @@ class Invoice(BaseModel, TimestampMixin):
register_phone = fields.CharField(max_length=32, description="注册电话")
bank_name = fields.CharField(max_length=128, description="开户银行")
bank_account = fields.CharField(max_length=64, description="银行账号")
status = fields.CharField(max_length=16, description="状态: pending|invoiced|rejected|refunded", index=True, default="pending")
status = fields.CharField(max_length=16, description="状态: pending|invoiced|refunded", index=True, default="pending")
app_user_id = fields.IntField(null=True, description="App用户ID", index=True)
header = fields.ForeignKeyField("models.InvoiceHeader", related_name="invoices", null=True, description="抬头关联")
wechat = fields.CharField(max_length=64, null=True, description="微信号", index=True)

View File

@ -82,7 +82,7 @@ class ValuationAssessment(Model):
# 系统字段
user = fields.ForeignKeyField("models.AppUser", related_name="valuations", description="提交用户")
status = fields.CharField(max_length=20, default="success", description="评估状态: pending(待审核), success(已通过), fail(已拒绝)")
status = fields.CharField(max_length=20, default="pending", description="评估状态: pending(待审核), approved(已完成)")
admin_notes = fields.TextField(null=True, description="管理员备注")
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
updated_at = fields.DatetimeField(auto_now=True, description="更新时间")

View File

@ -97,7 +97,7 @@ class InvoiceList(BaseModel):
class UpdateStatus(BaseModel):
id: int
status: str = Field(..., pattern=r"^(pending|invoiced|rejected|refunded)$")
status: str = Field(..., pattern=r"^(pending|invoiced|refunded)$")
class UpdateType(BaseModel):

View File

@ -325,11 +325,13 @@ class ValuationAssessmentQuery(BaseModel):
institution: Optional[str] = Field(None, description="所属机构")
industry: Optional[str] = Field(None, description="所属行业")
heritage_level: Optional[str] = Field(None, description="非遗等级")
status: Optional[str] = Field(None, description="评估状态: pending(待审核), approved(已通过), rejected(已拒绝)")
status: Optional[str] = Field(None, description="评估状态: pending(待审核), completed(已完成)")
is_active: Optional[bool] = Field(None, description="是否激活")
phone: Optional[str] = Field(None, description="手机号模糊查询")
submitted_start: Optional[str] = Field(None, description="提交时间开始毫秒时间戳或ISO字符串")
submitted_end: Optional[str] = Field(None, description="提交时间结束毫秒时间戳或ISO字符串")
create_start: Optional[str] = Field(None, description="创建时间开始毫秒时间戳或ISO字符串")
create_end: Optional[str] = Field(None, description="创建时间结束毫秒时间戳或ISO字符串")
audited_start: Optional[str] = Field(None, description="审核时间开始证书修改时间毫秒时间戳或ISO字符串")
audited_end: Optional[str] = Field(None, description="审核时间结束证书修改时间毫秒时间戳或ISO字符串")
page: int = Field(1, ge=1, description="页码")

View File

@ -21,14 +21,11 @@ server {
index index.html index.htm;
try_files $uri /index.html;
}
# PC 前端(/pc/ 前缀)
location = /pc {
return 302 /pc/;
}
location ^~ /pc/ {
alias /opt/vue-fastapi-admin/web1/dist/;
index index.html;
try_files $uri $uri/ /index.html;
root /opt/vue-fastapi-admin/web1/dist;
index index.html index.htm;
try_files $uri /index.html;
}
location ^~ /api/ {
proxy_pass http://127.0.0.1:9999;
@ -36,4 +33,4 @@ server {
proxy_set_header X-Real-IP $remote_addr;
}
}
}