You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

791 lines
25 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="main-content-container">
<div class="header">
<div class="title">{{ $store.state.app.title }}入库</div>
<div class="header-select">
<!-- <el-button>返回上一级</el-button>-->
<el-select v-model="client_id" clearable placeholder="请选择柜体" @change="getTmpList">
<el-option
v-for="item in $store.getters.currentOptions"
:key="item.id"
:label="item.client_name"
:value="item.client_id"
/>
</el-select>
<el-button type="primary" @click="handleReagentToDatabase">选择{{ $store.state.app.title }}入库</el-button>
<el-button type="primary" @click="handleBindToDB">绑定入库</el-button>
<el-button type="primary" plain @click="handleAddTmp('add')">+ 新增{{ $store.state.app.title }}模板</el-button>
<el-button @click="handleAddTmp('modify')"><i class="el-icon-edit" />编辑{{ $store.state.app.title }}模板</el-button>
<el-button @click="handlePrintCode"><i class="el-icon-printer" /> 打印条码</el-button>
<el-button @click="handleImport"><i class="el-icon-folder-add" /> 导入入库模板</el-button>
<div class="right">
<el-button icon="el-icon-delete" circle @click="handleDelTem" />
<el-button icon="el-icon-refresh" circle @click="handleRefresh" />
</div>
</div>
</div>
<div class="content">
<el-table
ref="multipleTable"
v-loading="loading"
element-loading-text="拼命加载中"
:header-cell-style="headerStyle"
:data="tableData"
style="width: 100%"
size="medium"
stripe
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
align="center"
/>
<el-table-column
align="center"
type="index"
width="50"
label="序号"
/>
<el-table-column
prop="template_name"
label="模板名称"
sortable
align="center"
/>
<el-table-column
prop="client_name"
label="所处位置"
sortable
align="center"
/>
<el-table-column
align="center"
prop="all_export_count"
label="入库数量"
/>
<el-table-column
align="center"
prop="create_date"
label="创建时间"
/>
<el-table-column
align="center"
prop="create_user_name"
label="创建人"
/>
<el-table-column
:show-overflow-tooltip="true"
align="center"
width="180"
prop="template_content"
label="详情信息"
/>
</el-table>
</div>
<div class="page my-pagination">
<el-pagination
background
layout="prev, pager, next"
:current-page.sync="page"
:total="total"
:page-size.sync="page_size"
@current-change="tmpPageChange"
/>
</div>
<!-- 选择试剂入库 弹框 -->
<el-dialog :title="`选择${$store.state.app.title}入库`" width="70%" :close-on-click-modal="false" :visible.sync="dialogTableVisible" @close="handleSelectClose">
<div class="search-header">
<el-input v-model="selectReagentValue" clearable placeholder="请输入搜索名称" />
<el-button type="primary" icon="el-icon-search" @click="searchReagent">搜索</el-button>
</div>
<el-table
v-loading="loadingReagent"
element-loading-text="拼命加载中"
:header-cell-style="headerStyle"
:data="reagentData"
stripe
height="400"
>
<el-table-column align="center" type="index" width="50" label="序号" />
<el-table-column align="center" property="name" label="试剂名称" />
<el-table-column align="center" property="bar_code" label="试剂编码" />
<el-table-column align="center" property="manufacturer" label="生产厂家" />
<el-table-column align="center" property="purity" label="纯度" />
<el-table-column align="center" property="cas_number" label="CAS码" />
<el-table-column align="center" property="production_date" label="生产日期" />
<el-table-column align="center" property="shelf_life" label="保质期(天)" />
<el-table-column
align="center"
label="操作"
>
<template slot-scope="scope">
<el-button type="primary" @click="handleReagentClick(scope.row)">操作</el-button>
</template>
</el-table-column>
</el-table>
<div class="my-pagination" style="text-align: right">
<el-pagination
background
layout="total, prev, pager, next"
:current-page.sync="reagent_page"
:total="reagent_total"
:page-size.sync="reagent_page_size"
@current-change="reagentPageChange"
/>
</div>
<el-dialog
width="53%"
:title="`编辑${$store.state.app.title}信息`"
:close-on-click-modal="false"
:visible.sync="formVisible"
append-to-body
@close="formClose"
>
<ReagentForm :propsformdata="propsformdata" @handlefunc="handleReagentForm" />
</el-dialog>
</el-dialog>
<!-- 新增试剂模板弹框 -->
<el-dialog
:title="opTitle"
width="70%"
:close-on-click-modal="false"
:visible.sync="reagentAddVisible"
@close="handleAddClose"
>
<div class="header-select">
<el-input v-model="reagentAddTmpName" placeholder="请输入名称" />
<el-select v-model="reagentAddClient" placeholder="请选择柜体">
<el-option
v-for="item in $store.getters.currentOptions"
:key="item.id"
:label="item.client_name"
:value="item.client_id"
/>
</el-select>
<el-button v-if="opType === 'add'" type="primary" plain @click="handleADDOpen('add')">+ 新增{{ $store.state.app.title }}条目</el-button>
<el-button @click="handleADDOpen('modify')"><i class="el-icon-edit" />编辑{{ $store.state.app.title }}条目</el-button>
<el-button v-if="opType === 'add'" @click="handleADDDEL"><i class="el-icon-delete" /> 删除{{ $store.state.app.title }}条目</el-button>
</div>
<div class="content">
<el-table
ref="multipleTable"
:header-cell-style="headerStyle"
:data="reagentAddTmpData"
style="width: 100%"
size="medium"
height="400"
@selection-change="handleAddSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column align="center" property="name" label="试剂名称" />
<el-table-column align="center" property="english_name" label="英文名称" />
<el-table-column align="center" property="purity" label="纯度" />
<el-table-column align="center" property="cas_number" label="CAS码" />
<el-table-column align="center" property="manufacturer" label="生产厂家" />
<el-table-column align="center" property="speci" label="规格" />
<el-table-column align="center" property="net_weight_unit" label="单位" />
<el-table-column align="center" property="total" label="预估质量" />
<el-table-column align="center" property="production_date" label="生产日期" />
<el-table-column align="center" property="shelf_life" label="保质期(天)" />
</el-table>
<div class="reagent-add">
<el-button @click="() => {reagentAddVisible= false;handleAddClose()}">取消</el-button>
<el-button type="primary" @click="handleAddSave">保存</el-button>
</div>
</div>
<el-dialog
width="53%"
:close-on-click-modal="false"
:title="reagentAddFormTitle"
:visible.sync="reagentAddFormVisible"
append-to-body
@close="reagentAddFormClose"
>
<ReagentForm :propsformdata="reagentAddFormdata" @handlefunc="handleReagentAddForm" />
</el-dialog>
</el-dialog>
<!-- 绑定入库 -->
<el-dialog
title="绑定入库"
width="70%"
:close-on-click-modal="false"
:visible.sync="bindToDBVisible"
@close="handleCloseToDB"
>
<div class="to-database">
<div class="bind-to-db-title">请扫描{{ $store.state.app.title }}条码</div>
<div>
<el-select v-model="client_id_input" placeholder="请选择柜体">
<el-option
v-for="item in $store.getters.currentOptions"
:key="item.id"
:label="item.client_name"
:value="item.client_id"
/>
</el-select>
</div>
</div>
<el-table
ref="singleTable"
:header-cell-style="headerStyle"
:data="bindToDBData"
height="400"
highlight-current-row
@current-change="handleCurrentSelectChange"
>
<el-table-column align="center" property="name" label="试剂名称" />
<el-table-column align="center" property="bar_code" label="试剂编码" />
<el-table-column align="center" property="manufacturer" label="生产厂家" />
<el-table-column align="center" property="purity" label="纯度" />
<el-table-column align="center" property="cas_number" label="CAS码" />
<el-table-column align="center" property="production_date" label="生产日期" />
<el-table-column align="center" property="shelf_life" label="保质期(天)" />
<el-table-column align="center" property="status" label="状态">
<template slot-scope="scope">
<el-tag
:type="scope.row.status ? 'success' : 'danger' "
disable-transitions
>{{ scope.row.status ? "已入库" : "未入库" }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-dialog>
<!-- 导入入库模板 -->
<el-dialog title="选择导入入库模板文件" :visible.sync="dialogImportVisible">
<el-radio-group v-model="importFile">
<el-radio v-for="item in fileList" :key="item" :label="item">{{ item }}</el-radio>
</el-radio-group>
<div slot="footer" style="text-align: center">
<el-button @click="dialogImportVisible = false">取 消</el-button>
<el-button type="primary" @click="handleSubFile">导入</el-button>
</div>
</el-dialog>
<!-- 打印条码 -->
<el-dialog
title="打印条码"
:visible.sync="dialogVisible"
width="35%"
:close-on-click-modal="false"
@close="handlePringClose"
>
<el-row :gutter="15">
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="50px">
<el-col :span="12">
<el-form-item label="起始" prop="start_code">
<el-input
v-model.number="formData.start_code"
placeholder="请输入起始条码"
clearable
:style="{width: '100%'}"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束" prop="end_code">
<el-input v-model.number="formData.end_code" placeholder="请输入结束条码" clearable :style="{width: '100%'}" />
</el-form-item>
</el-col>
</el-form>
</el-row>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="doPrintCode"></el-button>
</div>
</el-dialog>
<Scanner @getcode="getCode" />
</div>
</template>
<script>
import ReagentForm from '@/components/ReagentForm/index'
import Scanner from '@/components/Scannner/index'
import {
show_tmp,
select_drug,
bind_tmp_enter_warehouse,
add_tmp,
del_tmp,
u_file_list,
put_in_tmp, pring_bar_code
} from '@/api/reagent/warehousing'
import stringify from '@/utils/stringify'
import { throttle } from '@/utils'
export default {
name: 'Warehousing',
components: { ReagentForm, Scanner },
data() {
return {
// 打印模板
dialogVisible: false,
formData: {
start_code: undefined,
end_code: undefined
},
rules: {
start_code: [{
required: true,
message: '请输入起始条码',
trigger: 'blur'
}, { type: 'number', message: '条码必须为数字值' }],
end_code: [{
required: true,
message: '请输入结束条码',
trigger: 'blur'
}, { type: 'number', message: '条码必须为数字值' }]
},
dialogTableVisible: false,
headerStyle: { 'background': '#E6E6E6' },
tableData: [],
client_id: '',
selectReagentValue: '',
multipleSelection: [],
loading: true,
// 模板翻页信息
page: 1,
page_size: 15,
total: 0,
// 试剂翻页信息
loadingReagent: true,
reagentData: [],
reagent_page: 1,
reagent_page_size: 15,
reagent_total: 0,
// dialog form相关
formVisible: false,
propsformdata: {},
// 新增 编辑 试剂模板
opType: null,
opTitle: '',
reagentAddVisible: false,
reagentAddTmpName: '',
reagentAddClient: null,
reagentAddTmpData: [],
reagentAddSelection: [],
reagentAddFormdata: {},
reagentAddModifyIndex: null, // 确定第几个修改了
reagentAddFormVisible: false,
reagentAddFormTitle: '',
// 绑定入库
bindToDBVisible: false,
bindToDBData: [],
barCode: '',
currentRow: null,
client_id_input: '',
// 导入入库模板
fileList: [],
dialogImportVisible: false,
importFile: undefined
}
},
created() {
if (this.$store.getters.currentOptions.length > 0) {
this.client_id = this.$store.getters.currentOptions[0].client_id
}
this.getTmpList()
},
methods: {
// 执行打印条码
doPrintCode() {
this.$refs['elForm'].validate(valid => {
if (!valid) return
pring_bar_code(stringify(this.formData)).then(res => {
this.$message.success(res.msg)
})
})
},
// 处理打印条码按钮事件
handlePrintCode() {
this.dialogVisible = true
},
handlePringClose() {
this.formData = {
start_code: undefined,
end_code: undefined
}
this.$refs['elForm'].resetFields()
},
handleCloseToDB() {
this.client_id_input = ''
},
formClose() {
this.propsformdata = {}
},
handleCurrentSelectChange(row) {
this.currentRow = row
},
// getCode
getCode(code) {
this.barCode = code
if (this.barCode) {
if (!this.client_id_input) {
this.$message.warning('请选择存储柜体!')
return
}
const data = JSON.parse(JSON.stringify(this.currentRow))
const id = data.index
delete data.status
delete data.index
bind_tmp_enter_warehouse(stringify({
'tmplate_content': JSON.stringify(data),
'bar_code': this.barCode,
'client_id': this.client_id_input
})).then(res => {
if (res.status === 0) {
this.$set(this.bindToDBData, id, { ...this.bindToDBData[id], status: true })
this.$message.success('入库成功!')
// 判断是否是最后一行,不是最后一行自动选择下一行
if (id < this.bindToDBData.length - 1) {
// 将下一行自动选中
this.$refs.singleTable.setCurrentRow(this.bindToDBData[id + 1])
}
} else {
this.$message.error('入库失败,请重试!')
}
})
}
},
// 选择模板
handleSelectionChange(val) {
this.multipleSelection = val
},
// 导入入库模板请求文件列表
handleImport() {
u_file_list().then(
res => {
this.fileList = res.data
if (this.fileList.length > 0) {
this.dialogImportVisible = true
} else {
this.$message.warning('没找到可以导入的模板!')
}
}
)
},
// 提交导入文件
handleSubFile() {
if (this.importFile) {
const data = {
client_id: this.client_id,
template_name: this.importFile
}
put_in_tmp(stringify(data)).then(res => {
this.$message.success(res.msg)
this.dialogImportVisible = false
})
}
},
// 处理删除模板
handleDelTem() {
if (this.multipleSelection.length > 0) {
this.$msgbox.confirm(`确定要删除模板${this.multipleSelection.map(item => item.template_name).join('、')}吗?`, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
del_tmp(stringify({ 'template_id_list': JSON.stringify(this.multipleSelection.map(item => item.template_id)) })).then(
res => {
if (res.status === 0) {
this.$message.success('删除成功!')
this.getTmpList()
}
}
)
})
} else {
this.$message.warning('请先选择模板')
}
},
// 处理刷新
handleRefresh() {
this.getTmpList()
},
// 选择试剂入库搜索药物
searchReagent() {
this.reagentPageChange(1)
},
getTmpList() {
this.loading = true
show_tmp({
page: this.page,
page_size: this.page_size,
client_id: this.client_id
}).then(res => {
this.tableData = res.data.data_list
this.total = res.data.total_count
}).finally(() => {
this.loading = false
})
},
// 模板页翻页
tmpPageChange(page) {
this.page = page
this.getTmpList()
},
// 试剂入库信息翻页
reagentPageChange(page) {
this.reagent_page = page
const data = { seach_word: this.selectReagentValue, page: this.reagent_page, page_size: this.reagent_page_size }
this.getSelectDrug(stringify(data))
},
// 选择试剂
handleReagentClick(row) {
this.propsformdata = row
this.formVisible = true
},
// 处理ReagentForm 转绑定入库
handleReagentForm(obj) {
this.formVisible = false
this.bindToDBData = []
for (let i = 0; i < obj.export_count; i++) {
this.bindToDBData.push({ ...this.propsformdata, ...obj, 'status': true, 'index': i })
}
this.client_id_input = obj.client_id
// 自动选择第一行数据
this.$nextTick(() => {
this.$refs.singleTable.setCurrentRow(this.bindToDBData[0])
})
this.bindToDBDataTmp = this.bindToDBData
this.bindToDBVisible = true
},
// 处理选择试剂入库弹框关闭后数据留存问题
handleSelectClose() {
this.bindToDBData = []
this.selectReagentValue = ''
},
// 请求select_drug
getSelectDrug(data) {
this.loadingReagent = true
this.reagentData = []
select_drug(data).then(res => {
this.reagentData = res.data.data_list
this.reagent_total = res.data.total_count
}).finally(() => {
this.loadingReagent = false
})
},
handleReagentToDatabase() {
this.dialogTableVisible = true
this.getSelectDrug({ page: this.reagent_page, page_size: this.reagent_page_size })
},
// 新增试剂模板
handleAddTmp(t) {
// / 新增 编辑 试剂模板
// opType: null,
// opTitle: '',
this.opType = t
if (t === 'add') {
this.opTitle = `新增${this.$store.state.app.title}模板`
if (this.multipleSelection.length === 0) {
this.reagentAddVisible = true
} else if (this.multipleSelection.length === 1) {
const data = this.multipleSelection[0]
this.reagentAddTmpName = data.template_name
this.reagentAddClient = data.client_id
this.reagentAddTmpData = JSON.parse(data.template_content).map((v, index) => {
v['index'] = index
return v
})
this.reagentAddVisible = true
} else {
this.$message.warning('请选择一个模板!')
}
} else {
this.opTitle = `编辑${this.$store.state.app.title}模板`
if (this.multipleSelection.length === 1) {
const data = this.multipleSelection[0]
this.reagentAddTmpName = data.template_name
this.reagentAddClient = data.client_id
this.reagentAddTmpData = JSON.parse(data.template_content).map((v, index) => {
v['index'] = index
return v
})
this.reagentAddVisible = true
} else {
this.$message.warning('请选择一个模板!')
}
}
},
// 处理新增试剂模板 弹框关闭清理工作
handleAddClose() {
this.reagentAddTmpName = ''
this.reagentAddClient = null
this.reagentAddTmpData = []
this.client_id_input = ''
},
handleAddSave: throttle(function() {
if (!this.reagentAddTmpName) {
this.$message.warning('请输入模板名称!')
return
}
if (!this.reagentAddClient) {
this.$message.warning('请选择存储柜体!')
return
}
const data = stringify({
'template_name': this.reagentAddTmpName,
'template_content': JSON.stringify(this.reagentAddTmpData),
'client_id': this.reagentAddClient
})
add_tmp(data).then(
res => {
if (res.status === 0) {
this.$message.success('操作成功')
this.handleAddClose()
this.reagentAddVisible = false
} else {
this.$message.success('操作失败,请重试!')
}
}
)
}, 2000),
// 处理新增 新增试剂条目 弹框打开
handleADDOpen(t) {
if (t === 'add') {
this.reagentAddFormTitle = '新增模板条目'
} else {
if (this.reagentAddSelection.length !== 1) {
this.$message.warning('请选择需要编辑的模板条目!')
return
}
// 查找修改第几个
this.reagentAddModifyIndex = this.reagentAddSelection[0].index
this.reagentAddFormdata = this.reagentAddSelection[0]
this.reagentAddFormTitle = '编辑模板条目'
}
this.reagentAddFormVisible = true
},
handleADDDEL() {
this.reagentAddTmpData = this.reagentAddTmpData.filter(item => !this.reagentAddSelection.includes(item))
},
// 处理新增 条目form
handleReagentAddForm(obj) {
if (this.reagentAddFormTitle === '新增模板条目') {
this.reagentAddTmpData.push(obj)
} else {
// 修改
this.reagentAddTmpData[this.reagentAddModifyIndex] = { ...this.reagentAddTmpData[this.reagentAddModifyIndex], ...obj }
}
this.reagentAddFormVisible = false
},
reagentAddFormClose() {
this.reagentAddFormdata = {}
},
// handleAddSelectionChange
handleAddSelectionChange(val) {
this.reagentAddSelection = val
},
// 绑定入库
handleBindToDB() {
if (this.bindToDBData.length === 0 && this.multipleSelection.length === 0) {
this.$message.warning('请选择入库试剂或模板!')
return
}
this.bindToDBData = []
this.multipleSelection.forEach(item => {
const items = JSON.parse(item.template_content)
items.forEach(item => {
if (item.export_count) {
for (let i = 0; i < item.export_count; i++) {
this.bindToDBData.push({ ...item })
}
}
})
})
this.bindToDBData.map((item, index) => {
item.status = false
item.index = index
return item
})
if (this.multipleSelection.length === 1) {
this.client_id_input = this.multipleSelection[0].client_id
}
// 自动选择第一行数据
this.$nextTick(() => {
this.$refs.singleTable.setCurrentRow(this.bindToDBData[0])
})
this.bindToDBVisible = true
}
}
}
</script>
<style lang="scss" scoped>
.main-content-container {
margin: 1rem;
background: white;
min-height: calc(100vh - 110px);
.header {
margin: 1rem;
.title {
font-size: 20px;
font-weight: bold;
color: #000000;
padding-top: 1rem;
}
.header-select {
margin-top: 1rem;
.el-select {
margin-left: 0;
}
.right {
float: right;
}
}
}
.content {
margin: 1rem;
}
.page {
position: absolute;
bottom: 2rem;
text-align: center;
left: 50%; //起始是在body中横向距左50%的位置
transform: translate(-50%);
}
}
.el-select {
margin: 0rem 1rem 0rem 1rem;
}
.el-input {
width: 14.9375rem;
margin-right: 1rem;
}
.search-header {
margin-bottom: 1rem;
}
.bind-to-db-title {
font-size: 1rem;
font-weight: 400;
color: #FF9B02;
margin-bottom: 1rem;
}
.reagent-add {
text-align: center;
margin-top: 1rem;
}
.to-database {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
</style>