From 5b615473e09cbaff3fcb414684faf2d19fe37525 Mon Sep 17 00:00:00 2001
From: xuqiuyun <1113560936@qq.com>
Date: Sun, 28 Sep 2025 17:58:43 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B9=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
admin-system/.env.production | 2 +-
admin-system/default.conf | 11 +-
admin-system/public/login.html | 16 +
admin-system/src/router/index.js | 8 +-
admin-system/src/views/SmartCollarAlert.vue | 4 +-
admin-system/src/views/SmartHost.vue | 9 +-
admin-system/vite.config.js | 27 +-
backend/routes/smart-devices.js | 29 +-
insurance_admin-system/src/utils/request.js | 22 +-
.../src/views/ApplicationManagement.vue | 99 +--
.../src/views/ClaimManagement.vue | 562 ++++++++++----
.../src/views/InsuranceTypeManagement.vue | 476 +++++++-----
.../src/views/PolicyManagement.vue | 7 +-
insurance_backend/config/swagger.js | 79 ++
.../controllers/insuranceTypeController.js | 85 ++-
.../controllers/livestockClaimController.js | 217 +++++-
.../docs/insurance-type-api-examples.md | 308 ++++++++
.../docs/insurance-type-api.yaml | 690 ++++++++++++++++++
insurance_backend/models/InsuranceType.js | 32 +
insurance_backend/models/LivestockClaim.js | 85 ++-
insurance_backend/models/index.js | 2 +-
insurance_backend/routes/insuranceTypes.js | 318 +++++++-
insurance_backend/routes/livestockClaims.js | 25 +-
insurance_backend/test_params.js | 23 +
.../tests/insurance-type-api-test.js | 282 +++++++
mini_program/farm-monitor-dashboard/app.json | 4 +
.../pages/alert/alert.js | 133 +++-
.../pages/alert/alert.wxml | 20 +
.../pages/alert/alert.wxss | 70 ++
.../pages/cattle/batches/batches.js | 273 +++++++
.../pages/cattle/batches/batches.json | 4 +
.../pages/cattle/batches/batches.wxml | 66 ++
.../pages/cattle/batches/batches.wxss | 119 +++
.../pages/cattle/cattle.js | 210 +++++-
.../pages/cattle/cattle.wxml | 42 +-
.../pages/cattle/cattle.wxss | 51 ++
.../pages/cattle/exit/exit.js | 258 +++++++
.../pages/cattle/exit/exit.json | 3 +
.../pages/cattle/exit/exit.wxml | 51 ++
.../pages/cattle/exit/exit.wxss | 32 +
.../pages/cattle/pens/pens.js | 285 ++++++++
.../pages/cattle/pens/pens.json | 4 +
.../pages/cattle/pens/pens.wxml | 51 ++
.../pages/cattle/pens/pens.wxss | 27 +
.../pages/cattle/transfer/transfer.js | 257 +++++++
.../pages/cattle/transfer/transfer.json | 3 +
.../pages/cattle/transfer/transfer.wxml | 82 +++
.../pages/cattle/transfer/transfer.wxss | 211 ++++++
.../pages/device/collar/collar.js | 4 +-
.../device/eartag-detail/eartag-detail.js | 2 +-
.../pages/device/eartag/eartag.js | 6 +-
.../pages/device/fence/fence.js | 2 +-
.../pages/device/host/host.js | 4 +-
.../farm-monitor-dashboard/pages/home/home.js | 56 +-
.../pages/login/login.js | 2 +-
.../pages/production/production.js | 89 +++
.../pages/production/production.wxml | 65 ++
.../pages/production/production.wxss | 5 +
.../farm-monitor-dashboard/utils/api.js | 112 ++-
59 files changed, 5428 insertions(+), 593 deletions(-)
create mode 100644 admin-system/public/login.html
create mode 100644 insurance_backend/docs/insurance-type-api-examples.md
create mode 100644 insurance_backend/docs/insurance-type-api.yaml
create mode 100644 insurance_backend/test_params.js
create mode 100644 insurance_backend/tests/insurance-type-api-test.js
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/batches/batches.js
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/batches/batches.json
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/batches/batches.wxml
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/batches/batches.wxss
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/exit/exit.js
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/exit/exit.json
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/exit/exit.wxml
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/exit/exit.wxss
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/pens/pens.js
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/pens/pens.json
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/pens/pens.wxml
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/pens/pens.wxss
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/transfer/transfer.js
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/transfer/transfer.json
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/transfer/transfer.wxml
create mode 100644 mini_program/farm-monitor-dashboard/pages/cattle/transfer/transfer.wxss
diff --git a/admin-system/.env.production b/admin-system/.env.production
index 344f467..163eb0b 100644
--- a/admin-system/.env.production
+++ b/admin-system/.env.production
@@ -1,4 +1,4 @@
# 生产环境配置
VITE_API_BASE_URL=/api
-VITE_API_FULL_URL=https://ad.ningmuyun.com/api
+VITE_API_FULL_URL=https://ad.ningmuyun.com/farm/api
VITE_USE_PROXY=false
\ No newline at end of file
diff --git a/admin-system/default.conf b/admin-system/default.conf
index 9150bbc..3f954b2 100644
--- a/admin-system/default.conf
+++ b/admin-system/default.conf
@@ -19,13 +19,18 @@ server {
access_log off;
}
- # 处理Vue Router的history模式
- location / {
- try_files $uri $uri/ /index.html;
+ # 处理Vue Router的history模式 - 支持/farm/路径
+ location /farm/ {
+ try_files $uri $uri/ /farm/index.html;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
+
+ # 根路径重定向到/farm/
+ location = / {
+ return 301 /farm/;
+ }
# API代理到后端服务
location /api/ {
diff --git a/admin-system/public/login.html b/admin-system/public/login.html
new file mode 100644
index 0000000..b2d0b3d
--- /dev/null
+++ b/admin-system/public/login.html
@@ -0,0 +1,16 @@
+
+
+
+ 正在重定向到登录页面...
+
{{ stats.highTemperature }}
-
预警
+
温度预警
@@ -392,7 +392,7 @@ const getAlertTypeText = (type) => {
'movement': '异常运动预警',
'wear': '佩戴异常预警'
}
- return typeMap[type] || '未知预警'
+ return typeMap[type] || '温度预警'
}
// 获取预警类型颜色
diff --git a/admin-system/src/views/SmartHost.vue b/admin-system/src/views/SmartHost.vue
index e184659..52c66d9 100644
--- a/admin-system/src/views/SmartHost.vue
+++ b/admin-system/src/views/SmartHost.vue
@@ -204,6 +204,7 @@ import { message } from 'ant-design-vue'
import { SearchOutlined, ExportOutlined } from '@ant-design/icons-vue'
import { ExportUtils } from '../utils/exportUtils'
import { loadBMapScript, createMap } from '@/utils/mapService'
+import { API_CONFIG } from '@/config/env.js'
// 响应式数据
const hosts = ref([])
@@ -312,8 +313,8 @@ const fetchData = async (showMessage = false) => {
console.log('搜索条件:', searchValue.value.trim())
}
- // 调用API获取智能主机数据
- const apiUrl = `/api/smart-devices/hosts?${params}`
+ // 调用API获取智能主机数据(使用环境配置的基础URL,兼容生产 /farm/api 前缀)
+ const apiUrl = `${API_CONFIG.baseUrl}/smart-devices/hosts?${params}`
console.log('API请求URL:', apiUrl)
const response = await fetch(apiUrl, {
@@ -610,8 +611,8 @@ const exportData = async () => {
console.log('导出搜索条件:', searchValue.value.trim())
}
- // 调用API获取所有智能主机数据
- const apiUrl = `/api/smart-devices/hosts?${params}`
+ // 调用API获取所有智能主机数据(使用环境配置的基础URL,兼容生产 /farm/api 前缀)
+ const apiUrl = `${API_CONFIG.baseUrl}/smart-devices/hosts?${params}`
console.log('导出API请求URL:', apiUrl)
const response = await fetch(apiUrl, {
diff --git a/admin-system/vite.config.js b/admin-system/vite.config.js
index 963fa2b..5664425 100644
--- a/admin-system/vite.config.js
+++ b/admin-system/vite.config.js
@@ -7,8 +7,22 @@ export default defineConfig(({ mode }) => {
// 加载环境变量
const env = loadEnv(mode, process.cwd(), '')
+ // 自定义重定向插件
+ const redirectPlugin = () => {
+ return {
+ name: 'redirect-plugin',
+ configureServer(server) {
+ server.middlewares.use('/login', (req, res, next) => {
+ res.writeHead(302, { Location: '/farm/login' })
+ res.end()
+ })
+ }
+ }
+ }
+
return {
- plugins: [vue()],
+ base: '/farm/',
+ plugins: [vue(), redirectPlugin()],
resolve: {
alias: {
'@': resolve(__dirname, 'src')
@@ -23,6 +37,11 @@ export default defineConfig(({ mode }) => {
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/api')
}
+ },
+ // 开发环境重定向配置
+ middlewareMode: false,
+ fs: {
+ strict: false
}
},
build: {
@@ -38,7 +57,11 @@ export default defineConfig(({ mode }) => {
},
define: {
// 将环境变量注入到应用中
- __APP_ENV__: JSON.stringify(env)
+ __APP_ENV__: JSON.stringify(env),
+ // 在生产环境中强制使用正确的API URL
+ 'import.meta.env.VITE_API_BASE_URL': JSON.stringify(
+ mode === 'production' ? 'https://ad.ningmuyun.com/farm/api' : (env.VITE_API_BASE_URL || '/api')
+ )
}
}
})
\ No newline at end of file
diff --git a/backend/routes/smart-devices.js b/backend/routes/smart-devices.js
index 064af5e..37dc408 100644
--- a/backend/routes/smart-devices.js
+++ b/backend/routes/smart-devices.js
@@ -7,7 +7,7 @@ const express = require('express');
const router = express.Router();
const { verifyToken, checkRole } = require('../middleware/auth');
const { requirePermission } = require('../middleware/permission');
-const { IotXqClient, IotJbqServer, IotJbqClient } = require('../models');
+const { IotXqClient, IotJbqServer, IotJbqClient, Farm } = require('../models');
const { Op } = require('sequelize');
const { createSuccessResponse, createErrorResponse, createPaginatedResponse, SUCCESS_MESSAGES, ERROR_CODES } = require('../utils/apiResponse');
@@ -1366,6 +1366,14 @@ router.get('/hosts', verifyToken, requirePermission('smart_host:view'), async (r
]
});
+ // 批量查询牧场信息,构建映射表
+ const orgIds = [...new Set(rows.map(h => h.org_id).filter(id => id !== null && id !== undefined))];
+ let farmMap = {};
+ if (orgIds.length > 0) {
+ const farms = await Farm.findAll({ where: { id: orgIds } });
+ farmMap = Object.fromEntries(farms.map(f => [f.id, f.name]));
+ }
+
// 格式化数据以匹配前端UI需求
const hosts = rows.map(host => ({
id: host.id,
@@ -1383,6 +1391,9 @@ router.get('/hosts', verifyToken, requirePermission('smart_host:view'), async (r
state: host.state, // 设备状态
title: host.title, // 设备标题
org_id: host.org_id, // 组织ID
+ farmId: host.org_id, // 牧场ID(与组织ID一致)
+ farmName: farmMap[host.org_id] || '-', // 牧场名称
+ farm: { id: host.org_id, name: farmMap[host.org_id] || '-' },
uid: host.uid, // 用户ID
fence_id: host.fence_id, // 围栏ID
source_id: host.source_id, // 数据源ID
@@ -1449,6 +1460,19 @@ router.get('/hosts/:id', verifyToken, requirePermission('smart_host:view'), asyn
}
// 格式化数据
+ // 牧场信息
+ let farmId = host.org_id;
+ let farmName = '-';
+ if (farmId !== null && farmId !== undefined) {
+ try {
+ const farm = await Farm.findByPk(farmId);
+ if (farm && farm.name) {
+ farmName = farm.name;
+ }
+ } catch (e) {
+ // 牧场查询失败时忽略,不影响主机详情返回
+ }
+ }
const hostData = {
id: host.id,
deviceNumber: host.sid,
@@ -1465,6 +1489,9 @@ router.get('/hosts/:id', verifyToken, requirePermission('smart_host:view'), asyn
state: host.state,
title: host.title,
org_id: host.org_id,
+ farmId: farmId,
+ farmName: farmName,
+ farm: { id: farmId, name: farmName },
uid: host.uid,
fence_id: host.fence_id,
source_id: host.source_id,
diff --git a/insurance_admin-system/src/utils/request.js b/insurance_admin-system/src/utils/request.js
index 0974758..c4c7ced 100644
--- a/insurance_admin-system/src/utils/request.js
+++ b/insurance_admin-system/src/utils/request.js
@@ -116,8 +116,28 @@ const handleResponse = async (response) => {
const fetchRequest = async (url, options = {}) => {
const userStore = useUserStore()
+ // 处理查询参数
+ let finalUrl = url.startsWith('http') ? url : `${API_CONFIG.baseURL}${url}`
+
+ if (options.params) {
+ const searchParams = new URLSearchParams()
+ Object.keys(options.params).forEach(key => {
+ if (options.params[key] !== undefined && options.params[key] !== null) {
+ searchParams.append(key, options.params[key])
+ }
+ })
+
+ const queryString = searchParams.toString()
+ if (queryString) {
+ finalUrl += (finalUrl.includes('?') ? '&' : '?') + queryString
+ }
+
+ // 从options中移除params,避免传递给fetch
+ delete options.params
+ }
+
// 构建完整URL
- const fullUrl = url.startsWith('http') ? url : `${API_CONFIG.baseURL}${url}`
+ const fullUrl = finalUrl
// 对于登录、刷新token接口,跳过token检查
const skipTokenCheck = url.includes('/auth/login') ||
diff --git a/insurance_admin-system/src/views/ApplicationManagement.vue b/insurance_admin-system/src/views/ApplicationManagement.vue
index 9d4d567..f2e35cd 100644
--- a/insurance_admin-system/src/views/ApplicationManagement.vue
+++ b/insurance_admin-system/src/views/ApplicationManagement.vue
@@ -10,14 +10,14 @@
>
@@ -170,31 +170,31 @@
size="small"
>
- {{ selectedApplication.application_number }}
+ {{ selectedApplication.application_no }}
{{ selectedApplication.insurance_category === 'individual' ? '个人参保' : '企业参保' }}
- {{ selectedApplication.insurance_type }}
+ {{ selectedApplication.insurance_type?.name || selectedApplication.insurance_type_id }}
- ¥{{ Number(selectedApplication.insurance_amount).toLocaleString() }}
+ ¥{{ Number(selectedApplication.application_amount).toLocaleString() }}
{{ selectedApplication.insurance_period }}个月
- {{ selectedApplication.applicant_name }}
+ {{ selectedApplication.customer_name }}
- {{ maskIdCard(selectedApplication.id_card) }}
+ {{ maskIdCard(selectedApplication.customer_id_card) }}
- {{ maskPhone(selectedApplication.phone) }}
+ {{ maskPhone(selectedApplication.customer_phone) }}
- {{ selectedApplication.address }}
+ {{ selectedApplication.customer_address }}
{{ selectedApplication.application_date }}
@@ -277,20 +277,20 @@
企业参保
-
-
+
+
{{ type.name }}
-
+
36个月
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -347,8 +347,8 @@ const selectedApplication = ref(null)
// 搜索表单
const searchForm = reactive({
- applicationNumber: '',
- applicantName: '',
+ application_no: '',
+ customer_name: '',
insuranceType: '',
insuranceCategory: '',
status: ''
@@ -366,13 +366,13 @@ const reviewFormData = reactive({
// 新增申请表单
const createForm = reactive({
insurance_category: '',
- insurance_type: '',
- insurance_amount: null,
+ insurance_type_id: '',
+ application_amount: null,
insurance_period: '',
- applicant_name: '',
- id_card: '',
- phone: '',
- address: '',
+ customer_name: '',
+ customer_id_card: '',
+ customer_phone: '',
+ customer_address: '',
remarks: ''
})
@@ -390,14 +390,14 @@ const pagination = reactive({
const columns = [
{
title: '申请单号',
- dataIndex: 'application_number',
- key: 'application_number',
+ dataIndex: 'application_no',
+ key: 'application_no',
width: 180,
fixed: 'left'
},
{
title: '投保人姓名',
- dataIndex: 'applicant_name',
+ dataIndex: 'customer_name',
key: 'applicant_name',
width: 120
},
@@ -409,14 +409,17 @@ const columns = [
},
{
title: '参保险种',
- dataIndex: 'insurance_type',
- key: 'insurance_type',
- width: 150
+ dataIndex: 'insurance_type_id',
+ key: 'insurance_type_id',
+ width: 150,
+ customRender: ({ record }) => {
+ return record.insurance_type?.name || record.insurance_type_id
+ }
},
{
title: '保险金额',
- dataIndex: 'insurance_amount',
- key: 'insurance_amount',
+ dataIndex: 'application_amount',
+ key: 'application_amount',
width: 120
},
{
@@ -427,8 +430,8 @@ const columns = [
},
{
title: '联系电话',
- dataIndex: 'phone',
- key: 'phone',
+ dataIndex: 'customer_phone',
+ key: 'customer_phone',
width: 130
},
{
@@ -517,8 +520,8 @@ const handleSearch = () => {
const resetSearch = () => {
Object.assign(searchForm, {
- applicationNumber: '',
- applicantName: '',
+ application_no: '',
+ customer_name: '',
insuranceType: '',
insuranceCategory: '',
status: ''
@@ -575,13 +578,13 @@ const showCreateModal = () => {
isEdit.value = false
Object.assign(createForm, {
insurance_category: '',
- insurance_type: '',
- insurance_amount: null,
+ insurance_type_id: '',
+ application_amount: null,
insurance_period: '',
- applicant_name: '',
- id_card: '',
- phone: '',
- address: '',
+ customer_name: '',
+ customer_id_card: '',
+ customer_phone: '',
+ customer_address: '',
remarks: ''
})
createModalVisible.value = true
diff --git a/insurance_admin-system/src/views/ClaimManagement.vue b/insurance_admin-system/src/views/ClaimManagement.vue
index 2184a78..ad34495 100644
--- a/insurance_admin-system/src/views/ClaimManagement.vue
+++ b/insurance_admin-system/src/views/ClaimManagement.vue
@@ -17,37 +17,74 @@
-
+
+
+
+
+
+
+ 全部
+ 疾病
+ 意外事故
+ 自然灾害
+ 盗窃
+ 其他
+
+
全部
- 待审核
+ 待处理
+ 调查中
已通过
已拒绝
- 处理中
- 已完成
+ 已赔付
@@ -73,41 +110,62 @@
@change="handleTableChange"
>
-
-
- {{ getStatusText(record.status) }}
+
+
+ {{ getStatusText(record.claim_status) }}
+
+
+
+
+ {{ getClaimTypeText(record.claim_type) }}
¥{{ record.claim_amount?.toLocaleString() }}
-
- ¥{{ record.approved_amount?.toLocaleString() }}
- -
+
+ {{ record.contact_phone || '-' }}
查看
- 处理
+ 编辑
+
+ 删除
+
更多
- 编辑
-
+
+ 处理
+
+
通过
-
+
拒绝
- 删除
@@ -130,26 +188,29 @@
bordered
:column="2"
>
- {{ currentClaim.claim_number }}
- {{ currentClaim.policy_number }}
- {{ currentClaim.applicant_name }}
- {{ currentClaim.phone }}
+ {{ currentClaim.claim_no }}
+ {{ currentClaim.reporter_name }}
+ {{ currentClaim.contact_phone }}
+ {{ currentClaim.policy_no }}
+ {{ currentClaim.claim_type }}
+ {{ currentClaim.affected_count }}
¥{{ currentClaim.claim_amount?.toLocaleString() }}
-
- ¥{{ currentClaim.approved_amount?.toLocaleString() }}
-
- {{ currentClaim.apply_date }}
- {{ currentClaim.accident_date }}
+ {{ currentClaim.incident_location }}
+ {{ currentClaim.report_date }}
+ {{ currentClaim.incident_date }}
-
- {{ getStatusText(currentClaim.status) }}
+
+ {{ getStatusText(currentClaim.claim_status) }}
- {{ currentClaim.reviewer_name || '-' }}
+ {{ currentClaim.investigator_name || '-' }}
+ {{ currentClaim.investigation_date || '-' }}
+ {{ currentClaim.reviewer_name || '-' }}
{{ currentClaim.review_date || '-' }}
-
- {{ currentClaim.reject_reason }}
+
+ ¥{{ currentClaim.payment_amount?.toLocaleString() }}
+ {{ currentClaim.payment_date || '-' }}
@@ -259,26 +320,50 @@
>
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+ 疾病
+ 意外
+ 自然灾害
+ 其他
+
+
+
+
+
+
@@ -296,34 +381,30 @@
-
-
+
+
-
+
-
-
- 待审核
- 处理中
+
+
+ 待处理
+ 调查中
已通过
已拒绝
- 已完成
+ 已赔付
@@ -366,7 +447,8 @@ import {
RedoOutlined,
FileTextOutlined
} from '@ant-design/icons-vue'
-import { claimAPI } from '@/utils/api'
+import { livestockClaimApi } from '@/utils/api'
+import dayjs from 'dayjs'
const loading = ref(false)
const modalVisible = ref(false)
@@ -379,21 +461,25 @@ const formRef = ref()
const processFormRef = ref()
const searchForm = reactive({
- claim_number: '',
- policy_number: '',
- applicant_name: '',
- status: ''
+ claim_no: '',
+ policy_no: '',
+ reporter_name: '',
+ contact_phone: '',
+ claim_type: '',
+ claim_status: ''
})
const formState = reactive({
- claim_number: '',
- policy_number: '',
- applicant_name: '',
- phone: '',
+ claim_no: '',
+ policy_no: '',
+ reporter_name: '',
+ contact_phone: '',
+ claim_type: '',
+ affected_count: null,
claim_amount: null,
- apply_date: null,
- accident_date: null,
- status: 'pending',
+ incident_location: '',
+ incident_date: null,
+ claim_status: 'pending',
accident_description: '',
process_description: '',
reject_reason: '',
@@ -419,45 +505,63 @@ const pagination = reactive({
const columns = [
{
title: '理赔单号',
- dataIndex: 'claim_number',
- key: 'claim_number'
+ dataIndex: 'claim_no',
+ key: 'claim_no',
+ width: 140
+ },
+ {
+ title: '报案人',
+ dataIndex: 'reporter_name',
+ key: 'reporter_name',
+ width: 100
+ },
+ {
+ title: '联系电话',
+ dataIndex: 'contact_phone',
+ key: 'contact_phone',
+ width: 120
},
{
title: '保单号',
- dataIndex: 'policy_number',
- key: 'policy_number'
+ dataIndex: 'policy_no',
+ key: 'policy_no',
+ width: 140
},
{
- title: '申请人',
- dataIndex: 'applicant_name',
- key: 'applicant_name'
+ title: '事故类型',
+ dataIndex: 'claim_type',
+ key: 'claim_type',
+ width: 100
+ },
+ {
+ title: '申请数量',
+ dataIndex: 'affected_count',
+ key: 'affected_count',
+ width: 80
},
{
title: '申请金额',
key: 'claim_amount',
- dataIndex: 'claim_amount'
- },
- {
- title: '审核金额',
- key: 'approved_amount',
- dataIndex: 'approved_amount'
- },
- {
- title: '申请日期',
- dataIndex: 'apply_date',
- key: 'apply_date',
+ dataIndex: 'claim_amount',
width: 120
},
{
- title: '状态',
- key: 'status',
- dataIndex: 'status'
+ title: '出险地址',
+ dataIndex: 'incident_location',
+ key: 'incident_location',
+ width: 150
},
{
- title: '创建时间',
- dataIndex: 'created_at',
- key: 'created_at',
- width: 180
+ title: '状态',
+ key: 'claim_status',
+ dataIndex: 'claim_status',
+ width: 100
+ },
+ {
+ title: '报案时间',
+ dataIndex: 'report_date',
+ key: 'report_date',
+ width: 120
},
{
title: '操作',
@@ -468,13 +572,16 @@ const columns = [
]
const rules = {
- claim_number: [{ required: true, message: '请输入理赔单号' }],
- policy_number: [{ required: true, message: '请输入保单号' }],
- applicant_name: [{ required: true, message: '请输入申请人姓名' }],
+ claim_no: [{ required: true, message: '请输入理赔单号' }],
+ policy_no: [{ required: true, message: '请输入保单号' }],
+ reporter_name: [{ required: true, message: '请输入报案人姓名' }],
+ contact_phone: [{ required: true, message: '请输入联系电话' }],
+ claim_type: [{ required: true, message: '请选择事故类型' }],
+ affected_count: [{ required: true, message: '请输入受影响数量' }],
claim_amount: [{ required: true, message: '请输入申请金额' }],
- apply_date: [{ required: true, message: '请选择申请日期' }],
- accident_date: [{ required: true, message: '请选择事故日期' }],
- status: [{ required: true, message: '请选择状态' }],
+ incident_location: [{ required: true, message: '请输入出险地址' }],
+ incident_date: [{ required: true, message: '请选择事故日期' }],
+ claim_status: [{ required: true, message: '请选择状态' }],
accident_description: [{ required: true, message: '请输入事故描述' }]
}
@@ -522,47 +629,192 @@ const getStatusText = (status) => {
return texts[status] || '未知'
}
+const getClaimTypeText = (type) => {
+ const typeMap = {
+ disease: '疾病',
+ accident: '意外事故',
+ natural_disaster: '自然灾害',
+ theft: '盗窃',
+ other: '其他'
+ }
+ return typeMap[type] || type
+}
+
+const getClaimTypeColor = (type) => {
+ const colorMap = {
+ disease: 'red',
+ accident: 'orange',
+ natural_disaster: 'purple',
+ theft: 'volcano',
+ other: 'default'
+ }
+ return colorMap[type] || 'default'
+}
+
const loadClaims = async () => {
loading.value = true
+ console.log('🚀 开始加载理赔数据...')
+
try {
const params = {
page: pagination.current,
- pageSize: pagination.pageSize,
- ...searchForm
+ pageSize: pagination.pageSize
}
- console.log('理赔管理API请求参数:', params)
- const response = await claimAPI.getList(params)
- console.log('理赔管理API响应:', response)
+ console.log('📋 当前搜索表单状态:', JSON.stringify(searchForm, null, 2))
+
+ // 添加搜索条件
+ if (searchForm.claim_no) {
+ params.claim_no = searchForm.claim_no
+ console.log('🔍 添加理赔单号搜索条件:', searchForm.claim_no)
+ }
+ if (searchForm.policy_no) {
+ params.policy_no = searchForm.policy_no
+ console.log('🔍 添加保单号搜索条件:', searchForm.policy_no)
+ }
+ if (searchForm.reporter_name) {
+ params.reporter_name = searchForm.reporter_name
+ console.log('🔍 添加报案人搜索条件:', searchForm.reporter_name)
+ }
+ if (searchForm.contact_phone) {
+ params.contact_phone = searchForm.contact_phone
+ console.log('🔍 添加联系电话搜索条件:', searchForm.contact_phone)
+ }
+ if (searchForm.claim_type) {
+ params.claim_type = searchForm.claim_type
+ console.log('🔍 添加事故类型搜索条件:', searchForm.claim_type)
+ }
+ if (searchForm.claim_status) {
+ params.claim_status = searchForm.claim_status
+ console.log('🔍 添加状态搜索条件:', searchForm.claim_status)
+ }
+
+ console.log('📤 [前端->后端] API请求参数:', {
+ 请求时间: new Date().toLocaleString(),
+ 请求URL: '/api/livestock-claims',
+ 请求方法: 'GET',
+ 请求参数: JSON.stringify(params, null, 2),
+ 分页信息: {
+ 当前页: pagination.current,
+ 每页条数: pagination.pageSize
+ }
+ })
+
+ const response = await livestockClaimApi.getList(params)
+
+ console.log('📥 [后端->前端] API响应:', {
+ 响应时间: new Date().toLocaleString(),
+ 响应状态: response.status,
+ 响应头: response.headers,
+ 响应数据结构: {
+ status: response.data?.status,
+ message: response.data?.message,
+ data类型: Array.isArray(response.data?.data) ? 'Array' : typeof response.data?.data,
+ data长度: response.data?.data?.length,
+ pagination: response.data?.pagination
+ },
+ 完整响应: JSON.stringify(response.data, null, 2)
+ })
if (response.data && response.data.status === 'success') {
// 后端返回的数据直接是数组格式,不是{list: [], total: 8}格式
- claimList.value = response.data.data || []
- pagination.total = response.data.pagination?.total || 0
- console.log('理赔管理数据设置成功:', claimList.value.length, '条')
+ const newClaimList = response.data.data || []
+ const newTotal = response.data.pagination?.total || 0
+
+ console.log('✅ 数据处理成功:', {
+ 处理时间: new Date().toLocaleString(),
+ 数据条数: newClaimList.length,
+ 总记录数: newTotal,
+ 数据样例: newClaimList.length > 0 ? JSON.stringify(newClaimList[0], null, 2) : '无数据'
+ })
+
+ claimList.value = newClaimList
+ pagination.total = newTotal
+
+ console.log('📊 前端状态更新:', {
+ 更新时间: new Date().toLocaleString(),
+ 列表长度: claimList.value.length,
+ 分页总数: pagination.total,
+ 当前页: pagination.current,
+ 每页条数: pagination.pageSize
+ })
} else {
- console.log('理赔管理响应格式错误:', response)
+ console.error('❌ 响应格式错误:', {
+ 错误时间: new Date().toLocaleString(),
+ 响应状态: response.data?.status,
+ 错误信息: response.data?.message,
+ 完整响应: response
+ })
message.error(response.data?.message || '加载理赔列表失败')
claimList.value = []
}
} catch (error) {
- message.error('加载理赔列表失败')
+ console.error('💥 API请求失败:', {
+ 错误时间: new Date().toLocaleString(),
+ 错误类型: error.name,
+ 错误信息: error.message,
+ 错误堆栈: error.stack,
+ 请求配置: error.config,
+ 响应数据: error.response?.data,
+ 响应状态: error.response?.status
+ })
+ message.error('加载理赔列表失败: ' + error.message)
} finally {
loading.value = false
+ console.log('🏁 理赔数据加载完成')
}
}
const handleSearch = () => {
- pagination.current = 1
+ console.log('🔍 执行搜索操作:', {
+ 触发时间: new Date().toLocaleString(),
+ 搜索条件: JSON.stringify(searchForm, null, 2),
+ 重置分页: '第1页'
+ })
+ pagination.current = 1
+ loadClaims()
+ }
+
+const resetSearch = () => {
+ console.log('🔄 重置搜索表单')
+ searchForm.claim_no = ''
+ searchForm.policy_no = ''
+ searchForm.reporter_name = ''
+ searchForm.contact_phone = ''
+ searchForm.claim_type = ''
+ searchForm.claim_status = ''
+ console.log('🔄 重置后的搜索表单:', JSON.stringify(searchForm, null, 2))
loadClaims()
}
-const resetSearch = () => {
- searchForm.claim_number = ''
- searchForm.policy_number = ''
- searchForm.applicant_name = ''
- searchForm.status = ''
- handleSearch()
+// 搜索字段输入监听器
+const onSearchFieldInput = (fieldName, event) => {
+ const value = event.target ? event.target.value : event
+ console.log(`📝 [输入监听] ${fieldName}:`, {
+ 输入值: value,
+ 事件类型: 'input',
+ 时间戳: new Date().toLocaleString(),
+ 当前表单状态: JSON.stringify(searchForm, null, 2)
+ })
+}
+
+// 搜索字段变化监听器
+const onSearchFieldChange = (fieldName, event) => {
+ const value = event.target ? event.target.value : event
+ console.log(`🔍 [变化监听] ${fieldName}:`, {
+ 变化值: value,
+ 事件类型: 'change',
+ 时间戳: new Date().toLocaleString(),
+ 变化前表单: JSON.stringify(searchForm, null, 2)
+ })
+
+ // 延迟一点时间确保 v-model 已更新
+ setTimeout(() => {
+ console.log(`🔍 [变化后] ${fieldName}:`, {
+ 表单中的值: searchForm[fieldName],
+ 变化后表单: JSON.stringify(searchForm, null, 2)
+ })
+ }, 10)
}
const handleTableChange = (pag) => {
@@ -574,14 +826,16 @@ const handleTableChange = (pag) => {
const showModal = () => {
editingId.value = null
Object.assign(formState, {
- claim_number: '',
- policy_number: '',
- applicant_name: '',
- phone: '',
+ claim_no: '',
+ policy_no: '',
+ reporter_name: '',
+ contact_phone: '',
+ claim_type: '',
+ affected_count: null,
claim_amount: null,
- apply_date: null,
- accident_date: null,
- status: 'pending',
+ incident_location: '',
+ incident_date: null,
+ claim_status: 'pending',
accident_description: '',
process_description: '',
reject_reason: '',
@@ -590,6 +844,10 @@ const showModal = () => {
modalVisible.value = true
}
+const handleAdd = () => {
+ showModal()
+}
+
const handleView = (record) => {
currentClaim.value = record
detailVisible.value = true
@@ -608,26 +866,31 @@ const handleProcess = (record) => {
const handleEdit = (record) => {
editingId.value = record.id
+
+ // 复制记录数据到表单
Object.assign(formState, {
- claim_number: record.claim_number,
- policy_number: record.policy_number,
- applicant_name: record.applicant_name,
- phone: record.phone,
+ claim_no: record.claim_no,
+ policy_no: record.policy_no,
+ reporter_name: record.reporter_name,
+ contact_phone: record.contact_phone,
+ claim_type: record.claim_type,
+ affected_count: record.affected_count,
claim_amount: record.claim_amount,
- apply_date: record.apply_date,
- accident_date: record.accident_date,
- status: record.status,
+ incident_location: record.incident_location,
+ incident_date: record.incident_date ? dayjs(record.incident_date) : null,
+ claim_status: record.claim_status,
accident_description: record.accident_description,
process_description: record.process_description,
reject_reason: record.reject_reason,
approved_amount: record.approved_amount
})
+
modalVisible.value = true
}
const handleApprove = async (record) => {
try {
- // await claimAPI.approve(record.id, { approved_amount: record.claim_amount })
+ // await livestockClaimApi.approve(record.id, { approved_amount: record.claim_amount })
message.success('理赔申请已通过')
loadClaims()
} catch (error) {
@@ -643,7 +906,7 @@ const handleProcessOk = async () => {
try {
await processFormRef.value.validate()
- // await claimAPI.process(currentClaim.value.id, processForm)
+ // await livestockClaimApi.process(currentClaim.value.id, processForm)
message.success('处理完成')
processVisible.value = false
loadClaims()
@@ -660,18 +923,32 @@ const handleModalOk = async () => {
try {
await formRef.value.validate()
+ const formData = { ...formState }
+
+ // 处理日期格式
+ if (formData.incident_date) {
+ formData.incident_date = formData.incident_date.format('YYYY-MM-DD')
+ }
+
if (editingId.value) {
- // await claimAPI.update(editingId.value, formState)
- message.success('理赔更新成功')
+ // 编辑
+ await livestockClaimApi.update(editingId.value, formData)
+ message.success('更新成功')
} else {
- // await claimAPI.create(formState)
- message.success('理赔创建成功')
+ // 新增
+ // 生成理赔单号
+ if (!formData.claim_no) {
+ formData.claim_no = 'LC' + Date.now()
+ }
+ await livestockClaimApi.create(formData)
+ message.success('新增成功')
}
modalVisible.value = false
loadClaims()
} catch (error) {
- console.log('表单验证失败', error)
+ console.error('保存失败:', error)
+ message.error('保存失败: ' + (error.response?.data?.message || error.message))
}
}
@@ -681,11 +958,12 @@ const handleModalCancel = () => {
const handleDelete = async (id) => {
try {
- // await claimAPI.delete(id)
- message.success('理赔删除成功')
+ await livestockClaimApi.delete(id)
+ message.success('删除成功')
loadClaims()
} catch (error) {
- message.error('理赔删除失败')
+ console.error('删除失败:', error)
+ message.error('删除失败: ' + (error.response?.data?.message || error.message))
}
}
diff --git a/insurance_admin-system/src/views/InsuranceTypeManagement.vue b/insurance_admin-system/src/views/InsuranceTypeManagement.vue
index 042f5b0..6482fbb 100644
--- a/insurance_admin-system/src/views/InsuranceTypeManagement.vue
+++ b/insurance_admin-system/src/views/InsuranceTypeManagement.vue
@@ -17,36 +17,12 @@
-
-
-
-
-
-
-
-
- 全部
- 在线
- 离线
-
-
+
@@ -71,25 +47,25 @@
:scroll="{ x: 1500 }"
>
-
+
handleToggleOnlineStatus(record, checked)"
- checked-children="在线"
- un-checked-children="离线"
+ :checked="record.on_sale_status"
+ @change="(checked) => handleToggleOnSaleStatus(record, checked)"
+ checked-children="在售"
+ un-checked-children="停售"
/>
-
- {{ record.premium_price ? `¥${record.premium_price}` : '-' }}
+
+ {{ formatApplicableLivestock(record.applicable_livestock) }}
-
- {{ record.experience_period ? `${record.experience_period}个月` : '-' }}
+
+ {{ formatCoverageAmount(record.coverage_amount_min, record.coverage_amount_max) }}
-
- {{ record.insurance_period ? `${record.insurance_period}个月` : '-' }}
+
+ {{ record.insurance_term ? `${record.insurance_term}个月` : '-' }}
-
- {{ record.product_time ? formatDate(record.product_time) : '-' }}
+
+ {{ record.created_at ? formatDate(record.created_at) : '-' }}
@@ -109,7 +85,8 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
+ mode="multiple"
+ :max-tag-count="3"
+ >
+ 牛
+ 羊
+ 猪
+ 鸡
+ 鸭
+ 鹅
+ 马
+ 驴
+ 兔
+ 鱼
+ 虾
+
-
-
-
+
+
+
+ 1个月
+ 3个月
+ 6个月
+ 12个月
+ 24个月
+ 36个月
+
-
-
+
+
+
+
+
+
+
+
+ 电子保单
+ 纸质保单
+ 电子保单+纸质保单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ {{ currentDetail.name || '-' }}
+
+
+ {{ formatApplicableLivestock(currentDetail.applicable_livestock) }}
+
+
+ {{ currentDetail.insurance_term ? `${currentDetail.insurance_term}个月` : '-' }}
+
+
+ {{ currentDetail.description || '-' }}
+
+
+ {{ currentDetail.policy_form || '-' }}
+
+
+ {{ formatCoverageAmount(currentDetail.coverage_amount_min, currentDetail.coverage_amount_max) }}
+
+
+ {{ currentDetail.created_at ? formatDate(currentDetail.created_at) : '-' }}
+
+
+
+ {{ currentDetail.on_sale_status ? '在售' : '停售' }}
+
+
+
+ {{ currentDetail.updated_at ? formatDate(currentDetail.updated_at) : '-' }}
+
+
+
@@ -247,30 +276,27 @@ import {
const loading = ref(false)
const modalVisible = ref(false)
+const detailVisible = ref(false)
const isEdit = ref(false)
const typeList = ref([])
const formRef = ref()
+const currentDetail = ref({})
const searchForm = reactive({
- name: '',
- applicable_scope: '',
- service_area: '',
- online_status: ''
+ name: ''
})
const formState = reactive({
id: null,
name: '',
+ applicable_livestock: [],
+ insurance_term: null,
description: '',
- applicable_scope: '',
- experience_period: null,
- insurance_period: null,
- premium_price: null,
- service_area: '',
- product_time: null,
- online_status: true,
- sort_order: 0,
- remarks: ''
+ policy_form: '',
+ coverage_amount_min: null,
+ coverage_amount_max: null,
+ created_at: null,
+ on_sale_status: true
})
const pagination = reactive({
@@ -291,45 +317,52 @@ const columns = [
fixed: 'left'
},
{
- title: '适用范围',
- dataIndex: 'applicable_scope',
- key: 'applicable_scope',
- width: 150
- },
- {
- title: '体验期',
- dataIndex: 'experience_period',
- key: 'experience_period',
- width: 100
- },
- {
- title: '保险期间',
- dataIndex: 'insurance_period',
- key: 'insurance_period',
- width: 100
- },
- {
- title: '保费价格',
- dataIndex: 'premium_price',
- key: 'premium_price',
+ title: '适用生资',
+ dataIndex: 'applicable_livestock',
+ key: 'applicable_livestock',
width: 120
},
+ {
+ title: '保险期限/月',
+ dataIndex: 'insurance_term',
+ key: 'insurance_term',
+ width: 120,
+ sorter: true
+ },
{
title: '服务区域',
- dataIndex: 'service_area',
- key: 'service_area',
+ dataIndex: 'description',
+ key: 'description',
+ width: 200
+ },
+ {
+ title: '保单形式',
+ dataIndex: 'policy_form',
+ key: 'policy_form',
+ width: 150,
+ filters: [
+ { text: '电子保单', value: '电子保单' },
+ { text: '纸质保单', value: '纸质保单' },
+ { text: '电子保单+纸质保单', value: '电子保单+纸质保单' }
+ ]
+ },
+ {
+ title: '保险额度',
+ dataIndex: 'coverage_amount',
+ key: 'coverage_amount',
width: 150
},
{
- title: '上架时间',
- dataIndex: 'product_time',
- key: 'product_time',
- width: 180
+ title: '添加时间',
+ dataIndex: 'created_at',
+ key: 'created_at',
+ width: 180,
+ sorter: true
},
{
- title: '在线状态',
- dataIndex: 'online_status',
- key: 'online_status',
+ title: '在售状态',
+ dataIndex: 'on_sale_status',
+ key: 'on_sale_status',
width: 100
},
{
@@ -342,11 +375,12 @@ const columns = [
const rules = {
name: [{ required: true, message: '请输入险种名称' }],
- applicable_scope: [{ required: true, message: '请输入适用范围' }],
- experience_period: [{ required: true, message: '请输入体验期' }],
- insurance_period: [{ required: true, message: '请输入保险期间' }],
- premium_price: [{ required: true, message: '请输入保费价格' }],
- service_area: [{ required: true, message: '请输入服务区域' }]
+ applicable_livestock: [{ required: true, message: '请输入适用生资' }],
+ insurance_term: [{ required: true, message: '请输入保险期限' }],
+ description: [{ required: true, message: '请输入服务区域' }],
+ policy_form: [{ required: true, message: '请选择保单形式' }],
+ coverage_amount_min: [{ required: true, message: '请输入最低保险额度' }],
+ coverage_amount_max: [{ required: true, message: '请输入最高保险额度' }]
}
// 格式化日期
@@ -355,6 +389,38 @@ const formatDate = (date) => {
return dayjs(date).format('YYYY-MM-DD HH:mm:ss')
}
+// 格式化保险额度
+const formatCoverageAmount = (min, max) => {
+ if (!min && !max) return '-'
+ if (min && max) {
+ return `${min}~${max}元`
+ }
+ if (min) return `${min}元以上`
+ if (max) return `${max}元以下`
+ return '-'
+}
+
+// 格式化适用生资
+const formatApplicableLivestock = (livestock) => {
+ if (!livestock) return '-'
+ if (Array.isArray(livestock)) {
+ return livestock.join('、')
+ }
+ if (typeof livestock === 'string') {
+ // 如果是字符串,尝试解析为数组
+ try {
+ const parsed = JSON.parse(livestock)
+ if (Array.isArray(parsed)) {
+ return parsed.join('、')
+ }
+ } catch (e) {
+ // 如果解析失败,按逗号分割
+ return livestock.split(',').join('、')
+ }
+ }
+ return livestock.toString()
+}
+
const loadInsuranceTypes = async () => {
loading.value = true
try {
@@ -391,10 +457,7 @@ const handleSearch = () => {
const resetSearch = () => {
Object.assign(searchForm, {
- name: '',
- applicable_scope: '',
- service_area: '',
- online_status: ''
+ name: ''
})
handleSearch()
}
@@ -410,42 +473,54 @@ const showModal = () => {
Object.assign(formState, {
id: null,
name: '',
+ applicable_livestock: [],
+ insurance_term: null,
description: '',
- applicable_scope: '',
- experience_period: null,
- insurance_period: null,
- premium_price: null,
- service_area: '',
- product_time: null,
- online_status: true,
- sort_order: 0,
- remarks: ''
+ policy_form: '',
+ coverage_amount_min: null,
+ coverage_amount_max: null,
+ created_at: null,
+ on_sale_status: true
})
modalVisible.value = true
}
const handleEdit = (record) => {
isEdit.value = true
+
+ // 处理 applicable_livestock 数据类型
+ let applicableLivestock = []
+ if (record.applicable_livestock) {
+ if (Array.isArray(record.applicable_livestock)) {
+ applicableLivestock = record.applicable_livestock
+ } else if (typeof record.applicable_livestock === 'string') {
+ try {
+ applicableLivestock = JSON.parse(record.applicable_livestock)
+ } catch (e) {
+ applicableLivestock = record.applicable_livestock.split(',').map(item => item.trim())
+ }
+ }
+ }
+
Object.assign(formState, {
id: record.id,
name: record.name,
+ applicable_livestock: applicableLivestock,
+ insurance_term: record.insurance_term,
description: record.description,
- applicable_scope: record.applicable_scope,
- experience_period: record.experience_period,
- insurance_period: record.insurance_period,
- premium_price: record.premium_price,
- service_area: record.service_area,
- product_time: record.product_time ? dayjs(record.product_time) : null,
- online_status: record.online_status,
- sort_order: record.sort_order,
- remarks: record.remarks
+ policy_form: record.policy_form,
+ coverage_amount_min: record.coverage_amount_min,
+ coverage_amount_max: record.coverage_amount_max,
+ created_at: record.created_at ? dayjs(record.created_at) : null,
+ on_sale_status: record.on_sale_status
})
modalVisible.value = true
}
const handleView = (record) => {
- // 查看详情功能
- message.info('查看详情功能待实现')
+ // 设置详情数据
+ currentDetail.value = { ...record }
+ detailVisible.value = true
}
const handleSubmit = async () => {
@@ -454,7 +529,10 @@ const handleSubmit = async () => {
const submitData = {
...formState,
- product_time: formState.product_time ? formState.product_time.format('YYYY-MM-DD HH:mm:ss') : null
+ applicable_livestock: Array.isArray(formState.applicable_livestock)
+ ? formState.applicable_livestock.join(',')
+ : formState.applicable_livestock,
+ created_at: formState.created_at ? formState.created_at.format('YYYY-MM-DD HH:mm:ss') : null
}
if (isEdit.value) {
@@ -488,21 +566,21 @@ const handleCancel = () => {
modalVisible.value = false
}
-const handleToggleOnlineStatus = async (record, checked) => {
+const handleToggleOnSaleStatus = async (record, checked) => {
try {
const response = await insuranceTypeAPI.updateStatus(record.id, {
- online_status: checked
+ on_sale_status: checked
})
if (response.status === 'success') {
- message.success('在线状态更新成功')
+ message.success('在售状态更新成功')
loadInsuranceTypes()
} else {
- message.error(response.message || '在线状态更新失败')
+ message.error(response.message || '在售状态更新失败')
}
} catch (error) {
- message.error('在线状态更新失败')
- console.error('Error updating online status:', error)
+ message.error('在售状态更新失败')
+ console.error('Error updating on sale status:', error)
}
}
diff --git a/insurance_admin-system/src/views/PolicyManagement.vue b/insurance_admin-system/src/views/PolicyManagement.vue
index 41fb98e..aa2e4d6 100644
--- a/insurance_admin-system/src/views/PolicyManagement.vue
+++ b/insurance_admin-system/src/views/PolicyManagement.vue
@@ -129,7 +129,7 @@
:column="2"
>