Pārlūkot izejas kodu

添加代码修改

Redeem 1 mēnesi atpakaļ
vecāks
revīzija
c16082b4b3

+ 237 - 0
.workbuddy/artifacts/testProjectConfiguration性能分析报告.md

@@ -0,0 +1,237 @@
+# testProjectConfiguration 页面性能分析报告
+
+**项目**:广西北港新材料检化验系统(beiHai-ui / beiHai-lims)
+**页面**:`src/views/standardManagement/components/testProjectConfiguration/testProjectConfiguration.vue`
+**现象**:页面从打开到渲染完毕约需 **20 秒**
+**分析时间**:2026-08-28
+
+---
+
+## 一、结论速览
+
+该页面 20 秒耗时**不是数据库单条 SQL 慢**(已实测全部核心 SQL 均在 250ms 以内),而是**请求数量爆炸 + 前端渲染过重 + 无索引全表扫描**三者叠加:
+
+1. **页面一打开并发发出约 19 个 HTTP 请求**(父组件 5 个 + 3 个弹窗子组件 14 个),其中 5+ 个是 `pageSize=9999 / 99999` 的全量查询 —— 这是最大的元凶
+2. **3 个弹窗子组件在页面挂载时即被实例化并执行 mounted 请求**,弹窗根本没打开数据就全拉回来了
+3. **页面同时渲染 3 个巨型表格**(25 / 32 / 12 列),全部列 `sortable + show-overflow-tooltip + show-summary 合计 + fixed 左列`,`el-tabs` 非激活页也渲染,DOM 与 tooltip 实例开销巨大
+4. 后端核心表**除主键外几乎无索引**,`ORDER BY CREATE_TIME DESC` 每次全表排序;数据量增长后(生产库)单条 SQL 会指数级变慢
+5. 存在**纯冗余请求**:`gettestItemNameTypeList()` 请求的 `testItemNameType` 在模板中根本未使用
+
+---
+
+## 二、实测证据(数据库直连验证,只读)
+
+连接:`jdbc:oracle:thin:@172.16.4.164:1521/lims`
+
+### 2.1 数据量(开发库)
+| 表 | 行数 |
+|---|---|
+| LIMS_STD_TEST_ITEM(测试项目) | 1050 |
+| LIMS_STD_ANLY_ITEM(分析项目) | 741 |
+| LIMS_STD_TEST_ITEM_D(子表) | 8309 |
+| LIMS_STD_TEST_MATCH(方法标准) | 318 |
+| LIMS_BASE_INFO | 542 |
+
+### 2.2 索引情况
+| 表 | 索引 |
+|---|---|
+| LIMS_STD_TEST_ITEM | **仅主键 TEST_ITEM_NO** |
+| LIMS_STD_TEST_ITEM_D | **仅主键 TEST_ITEM_NO_D**(TEST_ITEM_NO 无索引!) |
+| LIMS_STD_TEST_MATCH | **仅主键 TEST_STD_NO**(TEST_ITEM_NO 无索引!) |
+| LIMS_STD_ANLY_ITEM | **无任何索引** |
+
+执行计划确认:子表按 TEST_ITEM_NO 查询走 **TABLE ACCESS FULL(全表扫描)**。
+
+### 2.3 核心 SQL 实测耗时(开发库,重复 3 次取最优)
+| SQL | 耗时 | 行数 |
+|---|---|---|
+| 测试项目分页 50 条 | 52 ms | 50 |
+| 测试项目全量 validFlag=1 | 127 ms | 329 |
+| 分析项目全量 ORDER BY | 235 ms | 741 |
+| 子表 D 按 TEST_ITEM_NO 查 | 24~49 ms | 5 |
+| 方法标准按 TEST_ITEM_NO 查 | 25 ms | 0 |
+| 各字典全量(规则/岗位/单位/修约/公式) | 48~124 ms | 12~383 |
+| COUNT(*) | 25 ms | 1 |
+
+> ⚠️ 单条 SQL 都不慢,但 **19 个请求 ×(count 查询 + 数据查询 + JSON 序列化 + 网络传输)** 叠加,且生产库数据量可能是开发库的 10~100 倍,无索引的全表扫描会显著放大耗时。
+
+---
+
+## 三、问题清单(按严重程度排序)
+
+### 🔴 P0-1 弹窗子组件挂载即发请求 —— 页面一打开并发 19 个请求
+
+页面底部 3 个弹窗组件**没有任何懒加载控制**,组件在父页面 `mounted` 时就被实例化并执行各自的 `mounted`:
+
+```html
+<!-- testProjectConfiguration.vue L320-323 -->
+<div is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
+<div is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
+<div is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
+```
+
+各子组件 `mounted` 发出的请求:
+
+**alertComponents.vue(新增/修改测试项目弹窗)**:
+- `queryBaseInfoByBaseCode(4840)`
+- `queryLimsBaseRuleInfoPage` **pageSize=9999** ← 全量
+- `queryLimsBasePostPage` **pageSize=99999** ← 全量
+- `queryBaseInfoByBaseCode(4808)`
+- `queryBaseInfoByBaseCode(4804)`
+
+**alertComponents3.vue(分析项目弹窗)**:
+- `queryLimsStdAnlyItemPage` **pageSize=9999** ← 全量
+- `queryLimsBaseUnitPage` **pageSize=9999** ← 全量
+- `queryBaseInfoByBaseCode(4825)`
+- `queryBaseInfoByBaseCode(4810)`
+- `queryLimsBaseReviseRulePage` **pageSize=9999** ← 全量
+- `queryBaseInfoByBaseCode(4804)`
+- `queryLimsBaseFormulaPage` **pageSize=9999** ← 全量
+
+**alertComponents4.vue(方法标准弹窗)**:
+- `queryBaseInfoByBaseCode(4805)`
+
+**父组件 mounted(L414-426)**:
+- `queryBaseInfoByBaseCode(4804)`
+- `getList()` → 分析项目分页 **pageSize=500**(仅弹窗使用,页面打开就拉)
+- `getDataList()` → 主表分页 50
+- `gettestItemNameTypeList()` → GET 全量(见 P0-2)
+- `addScreen / addScreen2 / addScreen3` → 操作 DOM
+
+> **合计约 19 个请求并发发出**,浏览器同一域名并发上限通常 6 个,大量请求排队 + 后端逐个处理 + 响应体全量传输,是 20 秒的主要构成。
+
+### 🔴 P0-2 冗余请求:gettestItemNameTypeList 结果从未使用
+
+```js
+// L430-435
+gettestItemNameTypeList () {
+   this.axios.get('pass/baseManagement/v1/limsstdtestitems/'+ '?validFlag=1')
+        .then(res => { this.testItemNameType = res.data.list; })
+},
+```
+
+- 该请求拉取**全部测试项目**(GET 无分页参数),结果存入 `testItemNameType`
+- 但模板中搜索 `testItemNameType` —— **从未被引用**!下拉框用的是 `itemTypeNameType`(来自 `queryBaseInfoByBaseCode`)
+- 属于死代码请求,白拉全量数据,应删除
+
+### 🟠 P1-3 表格渲染过重(3 个表格 × 全列 sortable/tooltip/fixed/合计)
+
+- 主表 25 列、分析项目表 32 列、方法标准表 12 列,**所有列**都加了 `sortable` + `:show-overflow-tooltip="true"`
+- 每个表都开启 `show-summary` 合计行 + `:icore-filter-flag`(自定义筛选)
+- `el-tabs` 的两个 tab **非激活也渲染 DOM**(未配置 lazy)
+- `el-table` 的 `show-overflow-tooltip` 会给每个单元格注册 tooltip 实例,50 行 × 25 列 = 1250 个单元格 + tooltip 初始化,加上 fixed 列双份渲染,DOM 量巨大
+- `tableRowClassName` 等行回调每行每列执行,渲染阶段开销翻倍
+
+### 🟠 P1-4 后端索引缺失,生产库风险高
+
+- 4 张核心表**除主键外无业务索引**
+- `TEST_ITEM_NO` 作为高频查询条件(子表 D、MATCH 表)**无索引 → 全表扫描**(已用执行计划证实)
+- `ORDER BY CREATE_TIME DESC` 无索引,每次全表排序;`LIKE '%${x}%'` 无法走索引
+- 开发库 1 千~8 千行还撑得住;**生产库一旦上万行,单条 SQL 就会从 50ms 恶化到数秒**,19 个请求全部变慢 → 20 秒甚至更久
+
+### 🟡 P2-5 交互触发额外请求风暴
+
+```js
+// L799-807 每次勾选变化就发 2 个请求
+handleSelectionChange (val) {
+  this.multipleSelection = val;
+  if (val.length > 0) {
+    this.testItemNo = val[val.length-1].testItemNo
+    this.getDataList2(this.testItemNo);  // pageSize=990
+    this.getDataList3(this.testItemNo);  // pageSize=990
+  }
+},
+// L846-858 每次点击行也发 2 个请求
+handleCurrentChange (val) { ... this.getDataList2(...); this.getDataList3(...); }
+```
+
+- 点击/勾选任意一行,立即触发 **2 个 pageSize=990 的子表查询**
+- 勾选多行时会连续触发多次,形成请求风暴
+- 且 `getDataList2/getDataList3` 的 pageSize 高达 **990**,每次几乎全量拉取子表
+
+### 🟡 P2-6 后端日志级别 DEBUG + SQL 全量输出
+
+```properties
+logging.level.com.steerinfo=DEBUG
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+```
+
+每执行一条 SQL 都打印到控制台;19 个请求 × 多条 SQL = 几十行日志输出,生产环境日志量大时也会拖慢接口响应。
+
+---
+
+## 四、请求链路全景图
+
+```
+页面打开 (mounted)
+├─ 父组件 testProjectConfiguration.vue
+│   ├─ queryBaseInfoByBaseCode(4804)          字典
+│   ├─ getList() → 分析项目 pageSize=500       ← 仅弹窗用,提前拉
+│   ├─ getDataList() → 测试项目 pageSize=50   主表
+│   ├─ gettestItemNameTypeList() → GET 全量    ← 死代码,结果未使用
+│   └─ addScreen ×3                            DOM 操作
+│
+├─ alertComponents (弹窗1,挂载即请求)
+│   ├─ queryBaseInfoByBaseCode(4840)
+│   ├─ queryLimsBaseRuleInfoPage   pageSize=9999
+│   ├─ queryLimsBasePostPage       pageSize=99999
+│   ├─ queryBaseInfoByBaseCode(4808)
+│   └─ queryBaseInfoByBaseCode(4804)
+│
+├─ alertComponents3 (弹窗2,挂载即请求)
+│   ├─ queryLimsStdAnlyItemPage    pageSize=9999
+│   ├─ queryLimsBaseUnitPage       pageSize=9999
+│   ├─ queryBaseInfoByBaseCode(4825)
+│   ├─ queryBaseInfoByBaseCode(4810)
+│   ├─ queryLimsBaseReviseRulePage pageSize=9999
+│   ├─ queryBaseInfoByBaseCode(4804)
+│   └─ queryLimsBaseFormulaPage    pageSize=9999
+│
+└─ alertComponents4 (弹窗3,挂载即请求)
+    └─ queryBaseInfoByBaseCode(4805)
+
+≈ 19 个并发请求(其中 6 个为全量查询)
+```
+
+---
+
+## 五、优化建议(按优先级)
+
+### 立即执行(改动小、收益大)
+
+1. **弹窗组件懒加载**:将 `<div is="alertComponets...">` 改为 `v-if` 控制,仅在首次打开对应弹窗时才渲染组件(配合 `dialogTableVisible`/`showFlag` 判断),或直接放到对应 `el-dialog` 内部。**这一步可砍掉约 14 个首屏请求**
+2. **删除 `gettestItemNameTypeList()`**(死代码,结果未使用)及其在 mounted 中的调用
+3. **`getList()` 改为弹窗打开时调用**(`addData2` 里触发),页面初始化不再拉 500 条分析项目
+
+### 应当执行
+
+4. **补索引**(后端,生产上线前必须):
+   ```sql
+   CREATE INDEX IDX_TID_TESTITEMNO ON LIMS_STD_TEST_ITEM_D(TEST_ITEM_NO);
+   CREATE INDEX IDX_TMATCH_TESTITEMNO ON LIMS_STD_TEST_MATCH(TEST_ITEM_NO);
+   CREATE INDEX IDX_TITEM_CREATETIME ON LIMS_STD_TEST_ITEM(CREATE_TIME);
+   CREATE INDEX IDX_ANLY_CREATETIME ON LIMS_STD_ANLY_ITEM(CREATE_TIME);
+   CREATE INDEX IDX_TITEM_VALIDFLAG ON LIMS_STD_TEST_ITEM(VALID_FLAG);
+   ```
+5. **降低弹窗字典查询 pageSize**:9999/99999 → 实际需要的数量(如 500),或改为远程搜索
+6. **控制子表分页 pageSize**:`getDataList2/3` 的 990 → 50~100,并给子表表格加上分页组件(目前分页被注释了)
+
+### 建议优化
+
+7. **表格瘦身**:
+   - 去掉每列的 `sortable`(仅保留 1~2 个关键列)
+   - 去掉 `show-summary` 合计行(getSummaries 只统计了行数,意义不大)
+   - 收窄 `min-width`,减少横向滚动
+   - 评估去掉 `:icore-filter-flag`(自定义筛选)是否为必需
+8. **el-tabs 开启 lazy**:`<el-tabs lazy>` 让非激活 tab 延迟渲染
+9. **后端关闭 SQL 日志输出**:生产环境将 `mybatis.configuration.log-impl` 设为 `NoLoggingImpl`,日志级别从 DEBUG 提为 INFO
+10. **防抖选择事件**:`handleSelectionChange`/`handleCurrentChange` 触发子表查询前加防抖(300ms),避免勾选多行时请求风暴
+
+---
+
+## 六、补充说明
+
+- 本次分析对数据库仅执行了只读查询(SELECT / EXPLAIN PLAN),未做任何修改
+- 前端仅读代码,未改动任何文件
+- 开发库数据量较小,实测 SQL 单条均在 250ms 内;**生产环境请务必先补索引再观察**,否则数据量增长后问题会急剧恶化
+- 建议先用浏览器 DevTools Network 面板实测一次:若首屏 19 个请求总耗时中「Waiting (TTFB)」占比高,进一步佐证后端全量查询 + 无索引问题;若「Content Download」占比高,则响应体全量传输是主因

+ 344 - 0
.workbuddy/artifacts/testProjectConfiguration性能改造操作手册.md

@@ -0,0 +1,344 @@
+# testProjectConfiguration 页面性能改造操作手册
+
+**适用范围**:前端 beiHai-ui / 后端 beiHai-lims
+**改造目标**:页面打开 20 秒 → 2~3 秒以内
+**说明**:本手册只写「怎么改」,每个改动都给出文件路径、行号、改前/改后代码。按编号顺序执行即可,做完 1~3 步就能砍掉绝大部分耗时。
+
+---
+
+## 📋 改动清单总览
+
+| 步骤 | 改动 | 收益 | 风险 |
+|---|---|---|---|
+| 1 | 3 个弹窗子组件懒加载(v-if) | 砍掉约 14 个首屏请求(最大收益) | 中(需同步改子组件 watch) |
+| 2 | 删除死代码 `gettestItemNameTypeList` | 少 1 个全量请求 | 极低 |
+| 3 | `getList()` 改为打开弹窗时才调用 | 首屏少 1 个 500 条请求 | 极低 |
+| 4 | 勾选/点击行加防抖 | 避免子表请求风暴 | 低 |
+| 5 | 子表 pageSize 990 → 50 | 减少每次交互的数据量 | 低 |
+| 6 | 表格瘦身(去 sortable/show-summary) | 减少渲染开销 | 低(视觉略有变化) |
+| 7 | 后端补索引(必须做) | 生产库数据量大时兜底 | 低(上线前 DBA 评估) |
+| 8 | 后端字典查询 pageSize 调小 | 减少全量传输 | 低 |
+| 9 | 后端关闭 SQL 日志输出 | 减少日志 IO | 极低 |
+
+> ⚠️ **先备份再动手**:每个文件修改前先复制一份,例如 `testProjectConfiguration.vue.bak`。改完用 `npm run dev` 起本地验证。
+
+---
+
+## 第 1 步:3 个弹窗子组件懒加载(核心改动,必须做)
+
+弹窗子组件 `alertComponents / alertComponents3 / alertComponents4` 目前**页面一打开就被实例化**,各自 `mounted` 里发 5~7 个请求。改成「第一次打开弹窗时才创建组件」。
+
+### 1.1 父组件加 v-if
+
+**文件**:`src/views/standardManagement/components/testProjectConfiguration/testProjectConfiguration.vue`
+**位置**:第 320~323 行
+
+**改前**:
+```html
+<div is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
+<!-- <div is="alertComponets2" :showFlag="showFlag2" :Params="Params2" @refresh='refresh2'></div> -->
+<div is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
+<div is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
+```
+
+**改后**:
+```html
+<div v-if="showFlag" is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
+<!-- <div v-if="showFlag2" is="alertComponets2" :showFlag="showFlag2" :Params="Params2" @refresh='refresh2'></div> -->
+<div v-if="showFlag3" is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
+<div v-if="showFlag4" is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
+```
+
+### 1.2 三个子组件 watch 加 immediate(⚠️ 必须同步改,否则弹窗打不开)
+
+**原因**:子组件通过 `watch: { showFlag }` 打开弹窗。加 v-if 后,组件首次创建时 `showFlag` 已经是 `true`,**watch 默认不触发首次值**,弹窗会打不开。必须加 `immediate: true`。
+
+**文件 1**:`src/views/standardManagement/components/testProjectConfiguration/alertComponents.vue`
+**位置**:第 456~459 行
+
+**改前**:
+```js
+watch: {
+  showFlag (arg) {
+    this.dialogTableVisible = true;
+  }
+},
+```
+
+**改后**:
+```js
+watch: {
+  showFlag: {
+    handler (arg) {
+      this.dialogTableVisible = true;
+    },
+    immediate: true
+  }
+},
+```
+
+**文件 2**:`alertComponents3.vue`,第 412~416 行 —— 同样改法(结构一致,照上面抄)。
+
+**文件 3**:`alertComponents4.vue`,第 171~189 行 —— 同样改法(注意它 watch 里可能还有别的逻辑,只把 `showFlag` 这个 handler 包成对象 + `immediate: true`)。
+
+### 1.3 验证
+
+```
+npm run dev
+```
+1. 打开测试项目配置页 → 打开浏览器 DevTools Network,刷新页面
+2. 观察首屏请求数量:应从 ~19 个降到 ~4 个(只剩父组件的字典 + 主表分页 + 3 个 addScreen)
+3. 点击「新增」按钮 → 弹窗应正常打开,此时才出现弹窗的字典请求(正常现象)
+4. 连续开/关弹窗 2~3 次,确认不报错
+
+---
+
+## 第 2 步:删除死代码 gettestItemNameTypeList
+
+该请求拉取全部测试项目,结果存入 `testItemNameType`,但**模板里从未使用**(页面下拉用的是 `itemTypeNameType`,来自另一个接口)。纯浪费。
+
+**文件**:`testProjectConfiguration.vue`
+
+**改动 2.1**:删掉第 422 行的调用
+```js
+this.gettestItemNameTypeList();   // ← 删除这一行
+```
+
+**改动 2.2**:删掉第 430~435 行的方法定义
+```js
+gettestItemNameTypeList () {
+   this.axios.get('pass/baseManagement/v1/limsstdtestitems/'+ '?validFlag=1')
+        .then(res => {
+          this.testItemNameType = res.data.list;
+        })
+},
+```
+(可一并删掉 data 里第 395 行的 `testItemNameType: []`,不删也无害)
+
+---
+
+## 第 3 步:getList() 改为弹窗打开时才调用
+
+`getList()` 查询分析项目(pageSize=500),数据只在「新增分析项目」弹窗里用,但目前页面一打开就拉。
+
+**文件**:`testProjectConfiguration.vue`
+
+**改动 3.1**:删掉第 418 行的 mounted 调用
+```js
+this.getList()   // ← 删除这一行
+```
+
+**改动 3.2**:在 `addData2()`(第 626~633 行)里补上调用
+
+**改前**:
+```js
+addData2 () {
+  let _this = this;
+  if (_this.multipleSelection.length !== 1) {
+    this.$message.warning('请选择一条测试项目数据!');
+    return
+  }
+  this.dialogTableVisible = true
+},
+```
+
+**改后**:
+```js
+addData2 () {
+  let _this = this;
+  if (_this.multipleSelection.length !== 1) {
+    this.$message.warning('请选择一条测试项目数据!');
+    return
+  }
+  this.getList();          // ← 新增:弹窗打开时才加载分析项目列表
+  this.dialogTableVisible = true
+},
+```
+
+---
+
+## 第 4 步:勾选/点击行加防抖(可选但建议)
+
+当前点击/勾选任意一行,立刻触发 2 个 pageSize=990 的子表查询;多选时连续触发。
+
+**文件**:`testProjectConfiguration.vue`
+**位置**:第 799~807 行(handleSelectionChange)、第 846~858 行(handleCurrentChange)
+
+**改法**:把两个方法里的 `getDataList2/getDataList3` 调用替换为防抖调用,并新增一个防抖方法。
+
+`handleSelectionChange` 改后:
+```js
+handleSelectionChange (val) {
+  this.multipleSelection = val;
+  if (val.length > 0) {
+    this.testItemNo = val[val.length-1].testItemNo
+    this.curItemTypeCode = val[val.length-1].itemTypeCode;
+    this.debounceLoadSub(this.testItemNo);
+  }
+},
+```
+
+`handleCurrentChange` 改后(顺手修复 val 为 null 时的报错):
+```js
+handleCurrentChange (val) {
+  this.curItemTypeCode = ''
+  if (val){
+    this.curItemTypeCode = val.itemTypeCode;
+  }
+  if (!val || val.testItemNo === null) {
+    this.testItemNo = '';
+  } else {
+    this.testItemNo = val.testItemNo;
+  }
+  this.debounceLoadSub(this.testItemNo);
+},
+```
+
+在 methods 里新增防抖方法(放在 getDataList2 前面即可):
+```js
+debounceLoadSub (testItemNo) {
+  clearTimeout(this._subTimer);
+  this._subTimer = setTimeout(() => {
+    this.getDataList2(testItemNo);
+    this.getDataList3(testItemNo);
+  }, 300);
+},
+```
+
+---
+
+## 第 5 步:子表 pageSize 990 → 50,恢复分页
+
+**文件**:`testProjectConfiguration.vue`
+**位置**:第 370~379 行
+
+**改前**:
+```js
+page2: {
+  pageSize: 990,
+  pageNum: 1,
+  totalPage: 0
+},
+page3: {
+  pageSize: 990,
+  pageNum: 1,
+  totalPage: 0
+},
+```
+
+**改后**:
+```js
+page2: {
+  pageSize: 50,
+  pageNum: 1,
+  totalPage: 0
+},
+page3: {
+  pageSize: 50,
+  pageNum: 1,
+  totalPage: 0
+},
+```
+
+**建议同时恢复被注释的分页组件**:第 136~141 行有被注释的 `<el-pagination>`(数据是 page2),恢复它并复制一份给 page3 的表格,这样子表才能翻页查看完整数据(因为 pageSize 变小了)。
+
+---
+
+## 第 6 步:表格瘦身(降低渲染开销,工作量中等)
+
+三个表格共约 69 列,**每列都带 `sortable` + `show-overflow-tooltip`**,且都开 `show-summary` 合计行 + `:icore-filter-flag`。`show-overflow-tooltip` 会给每个单元格注册 tooltip 实例,50 行 × 25 列 = 1250 个,是渲染大头。
+
+### 6.1 去掉每列 sortable(只保留 1~2 个关键列)
+
+主表(第 41~65 行)、分析项目表(第 98~133 行)、方法标准表(约第 163 行起):批量把每列开头的 `sortable` 删掉。
+
+示例:
+```html
+<!-- 改前 -->
+<el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemNo" label="测试项目编号" align="center"></el-table-column>
+<!-- 改后(保留 testItemNo / testItemName 两列的 sortable,其余删除) -->
+<el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemNo" label="测试项目编号" align="center"></el-table-column>
+<el-table-column :show-overflow-tooltip="true" min-width="120px" prop="testItemName" label="测试项目名称" align="center"></el-table-column>
+```
+
+### 6.2 去掉 show-summary 合计行
+
+`getSummaries` 只统计了「合计 + 行数」,价值低。三处表格的 `:summary-method="getSummaries" show-summary`(第 38、94、160 行)直接删除,`getSummaries` 方法(第 436~448 行)也可删。
+
+### 6.3 (可选)el-tabs 加 lazy
+
+第 76 行 `<el-tabs v-model="activeName" type="card" @tab-click="handleClick">` 改为 `<el-tabs v-model="activeName" type="card" @tab-click="handleClick" lazy>`,让非激活 tab 延迟渲染。
+
+---
+
+## 第 7 步:后端补索引(生产环境必须做)
+
+**文件**:后端库执行 DDL(需 DBA / 维护窗口评估执行,仅 SELECT 查询无风险)
+
+```sql
+-- 子表按 TEST_ITEM_NO 查询是高频路径,当前全表扫描
+CREATE INDEX IDX_TID_TESTITEMNO  ON LIMS_STD_TEST_ITEM_D (TEST_ITEM_NO);
+CREATE INDEX IDX_TMATCH_TESTITEMNO ON LIMS_STD_TEST_MATCH (TEST_ITEM_NO);
+-- 两个主表 ORDER BY CREATE_TIME DESC 无索引,每次全表排序
+CREATE INDEX IDX_TITEM_CREATETIME ON LIMS_STD_TEST_ITEM (CREATE_TIME);
+CREATE INDEX IDX_ANLY_CREATETIME ON LIMS_STD_ANLY_ITEM (CREATE_TIME);
+-- 列表页常见过滤条件
+CREATE INDEX IDX_TITEM_VALIDFLAG  ON LIMS_STD_TEST_ITEM (VALID_FLAG);
+```
+
+---
+
+## 第 8 步:字典查询 pageSize 调小
+
+子组件里的全量字典查询(`pageSize: 9999 / 99999`)虽然做了第 1 步后只在打开弹窗时发,但值仍过大,建议调小:
+
+- `alertComponents.vue` 第 312 行:`pageSize:9999` → `pageSize:500`(规则下拉,271 条数据)
+- `alertComponents.vue` 第 340 行:`pageSize:99999` → `pageSize:100`(岗位下拉,仅 12 条)
+- `alertComponents3.vue` 第 315 / 340 / 355 / 367 行:`pageSize:9999` → `pageSize:500`(分析项目 / 单位 / 修约规则 / 公式)
+
+---
+
+## 第 9 步:后端关闭 SQL 日志输出
+
+**文件**:`beiHai-lims/lims-base/src/main/resources/application.properties`
+
+**改前**:
+```properties
+logging.level.com.steerinfo=DEBUG
+mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+```
+
+**改后**:
+```properties
+logging.level.com.steerinfo=INFO
+mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl
+```
+
+> 注意:三个模块(lims-base / lims-api / lims-test)可能都有各自的 application.properties,生产环境每个都改。
+
+---
+
+## ✅ 验收标准
+
+改完 1~3 步后:
+
+| 指标 | 改前 | 改后预期 |
+|---|---|---|
+| 首屏请求数 | ~19 个 | ~4 个 |
+| 页面渲染完成 | ~20 秒 | 2~3 秒 |
+| 勾选/点击行 | 2 个 990 条请求 | 防抖后 2 个 50 条请求 |
+
+**验证方法**:
+1. DevTools Network 面板看首屏请求数量和耗时分布(改前先录一份对比)
+2. 若首屏仍有慢请求,看「Waiting (TTFB)」高还是「Content Download」高,分别对应后端慢 / 响应体大
+3. 生产库验证前,先确认第 7 步索引已执行
+
+---
+
+## ⚠️ 注意事项汇总
+
+1. **第 1 步的 1.2 是强制配套**:只加 v-if 不改 watch,弹窗会打不开(watch 不触发首次值)
+2. **先备份**:`cp testProjectConfiguration.vue testProjectConfiguration.vue.bak`(三个子组件同理)
+3. 第 6 步表格瘦身是「锦上添花」,如果 1~5 步做完首屏已经达标,可暂缓
+4. 索引 DDL 建议在低峰期由 DBA 执行,先 EXPLAIN 验证子表查询从 FULL SCAN 变为 INDEX RANGE SCAN
+5. 所有前端改动都在 `src/views/standardManagement/components/testProjectConfiguration/` 目录内,后端改动在 `beiHai-lims`,互不冲突

+ 18 - 0
.workbuddy/memory/2026-08-28.md

@@ -0,0 +1,18 @@
+# 2026-08-28 工作日志
+
+## testProjectConfiguration 页面性能分析(20秒渲染问题)
+
+**背景**:检化验项目测试项目配置页(`src/views/standardManagement/components/testProjectConfiguration/testProjectConfiguration.vue`)从打开到渲染完毕约 20 秒。
+
+**结论**:瓶颈不在数据库单条 SQL(实测均 <250ms),而是:
+1. **P0-1** 页面一打开 3 个弹窗子组件(alertComponents/3/4)挂载即发请求,父+子合计约 19 个并发请求,其中 6 个为 pageSize=9999/99999 全量查询
+2. **P0-2** `gettestItemNameTypeList()` 是死代码,结果 `testItemNameType` 模板中从未使用,却拉全量测试项目
+3. **P1-3** 3 个巨型表格(25/32/12 列)全列 sortable + tooltip + show-summary + fixed + el-tabs 非激活也渲染
+4. **P1-4** 后端 4 张核心表除主键外无业务索引,`ORDER BY CREATE_TIME DESC` 全表排序;生产库数据量大时会急剧恶化(已用 EXPLAIN PLAN 证实全表扫描)
+5. **P2** 勾选/点击行触发 pageSize=990 子表查询风暴;后端 DEBUG 日志 + SQL 全量输出
+
+**关键数据**(直连 Oracle 只读实测):测试项目 1050 行、分析项目 741 行、子表 D 8309 行、方法标准 318 行。
+
+**主要建议**:弹窗组件 v-if 懒加载(可砍 14 个首屏请求)、删死代码、补 5 个索引、降低 pageSize、表格瘦身。
+
+**产出**:`.workbuddy/artifacts/testProjectConfiguration性能分析报告.md`

+ 37 - 0
.workbuddy/memory/2026-09-01.md

@@ -0,0 +1,37 @@
+# 2026-09-01 工作日志
+
+## testProjectConfiguration 性能改造操作手册(用户要求只出方案不改代码)
+
+**背景**:承接 2026-08-28 的性能分析,用户对项目不熟,要求先出「怎么改」的操作手册,暂不改代码。
+
+**产出**:`.workbuddy/artifacts/testProjectConfiguration性能改造操作手册.md`
+
+**方案要点(9 步)**:
+1. 3 个弹窗子组件加 v-if 懒加载(砍 ~14 个首屏请求)——⚠️ 关键坑:子组件 watch showFlag 需加 immediate: true,否则弹窗打不开
+2. 删除死代码 gettestItemNameTypeList(结果未使用)
+3. getList() 移到 addData2() 弹窗打开时调用
+4. handleSelectionChange/handleCurrentChange 加 300ms 防抖(顺带修 val 为 null 的报错)
+5. 子表 pageSize 990 → 50 + 恢复被注释的分页
+6. 表格瘦身:去每列 sortable、去 show-summary、el-tabs 加 lazy
+7. 后端补 5 个索引(DDL 已给出)
+8. 字典查询 pageSize 9999/99999 调小
+9. 后端关 DEBUG 日志 + MyBatis SQL 输出
+
+**约定**:用户偏好「先出方案再动手」的工作方式,对该项目熟悉度低,改动需精确到行号。
+
+## 已执行:收益最大的三步改造(15:41-15:50)
+
+用户确认后,按手册执行了前三步(收益最大),**已改代码并验证通过**:
+
+**改动文件(4 个,均已备份 .bak)**:
+1. `testProjectConfiguration.vue`:
+   - 3 个弹窗 div 加 `v-if`(L320-323,alertComponets/3/4)
+   - mounted 删除 `getList()` 和 `gettestItemNameTypeList()` 调用
+   - 删除死代码方法 `gettestItemNameTypeList` 和 data 字段 `testItemNameType`
+   - `addData2()` 中新增 `this.getList()`(弹窗打开时才加载分析项目)
+2. `alertComponents.vue` / `alertComponents3.vue` / `alertComponents4.vue`:watch `showFlag` 改为对象形式并加 `immediate: true`(否则 v-if 首渲染弹窗打不开)
+
+**验证**:用项目真实 .babelrc(含 transform-vue-jsx)对 4 个文件做模板+script 解析,全部 OK。注意:裸 acorn/babel 解析 alertComponents 会在 229 行报错,是因为模板内嵌 JSX(`onClick={() => ...}`)需要 transform-vue-jsx 插件,非代码问题。
+
+**预期效果**:首屏请求 ~19 → ~4 个;渲染 20s → 2~3s。
+**待办(用户未确认)**:手册第 4-9 步(防抖、pageSize、表格瘦身、索引、日志)。

+ 2 - 2
cors.js

@@ -208,6 +208,6 @@ module.exports = {
   // devModules: ['index', 'entrustedManagement','sampleManager','screeningTests', 'resourceManager']
   //devModules: ['reportForm', 'screeningTests', 'index',  'entrustedManagement','measurementDataManagement', 'approveManagement', 'testAnalysis', 'resourceManager', 'taskManagement']
   // devModules: ["index", "resourceManager"],
-  devModules: ["all"],
-  // devModules: ["index", "approveManagement"],
+  // devModules: ["all"],
+  devModules: ["index", "standardManagement","entrustedManagement"],
 };

+ 4 - 1
src/views/standardManagement/components/testProjectConfiguration/alertComponents.vue

@@ -454,7 +454,8 @@ export default {
      },
     },
     watch: {
-      showFlag (arg) {
+      showFlag: {
+        handler (arg) {
         this.dialogTableVisible = true;
         if (this.Params !== null) {
           this.formData = Object.assign({},this.Params[0]);
@@ -479,6 +480,8 @@ export default {
             },
           this.tableTypeDsc = '新增测试项目';
         }
+        },
+        immediate: true
       }
     }
 }

+ 490 - 0
src/views/standardManagement/components/testProjectConfiguration/alertComponents.vue.bak

@@ -0,0 +1,490 @@
+<template>
+    <div class="examination">
+     <el-dialog @close="closeDialog" :visible.sync="dialogTableVisible" customClass="customWidth_test">
+        <div slot="title" class="titleBox">
+         <i :class="tableType === 0? 'el-icon-document':'el-icon-edit-outline'" style="font-size: 20px"></i>
+        <!-- <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/more.png' /> -->
+        <span style="margin-left:10px;font-size:18px">{{tableTypeDsc}}</span>
+        </div>
+        <el-form :model="formData" label-width="90px" :rules="monitorForm.monitorRules" ref="monitorForm">
+          <el-row>
+            <el-col :span='8'>
+              <el-form-item prop="testItemNo" label="测试项目编号">
+               <el-input v-model="formData.testItemNo" readonly disabled size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+                <el-form-item prop="testPostCode" label="测试岗位">
+               <el-select v-model="formData.testPostCode" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in testPostNameType" :key="index" :label="item.postName"
+                    :value="item.postNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isTestTypeIndex" label="是否免检">
+               <el-select v-model="formData.isTest" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isTestType" :key="index" :label="item.isTest"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+              <el-form-item prop="testItemName" label="测试项目名称">
+               <el-input v-model="formData.testItemName" size="small" placeholder="请输入"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="eqpTypeCode" label="测试设备">
+               <el-select v-model="formData.eqpTypeCode" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in eqpTypeNameType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isCtrlTypeIndex" label="是否控制">
+                <el-select v-model="formData.isCtrl" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isCtrlType" :key="index" :label="item.isCtrl"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+              <el-form-item prop="testItemDesc" label="测试项目描述">
+               <el-input v-model="formData.testItemDesc" placeholder="请输入" size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="testCnt" label="测试次数">
+               <el-input v-model="formData.testCnt" placeholder="请输入" size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isAutoTypeIndex" label="是否自动执行">
+               <el-select v-model="formData.isAuto" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isAutoType" :key="index" :label="item.isAuto"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+               <el-form-item prop="testItemEng" label="测试项目英文">
+               <el-input v-model="formData.testItemEng" placeholder="请输入" size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="testLimit" label="测试时限(h)">
+               <el-input v-model="formData.testLimit" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isSonTypeIndex" label="是否子任务">
+               <el-select v-model="formData.isSon" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isSonType" :key="index" :label="item.isSon"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+              <el-form-item prop="itemTypeCode" label="项目类型">
+               <el-select v-model="formData.itemTypeCode" filterable collapse-tags @change="selectType" size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in itemTypeNameType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+               <el-form-item prop="doOrder" label="执行顺序">
+               <el-input v-model="formData.doOrder" placeholder="请输入" size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isSynTypeIndex" label="是否同步">
+               <el-select v-model="formData.isSyn" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isSynType" :key="index" :label="item.isSyn"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+              <el-form-item label="作业点">
+               <el-select v-model="formData.pointNo" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in pointNameType" :key="index" :label="item.pointName"
+                    :value="item.pointNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="testDirection" label="测试样号">
+               <el-input v-model="formData.testDirection" placeholder="请输入" size="small" style="width: 100%;"></el-input>
+               </el-form-item>
+            </el-col>
+             <el-col :span='8'>
+                <el-form-item prop="isMsgTypeIndex" label="是否推送">
+               <el-select v-model="formData.isMsg" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isMsgType" :key="index" :label="item.isMsg"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span='8'>
+                  <el-form-item prop="functionCode" label="功能类型">
+               <el-select v-model="formData.functionCode" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in functionType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+                  <el-form-item label="业务规则">
+               <el-select v-model="formData.ruleNo" clearable filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in RuleType" :key="index" :label="item.ruleName"
+                    :value="item.ruleNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </el-col>
+            <el-col :span='8'>
+              <el-form-item prop="isIndexTypeIndex" label="是否含指标">
+               <el-select v-model="formData.isIndex" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isIndexType" :key="index" :label="item.isIndex"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+           <el-row>
+                <el-col :span='16'>
+                  <el-form-item prop="alarmNo" label="备注">
+                   <el-input v-model="formData.memo" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+                   </el-form-item>
+                </el-col>
+                <el-col :span='8'>
+                  <el-form-item prop="isReferTypeIndex" label="是否引用">
+               <el-select v-model="formData.isRefer" filterable collapse-tags size="small" style="width: 100%;">
+                  <el-option v-for="(item,index) in isReferType" :key="index" :label="item.isRefer"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+                </el-col>
+              </el-row>
+       </el-form>
+       <span slot="footer" class="dialog-footer">
+        <el-button type="goon" icon="el-icon-check" size="mini" @click="tableType === 0 ? addData():modifyData()">确定</el-button>
+        <el-button size="mini" type="goon" icon="el-icon-remove-outline" @click="cancel">取消</el-button>
+      </span>
+    </el-dialog>
+    </div>
+</template>
+<script>
+import {
+  getCookie
+} from '@/utils/util.js';
+import {
+  cookieUserId,
+  cookieUserName
+} from '@/config/config.js';
+let userName = getCookie(cookieUserName);
+let userId = getCookie(cookieUserId);
+export default {
+  props: ['showFlag', 'Params'],
+    data () {
+        return {
+            dialogTableVisible: false,
+            tableTypeDsc: '新增测试项目',
+            tableType: 0,
+            seen: true,
+            seenNo: true,
+            beInvalid: false,
+            testItemName: '',
+            testCnt: '1',
+            testItemNo: '',
+            testItemDesc: '',
+            testItemEng: '',
+            testLimit: '',
+            memo: '',
+            itemTemp: '',
+            doOrder: '',
+            testLocate: '',
+            RuleType:[],
+            testPostNameTypeIndex: 0,//测试岗位
+            isTestTypeIndex: 1,//是否免检
+            eqpTypeNameTypeIndex: 0,//测试设备
+            isCtrlTypeIndex: 1,//是否控制
+            isIndexTypeIndex: 1,//是否含指标
+            isAutoTypeIndex: 1,//是否自动执行
+            isReferTypeIndex: 1,//是否引用
+            isSonTypeIndex: 1,//是否子任务
+            itemTypeNameTypeIndex: 0,//项目类型
+            isSynTypeIndex: 1,//是否同步
+            isMsgTypeIndex: 1,//是否推送
+            pointNameTypeIndex: 0,//作业点
+            testPostNameType: [],
+            isTestType: [
+              {id: '0', isTest: '否'},
+              {id: '1', isTest: '是'}
+            ],
+            eqpTypeNameType: [],
+            isCtrlType: [
+              {id: '0', isCtrl: '否'},
+              {id: '1', isCtrl: '是'}
+            ],
+            isIndexType: [
+              {id: '0', isIndex: '否'},
+              {id: '1', isIndex: '是'}
+            ],
+            isAutoType: [
+              {id: '0', isAuto: '否'},
+              {id: '1', isAuto: '是'}
+            ],
+            isReferType: [
+              {id: '0', isRefer: '否'},
+              {id: '1', isRefer: '是'}
+            ],
+            isSonType: [
+              {id: '0', isSon: '否'},
+              {id: '1', isSon: '是'}
+            ],
+            itemTypeNameType: [],
+            isSynType: [
+              {id: '0', isSyn: '否'},
+              {id: '1', isSyn: '是'}
+            ],
+            isMsgType: [
+              {id: '0', isMsg: '否'},
+              {id: '1', isMsg: '是'}
+            ],
+            formData: {
+              isTest:'1',
+              isCtrl:'1',
+              isAuto:'1',
+              isSon:'1',
+              isSyn:'1',
+              isMsg:'1',
+              isIndex:'1',
+              isRefer:'1',
+              pointNo:''
+            },
+            pointNameType: [],
+            functionType:[],
+            monitorForm: {
+            tableData: [{}],
+             monitorRules: {
+               testItemName: [{ required: true, message: '该项不能为空', trigger: ['blur']}],
+               itemTypeCode:[{ required: true, message: '该项不能为空', trigger: 'change'}],
+               testPostCode:[{ required: true, message: '该项不能为空', trigger: 'change'}],
+               eqpTypeCode:[{ required: true, message: '该项不能为空', trigger: 'change'}],
+               functionCode:[{ required: true, message: '该项不能为空', trigger: 'change'}]
+             }
+            }
+        }
+    },
+    mounted () {
+      this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4840}, {individualType: 'json'}).then(res => {
+        this.functionType = res.data
+      })
+      this.axios.post("pass/baseManagement/v1/limsbaserules/queryLimsBaseRuleInfoPage",{object:{validFlag:1},pageIndex:1,pageSize:9999}, {individualType: 'json'}).then(res => {
+        this.RuleType = res.data.list
+      })
+      this.gettestPostNameTypeList ()
+      this.geteqpTypeNameType ()
+      this.getItemTypeNameType ()
+      this.getpointNameType ()
+    },
+    methods: {
+      cancel () {
+        this.formData = {
+              isTest:'1',
+              isCtrl:'1',
+              isAuto:'1',
+              isSon:'1',
+              isSyn:'1',
+              isMsg:'1',
+              isIndex:'1',
+              isRefer:'1',
+              pointNo:''
+            },
+        this.monitorForm.tableData = [{}]
+        this.dialogTableVisible = false
+      },
+      gettestPostNameTypeList () {
+          let obj ={
+        'object':{validFlag:1},
+        'pageIndex':1,
+        'pageSize':99999
+      }
+        this.axios.post('pass/baseManagement/v1/limsbaseposts/queryLimsBasePostPage/',obj, {individualType: 'json'}).then(res => {
+              this.testPostNameType = res.data.list;
+            })
+      },
+      geteqpTypeNameType () {
+        this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4808}, {individualType: 'json'}).then(res => {
+              this.eqpTypeNameType = res.data
+        })
+      },
+      getItemTypeNameType () {
+        this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4804}, {individualType: 'json'}).then(res => {
+              this.itemTypeNameType = res.data
+            })
+      },
+      getpointNameType () {
+       
+      },
+      selectType(val){
+        this.formData.clearFlag ? '' : this.formData.pointNo = ''
+        this.pointNameType = []
+        if (!val) {
+          return
+        }
+        let obj ={
+          object:{pointTypeCode:val,validFlag:1},
+          pageIndex:1,
+          pageSize:9999
+        }
+         this.axios.post('pass/baseManagement/v1/limsbasepoints/queryLimsBasePointPage',obj, {individualType: 'json'}) 
+            .then(res => {
+              this.pointNameType = res.data.list;
+            })
+      },
+       getCode (code, arr, codeKey, nameKey) {
+      if (!code) {
+        return '';
+      }
+      let targetRow = arr.find(item => {
+        return item[codeKey] === code;
+      });
+      // console.log(targetRow, 'targetRow');
+      return targetRow ? targetRow[nameKey] : '';
+    },
+      addData () {
+         this.$refs['monitorForm'].validate((valid) => {
+          if (valid) {
+            this.formData.ruleName = this.getCode(this.formData.ruleNo,this.RuleType,'ruleNo','ruleName')
+            this.formData.itemTypeName = this.getCode(this.formData.itemTypeCode,this.itemTypeNameType,'baseCode','baseName')
+            this.formData.testPostName = this.getCode(this.formData.testPostCode,this.testPostNameType,'postNo','postName')
+            this.formData.eqpTypeName = this.getCode(this.formData.eqpTypeCode,this.eqpTypeNameType,'baseCode','baseName')
+            this.formData.pointName = this.getCode(this.formData.pointNo,this.pointNameType,'pointNo','pointName')
+            this.formData.functionName = this.getCode(this.formData.functionCode,this.functionType,'baseCode','baseName')
+            this.axios.post('pass/baseManagement/v1/limsstdtestitems/saveLimsStdTestItem', this.formData, {individualType: 'json'}).then(res => {
+                if (res.succeed) {
+                  this.dialogTableVisible = false;
+                 this.$message.success('添加成功')
+                 this.$emit('refresh')
+                } else {
+                 this.$message.error(res.message)
+                }
+                }).catch(e => {
+                 this.$message.error(e.message)
+               })
+         }
+       })
+      },
+      modifyData () {
+        this.$refs['monitorForm'].validate((valid) => {
+        if (valid) {
+          this.formData.ruleName = this.getCode(this.formData.ruleNo,this.RuleType,'ruleNo','ruleName')
+          this.formData.itemTypeName = this.getCode(this.formData.itemTypeCode,this.itemTypeNameType,'baseCode','baseName')
+          this.formData.testPostName = this.getCode(this.formData.testPostCode,this.testPostNameType,'postNo','postName')
+          this.formData.eqpTypeName = this.getCode(this.formData.eqpTypeCode,this.eqpTypeNameType,'baseCode','baseName')
+          this.formData.pointName = this.getCode(this.formData.pointNo,this.pointNameType,'pointNo','pointName')
+          this.formData.functionName = this.getCode(this.formData.functionCode,this.functionType,'baseCode','baseName')
+       this.axios.post('pass/baseManagement/v1/limsstdtestitems/saveLimsStdTestItem', this.formData, {individualType: 'json'}).then(res => {
+           if (res.succeed) {
+             this.dialogTableVisible = false;
+            this.$message.success('修改成功')
+            this.$emit('refresh')
+           } else {
+            this.$message.error(res.message)
+           }
+           }).catch(e => {
+            this.$message.error(e.message)
+          })
+        }
+        })
+      },
+      renderHeader (h) {
+         return (
+             <div style="cursor: pointer ;line-height:20px" onClick={() => this.addRow()}>
+             <i class="el-icon-plus" style="font-size:20px; color:rgb(18, 52, 243)"></i>
+             </div>
+         )
+      },
+     closeDialog () {
+       this.formData = {
+              isTest:'1',
+              isCtrl:'1',
+              isAuto:'1',
+              isSon:'1',
+              isSyn:'1',
+              isMsg:'1',
+              isIndex:'1',
+              isRefer:'1',
+              pointNo:''
+            },
+       this.monitorForm.tableData = [{}];
+       this.seen = true;
+       this.seenNo = true;
+       this.beInvalid = false;
+     },
+    },
+    watch: {
+      showFlag (arg) {
+        this.dialogTableVisible = true;
+        if (this.Params !== null) {
+          this.formData = Object.assign({},this.Params[0]);
+          this.formData.clearFlag = true
+          this.tableType = 1;
+          this.tableTypeDsc = '修改测试项目';
+          this.selectType(this.formData.itemTypeCode)
+          this.formData.clearFlag = false
+        } else {
+          this.tableType = 0;
+          this.seenNo = false;
+          this.formData = {
+              isTest:'0',
+              isCtrl:'1',
+              isAuto:'0',
+              isSon:'0',
+              isSyn:'1',
+              isMsg:'0',
+              isIndex:'1',
+              isRefer:'0',
+              pointNo:''
+            },
+          this.tableTypeDsc = '新增测试项目';
+        }
+      }
+    }
+}
+</script>
+<style lang="less">
+.customWidth_test{
+  width: 1000px !important
+}
+</style>

+ 6 - 3
src/views/standardManagement/components/testProjectConfiguration/alertComponents3.vue

@@ -410,9 +410,12 @@ export default {
       }
     },
     watch: {
-      showFlag (arg) {
-        this.formData = Object.assign({},this.Params[0]);
-        this.dialogTableVisible = true;
+      showFlag: {
+        handler (arg) {
+          this.formData = Object.assign({},this.Params[0]);
+          this.dialogTableVisible = true;
+        },
+        immediate: true
       }
     }
 }

+ 424 - 0
src/views/standardManagement/components/testProjectConfiguration/alertComponents3.vue.bak

@@ -0,0 +1,424 @@
+<template>
+    <div class="examination">
+     <el-dialog @close="closeDialog" :visible.sync="dialogTableVisible" customClass="customWidth_test">
+        <div slot="title" class="titleBox">
+         <i class='el-icon-edit-outline' style="font-size: 20px"></i>
+        <!-- <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/more.png' /> -->
+        <span style="margin-left:10px;font-size:18px">修改分析项目</span>
+        </div>
+        <el-form :model="formData" label-width="80px" :rules="monitorForm.monitorRules" ref="monitorForm" >
+         <table class="common-table-style4">
+           <tr>
+             <td>
+               <el-form-item prop="anlyItemNo" label="分析项目编号">
+               <el-input v-model="formData.anlyItemNo" size="small" readonly disabled style="width: 150px;"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="unitNameTypeIndex" label="度量单位">
+               <el-select v-model="formData.unitNo" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in unitNameType" :key="index" :label="item.unitName"
+                    :value="item.unitNo" placeholder="请输入">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+                <!-- <el-input v-model="minSign" size="small" readonly disabled style="width: 150px;"></el-input> -->
+                <el-form-item prop="minSignTypeIndex" label="下限符">
+                <el-select v-model="formData.minSign" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in minSignType" :key="index" :label="item.minSign"
+                    :value="item.minSign">
+                  </el-option>
+                </el-select>
+                </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isRareTypeIndex" label="是否贵重">
+               <el-select v-model="formData.isRare" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isRareType" :key="index" :label="item.isRare"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+            </tr>
+            <tr>
+             <td>
+               <el-form-item prop="testItemNo" label="测试任务编码">
+               <el-input v-model="formData.testItemNo" readonly disabled size="small" style="width: 150px;" placeholder="请输入"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="dataTypeNameTypeIndex" label="数据类型">
+               <el-select v-model="formData.dataTypeCode" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in dataTypeNameType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item label="下限值">
+               <el-input v-model="formData.minValue" size="small" placeholder="请输入" style="width: 150px;"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isLoginTypeIndex" label="是否必检">
+                <el-select v-model="formData.isLogin" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isLoginType" :key="index" :label="item.isLogin"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+           </tr>
+           <tr>
+             <td>
+               <el-form-item prop="testItemName" label="测试任务名称">
+               <el-input v-model="formData.testItemName" readonly disabled size="small" style="width: 150px;" placeholder="请输入"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="outputTypeNameTypeIndex" label="输出类型">
+               <el-select v-model="formData.outputTypeCode" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in outputTypeNameType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+                <!-- <el-input v-model="maxSign" size="small" readonly disabled style="width: 150px;"></el-input> -->
+                <el-form-item prop="maxSignTypeIndex" label="上限符">
+                <el-select v-model="formData.maxSign" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in maxSignType" :key="index" :label="item.maxSign"
+                    :value="index">
+                  </el-option>
+                </el-select>
+                </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isAlarmTypeIndex" label="是否报警">
+               <el-select v-model="formData.isAlarm" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isAlarmType" :key="index" :label="item.isAlarm"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+           </tr>
+           <tr>
+             <td>
+               <el-form-item prop="anlyItemName" label="分析项目名称">
+                 <el-select v-model="formData.anlyItemNo" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in anlyNameType" :key="index" :label="item.anlyItemName"
+                    :value="item.anlyItemNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+            </td>
+             <td>
+               <el-form-item prop="reviseRuleNo" label="修约规则">
+               <el-select v-model="formData.reviseRuleNo" filterable clearable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in reviseRuleNameType" :key="index" :label="item.reviseRuleName"
+                    :value="item.reviseRuleNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+             <el-form-item label="上限值">
+             <el-input v-model="formData.maxValue" size="small" placeholder="请输入" style="width: 150px;"></el-input>
+             </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isComputeTypeIndex" label="是否计算">
+               <el-select v-model="formData.isCompute" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isComputeType" :key="index" :label="item.isCompute"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+           </tr>
+            <tr>
+             <td>
+                <el-form-item prop="anlyItemAlias" label="分析项目别名">
+                <el-input v-model="formData.anlyItemAlias" size="small" style="width: 150px;" placeholder="请输入"></el-input>
+                </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="itemTypeNameTypeIndex" label="项目类型">
+               <el-select v-model="formData.itemTypeCode" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in itemTypeNameType" :key="index" :label="item.baseName"
+                    :value="item.baseCode">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isReportTypeIndex" label="是否报出">
+               <el-select v-model="formData.isReport" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isReportType" :key="index" :label="item.isReport"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="isMidTypeIndex" label="是否中间项">
+               <el-select v-model="formData.isMid" filterable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in isMidType" :key="index" :label="item.isMid"
+                    :value="item.id">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+            </tr>
+            <tr>
+             <td>
+               <el-form-item prop="dspOrder" label="显示顺序">
+               <el-input v-model="formData.dspOrder" size="small" style="width: 150px;" placeholder="请输入"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="formulaNo" label="计算公式">
+               <el-select v-model="formData.formulaNo" filterable clearable collapse-tags size="small" style="width: 150px;">
+                  <el-option v-for="(item,index) in formulaNameType" :key="index" :label="item.formulaName"
+                    :value="item.formulaNo">
+                  </el-option>
+                </el-select>
+               </el-form-item>
+             </td>
+             <td colspan="3">
+               <el-form-item prop="memo" label="备注">
+               <el-input v-model="formData.memo" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+               </el-form-item>
+             </td>
+            </tr>
+             <tr>
+             <td>
+               <el-form-item prop="anlyCnt" label="分析次数">
+               <el-input v-model="formData.anlyCnt" size="small" style="width: 150px;" placeholder="请输入"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="defaultValue" label="方法上限值">
+               <el-input v-model="formData.maxLimit" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="defaultValue" label="方法下限值">
+               <el-input v-model="formData.minLimit" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+               </el-form-item>
+             </td>
+             <td>
+               <el-form-item prop="defaultValue" label="默认值">
+               <el-input v-model="formData.defaultValue" size="small" placeholder="请输入" style="width: 100%;"></el-input>
+               </el-form-item>
+             </td>
+             </tr>
+         </table>
+       </el-form>
+       <span slot="footer" class="dialog-footer">
+        <el-button type="goon" icon="el-icon-check" size="mini" @click="modifyData">确定</el-button>
+        <el-button size="mini" type="goon" icon="el-icon-remove-outline" @click="cancel">取消</el-button>
+      </span>
+    </el-dialog>
+    </div>
+</template>
+<script>
+import {
+  getCookie
+} from '@/utils/util.js';
+import {
+  cookieUserId,
+  cookieUserName
+} from '@/config/config.js';
+let userName = getCookie(cookieUserName);
+let userId = getCookie(cookieUserId);
+export default {
+  props: ['showFlag', 'Params'],
+    data () {
+      var maxValueVerify = (rule, value, callback) => {
+	        if(this.maxValue){
+	          if(Number(this.maxValue) > Number(this.minValue)){
+	            callback();
+	          }else{
+	            callback(new Error('上限不能小于下限'));
+	          }
+	        }else{
+	          callback();
+          }
+       };
+      return {
+          dialogTableVisible: false,
+          unitNameType: [],
+          anlyNameType:[],
+          minSignType: [
+            {minSign: '>='},
+            {minSign: '>'}
+          ],
+          isRareType: [
+            {id: '0', isRare: '否'},
+            {id: '1', isRare: '是'}
+          ],
+          dataTypeNameType: [],
+          isLoginType: [
+            {id: '0', isLogin: '否'},
+            {id: '1', isLogin: '是'}
+          ],
+          outputTypeNameType: [],
+          maxSignType: [
+            {maxSign: '<='},
+            {maxSign: '<'}
+          ],
+          isAlarmType: [
+            {id: '0', isAlarm: '否'},
+            {id: '1', isAlarm: '是'}
+          ],
+          reviseRuleNameType: [],
+          isComputeType: [
+            {id: '0', isCompute: '否'},
+            {id: '1', isCompute: '是'}
+          ],
+          formData: {
+           // anlyItemName: '',
+            minValue: '',
+            maxValue: '',
+            reviseRuleNo: '',
+            formulaNo: ''
+          },
+          itemTypeNameType: [],
+          isReportType: [
+            {id: '0', isReport: '否'},
+            {id: '1', isReport: '是'}
+          ],
+          isMidType: [
+            {id: '0', isMid: '否'},
+            {id: '1', isMid: '是'}
+          ],
+          formulaNameType: [],
+          monitorForm: {
+          tableData: [{}],
+          
+          monitorRules: {
+          // maxValue: [{ required: true, message: '该项不能为空', trigger: ['blur', 'change']},{ required: true,validator: maxValueVerify, trigger: 'blur' }],
+          //anlyItemName: [{ required: true, message: '该项不能为空', trigger: ['blur', 'change']}],
+          // minValue: [{ required: true, message: '该项不能为空', trigger: ['blur', 'change']}]
+          }
+          }
+      }
+    },
+    mounted () {
+      this.axios.post("pass/baseManagement/v1/limsstdanlyitems/queryLimsStdAnlyItemPage",{object:{validFlag:1}, pageIndex: 1,pageSize: 9999}, {individualType: 'json'}).then(res => {
+        this.anlyNameType = res.data.list
+      })
+      this.getUnitNameTypeList ()
+      this.getDataTypeNameType ()
+      this.getOutputTypeNameType ()
+      this.getReviseRuleNameType ()
+      this.getItemTypeNameType ()
+      this.getFormulaNameType ()
+    },
+    methods: {
+      cancel () {
+        this.formData = {}
+        this.dialogTableVisible = false
+      },
+       getCode (code, arr, codeKey, nameKey) {
+         if (!code) {
+           return '';
+         }
+         let targetRow = arr.find(item => {
+           return item[codeKey] === code;
+         });
+         return targetRow ? targetRow[nameKey] : '';
+       },
+      getUnitNameTypeList () {
+        this.axios.post("pass/baseManagement/v1/limsbaseunits/queryLimsBaseUnitPage",{object:{validFlag:1},pageIndex:1,pageSize:9999}, {individualType: 'json'}).then(res => {
+          this.unitNameType = res.data.list;
+        })
+      },
+      getDataTypeNameType () {
+        this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4825}, {individualType: 'json'}).then(res => {
+              this.dataTypeNameType = res.data
+            })
+      },
+      getOutputTypeNameType () {
+        this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4810}, {individualType: 'json'}).then(res => {
+              this.outputTypeNameType = res.data
+            })
+      },
+      getReviseRuleNameType () {
+        this.axios.post('pass/baseManagement/v1/limsbasereviserules/queryLimsBaseReviseRulePage',{object: {reviseRuleName: "",validFlag:1}, pageIndex: 1, pageSize: 9999}, {individualType: 'json'}).then(res => {
+          this.reviseRuleNameType = res.data.list;
+        }).catch(e => {
+                // this.dataLoading = false;
+        });
+      },
+      getItemTypeNameType () {
+        this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4804}, {individualType: 'json'}).then(res => {
+              this.itemTypeNameType = res.data
+            })
+      },
+      getFormulaNameType () {
+        this.axios.post('pass/baseManagement/v1/limsbaseformulas/queryLimsBaseFormulaPage',{object: {formulaNo: "", formulaName: "",validFlag:1},pageIndex:1,pageSize: 9999},{individualType: 'json'}).then(res => {
+          this.formulaNameType = res.data.list;
+        })
+      },
+      modifyData () {
+        let _this = this;
+        // _this.$refs['monitorForm'].validate((valid) => {
+        // if (valid) {
+        this.formData.updateMan = userName
+        this.formData.updateNo = userId
+         this.formData.anlyItemName = this.getCode (this.formData.anlyItemNo, this.anlyNameType, 'anlyItemNo', 'anlyItemName')
+        this.formData.unitName = this.getCode (this.formData.unitNo, this.unitNameType, 'unitNo', 'unitName')
+        this.formData.dataTypeName = this.getCode (this.formData.dataTypeCode, this.dataTypeNameType, 'baseCode', 'baseName')
+        this.formData.outputTypeName = this.getCode (this.formData.outputTypeCode, this.outputTypeNameType, 'baseCode', 'baseName')
+        this.formData.reviseRuleName = this.getCode (this.formData.reviseRuleNo, this.reviseRuleNameType, 'reviseRuleNo', 'reviseRuleName')
+        this.formData.itemTypeName = this.getCode (this.formData.itemTypeCode, this.itemTypeNameType, 'baseCode', 'baseName')
+        this.formData.formulaName=  this.getCode (this.formData.formulaNo, this.formulaNameType, 'formulaNo', 'formulaName')
+        this.axios.put('pass/baseManagement/v1/limsstdtestitemds/', this.formData, {individualType: 'json'}).then(res => {
+           if (res.code == 0 || res.code == 200) {
+             this.dialogTableVisible = false;
+              this.$message.success('修改成功')
+              this.$emit('refresh')
+           } else {
+            this.$message.error(res.message)
+           }
+           }).catch(e => {
+            this.$message.error(e.message)
+          })
+        // }
+        // })
+      },
+      renderHeader (h) {
+         return (
+             <div style="cursor: pointer ;line-height:20px" onClick={() => this.addRow()}>
+             <i class="el-icon-plus" style="font-size:20px; color:rgb(18, 52, 243)"></i>
+             </div>
+         )
+      },
+     closeDialog () {
+      this.formData = {}
+     },
+      tableHeaderCellStyle () {
+      return 'background-color: rgb(249,249,249) !important;color: rgb(73, 72, 72);border-bottom: 1px solid #DCDFE7;border-top:3px solid #3ac1ea;'
+      }
+    },
+    watch: {
+      showFlag (arg) {
+        this.formData = Object.assign({},this.Params[0]);
+        this.dialogTableVisible = true;
+      }
+    }
+}
+</script>
+<style lang="less">
+.customWidth_test{
+  width: 1000px !important
+}
+</style>

+ 20 - 17
src/views/standardManagement/components/testProjectConfiguration/alertComponents4.vue

@@ -169,23 +169,26 @@ export default {
      },
     },
     watch: {
-      showFlag (arg) {
-        let _this = this;
-        if (_this.Params !== null) {
-          _this.baseData = Object.assign({},_this.Params[0]);
-          this.selectStdname(this.baseData.stdUsedCode)
-          _this.tableType = 1;
-          _this.tableTypeDsc = '修改测试方法';
-          _this.seen = false;
-          _this.beInvalid = true;
-        } else {
-          _this.tableType = 0;
-          _this.seenNo = false;
-          _this.baseData = Object.assign({},{testItemNo:this.Params2[0].testItemNo,testItemName:this.Params2[0].testItemName});
-          // _this.baseData.merchNo = _this.Params.merchNo;
-          _this.tableTypeDsc = '新增测试方法';
-        }
-        this.dialogTableVisible = true;
+      showFlag: {
+        handler (arg) {
+          let _this = this;
+          if (_this.Params !== null) {
+            _this.baseData = Object.assign({},_this.Params[0]);
+            this.selectStdname(this.baseData.stdUsedCode)
+            _this.tableType = 1;
+            _this.tableTypeDsc = '修改测试方法';
+            _this.seen = false;
+            _this.beInvalid = true;
+          } else {
+            _this.tableType = 0;
+            _this.seenNo = false;
+            _this.baseData = Object.assign({},{testItemNo:this.Params2[0].testItemNo,testItemName:this.Params2[0].testItemName});
+            // _this.baseData.merchNo = _this.Params.merchNo;
+            _this.tableTypeDsc = '新增测试方法';
+          }
+          this.dialogTableVisible = true;
+        },
+        immediate: true
       }
     }
 }

+ 198 - 0
src/views/standardManagement/components/testProjectConfiguration/alertComponents4.vue.bak

@@ -0,0 +1,198 @@
+<template>
+    <div class="examination">
+     <el-dialog @close="closeDialog" :visible.sync="dialogTableVisible">
+        <div slot="title" class="titleBox">
+        <i :class="tableType === 0? 'el-icon-document':'el-icon-edit-outline'" style="font-size: 20px"></i>
+        <!-- <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/more.png' /> -->
+        <span style="margin-left:10px;font-size:18px">{{tableTypeDsc}}</span>
+        </div>
+       <el-form ref="baseData" label-width="90px" :rules="ruleValidate" :model="baseData">
+         <el-row>
+          <el-col :span="12">
+            <el-form-item prop="testItemName" label="测试名称">
+              <el-input v-model="baseData.testItemName" style="width:100%" readonly disabled size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item prop="stdUsedCode" label="标准用途类型">
+              <el-select v-model="baseData.stdUsedCode" @change='selectStdname' style="width:100%" filterable collapse-tags size="small">
+                <el-option v-for="(item,index) in stdUsedType" :key="index" :label="item.baseName" :value="item.baseCode">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item prop="dspOrder" label="显示顺序">
+                <el-input v-model="baseData.dspOrder" style="width:100%"  size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="stdName" label="方法名称">
+                <el-select v-model="baseData.stdNo" clearable style="width:100%" filterable collapse-tags size="small">
+                  <el-option v-for="(item,index) in stdNameType" :key="index" :label="item.stdName" :value="item.stdNo">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+         </el-row>
+          <el-row>
+          <el-col :span="24">
+            <el-form-item prop="memo" label="备注">
+              <el-input v-model="baseData.memo" style="width:100%" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+         </el-row>
+       </el-form>
+       <span slot="footer" class="dialog-footer">
+        <el-button type="goon" size="mini" icon="el-icon-check" @click="tableType === 0 ? addData():modifyData()">确定</el-button>
+        <el-button size="mini" type="goon" icon="el-icon-remove-outline" @click="cancel">取消</el-button>
+      </span>
+    </el-dialog>
+    </div>
+</template>
+<script>
+import {
+  getCookie
+} from '@/utils/util.js';
+import {
+  cookieUserId,
+  cookieUserName
+} from '@/config/config.js';
+let userName = getCookie(cookieUserName);
+let userId = getCookie(cookieUserId);
+export default {
+  props: ['showFlag', 'Params', 'Params2'],
+    data () {
+        return {
+            dialogTableVisible: false,
+            tableTypeDsc: '新增测试方法',
+            tableType: 0,
+            seen: true,
+            seenNo: true,
+            beInvalid: false,
+            stdNameTypeIndex: 0,
+            stdNameType: [],
+            stdUsedType:[],
+            tableData: [],
+            baseData: {
+              testItemNo: '',
+              testItemName: '',
+              memo: '',
+              testStdNo: '',
+              stdDesc: '',
+              dspOrder: ''
+            },
+            ruleValidate: {
+              stdUsedCode: [{ required: true, message: '该项不能为空', trigger: 'change' }]
+              //dataTypeName: [{ required: true, message: '该项不能为空', trigger: 'change' }],
+              //testItemNo: [{ required: true, message: '该项不能为空', trigger: 'change' }],
+              // dataTypeName: [{ required: true, message: '该项不能为空', trigger: 'change' }]
+             }
+        }
+    },
+    mounted () {
+      this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4805}, {individualType: 'json'}).then(response => {
+        this.stdUsedType = response.data
+      });
+    },
+    methods: {
+      cancel () {
+        let _this = this;
+        _this.baseData = {}
+        _this.dialogTableVisible = false
+      },
+      selectStdname(val){
+        this.axios.post('pass/baseManagement/v1/limsstdinfos/queryLimsStdInfoList',{object:{validFlag:1,stdUsedCode:val}, pageIndex:1,pageSize:99999,},{individualType: 'json'}).then(res => {
+          this.stdNameType = res.data.list;
+        })
+      },
+      getCode (code, arr, codeKey, nameKey) {
+        if (!code) {
+          return '';
+        }
+        let targetRow = arr.find(item => {
+          return item[codeKey] === code;
+        });
+        // console.log(targetRow, 'targetRow');
+        return targetRow ? targetRow[nameKey] : '';
+      },
+      addData () {  
+        let _this = this;
+         _this.tableData = [];
+         _this.$refs['baseData'].validate((valid) => {
+          if (valid) {
+            this.baseData.stdUsedName = this.getCode(this.baseData.stdUsedCode,this.stdUsedType,'baseCode','baseName')
+            this.baseData.stdName = this.getCode(this.baseData.stdNo,this.stdNameType,'stdNo','stdName')
+            _this.axios.post('pass/baseManagement/v1/limsstdtestmatchs/saveLimsStdTestMatch', this.baseData, {individualType: 'json'}).then(res => {
+                if (res.succeed) {
+                  this.dialogTableVisible = false;
+                  this.$message.success('添加成功')
+                  _this.$emit('refresh')
+                } else {
+                 this.$message.error(res.message)
+                }
+                }).catch(e => {
+                 this.$message.error(e.message)
+               })
+         }
+       })
+      },
+      modifyData () {
+        let _this = this;
+        _this.tableData = [];
+        _this.$refs['baseData'].validate((valid) => {
+        if (valid) {
+          this.baseData.stdUsedName = this.getCode(this.baseData.stdUsedCode,this.stdUsedType,'baseCode','baseName')
+          this.baseData.stdName = this.getCode(this.baseData.stdNo,this.stdNameType,'stdNo','stdName')
+          _this.axios.post('pass/baseManagement/v1/limsstdtestmatchs/saveLimsStdTestMatch', _this.baseData, {individualType: 'json'}).then(res => {
+           if (res.succeed) {
+             this.dialogTableVisible = false;
+            this.$message.success('修改成功')
+            _this.$emit('refresh')
+           } else {
+            this.$message.error(res.message)
+           }
+           }).catch(e => {
+            this.$message.error(e.message)
+          })
+        }
+        })
+      },
+     closeDialog () {
+       let _this = this;
+       _this.baseData = {}
+       _this.seen = true;
+       _this.seenNo = true;
+       _this.beInvalid = false;
+     },
+    },
+    watch: {
+      showFlag (arg) {
+        let _this = this;
+        if (_this.Params !== null) {
+          _this.baseData = Object.assign({},_this.Params[0]);
+          this.selectStdname(this.baseData.stdUsedCode)
+          _this.tableType = 1;
+          _this.tableTypeDsc = '修改测试方法';
+          _this.seen = false;
+          _this.beInvalid = true;
+        } else {
+          _this.tableType = 0;
+          _this.seenNo = false;
+          _this.baseData = Object.assign({},{testItemNo:this.Params2[0].testItemNo,testItemName:this.Params2[0].testItemName});
+          // _this.baseData.merchNo = _this.Params.merchNo;
+          _this.tableTypeDsc = '新增测试方法';
+        }
+        this.dialogTableVisible = true;
+      }
+    }
+}
+</script>
+<style lang="less">
+.customWidth_syst{
+  width: 600px !important
+}
+</style>
+

+ 5 - 13
src/views/standardManagement/components/testProjectConfiguration/testProjectConfiguration.vue

@@ -317,10 +317,10 @@
       </span>
        </div>
     </el-dialog>
-    <div is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
-    <!-- <div is="alertComponets2" :showFlag="showFlag2" :Params="Params2" @refresh='refresh2'></div> -->
-    <div is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
-    <div is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
+    <div v-if="showFlag" is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
+    <!-- <div v-if="showFlag2" is="alertComponets2" :showFlag="showFlag2" :Params="Params2" @refresh='refresh2'></div> -->
+    <div v-if="showFlag3" is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
+    <div v-if="showFlag4" is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
   </div>
 </template>
 <script>
@@ -392,7 +392,6 @@ export default {
       multipleSelection: [],
       multipleSelection2: [],
       multipleSelection3: [],
-      testItemNameType: [],
       search: {
         itemTypeCode:'',
         testItemName: ''
@@ -415,11 +414,9 @@ export default {
     this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4804}, {individualType: 'json'}).then(res => {
       this.itemTypeNameType = res.data
     })
-    this.getList()
     this.getDataList();
     // this.getDataList2();
     // this.getDataList3();
-    this.gettestItemNameTypeList();
     this.addScreen();
     this.addScreen2();
     this.addScreen3();
@@ -427,12 +424,6 @@ export default {
   methods: {
     handleClick(tab, event) {
     },
-    gettestItemNameTypeList () {
-       this.axios.get('pass/baseManagement/v1/limsstdtestitems/'+ '?validFlag=1')
-            .then(res => {
-              this.testItemNameType = res.data.list;
-            })  
-    },
     getSummaries(param) {
       const { columns, data } = param;
       const sums = [];
@@ -629,6 +620,7 @@ export default {
         this.$message.warning('请选择一条测试项目数据!');
         return
       }
+      this.getList();
       this.dialogTableVisible = true
     },
     modifyData2 () {

+ 1055 - 0
src/views/standardManagement/components/testProjectConfiguration/testProjectConfiguration.vue.bak

@@ -0,0 +1,1055 @@
+<!--对了3张表字段,别的没有做-->
+<template>
+  <div class="examination">
+    <div class="common-head-search">
+      <el-form :inline="true">
+        <el-form-item label='项目类型'>
+          <el-select v-model="search.itemTypeCode" clearable filterable collapse-tags  size="small" style="width: 200px;">
+            <el-option v-for="(item,index) in itemTypeNameType" :key="index" :label="item.baseName"
+              :value="item.baseCode">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label='测试项目名称'>
+          <el-input v-model="search.testItemName" @keyup.enter.native="searchData" size="small" placeholder="请输入查询内容" style="width: 200px;"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button icon="el-icon-search" type="goon" size="mini" @click="searchData">查询</el-button>
+          <el-button icon="el-icon-refresh" type="info" plain size="mini" @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="common-title-div" style="margin-bottom:0;margin-top:0">
+      <div class="common-title-name">
+        <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/logo.png' />
+        测试项目
+      </div>
+      <div>
+      <el-button icon="el-icon-circle-plus-outline" type="goon" size="mini" @click="addData" v-privilege="activeMenu + 'ADD'">新增</el-button>
+      <el-button icon="el-icon-edit" type="goon" size="mini" @click="modifyData" v-privilege="activeMenu + 'PUT'">修改</el-button>
+      <el-button icon="el-icon-circle-plus-outline" type="goon" size="mini" :loading='copyLoading' v-privilege="activeMenu + 'copy'" @click="copyData">复制</el-button>
+      <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="deleteData" v-privilege="activeMenu + 'disable'">停用</el-button>
+      <el-button icon="el-icon-check" type="goon" size="mini" @click="recoverData" v-privilege="activeMenu + 'effectivity'">启用</el-button>
+      <el-button icon="el-icon-check" type="goon" size="mini" :loading='batchLoading' @click="batchData" v-privilege="activeMenu + 'syn'">批量配置同步</el-button>
+      </div>
+    </div>
+    <div class="common-table-div" style="margin-bottom:0">
+       <el-table v-loading="dataLoading" ref="dataTable" border :height="heightTop" highlight-current-row @current-change="handleCurrentChange" @selection-change="handleSelectionChange" :data="table.list" :icore-filter-flag="icoreFilterFlag"
+       :header-cell-style="tableHeaderCellStyle" :row-class-name="tableRowClassName" :summary-method="getSummaries" show-summary>
+        <el-table-column type="index" label="NO" fixed="left" align="center"></el-table-column>
+        <el-table-column type="selection" width="55" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemNo" label="测试项目编号" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemName" label="测试项目名称" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="itemTypeName" label="项目类型" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px"  prop="validFlag1" label="数据状态" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="testCnt" label="测试次数" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="pointName" label="作业点" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="ruleName" label="业务规则" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="testPostName" label="测试岗位" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemDesc" label="测试项目描述" align="center"></el-table-column>
+        <!-- <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemEng" label="测试项目英文" align="center"></el-table-column> -->
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="eqpTypeName" label="测试设备" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="testLimit" label="测试时限" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="itemTemp" label="测试温度" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isTest1" label="是否免检" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isCtrl1" label="是否控制" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="100px" prop="isAuto1" label="是否自动执行" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isSon1" label="是否子任务" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isSyn1" label="是否同步" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isMsg1" label="是否推送" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isIndex1" label="是否含指标" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isRefer1" label="是否引用" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="doOrder" label="显示顺序" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="200px" prop="memo" label="备注" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="createTime" label="创建时间" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="createMan" label="创建人" align="center"></el-table-column>
+      </el-table>
+    </div>
+    <div class="common-foot-style">
+        <el-pagination @size-change="pageSizeChange" @current-change="pageCurrentChange"
+          :current-page="page.pageNum" :page-sizes="[10, 20, 50, 100, 200]" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper"
+          :total="page.totalPage" background>
+        </el-pagination>
+    </div>
+    <div style="margin-top:40px">
+    <template>
+    <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+    <el-tab-pane label="分析项目" name="first">
+       <div>
+    <div class="common-title-div">
+      <div class="common-title-name">
+        <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/logo.png' />
+        分析项目
+      </div>
+      <div>
+      <el-button icon="el-icon-circle-plus-outline" type="goon" size="mini" @click="addData2" v-privilege="activeMenu + 'ADD'">新增</el-button>
+      <el-button icon="el-icon-edit" type="goon" size="mini" @click="modifyData2" v-privilege="activeMenu + 'PUT'">修改</el-button>
+      <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="deleteData2" v-privilege="activeMenu + 'disable'">停用</el-button>
+      <el-button icon="el-icon-check" type="goon" size="mini" @click="recoverData2" v-privilege="activeMenu + 'effectivity'">启用</el-button>
+      <el-button icon="el-icon-circle-close" type="danger" :loading='deleteLoading' size="mini" @click="deleteDatas" v-privilege="activeMenu + 'DELETE'">删除</el-button>
+      </div>
+    </div>
+    <div class="common-table-div" style="margin-bottom:0;margin-top:0">
+       <el-table v-loading="dataLoading2" ref="dataTable2" border :height="heightBot" highlight-current-row @selection-change="handleSelectionChange2" :data="table.list2" :icore-filter-flag="icoreFilterFlag2"
+       :header-cell-style="tableHeaderCellStyle" :row-class-name="tableRowClassName2" :summary-method="getSummaries" show-summary>
+        <el-table-column type="index" label="NO" fixed="left" align="center">
+        </el-table-column>
+        <el-table-column type="selection" width="55" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemNo" label="测试任务编码" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemName" label="测试任务名称" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemNo" label="分析项目编号" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemName" label="分析项目名称" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="formulaName" label="计算公式" align="center"></el-table-column>
+        <!-- <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemAlias" label="分析项目别名" align="center"></el-table-column> -->
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="unitName" label="数值单位" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="defaultValue" label="默认值" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px"  prop="validFlag1" label="数据状态" align="center">
+          <!-- <template slot-scope="scope">
+              <span v-if="scope.row.validFlag == 1">有效</span>
+              <span v-else-if="scope.row.validFlag == 0">无效</span>
+          </template> -->
+        </el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dspOrder" label="显示顺序" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dataTypeName" label="数据类型" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="reviseRuleName" label="修约规则" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="anlyCnt" label="分析次数" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="outputTypeName" label="输出类型" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minSign" label="下限符" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minValue" label="下限值" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxSign" label="上限符" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxValue" label="上限值" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxLimit" label="方法上限值" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minLimit" label="方法下限值" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isReport1" label="是否报出" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isRare1" label="是否贵重" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isLogin1" label="是否必检" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isAlarm1" label="是否报警" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isCompute1" label="是否计算" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isMid1" label="是否中间项" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="200px" prop="memo" label="备注" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="createTime" label="创建时间" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="createMan" label="创建人" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="updateTime" label="修改时间" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="updateMan" label="修改人" align="center"></el-table-column>
+      </el-table>
+    </div>
+    <!-- <div class="common-foot-style">
+        <el-pagination v-loading="dataLoading2" @size-change="pageSizeChange2" @current-change="pageCurrentChange2"
+          :current-page="page2.pageNum" :page-sizes="[10, 20, 50, 100, 200]" :page-size="page2.pageSize" layout="total, sizes, prev, pager, next, jumper"
+          :total="page2.totalPage" background>
+        </el-pagination>
+    </div> -->
+    </div>
+    </el-tab-pane>
+    <el-tab-pane label="方法标准" name="second">
+    <div>
+    <div class="common-title-div">
+      <div class="common-title-name">
+        <img style="width: 25px; height: 25px" src='../../../../assets/img/imgScreen/logo.png' />
+        方法标准
+      </div>
+      <div>
+      <el-button icon="el-icon-circle-plus-outline" type="goon" size="mini" @click="addData3">新增</el-button>
+      <el-button icon="el-icon-edit" type="goon" size="mini" @click="modifyData3">修改</el-button>
+      <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="deleteData3">停用</el-button>
+      <el-button icon="el-icon-check" type="goon" size="mini" @click="recoverData3">启用</el-button>
+      </div>
+    </div>
+    <div class="common-table-div" style="margin-bottom:0;margin-top:0">
+       <el-table v-loading="dataLoading3" ref="dataTable3" border :height="heightBot" highlight-current-row @selection-change="handleSelectionChange3" :data="table.list3" :icore-filter-flag="icoreFilterFlag3"
+       :header-cell-style="tableHeaderCellStyle" :row-class-name="tableRowClassName3" :summary-method="getSummaries" show-summary>
+        <el-table-column type="index" label="NO" fixed="left" align="center">
+        </el-table-column>
+        <el-table-column type="selection" width="55" align="center" ></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testStdNo" label="测试方法编号" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="testItemName" label="测试名称" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="stdName" label="方法名称" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="stdUsedName" label="标准用途类型" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="validFlag1" label="数据状态" align="center">
+          <!-- <template slot-scope="scope">
+              <span v-if="scope.row.validFlag == 1">有效</span>
+              <span v-else-if="scope.row.validFlag == 0">无效</span>
+          </template> -->
+        </el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dspOrder" label="显示顺序" align="center"></el-table-column>
+        <el-table-column sortable :show-overflow-tooltip="true" min-width="200px" prop="memo" label="备注" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="createTime" label="创建时间" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="createMan" label="创建人" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="updateTime" label="修改时间" align="center"></el-table-column>
+        <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="updateMan" label="修改人" align="center"></el-table-column>
+      </el-table>
+    </div>
+    <!-- <div class="common-foot-style">
+        <el-pagination v-loading="dataLoading3" @size-change="pageSizeChange3" @current-change="pageCurrentChange3"
+          :current-page="page3.pageNum" :page-sizes="[10, 20, 50, 100, 200]" :page-size="page3.pageSize" layout="total, sizes, prev, pager, next, jumper"
+          :total="page3.totalPage" background>
+        </el-pagination>
+    </div> -->
+    </div>
+    </el-tab-pane>
+    </el-tabs>
+    </template>
+    </div>
+    <el-dialog @close="closeDialog" :close-on-click-modal='false' :visible.sync="dialogTableVisible" width='80%'>
+        <div slot="title" class="titleBox">
+         <i class="el-icon-document" style="font-size: 20px"></i>
+        <span style="margin-left:10px;font-size:18px;margin-right:20px">新增分析项目</span>
+        <span style="font-size:16px;color:#fff;">分析项目名称</span>
+        <el-input v-model="anlyItemName" size="small" @keyup.enter.native="searchData2" style="width: 150px;"></el-input>
+        <el-button icon="el-icon-search" type="goon" size="mini" @click="searchData2">查询</el-button>
+        </div>
+        <el-row>
+          <el-col :span='12'>
+            <div class="common-table-div">
+               <el-table v-loading="fxdataLoading" ref="dataTable" border :height="350" highlight-current-row :data="fxlist" :icore-filter-flag="icoreFilterFlag"
+               :header-cell-style="tableHeaderCellStyle" :cell-class-name="fxtableRowClassName" :summary-method="getSummaries" show-summary>
+              <el-table-column type="index" label="NO" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="" label="操作" align="center">
+                <template slot-scope="{row}">
+                  <el-button type="text" size='mini' @click="checkRow(row)">添加</el-button>
+                </template>
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="100px" prop="anlyItemNo" label="分析项目编号" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemName" label="分析项目名称" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="validFlag1" label="数据状态" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="itemTypeName" label="项目类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dspOrder" label="显示顺序" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dataTypeName" label="数据类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemAlias" label="分析项目别名" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemDesc" label="分析项目描述" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemEng" label="分析项目英文" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="unitName" label="度量单位" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="formulaName" label="计算公式" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="reviseRuleName" label="修约规则" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="outputTypeName" label="输出类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="defaultValue" label="默认值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxSign" label="上限符" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxValue" label="上限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minSign" label="下限符" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minValue" label="下限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxLimit" label="方法上限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minLimit" label="方法下限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="anlyCnt" label="分析次数" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isCompute1" label="是否计算" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" prop="isMid1" min-width="90px" label="是否中间项" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" prop="isReport1" min-width="80px" label="是否报出" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isLogin1" label="是否必检" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isAlarm1" label="是否报警" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isRare1" label="是否贵重" align="center">
+              </el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="createTime" label="创建时间" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="createMan" label="创建人" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="updateTime" label="修改时间" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="updateMan" label="修改人" align="center"></el-table-column>
+               </el-table>
+               </div>
+              <div class="common-foot-style">
+              <el-pagination @size-change="fxpageSizeChange" @current-change="fxpageCurrentChange"
+                :current-page="fxpage.pageNum" :page-sizes="[100, 200,500]" :page-size="fxpage.pageSize" layout="total, sizes, prev, pager, next"
+                :total="fxpage.totalPage" background>
+              </el-pagination>
+            </div>
+          </el-col>
+          <el-col :span='12'>
+            <div class="common-table-div">
+               <el-table  border :height="350"  :data="checkList" :icore-filter-flag="icoreFilterFlag"
+               :header-cell-style="tableHeaderCellStyle" :cell-class-name="fxtableRowClassName" :summary-method="getSummaries" show-summary>
+              <el-table-column type="index" label="NO" fixed="left" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="" label="操作" align="center">
+                <template slot-scope="scope">
+                  <el-button type="text" size='mini' @click="removeItem(scope.$index)">删除</el-button>
+                </template>
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="100px" prop="anlyItemNo" label="分析项目编号" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemName" label="分析项目名称" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="validFlag1" label="数据状态" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="itemTypeName" label="项目类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dspOrder" label="显示顺序" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="dataTypeName" label="数据类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemAlias" label="分析项目别名" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemDesc" label="分析项目描述" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="120px" prop="anlyItemEng" label="分析项目英文" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="unitName" label="度量单位" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="formulaName" label="计算公式" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="reviseRuleName" label="修约规则" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="outputTypeName" label="输出类型" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="defaultValue" label="默认值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxSign" label="上限符" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxValue" label="上限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minSign" label="下限符" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minValue" label="下限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="maxLimit" label="方法上限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="minLimit" label="方法下限值" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="anlyCnt" label="分析次数" align="center"></el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isCompute1" label="是否计算" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="90px" prop="isMid1" label="是否中间项" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isReport1" label="是否报出" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isLogin1" label="是否必检" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isAlarm1" label="是否报警" align="center">
+              </el-table-column>
+              <el-table-column sortable :show-overflow-tooltip="true" min-width="80px" prop="isRare1" label="是否贵重" align="center">
+              </el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="createTime" label="创建时间" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="createMan" label="创建人" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="160px" prop="updateTime" label="修改时间" align="center"></el-table-column>
+              <el-table-column  sortable :show-overflow-tooltip="true" min-width="80px" prop="updateMan" label="修改人" align="center"></el-table-column>
+               </el-table>
+               </div>
+          </el-col>
+        </el-row>
+       <div style="margin-top: 20px; margin-right: 50px" class="clearfix">
+       <span slot="footer" class="dialog-footer" style="float:right">
+        <el-button type="goon"  icon="el-icon-check" size="mini" @click="fxaddData()">确定</el-button>
+        <el-button size="mini"  type="goon" icon="el-icon-remove-outline" @click="cancel">取消</el-button>
+      </span>
+       </div>
+    </el-dialog>
+    <div is="alertComponets" :showFlag="showFlag" :Params="Params" @refresh='refresh'></div>
+    <!-- <div is="alertComponets2" :showFlag="showFlag2" :Params="Params2" @refresh='refresh2'></div> -->
+    <div is="alertComponets3" :showFlag="showFlag3" :Params="Params3" @refresh='refresh2'></div>
+    <div is="alertComponets4" :showFlag="showFlag4" :Params="Params5" :Params2="Params4" @refresh='refresh3'></div>
+  </div>
+</template>
+<script>
+import {
+  getCookie
+} from '@/utils/util.js';
+import {
+  cookieUserId,
+  cookieUserName
+} from '@/config/config.js';
+import alertComponets from './alertComponents';
+import alertComponets3 from './alertComponents3';
+import alertComponets4 from './alertComponents4';
+let userName = getCookie(cookieUserName);
+let userId = getCookie(cookieUserId);
+export default {
+  components: {alertComponets, alertComponets3, alertComponets4},
+  data () {
+    return {
+      table: {
+        list: [],
+        list2: [],
+        list3: []
+      },
+      fxlist:[],
+      checkList:[],
+      fxdataLoading:false,
+      deleteLoading:false,
+      dataLoading: false,
+      dataLoading2: false,
+      dataLoading3: false,
+      icoreFilterFlag: true,
+      icoreFilterFlag2: true,
+      icoreFilterFlag3: true,
+      activeName: 'first',
+      copyLoading:false,
+      page: {
+        pageSize: 50,
+        pageNum: 1,
+        totalPage: 0
+      },
+      fxpage: {
+        pageSize: 500,
+        pageNum: 1,
+        totalPage: 0
+      },
+      page2: {
+        pageSize: 990,
+        pageNum: 1,
+        totalPage: 0
+      },
+      page3: {
+        pageSize: 990,
+        pageNum: 1,
+        totalPage: 0
+      },
+      dialogTableVisible:false,
+      anlyItemName:'',
+      testItemNo: '',
+      showFlag: false,
+      showFlag2: false,
+      showFlag3: false,
+      showFlag4: false,
+      Params: {},
+      Params2: {},
+      Params3: {},
+      Params4: {},
+      Params5: {},
+      multipleSelection: [],
+      multipleSelection2: [],
+      multipleSelection3: [],
+      testItemNameType: [],
+      search: {
+        itemTypeCode:'',
+        testItemName: ''
+      },
+      curItemTypeCode: '',
+      batchLoading:false,
+      itemTypeNameType:[],
+      heightTop:0,
+      heightBot:0,
+      activeMenu:''
+    }
+  },
+  created(){
+    this.heightTop = window.innerHeight/2 - 130 < 249  ? 249 : window.innerHeight/2 - 130;
+    this.heightBot = window.innerHeight/2 - 130 < 249  ? 249 : window.innerHeight/2 - 130;
+    this.activeMenu = window.top.localStorage.getItem('activeMenu')
+    console.log('this.activeMenu', this.activeMenu)
+  },
+  mounted () {
+    this.axios.post("pass/baseManagement/v1/limsbaseinfos/queryBaseInfoByBaseCode",{validFlag:1,baseCode:4804}, {individualType: 'json'}).then(res => {
+      this.itemTypeNameType = res.data
+    })
+    this.getList()
+    this.getDataList();
+    // this.getDataList2();
+    // this.getDataList3();
+    this.gettestItemNameTypeList();
+    this.addScreen();
+    this.addScreen2();
+    this.addScreen3();
+  },
+  methods: {
+    handleClick(tab, event) {
+    },
+    gettestItemNameTypeList () {
+       this.axios.get('pass/baseManagement/v1/limsstdtestitems/'+ '?validFlag=1')
+            .then(res => {
+              this.testItemNameType = res.data.list;
+            })  
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "合计";
+        }
+        if (index === 1) {
+          sums[index] = data.length;
+        } 
+      });
+      return sums;
+    },
+    closeDialog () {
+      this.checkList = []
+      this.anlyItemName = ''
+      },
+    cancel () {
+      this.checkList = []
+      this.anlyItemName = ''
+      this.dialogTableVisible = false
+      },
+    refresh () {
+      this.getDataList();
+      this.getDataList2(this.testItemNo);
+      this.getDataList3(this.testItemNo);
+    },
+    refresh2 () {
+      this.getDataList2(this.testItemNo);
+    },
+    refresh3 () {
+      this.getDataList3(this.testItemNo);
+    },
+    addData () {
+      let _this = this;
+      _this.showFlag = !_this.showFlag;
+      _this.Params = null;
+    },
+    modifyData () {
+      let _this = this;
+      if (_this.multipleSelection.length !== 1) {
+        this.$message.warning('请勾选您要修改的一条数据!')
+      } else {
+        _this.showFlag = !_this.showFlag;
+        _this.Params = _this.multipleSelection
+      }
+    },
+    recoverData () {
+       let _this = this;
+        if (_this.multipleSelection.length < 1) {
+        this.$message.warning('请勾选您要启用的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection.length; j++) {
+          if (_this.multipleSelection[j].validFlag === '1') {
+          this.$message.warning('请勾选状态为已停用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible = false;
+        for (var i = 0; i < _this.multipleSelection.length; i++) {
+        _this.multipleSelection[i].updateMan = userName;
+        _this.multipleSelection[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestitems/recover', _this.multipleSelection, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('启用成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    batchData () {
+      if (this.multipleSelection.length < 1) {
+        this.$message.warning('请勾选您要批量处理的数据!')
+        return
+      } 
+      let tempArr = []
+      this.multipleSelection.map(item =>{
+        tempArr.push(item.id)
+      })
+      this.batchLoading = true
+      this.axios.post('pass/baseManagement/v1/limsstdtestitems/syncTestItem', tempArr, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+          this.$message.success(res.message);
+          this.refresh()
+        } else {
+          this.$message.error(res.message)
+        }
+        this.batchLoading = false
+      }).catch(e => {
+        this.batchLoading = false
+        this.$message.error(e.message)
+      })
+    },
+    //复制
+    copyData(){
+      if (this.multipleSelection.length != 1) {
+        this.$message.warning('请勾选您要复制的一条数据!')
+        return
+      }
+      this.copyLoading = true
+      this.axios.post('pass/baseManagement/v1/limsstdtestitems/copyLimsStdTestItem?id='+this.multipleSelection[0].id, {individualType: 'json'}).then(res => {
+        if (res.code == 0 || res.code == 200) {
+         this.$message.success(res.message);
+         this.searchData()
+        } else {
+         this.$message.error(res.message)
+        }
+        this.copyLoading = false
+      }).catch(e => {
+        this.copyLoading = false
+        this.$message.error(e.message)
+      })
+    },
+    deleteData () {
+       let _this = this;
+        if (_this.multipleSelection.length < 1) {
+        this.$message.warning('请勾选您要删除的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection.length; j++) {
+          if (_this.multipleSelection[j].validFlag === '0') {
+          this.$message.warning('请勾选状态为已启用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible = false;
+        for (var i = 0; i < _this.multipleSelection.length; i++) {
+        _this.multipleSelection[i].updateMan = userName;
+        _this.multipleSelection[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestitems/abolish', _this.multipleSelection, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('删除成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    searchData () {
+      this.page.pageNum = 1;
+      this.getDataList()
+       
+    },
+    searchData2(){
+      this.fxpage.pageNum = 1
+      this.getList()
+    },
+    fxaddData () {
+      let _this = this;
+      if(_this.checkList.length <= 0){
+        this.$message.warning('请先添加数据到右边的表格中')
+        return
+      }
+      this.checkList.forEach(item =>{
+        item.testItemNo = this.multipleSelection[0].testItemNo
+        item.testItemName = this.multipleSelection[0].testItemName
+      })
+      this.axios.post('pass/baseManagement/v1/limsstdtestitemds/addLimsStdTestItemDList', this.checkList, {individualType: 'json'}).then(res => {
+         if (res.succeed) {
+          _this.dialogTableVisible = false;
+          this.$message.success('添加成功')
+          this.getDataList2(this.testItemNo)
+         } else {
+          this.$message.error(res.message)
+         }
+         }).catch(e => {
+          this.$message.error(e.message)
+        })
+    },
+    checkRow(row){
+      this.checkList.push(row)
+    },
+    removeItem(index){
+      this.checkList.splice(index,1)
+    },
+    reset () {
+      let _this = this;
+      this.search.itemTypeCode = ''
+      _this.search.testItemNo = '';
+      _this.search.testItemName = '';
+      _this.searchData();
+    },
+    addData2 () {
+      let _this = this;
+      if (_this.multipleSelection.length !== 1) {
+        this.$message.warning('请选择一条测试项目数据!');
+        return
+      }
+      this.dialogTableVisible = true
+    },
+    modifyData2 () {
+      let _this = this;
+       if (_this.multipleSelection2.length !== 1) {
+        this.$message.warning('请选择您要修改的数据!');
+      } else {
+        _this.Params3 = _this.multipleSelection2;
+        _this.Params3[0].itemTypeCode = _this.curItemTypeCode;
+        _this.showFlag3 = !_this.showFlag3;
+      }
+    },
+    recoverData2 () {
+      let _this = this;
+        if (_this.multipleSelection2.length < 1) {
+        this.$message.warning('请勾选您要启用的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection2.length; j++) {
+          if (_this.multipleSelection2[j].validFlag === '1') {
+          this.$message.warning('请勾选状态为已停用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible2 = false;
+        for (var i = 0; i < _this.multipleSelection2.length; i++) {
+        _this.multipleSelection2[i].updateMan = userName;
+        _this.multipleSelection2[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestitemds/recover', _this.multipleSelection2, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('启用成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    deleteData2 () {
+       let _this = this;
+        if (_this.multipleSelection2.length < 1) {
+        this.$message.warning('请勾选您要停用的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection2.length; j++) {
+          if (_this.multipleSelection2[j].validFlag === '0') {
+          this.$message.warning('请勾选状态为已启用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible2 = false;
+        for (var i = 0; i < _this.multipleSelection2.length; i++) {
+        _this.multipleSelection2[i].updateMan = userName;
+        _this.multipleSelection2[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestitemds/abolish', _this.multipleSelection2, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('删除成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    //删除分析项目数据
+    deleteDatas () {
+      if (this.multipleSelection2.length < 1) {
+        this.$message.warning('请勾选您要删除的数据!')
+      }
+      let tempArr = []
+      this.multipleSelection2.map(item =>{
+        tempArr.push(item.id)
+      })
+      this.deleteLoading = true
+      this.axios.post('pass/baseManagement/v1/limsstdtestitemds/deleteLimsstdtestitemd', tempArr, {individualType: 'json'}).then(res => {
+        if (res.code == 0 || res.code == 200) {
+          this.$message.success(res.message);
+          this.getDataList2(this.testItemNo);
+        } else {
+         this.$message.error(res.message)
+        }
+        this.deleteLoading = false
+      }).catch(e => {
+        this.deleteLoading = false
+        this.$message.error(e.message)
+      })
+    },
+    addData3 () {
+      let _this = this;
+       if (_this.multipleSelection.length !== 1) {
+        this.$message.warning('请选择一条测试项目数据!');
+      } else {
+      _this.showFlag4 = !_this.showFlag4;
+      _this.Params4 = this.multipleSelection;
+      _this.Params5 = null;
+      }
+    },
+    modifyData3 () {
+      let _this = this;
+      if (_this.multipleSelection3.length !== 1) {
+        this.$message.warning('请选择您要修改的数据!');
+      } else {
+      _this.showFlag4 = !_this.showFlag4;
+      _this.Params4 = null;
+      _this.Params5 = this.multipleSelection3;
+      }
+    },
+    recoverData3 () {
+       let _this = this;
+        if (_this.multipleSelection3.length < 1) {
+        this.$message.warning('请勾选您要启用的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection3.length; j++) {
+          if (_this.multipleSelection3[j].validFlag === '1') {
+          this.$message.warning('请勾选状态为已停用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible3 = false;
+        for (var i = 0; i < _this.multipleSelection3.length; i++) {
+        _this.multipleSelection3[i].updateMan = userName;
+        _this.multipleSelection3[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestmatchs/recover', _this.multipleSelection3, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('启用成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    deleteData3 () {
+        let _this = this;
+        if (_this.multipleSelection3.length < 1) {
+        this.$message.warning('请勾选您要删除的数据!')
+      } else {
+        for (var j= 0; j < _this.multipleSelection3.length; j++) {
+          if (_this.multipleSelection3[j].validFlag === '0') {
+          this.$message.warning('请勾选状态为已启用的数据!')  
+          return 
+          }
+        }
+        _this.dialogTableVisible3 = false;
+        for (var i = 0; i < _this.multipleSelection3.length; i++) {
+        _this.multipleSelection3[i].updateMan = userName;
+        _this.multipleSelection3[i].updateNo = userId
+        }
+        _this.axios.post('pass/baseManagement/v1/limsstdtestmatchs/abolish', _this.multipleSelection3, {individualType: 'json'}).then(res => {
+        if (res.succeed) {
+         this.$message.success('删除成功');
+         _this.refresh()
+        } else {
+         this.$message.error(res.message)
+        }
+        }).catch(e => {
+         this.$message.error(e.message)
+       })
+      }
+    },
+    handleSelectionChange (val) {
+      this.multipleSelection = val;
+      if (val.length > 0) {
+        this.testItemNo = val[val.length-1].testItemNo
+        this.curItemTypeCode = val[val.length-1].itemTypeCode;
+        this.getDataList2(this.testItemNo);
+        this.getDataList3(this.testItemNo);
+      }
+    },
+    pageSizeChange (size) {
+      this.page.pageSize = size;
+      this.getDataList();
+    },
+    pageCurrentChange (index) {
+      this.page.pageNum = index;
+      this.getDataList();
+    },
+    handleSelectionChange2 (val) {
+      this.multipleSelection2 = val;
+    },
+    pageSizeChange2 (size) {
+      this.page2.pageSize = size;
+      this.getDataList2(this.testItemNo);
+    },
+    pageCurrentChange2 (index) {
+      this.page2.pageNum = index;
+      this.getDataList2(this.testItemNo);
+    },
+    handleSelectionChange3 (val) {
+      this.multipleSelection3 = val;
+    },
+    pageSizeChange3 (size) {
+      this.page3.pageSize = size;
+      this.getDataList3(this.testItemNo);
+    },
+    pageCurrentChange3 (index) {
+      this.page3.pageNum = index;
+      this.getDataList3(this.testItemNo);
+    },
+    fxpageSizeChange (size) {
+        this.fxpage.pageSize = size;
+        this.getList();
+      },
+    fxpageCurrentChange (index) {
+      this.fxpage.pageNum = index;
+      this.getList();
+    },
+    handleCurrentChange (val) {
+      this.curItemTypeCode = ''
+      if (val){
+        this.curItemTypeCode = val.itemTypeCode;
+      }
+      if (val.testItemNo === null) {
+        this.testItemNo = '';
+      } else {
+        this.testItemNo = val.testItemNo;
+      }
+      this.getDataList2 (this.testItemNo);
+      this.getDataList3 (this.testItemNo);
+    },
+    addScreen () {
+      this.$nextTick(() => {
+          let ss = document.createElement('div');
+          ss.innerHTML = '筛选';
+          ss.style = 'text-align: center;'
+          this.$refs.dataTable.$el.getElementsByClassName('el-table__fixed')[0].getElementsByTagName('td')[0].appendChild(ss);
+       });
+    },
+    addScreen2 () {
+      this.$nextTick(() => {
+          let ss = document.createElement('div');
+          ss.innerHTML = '筛选';
+          ss.style = 'text-align: center;'
+          this.$refs.dataTable2.$el.getElementsByClassName('el-table__fixed')[0].getElementsByTagName('td')[0].appendChild(ss);
+       });
+    },
+    addScreen3 () {
+      this.$nextTick(() => {
+          let ss = document.createElement('div');
+          ss.innerHTML = '筛选';
+          ss.style = 'text-align: center;'
+          this.$refs.dataTable3.$el.getElementsByClassName('el-table__fixed')[0].getElementsByTagName('td')[0].appendChild(ss);
+       });
+    },
+    getList () {
+        this.fxdataLoading = true;
+        let obj = {
+          object:{
+            anlyItemName:this.anlyItemName,
+            validFlag:1
+          },
+          pageIndex:this.fxpage.pageNum,
+          pageSize:this.fxpage.pageSize
+        }
+        this.axios.post('pass/baseManagement/v1/limsstdanlyitems/queryLimsStdAnlyItemPage/',obj,{individualType: 'json'}).then(res => {
+          this.fxdataLoading = false;
+          this.fxlist = res.data.list;
+          this.fxlist.forEach(item =>{
+            item.validFlag1 = item.validFlag == 1 ? '有效' : item.validFlag == 0 ? '无效' : ''
+            item.isCompute1 = item.isCompute == 1 ? '是' : item.isCompute == 0 ? '否' : ''
+            item.isMid1 = item.isMid == 1 ? '是' : item.isMid == 0 ? '否' : ''
+            item.isReport1 =  item.isReport == 1 ? '是' : item.isReport == 0 ? '否' : ''
+            item.isLogin1 = item.isLogin == 1 ? '是' : item.isLogin == 0 ? '否' : ''
+            item.isAlarm1 = item.isAlarm == 1 ? '是' : item.isAlarm == 0 ? '否' : ''
+            item.isRare1 = item.isRare == 1 ? '是' : item.isRare == 0 ? '否' : ''
+          })
+          this.fxpage.totalPage = res.data.total;
+        }).catch(e => {
+          this.fxdataLoading = false;
+        });
+      },
+    getDataList () {
+      this.dataLoading = true;
+      let obj = {
+        object:{
+          validFlag:'',
+          testItemName:this.search.testItemName,
+          itemTypeCode:this.search.itemTypeCode,
+        },
+        pageIndex:this.page.pageNum,
+        pageSize:this.page.pageSize,
+      }
+      this.axios.post('pass/baseManagement/v1/limsstdtestitems/queryLimsStdTestItemPage',obj, {individualType: 'json'}).then(res => {
+        this.dataLoading = false;
+        this.table.list = res.data.list;
+        this.table.list.forEach(item =>{
+          item.validFlag1 = item.validFlag === '0' ? '无效' : item.validFlag === '1' ? '有效' : ''
+          item.isTest1 = item.isTest === '0' ? '否' : item.isTest === '1' ? '是' : ''
+          item.isCtrl1 = item.isCtrl === '0' ? '否' : item.isCtrl === '1' ? '是' : ''
+          item.isAuto1 = item.isAuto === '0' ? '否' : item.isAuto === '1' ? '是' : ''
+          item.isSon1 = item.isSon === '0' ? '否' : item.isSon === '1' ? '是' : ''
+          item.isSyn1 = item.isSyn === '0' ? '否' : item.isSyn === '1' ? '是' : ''
+          item.isMsg1 = item.isMsg === '0' ? '否' : item.isMsg === '1' ? '是' : ''
+          item.isIndex1 = item.isIndex === '0' ? '否' : item.isIndex === '1' ? '是' : ''
+          item.isRefer1 = item.isRefer === '0' ? '否' : item.isRefer === '1' ? '是' : ''
+        })
+        this.page.totalPage = res.data.total;
+      }).catch(e => {
+        this.dataLoading = false;
+      });
+    },
+    getDataList2 (testItemNo) {
+      this.dataLoading2 = true;
+      if (testItemNo === null || testItemNo === '') {
+        this.table.list2 = [];
+        this.dataLoading2 = false;
+        return
+      }
+      let obj ={
+        object:{
+          testItemNo: testItemNo
+        },
+        pageIndex:this.page2.pageNum,
+        pageSize:this.page2.pageSize
+      }
+      this.axios.post('pass/baseManagement/v1/limsstdtestitemds/queryLimsStdTestItemDPage',obj, {individualType: 'json'}).then(res => {
+        if (res.code == 0 || res.code == 200) {
+          this.table.list2 = res.data.list;
+          this.page2.totalPage = res.data.total;
+          this.table.list2.forEach(item =>{
+            item.validFlag1 = item.validFlag == 0 ? '无效' : item.validFlag == 1 ? '有效' : ''
+            item.isCompute1 = item.isCompute == 0 ? '否' : item.isCompute == 1 ? '是' : ''
+            item.isMid1 = item.isMid == 0 ? '否' : item.isCompute == 1 ? '是' : ''
+            item.isReport1 = item.isReport == 0 ? '否' : item.isReport == 1 ? '是' : ''
+            item.isLogin1 = item.isLogin == 0 ? '否' : item.isLogin == 1 ? '是' : ''
+            item.isAlarm1 = item.isAlarm == 0 ? '否' : item.isAlarm == 1 ? '是' : ''
+            item.isRare1 = item.isRare == 0 ? '否' : item.isRare == 1 ? '是' : ''
+          })
+        }else{
+          this.$message.error(res.message)
+        }
+        this.dataLoading2= false;
+      }).catch(e => {
+        this.dataLoading2 = false;
+        this.$message.error(e.message)
+      });
+    },
+    getDataList3 (testItemNo) {
+      this.dataLoading3 = true;
+      if (testItemNo === null || testItemNo === '') {
+        this.table.list3 = [];
+        this.dataLoading3 = false;
+        return 0
+      } else {
+        let obj ={
+          object:{
+            testItemNo: testItemNo
+          },
+          pageIndex:this.page3.pageNum,
+          pageSize:this.page3.pageSize
+        }
+        this.axios.post('pass/baseManagement/v1/limsstdtestmatchs/queryLimsStdTestMatchPage',obj, {individualType: 'json'}).then(res => {
+              this.dataLoading3 = false;
+              this.table.list3 = res.data.list;
+              for (let i = 0; i < this.table.list3.length; i++) {
+              if (this.table.list3[i].validFlag === '0') {
+                this.table.list3[i].validFlag1 = '无效'
+              } else if (this.table.list3[i].validFlag === '1') {
+                this.table.list3[i].validFlag1 = '有效'
+              }
+              }
+              this.page3.totalPage = res.data.total;
+            }).catch(e => {
+              this.dataLoading3 = false;
+            });
+      }
+    },
+    tableRowClassName ({
+      row, column, rowIndex, columnIndex}) {
+      if (row.validFlag !== '1') {
+        return 'error-row';
+      }
+      return '';
+    },
+    fxtableRowClassName ({
+        row, column, rowIndex, columnIndex
+      }) {
+        if (columnIndex === 4) {
+        if (row.validFlag !== '1') {
+          return 'error-row';
+        }
+        return '';
+        }
+      },
+    tableRowClassName2 ({row, column, rowIndex, columnIndex}) {
+      if (row.validFlag !== '1') {
+        return 'error-row';
+      }
+      return '';
+    },
+    tableRowClassName3 ({row, column, rowIndex, columnIndex}) {
+      if (row.validFlag !== '1') {
+        return 'error-row';
+      }
+      return '';
+    },
+    tableHeaderCellStyle () {
+      return 'color: rgb(255,255,255);border-bottom: 1px solid #DCDFE7;'
+    }
+  }
+}
+</script>
+<style  scoped>
+.customWidth_test4{
+  width: 1000px !important
+}
+.clearfix:after{/*伪元素是行内元素 正常浏览器清除浮动方法*/
+        content: "";
+        display: block;
+        height: 0;
+        clear:both;
+        visibility: hidden;
+    }
+    .clearfix{
+        *zoom: 1;/*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/
+    }
+</style>