web/src/components/charge/AssociationIdCode.vue

264 lines
6.2 KiB
Vue

<template>
<Mask :height="560" :width="818" :is-show="show" @close="close" :show-footer="true" title="关联追溯码">
<div class="panel">
<div class="title">
<div class="title-content">
请勾选该追溯码关联的发药项目商品
</div>
<div class="code">
<span class="before-code">
{{ traceabilityCode.slice(0, 7) }}
</span>
<span class="after-code">
{{ traceabilityCode.slice(7, traceabilityCode.length) }}
</span>
</div>
</div>
<div style="padding: 0 24px;flex: 1; min-height: 0;">
<div class="list">
<el-table :data="tableData" :header-cell-style="{backgroundColor: '#F1F5FB'}">
<el-table-column label="选择" width="60">
<template #default="scope">
<input class="blue-radio" type="radio" :value="scope.row.id" v-model="selected" @click="closeModal"/>
</template>
</el-table-column>
<el-table-column prop="name" label="发药项目" show-overflow-tooltip/>
<el-table-column prop="idCode" label="产品标识码" width="140" show-overflow-tooltip>
<template #default="scope">
<IdCodeListShow :idCodeList="scope.row.idCode" v-if="scope.row.idCode && scope.row.idCode.length > 0"/>
<div v-else>未关联</div>
</template>
</el-table-column>
<el-table-column label="系统处理" width="160" show-overflow-tooltip>
<template #default="scope">
<div v-if="selected === scope.row.id">
关联产品标识码,采集追溯码自动识别商品
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<template #footer>
<div class="bottom">
<div class="default-btn" @click="close" type="primary">关闭</div>
<div class="default-btn" @click="addIdCode" type="primary" style="margin-left: 24px">确定</div>
</div>
</template>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/common/Mask.vue";
import {ref} from "vue"
import IdCodeListShow from "./IdCodeListShow.vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
interface TableItem {
id: string;
name: string;
idCode?: string[] | undefined; // 可选属性,默认为 undefined
gatherNumber?: number;
retailNumber?: number;
packagingUnit?: string;
minPackagingUnit?: string;
selectedUnit?: string;
minPackagingNumber?: number;
traceAbilityCodeList?: { code: string; number: number }[];
}
const show = ref(false);
const traceabilityCode = ref("");
const tableData = ref<TableItem[]>([]);
const init = (newIdCode: any, newTableDate: any) => {
traceabilityCode.value = newIdCode;
tableData.value = newTableDate;
show.value = true;
}
const selected = ref()
defineExpose({init})
const addIdCode = () => {
if (traceabilityCode.value == "") {
return;
}
let idCode = traceabilityCode.value.slice(0, 7);
post(API.Goods.Base.AddIdCode, {goodsId: selected.value, idCode: idCode}).then((res: any) => {
for (let subItem of tableData.value) {
if (subItem.id === selected.value) {
if (subItem.idCode == null) {
subItem.idCode = [];
}
subItem.idCode?.push(idCode);
break
}
close()
}
})
const selectedItem = tableData.value.find((item: any) => item.id === selected.value);
if (!selectedItem) {
return
}
addTraceabilityCodeDo(selectedItem)
}
const emit = defineEmits(["addIdCode", "addTraceabilityCode"])
const addTraceabilityCodeDo = (item: any) => {
emit("addTraceabilityCode", item, traceabilityCode.value)
}
const showRadio = ref<any>(false)
const closeModal = () => {
showRadio.value = false
selected.value = null
}
const close = () => {
show.value = false
closeModal()
}
</script>
<style scoped lang="scss">
.panel {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.title {
width: 100%;
height: 126px;
font-size: 24px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: #F9FAFC;
padding: 24px;
margin-bottom: 24px;
.title-content {
font-weight: 500;
font-size: 20px;
color: #666666;
font-style: normal;
}
.code {
width: 100%;
flex: 1;
min-height: 0;
font-weight: 800;
font-size: 30px;
color: #333333;
font-style: normal;
display: flex;
justify-content: center;
.before-code {
color: #999999;
}
.after-code {
min-width: 0;
margin-left: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
}
.list {
height: 100%;
border-radius: 8px 8px 0 0;
width: 100%;
border: 1px solid #EAEAEC;
border-bottom: none;
.table {
th {
background: none !important;
}
.table-title {
width: 100%;
height: 52px;
font-weight: 500;
font-size: 16px;
color: #333333;
line-height: 22px;
text-align: left;
font-style: normal;
padding: 0 25px;
th {
text-align: left;
&:first-child {
padding-left: 25px;
width: 122px;
}
&:nth-child(2) {
width: 215px;
}
&:nth-child(3) {
width: 140px;
}
&:last-child {
padding-right: 25px;
}
}
}
.table-body {
height: 52px;
font-weight: 500;
font-size: 14px;
color: #666666;
font-style: normal;
tr {
height: 52px;
font-size: 14px;
color: #333333;
td {
height: 52px;
&:first-child {
width: 132px;
padding-left: 35px;
}
&:last-child {
padding-right: 25px;
}
}
}
}
}
}
table, tbody, td {
border-bottom: 1px solid #EAEAEC; /* 明确设置边框 */
}
table {
border: none;
}
.bottom {
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
padding: 24px;
}
</style>