reagentBatchNumber.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <div>
  3. <div class="reagentBatchNumber">
  4. <el-row type="flex">
  5. <el-col class="button">
  6. <div class="title">结果及判断</div>
  7. <div v-if="readonly" />
  8. <div v-else>
  9. <el-button type="primary" size="mini" icon="ibps-icon-add" @click="handleAdd"> 添加</el-button>
  10. <el-button type="danger" size="mini" icon="ibps-icon-remove" @click="handleDelete"> 删除</el-button>
  11. <el-button v-if="!isEdit" type="info" size="mini" icon="ibps-icon-calculator" @click="computedResult">计算结果</el-button>
  12. <el-button v-else type="info" size="mini" icon="ibps-icon-calculator" @click="handleEdit">编辑</el-button>
  13. <el-button type="success" size="mini" icon="ibps-icon-sign-in" @click="handleImport"> 导入数据</el-button>
  14. <el-button type="warning" size="mini" icon="ibps-icon-sign-out" @click="handleDownload"> 导出模版</el-button>
  15. </div>
  16. </el-col>
  17. </el-row>
  18. <el-row type="flex">
  19. <el-col>
  20. <el-table ref="external" :data="reagentBatchDataFilter" @selection-change="handleSelectionChange">
  21. <el-table-column type="selection" width="55" />
  22. <el-table-column align="center" label="标本号" prop="biaoBenHao">
  23. <template slot-scope="{row}">
  24. <el-input v-if="!isEdit" v-model="row.biaoBenHao" size="mini" maxlength="32" placeholder="请输入" />
  25. <span v-else>{{ row.biaoBenHao }}</span>
  26. </template>
  27. </el-table-column>
  28. <el-table-column align="center" label="新批号">
  29. <el-table-column align="center" label="结果" prop="xinJieGuo">
  30. <template slot-scope="{row}">
  31. <el-input v-if="!isEdit" v-model="row.xinJieGuo" size="mini" maxlength="32" placeholder="请输入" />
  32. <span v-else>{{ row.xinJieGuo }}</span>
  33. </template>
  34. </el-table-column>
  35. <el-table-column align="center" label="对数值" prop="xinDuiShuZhi">
  36. <template slot-scope="{row}">
  37. <span>{{ row.xinDuiShuZhi }}</span>
  38. </template>
  39. </el-table-column>
  40. </el-table-column>
  41. <el-table-column align="center" label="旧批号">
  42. <el-table-column align="center" label="结果" prop="jiuJieGuo">
  43. <template slot-scope="{row}">
  44. <el-input v-if="!isEdit" v-model="row.jiuJieGuo" size="mini" maxlength="32" placeholder="请输入" />
  45. <span v-else>{{ row.jiuJieGuo }}</span>
  46. </template>
  47. </el-table-column>
  48. <el-table-column align="center" label="对数值" prop="jiuDuiShuZhi">
  49. <template slot-scope="{row}">
  50. <span>{{ row.jiuDuiShuZhi }}</span>
  51. </template>
  52. </el-table-column>
  53. </el-table-column>
  54. <el-table-column align="center" label="对数值偏差(≤±0.4log)" prop="pianCha">
  55. <template slot-scope="{row}">
  56. <span>{{ row.pianCha }}</span>
  57. </template>
  58. </el-table-column>
  59. <el-table-column align="center" label="是否符合" prop="fuHe">
  60. <template slot-scope="{row}">
  61. <el-radio-group v-model="row.fuHe" disabled>
  62. <el-radio label="是">是</el-radio>
  63. <el-radio label="否">否</el-radio>
  64. </el-radio-group>
  65. </template>
  66. </el-table-column>
  67. </el-table>
  68. <el-pagination
  69. layout="total,sizes,prev, pager, next,jumper"
  70. :current-page="requestPage.pageNo"
  71. :page-size="requestPage.limit"
  72. :page-sizes="[10,15,20,30,50,100]"
  73. :total="reagentBatchData.length"
  74. @size-change="handleSizeChange"
  75. @current-change="handleCurrentChange"
  76. />
  77. </el-col>
  78. </el-row>
  79. </div>
  80. <import-table
  81. :visible="importTableDialogVisible"
  82. title="导入"
  83. @close="(visible) => (importTableDialogVisible = visible)"
  84. @action-event="handleImportTableActionEvent"
  85. />
  86. </div>
  87. </template>
  88. <script>
  89. import { cloneDeep } from 'lodash'
  90. import importTable from '@/business/platform/form/formrender/dynamic-form/components/import-table'
  91. import IbpsImport from '@/plugins/import'
  92. import IbpsExport from '@/plugins/export'
  93. import ActionUtils from '@/utils/action'
  94. import { downloadFile } from '@/business/platform/file/utils'
  95. export default {
  96. components: {
  97. importTable
  98. },
  99. props: {
  100. formData: {
  101. type: Object,
  102. default: () => {}
  103. },
  104. readonly: {
  105. type: Boolean,
  106. default: false
  107. },
  108. params: {
  109. type: Object,
  110. default: () => {}
  111. }
  112. },
  113. data () {
  114. return {
  115. reagentBatchData: [],
  116. disabled: false,
  117. requestPage: {
  118. limit: 10,
  119. pageNo: 1
  120. },
  121. dialogVisible: false,
  122. importTableDialogVisible: false,
  123. multipleSelection: [],
  124. isEdit: false
  125. }
  126. },
  127. computed: {
  128. reagentBatchDataFilter () {
  129. return this.reagentBatchData.slice((this.requestPage.pageNo - 1) * (this.requestPage.limit), (this.requestPage.pageNo - 1) * (this.requestPage.limit) + this.requestPage.limit)
  130. }
  131. },
  132. watch: {
  133. 'formData.sjphghyzjlzb': {
  134. handler (value, old) {
  135. if (value && value.length) {
  136. this.reagentBatchData = JSON.parse(JSON.stringify(value))
  137. }
  138. },
  139. immediate: true
  140. }
  141. },
  142. mounted () {
  143. this.isEdit = this.readonly || this.params.nodeId === 'Activity_13cwg5h'
  144. },
  145. methods: {
  146. handleSelectionChange (val) {
  147. this.multipleSelection = val
  148. },
  149. handleEdit () {
  150. this.isEdit = false
  151. },
  152. handleAdd () {
  153. this.reagentBatchData.push({
  154. biaoBenHao: '',
  155. xinJieGuo: '',
  156. xinDuiShuZhi: '',
  157. jiuJieGuo: '',
  158. jiuDuiShuZhi: '',
  159. pianCha: '',
  160. fuHe: ''
  161. })
  162. this.isEdit = false
  163. },
  164. computedResult () {
  165. if (this.reagentBatchData.length <= 0) {
  166. return this.$message.warning('请检查表单数据是否填写正确')
  167. }
  168. let flag = true
  169. this.reagentBatchData.forEach(item => {
  170. if (item.biaoBenHao && item.xinJieGuo && item.jiuJieGuo && !isNaN(Number(item.xinJieGuo)) && !isNaN(Number(item.jiuJieGuo)) && Number(item.xinJieGuo) >= 0 && Number(item.jiuJieGuo) >= 0) {
  171. item.xinDuiShuZhi = Number(item.xinJieGuo) === 0 ? '0' : Math.log10(Number(item.xinJieGuo)).toFixed(2) + ''
  172. item.jiuDuiShuZhi = Number(item.jiuJieGuo) === 0 ? '0' : Math.log10(Number(item.jiuJieGuo)).toFixed(2) + ''
  173. item.pianCha = (Number(item.xinDuiShuZhi) - Number(item.jiuDuiShuZhi)).toFixed(2) + ''
  174. item.fuHe = Math.abs(item.pianCha) <= 0.4 ? '是' : '否'
  175. } else {
  176. flag = false
  177. }
  178. })
  179. if (!flag) {
  180. return this.$message.warning('请检查表单标本号、结果都全部规范填写')
  181. } else {
  182. this.isEdit = true
  183. this.$emit('change-data', 'sjphghyzjlzb', this.reagentBatchData)
  184. }
  185. },
  186. handleDelete () {
  187. this.$confirm('确定删除当前选中数据?', '提示', {
  188. confirmButtonText: '确定',
  189. cancelButtonText: '取消',
  190. type: 'warning'
  191. }).then(() => {
  192. if (this.multipleSelection.length > 0) {
  193. this.reagentBatchData = this.reagentBatchData.filter(row => !this.multipleSelection.includes(row))
  194. this.isEdit && this.$emit('change-data', 'sjphghyzjlzb', this.reagentBatchData)
  195. } else {
  196. this.$message.warning('请选择数据')
  197. }
  198. })
  199. },
  200. handleImport () {
  201. if (!this.isEdit && this.reagentBatchData.length > 0) {
  202. return this.$message.warning('请点击结果按钮再导入数据')
  203. }
  204. this.importTableDialogVisible = true
  205. },
  206. handleDownload () {
  207. IbpsExport.excel({
  208. columns: this.getDataValue(),
  209. data: [],
  210. nameKey: 'name',
  211. title: '试剂批号更换验证记录(定量)'
  212. }).then(() => {
  213. ActionUtils.success('导出成功')
  214. })
  215. // downloadFile({ id: 'xxx', fileName: '室间质评活动计划一览表', ext: 'xlsx' })
  216. },
  217. getDataValue () {
  218. const columns = [
  219. {
  220. field_name: 'biaoBenHao',
  221. label: '标本号',
  222. name: 'biaoBenHao'
  223. },
  224. {
  225. field_name: 'xinJieGuo',
  226. label: '新批号结果',
  227. name: 'xinJieGuo'
  228. },
  229. {
  230. field_name: 'xinDuiShuZhi',
  231. label: '新批号对数值',
  232. name: 'xinDuiShuZhi'
  233. },
  234. {
  235. field_name: 'jiuJieGuo',
  236. label: '旧批号结果',
  237. name: 'jiuJieGuo'
  238. },
  239. {
  240. field_name: 'jiuDuiShuZhi',
  241. label: '旧批号对数值',
  242. name: 'jiuDuiShuZhi'
  243. },
  244. {
  245. field_name: 'pianCha',
  246. label: '对数值偏差(≤±0.4log)',
  247. name: 'pianCha'
  248. },
  249. {
  250. field_name: 'fuHe',
  251. label: '是否符合',
  252. name: 'fuHe'
  253. }
  254. ]
  255. return columns
  256. },
  257. getKeys (data) {
  258. return Array.isArray(data) ? data.reduce((acc, item) => ({ ...acc, [item.label]: item.name }), {}) : {}
  259. },
  260. transExcel (results) {
  261. return results.map((item, index) => {
  262. var obj = {}
  263. for (var i = index; i < results.length; i++) {
  264. obj = {
  265. // 键名为绑定 el 表格的关键字,值则是 ws[i][对应表头名]
  266. biaoBenHao: results[index]['标本号'],
  267. jiuJieGuo: results[index]['旧批号'],
  268. xinJieGuo: results[index]['新批号'],
  269. fuHe: results[index]['是否符合'],
  270. pianCha: results[index]['对数值偏差(≤±0.4log)'],
  271. xinDuiShuZhi: results[index]['__EMPTY'],
  272. jiuDuiShuZhi: results[index]['__EMPTY_1']
  273. }
  274. return obj
  275. }
  276. })
  277. },
  278. async handleImportTableActionEvent (file, options) {
  279. IbpsImport.xlsx(file, options).then(({ header, results }) => {
  280. // console.log('从当前excel文件中读出的内容是', results)
  281. // const arr = this.transExcel(results)
  282. // console.log('转换之后的格式是', arr)
  283. // console.log(header, '---', results)
  284. const list = []
  285. const keys = this.getKeys(this.getDataValue())
  286. results.forEach(item => {
  287. const obj = {}
  288. Object.keys(item).forEach(key => {
  289. if (keys[key]) {
  290. obj[keys[key]] = item[key]
  291. }
  292. })
  293. list.push(obj)
  294. })
  295. setTimeout(() => {
  296. this.$nextTick(() => {
  297. this.isEdit = true
  298. this.reagentBatchData = this.reagentBatchData.concat(list)
  299. this.$refs.external && this.$refs.external.$forceUpdate()
  300. this.$emit('change-data', 'sjphghyzjlzb', this.reagentBatchData)
  301. })
  302. })
  303. this.importTableDialogVisible = false
  304. })
  305. },
  306. // 当前页码改变
  307. handleCurrentChange (val) {
  308. this.requestPage.pageNo = val
  309. },
  310. // 页码选择器改变
  311. handleSizeChange (val) {
  312. this.requestPage.limit = val
  313. this.requestPage.pageNo = 1
  314. }
  315. }
  316. }
  317. </script>
  318. <style lang="scss" scoped>
  319. .reagentBatchNumber{
  320. margin-bottom: 20px;
  321. .button{
  322. display: flex;
  323. justify-content: space-between;
  324. padding: 0px 0px 0px 15px;
  325. background: #f0ffff;
  326. .title {
  327. color: #999;
  328. font-size: 12px;
  329. font-weight: bold;
  330. margin-bottom: 0;
  331. }
  332. .el-button {
  333. margin: 0;
  334. }
  335. }
  336. }
  337. ::v-deep .el-table--border td, .el-table--border th, .el-table__body-wrapper .el-table--border .is-scrolling-left .el-table__fixed {
  338. border-right: 1px solid rgba(255, 0, 0, 0)!important;
  339. }
  340. </style>