newReagent.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. <template>
  2. <div>
  3. <div v-if="show" class="reagentChange">
  4. <el-row type="flex">
  5. <el-col class="button">
  6. <div class="title">平行实验/留样再测</div>
  7. <div
  8. v-if="
  9. nodeId === 'Activity_0xkc1ji' ||
  10. nodeId === 'Activity_1jrjycx' ||
  11. nodeId === 'Activity_1rssrnh' ||
  12. readonly
  13. "
  14. />
  15. <div v-else>
  16. <span style="color: red; margin-right: 20px; font-size: 16px"
  17. >注意:手动计算与导入不可混用</span
  18. >
  19. <el-button
  20. type="primary"
  21. size="mini"
  22. icon="ibps-icon-add"
  23. @click="handleAdd"
  24. >
  25. 添加</el-button
  26. >
  27. <el-button
  28. type="primary"
  29. size="mini"
  30. icon="ibps-icon-copy"
  31. @click="handleCopy"
  32. >
  33. 复制</el-button
  34. >
  35. <el-button
  36. type="danger"
  37. size="mini"
  38. icon="ibps-icon-remove"
  39. @click="handleDelete"
  40. >
  41. 删除</el-button
  42. >
  43. <el-button
  44. type="warning"
  45. size="mini"
  46. icon="ibps-icon-calculator"
  47. @click="computedResult"
  48. >计算</el-button
  49. >
  50. <el-button
  51. type="primary"
  52. size="mini"
  53. icon="ibps-icon-download"
  54. @click="handleDownload"
  55. >模版下载</el-button
  56. >
  57. <el-button
  58. type="primary"
  59. size="mini"
  60. icon="ibps-icon-import"
  61. @click="handleImport"
  62. >导入</el-button
  63. >
  64. </div>
  65. </el-col>
  66. </el-row>
  67. <el-row type="flex">
  68. <el-col>
  69. <el-table
  70. ref="reagent"
  71. :data="reagentDataFilter"
  72. :span-method="spanMethod"
  73. @selection-change="handleSelectionChange"
  74. >
  75. <el-table-column type="selection" width="55" />
  76. <el-table-column label="检验项目" prop="jianCeXiangMu" />
  77. <el-table-column label="浓度" prop="nongDu" width="100">
  78. <template slot-scope="{ row }">
  79. <el-input
  80. v-if="!disabled"
  81. v-model="row.nongDu"
  82. size="mini"
  83. placeholder="请输入"
  84. />
  85. <span v-else>{{ row.nongDu || '/' }}</span>
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="样品编号" prop="biaoBenHao" width="100">
  89. <template slot-scope="{ row }">
  90. <el-input
  91. v-if="!disabled"
  92. v-model="row.biaoBenHao"
  93. size="mini"
  94. placeholder="请输入"
  95. />
  96. <span v-else>{{ row.biaoBenHao || '/' }}</span>
  97. </template>
  98. </el-table-column>
  99. <el-table-column
  100. label="旧试剂测得结果"
  101. prop="jiuJieGuo"
  102. width="130"
  103. >
  104. <template slot-scope="{ row }">
  105. <el-input
  106. v-if="!disabled"
  107. v-model="row.jiuJieGuo"
  108. :min="0"
  109. size="mini"
  110. placeholder="请输入"
  111. :type="isCb ? 'text' : 'number'"
  112. />
  113. <span v-else>{{ row.jiuJieGuo || '/' }}</span>
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. label="新试剂测得结果"
  118. prop="xinJieGuo"
  119. width="130"
  120. >
  121. <template slot-scope="{ row }">
  122. <el-input
  123. v-if="!disabled"
  124. v-model="row.xinJieGuo"
  125. :min="0"
  126. size="mini"
  127. placeholder="请输入"
  128. :type="isCb ? 'text' : 'number'"
  129. />
  130. <span v-else>{{ row.xinJieGuo || '/' }}</span>
  131. </template>
  132. </el-table-column>
  133. <el-table-column label="计算方式" prop="jiSuanFangShi" width="140">
  134. <template slot-scope="{ row }">
  135. <el-select
  136. v-if="!disabled"
  137. v-model="row.jiSuanFangShi"
  138. size="mini"
  139. placeholder="请选择"
  140. >
  141. <el-option label="|Y-X|" value="|Y-X|" />
  142. <el-option label="|Y-X|/X(%)" value="|Y-X|/X(%)" />
  143. </el-select>
  144. <span v-else>{{ row.jiSuanFangShi || '/' }}</span>
  145. </template>
  146. </el-table-column>
  147. <el-table-column label="实际差值" prop="shiJiChaZhi" />
  148. <el-table-column label="实际偏倚" prop="jieGuo" />
  149. <el-table-column
  150. :label="isHz ? '允许差值' : '限定范围'"
  151. prop="zuiXiaoFanWei"
  152. width="110"
  153. >
  154. <template slot-scope="{ row }">
  155. <el-input
  156. v-if="!disabled"
  157. v-model="row.zuiXiaoFanWei"
  158. size="mini"
  159. placeholder="请输入"
  160. type="number"
  161. />
  162. <span v-else>{{ row.zuiXiaoFanWei || '/' }}</span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column label="允许偏倚" prop="yunXuPianYi" width="100">
  166. <template slot-scope="{ row }">
  167. <el-input
  168. v-if="!disabled"
  169. v-model="row.yunXuPianYi"
  170. size="mini"
  171. placeholder="请输入"
  172. />
  173. <span v-else>{{ row.yunXuPianYi || '/' }}</span>
  174. </template>
  175. </el-table-column>
  176. <el-table-column label="是否相符" prop="xiangFu" width="80" />
  177. <el-table-column label="符合率" prop="biaoZhun" />
  178. <el-table-column
  179. label="符合率可接受标准"
  180. prop="xiangMuFuHeLv"
  181. width="140"
  182. >
  183. <template slot-scope="{ row }">
  184. <el-select
  185. v-if="!disabled"
  186. v-model="row.xiangMuFuHeLv"
  187. size="mini"
  188. placeholder="请选择"
  189. @change="handelChange($event, row.jianCeXiangMu)"
  190. >
  191. <el-option label="≥80%" value="≥80%" />
  192. <el-option label="=100%" value="=100%" />
  193. </el-select>
  194. <span v-else>{{ row.xiangMuFuHeLv || '/' }}</span>
  195. </template>
  196. </el-table-column>
  197. <el-table-column label="结论" prop="jieLun" />
  198. </el-table>
  199. <el-pagination
  200. layout="total,sizes,prev, pager, next,jumper"
  201. :current-page="requestPage.pageNo"
  202. :page-size="requestPage.limit"
  203. :page-sizes="[10, 15, 20, 30, 50, 100]"
  204. :total="reagentData.length"
  205. @size-change="handleSizeChange"
  206. @current-change="handleCurrentChange"
  207. />
  208. </el-col>
  209. </el-row>
  210. </div>
  211. <import-table
  212. :visible="importTableDialogVisible"
  213. title="导入"
  214. @close="(visible) => (importTableDialogVisible = visible)"
  215. @action-event="handleImportTableActionEvent"
  216. />
  217. </div>
  218. </template>
  219. <script>
  220. import importTable from '@/business/platform/form/formrender/dynamic-form/components/import-table'
  221. import IbpsImport from '@/plugins/import'
  222. import { downloadFile } from '@/business/platform/file/utils'
  223. import { cloneDeep } from 'lodash'
  224. export default {
  225. components: {
  226. importTable
  227. },
  228. props: {
  229. formData: {
  230. type: Object,
  231. default: () => {}
  232. },
  233. readonly: {
  234. type: Boolean,
  235. default: false
  236. },
  237. params: {
  238. type: Object,
  239. default: () => {}
  240. }
  241. },
  242. data() {
  243. return {
  244. reagentData: [],
  245. copyDialogData: [],
  246. disabled: false,
  247. ypData: [],
  248. nodeId: '',
  249. show: true,
  250. requestPage: {
  251. limit: 20,
  252. pageNo: 1
  253. },
  254. importTableDialogVisible: false,
  255. multipleSelection: [],
  256. isHz: false,
  257. isCb: false
  258. }
  259. },
  260. computed: {
  261. reagentDataFilter() {
  262. return this.reagentData.slice(
  263. (this.requestPage.pageNo - 1) * this.requestPage.limit,
  264. (this.requestPage.pageNo - 1) * this.requestPage.limit +
  265. this.requestPage.limit
  266. )
  267. }
  268. },
  269. watch: {
  270. 'formData.sjghyzjlbbbzb': {
  271. handler(value, old) {
  272. if (value && value.length) {
  273. this.reagentData = value
  274. }
  275. },
  276. immediate: true
  277. },
  278. reagentData: {
  279. handler(value, old) {
  280. this.$emit('change-data', 'sjghyzjlbbbzb', value)
  281. },
  282. deep: true
  283. },
  284. 'formData.fangAn': {
  285. handler(val) {
  286. this.showAndHide(val)
  287. },
  288. immediate: true
  289. },
  290. 'formData.yunXuPianYi': {
  291. handler(val) {
  292. this.reagentData.forEach((item) => {
  293. const { jianYanXiangMu } = this.formData
  294. if (item.jianCeXiangMu === jianYanXiangMu) {
  295. item.yunXuPianYi = val
  296. }
  297. })
  298. },
  299. immediate: true
  300. },
  301. 'formData.xianDingFanWei': {
  302. handler(val) {
  303. this.reagentData.forEach((item) => {
  304. const { jianYanXiangMu } = this.formData
  305. if (item.jianCeXiangMu === jianYanXiangMu) {
  306. item.zuiXiaoFanWei = val
  307. }
  308. })
  309. }
  310. }
  311. },
  312. mounted() {
  313. const { first = '' } = this.$store.getters.level
  314. const { deptList = [] } = this.$store.getters || {}
  315. const t1 = deptList.find((i) => i.positionId === first) || {}
  316. this.isHz = t1.positionName === '惠州市第三人民医院'
  317. this.isCb = t1.positionName === '川北医学院附属医院'
  318. // console.log(t1.positionName)
  319. this.nodeId = this.params ? this.params.nodeId : ''
  320. this.disabled =
  321. this.readonly ||
  322. this.nodeId === 'Activity_0xkc1ji' ||
  323. this.nodeId === 'Activity_1jrjycx' ||
  324. this.nodeId === 'Activity_1rssrnh'
  325. this.showAndHide(this.formData.fangAn)
  326. },
  327. methods: {
  328. handelChange(event, jianCeXiangMu) {
  329. this.reagentData.forEach((item) => {
  330. if (item.jianCeXiangMu == jianCeXiangMu) {
  331. item.xiangMuFuHeLv = event
  332. }
  333. })
  334. },
  335. // 新增
  336. handleAdd() {
  337. if (
  338. !this.reagentData ||
  339. (this.reagentData && this.reagentData.length === 0)
  340. ) {
  341. this.disabled = false
  342. }
  343. const { jianYanXiangMu, yunXuPianYi, xianDingFanWei } = this.formData
  344. if (this.disabled && this.reagentData?.length > 0) {
  345. return this.$message.warning('导入与手动添加功能不可混用!')
  346. }
  347. if (!this.formData.jianYanXiangMu) {
  348. return this.$message.warning('请选择检验项目')
  349. }
  350. this.reagentData.push({
  351. jianCeXiangMu: jianYanXiangMu,
  352. nongDu: '',
  353. biaoBenHao: '',
  354. jiuJieGuo: '',
  355. xinJieGuo: '',
  356. jiSuanFangShi: '|Y-X|/X(%)',
  357. shiJiChaZhi: '',
  358. jieGuo: '',
  359. zuiXiaoFanWei: xianDingFanWei,
  360. yunXuPianYi: yunXuPianYi,
  361. xiangFu: '',
  362. biaoZhun: '',
  363. xiangMuFuHeLv: '≥80%',
  364. jieLun: ''
  365. })
  366. const grouped = this.reagentData.reduce((acc, item) => {
  367. const key = item.jianCeXiangMu
  368. if (!acc[key]) acc[key] = []
  369. acc[key].push(item)
  370. return acc
  371. }, {})
  372. // 先清空数组,再填充新数据(确保 Vue 检测到变化)
  373. this.reagentData.splice(
  374. 0,
  375. this.reagentData.length,
  376. ...Object.values(grouped).flat()
  377. )
  378. console.log(this.reagentData)
  379. },
  380. // 复制
  381. handleCopy() {
  382. if (this.multipleSelection.length > 0) {
  383. this.reagentData = this.reagentData.concat(
  384. cloneDeep(this.multipleSelection)
  385. )
  386. const grouped = this.reagentData.reduce((acc, item) => {
  387. const key = item.jianCeXiangMu
  388. if (!acc[key]) acc[key] = []
  389. acc[key].push(item)
  390. return acc
  391. }, {})
  392. // 先清空数组,再填充新数据(确保 Vue 检测到变化)
  393. this.reagentData.splice(
  394. 0,
  395. this.reagentData.length,
  396. ...Object.values(grouped).flat()
  397. )
  398. } else {
  399. this.$message.warning('请选择数据')
  400. }
  401. },
  402. // 删除
  403. handleDelete() {
  404. this.$confirm('确定删除当前选中数据?', '提示', {
  405. confirmButtonText: '确定',
  406. cancelButtonText: '取消',
  407. type: 'warning'
  408. }).then(() => {
  409. if (this.multipleSelection.length > 0) {
  410. this.reagentData = this.reagentData.filter(
  411. (row) => !this.multipleSelection.includes(row)
  412. )
  413. } else {
  414. this.$message.warning('请选择数据')
  415. }
  416. })
  417. },
  418. handleSelectionChange(val) {
  419. this.multipleSelection = val
  420. },
  421. handleImport() {
  422. this.importTableDialogVisible = true
  423. },
  424. handleDownload() {
  425. downloadFile({
  426. id: 'download_sjghdl',
  427. fileName: '试剂更换验证定量模板',
  428. ext: 'xlsx'
  429. })
  430. },
  431. getColumns() {
  432. return [
  433. {
  434. field_name: 'xiangFu',
  435. label: '是否相符',
  436. name: 'xiangFu'
  437. },
  438. {
  439. field_name: 'jianCeXiangMu',
  440. label: '检验项目',
  441. name: 'jianCeXiangMu'
  442. },
  443. {
  444. field_name: 'nongDu',
  445. label: '浓度',
  446. name: 'nongDu'
  447. },
  448. {
  449. field_name: 'biaoBenHao',
  450. label: '样品编号',
  451. name: 'biaoBenHao'
  452. },
  453. {
  454. field_name: 'jiuJieGuo',
  455. label: '旧试剂测得结果',
  456. name: 'jiuJieGuo'
  457. },
  458. {
  459. field_name: 'xinJieGuo',
  460. label: '新试剂测得结果',
  461. name: 'xinJieGuo'
  462. },
  463. {
  464. field_name: 'shiJiChaZhi',
  465. label: '实际差值',
  466. name: 'shiJiChaZhi'
  467. },
  468. {
  469. field_name: 'jieGuo',
  470. label: '实际偏倚',
  471. name: 'jieGuo'
  472. },
  473. {
  474. field_name: 'zuiXiaoFanWei',
  475. label: this.isHz ? '允许差值' : '限定范围',
  476. name: 'zuiXiaoFanWei'
  477. },
  478. {
  479. field_name: 'yunXuPianYi',
  480. label: '允许偏倚',
  481. name: 'yunXuPianYi'
  482. },
  483. {
  484. field_name: 'biaoZhun',
  485. label: '符合率',
  486. name: 'biaoZhun'
  487. },
  488. {
  489. field_name: 'jieLun',
  490. label: '结论',
  491. name: 'jieLun'
  492. },
  493. {
  494. field_name: 'xiangMuFuHeLv',
  495. label: '符合率可接受标准',
  496. name: 'xiangMuFuHeLv'
  497. }
  498. ]
  499. },
  500. getKeys(data) {
  501. return Array.isArray(data)
  502. ? data.reduce((acc, item) => ({ ...acc, [item.label]: item.name }), {})
  503. : {}
  504. },
  505. handleImportTableActionEvent(file, options) {
  506. IbpsImport.xlsx(file, options).then(({ header, results }) => {
  507. const list = []
  508. const keys = this.getKeys(this.getColumns())
  509. results.forEach((item) => {
  510. const obj = {}
  511. Object.keys(item).forEach((key) => {
  512. if (keys[key]) {
  513. obj[keys[key]] = item[key]
  514. }
  515. })
  516. list.push(obj)
  517. })
  518. const filteredArray = list
  519. .map((item) => {
  520. if (item.jianCeXiangMu && item.biaoZhun && item.jieLun) {
  521. return item
  522. }
  523. return null
  524. })
  525. .filter((item) => item !== null)
  526. filteredArray.forEach((item) => {
  527. list.forEach((el) => {
  528. if (el.jianCeXiangMu === item.jianCeXiangMu) {
  529. el.biaoZhun = item.biaoZhun
  530. el.jieLun = item.jieLun
  531. el.xiangMuFuHeLv = item.xiangMuFuHeLv
  532. }
  533. if (el.shiJiChaZhi) {
  534. el.shiJiChaZhi = (el.shiJiChaZhi + '').replace('-', '')
  535. }
  536. if (el.jieGuo) {
  537. el.jieGuo = (el.jieGuo + '').replace('-', '')
  538. }
  539. })
  540. })
  541. this.reagentData = list
  542. this.disabled = true
  543. this.importTableDialogVisible = false
  544. })
  545. },
  546. // 当前页码改变
  547. handleCurrentChange(val) {
  548. this.requestPage.pageNo = val
  549. },
  550. // 页码选择器改变
  551. handleSizeChange(val) {
  552. this.requestPage.limit = val
  553. this.requestPage.pageNo = 1
  554. },
  555. showAndHide(data) {
  556. if (
  557. data.includes('平行试验') ||
  558. data.includes('留样再测') ||
  559. data.includes('比对方案')
  560. ) {
  561. this.show = true
  562. } else {
  563. this.show = false
  564. }
  565. },
  566. // 计算结果
  567. computedResult() {
  568. if (this.disabled) {
  569. this.$message.warning('导入数据请勿使用计算功能!')
  570. return
  571. }
  572. const hasInvalidData = this.reagentData.some(
  573. (item) =>
  574. !item.jiuJieGuo ||
  575. item.jiuJieGuo <= 0 ||
  576. !item.xinJieGuo ||
  577. item.xinJieGuo <= 0
  578. )
  579. if (hasInvalidData || this.reagentData.length === 0) {
  580. this.$message.warning('新、旧试剂测得结果必须大于0且不能为空!')
  581. return
  582. }
  583. const hasPyOrCz = this.reagentData.some(
  584. (item) =>
  585. (item.jiSuanFangShi === '|Y-X|/X(%)' && !item.yunXuPianYi) ||
  586. (item.jiSuanFangShi === '|Y-X|' && !item.zuiXiaoFanWei)
  587. )
  588. if (hasPyOrCz) {
  589. this.$message.warning(
  590. `计算方式为|Y-X|/X(%)请填写允许偏倚,计算方式为|Y-X|请填写${
  591. this.isHz ? '允许差值' : '限定范围'
  592. }`
  593. )
  594. return
  595. }
  596. // 预处理函数:统一处理百分比数值
  597. const normalizePercent = (val) =>
  598. Number(String(val).replace('%', '')) || 0
  599. // 使用 Map 存储统计信息
  600. const projectStats = new Map()
  601. this.reagentData.forEach((item) => {
  602. const {
  603. jiSuanFangShi,
  604. xinJieGuo,
  605. jiuJieGuo,
  606. zuiXiaoFanWei,
  607. jianCeXiangMu
  608. } = item
  609. // 计算差值/偏倚
  610. if (jiSuanFangShi === '|Y-X|') {
  611. item.shiJiChaZhi = Math.abs(
  612. (xinJieGuo * 100000 - jiuJieGuo * 100000) / 100000
  613. ).toFixed(2)
  614. item.xiangFu =
  615. normalizePercent(item.shiJiChaZhi) <=
  616. normalizePercent(zuiXiaoFanWei)
  617. ? '相符'
  618. : '不相符'
  619. item.jieGuo = ''
  620. } else {
  621. item.jieGuo = this.deleteAccuracy(
  622. Math.abs(xinJieGuo - jiuJieGuo) / jiuJieGuo
  623. )
  624. item.xiangFu =
  625. normalizePercent(item.jieGuo) <= normalizePercent(item.yunXuPianYi)
  626. ? '相符'
  627. : '不相符'
  628. item.shiJiChaZhi = ''
  629. }
  630. // 统计符合率
  631. const stats = projectStats.get(jianCeXiangMu) || { total: 0, yes: 0 }
  632. stats.total++
  633. if (item.xiangFu === '相符') stats.yes++
  634. projectStats.set(jianCeXiangMu, stats)
  635. })
  636. // 填充符合率标准,保留小数点后两位
  637. this.reagentData.forEach((item) => {
  638. const stats = projectStats.get(item.jianCeXiangMu)
  639. item.biaoZhun = this.deleteAccuracy(stats.yes / stats.total)
  640. console.log(parseFloat(item.biaoZhun), item.xiangMuFuHeLv)
  641. item.jieLun =
  642. parseFloat(item.biaoZhun) >=
  643. parseFloat(item.xiangMuFuHeLv.replace(/[≥=%]/g, ''))
  644. ? '可接受'
  645. : '不可接受'
  646. })
  647. },
  648. spanMethod({ row, column, rowIndex, columnIndex }) {
  649. if (
  650. columnIndex === 1 ||
  651. columnIndex === 12 ||
  652. columnIndex === 13 ||
  653. columnIndex === 14
  654. ) {
  655. const currentValue = row[column.property]
  656. const preRow = this.reagentData[rowIndex - 1]
  657. // 上一行这一列的数据
  658. const preValue = preRow ? preRow[column.property] : null
  659. // 如果当前值和上一行的值相同,则将当前单元格隐藏
  660. // 给第0,10,11,12列对数值相同且是同一个'jianCeXiangMu'进行表格合并
  661. if (
  662. currentValue === preValue &&
  663. row['jianCeXiangMu'] === preRow['jianCeXiangMu']
  664. ) {
  665. return { rowspan: 0, colspan: 0 }
  666. } else {
  667. let rowspan = 1
  668. // 计算应该合并的行数
  669. for (let i = rowIndex + 1; i < this.reagentData.length; i++) {
  670. const nextRow = this.reagentData[i]
  671. const nextValue = nextRow[column.property]
  672. if (
  673. nextValue === currentValue &&
  674. nextRow['jianCeXiangMu'] === row['jianCeXiangMu']
  675. ) {
  676. rowspan++
  677. } else {
  678. break
  679. }
  680. }
  681. return { rowspan, colspan: 1 }
  682. }
  683. // if (rowIndex % rowspan === 0) {
  684. // return {
  685. // rowspan,
  686. // colspan: 1
  687. // }
  688. // } else {
  689. // return {
  690. // rowspan: 0,
  691. // colspan: 0
  692. // }
  693. // }
  694. }
  695. },
  696. // 去除小数*100精度方法
  697. deleteAccuracy(num) {
  698. // 是否带小数点
  699. if (num.toString().includes('.')) {
  700. // 保留小数点后面3位
  701. const numArry = num.toFixed(3).toString().split('.')
  702. // 整数位是否大于0
  703. if (numArry[0] > 0) {
  704. return (
  705. Number(
  706. numArry[0] +
  707. numArry[1].substring(0, 2) +
  708. '.' +
  709. numArry[1].substring(2, 3)
  710. ) + '%'
  711. )
  712. } else {
  713. // 小数位第一位是否大于0
  714. if (numArry[1][0] > 0) {
  715. return (
  716. Number(
  717. numArry[1].substring(0, 2) + '.' + numArry[1].substring(2, 3)
  718. ) + '%'
  719. )
  720. } else {
  721. // 小数位第二位是否大于0
  722. if (numArry[1][1] > 0) {
  723. return (
  724. Number(
  725. numArry[1].substring(1, 2) + '.' + numArry[1].substring(2, 3)
  726. ) + '%'
  727. )
  728. } else {
  729. return Number(0 + '.' + numArry[1].substring(2, 3)) + '%'
  730. }
  731. }
  732. }
  733. } else {
  734. return num * 100 + '%'
  735. }
  736. }
  737. }
  738. }
  739. </script>
  740. <style lang="scss" scoped>
  741. .reagentChange {
  742. margin-bottom: 20px;
  743. .button {
  744. display: flex;
  745. justify-content: space-between;
  746. padding: 0px 0px 0px 15px;
  747. background: #f0ffff;
  748. .title {
  749. color: #999;
  750. font-size: 12px;
  751. font-weight: bold;
  752. margin-bottom: 0;
  753. }
  754. .el-button {
  755. margin: 0;
  756. }
  757. }
  758. }
  759. </style>