提交 c446996b 作者: zhongye-dev

feat: 完善检疫员/实验员/角色/字典/日志管理、字段汇总表、新增报告单Tab及多处UI优化

上级 a31f0e53
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"> <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>样本出库登记</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📤</div><div class="ph-title">样本出库登记</div><div class="ph-desc">样本出库、销毁与移交登记</div></div></body></html> <meta http-equiv="Expires" content="0"><title>样本出库管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📤</div><div class="ph-title">样本出库管理</div><div class="ph-desc">样本出库、销毁与移交登记</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>样本存放管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🏷️</div><div class="ph-title">样本存放管理</div><div class="ph-desc">样本存放位置与温湿度记录管理</div></div></body></html>
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<Sidebar /> <Sidebar />
</aside> </aside>
<main class="content"> <main class="content">
<div class="breadcrumb">{{ breadcrumb }}</div> <div class="breadcrumb">当前位置:{{ breadcrumbText }}</div>
<TabsBar /> <TabsBar />
<div class="content-body"> <div class="content-body">
<router-view v-slot="{ Component }"> <router-view v-slot="{ Component }">
...@@ -26,5 +26,8 @@ import Sidebar from "@/components/Sidebar.vue"; ...@@ -26,5 +26,8 @@ import Sidebar from "@/components/Sidebar.vue";
import TabsBar from "@/components/TabsBar.vue"; import TabsBar from "@/components/TabsBar.vue";
const route = useRoute(); const route = useRoute();
const breadcrumb = computed(() => "当前位置:" + (route.meta?.breadcrumb || "植物检疫检测隔离中心智能管理平台")); const breadcrumbText = computed(() => {
const raw = route.meta?.breadcrumb || "植物检疫检测隔离中心智能管理平台";
return raw.split("/").map((s) => s.trim()).filter(Boolean).join(" > ");
});
</script> </script>
\ No newline at end of file
/* cache-bust 20260907 - 禁止浏览器缓存 */ /* cache-bust 20260907 - 禁止浏览器缓存 */
/* ========== 基础重置 ========== */ /* ========== 基础重置 ========== */
* { margin: 0; padding: 0; box-sizing: border-box; } * { margin: 0; padding: 0; box-sizing: border-box; }
html, body { min-height: 100%; } html, body { min-height: 100%; }
...@@ -34,7 +34,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -34,7 +34,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
z-index: 100; z-index: 100;
} }
.app-logo { .app-logo {
width: 380px; width: auto;
height: 100%; height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -43,7 +43,12 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -43,7 +43,12 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
font-weight: bold; font-weight: bold;
letter-spacing: 1px; letter-spacing: 1px;
background: #d71e1e; background: #d71e1e;
color: #fff;
flex-shrink: 0;
white-space: nowrap;
overflow: visible;
} }
.file-hidden { display: none !important; }
.app-logo .logo-icon { .app-logo .logo-icon {
width: 30px; height: 30px; width: 30px; height: 30px;
margin-right: 10px; margin-right: 10px;
...@@ -86,7 +91,8 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -86,7 +91,8 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 12px; font-size: 12px;
margin-right: 6px; margin-right: 8px;
flex-shrink: 0;
} }
.app-user .user-name { margin-right: 12px; } .app-user .user-name { margin-right: 12px; }
.app-user .user-action { padding: 0 8px; cursor: pointer; opacity: 0.9; } .app-user .user-action { padding: 0 8px; cursor: pointer; opacity: 0.9; }
...@@ -114,6 +120,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -114,6 +120,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
cursor: pointer; cursor: pointer;
color: #444; color: #444;
font-size: 16px; font-size: 16px;
font-weight: bold;
position: relative; position: relative;
transition: background 0.15s, color 0.15s; transition: background 0.15s, color 0.15s;
user-select: none; user-select: none;
...@@ -126,7 +133,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -126,7 +133,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 14px; font-size: 14px;
color: #999; color: #d71e1e;
} }
.menu-item .menu-text { flex: 1; } .menu-item .menu-text { flex: 1; }
.menu-item .menu-arrow { .menu-item .menu-arrow {
...@@ -177,7 +184,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl ...@@ -177,7 +184,7 @@ input, select, textarea, button { font-family: inherit; font-size: inherit; outl
padding: 0 16px; padding: 0 16px;
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 14px; font-size: 16px;
color: #666; color: #666;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
background: #fafafa; background: #fafafa;
......
...@@ -10,8 +10,7 @@ export const menuConfig = [ ...@@ -10,8 +10,7 @@ export const menuConfig = [
id: "sample", name: "样本管理", icon: "Box", id: "sample", name: "样本管理", icon: "Box",
children: [ children: [
{ id: "sample-register", name: "样本登记入库", path: "/sample/register" }, { id: "sample-register", name: "样本登记入库", path: "/sample/register" },
{ id: "sample-storage", name: "样本存放管理", path: "/sample/storage" }, { id: "sample-out", name: "样本出库管理", path: "/sample/out" }
{ id: "sample-out", name: "样本出库登记", path: "/sample/out" }
] ]
}, },
{ {
...@@ -31,27 +30,27 @@ export const menuConfig = [ ...@@ -31,27 +30,27 @@ export const menuConfig = [
id: "isolation-monitor", name: "隔离监测", icon: "Monitor", id: "isolation-monitor", name: "隔离监测", icon: "Monitor",
children: [ children: [
{ id: "isolation-device", name: "设备总览", path: "/isolation/device" }, { id: "isolation-device", name: "设备总览", path: "/isolation/device" },
{ id: "isolation-data", name: "监测数据", path: "/isolation/data" }, { id: "isolation-data", name: "监测数据", path: "/isolation/data" }
{ id: "isolation-analysis", name: "监测数据分析", path: "/isolation/analysis" }
] ]
}, },
{ {
id: "analysis", name: "数据分析", icon: "DataAnalysis", path: "/analysis" id: "analysis", name: "风险分析", icon: "DataAnalysis", path: "/analysis"
},
{
id: "risk", name: "风险预警", icon: "Warning", path: "/risk"
}, },
{ {
id: "report", name: "报告管理", icon: "Notebook", path: "/report" id: "report", name: "报告管理", icon: "Notebook", path: "/report"
}, },
{ {
id: "audit", name: "审核发证", icon: "Stamp", path: "/audit/cert" id: "base", name: "基础信息管理", icon: "User",
children: [
{ id: "base-quarantine", name: "检疫员管理", path: "/base/quarantine" },
{ id: "base-experimenter", name: "实验员管理", path: "/base/experimenter" }
]
}, },
{ {
id: "settings", name: "系统设置", icon: "Setting", id: "settings", name: "系统设置", icon: "Setting",
children: [ children: [
{ id: "settings-users", name: "用户管理", path: "/settings/users" }, { id: "settings-users", name: "用户管理", path: "/settings/users" },
{ id: "settings-roles", name: "角色权限", path: "/settings/roles" }, { id: "settings-roles", name: "角色管理", path: "/settings/roles" },
{ id: "settings-dict", name: "数据字典", path: "/settings/dict" }, { id: "settings-dict", name: "数据字典", path: "/settings/dict" },
{ id: "settings-log", name: "操作日志", path: "/settings/log" } { id: "settings-log", name: "操作日志", path: "/settings/log" }
] ]
......
// 样本出库数据(按检疫单证号聚合)
export const sampleOutData = [
{
id: 1,
cert: "6204122022007095",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "翠菊",
variety: "翠菊",
inboundQty: "0.0013 千克",
events: [
{ time: "2022-04-10", outQty: "0.0005 千克", purpose: "样本抽检", sampler: "李文娟", samplerPhone: "13909310001", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-04-12", outQty: "0.0004 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 2,
cert: "6205022022007347",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "莴苣",
variety: "生菜",
inboundQty: "0.1500 千克",
events: [
{ time: "2022-04-12", outQty: "0.0500 千克", purpose: "样本抽检", sampler: "李文娟", samplerPhone: "13909310001", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-04-14", outQty: "0.0800 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 3,
cert: "6205022022007269",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "青花菜 (西兰花)",
variety: "西蓝花 VBR007",
inboundQty: "2.2700 千克",
events: [
{ time: "2022-04-15", outQty: "1.5000 千克", purpose: "样本抽检", sampler: "张建国", samplerPhone: "13809312222", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-04-17", outQty: "0.5000 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 4,
cert: "6204122022007087",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "青花菜 (西兰花)",
variety: "西蓝花 VBR005",
inboundQty: "0.2200 千克",
events: [
{ time: "2022-04-15", outQty: "0.1000 千克", purpose: "样本抽检", sampler: "张建国", samplerPhone: "13809312222", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-04-17", outQty: "0.0800 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 5,
cert: "6202442022007001",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "胡萝卜",
variety: "胡萝卜 VCR324",
inboundQty: "0.4900 千克",
events: [
{ time: "2022-04-18", outQty: "0.2000 千克", purpose: "样本抽检", sampler: "李文娟", samplerPhone: "13909310001", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-04-20", outQty: "0.1500 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 6,
cert: "6203122022007067",
unit: "甘肃杰尼尔种子有限公司",
plant: "辣椒",
variety: "80",
inboundQty: "9.8800 千克",
events: [
{ time: "2022-04-25", outQty: "5.0000 千克", purpose: "样本抽检", sampler: "赵文言", samplerPhone: "18993755577", operator: "黄海涛", operatorPhone: "13893705588" },
{ time: "2022-04-27", outQty: "4.5000 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 7,
cert: "6203072022007093",
unit: "酒泉市酒洲种子有限责任公司",
plant: "番茄",
variety: "番茄",
inboundQty: "1.8100 千克",
events: [
{ time: "2022-04-08", outQty: "0.8000 千克", purpose: "样本抽检", sampler: "马世锋", samplerPhone: "13993708175", operator: "黄海涛", operatorPhone: "13893705588" },
{ time: "2022-04-10", outQty: "0.7000 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 8,
cert: "6203092022007071",
unit: "张掖市瑞真种业有限公司",
plant: "五色菊",
variety: "五色菊",
inboundQty: "1.8700 千克",
events: [
{ time: "2022-04-20", outQty: "0.9000 千克", purpose: "样本抽检", sampler: "吴多志", samplerPhone: "13993662953", operator: "黄海涛", operatorPhone: "13893705588" },
{ time: "2022-04-22", outQty: "0.8000 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 9,
cert: "6201162022007023",
unit: "张掖市亚太种业有限责任公司",
plant: "南瓜",
variety: "南瓜",
inboundQty: "3.2800 千克",
events: [
{ time: "2022-04-28", outQty: "1.5000 千克", purpose: "样本抽检", sampler: "姚庆库", samplerPhone: "18919369888", operator: "黄海涛", operatorPhone: "13893705588" },
{ time: "2022-04-30", outQty: "1.6000 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
},
{
id: 10,
cert: "6204122022007065",
unit: "甘肃富赢种子高新科技有限责任公司",
plant: "翠菊",
variety: "翠菊",
inboundQty: "0.0013 千克",
events: [
{ time: "2022-05-05", outQty: "0.0005 千克", purpose: "样本抽检", sampler: "李文娟", samplerPhone: "13909310001", operator: "张明远", operatorPhone: "13809312222" },
{ time: "2022-05-07", outQty: "0.0004 千克", purpose: "隔离试种", sampler: "陈思远", samplerPhone: "13909320002", operator: "王芳", operatorPhone: "13909330003" }
]
}
];
\ No newline at end of file
// 样本接收登记数据 // 样本接收登记数据
export const sampleRegisterData = [ export const sampleRegisterData = [
{ id: 1, cert: "6204122022007095", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", approveQty: "40 千克", storeDate: "2022-03-01", contact: "刘玉堂", phone: "18993607501" }, { id: 1, cert: "6204122022007095", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", storeQty: "0.0013 千克", entryPort: "昆明长水国际机场", approveQty: "40 千克", storeDate: "2022-03-01", contact: "刘玉堂", phone: "18993607501" },
{ id: 2, cert: "6205022022007347", unit: "甘肃富赢种子高新科技有限责任公司", plant: "莴苣", variety: "生菜", origin: "美国", qty: "0.2950 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" }, { id: 2, cert: "6205022022007347", unit: "甘肃富赢种子高新科技有限责任公司", plant: "莴苣", variety: "生菜", origin: "美国", qty: "0.2950 千克", storeQty: "0.1500 千克", entryPort: "昆明长水国际机场", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 3, cert: "6205022022007269", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR007", origin: "美国", qty: "2.3920 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" }, { id: 3, cert: "6205022022007269", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR007", origin: "美国", qty: "2.3920 千克", storeQty: "2.2700 千克", entryPort: "昆明长水国际机场", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 4, cert: "6204122022007087", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR005", origin: "智利", qty: "0.3700 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" }, { id: 4, cert: "6204122022007087", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR005", origin: "智利", qty: "0.3700 千克", storeQty: "0.2200 千克", entryPort: "昆明长水国际机场", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 5, cert: "6202442022007001", unit: "甘肃富赢种子高新科技有限责任公司", plant: "胡萝卜", variety: "胡萝卜 VCR324", origin: "南非", qty: "0.6150 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" }, { id: 5, cert: "6202442022007001", unit: "甘肃富赢种子高新科技有限责任公司", plant: "胡萝卜", variety: "胡萝卜 VCR324", origin: "南非", qty: "0.6150 千克", storeQty: "0.4900 千克", entryPort: "昆明长水国际机场", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 6, cert: "6203122022007067", unit: "甘肃杰尼尔种子有限公司", plant: "辣椒", variety: "80", origin: "西班牙", qty: "10.0 千克", approveQty: "10 千克", storeDate: "2022-04-01", contact: "赵文言", phone: "18993755577" }, { id: 6, cert: "6203122022007067", unit: "甘肃杰尼尔种子有限公司", plant: "辣椒", variety: "80", origin: "西班牙", qty: "10.0 千克", storeQty: "9.8800 千克", entryPort: "昆明长水国际机场", approveQty: "10 千克", storeDate: "2022-04-01", contact: "赵文言", phone: "18993755577" },
{ id: 7, cert: "6204122022007065", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", approveQty: "40 千克", storeDate: "2022-02-18", contact: "刘玉堂", phone: "18993607501" }, { id: 7, cert: "6204122022007065", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", storeQty: "0.0013 千克", entryPort: "昆明长水国际机场", approveQty: "40 千克", storeDate: "2022-02-18", contact: "刘玉堂", phone: "18993607501" },
{ id: 8, cert: "6203072022007093", unit: "酒泉市酒洲种子有限责任公司", plant: "番茄", variety: "番茄", origin: "意大利", qty: "1.9540 千克", approveQty: "50 千克", storeDate: "2022-03-10", contact: "马世锋", phone: "13993708175" }, { id: 8, cert: "6203072022007093", unit: "酒泉市酒洲种子有限责任公司", plant: "番茄", variety: "番茄", origin: "意大利", qty: "1.9540 千克", storeQty: "1.8100 千克", entryPort: "昆明长水国际机场", approveQty: "50 千克", storeDate: "2022-03-10", contact: "马世锋", phone: "13993708175" },
{ id: 9, cert: "6203092022007071", unit: "张掖市瑞真种业有限公司", plant: "五色菊", variety: "五色菊", origin: "荷兰", qty: "2.0000 千克", approveQty: "5 千克", storeDate: "2022-03-20", contact: "吴多志", phone: "13993662953" }, { id: 9, cert: "6203092022007071", unit: "张掖市瑞真种业有限公司", plant: "五色菊", variety: "五色菊", origin: "荷兰", qty: "2.0000 千克", storeQty: "1.8700 千克", entryPort: "昆明长水国际机场", approveQty: "5 千克", storeDate: "2022-03-20", contact: "吴多志", phone: "13993662953" },
{ id: 10, cert: "6201162022007023", unit: "张掖市亚太种业有限责任公司", plant: "南瓜", variety: "南瓜", origin: "日本", qty: "3.4000 千克", approveQty: "5 千克", storeDate: "2022-04-02", contact: "姚庆库", phone: "18919369888" } { id: 10, cert: "6201162022007023", unit: "张掖市亚太种业有限责任公司", plant: "南瓜", variety: "南瓜", origin: "日本", qty: "3.4000 千克", storeQty: "3.2800 千克", entryPort: "昆明长水国际机场", approveQty: "5 千克", storeDate: "2022-04-02", contact: "姚庆库", phone: "18919369888" }
]; ];
\ No newline at end of file
...@@ -3,27 +3,25 @@ import { useTabsStore } from "@/store/tabs"; ...@@ -3,27 +3,25 @@ import { useTabsStore } from "@/store/tabs";
const routes = [ const routes = [
{ path: "/", redirect: "/home" }, { path: "/", redirect: "/home" },
{ path: "/home", name: "home", component: () => import("@/views/HomeView.vue"), meta: { title: "首页", breadcrumb: "首页 / 数据看板" } }, { path: "/home", name: "home", component: () => import("@/views/HomeView.vue"), meta: { title: "首页", breadcrumb: "首页" } },
{ path: "/entrust/reg", name: "entrust-reg", component: () => import("@/views/entrust/EntrustReg.vue"), meta: { title: "委托书登记", breadcrumb: "委托书管理 / 委托书登记" } }, { path: "/entrust/reg", name: "entrust-reg", component: () => import("@/views/entrust/EntrustReg.vue"), meta: { title: "委托书登记", breadcrumb: "委托书管理 / 委托书登记" } },
{ path: "/entrust/list", name: "entrust-list", component: () => import("@/views/entrust/EntrustList.vue"), meta: { title: "委托书管理", breadcrumb: "委托书管理" } }, { path: "/entrust/list", name: "entrust-list", component: () => import("@/views/entrust/EntrustList.vue"), meta: { title: "委托书管理", breadcrumb: "委托书管理" } },
{ path: "/entrust/audit", name: "entrust-audit", component: () => import("@/views/entrust/EntrustAudit.vue"), meta: { title: "委托书审核", breadcrumb: "委托书管理 / 委托书审核" } }, { path: "/entrust/audit", name: "entrust-audit", component: () => import("@/views/entrust/EntrustAudit.vue"), meta: { title: "委托书审核", breadcrumb: "委托书管理 / 委托书审核" } },
{ path: "/entrust/archive", name: "entrust-archive", component: () => import("@/views/entrust/EntrustArchive.vue"), meta: { title: "委托书归档", breadcrumb: "委托书管理 / 委托书归档" } }, { path: "/entrust/archive", name: "entrust-archive", component: () => import("@/views/entrust/EntrustArchive.vue"), meta: { title: "委托书归档", breadcrumb: "委托书管理 / 委托书归档" } },
{ path: "/sample/register", name: "sample-register", component: () => import("@/views/sample/SampleRegister.vue"), meta: { title: "样本登记入库", breadcrumb: "样本管理 / 样本登记入库" } }, { path: "/sample/register", name: "sample-register", component: () => import("@/views/sample/SampleRegister.vue"), meta: { title: "样本登记入库", breadcrumb: "样本管理 / 样本登记入库" } },
{ path: "/sample/storage", name: "sample-storage", component: () => import("@/views/sample/SampleStorage.vue"), meta: { title: "样本存放管理", breadcrumb: "样本管理 / 样本存放管理" } }, { path: "/sample/out", name: "sample-out", component: () => import("@/views/sample/SampleOut.vue"), meta: { title: "样本出库管理", breadcrumb: "样本管理 / 样本出库管理" } },
{ path: "/sample/out", name: "sample-out", component: () => import("@/views/sample/SampleOut.vue"), meta: { title: "样本出库登记", breadcrumb: "样本管理 / 样本出库登记" } },
{ path: "/lab/sample-test", name: "lab-sample-test", component: () => import("@/views/lab/SampleTest.vue"), meta: { title: "样本抽检", breadcrumb: "实验室检测 / 样本抽检" } }, { path: "/lab/sample-test", name: "lab-sample-test", component: () => import("@/views/lab/SampleTest.vue"), meta: { title: "样本抽检", breadcrumb: "实验室检测 / 样本抽检" } },
{ path: "/lab/experiment-test", name: "lab-experiment-test", component: () => import("@/views/lab/ExperimentTest.vue"), meta: { title: "实验检验", breadcrumb: "实验室检测 / 实验检验" } }, { path: "/lab/experiment-test", name: "lab-experiment-test", component: () => import("@/views/lab/ExperimentTest.vue"), meta: { title: "实验检验", breadcrumb: "实验室检测 / 实验检验" } },
{ path: "/field/survey", name: "field-survey", component: () => import("@/views/field/FieldSurvey.vue"), meta: { title: "田间调查", breadcrumb: "田间调查" } }, { path: "/field/survey", name: "field-survey", component: () => import("@/views/field/FieldSurvey.vue"), meta: { title: "田间调查", breadcrumb: "田间调查" } },
{ path: "/disposal", name: "disposal-list", component: () => import("@/views/pest/PestHandle.vue"), meta: { title: "除害处理", breadcrumb: "除害处理 / 除害处理" } }, { path: "/disposal", name: "disposal-list", component: () => import("@/views/pest/PestHandle.vue"), meta: { title: "除害处理", breadcrumb: "除害处理 / 除害处理" } },
{ path: "/isolation/device", name: "isolation-device", component: () => import("@/views/isolation/DeviceOverview.vue"), meta: { title: "设备总览", breadcrumb: "隔离监测 / 设备总览" } }, { path: "/isolation/device", name: "isolation-device", component: () => import("@/views/isolation/DeviceOverview.vue"), meta: { title: "设备总览", breadcrumb: "隔离监测 / 设备总览" } },
{ path: "/isolation/data", name: "isolation-data", component: () => import("@/views/isolation/MonitorData.vue"), meta: { title: "监测数据", breadcrumb: "隔离监测 / 监测数据" } }, { path: "/isolation/data", name: "isolation-data", component: () => import("@/views/isolation/MonitorData.vue"), meta: { title: "监测数据", breadcrumb: "隔离监测 / 监测数据" } },
{ path: "/isolation/analysis", name: "isolation-analysis", component: () => import("@/views/isolation/MonitorAnalysis.vue"), meta: { title: "监测数据分析", breadcrumb: "隔离监测 / 监测数据分析" } }, { path: "/analysis", name: "analysis", component: () => import("@/views/analysis/DataAnalysis.vue"), meta: { title: "风险分析", breadcrumb: "风险分析" } },
{ path: "/analysis", name: "analysis", component: () => import("@/views/analysis/DataAnalysis.vue"), meta: { title: "数据分析", breadcrumb: "数据分析" } },
{ path: "/risk", name: "risk", component: () => import("@/views/risk/RiskWarning.vue"), meta: { title: "风险预警", breadcrumb: "风险预警" } },
{ path: "/report", name: "report", component: () => import("@/views/report/ReportManage.vue"), meta: { title: "报告管理", breadcrumb: "报告管理" } }, { path: "/report", name: "report", component: () => import("@/views/report/ReportManage.vue"), meta: { title: "报告管理", breadcrumb: "报告管理" } },
{ path: "/audit/cert", name: "audit-cert", component: () => import("@/views/audit/AuditCert.vue"), meta: { title: "审核发证", breadcrumb: "审核发证" } }, { path: "/base/quarantine", name: "base-quarantine", component: () => import("@/views/base/Quarantine.vue"), meta: { title: "检疫员管理", breadcrumb: "基础信息管理 / 检疫员管理" } },
{ path: "/base/experimenter", name: "base-experimenter", component: () => import("@/views/base/Experimenter.vue"), meta: { title: "实验员管理", breadcrumb: "基础信息管理 / 实验员管理" } },
{ path: "/settings/users", name: "settings-users", component: () => import("@/views/settings/Users.vue"), meta: { title: "用户管理", breadcrumb: "系统设置 / 用户管理" } }, { path: "/settings/users", name: "settings-users", component: () => import("@/views/settings/Users.vue"), meta: { title: "用户管理", breadcrumb: "系统设置 / 用户管理" } },
{ path: "/settings/roles", name: "settings-roles", component: () => import("@/views/settings/Roles.vue"), meta: { title: "角色权限", breadcrumb: "系统设置 / 角色权限" } }, { path: "/settings/roles", name: "settings-roles", component: () => import("@/views/settings/Roles.vue"), meta: { title: "角色管理", breadcrumb: "系统设置 / 角色管理" } },
{ path: "/settings/dict", name: "settings-dict", component: () => import("@/views/settings/Dict.vue"), meta: { title: "数据字典", breadcrumb: "系统设置 / 数据字典" } }, { path: "/settings/dict", name: "settings-dict", component: () => import("@/views/settings/Dict.vue"), meta: { title: "数据字典", breadcrumb: "系统设置 / 数据字典" } },
{ path: "/settings/log", name: "settings-log", component: () => import("@/views/settings/Log.vue"), meta: { title: "操作日志", breadcrumb: "系统设置 / 操作日志" } } { path: "/settings/log", name: "settings-log", component: () => import("@/views/settings/Log.vue"), meta: { title: "操作日志", breadcrumb: "系统设置 / 操作日志" } }
]; ];
......
<template>
<PagePlaceholder title="审核发证" desc="检疫结果审核与证书签发开发中" icon="Stamp" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="监测数据分析" desc="监测数据分析模块正在搭建中" icon="Monitor" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
...@@ -691,13 +691,13 @@ ...@@ -691,13 +691,13 @@
<script setup> <script setup>
import { ref, computed, reactive, watch, onMounted } from "vue"; import { ref, computed, reactive, watch, onMounted } from "vue";
import { useRouter } from "vue-router"; import { useRouter, useRoute } from "vue-router";
const sideTabs = [ const sideTabs = [
{ key: "type", name: "设备类型", icon: "List" }, { key: "station", name: "监测点", icon: "LocationFilled" },
{ key: "station", name: "监测点", icon: "LocationFilled" } { key: "type", name: "设备类型", icon: "List" }
]; ];
const activeSideTab = ref("type"); const activeSideTab = ref("station");
const typeMap = { const typeMap = {
climate: { name: "小气候仪", color: "#d71e1e" }, climate: { name: "小气候仪", color: "#d71e1e" },
...@@ -1091,11 +1091,30 @@ const toggleStation = (key) => { ...@@ -1091,11 +1091,30 @@ const toggleStation = (key) => {
if (g) g.expanded = !g.expanded; if (g) g.expanded = !g.expanded;
}; };
const router = useRouter(); const router = useRouter();
const route = useRoute();
const onSelectDevice = (d) => { const onSelectDevice = (d) => {
activeDeviceId.value = d.id; activeDeviceId.value = d.id;
hoverIdx.value = -1; hoverIdx.value = -1;
}; };
// 从设备总览跳转过来时,按 query.deviceId 预选设备并展开对应分组
function applyDeviceIdFromQuery() {
const q = route.query.deviceId;
if (q == null || q === "") return;
const id = Number(q);
if (!Number.isFinite(id)) return;
const d = devices.find((x) => x.id === id);
if (!d) return;
activeDeviceId.value = id;
activeTypeKey.value = d.type;
const g = typeGroups.find((x) => x.key === d.type);
if (g) g.expanded = true;
const sg = stationGroups.find((x) => x.key === (d.station === "1号大棚" ? "g1" : "g2"));
if (sg) sg.expanded = true;
activeSideTab.value = "type";
hoverIdx.value = -1;
}
// 时间筛选 // 时间筛选
const timeTabs = [ const timeTabs = [
{ key: "m1", name: "近一月", months: 1 }, { key: "m1", name: "近一月", months: 1 },
...@@ -1335,7 +1354,7 @@ function tick() { ...@@ -1335,7 +1354,7 @@ function tick() {
const week = ["日", "一", "二", "三", "四", "五", "六"][d.getDay()]; const week = ["日", "一", "二", "三", "四", "五", "六"][d.getDay()];
nowStr.value = `${d.getFullYear()}年${pad(d.getMonth() + 1)}月${pad(d.getDate())}日 星期${week} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; nowStr.value = `${d.getFullYear()}年${pad(d.getMonth() + 1)}月${pad(d.getDate())}日 星期${week} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
} }
onMounted(() => { tick(); clockTimer = setInterval(tick, 1000); }); onMounted(() => { applyDeviceIdFromQuery(); tick(); clockTimer = setInterval(tick, 1000); });
import { onBeforeUnmount } from "vue"; import { onBeforeUnmount } from "vue";
onBeforeUnmount(() => { if (clockTimer) clearInterval(clockTimer); }); onBeforeUnmount(() => { if (clockTimer) clearInterval(clockTimer); });
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div class="filter-box"> <div class="filter-box">
<div class="filter-row"> <div class="filter-row">
<div class="filter-item"> <div class="filter-item">
<label>抽样日期:</label> <label>检验日期:</label>
<DatePicker v-model="filters.testStart" class="dp-160" placeholder="开始日期" /> <DatePicker v-model="filters.testStart" class="dp-160" placeholder="开始日期" />
<span class="dash">至</span> <span class="dash">至</span>
<DatePicker v-model="filters.testEnd" class="dp-160" placeholder="结束日期" /> <DatePicker v-model="filters.testEnd" class="dp-160" placeholder="结束日期" />
...@@ -39,15 +39,14 @@ ...@@ -39,15 +39,14 @@
<div class="tbl-wrap"> <div class="tbl-wrap">
<table class="simple-table"> <table class="simple-table">
<colgroup> <colgroup>
<col style="width:5%" /> <col style="width:4%" />
<col style="width:14%" /> <col style="width:13%" />
<col style="width:22%" /> <col style="width:22%" />
<col style="width:9%" /> <col style="width:9%" />
<col style="width:9%" /> <col style="width:9%" />
<col style="width:9%" />
<col style="width:11%" /> <col style="width:11%" />
<col style="width:13%" /> <col style="width:13%" />
<col style="width:8%" /> <col style="width:13%" />
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
...@@ -56,8 +55,7 @@ ...@@ -56,8 +55,7 @@
<th>受检单位</th> <th>受检单位</th>
<th>植物名称</th> <th>植物名称</th>
<th>品种名称</th> <th>品种名称</th>
<th>抽检数量</th> <th>检验日期</th>
<th>抽样日期</th>
<th>检验机构</th> <th>检验机构</th>
<th>操作</th> <th>操作</th>
</tr> </tr>
...@@ -69,7 +67,6 @@ ...@@ -69,7 +67,6 @@
<td class="col-unit">{{ r.unit }}</td> <td class="col-unit">{{ r.unit }}</td>
<td>{{ r.plant }}</td> <td>{{ r.plant }}</td>
<td>{{ r.variety }}</td> <td>{{ r.variety }}</td>
<td>{{ r.qty }}</td>
<td>{{ r.testDate }}</td> <td>{{ r.testDate }}</td>
<td>{{ r.testOrg }}</td> <td>{{ r.testOrg }}</td>
<td class="col-action"> <td class="col-action">
...@@ -79,7 +76,7 @@ ...@@ -79,7 +76,7 @@
</td> </td>
</tr> </tr>
<tr v-if="!pagedData.length"> <tr v-if="!pagedData.length">
<td colspan="9" class="empty">暂无数据</td> <td colspan="8" class="empty">暂无数据</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
...@@ -128,7 +125,7 @@ ...@@ -128,7 +125,7 @@
</span> </span>
</div> </div>
<div class="form-field"><span class="label">植物名称</span><span class="ctrl mb-input">{{ form.plant }}</span></div> <div class="form-field"><span class="label">植物名称</span><span class="ctrl mb-input">{{ form.plant }}</span></div>
<div class="form-field"><span class="label">抽样日期</span><span class="ctrl mb-input">{{ form.testDate }}</span></div> <div class="form-field"><span class="label">检验日期</span><span class="ctrl mb-input">{{ form.testDate }}</span></div>
<div class="form-field span-2"><span class="label">目标有害生物</span><span class="ctrl mb-input area prewrap">{{ form.targetPests }}</span></div> <div class="form-field span-2"><span class="label">目标有害生物</span><span class="ctrl mb-input area prewrap">{{ form.targetPests }}</span></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样人</span><span class="ctrl mb-input">{{ form.receiver }}</span></div> <div class="form-field"><span class="label"><span class="req">*</span>收样人</span><span class="ctrl mb-input">{{ form.receiver }}</span></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><span class="ctrl mb-input">{{ form.receiveDate }}</span></div> <div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><span class="ctrl mb-input">{{ form.receiveDate }}</span></div>
...@@ -183,7 +180,7 @@ ...@@ -183,7 +180,7 @@
</span> </span>
</div> </div>
<div class="form-field"><span class="label">植物名称</span><input class="ctrl" v-model="form.plant" /></div> <div class="form-field"><span class="label">植物名称</span><input class="ctrl" v-model="form.plant" /></div>
<div class="form-field"><span class="label">抽样日期</span><DatePicker v-model="form.testDate" class="ctrl" /></div> <div class="form-field"><span class="label">检验日期</span><DatePicker v-model="form.testDate" class="ctrl" /></div>
<div class="form-field span-2"><span class="label">目标有害生物</span><textarea class="ctrl area-input prewrap" v-model="form.targetPests" rows="4" placeholder="每条有害生物占一行"></textarea></div> <div class="form-field span-2"><span class="label">目标有害生物</span><textarea class="ctrl area-input prewrap" v-model="form.targetPests" rows="4" placeholder="每条有害生物占一行"></textarea></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样人</span><input class="ctrl" v-model="form.receiver" /></div> <div class="form-field"><span class="label"><span class="req">*</span>收样人</span><input class="ctrl" v-model="form.receiver" /></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><DatePicker v-model="form.receiveDate" class="ctrl" /></div> <div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><DatePicker v-model="form.receiveDate" class="ctrl" /></div>
...@@ -242,7 +239,7 @@ ...@@ -242,7 +239,7 @@
</span> </span>
</div> </div>
<div class="form-field"><span class="label">植物名称</span><input class="ctrl" v-model="addForm.plant" /></div> <div class="form-field"><span class="label">植物名称</span><input class="ctrl" v-model="addForm.plant" /></div>
<div class="form-field"><span class="label">抽样日期</span><DatePicker v-model="addForm.testDate" class="ctrl" /></div> <div class="form-field"><span class="label">检验日期</span><DatePicker v-model="addForm.testDate" class="ctrl" /></div>
<div class="form-field span-2"><span class="label">目标有害生物</span><textarea class="ctrl area-input prewrap" v-model="addForm.targetPests" rows="4" placeholder="每条有害生物占一行"></textarea></div> <div class="form-field span-2"><span class="label">目标有害生物</span><textarea class="ctrl area-input prewrap" v-model="addForm.targetPests" rows="4" placeholder="每条有害生物占一行"></textarea></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样人</span><input class="ctrl" v-model="addForm.receiver" /></div> <div class="form-field"><span class="label"><span class="req">*</span>收样人</span><input class="ctrl" v-model="addForm.receiver" /></div>
<div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><DatePicker v-model="addForm.receiveDate" class="ctrl" /></div> <div class="form-field"><span class="label"><span class="req">*</span>收样日期</span><DatePicker v-model="addForm.receiveDate" class="ctrl" /></div>
...@@ -437,7 +434,7 @@ const onConfirmEdit = () => { ...@@ -437,7 +434,7 @@ const onConfirmEdit = () => {
updateRecord(updated); updateRecord(updated);
} else { } else {
// 来源于田间调查的记录:只更新受检单位等不属于田间调查的字段 // 来源于田间调查的记录:只更新受检单位等不属于田间调查的字段
// 受检单位/联系人/电话/植物名称/抽样日期/收样人/收样日期/检验方法/检验结果/审核人/备注 // 受检单位/联系人/电话/植物名称/检验日期/收样人/收样日期/检验方法/检验结果/审核人/备注
const surveyFields = ["unit","contact","phone","plant","variety","origin","approveQty","importQty","testDate","testOrg","inspector1","inspector2","inspectorPhone","entryDate","surveyProvince","surveyCity","surveyDistrict","surveyTownship","surveyAddress","targetPests","sampleUnit","sampleContact","samplePhone"]; const surveyFields = ["unit","contact","phone","plant","variety","origin","approveQty","importQty","testDate","testOrg","inspector1","inspector2","inspectorPhone","entryDate","surveyProvince","surveyCity","surveyDistrict","surveyTownship","surveyAddress","targetPests","sampleUnit","sampleContact","samplePhone"];
const merged = { ...updated }; const merged = { ...updated };
updateRecord(merged); updateRecord(merged);
......
<template> <template>
<div class="page-list"> <div class="page-list">
<div class="filter-box"> <div class="filter-box">
<div class="filter-row"> <div class="filter-row">
...@@ -39,15 +39,15 @@ ...@@ -39,15 +39,15 @@
<div class="tbl-wrap"> <div class="tbl-wrap">
<table class="simple-table"> <table class="simple-table">
<colgroup> <colgroup>
<col style="width:5%" /> <col style="width:4%" />
<col style="width:14%" /> <col style="width:13%" />
<col style="width:22%" /> <col style="width:19%" />
<col style="width:9%" /> <col style="width:9%" />
<col style="width:9%" /> <col style="width:9%" />
<col style="width:9%" /> <col style="width:9%" />
<col style="width:11%" /> <col style="width:11%" />
<col style="width:13%" /> <col style="width:13%" />
<col style="width:8%" /> <col style="width:13%" />
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
......
<template>
<PagePlaceholder title="样本存放管理" desc="样本存放位置与状态管理开发中" icon="Box" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论