Merge remote-tracking branch 'origin/main'

# Conflicts:
#	src/components/common/Header.vue
#	src/components/common/Mask.vue
#	src/components/inventory/goods/Edit.vue
#	src/components/inventory/goods/Search.vue
#	src/components/outpatient/PharmaceuticalConsumables.vue
#	src/components/outpatient/ServiceItems.vue
#	src/components/settings/ItemEdit.vue
#	src/components/settings/Search.vue
#	src/components/settings/SectionEdit.vue
#	src/views/inventory/apply.vue
#	src/views/inventory/check.vue
#	src/views/inventory/goods.vue
#	src/views/inventory/supplier.vue
This commit is contained in:
LiJianZhao 2025-04-28 17:07:48 +08:00
commit b774eb806b
30 changed files with 2121 additions and 1800 deletions

8
package-lock.json generated
View File

@ -10,7 +10,7 @@
"dependencies": { "dependencies": {
"axios": "^1.8.4", "axios": "^1.8.4",
"echarts": "^5.6.0", "echarts": "^5.6.0",
"element-plus": "^2.9.7", "element-plus": "^2.9.9",
"pinia": "^3.0.1", "pinia": "^3.0.1",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-router": "^4.5.0" "vue-router": "^4.5.0"
@ -2511,9 +2511,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/element-plus": { "node_modules/element-plus": {
"version": "2.9.7", "version": "2.9.9",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.7.tgz", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.9.9.tgz",
"integrity": "sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==", "integrity": "sha512-gN553+xr7ETkhJhH26YG0fERmd2BSCcQKslbtR8fats0Mc0yCtZOXr00bmoPOt5xGzhuRN1TWc9+f1pCaiA0/Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",

View File

@ -13,7 +13,7 @@
"dependencies": { "dependencies": {
"axios": "^1.8.4", "axios": "^1.8.4",
"echarts": "^5.6.0", "echarts": "^5.6.0",
"element-plus": "^2.9.7", "element-plus": "^2.9.9",
"pinia": "^3.0.1", "pinia": "^3.0.1",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-router": "^4.5.0" "vue-router": "^4.5.0"

View File

@ -20,5 +20,10 @@
"name": "代理名称", "name": "代理名称",
"qrCode": "qrCode.png", "qrCode": "qrCode.png",
"phone": "18888888888" "phone": "18888888888"
},
"user": {
"name": "智慧医疗诊所",
"logo": "/static/images/default_logo.png",
"version": "1.0.0"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

View File

@ -12,7 +12,7 @@
<router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link> <router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link>
<router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link> <router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link>
<div class="btn"> <div class="btn">
<el-button :icon="Right" style="float: right;color: #fff" @click="logout">退出登录</el-button> <el-button :icon="Right" style="float: right;color: #fff" @click="logout" text>退出登录</el-button>
</div> </div>
</div> </div>

View File

@ -22,7 +22,6 @@ _width.value = width == null ? 1200 : width;
_height.value = height == null ? 800 : height; _height.value = height == null ? 800 : height;
_close.value = close == null ? true : close; _close.value = close == null ? true : close;
watch(() => isShow, (newVal) => { watch(() => isShow, (newVal) => {
_isShow.value = newVal == null ? false : newVal; _isShow.value = newVal == null ? false : newVal;
}); });
@ -104,6 +103,7 @@ const closeBtn = () => {
border-radius: 16px; border-radius: 16px;
line-height: 32px; line-height: 32px;
text-align: center; text-align: center;
cursor: pointer;
.close-icon { .close-icon {
color: #6e6e6e; color: #6e6e6e;

View File

@ -1,22 +1,46 @@
<script setup lang="ts"> <script setup lang="ts">
import Panel from "@/components/common/Panel.vue"; import Panel from "@/components/common/Panel.vue";
import {post} from "@/utils/request.ts";
import {onMounted, ref, defineModel} from "vue";
import {formatDate} from "@/utils/dateUtils.ts";
import {loadConfig} from "@/utils/config.ts";
const decryptedText = ref<any>({})
const ciphertext = ref<any>('')
const init = async () => {
ciphertext.value = await post("common/auth/get");
decryptedText.value = await post("common/auth/check");
}
onMounted(async () => {
await init()
if(localStorage.getItem('logoUrl')){
getImageUrl(localStorage.getItem('logoUrl'))
}
})
const userMessage = defineModel<any>()
const imageUrl = ref<any>()
const getImageUrl = (url: any) => {
loadConfig().then(res => {
imageUrl.value = res.base_url + 'file/getImage/' + url
})
}
</script> </script>
<template> <template>
<Panel title="药房基本信息" class="info"> <Panel title="药房基本信息" class="info">
<div class="info-content"> <div class="info-content">
<img class="image" src="/static/images/home/app-head.png" alt="app"> <img class="image" :src="imageUrl? imageUrl:userMessage.logo" alt="app">
<div class="app_info-content-text"> <div class="app_info-content-text">
<el-tooltip <el-tooltip
effect="dark" effect="dark"
:content="'仁德大药房连锁有限公司'" :content="userMessage.name"
placement="bottom-start" placement="bottom-start"
> >
<div class="app_info-title">仁德大药房连锁有限公司</div> <div class="app_info-title">{{ userMessage.name }}</div>
</el-tooltip> </el-tooltip>
<div>软件版本V2.5.1</div> <div>软件版本{{ userMessage.version }}</div>
<div style="margin: 10px 0">授权到期2024-12-31</div> <div style="margin: 10px 0">授权到期{{ formatDate(decryptedText.expiryDate) }}</div>
<div>版本类型专业版</div> <div>版本类型 {{ decryptedText.rule == 1 ? "禁用医保" : decryptedText.rule == 2 ? "全部开放" : "暂无" }}</div>
</div> </div>
</div> </div>
</Panel> </Panel>

View File

@ -1,133 +1,140 @@
<template> <template>
<div class="add-panel"> <Mask :width="1200" :height="600" :top="100" :is-show="isShow" @close="exit" title="新增领用" :show-footer="true">
<div class="top"> <div class="add-panel">
<el-form :inline=true label-position="top" :model="formData" label-width="auto"> <div class="top">
<el-form-item label="领用人"> <el-form :inline=true label-position="top" :model="formData" label-width="auto">
<el-input v-model="formData.name" disabled></el-input> <el-form-item label="领用人">
</el-form-item> <el-input v-model="formData.name" disabled></el-input>
<el-form-item label="备注" style="width: 50%"> </el-form-item>
<el-input v-model="formData.remark"></el-input> <el-form-item label="备注" style="width: 50%">
</el-form-item> <el-input v-model="formData.remark"></el-input>
</el-form> </el-form-item>
</div> </el-form>
<div class="table_content">
<div class="add_apply">
<span>领用药品</span>
<div class="search">
<GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch>
</div>
</div> </div>
<table class="simple-table" style="margin-top: 15px;width: 100% ;height:300px ;max-height:550px"> <div class="table_content">
<thead> <div class="add_apply">
<tr> <span>领用药品</span>
<th>名称</th> <div class="search">
<th>批次</th> <GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch>
<th>生产批号</th> </div>
<th>有效期</th> </div>
<th>当前库存</th> <table class="simple-table" style="margin-top: 15px;width: 100% ;height:300px ;max-height:550px">
<th>出库数量</th> <thead>
</tr>
</thead>
<tbody>
<template v-for="(item,index) in tableList">
<tr> <tr>
<td>{{ item.name }}</td> <th>名称</th>
<td> <th>批次</th>
<el-select <th>生产批号</th>
v-model="item.selectList" <th>有效期</th>
multiple <th>当前库存</th>
@change="addLine(item)" <th>出库数量</th>
:teleported="false"
style="width: 100px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库数据</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.batchList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id">
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td></td>
<td>
</td>
<td>
{{ item.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ item.totalOutWholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.totalFragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr> </tr>
<template v-for="subItem in item.children"> </thead>
<tbody>
<template v-for="(item,index) in tableList">
<tr> <tr>
<td>-</td> <td>{{ item.name }}</td>
<td>-</td>
<td>{{ subItem.productionBatchCode }}</td>
<td>{{ subItem.expiryDate }}</td>
<td> <td>
{{ subItem.wholeNumber }}{{ subItem.packagingUnit }} <el-select
v-model="item.selectList"
multiple
@change="addLine(item)"
:teleported="false"
style="width: 100px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库数据</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.batchList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id">
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td></td>
<td>
</td>
<td>
{{ item.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1"> <template v-if="item.trdnFlag == 1">
{{ subItem.fragmentNumber }}{{ subItem.minPackagingUnit }} {{ item.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
<td> <td>
<el-input v-model.number="subItem.outWholeNumber" size="small" style="width: 50px" {{ item.totalOutWholeNumber }}{{ item.packagingUnit }}
@change="changeOutNumber(item)"> <template v-if="item.trdnFlag == 1">
<template #suffix> {{ item.totalFragmentNumber }}{{ item.minPackagingUnit }}
{{ item.packagingUnit }} </template>
</template>
</el-input>
<el-input v-model.number="subItem.outFragmentNumber" size="small" style="width: 50px"
@change="changeOutNumber(item)" v-if="item.trdnFlag == 1">
<template #suffix>
{{ item.minPackagingUnit }}
</template>
</el-input>
</td> </td>
</tr> </tr>
<template v-for="subItem in item.children">
<tr>
<td>-</td>
<td>-</td>
<td>{{ subItem.productionBatchCode }}</td>
<td>{{ subItem.expiryDate }}</td>
<td>
{{ subItem.wholeNumber }}{{ subItem.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ subItem.fragmentNumber }}{{ subItem.minPackagingUnit }}
</template>
</td>
<td>
<el-input v-model.number="subItem.outWholeNumber" size="small" style="width: 50px"
@change="changeOutNumber(item)">
<template #suffix>
{{ item.packagingUnit }}
</template>
</el-input>
<el-input v-model.number="subItem.outFragmentNumber" size="small" style="width: 50px"
@change="changeOutNumber(item)" v-if="item.trdnFlag == 1">
<template #suffix>
{{ item.minPackagingUnit }}
</template>
</el-input>
</td>
</tr>
</template>
</template> </template>
</template> </tbody>
</tbody> </table>
</table> </div>
</div>
<template #footer>
<div class="bottom"> <div class="bottom">
<el-button type="primary" @click="save">保存</el-button> <el-button type="primary" @click="save">保存</el-button>
<el-button type="primary" @click="exit">关闭</el-button> <el-button type="primary" @click="exit">关闭</el-button>
</div> </div>
</div> </template>
</div> </Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref, unref} from "vue"; import {onMounted, ref, unref} from "vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue"; import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue"; import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
const isShow = ref<any>(false)
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const exit = () => { const exit = () => {
isShow.value = false
emit('close') emit('close')
} }
const formData = ref({ const formData = ref({
@ -162,7 +169,7 @@ const goodsSelectCallBack = (inventory: any) => {
if (findIndexForTableList(inventory.goodId) != -1) { if (findIndexForTableList(inventory.goodId) != -1) {
return return
} }
post("inventory/goods/getByGoodsId", {goodsId: inventory.goodId}).then((res: any) => { post("inventory/goods/getByGoodsId", {goodsId: inventory.goodId,isZero:false}).then((res: any) => {
inventory.batchList = res.inventoryGoodsList inventory.batchList = res.inventoryGoodsList
inventory.minPackagingUnit = res.minPackagingUnit inventory.minPackagingUnit = res.minPackagingUnit
inventory.trdnFlag = res.trdnFlag inventory.trdnFlag = res.trdnFlag
@ -173,7 +180,6 @@ const goodsSelectCallBack = (inventory: any) => {
inventory.packagingUnit = res.packagingUnit inventory.packagingUnit = res.packagingUnit
tableList.value.push(inventory) tableList.value.push(inventory)
}) })
console.log(inventory)
} }
interface childCheck { interface childCheck {
@ -228,7 +234,6 @@ const addLine = (row: any) => {
} }
row.children = children; row.children = children;
console.log("row", row)
}) })
} }
const changeOutNumber = (row: any) => { const changeOutNumber = (row: any) => {
@ -244,25 +249,6 @@ const changeOutNumber = (row: any) => {
console.log(row) console.log(row)
} }
const save = () => { const save = () => {
let children = [];
console.log(tableList.value)
// for (let i = 0; i < tableList.value.length; i++) {
// let item = tableList.value[i];
// for (let j = 0; j < item.children.length; j++) {
// let child = item.children[j];
// if (child && (child.outWholeNumber > 0 || child.outFragmentNumber > 0)) {
// let childrenItem = {
// id: child.id,
// outWholeNumber: child.outWholeNumber,
// outFragmentNumber: child.outFragmentNumber,
// }
// children.push(childrenItem);
// }
// }
//
//
// }
// let dataJson = JSON.stringify(tableList.value);
post("inventory/apply/create", {useInfo: formData.value, data: tableList.value}).then((res: any) => { post("inventory/apply/create", {useInfo: formData.value, data: tableList.value}).then((res: any) => {
exit() exit()
}) })
@ -270,15 +256,14 @@ const save = () => {
} }
const getUserInfo = () => { const getUserInfo = () => {
isShow.value = true
post("manager/user/verify", null).then((res: any) => { post("manager/user/verify", null).then((res: any) => {
formData.value.useUserId = res.id; formData.value.useUserId = res.id;
formData.value.name = res.name; formData.value.name = res.name;
formData.value.username = res.username; formData.value.username = res.username;
}) })
} }
onMounted(() => { defineExpose({getUserInfo})
getUserInfo()
})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.simple-table { .simple-table {
@ -366,6 +351,7 @@ onMounted(() => {
position: relative; position: relative;
margin-top: 24px; margin-top: 24px;
height: 100%; height: 100%;
padding: 0 24px;
.table_content { .table_content {
margin-top: 24px; margin-top: 24px;
@ -397,10 +383,10 @@ onMounted(() => {
.bottom { .bottom {
margin-top: 10px; height: 100%;
position: absolute; display: flex;
right: 10px; justify-content: flex-end;
top: 175%; align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -1,107 +1,114 @@
<template> <template>
<el-descriptions border label-width="100"> <Mask :width="1200" :height="600" :top="100" :is-show="isShow" @close="exit" title="查看领用" :show-footer="true">
<el-descriptions-item label="领用人" width="200"> <div style="margin-top: 24px;padding: 0 24px">
<el-input v-model="formData.name" disabled></el-input> <el-descriptions border label-width="100">
</el-descriptions-item> <el-descriptions-item label="领用人" width="200">
<el-descriptions-item label="备注"> <el-input v-model="formData.name" disabled></el-input>
<el-input v-model="formData.remark" disabled></el-input> </el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="备注">
</el-descriptions> <el-input v-model="formData.remark" disabled></el-input>
<table class="simple-table" style="margin-top: 15px"> </el-descriptions-item>
<thead> </el-descriptions>
<tr> <table class="simple-table" style="margin-top: 15px">
<th>名称</th> <thead>
<th>批次</th>
<th>生产批号</th>
<th>有效期</th>
<th>当前库存</th>
<th>出库数量</th>
</tr>
</thead>
<tbody>
<template v-for="(item,index) in tableList" :key="index">
<tr>
<td>{{ item.name }}</td>
<td>
<el-select
v-model="item.selectList"
multiple
@change="addLine(item)"
:teleported="false"
style="width: 100px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库数据</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem) in item.batchList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id"
:disabled="true"
>
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td></td>
<td>
</td>
<td>
{{ item.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ item.totalOutWholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.totalFragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr>
<template v-for="subItem in item.children">
<tr> <tr>
<td>-</td> <th>名称</th>
<td>-</td> <th>批次</th>
<td>{{ subItem.productionBatchCode }}</td> <th>生产批号</th>
<td>{{ subItem.expiryDate }}</td> <th>有效期</th>
<td> <th>当前库存</th>
{{ subItem.wholeNumber }}{{ subItem.packagingUnit }} <th>出库数量</th>
<template v-if="item.trdnFlag == 1">
{{ subItem.fragmentNumber }}{{ subItem.minPackagingUnit }}
</template>
</td>
<td>
{{ subItem.outWholeNumber }}{{ subItem.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ subItem.outFragmentNumber }}{{ subItem.minPackagingUnit }}
</template>
</td>
</tr> </tr>
</template> </thead>
<tbody>
<template v-for="(item,index) in tableList" :key="index">
<tr>
<td>{{ item.name }}</td>
<td>
<el-select
v-model="item.selectList"
multiple
@change="addLine(item)"
:teleported="false"
style="width: 100px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库数据</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem) in item.batchList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id"
:disabled="true"
>
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td></td>
<td>
</td>
<td>
{{ item.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ item.totalOutWholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ item.totalFragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr>
<template v-for="subItem in item.children">
<tr>
<td>-</td>
<td>-</td>
<td>{{ subItem.productionBatchCode }}</td>
<td>{{ subItem.expiryDate }}</td>
<td>
{{ subItem.wholeNumber }}{{ subItem.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ subItem.fragmentNumber }}{{ subItem.minPackagingUnit }}
</template>
</td>
<td>
{{ subItem.outWholeNumber }}{{ subItem.packagingUnit }}
<template v-if="item.trdnFlag == 1">
{{ subItem.outFragmentNumber }}{{ subItem.minPackagingUnit }}
</template>
</td>
</tr>
</template>
</template>
</tbody>
</table>
</div>
<template #footer>
<div class="bottom">
<el-button type="primary" @click="exit">关闭</el-button>
</div>
</template> </template>
</tbody> </Mask>
</table>
<div class="bottom">
<el-button type="primary" @click="exit">关闭</el-button>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref, defineProps} from "vue"; import {onMounted, ref, defineProps} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue"; import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
const props = defineProps({ const props = defineProps({
id: { id: {
@ -109,11 +116,17 @@ const props = defineProps({
default: null default: null
} }
}) })
const isShow = ref<any>(false)
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const exit = () => { const exit = () => {
formData.value = {
useUserId: null,
name: '',
username: "",
remark: ''
}
isShow.value = false
emit('close') emit('close')
} }
const formData = ref({ const formData = ref({
@ -194,22 +207,27 @@ const addLine = (row: any) => {
}) })
} }
const getUserInfo = () => { const getUserInfo = () => {
post("manager/user/verify", null).then((res: any) => { post("manager/user/verify").then((res: any) => {
formData.value.useUserId = res.id; formData.value.useUserId = res.id;
formData.value.name = res.name; formData.value.name = res.name;
formData.value.username = res.username; formData.value.username = res.username;
}) })
} }
const detail = () => { const detail = (id: any) => {
post("inventory/apply/getApplyDetail", {id: props.id}).then((res: any) => { isShow.value = true
post("inventory/apply/getApplyDetail", {id}).then((res: any) => {
formData.value = res.useInfo; formData.value = res.useInfo;
tableList.value = JSON.parse(res); tableList.value = JSON.parse(res);
}) })
} }
onMounted(() => { onMounted(() => {
getUserInfo()
detail()
}) })
const init=(id: any) => {
getUserInfo()
detail(id)
}
defineExpose({init})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.simple-table { .simple-table {
@ -231,6 +249,7 @@ onMounted(() => {
} }
} }
} }
tbody { tbody {
tr:hover { tr:hover {
background-color: #f5f7fa; /* 悬停效果 */ background-color: #f5f7fa; /* 悬停效果 */
@ -287,15 +306,17 @@ tbody {
background-color: #fffdec; background-color: #fffdec;
} }
} }
.btn { .btn {
margin-top: 5px; margin-top: 5px;
} }
.bottom { .bottom {
margin-top: 10px; height: 100%;
position: absolute; display: flex;
right: 10px; justify-content: flex-end;
bottom: 10px; align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -1,144 +1,335 @@
<template> <template>
<div class="body_wrapper"> <Mask :width="1200" :height="540" :is-show="isShow" :top="100" @close="exit" title="新增盘点" :show-footer="true">
<div class="top" style="width: 100%"> <div class="body_wrapper">
<el-form :model="form" style="width: 100%" label-width="auto" class="demo-ruleForm" label-position="top"> <div class="top" style="width: 100%">
<el-form-item label="备注" style="width: 100%;margin-right: 0"> <el-form :model="form" style="width: 100%" label-width="auto" class="demo-ruleForm" label-position="top">
<el-input v-model="form.remark" placeholder="请输入单据编号"></el-input> <el-form-item label="备注" style="width: 100%;margin-right: 0">
</el-form-item> <el-input v-model="form.remark" placeholder="请输入单据编号"></el-input>
</el-form> </el-form-item>
</div> </el-form>
<div class="content">
<div class="add_goods">
<span>盘点药品</span>
<div class="search">
<GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch>
</div>
</div> </div>
<table class="simple-table" style="margin-top: 15px;"> <div class="content">
<thead> <div class="add_goods">
<tr> <span>盘点药品</span>
<th>名称</th> <div class="search">
<th>批次</th> <GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch>
<th>最小包装数量</th> </div>
<th>库存</th> </div>
<th>改后库存</th> <table class="simple-table" style="margin-top: 15px;">
<th>变化量</th> <thead>
</tr>
</thead>
<tbody>
<template v-for="(item,index) in list">
<tr> <tr>
<td>{{ item.name }}</td> <th>名称</th>
<td> <th>批次</th>
<!--<el-checkbox-group v-model="item.childIdList" @change="addLine(item)"> <th>最小包装数量</th>
<el-checkbox v-for="(subItem,subIndex) in item.selectList" :label="subItem.id" :value="subItem.id" /> <th>库存</th>
</el-checkbox-group>--> <th>改后库存</th>
<el-select <th>变化量</th>
v-model="item.childIdList"
@change="addLine(item)"
multiple
:teleported="false"
style="width: 150px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库时间</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.selectList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id">
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td>{{ item.minPackagingNumber }}</td>
<td>
{{ item.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
<el-form v-show="item.childIdList.length===0">
<el-input v-model.number="item.after.wholeNumber" style="width: 60px" @change="setChange(item)">
<template #suffix>{{ item.packagingUnit }}</template>
</el-input>
<el-input v-model.number="item.after.fragmentNumber" style="width: 60px;margin-left: 5px"
@change="setChange(item)" v-if="item.trdnFlag ==1">
<template #suffix>{{ item.minPackagingUnit }}</template>
</el-input>
</el-form>
</td>
<td>
{{ item.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr> </tr>
<template v-for="(subItem,subIndex) in item.children"> </thead>
<tbody>
<template v-for="(item,index) in list">
<tr> <tr>
<td>-</td> <td>{{ item.name }}</td>
<td>-</td> <td>
<td>-</td> <!--<el-checkbox-group v-model="item.childIdList" @change="addLine(item)">
<td> {{ subItem.before.wholeNumber }}{{ item.packagingUnit }} <el-checkbox v-for="(subItem,subIndex) in item.selectList" :label="subItem.id" :value="subItem.id" />
</el-checkbox-group>-->
<el-select
v-model="item.childIdList"
@change="addLine(item)"
multiple
:teleported="false"
style="width: 150px;"
collapse-tags
popper-class="table-select">
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库时间</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.selectList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id">
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td>{{ item.minPackagingNumber }}</td>
<td>
{{ item.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1"> <template v-if="item.trdnFlag ==1">
{{ subItem.before.fragmentNumber }}{{ item.minPackagingUnit }} {{ item.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
<td> <td>
<el-input v-model.number="subItem.after.wholeNumber" style="width: 60px" @change="setChange(subItem)"> <el-form v-show="item.childIdList.length===0">
<template #suffix>{{ item.packagingUnit }}</template> <el-input v-model.number="item.after.wholeNumber" style="width: 60px" @change="setChange(item)">
</el-input> <template #suffix>{{ item.packagingUnit }}</template>
<el-input v-model.number="subItem.after.fragmentNumber" style="width: 60px;margin-left: 5px" </el-input>
@change="setChange(subItem)" v-if="item.trdnFlag ==1"> <el-input v-model.number="item.after.fragmentNumber" style="width: 60px;margin-left: 5px"
<template #suffix>{{ item.minPackagingUnit }}</template> @change="setChange(item)" v-if="item.trdnFlag ==1">
</el-input> <template #suffix>{{ item.minPackagingUnit }}</template>
</el-input>
</el-form>
</td> </td>
<td> <td>
{{ subItem.change.wholeNumber }}{{ item.packagingUnit }} {{ item.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1"> <template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }} {{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
</tr> </tr>
<template v-for="(subItem,subIndex) in item.children">
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td> {{ subItem.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ subItem.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
<el-input v-model.number="subItem.after.wholeNumber" style="width: 60px" @change="setChange(subItem)">
<template #suffix>{{ item.packagingUnit }}</template>
</el-input>
<el-input v-model.number="subItem.after.fragmentNumber" style="width: 60px;margin-left: 5px"
@change="setChange(subItem)" v-if="item.trdnFlag ==1">
<template #suffix>{{ item.minPackagingUnit }}</template>
</el-input>
</td>
<td>
{{ subItem.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr>
</template>
</template> </template>
</template> </tbody>
</tbody> </table>
</table> </div>
</div> </div>
</div> <template #footer>
<div class="bottom">
<div class="bottom"> <div class="btn">
<div class="btn"> <el-button @click="save" type="primary">保存</el-button>
<el-button @click="save" type="primary">保存</el-button> <el-button @click="exit" type="primary">关闭</el-button>
<el-button @click="exit" type="primary">关闭</el-button> </div>
</div> </div>
</div> </template>
</Mask>
</template> </template>
<script setup lang="ts">
import {post} from "@/utils/request.ts";
import {ref} from "vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import Mask from "@/components/common/Mask.vue";
import {ElMessage} from "element-plus";
const form = ref<any>({
remark: ""
})
const state = ref([])
const goodsSelectCallBack = (item: any) => {
if (findIndexForTableList(item.goodId) != -1) {
return
}
addRow(item.goodId);
state.value = []
}
const findIndexForTableList = (goodId: any) => {
return list.value.findIndex((item: any) => item.goodsId === goodId);
}
interface Check {
id?: number,
goodsId: number,
name: string,
minPackagingUnit: string,
packagingUnit: string,
minPackagingNumber: number,
listSize: number,
trdnFlag: number,
childIdList: number[],
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
children: childCheck[],
selectList: seletcType[],
}
interface seletcType {
id: number,
wholeNumber: number,
fragmentNumber: number,
productionBatchCode: string,
productionDate: string,
expiryDate: string,
purchaseUnitPrice: string
}
interface childCheck {
id?: number,
goodsId: number,
name: string,
minPackagingNumber: number,
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
}
const list = ref<Check[]>([])
const emit = defineEmits(['close'])
let setChange = function (row: any) {
let totalBefore = row.before.wholeNumber * row.minPackagingNumber + row.before.fragmentNumber; // 使
let totalAfter = row.after.wholeNumber * row.minPackagingNumber + row.after.fragmentNumber; // 使
console.log(totalBefore, totalAfter)
let diff = totalAfter - totalBefore;
row.change.wholeNumber = Math.trunc(diff / row.minPackagingNumber);
row.change.fragmentNumber = diff % row.minPackagingNumber
}
let addLine = (row: any) => {
post("inventory/goods/getListByIds", {idList: row.childIdList}).then((list: any) => {
let children = [];
for (let i = 0; i < list.length; i++) {
let inventoryGoods = list[i];
let index = row.children.findIndex((item: any) => item.id === inventoryGoods.id);
if (index > -1) {
children.push(row.children[index]);
} else {
let childCheck: childCheck = {
name: inventoryGoods.name,
id: inventoryGoods.id,
goodsId: inventoryGoods.goodId,
minPackagingNumber: row.minPackagingNumber,
before: {
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
},
after: {
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
},
change: {
wholeNumber: 0,
fragmentNumber: 0,
}
}
children.push(childCheck);
}
}
row.children = children;
})
}
let addRow = (goodsId: number) => {
post("inventory/goods/getByGoodsId", {goodsId, isZero: true}).then((res: any) => {
let check: Check = {
goodsId: res.id,
name: res.name,
listSize: res.listSize,
childIdList: [],
minPackagingNumber: res.minPackagingNumber,
packagingUnit: res.packagingUnit,
minPackagingUnit: res.minPackagingUnit,
trdnFlag: res.trdnFlag,
before: {
wholeNumber: res.wholeNumber,
fragmentNumber: res.fragmentNumber,
},
after: {
wholeNumber: res.wholeNumber,
fragmentNumber: res.fragmentNumber,
},
change: {
wholeNumber: 0,
fragmentNumber: 0,
},
children: [],
selectList: [],
}
let inventoryGoodsList = res.inventoryGoodsList
for (let i = 0; i < inventoryGoodsList.length; i++) {
let inventoryGoods = inventoryGoodsList[i];
let childCheck: seletcType = {
id: inventoryGoods.id,
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
productionBatchCode: inventoryGoods.productionBatchCode,
productionDate: inventoryGoods.productionDate,
expiryDate: inventoryGoods.expiryDate,
purchaseUnitPrice: inventoryGoods.purchaseUnitPrice,
}
check.selectList.push(childCheck)
}
list.value.push(check)
})
}
let save = () => {
post("inventory/check/save", {list: list.value, remark: form.value.remark}).then((res: any) => {
ElMessage.success('保存成功')
exit()
})
}
let exit = () => {
form.value = {
remark: ""
}
list.value=[]
isShow.value = false
emit('close');
}
const isShow = ref<any>(false)
const init = () => {
isShow.value = true
}
defineExpose({init})
</script>
<style scoped lang="scss"> <style scoped lang="scss">
.body_wrapper { .body_wrapper {
position: relative;
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
min-height: 0; min-height: 0;
flex-direction: column; flex-direction: column;
margin-top: 24px; margin-top: 24px;
padding: 0 24px;
.top { .top {
position: relative; position: relative;
@ -286,203 +477,10 @@
} }
.bottom { .bottom {
height: 86px; height: 100%;
width: 100%; display: flex;
margin-top: 10px; justify-content: flex-end;
position: absolute; align-items: center;
right: 10px; padding: 0 24px;
bottom: 0;
border-top: 1px solid #EAEAEC;
.btn{
width: 100%;
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
}
} }
</style> </style>
<script setup lang="ts">
import {onMounted} from "vue";
import {post} from "@/utils/request.ts";
import {ref} from "vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
const form = ref<any>({
remark: ""
})
const state = ref([])
const options = ref([])
const goodsSelectCallBack = (item: any) => {
if (findIndexForTableList(item.goodId) != -1) {
return
}
addRow(item.goodId);
state.value = []
}
const findIndexForTableList = (goodId: any) => {
return list.value.findIndex((item: any) => item.goodsId === goodId);
}
interface Check {
id?: number,
goodsId: number,
name: string,
minPackagingUnit: string,
packagingUnit: string,
minPackagingNumber: number,
listSize: number,
trdnFlag: number,
childIdList: number[],
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
children: childCheck[],
selectList: seletcType[],
}
interface seletcType {
id: number,
wholeNumber: number,
fragmentNumber: number,
productionBatchCode: string,
productionDate: string,
expiryDate: string,
purchaseUnitPrice: string
}
interface childCheck {
id?: number,
goodsId: number,
name: string,
minPackagingNumber: number,
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
}
const list = ref<Check[]>([])
const emit = defineEmits(['close'])
onMounted(() => {
//addRow(1);
})
let setChange = function (row: any) {
let totalBefore = row.before.wholeNumber * row.minPackagingNumber + row.before.fragmentNumber; // 使
let totalAfter = row.after.wholeNumber * row.minPackagingNumber + row.after.fragmentNumber; // 使
console.log(totalBefore, totalAfter)
let diff = totalAfter - totalBefore;
row.change.wholeNumber = Math.trunc(diff / row.minPackagingNumber);
row.change.fragmentNumber = diff % row.minPackagingNumber
}
let addLine = (row: any) => {
post("inventory/goods/getListByIds", {idList: row.childIdList}).then((list: any) => {
let children = [];
for (let i = 0; i < list.length; i++) {
let inventoryGoods = list[i];
let index = row.children.findIndex((item: any) => item.id === inventoryGoods.id);
if (index > -1) {
children.push(row.children[index]);
} else {
let childCheck: childCheck = {
name: inventoryGoods.name,
id: inventoryGoods.id,
goodsId: inventoryGoods.goodId,
minPackagingNumber: row.minPackagingNumber,
before: {
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
},
after: {
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
},
change: {
wholeNumber: 0,
fragmentNumber: 0,
}
}
children.push(childCheck);
}
}
row.children = children;
})
}
let addRow = (goodsId: number) => {
post("inventory/goods/getByGoodsId", {goodsId}).then((res: any) => {
let check: Check = {
goodsId: res.id,
name: res.name,
listSize: res.listSize,
childIdList: [],
minPackagingNumber: res.minPackagingNumber,
packagingUnit: res.packagingUnit,
minPackagingUnit: res.minPackagingUnit,
trdnFlag: res.trdnFlag,
before: {
wholeNumber: res.wholeNumber,
fragmentNumber: res.fragmentNumber,
},
after: {
wholeNumber: res.wholeNumber,
fragmentNumber: res.fragmentNumber,
},
change: {
wholeNumber: 0,
fragmentNumber: 0,
},
children: [],
selectList: [],
}
let inventoryGoodsList = res.inventoryGoodsList
for (let i = 0; i < inventoryGoodsList.length; i++) {
let inventoryGoods = inventoryGoodsList[i];
let childCheck: seletcType = {
id: inventoryGoods.id,
wholeNumber: inventoryGoods.wholeNumber,
fragmentNumber: inventoryGoods.fragmentNumber,
productionBatchCode: inventoryGoods.productionBatchCode,
productionDate: inventoryGoods.productionDate,
expiryDate: inventoryGoods.expiryDate,
purchaseUnitPrice: inventoryGoods.purchaseUnitPrice,
}
check.selectList.push(childCheck)
}
list.value.push(check)
})
}
let save = () => {
post("inventory/check/save", {list: list.value, remark: form.value.remark}).then((res: any) => {
emit('close');
})
// emit('close');
}
let exit = () => {
emit('close');
}
</script>

View File

@ -1,130 +1,226 @@
<template> <template>
<div class="body_wrapper"> <Mask :width="1200" :height="540" :is-show="isShow" :top="100" @close="exit" title="查看盘点" :show-footer="true">
<div class="top"> <div class="body_wrapper">
<el-form :model="form" style="width: 100%" label-width="auto" class="demo-ruleForm" label-position="top"> <div class="top">
<el-form-item label="备注" style="width: 100%;margin-right: 0"> <el-form :model="form" style="width: 100%" label-width="auto" class="demo-ruleForm" label-position="top">
<el-input disabled v-model="form.remark"></el-input> <el-form-item label="备注" style="width: 100%;margin-right: 0">
</el-form-item> <el-input disabled v-model="form.remark"></el-input>
</el-form> </el-form-item>
</div> </el-form>
<div class="content"> </div>
<table class="simple-table" style="margin-top: 15px;"> <div class="content">
<thead> <table class="simple-table" style="margin-top: 15px;">
<tr> <thead>
<th>名称</th>
<th>批次</th>
<th>最小包装数量</th>
<th>库存</th>
<th>改后库存</th>
<th>变化量</th>
</tr>
</thead>
<tbody>
<template v-for="(item,index) in list">
<tr> <tr>
<td>{{ item.name }}</td> <th>名称</th>
<td v-if="item.childIdList.length=0"></td> <th>批次</th>
<td v-else> <th>最小包装数量</th>
<el-select <th>库存</th>
v-model="item.childIdList" <th>改后库存</th>
multiple <th>变化量</th>
:teleported="false"
style="width: 150px;"
collapse-tags
popper-class="table-select"
:collapse-tags-tooltip="true"
>
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库时间</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.selectList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id"
disabled
>
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td>{{ item.minPackagingNumber }}</td>
<td>
{{ item.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ item.after.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.after.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ item.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr> </tr>
<template v-for="(subItem,subIndex) in item.children"> </thead>
<tbody>
<template v-for="(item,index) in list">
<tr> <tr>
<td>-</td> <td>{{ item.name }}</td>
<td>-</td> <td v-if="item.childIdList.length=0"></td>
<td>-</td> <td v-else>
<el-select
v-model="item.childIdList"
multiple
:teleported="false"
style="width: 150px;"
collapse-tags
popper-class="table-select"
:collapse-tags-tooltip="true"
>
<div class="select-header">
<span>批次ID</span>
<span>生产批号</span>
<span>入库时间</span>
<span>有效期</span>
<span>进价</span>
</div>
<el-option
v-for="(subItem,subIndex) in item.selectList"
:key="subItem.id"
:label="subItem.id"
:value="subItem.id"
disabled
>
<div class="option-row">
<span>{{ subItem.id }}</span>
<span>{{ subItem.productionBatchCode }}</span>
<span>{{ subItem.productionDate }}</span>
<span>{{ subItem.expiryDate }}</span>
<span>{{ subItem.purchaseUnitPrice }}</span>
</div>
</el-option>
</el-select>
</td>
<td>{{ item.minPackagingNumber }}</td>
<td> <td>
{{ subItem.before.wholeNumber }}{{ item.packagingUnit }} {{ item.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1"> <template v-if="item.trdnFlag ==1">
{{ subItem.before.fragmentNumber }}{{ item.minPackagingUnit }} {{ item.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
<td> <td>
{{ subItem.after.wholeNumber }}{{ item.packagingUnit }} {{ item.after.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1"> <template v-if="item.trdnFlag ==1">
{{ subItem.after.fragmentNumber }}{{ item.minPackagingUnit }} {{ item.after.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
<td> <td>
{{ subItem.change.wholeNumber }}{{ item.packagingUnit }} {{ item.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1"> <template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }} {{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template> </template>
</td> </td>
</tr> </tr>
<template v-for="(subItem,subIndex) in item.children">
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
{{ subItem.before.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ subItem.before.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ subItem.after.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ subItem.after.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
<td>
{{ subItem.change.wholeNumber }}{{ item.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ item.change.fragmentNumber }}{{ item.minPackagingUnit }}
</template>
</td>
</tr>
</template>
</template> </template>
</template> </tbody>
</tbody> </table>
</table> </div>
</div> </div>
</div> <template #footer>
<div class="bottom">
<div class="btn">
<el-button @click="exit" type="primary">关闭</el-button>
</div>
</div>
</template>
</Mask>
<div class="bottom">
<div class="btn">
<el-button @click="exit" type="primary">关闭</el-button>
</div>
</div>
</template> </template>
<script setup lang="ts">
import {onMounted,defineProps} from "vue";
import {post} from "@/utils/request.ts";
import {ref} from "vue";
import Mask from "@/components/common/Mask.vue";
const props = defineProps({
id: {
type: String,
default: null
}
})
const form=ref<any>({
remark: "",
})
interface Check {
id?: number,
goodsId: number,
name: string,
minPackagingUnit: string,
packagingUnit: string,
minPackagingNumber: number,
listSize: number,
trdnFlag: number,
childIdList: number[],
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
children: childCheck[],
selectList: seletcType[],
}
interface seletcType {
id: number,
wholeNumber: number,
fragmentNumber: number,
productionBatchCode: string,
productionDate: string,
expiryDate: string,
purchaseUnitPrice: string
}
interface childCheck {
id?: number,
goodsId: number,
name: string,
minPackagingNumber: number,
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
}
const list = ref<Check[]>([])
const emit = defineEmits(['close'])
let exit = () => {
form.value = {
remark: ""
}
list.value=[]
isShow.value = false
emit('close');
}
const detail = (id: any) => {
isShow.value = true
post("inventory/check/getCheckDetail",{id}).then((res: any) => {
list.value = JSON.parse(res);
})
}
const isShow = ref(false)
defineExpose({detail})
</script>
<style scoped lang="scss"> <style scoped lang="scss">
.body_wrapper { .body_wrapper {
position: relative;
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
min-height: 0; min-height: 0;
flex-direction: column; flex-direction: column;
margin-top: 24px; margin-top: 24px;
padding: 0 24px;
.top { .top {
position: relative; position: relative;
@ -258,104 +354,10 @@
} }
.bottom { .bottom {
height: 86px; height: 100%;
width: 100%; display: flex;
margin-top: 10px; justify-content: flex-end;
position: absolute; align-items: center;
right: 10px; padding: 0 24px;
bottom: 0;
border-top: 1px solid #EAEAEC;
.btn{
width: 100%;
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
}
} }
</style> </style>
<script setup lang="ts">
import {onMounted,defineProps} from "vue";
import {post} from "@/utils/request.ts";
import {ref} from "vue";
const props = defineProps({
id: {
type: String,
default: null
}
})
const form=ref<any>({
remark: "",
})
interface Check {
id?: number,
goodsId: number,
name: string,
minPackagingUnit: string,
packagingUnit: string,
minPackagingNumber: number,
listSize: number,
trdnFlag: number,
childIdList: number[],
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
children: childCheck[],
selectList: seletcType[],
}
interface seletcType {
id: number,
wholeNumber: number,
fragmentNumber: number,
productionBatchCode: string,
productionDate: string,
expiryDate: string,
purchaseUnitPrice: string
}
interface childCheck {
id?: number,
goodsId: number,
name: string,
minPackagingNumber: number,
before: {
wholeNumber: number,
fragmentNumber: number,
},
after: {
wholeNumber: number,
fragmentNumber: number,
},
change: {
wholeNumber: number,
fragmentNumber: number,
}
}
const list = ref<Check[]>([])
const emit = defineEmits(['close'])
onMounted(() => {
detail()
})
let exit = () => {
emit('close');
}
const detail = () => {
post("inventory/check/getCheckDetail",{id: props.id}).then((res: any) => {
list.value = JSON.parse(res);
})
}
defineExpose({detail})
</script>

View File

@ -1,89 +1,96 @@
<template> <template>
<CloseBtn @click="close"></CloseBtn> <Mask :width="400" :height="600" :top="100" :is-show="isShow" @close="isShow=false" :show-fotter="true" title="药品列表">
<!-- <div class="close" @click="close"><el-icon><Close /></el-icon></div>--> <el-table
<el-table :data="cateList"
:data="cateList" style="width: 100%"
style="width: 100%" >
> <el-table-column
<el-table-column width="200">
width="200"> <template #default="scope">
<template #default="scope"> <el-input v-model="scope.row.name" v-if="scope.row.isEdit"></el-input>
<el-input v-model="scope.row.name" v-if="scope.row.isEdit"></el-input> <span v-else>{{ scope.row.name }}</span>
<span v-else>{{ scope.row.name }}</span> </template>
</template> </el-table-column>
</el-table-column> <el-table-column
<el-table-column width="120">
width="120"> <template #default="scope">
<template #default="scope"> <div>
<div > <div v-if="scope.row.isAdd" style="display: flex;">
<div v-if="scope.row.isAdd" style="display: flex;"> <el-button type="primary" size="small" @click="saveDo" class="btn">确定</el-button>
<el-button type="primary" size="small" @click="saveDo" class="btn">确定</el-button> <el-button size="small" @click="cancelAdd" class="btn">取消</el-button>
<el-button size="small" @click="cancelAdd" class="btn">取消</el-button> </div>
<div v-else>
<span @click="move(-1,scope.row)" class="btn"><el-icon><ArrowUpBold/></el-icon></span>
<span @click="move(1,scope.row)" class="btn"><el-icon><ArrowDownBold/></el-icon></span>
<span @click="scope.row.isEdit=true" class="btn" id="edit"><el-icon><Edit/></el-icon></span>
<span @click="getCountByCateId(scope.row.id)" class="btn"> <el-icon><Delete/></el-icon></span>
</div>
</div> </div>
<div v-else> </template>
<span @click="move(-1,scope.row)" class="btn" ><el-icon><ArrowUpBold /></el-icon></span> </el-table-column>
<span @click="move(1,scope.row)" class="btn"><el-icon><ArrowDownBold /></el-icon></span> </el-table>
<span @click="scope.row.isEdit=true" class="btn" id="edit"><el-icon><Edit /></el-icon></span> <template #footer>
<span @click="getCountByCateId(scope.row.id)" class="btn"> <el-icon><Delete /></el-icon></span> <div class="bottom">
</div> <el-button type="primary" @click="add" id="add">添加</el-button>
</div> <el-button type="primary" @click="save">保存</el-button>
</template> </div>
</el-table-column> </template>
</el-table> </Mask>
<el-divider/>
<el-button type="primary" @click="add" id="add">添加</el-button>
<el-button type="primary" @click="save">保存</el-button>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, onUnmounted, ref} from "vue"; import {onMounted, onUnmounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {ElMessageBox} from "element-plus"; import {ElMessageBox} from "element-plus";
import CloseBtn from "@/components/CloseBtn.vue"; import Mask from "@/components/common/Mask.vue";
import {ArrowUpBold, ArrowDownBold, Delete, Edit} from "@element-plus/icons-vue";
const props = defineProps({ const props = defineProps({
type: { type: {
type: Number, type: Number,
}, },
}) })
interface CateItem { interface CateItem {
id?: number; id?: number;
name: string; name: string;
type: number|undefined; type: number | undefined;
isEdit: boolean; isEdit: boolean;
isAdd: boolean; isAdd: boolean;
sort: number; sort: number;
} }
const cateList = ref<CateItem[]>([]); const cateList = ref<CateItem[]>([]);
const getCateList = () => { const getCateList = () => {
post("goods/cate/list",{type:props.type}).then((res:any)=>{ post("goods/cate/list", {type: props.type}).then((res: any) => {
cateList.value=res cateList.value = res
}) })
} }
onMounted(()=>{ onMounted(() => {
getCateList() getCateList()
document.addEventListener("click", handleClickOutside); document.addEventListener("click", handleClickOutside);
}) })
onUnmounted(()=>{ onUnmounted(() => {
document.removeEventListener("click", handleClickOutside); document.removeEventListener("click", handleClickOutside);
}) })
const handleClickOutside = (event: MouseEvent) => { const handleClickOutside = (event: MouseEvent) => {
const target = event.target as HTMLElement; const target = event.target as HTMLElement;
if (!target.closest('.el-input')&&!target.closest('#edit')&&!target.closest('#add')) { if (!target.closest('.el-input') && !target.closest('#edit') && !target.closest('#add')) {
cateList.value.forEach(item => { cateList.value.forEach(item => {
item.isEdit = false; item.isEdit = false;
}); });
} }
}; };
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const close = () => { const close = () => {
emit('close') isShow.value = false
emit('close')
} }
const getCountByCateId = (cateId:any)=>{ const isShow = ref<any>(false)
let count =0; const getCountByCateId = (cateId: any) => {
post("goods/goods/getByCateId",{cateId:cateId}). let count = 0;
then((res:any)=>{ post("goods/goods/getByCateId", {cateId: cateId}).then((res: any) => {
count=res count = res
ElMessageBox.confirm( ElMessageBox.confirm(
`${count}个西药属于该二级分类,删除后将一同清空西药的分类。是否确定删除?`, `${count}个西药属于该二级分类,删除后将一同清空西药的分类。是否确定删除?`,
'Warning', 'Warning',
@ -98,26 +105,25 @@ const getCountByCateId = (cateId:any)=>{
}) })
} }
const del = async (id:any) => { const del = async (id: any) => {
await post("goods/cate/del",{id}) await post("goods/cate/del", {id})
getCateList() getCateList()
} }
const saveDo = async ()=>{ const saveDo = async () => {
cateList.value.forEach((item,index)=>{ cateList.value.forEach((item, index) => {
item.sort=index+1 item.sort = index + 1
if(item.name === ''){ if (item.name === '') {
removeItemByIndex(index) removeItemByIndex(index)
} }
}) })
await post("goods/cate/save",{cateList:cateList.value}) await post("goods/cate/save", {cateList: cateList.value})
getCateList() getCateList()
} }
const save = ()=>{ const save = () => {
saveDo() saveDo()
close() close()
} }
@ -137,27 +143,27 @@ const add = () => {
type: props.type, type: props.type,
isEdit: true, isEdit: true,
isAdd: true, isAdd: true,
sort: cateList.value.length+1 sort: cateList.value.length + 1
} }
cateList.value.push(newCate) cateList.value.push(newCate)
} }
// -1 1 // -1 1
const move = (direction:number,row :any)=>{ const move = (direction: number, row: any) => {
const index = cateList.value.findIndex(item => item.id === row.id); const index = cateList.value.findIndex(item => item.id === row.id);
if(index === -1)return; if (index === -1) return;
const targetIndex = index + direction; const targetIndex = index + direction;
if(targetIndex<0||targetIndex>=cateList.value.length)return; if (targetIndex < 0 || targetIndex >= cateList.value.length) return;
// //
[cateList.value[index], cateList.value[targetIndex]] = [cateList.value[targetIndex], cateList.value[index]]; [cateList.value[index], cateList.value[targetIndex]] = [cateList.value[targetIndex], cateList.value[index]];
console.log(cateList) console.log(cateList)
} }
const cancelAdd = ()=>{ const cancelAdd = () => {
cateList.value.pop() cateList.value.pop()
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.close{ .close {
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
top: 10px; top: 10px;
@ -165,8 +171,17 @@ const cancelAdd = ()=>{
font-size: 24px; font-size: 24px;
z-index: 1999; z-index: 1999;
} }
.btn { .btn {
margin-left: 10px; margin-left: 10px;
cursor: pointer; cursor: pointer;
} }
.bottom {
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
padding: 0 24px;
}
</style> </style>

View File

@ -1,357 +1,358 @@
<template> <template>
<div class="header"> <Mask :is-show="isShow" :height="900" @close="exit" title="新增" :show-footer="true">
<el-button type="primary" style="margin-top: 10px" round class="btn" @click="openCreateSearch" v-if="_type!=0" plain> <div class="header">
一键建档 <el-button type="primary" style="margin-top: 10px" round class="btn" @click="openCreateSearch" v-if="_type!=0"
</el-button> plain>
</div> 一键建档
<div class="common-layout"> </el-button>
<el-container> </div>
<el-aside width="800px"> <div class="common-layout">
<div class="body"> <el-container>
<el-form ref="formRef" <el-aside width="800px">
:model="edit_data" <div class="body">
:rules="rules" style="width: 100%"> <el-form ref="formRef"
<el-descriptions title="基础" border direction="vertical"> :model="edit_data"
<el-descriptions-item label="名称"> :rules="rules" style="width: 100%">
<el-form-item label="" prop="name" class="form-item"> <el-descriptions title="基础" border direction="vertical">
<el-input v-model="edit_data.name"/> <el-descriptions-item label="名称">
</el-form-item> <el-form-item label="" prop="name" class="form-item">
</el-descriptions-item> <el-input v-model="edit_data.name"/>
<el-descriptions-item label="类型" style="display: flex"> </el-form-item>
<el-form-item label="" prop="cateId" class="form-item"> </el-descriptions-item>
<el-select v-model="edit_data.cateId" placeholder="请选择" style="width: 70%"> <el-descriptions-item label="类型" style="display: flex">
<el-form-item label="" prop="cateId" class="form-item">
<el-select v-model="edit_data.cateId" placeholder="请选择" style="width: 70%">
<el-option
v-for="item in cate_list"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
<el-button @click="showCateEdit(true)">
<el-icon>
<Setting/>
</el-icon>
</el-button>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="进口|国产" v-if="_type==1306">
<el-select
v-model="edit_data.extra.maintainCate"
placeholder="进口|国产"
clearable
style="width: 240px"
>
<el-option <el-option
v-for="item in cate_list" v-for="item in imported"
:key="item.id" :key="item.label"
:label="item.name" :label="item.label"
:value="item.id"> :value="item.label"
</el-option> />
</el-select> </el-select>
<el-button @click="showCateEdit(true)"> </el-descriptions-item>
<el-icon> <el-descriptions-item label="批准文号" v-if="_type==1301">
<Setting/> <el-form-item lable="" prop="approvalCode" class="form-item">
</el-icon> <el-input v-model="edit_data.approvalCode" class="input">
</el-button>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="进口|国产" v-if="_type==1306">
<el-select
v-model="edit_data.extra.maintainCate"
placeholder="进口|国产"
clearable
style="width: 240px"
>
<el-option
v-for="item in imported"
:key="item.label"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="批准文号" v-if="_type==1301">
<el-form-item lable="" prop="approvalCode" class="form-item">
<el-input v-model="edit_data.approvalCode" class="input">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="进价参考">
<el-form-item label="" prop="purchaseUnitPrice" class="form-item">
<el-input v-model.number="edit_data.purchaseUnitPrice">
<template #append></template>
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="生产企业" v-if="_type!=1302">
<el-form-item label="" prop="producer" class="form-item">
<el-input v-model="edit_data.producer"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="注册证名称" v-if="_type==1306">
<el-form-item>
<el-input v-model="edit_data.extra.registrationCertificateName" class="input">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="条形码">
<el-form-item>
<el-input v-model="edit_data.barcode"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="规格" v-if="_type==1302||_type==1306||_type==0">
<el-form-item>
<el-input v-model="edit_data.medicineDosageNum" class="input">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="最小制剂数量|单位" v-if="_type==1301">
<el-form-item>
<div class="unit-item">
<el-input ref="medicineDosageRef" v-model="edit_data.medicineDosageNum" class="input"
style="width: 200px;">
</el-input> </el-input>
<el-popover </el-form-item>
placement="bottom" </el-descriptions-item>
title="Title"
:width="200" <el-descriptions-item label="进价参考">
trigger="click" <el-form-item label="" prop="purchaseUnitPrice" class="form-item">
> <el-input v-model.number="edit_data.purchaseUnitPrice">
<template #reference> <template #append></template>
<div class="unit">{{ edit_data.medicineDosageUnit }}</div>
</template>
<UnitSelector :units="dosageUnitList" v-model="edit_data.medicineDosageUnit"></UnitSelector>
</el-popover>
</div>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="最小包装数量|单位">
<el-form-item>
<div class="unit-item">
<el-input ref="minPackagingRef" v-model="edit_data.minPackagingNumber" type="number" class="input"
style="width: 200px;">
</el-input> </el-input>
<el-popover </el-form-item>
placement="bottom" </el-descriptions-item>
title="Title"
:width="200" <el-descriptions-item label="生产企业" v-if="_type!=1302">
trigger="click" <el-form-item label="" prop="producer" class="form-item">
> <el-input v-model="edit_data.producer"/>
<template #reference> </el-form-item>
<div class="unit">{{ edit_data.minPackagingUnit }}</div> </el-descriptions-item>
</template>
<UnitSelector :units="packagingUnit" v-model="edit_data.minPackagingUnit"></UnitSelector>
</el-popover>
</div>
</el-form-item>
</el-descriptions-item> <el-descriptions-item label="注册证名称" v-if="_type==1306">
<el-descriptions-item label="包装单位"> <el-form-item>
<el-form-item> <el-input v-model="edit_data.extra.registrationCertificateName" class="input">
<div class="unit-item"> </el-input>
<el-popover </el-form-item>
placement="bottom" </el-descriptions-item>
title="Title"
:width="200"
trigger="click"
>
<template #reference>
<div class="unit" style="width: 232px">{{ edit_data.packagingUnit }}</div>
</template>
<UnitSelector :units="packagingUnit" v-model="edit_data.packagingUnit"></UnitSelector>
</el-popover>
</div>
</el-form-item>
</el-descriptions-item> <el-descriptions-item label="条形码">
<!-- <el-descriptions-item :label="_type==1301?'国药准字':'国械注准'" v-if="_type==1301 || _type==1306">--> <el-form-item>
<!-- <el-input v-model="edit_data.approvalCode"/>--> <el-input v-model="edit_data.barcode"/>
<!-- </el-descriptions-item>--> </el-form-item>
<el-descriptions-item label="注册剂型" v-if="_type==1301"> </el-descriptions-item>
<el-form-item> <el-descriptions-item label="规格" v-if="_type==1302||_type==1306||_type==0">
<el-input v-model="edit_data.extra.regType" class="input"> <el-form-item>
</el-input> <el-input v-model="edit_data.medicineDosageNum" class="input">
</el-form-item> </el-input>
</el-descriptions-item> </el-form-item>
<el-descriptions-item label="药品标识码"> </el-descriptions-item>
<el-form-item> <el-descriptions-item label="最小制剂数量|单位" v-if="_type==1301">
<el-popover <el-form-item>
:visible="showPopover" <div class="unit-item">
placement="bottom" <el-input ref="medicineDosageRef" v-model="edit_data.medicineDosageNum" class="input"
:width="200" style="width: 200px;">
id="code-pop" </el-input>
class="code-popo" <el-popover
> placement="bottom"
<div style="color: #6c6b6b;font-size: 12px">已关联({{ idCodeList ? idCodeList.length : 0 }})</div> title="Title"
<Divider/> :width="200"
<div class="item"> trigger="click"
<div v-for="(item,index) in idCodeList" :key="index"> >
<div class="remove"> <template #reference>
<el-icon @click="removeIdCode(item)" id="code-remove"> <div class="unit">{{ edit_data.medicineDosageUnit }}</div>
<Close/> </template>
</el-icon> <UnitSelector :units="dosageUnitList" v-model="edit_data.medicineDosageUnit"></UnitSelector>
</div> </el-popover>
<div style="width: 70%" class="text">
{{ item }}
</div>
</div>
</div> </div>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="最小包装数量|单位">
<el-form-item>
<div class="unit-item">
<el-input ref="minPackagingRef" v-model="edit_data.minPackagingNumber" type="number" class="input"
style="width: 200px;">
</el-input>
<el-popover
placement="bottom"
title="Title"
:width="200"
trigger="click"
>
<template #reference>
<div class="unit">{{ edit_data.minPackagingUnit }}</div>
</template>
<UnitSelector :units="packagingUnit" v-model="edit_data.minPackagingUnit"></UnitSelector>
</el-popover>
</div>
</el-form-item>
<template #reference>
<el-input v-model="idCode" id="code-input" @keydown.enter="addIdCode" </el-descriptions-item>
@click="clickIdCodeInput"></el-input> <el-descriptions-item label="包装单位">
</template> <el-form-item>
</el-popover> <div class="unit-item">
</el-form-item> <el-popover
</el-descriptions-item> placement="bottom"
<el-descriptions-item label="标签"> title="Title"
<el-form-item> :width="200"
<el-input-tag trigger="click"
draggable >
v-model="edit_data.tags" <template #reference>
class="input" <div class="unit" style="width: 232px">{{ edit_data.packagingUnit }}</div>
</template>
<UnitSelector :units="packagingUnit" v-model="edit_data.packagingUnit"></UnitSelector>
</el-popover>
</div>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item :label="_type==1301?'国药准字':'国械注准'" v-if="_type==1301 || _type==1306">-->
<!-- <el-input v-model="edit_data.approvalCode"/>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="注册剂型" v-if="_type==1301">
<el-form-item>
<el-input v-model="edit_data.extra.regType" class="input">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="药品标识码">
<el-form-item>
<el-popover
:visible="showPopover"
placement="bottom"
:width="200"
id="code-pop"
class="code-popo"
>
<div style="color: #6c6b6b;font-size: 12px">已关联({{ idCodeList ? idCodeList.length : 0 }})</div>
<Divider/>
<div class="item">
<div v-for="(item,index) in idCodeList" :key="index">
<div class="remove">
<el-icon @click="removeIdCode(item)" id="code-remove">
<Close/>
</el-icon>
</div>
<div style="width: 70%" class="text">
{{ item }}
</div>
</div>
</div>
<template #reference>
<el-input v-model="idCode" id="code-input" @keydown.enter="addIdCode"
@click="clickIdCodeInput"></el-input>
</template>
</el-popover>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="标签">
<el-form-item>
<el-input-tag
draggable
v-model="edit_data.tags"
class="input"
>
</el-input-tag>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="备注">
<el-form-item>
<el-input v-model="edit_data.remark" class="input"/>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
<el-descriptions title="扩展" border style="margin-top: 20px" direction="vertical">
<el-descriptions-item label="养护分类">
<el-select
v-model="edit_data.extra.maintainCate"
placeholder="选择养护分类"
clearable
style="width: 240px"
> >
</el-input-tag> <el-option
</el-form-item> v-for="item in maintainOptions"
</el-descriptions-item> :key="item.label"
<el-descriptions-item label="备注"> :label="item.label"
<el-form-item> :value="item.label"
<el-input v-model="edit_data.remark" class="input"/> />
</el-form-item> </el-select>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> <el-descriptions-item label="储存条件">
<el-descriptions title="扩展" border style="margin-top: 20px" direction="vertical"> <el-select
<el-descriptions-item label="养护分类"> v-model="edit_data.extra.storageConditions"
<el-select placeholder="选择养护分类"
v-model="edit_data.extra.maintainCate" clearable
placeholder="选择养护分类" style="width: 240px;"
clearable >
style="width: 240px" <el-option
> v-for="item in storageConditionsOptions"
:key="item.label"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="保质期">
<el-input v-model="edit_data.expiryTime" type="number">
<template #append></template>
</el-input>
</el-descriptions-item>
<el-descriptions-item label="柜号">
<el-input v-model="edit_data.extra.cabinetNumber">
</el-input>
</el-descriptions-item>
<el-descriptions-item label="用法用量" v-if="_type==1301">
<el-input v-model="edit_data.extra.usage">
</el-input>
</el-descriptions-item>
<el-descriptions-item label="处方药/OTC" v-if="_type==1301">
<el-select
v-model="edit_data.extra.drugCategory"
placeholder="选择药品分类"
clearable
style="width: 240px"
>
<el-option
v-for="item in drugCategoryOptions"
:key="item.label"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="精麻毒放" v-if="_type==1301">
<el-input v-model="edit_data.extra.JMDF"></el-input>
</el-descriptions-item>
<el-descriptions-item label="抗菌药物" v-if="_type==1301">
<el-input v-model="edit_data.extra.isAntibacterialAgents"></el-input>
</el-descriptions-item>
<el-descriptions-item label="基药" v-if="_type==1301">
<el-input v-model="edit_data.extra.baseMedicine"></el-input>
</el-descriptions-item>
<el-descriptions-item label="医疗器械分类" v-if="_type==1306">
<el-input v-model="edit_data.extra.instrumentCategroy"></el-input>
</el-descriptions-item>
<el-descriptions-item label="上市许可持有人">
<el-input v-model="edit_data.extra.authorizationMaster"></el-input>
</el-descriptions-item>
<el-descriptions-item label="批准文号有效期" v-if="_type==1306">
<el-input v-model="edit_data.extra.approvalNumberExpirDate"></el-input>
</el-descriptions-item>
</el-descriptions>
</el-form>
</div>
</el-aside>
<el-aside width="350px" style="border-left: 1px #ddd solid">
<el-form style="width: 100%;" label-width="100px">
<el-descriptions title="定价" border direction="vertical" :column="2" style="margin-left: 5px">
<el-descriptions-item label="定价模式" width="180">
<el-select v-model="edit_data.pricingModel" placeholder="请选择">
<el-option <el-option
v-for="item in maintainOptions" v-for="item in pricingModelOptions"
:key="item.label" :key="item.value"
:label="item.label" :label="item.label"
:value="item.label" :value="item.value">
/> </el-option>
</el-select> </el-select>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="储存条件"> <el-descriptions-item label="加成率" v-if="edit_data.pricingModel==1">
<el-select <el-input v-model="edit_data.makeUp" type="number">
v-model="edit_data.extra.storageConditions" <template #append>%</template>
placeholder="选择养护分类" </el-input>
clearable
style="width: 240px;" </el-descriptions-item>
<el-descriptions-item label="零售价格" v-if="edit_data.pricingModel==2">
<el-input v-model="edit_data.unitPrice" type="number"
> >
<el-option <template #prefix></template>
v-for="item in storageConditionsOptions" <template #append>/{{ edit_data.packagingUnit }}</template>
:key="item.label"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="保质期">
<el-input v-model="edit_data.expiryTime" type="number">
<template #append></template>
</el-input> </el-input>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="柜号">
<el-input v-model="edit_data.extra.cabinetNumber">
</el-input>
</el-descriptions-item>
<el-descriptions-item label="用法用量" v-if="_type==1301">
<el-input v-model="edit_data.extra.usage">
</el-input>
</el-descriptions-item>
<el-descriptions-item label="处方药/OTC" v-if="_type==1301">
<el-select
v-model="edit_data.extra.drugCategory"
placeholder="选择药品分类"
clearable
style="width: 240px"
>
<el-option
v-for="item in drugCategoryOptions"
:key="item.label"
:label="item.label"
:value="item.label"
/>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="精麻毒放" v-if="_type==1301" >
<el-input v-model="edit_data.extra.JMDF"></el-input >
</el-descriptions-item>
<el-descriptions-item label="抗菌药物" v-if="_type==1301" >
<el-input v-model="edit_data.extra.isAntibacterialAgents"></el-input>
</el-descriptions-item>
<el-descriptions-item label="基药" v-if="_type==1301" > <el-descriptions-item>
<el-input v-model="edit_data.extra.baseMedicine"></el-input> <template #label>
</el-descriptions-item> <el-checkbox v-model="edit_data.trdnFlag" label="是否允许拆零" size="large"/>
<el-descriptions-item label="医疗器械分类" v-if="_type==1306" > </template>
<el-input v-model="edit_data.extra.instrumentCategroy"></el-input> <el-input v-model="edit_data.disassemblyPrice" type="number" :disabled="!edit_data.trdnFlag">
</el-descriptions-item> <template #prefix></template>
<el-descriptions-item label="上市许可持有人" > <template #append>/{{ edit_data.minPackagingUnit }}</template>
<el-input v-model="edit_data.extra.authorizationMaster"></el-input> </el-input>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="批准文号有效期" v-if="_type==1306" > </el-descriptions>
<el-input v-model="edit_data.extra.approvalNumberExpirDate"></el-input> <el-descriptions title="医保" border direction="vertical" :column="1" style="margin-left: 5px">
<el-descriptions-item label="医保对码">
<SocialInfo v-model="edit_data.hilistCode" v-if="edit_data.hilistCode"
@openSearch="openContrastCodeSearch"></SocialInfo>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-form> </el-form>
</div> </el-aside>
</el-aside> </el-container>
<el-aside width="350px" style="border-left: 1px #ddd solid"> </div>
<el-form style="width: 100%;" label-width="100px"> <template #footer>
<el-descriptions title="定价" border direction="vertical" :column="2" style="margin-left: 5px"> <div class="footer">
<el-descriptions-item label="定价模式" width="180"> <el-button @click="returnInit" type="primary" v-if="edit_data.id != null">医保库存重新初始化</el-button>
<el-select v-model="edit_data.pricingModel" placeholder="请选择"> <el-button @click="save" type="primary">保存</el-button>
<el-option <el-button @click="exit" plain>关闭</el-button>
v-for="item in pricingModelOptions" </div>
:key="item.value" </template>
:label="item.label" </Mask>
:value="item.value">
</el-option>
</el-select>
</el-descriptions-item>
<el-descriptions-item label="加成率" v-if="edit_data.pricingModel==1">
<el-input v-model="edit_data.makeUp" type="number">
<template #append>%</template>
</el-input>
</el-descriptions-item>
<el-descriptions-item label="零售价格" v-if="edit_data.pricingModel==2">
<el-input v-model="edit_data.unitPrice" type="number"
>
<template #prefix></template>
<template #append>/{{ edit_data.packagingUnit }}</template>
</el-input>
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<el-checkbox v-model="edit_data.trdnFlag" label="是否允许拆零" size="large"/>
</template>
<el-input v-model="edit_data.disassemblyPrice" type="number" :disabled="!edit_data.trdnFlag">
<template #prefix></template>
<template #append>/{{ edit_data.minPackagingUnit }}</template>
</el-input>
</el-descriptions-item>
</el-descriptions>
<el-descriptions title="医保" border direction="vertical" :column="1" style="margin-left: 5px">
<el-descriptions-item label="医保对码">
<SocialInfo v-model="edit_data.hilistCode" v-if="edit_data.hilistCode" @openSearch="openContrastCodeSearch"></SocialInfo>
</el-descriptions-item>
</el-descriptions>
</el-form>
</el-aside>
</el-container>
</div>
<!-- 新增关闭按钮 --> <!-- 新增关闭按钮 -->
<div class="footer">
<el-button @click="returnInit" type="primary" v-if="edit_data.id != null">医保库存重新初始化</el-button>
<el-button @click="save" type="primary">保存</el-button>
<el-button @click="exit" plain>关闭</el-button>
</div>
<Search ref="createSearchRef" @confirm="createConfirm"/> <Search ref="createSearchRef" @confirm="createConfirm"/>
<Search ref="contrastCodeSearch" @confirm="contrastCodeConfirm"/> <Search ref="contrastCodeSearch" @confirm="contrastCodeConfirm"/>
<Mask :width="400" :height="600" :is-show="show_cate"> <Cate :type="_type" @close="cateCloseCallBack"/>
<Cate :type="_type" @close="cateCloseCallBack"/>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -370,6 +371,7 @@ import SocialInfo from "@/components/inventory/goods/SocialInfo.vue";
let _type = ref(0); let _type = ref(0);
let type = ref(0); let type = ref(0);
let show_cate = ref(false) let show_cate = ref(false)
const isShow = ref<any>(false)
const imported = [{ const imported = [{
label: '进口', label: '进口',
}, {label: '国产'}] }, {label: '国产'}]
@ -458,6 +460,7 @@ const removeIdCode = (item: string) => {
showPopover.value = idCodeList.value.length > 0; showPopover.value = idCodeList.value.length > 0;
} }
const init = (type: number, id: number) => { const init = (type: number, id: number) => {
isShow.value = true
_type.value = type; _type.value = type;
if (id != null && id != 0) { if (id != null && id != 0) {
post("goods/goods/get", {id: id}).then((res: any) => { post("goods/goods/get", {id: id}).then((res: any) => {
@ -478,7 +481,7 @@ defineExpose({init});
const createSearchRef = ref<InstanceType<typeof Search>>(); const createSearchRef = ref<InstanceType<typeof Search>>();
const openCreateSearch = () => { const openCreateSearch = () => {
nextTick(() => { nextTick(() => {
createSearchRef.value?.init(_type.value,edit_data.value.name); createSearchRef.value?.init(_type.value, edit_data.value.name);
}); });
} }
const createConfirm = (data: any) => { const createConfirm = (data: any) => {
@ -487,7 +490,7 @@ const createConfirm = (data: any) => {
const contrastCodeSearch = ref() const contrastCodeSearch = ref()
const openContrastCodeSearch = () => { const openContrastCodeSearch = () => {
nextTick(() => { nextTick(() => {
contrastCodeSearch.value?.init(_type.value,edit_data.value.name); contrastCodeSearch.value?.init(_type.value, edit_data.value.name);
}); });
} }
const contrastCodeConfirm = (data: any) => { const contrastCodeConfirm = (data: any) => {
@ -525,6 +528,7 @@ const cateCloseCallBack = () => {
} }
let exit = () => { let exit = () => {
document.addEventListener("click", handleClickOutside); document.addEventListener("click", handleClickOutside);
isShow.value = false
emit('close'); emit('close');
} }
const handleClickOutside = (event: MouseEvent) => { const handleClickOutside = (event: MouseEvent) => {
@ -606,8 +610,6 @@ const drugCategoryOptions = [
] ]
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.header { .header {
@ -626,6 +628,7 @@ const drugCategoryOptions = [
.common-layout { .common-layout {
margin-top: 10px; margin-top: 10px;
padding: 0 24px 24px;
} }
.item { .item {
@ -661,14 +664,13 @@ const drugCategoryOptions = [
} }
.footer { .footer {
position: absolute; height: 100%;
right: 10px; display: flex;
bottom: 10px; justify-content: flex-end;
align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -1,108 +1,104 @@
<template> <template>
<Mask :width="800" :height="600" :is-show="show"> <Mask :width="800" :height="720" :is-show="show" :top="100" @close="show=false" title="药品" :show-footer="true">
<div class="search_content_wrapper"> <div class="search_content_wrapper">
<div class="search_wrapper"> <div class="search_wrapper">
<span>药品名称:</span> <span>药品名称:</span>
<el-input <el-input
class="input" class="input"
v-model="keyword" v-model="keyword"
placeholder="请输入药品名称或者编号" placeholder="请输入药品名称或者编号"
@keydown.enter="search_social" @keydown.enter="search_social"
clearable /> clearable/>
<button @click="search_social" >搜索</button> <el-button @click="search_social">搜索</el-button>
</div> </div>
<div class="search_result"> <div class="search_result">
<div class="result_table" style="width: 100%; height: 100%;overflow: hidden">
<div class="result_table" style="width: 100%; height: 100%;overflow: hidden"> <el-scrollbar>
<el-table v-loading="isloading" :data="search_result.list" style="width: 100%;height: 350px" <el-table v-loading="isloading" :data="search_result.list" style="width: 100%"
highlight-current-row @current-change="change_current_search_data_index" highlight-current-row @current-change="change_current_search_data_index"
:row-class-name="tableRowClassName"> :row-class-name="tableRowClassName">
<el-table-column prop="name" label="名称" fixed width="180" show-overflow-tooltip/> <el-table-column prop="name" label="名称" fixed width="180" show-overflow-tooltip/>
<el-table-column prop="json.approval_number" fixed label="国药准字" width="180" show-overflow-tooltip/> <el-table-column prop="json.approval_number" fixed label="国药准字" width="180" show-overflow-tooltip/>
<el-table-column prop="producer" label="生产企业" width="180" show-overflow-tooltip/> <el-table-column prop="producer" label="生产企业" width="180" show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.reg_specifications" label="注册规格" width="80" <el-table-column v-if="type==1301" prop="json.reg_specifications" label="注册规格" width="80"
show-overflow-tooltip/> show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_packaging_unit" label="包装单位" width="80" <el-table-column v-if="type==1301" prop="json.min_packaging_unit" label="包装单位" width="80"
show-overflow-tooltip/> show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_packaging_number" label="包装数量" width="80" <el-table-column v-if="type==1301" prop="json.min_packaging_number" label="包装数量" width="80"
show-overflow-tooltip/> show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_preparation_unit" label="制剂单位" width="80" <el-table-column v-if="type==1301" prop="json.min_preparation_unit" label="制剂单位" width="80"
show-overflow-tooltip/> show-overflow-tooltip/>
<el-table-column prop="code" label="医保编码" width="180" show-overflow-tooltip/> <el-table-column prop="code" label="医保编码" width="180" show-overflow-tooltip/>
<el-table-column prop="enddate" label="有效期至" width="180" show-overflow-tooltip/> <el-table-column prop="enddate" label="有效期至" width="180" show-overflow-tooltip/>
</el-table> </el-table>
<div class="page_btn_list"> </el-scrollbar>
<el-pagination background layout="prev, pager, next" :page-count="search_result.totalPage"
v-model:current-page="current_page" @current-change="change_page"/>
</div> </div>
</div> </div>
</div> </div>
<div class="search_bottom"> <template #footer>
<el-button type="primary" @click="confirm">确认</el-button> <div class="bottom">
<el-button type="primary" @click="close">关闭</el-button> <div class="page_btn_list">
</div> <el-pagination background layout="prev, pager, next" :page-count="search_result.total_page"
</div> v-model:current-page="current_page" @current-change="change_page"/>
</div>
<div class="btn">
<el-button type="primary" @click="confirm">确认</el-button>
<el-button type="primary" @click="close">关闭</el-button>
</div>
</div>
</template>
</Mask> </Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref,defineProps} from "vue"; import {onMounted, ref, defineProps} from "vue";
import {post} from '@/utils/request.ts' import {post} from '@/utils/request.ts'
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
let current_search_data: any = null; let current_search_data: any = null;
let keyword = ref(''); let keyword = ref('');
let produce=ref(""); let produce = ref("");
let type = ref(0); let type = ref(0);
let current_page=ref(1) let current_page = ref(1)
const show = ref(false); const show = ref(false);
const emit = defineEmits(["confirm"]) const emit = defineEmits(["confirm"])
let search_result = ref({ let search_result = ref({
totalPage: 0, total_page: 0,
list: [], list: [],
pageNum: 1, page: 1,
}); });
let tableRowClassName = (res: any) => { let tableRowClassName = (res: any) => {
if(current_search_data!=null && current_search_data.id==res.row.id){ if (current_search_data != null && current_search_data.id == res.row.id) {
return 'invalid'; return 'invalid';
} }
return 'valid' return 'valid'
} }
let change_page=(page:number)=>{ let change_page = (page: number) => {
search_social() search_social()
} }
onMounted(() => {
})
const change_current_search_data_index = (val: any) => { const change_current_search_data_index = (val: any) => {
current_search_data = JSON.parse(JSON.stringify(val)); current_search_data = JSON.parse(JSON.stringify(val));
// proos.changeData(current_search_data) // proos.changeData(current_search_data)
} }
const init = (_type: number,_name:string) => { const init = (_type: number, _name: string) => {
type.value = _type; type.value = _type;
keyword.value=_name; keyword.value = _name;
show.value = true; show.value = true;
init_search_data()
debugger
if (keyword.value && keyword.value != ""){
search_social()
}
}; };
defineExpose({init}); defineExpose({init});
function init_search_data() { function init_search_data() {
isloading.value=false; isloading.value = false;
current_search_data = null; current_search_data = null;
// proos.changeData(null) // proos.changeData(null)
search_result.value = { search_result.value = {
totalPage: 0, total_page: 0,
list: [], list: [],
pageNum: 1, page: 1,
} }
} }
@ -123,24 +119,30 @@ let confirm = () => {
minPackagingUnit: jsondata.min_preparation_unit, minPackagingUnit: jsondata.min_preparation_unit,
expiryTime: 10, expiryTime: 10,
approvalCode: jsondata.approval_number || jsondata.reg_number || '', approvalCode: jsondata.approval_number || jsondata.reg_number || '',
medicineDosageUnit:jsondata.min_measure_unit, medicineDosageUnit: jsondata.min_measure_unit,
medicineDosageNum:jsondata.specification, medicineDosageNum: jsondata.specification,
extra: { extra: {
regType: jsondata.reg_type, regType: jsondata.reg_type,
approvalNumber: jsondata.approval_number, approvalNumber: jsondata.approval_number,
category:jsondata.category category: jsondata.category
} }
} }
emit('confirm',data) emit('confirm', data)
show.value = false; show.value = false;
} }
let isloading=ref(false); let isloading = ref(false);
let search_social = () => { let search_social = () => {
isloading.value=true; isloading.value = true;
post("social/directory/search", {keyword: keyword.value,produce:produce.value, page: current_page.value, size: 20, type: type.value}, {catch_error: true}).then((res: any) => { post("social/directory/search", {
keyword: keyword.value,
produce: produce.value,
page: current_page.value,
size: 20,
type: type.value
}, {catch_error: true}).then((res: any) => {
init_search_data() init_search_data()
let list = res.list; let list = res.list;
for (let i = 0; i < list.length; i++) { for (let i = 0; i < list.length; i++) {
@ -158,12 +160,12 @@ let search_social = () => {
} }
search_result.value = { search_result.value = {
totalPage: res.total_page, total_page: res.total_page,
list: list, list: list,
pageNum: 1, page: 1,
} }
}).catch(()=>{ }).catch(() => {
isloading.value=false; isloading.value = false;
}) })
} }
const close = () => { const close = () => {
@ -171,53 +173,62 @@ const close = () => {
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.search_bottom { .bottom {
display: block; display: flex;
margin-top: 10px; padding: 0 24px;
justify-content: space-between;
margin-top: 20px;
} }
.search_content_wrapper { .search_content_wrapper {
height: 522px;
background-color: #FFF; background-color: #FFF;
width: 100%; width: 100%;
height: 100%;
overflow: hidden;
margin: auto;
margin-top: 20px;
border-radius: 10px;
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 0 24px;
} margin-top: 24px;
.search_wrapper {
position: relative;
width: 100%;
display: flex; display: flex;
margin: 0 auto; flex-direction: column;
height: 60px;
span{ .search_wrapper {
position: relative; position: relative;
display: block; width: 100%;
width: 100px; display: flex;
text-align: right; margin: 0 auto;
line-height: 40px; height: 60px;
span {
position: relative;
display: block;
width: 100px;
text-align: right;
line-height: 40px;
}
.input {
display: block;
flex: 1;
}
button {
width: 80px;
line-height: 40px;
color: #FFF;
margin-left: 10px;
height: 40px;
background-color: #409EFF;
border: none;
}
} }
.input{ .search_result {
display: block;
flex: 1; flex: 1;
} min-height: 0;
button {
width: 80px;
line-height: 40px;
color: #FFF;
margin-left: 10px;
height: 40px;
background-color: #409EFF;
border: none;
} }
} }
:deep(.invalid) { :deep(.invalid) {
color: #409EFF; color: #409EFF;
} }

View File

@ -1,71 +1,77 @@
<template> <template>
<div class="add-supplier" style="width:100%;margin-top: 24px"> <Mask :width="540" :height="603" :is-show="isShow" :top="100" @close="close" :title="id?'编辑':'添加供应商'" :show-footer="true">
<div class="form"> <div class="add-supplier" style="width:100%;margin-top: 24px;padding: 0 24px">
<el-form style="width: 100%" ref="ruleFormRef" :model="formData" :inline=true label-position="top"> <div class="form">
<el-form-item label="供货商名称" style="width: 100%;margin-right: 0"> <el-form style="width: 100%" ref="ruleFormRef" :model="formData" :inline=true label-position="top">
<el-input style="width: 100%" v-model="formData.name" placeholder="请输入供货商名称"></el-input> <el-form-item label="供货商名称" style="width: 100%;margin-right: 0">
</el-form-item> <el-input style="width: 100%" v-model="formData.name" placeholder="请输入供货商名称"></el-input>
<el-row style="width: 100%"> </el-form-item>
<el-col :span="12"> <el-row style="width: 100%">
<el-form-item label="启用状态"> <el-col :span="12">
<el-radio-group v-model="formData.turn" size="large"> <el-form-item label="启用状态">
<el-radio-button label="禁用" :value="0"/> <el-radio-group v-model="formData.turn" size="large">
<el-radio-button label="启用" :value="1"/> <el-radio-button label="禁用" :value="0"/>
</el-radio-group> <el-radio-button label="启用" :value="1"/>
</el-form-item> </el-radio-group>
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item label="许可证号" style="margin-right: 0"> <el-col :span="12">
<el-input v-model="formData.licenseCode" placeholder="请输入许可证号"></el-input> <el-form-item label="许可证号" style="margin-right: 0">
</el-form-item> <el-input v-model="formData.licenseCode" placeholder="请输入许可证号"></el-input>
</el-col> </el-form-item>
</el-row> </el-col>
<el-row style="width: 100%"> </el-row>
<el-col :span="12"> <el-row style="width: 100%">
<el-form-item label="联系人"> <el-col :span="12">
<el-input v-model="formData.contactName" placeholder="请输入联系人名称"></el-input> <el-form-item label="联系人">
</el-form-item> <el-input v-model="formData.contactName" placeholder="请输入联系人名称"></el-input>
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item label="联系方式" style="margin-right: 0"> <el-col :span="12">
<el-input v-model="formData.contactTel" placeholder="请输入联系方式"></el-input> <el-form-item label="联系方式" style="margin-right: 0">
</el-form-item> <el-input v-model="formData.contactTel" placeholder="请输入联系方式"></el-input>
</el-col> </el-form-item>
</el-row> </el-col>
<el-form-item label="备注" style="margin-right: 0;width: 100%"> </el-row>
<el-input v-model="formData.reamark" <el-form-item label="备注" style="margin-right: 0;width: 100%">
type="textarea" rows="5" <el-input v-model="formData.reamark"
max="200" type="textarea" rows="5"
show-word-limit max="200"
placeholder="请输入备注" show-word-limit
style="width: 100%" placeholder="请输入备注"
> style="width: 100%"
</el-input> >
</el-form-item> </el-input>
</el-form> </el-form-item>
</el-form>
</div>
</div> </div>
</div> <template #footer>
<div class="btn"> <div class="bottom">
<el-button type="primary" @click="save">确定</el-button> <el-button type="primary" @click="save">确定</el-button>
<el-button @click="close">取消</el-button> <el-button @click="close">取消</el-button>
</div> </div>
</template>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from "vue"; import {ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue"; import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
const formData = ref({ const formData = ref({
name: null, name: null,
turn: 1, turn: 0,
contactName: null, contactName: null,
contactTel: null, contactTel: null,
reamark: null, reamark: null,
licenseCode: null, licenseCode: null,
}) })
const errorMsg = ref('') const errorMsg = ref('')
const emit = defineEmits(['close', 'saveSuccess']) const isShow = ref(false)
const emit = defineEmits(['close'])
const save = () => { const save = () => {
if (formData.value.name === '' || formData.value.name === null) { if (formData.value.name === '' || formData.value.name === null) {
@ -73,15 +79,19 @@ const save = () => {
return return
} }
post("inventory/supplier/save", {inventorySupplier: formData.value}).then((res: any) => { post("inventory/supplier/save", {inventorySupplier: formData.value}).then((res: any) => {
emit('saveSuccess')
close() close()
}) })
} }
const id = ref<any>(null)
const edit = (supplierData: any) => { const editInit = (supplierData: any) => {
isShow.value = true
id.value = supplierData.id
formData.value = supplierData formData.value = supplierData
} }
defineExpose({edit}) const addInit = () => {
isShow.value = true
}
defineExpose({addInit, editInit})
const close = () => { const close = () => {
formData.value = { formData.value = {
@ -93,14 +103,19 @@ const close = () => {
licenseCode: null, licenseCode: null,
} }
errorMsg.value = '' errorMsg.value = ''
isShow.value = false
id.value = null
emit('close') emit('close')
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.btn { .bottom {
position: absolute; height: 100%;
right: 10px; display: flex;
bottom: 10px; justify-content: flex-end;
align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -2,23 +2,19 @@
<Panel :title="'服务项目'"> <Panel :title="'服务项目'">
<div class="content"> <div class="content">
<div class="list"> <div class="list">
<ul> <ul>
<li class="item" v-for="(item, index) in list" :key="index"> <li class="item" v-for="(item, index) in list" :key="index">
<span class="index">{{ index + 1 }}</span> <span class="index">{{ index + 1 }}</span>
<span class="name">{{ item.itemName }}</span> <span class="name">{{ item.itemName }}</span>
<span class="price">{{ item.unitPrice }}</span> <span class="code">{{ item.itemSocialCode }}</span>
<span class="code">{{ item.itemSocialCode }}</span> <span class="price">{{ item.unitPrice }}</span>
<span class="unit"> <span class="delete">
<el-input-number v-model="item.selectedNum" min="1"></el-input-number> <el-button text @click="deleteItem(item.id)">
<span style="line-height: 30px;margin-left: 10px">{{ item.unit }}</span>
</span>
<span class="delete">
<el-button @click="deleteItem(item.id)">
<el-icon><CircleClose/></el-icon> <el-icon><CircleClose/></el-icon>
</el-button> </el-button>
</span> </span>
</li> </li>
</ul> </ul>
</div> </div>
<div class="search"> <div class="search">
<div class="search-input"> <div class="search-input">
@ -30,7 +26,7 @@
> >
</SearchInput> </SearchInput>
</div> </div>
<span style="margin-right: 24px">{{ list.reduce((acc, cur) => acc + cur.unitPrice*cur.selectedNum, 0) }}</span></div> <span style="margin-right: 24px">{{ list.reduce((acc, cur) => acc + cur.unitPrice, 0) }}</span></div>
</div> </div>
</Panel> </Panel>
</template> </template>
@ -55,7 +51,6 @@ const serviceShowConfig = [
}, },
] ]
const serviceSelect = (row: any) => { const serviceSelect = (row: any) => {
row.selectedNum = 1
list.value.push(row) list.value.push(row)
} }
@ -80,40 +75,35 @@ const deleteItem = (id: any) => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.index{
.index {
height: 100%; height: 100%;
width: 50px; width: 50px;
text-align: center; text-align: center;
border-right: 1px solid #EAEAEC; border-right: 1px solid #EAEAEC;
line-height: 64px; line-height: 64px;
} }
.name{
.name {
flex: 1; flex: 1;
margin-left: 10px; margin-left: 10px;
border-right: 1px solid #EAEAEC; border-right: 1px solid #EAEAEC;
height: 100%; height: 100%;
line-height: 64px; line-height: 64px;
} }
.code{
.code {
flex: 1; flex: 1;
margin-left: 10px; margin-left: 10px;
border-right: 1px solid #EAEAEC; border-right: 1px solid #EAEAEC;
height: 100%; height: 100%;
line-height: 64px; line-height: 64px;
} }
.price{
.price {
height: 100%; height: 100%;
width: 200px; width: 200px;
line-height: 64px; line-height: 64px;
border-right: 1px solid #EAEAEC; border-right: 1px solid #EAEAEC;
text-align: center; text-align: center;
} }
.delete{
.delete {
height: 100%; height: 100%;
width: 50px; width: 50px;
line-height: 64px; line-height: 64px;
@ -127,7 +117,6 @@ const deleteItem = (id: any) => {
border-top: 1px solid #EAEAEC; border-top: 1px solid #EAEAEC;
display: flex; display: flex;
align-items: center; align-items: center;
.search-input { .search-input {
height: 100%; height: 100%;
flex: 1; flex: 1;

View File

@ -33,7 +33,7 @@
<el-form-item> <el-form-item>
<el-input v-model="form.purchaseUnitPrice"> <el-input v-model="form.purchaseUnitPrice">
<template #append> <template #append>
<el-button @click="imageURL"></el-button> <el-button text @click="imageURL"></el-button>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -42,7 +42,7 @@
<el-form-item> <el-form-item>
<el-input v-model="form.unitPrice"> <el-input v-model="form.unitPrice">
<template #append> <template #append>
<el-button @click="imageURL"></el-button> <el-button type="text" @click="imageURL"></el-button>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -56,12 +56,12 @@
</el-form> </el-form>
</div> </div>
<ItemSearch ref="createSearchRef" @confirm="selectedCallBack"/> <Search ref="createSearchRef" @confirm="createConfirm"/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {defineProps, defineEmits, ref, nextTick, onMounted} from 'vue' import {defineProps, defineEmits, ref, nextTick, onMounted} from 'vue'
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import ItemSearch from "./ItemSearch.vue"; import Search from "./Search.vue";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
const props = defineProps({ const props = defineProps({
@ -130,11 +130,11 @@ const openCreateSearch = () => {
createSearchRef.value?.init(form.value.itemName); createSearchRef.value?.init(form.value.itemName);
}); });
} }
const selectedCallBack = (searchResult: any) => { const createConfirm = (data: any) => {
console.log(searchResult, 'data') console.log(data, 'data')
form.value.itemName = searchResult.name; form.value = data
form.value.itemSocialCode = searchResult.code; form.value.itemName = data.name
form.value.unit = searchResult.unit; form.value.itemSocialCode = data.hilistCode
} }
const deleteDetail = () => { const deleteDetail = () => {
post("item/delete", {id: props.id}).then((res: any) => { post("item/delete", {id: props.id}).then((res: any) => {

View File

@ -1,121 +1,139 @@
<template> <template>
<el-form :model="userInfo" label-width="auto" :rules="rules" ref="ruleFormRef"> <Mask :is-show="isShow" @close="exit" :width="800" :height="600" title="成员管理" :show-footer="true">
<el-descriptions <div style="padding: 24px">
title="基本信息" <el-form :model="userInfo" label-width="auto" :rules="rules" ref="ruleFormRef">
:column="3" <el-descriptions
direction="vertical" title="基本信息"
border :column="3"
> direction="vertical"
<el-descriptions-item label="账号"> border
<el-form-item prop="username"> >
<el-input v-model="userInfo.username"/> <el-descriptions-item label="账号">
</el-form-item> <el-form-item prop="username">
</el-descriptions-item> <el-input v-model="userInfo.username"/>
<el-descriptions-item label="密码"> </el-form-item>
<el-form-item prop="password"> </el-descriptions-item>
<el-input v-model="userInfo.password" show-password/> <el-descriptions-item label="密码">
</el-form-item> <el-form-item prop="password">
</el-descriptions-item> <el-input v-model="userInfo.password" show-password/>
<el-descriptions-item label="用户名"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="userInfo.name"/> <el-descriptions-item label="用户名">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="userInfo.name"/>
</el-descriptions> </el-form-item>
</el-form> </el-descriptions-item>
<el-form :model="memberInfo" label-width="auto"> </el-descriptions>
<el-descriptions </el-form>
title="扩展信息" <el-form :model="memberInfo" label-width="auto">
:column="3" <el-descriptions
direction="vertical" title="扩展信息"
border :column="3"
> direction="vertical"
<el-descriptions-item label="姓名"> border
<el-form-item> >
<el-input v-model="memberInfo.name"/> <el-descriptions-item label="姓名">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="memberInfo.name"/>
<el-descriptions-item label="性别"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="memberInfo.gender"/> <el-descriptions-item label="性别">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-select
<el-descriptions-item label="年龄"> v-model="memberInfo.gender"
<el-form-item> placeholder="选择性别"
<el-input v-model="memberInfo.age"/> >
</el-form-item> <el-option
</el-descriptions-item> v-for="item in ['男', '女']"
<el-descriptions-item label="手机号"> :key="item"
<el-form-item> :label="item"
<el-input v-model="memberInfo.tel"/> :value="item"
</el-form-item> />
</el-descriptions-item> </el-select>
<el-descriptions-item label="角色"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-select <el-descriptions-item label="年龄">
v-model="memberInfo.role" <el-form-item>
placeholder="选择角色" <el-input v-model="memberInfo.age"/>
size="large" </el-form-item>
> </el-descriptions-item>
<el-option <el-descriptions-item label="手机号">
v-for="item in roleList" <el-form-item>
:key="item.value" <el-input v-model="memberInfo.tel"/>
:label="item.label" </el-form-item>
:value="item.value" </el-descriptions-item>
/> <el-descriptions-item label="角色">
</el-select> <el-form-item>
</el-form-item> <el-select
</el-descriptions-item> v-model="memberInfo.role"
<el-descriptions-item label="身份证号"> placeholder="选择角色"
<el-form-item> size="large"
<el-input v-model="memberInfo.idCardNumber"/> >
</el-form-item> <el-option
</el-descriptions-item> v-for="item in roleList"
<el-descriptions-item label="科室"> :key="item.value"
<el-form-item> :label="item.label"
<el-select :value="item.value"
v-model="memberInfo.sectionId" />
placeholder="选择科室" </el-select>
> </el-form-item>
<el-option </el-descriptions-item>
v-for="item in sectionList" <el-descriptions-item label="身份证号">
:key="item.id" <el-form-item>
:label="item.name" <el-input v-model="memberInfo.idCardNumber"/>
:value="item.id" </el-form-item>
/> </el-descriptions-item>
</el-select> <el-descriptions-item label="科室">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-select
<el-descriptions-item label="医保人员代码"> v-model="memberInfo.sectionId"
<el-form-item> placeholder="选择科室"
<el-input v-model="memberInfo.socialMemberCode"/> >
</el-form-item> <el-option
</el-descriptions-item> v-for="item in sectionList"
<el-descriptions-item label="备注"> :key="item.id"
<el-form-item> :label="item.name"
<el-input v-model="memberInfo.memo"/> :value="item.id"
</el-form-item> />
</el-descriptions-item> </el-select>
<el-descriptions-item label="电子签名"> </el-form-item>
<el-form-item> </el-descriptions-item>
<UpLoad v-model="uploadURL" ref="uploadRef" @uploadSuccess="(url)=>{memberInfo.electronicSignature=url}"></UpLoad> <el-descriptions-item label="医保人员代码">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="memberInfo.socialMemberCode"/>
</el-descriptions> </el-form-item>
<div class="demo-button"> </el-descriptions-item>
<el-button type="primary" @click="save()">保存</el-button> <el-descriptions-item label="备注">
<el-button @click="onSubmit">取消</el-button> <el-form-item>
<el-button v-if="props.id" type="danger" @click="deleteDetail">删除</el-button> <el-input v-model="memberInfo.memo"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子签名">
<el-form-item>
<UpLoad v-model="uploadURL" ref="uploadRef"
@uploadSuccess="(url)=>{memberInfo.electronicSignature=url}"></UpLoad>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
</div> </div>
</el-form> <template #footer>
<div class="bottom">
<el-button type="primary" @click="save()">保存</el-button>
<el-button @click="exit">取消</el-button>
<el-button v-if="props.id" type="danger" @click="deleteDetail">删除</el-button>
</div>
</template>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {defineProps, defineEmits, ref, onMounted} from 'vue' import {defineProps, defineEmits, ref, onMounted} from 'vue'
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {loadConfig} from "@/utils/config.ts"; import {loadConfig} from "@/utils/config.ts";
import depts from "@/assets/config/directory/depts.json"
import UpLoad from "@/components/UpLoad.vue"; import UpLoad from "@/components/UpLoad.vue";
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import Mask from "@/components/common/Mask.vue";
const props = defineProps({ const props = defineProps({
id: { id: {
@ -170,77 +188,65 @@ const memberInfo = ref<any>({
memo: '',// memo: '',//
password: "", password: "",
}) })
const userInfo= ref<any>({ const userInfo = ref<any>({
username: "", // username: "", //
name: "", name: "",
password: "", password: "",
}) })
const rules= { const rules = {
username: [ username: [
{required: true, message: '请输入账号', trigger: 'blur'}, {required: true, message: '请输入账号', trigger: 'blur'},
], ],
password: [ password: [
{required: true, message: '请输入密码', trigger: 'blur'}, {required: true, message: '请输入密码', trigger: 'blur'},
], ],
}
const emit = defineEmits(['onSubmit'])
const onSubmit = () => {
emit('onSubmit')
} }
const ruleFormRef= ref<any>('') const isShow = ref(false)
const emit = defineEmits(['close'])
const exit = () => {
memberInfo.value = {}
userInfo.value = {}
isShow.value = false
emit('close')
}
const ruleFormRef = ref<any>('')
const save = () => { const save = () => {
let form={ let form = {
memberInfo:memberInfo.value, memberInfo: memberInfo.value,
userInfo:userInfo.value, userInfo: userInfo.value,
} }
ruleFormRef.value.validate((valid: any) => { ruleFormRef.value.validate((valid: any) => {
if (valid) { if (valid) {
if (props.id) { if (props.id) {
post("organization/member/edit", {data: form}).then((res) => { post("organization/member/edit", {data: form}).then(() => {
onSubmit() exit()
memberInfo.value = {} ElMessage.success('已修改')
userInfo.value = {}
}) })
} else { } else {
post("organization/member/add", {data: form}).then((res) => { post("organization/member/add", {data: form}).then(() => {
onSubmit() exit()
memberInfo.value = {} ElMessage.success('已添加')
}) })
} }
} }
}) })
} }
const options = Object.entries(depts).map(([key, value]) => {
if (typeof value === 'string') {
return {value: key, label: value};
} else {
return {
value: key,
label: value.name,
children: Object.entries(value.children).map(([childKey, childValue]) => ({
value: childKey,
label: childValue,
})),
};
}
});
const uploadRef = ref<any>('') const uploadRef = ref<any>('')
const init = (id: any) => { const getById = () => {
memberInfo.value = {} memberInfo.value = {}
userInfo.value = {} userInfo.value = {}
post("organization/member/getById", {id}).then((res: any) => { post("organization/member/getById", {id: props.id}).then((res: any) => {
memberInfo.value = res.memberInfo memberInfo.value = res.memberInfo
if(res.userInfo){ if (res.userInfo) {
userInfo.value = res.userInfo userInfo.value = res.userInfo
} }
if(memberInfo.value.electronicSignature){ if (memberInfo.value.electronicSignature) {
uploadRef.value?.getImageUrl(memberInfo.value.electronicSignature) uploadRef.value?.getImageUrl(memberInfo.value.electronicSignature)
} }
}) })
} }
const uploadURL = ref('') const uploadURL = ref('')
const imageURL= ref('')
onMounted(() => { onMounted(() => {
loadConfig().then((res: any) => { loadConfig().then((res: any) => {
uploadURL.value = res.base_url + "file/upload"; uploadURL.value = res.base_url + "file/upload";
@ -254,17 +260,25 @@ const list = () => {
}) })
} }
const deleteDetail = () => { const deleteDetail = () => {
post("organization/member/delete", {id: props.id}).then((res: any) => { post("organization/member/delete", {id: props.id}).then(() => {
onSubmit() exit()
ElMessage.error('已删除'); ElMessage.error('已删除');
}) })
} }
const init = () => {
isShow.value = true
if(props.id){
getById()
}
}
defineExpose({init}) defineExpose({init})
</script> </script>
<style scoped> <style scoped>
.demo-button { .bottom {
height: 100%;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin-top: 20px; align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -0,0 +1,230 @@
<template>
<Mask :width="800" :height="600" :is-show="show" :top="100">
<div class="search_content_wrapper">
<div class="search_wrapper">
<span>项目名称:</span>
<el-input
class="input"
v-model="keyword"
placeholder="请输入药品名称或者编号"
@keydown.enter="search_social"
clearable/>
<button @click="search_social">搜索</button>
</div>
<div class="search_result">
<div class="result_table" style="width: 100%; height: 100%;overflow: hidden">
<el-table v-loading="isloading" :data="search_result.list" style="width: 100%;height: 350px"
highlight-current-row @current-change="change_current_search_data_index"
:row-class-name="tableRowClassName">
<el-table-column prop="name" label="名称" fixed width="180" show-overflow-tooltip/>
<el-table-column prop="json.approval_number" fixed label="国药准字" width="180" show-overflow-tooltip/>
<el-table-column prop="producer" label="生产企业" width="180" show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.reg_specifications" label="注册规格" width="80"
show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_packaging_unit" label="包装单位" width="80"
show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_packaging_number" label="包装数量" width="80"
show-overflow-tooltip/>
<el-table-column v-if="type==1301" prop="json.min_preparation_unit" label="制剂单位" width="80"
show-overflow-tooltip/>
<el-table-column prop="code" label="医保编码" width="180" show-overflow-tooltip/>
<el-table-column prop="enddate" label="有效期至" width="180" show-overflow-tooltip/>
</el-table>
<div class="page_btn_list">
<el-pagination background layout="prev, pager, next" :page-count="search_result.total_page"
v-model:current-page="current_page" @current-change="change_page"/>
</div>
</div>
</div>
<div class="search_bottom">
<el-button type="primary" @click="confirm">确认</el-button>
<el-button type="primary" @click="close">关闭</el-button>
</div>
</div>
</Mask>
</template>
<script setup lang="ts">
import {onMounted, ref, defineProps} from "vue";
import {post} from '@/utils/request.ts'
import Mask from "@/components/common/Mask.vue";
let current_search_data: any = null;
let keyword = ref('');
let produce = ref("");
let type = ref(0);
let current_page = ref(1)
const show = ref(false);
const emit = defineEmits(["confirm"])
let search_result = ref({
total_page: 0,
list: [],
page: 1,
});
let tableRowClassName = (res: any) => {
if (current_search_data != null && current_search_data.id == res.row.id) {
return 'invalid';
}
return 'valid'
}
let change_page = (page: number) => {
search_social()
}
// onMounted(() => {
// search_social()
// })
const change_current_search_data_index = (val: any) => {
current_search_data = JSON.parse(JSON.stringify(val));
console.log(current_search_data.id)
// proos.changeData(current_search_data)
}
const init = (_name: string) => {
keyword.value = _name;
show.value = true;
init_search_data()
search_social()
};
defineExpose({init});
function init_search_data() {
isloading.value = false;
current_search_data = null;
search_result.value = {
total_page: 0,
list: [],
page: 1,
}
}
let confirm = () => {
let jsondata = current_search_data.json;
let data = {
id: null,
type: null,
name: jsondata.name,
commonName: jsondata.common_name,
hilistCode: jsondata.code,
unitPrice: null,
purchaseUnitPrice: null,
producer: jsondata.producer,
barcode: null,
minPackagingNumber: jsondata.min_packaging_number,
packagingUnit: jsondata.min_packaging_unit,
minPackagingUnit: jsondata.min_preparation_unit,
expiryTime: 10,
approvalCode: jsondata.approval_number || jsondata.reg_number || '',
medicineDosageUnit: jsondata.min_measure_unit,
medicineDosageNum: jsondata.specification,
extra: {
regType: jsondata.reg_type,
approvalNumber: jsondata.approval_number,
category: jsondata.category
}
}
console.log("data", data)
emit('confirm', data)
show.value = false;
}
let isloading = ref(false);
let search_social = () => {
isloading.value = true;
post("social/directory/search", {
keyword: keyword.value,
}, {catch_error: true}).then((res: any) => {
init_search_data()
let list = res.list;
for (let i = 0; i < list.length; i++) {
let end_datetime = list[i].enddate;
//
if (new Date().getTime() < new Date(end_datetime).getTime() || end_datetime == "" || end_datetime == null) {
let time_diff = new Date(end_datetime).getTime() - new Date().getTime();
// list[i].data.is_valid = true
} else {
// list[i].data.is_valid = false
}
if (end_datetime == "" || end_datetime == null) {
list[i].enddate = "长期有效";
}
}
search_result.value = {
total_page: res.total_page,
list: list,
page: 1,
}
}).catch(() => {
isloading.value = false;
})
}
const close = () => {
show.value = false;
}
</script>
<style scoped lang="scss">
.search_bottom {
display: block;
margin-top: 10px;
}
.search_content_wrapper {
background-color: #FFF;
width: 100%;
height: 100%;
overflow: hidden;
margin: auto;
margin-top: 24px;
border-radius: 10px;
box-sizing: border-box;
padding: 10px;
}
.search_wrapper {
position: relative;
width: 100%;
display: flex;
margin: 0 auto;
height: 60px;
span {
position: relative;
display: block;
width: 100px;
text-align: right;
line-height: 40px;
}
.input {
display: block;
flex: 1;
}
button {
width: 80px;
line-height: 40px;
color: #FFF;
margin-left: 10px;
height: 40px;
background-color: #409EFF;
border: none;
}
}
:deep(.invalid) {
color: #409EFF;
}
.search_result {
width: 100%;
height: 400px;
}
</style>

View File

@ -1,121 +1,130 @@
<template> <template>
<el-form :model="form" label-width="auto"> <Mask :is-show="isShow" @close="exit" :height="570" :title="props.id?'编辑':'新增'" :show-footer="true">
<el-descriptions <div style="padding: 24px">
:column="4" <el-form :model="form" label-width="auto">
direction="vertical" <el-descriptions
border :column="4"
> direction="vertical"
<el-descriptions-item label="科室名称"> border
<el-form-item> >
<el-input v-model="form.name"/> <el-descriptions-item label="科室名称">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.name"/>
<el-descriptions-item label="科室类别"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-cascader :props="{ checkStrictly: true }" v-model="form.caty" :options="options"/> <el-descriptions-item label="科室类别">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-cascader :props="{ checkStrictly: true }" v-model="form.caty" :options="options"/>
<el-descriptions-item label="开始日期"> </el-form-item>
<el-form-item> </el-descriptions-item>
<div class="demo-date-picker"> <el-descriptions-item label="开始日期">
<el-date-picker <el-form-item>
v-model="form.beginDate" <div class="demo-date-picker">
type="date" <el-date-picker
placeholder="请选择开始日期" v-model="form.beginDate"
/> type="date"
</div> placeholder="请选择开始日期"
</el-form-item> />
</el-descriptions-item> </div>
<el-descriptions-item label="结束日期"> </el-form-item>
<el-form-item> </el-descriptions-item>
<div class="demo-date-picker"> <el-descriptions-item label="结束日期">
<el-date-picker <el-form-item>
v-model="form.endDate" <div class="demo-date-picker">
type="date" <el-date-picker
placeholder="请选择结束日期" v-model="form.endDate"
/> type="date"
</div> placeholder="请选择结束日期"
</el-form-item> />
</el-descriptions-item> </div>
<el-descriptions-item label="成立时间"> </el-form-item>
<el-form-item> </el-descriptions-item>
<div class="demo-date-picker"> <el-descriptions-item label="成立时间">
<el-date-picker <el-form-item>
v-model="form.creationDate" <div class="demo-date-picker">
type="date" <el-date-picker
placeholder="请选择成立时间" v-model="form.creationDate"
:default-value="new Date(2010, 9, 1)" type="date"
/> placeholder="请选择成立时间"
</div> :default-value="new Date(2010, 9, 1)"
</el-form-item> />
</el-descriptions-item> </div>
<el-descriptions-item label="简介"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.info" :show-word-limit="true" :clearable="true" :size="'large'"/> <el-descriptions-item label="简介">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.info" type="text" :show-word-limit="true" :clearable="true" :size="'large'"/>
<el-descriptions-item label="负责人姓名"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.resperName"/> <el-descriptions-item label="负责人姓名">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.resperName"/>
<el-descriptions-item label="负责人电话"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.resperTel"/> <el-descriptions-item label="负责人电话">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.resperTel"/>
<el-descriptions-item label="医疗服务范围"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.medServScp"/> <el-descriptions-item label="医疗服务范围">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.medServScp"/>
<el-descriptions-item label="批准床位数"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.bedCnt" type="number"/> <el-descriptions-item label="批准床位数">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.bedCnt" type="number"/>
<el-descriptions-item label="医保认可床位数量"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model.number="form.socialBedCnt" type="number"/> <el-descriptions-item label="医保认可床位数量">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model.number="form.socialBedCnt" type="number"/>
<el-descriptions-item label="医师人数"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model.number="form.drPsncnt" type="number"/> <el-descriptions-item label="医师人数">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model.number="form.drPsncnt" type="number"/>
<el-descriptions-item label="药师人数"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model.number="form.pharPsncnt" type="number"/> <el-descriptions-item label="药师人数">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model.number="form.pharPsncnt" type="number"/>
<el-descriptions-item label="护士人数"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model.number="form.nursPsncnt" type="number"/> <el-descriptions-item label="护士人数">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model.number="form.nursPsncnt" type="number"/>
<el-descriptions-item label="技术人员人数"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model.number="form.tecnPsncnt" type="number"/> <el-descriptions-item label="技术人员人数">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model.number="form.tecnPsncnt" type="number"/>
<el-descriptions-item label="备注"> </el-form-item>
<el-form-item> </el-descriptions-item>
<el-input v-model="form.memo" :show-word-limit="true" :clearable="true" /> <el-descriptions-item label="备注">
</el-form-item> <el-form-item>
</el-descriptions-item> <el-input v-model="form.memo" type="text" :show-word-limit="true" :clearable="true"/>
</el-descriptions> </el-form-item>
<div class="demo-button"> </el-descriptions-item>
<el-button type="primary" @click="save()">保存</el-button> </el-descriptions>
<el-button @click="onSubmit">取消</el-button> </el-form>
<el-button v-if="props.id" @click="deleteDetail" type="danger">删除</el-button>
</div> </div>
</el-form> <template #footer>
<div class="bottom">
<el-button type="primary" @click="save()">保存</el-button>
<el-button @click="exit">取消</el-button>
<el-button v-if="props.id" @click="deleteDetail" type="danger">删除</el-button>
</div>
</template>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {defineProps, onMounted, ref} from 'vue' import {defineProps, onMounted, ref} from 'vue'
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import depts from "@/assets/config/directory/depts.json" import depts from "@/assets/config/directory/depts.json"
import Mask from "@/components/common/Mask.vue";
import {ElMessage} from "element-plus";
// do not use same name with ref // do not use same name with ref
const props = defineProps({ const props = defineProps({
@ -142,21 +151,29 @@ const form = ref<any>({
tecnPsncnt: '', tecnPsncnt: '',
memo: '', memo: '',
}) })
const isShow = ref<any>(false)
const emit = defineEmits(['onSubmit']) const emit = defineEmits(['onSubmit'])
const onSubmit = () => { const exit = () => {
form.value = {}
isShow.value = false
emit('onSubmit') emit('onSubmit')
} }
const openDialog= () => {
isShow.value = true
if (props.id) {
init(props.id)
}
}
const save = () => { const save = () => {
if (props.id) { if (props.id) {
post("organization/section/edit", {data: form.value}).then((res) => { post("organization/section/edit", {data: form.value}).then((res) => {
onSubmit() exit()
form.value = {} ElMessage.success('已修改')
}) })
} else { } else {
post("organization/section/add", {data: form.value}).then((res) => { post("organization/section/add", {data: form.value}).then((res) => {
onSubmit() exit()
form.value = {} ElMessage.success('已添加')
}) })
} }
} }
@ -180,18 +197,20 @@ const init = (id: any) => {
}) })
} }
const deleteDetail=()=>{ const deleteDetail = () => {
post("organization/section/delete", {id:props.id}).then((res: any) => { post("organization/section/delete", {id: props.id}).then((res: any) => {
onSubmit() exit()
ElMessage.error('已删除'); ElMessage.error('已删除');
}) })
} }
defineExpose({init}) defineExpose({openDialog})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.demo-button{ .bottom {
height: 100%;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin-top: 20px; align-items: center;
padding: 0 24px;
} }
</style> </style>

View File

@ -1,10 +1,15 @@
import { ref, computed } from 'vue'
import { ref } from 'vue'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
export const singStatus = defineStore('counter', () => { export const useLogoStore = defineStore('logo', () => {
const singShow = ref<any>(null) const logoUrl = ref<string>("")
function setSingShow(val:any){ function setLogoUrl(url: string) {
singShow.value = val logoUrl.value = url
} }
return { singShow,setSingShow} function getLogoUrl() {
return logoUrl.value
}
// 返回需要暴露的方法和变量
return { logoUrl, setLogoUrl, getLogoUrl }
}) })

View File

@ -15,7 +15,7 @@
<PaymentDetails></PaymentDetails> <PaymentDetails></PaymentDetails>
</div> </div>
<div class="right"> <div class="right">
<Card></Card> <Card v-model="userMessage"></Card>
<CustomerService v-model="proxyMessage"></CustomerService> <CustomerService v-model="proxyMessage"></CustomerService>
<SystemMessage v-model="systemMessage"></SystemMessage> <SystemMessage v-model="systemMessage"></SystemMessage>
<Banner></Banner> <Banner></Banner>
@ -40,6 +40,7 @@ onMounted(() => {
}) })
const systemMessage = ref("") const systemMessage = ref("")
const proxyMessage = ref("") const proxyMessage = ref("")
const userMessage = ref("")
let appConfig: any = null; let appConfig: any = null;
async function getData() { async function getData() {
@ -47,6 +48,7 @@ async function getData() {
appConfig = await response.json(); appConfig = await response.json();
systemMessage.value = appConfig.systemMessage systemMessage.value = appConfig.systemMessage
proxyMessage.value = appConfig.proxy proxyMessage.value = appConfig.proxy
userMessage.value = appConfig.user
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-button type="primary" :icon="Plus" @click="is_add = true">新增领用</el-button> <el-button type="primary" :icon="Plus" @click="clickApply">新增领用</el-button>
</div> </div>
<div class="content"> <div class="content">
<el-table :data="dataList" style="width: 100%" @row-click="rowClick"> <el-table :data="dataList" style="width: 100%" @row-click="rowClick">
@ -28,33 +28,29 @@
/> />
</div> </div>
</div> </div>
<Mask :width="1200" :height="600" :is-show="is_add" @close="is_add=false" title="新增领用"> <AddApply ref="addApplyRef" @close="closeAddApply"/>
<AddApply @close="closeAddApply"/> <DetailApply ref="detailApplyRef" @close="closeDetailApply"/>
</Mask>
<Mask :width="1200" :height="600" :is-show="is_detail" @close="is_detail=false" title="查看领用">
<DetailApply :id="id" @close="closeDetailApply"/>
</Mask>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import AddApply from "@/components/inventory/apply/AddApply.vue"; import AddApply from "@/components/inventory/apply/AddApply.vue";
import {onMounted, ref} from "vue"; import {nextTick, onMounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import DetailApply from "@/components/inventory/apply/DetailApply.vue"; import DetailApply from "@/components/inventory/apply/DetailApply.vue";
import {Plus} from "@element-plus/icons-vue"; import {Plus} from "@element-plus/icons-vue";
const is_add = ref(false) const is_add = ref(false)
const is_detail = ref(false) const is_detail = ref(false)
const id = ref('')
const dataList = ref([]) const dataList = ref([])
const getList = () => { const getList = () => {
const query = { const query = {
pageNum: 1, pageNum: page.value,
pageSize: 20, pageSize: 20,
} }
post("inventory/apply/list", {query: query}).then((res: any) => { post("inventory/apply/list", {query: query}).then((res: any) => {
dataList.value = res.list dataList.value = res.list
total.value = res.total_count
}) })
} }
onMounted(() => { onMounted(() => {
@ -66,14 +62,7 @@ let total = ref(0)
let page = ref(1) let page = ref(1)
let changePage = (value: number) => { let changePage = (value: number) => {
page.value = value page.value = value
const query = { getList()
pageNum: value,
pageSize: pageSize.value,
}
post("inventory/apply/list", {query: query}).then((res: any) => {
dataList.value = res.list
total.value = res.total_count
})
} }
const closeAddApply = () => { const closeAddApply = () => {
is_add.value = false is_add.value = false
@ -87,14 +76,23 @@ const formatDate = (isoStr: any) => {
const date = new Date(isoStr); const date = new Date(isoStr);
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`; return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
} }
const detailApplyRef = ref()
const rowClick = (row: any) => { const rowClick = (row: any) => {
id.value = row.id nextTick(()=>{
is_detail.value = true detailApplyRef.value?.init(row.id)
})
}
const addApplyRef = ref()
const clickApply = () => {
nextTick(() => {
addApplyRef.value?.getUserInfo()
})
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.container-wrapper { .container-wrapper {
box-sizing: border-box; box-sizing: border-box;
padding: 24px; padding: 24px;
@ -102,12 +100,14 @@ const rowClick = (row: any) => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.content { .content {
width: 100%; width: 100%;
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
margin-top: base.$margin-base; margin-top: base.$margin-base;
} }
.bottom { .bottom {
width: 100%; width: 100%;
height: 60px; height: 60px;

View File

@ -6,17 +6,19 @@
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
<el-table :data="tableData" @cell-click="editCheck"> <el-scrollbar>
<el-table-column label="订单号" prop="code" width="250"> <el-table :data="tableData" @cell-click="editCheck">
</el-table-column> <el-table-column label="订单号" prop="code" width="250">
<el-table-column label="状态" prop="state" width="250"></el-table-column> </el-table-column>
<el-table-column label="创建时间" prop="createDatetime" width="250"> <el-table-column label="状态" prop="state" width="250"></el-table-column>
<template #default="scope"> <el-table-column label="创建时间" prop="createDatetime" width="250">
{{ formatDate(scope.row.createDatetime) }} <template #default="scope">
</template> {{ formatDate(scope.row.createDatetime) }}
</el-table-column> </template>
<el-table-column label="备注" prop="remark"></el-table-column> </el-table-column>
</el-table> <el-table-column label="备注" prop="remark"></el-table-column>
</el-table>
</el-scrollbar>
</div> </div>
<div class="bottom"> <div class="bottom">
<div class="page_btn_list"> <div class="page_btn_list">
@ -31,15 +33,11 @@
</div> </div>
</div> </div>
</div> </div>
<Mask :width="1200" :height="540" :is-show="showAdd" @close="showAdd = false" title="新增盘点"> <Add ref="addRef" @close="getCheck()"/>
<Add @close="showAdd = false;getCheck()"/> <Detail ref="detailRef" @close="getCheck()"/>
</Mask>
<Mask :width="1200" :height="540" :is-show="showDetail" @close="showDetail = false" title="查看盘点">
<Detail :id="id" @close="showDetail = false;getCheck()"/>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref} from "vue"; import {nextTick, onMounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import Add from "@/components/inventory/check/Add.vue"; import Add from "@/components/inventory/check/Add.vue";
@ -49,12 +47,13 @@ import {Plus} from "@element-plus/icons-vue";
const tableData = ref([]) const tableData = ref([])
const getCheck = () => { const getCheck = () => {
const query = { const query = {
pageNum: 1, pageNum: page.value,
pageSize: 20 pageSize: 20
} }
post("inventory/check/list", {query: query}).then( post("inventory/check/list", {query: query}).then(
(res: any) => { (res: any) => {
tableData.value = res.list tableData.value = res.list
total.value = res.total_count
} }
) )
} }
@ -62,12 +61,17 @@ const detailCheckRef = ref<any>('');
const showAdd = ref(false) const showAdd = ref(false)
const showDetail = ref(false) const showDetail = ref(false)
const id = ref('') const id = ref('')
const addRef = ref<any>('');
const openAdd = () => { const openAdd = () => {
showAdd.value = true nextTick(() => {
addRef.value?.init()
})
} }
const detailRef = ref<any>('');
const editCheck = (row: any) => { const editCheck = (row: any) => {
id.value = row.id nextTick(() => {
showDetail.value = true detailRef.value?.detail(row.id)
})
} }
onMounted(() => { onMounted(() => {
@ -79,14 +83,7 @@ let total = ref(0)
let page = ref(1) let page = ref(1)
let changePage = (value: number) => { let changePage = (value: number) => {
page.value = value page.value = value
const query = { getCheck()
pageNum: value,
pageSize: pageSize.value,
}
post("goods/goods/searchDetail", {query: query}).then((res: any) => {
tableData.value = res.list
total.value = res.total_count
})
} }
// YYYY-MM-DD // YYYY-MM-DD
const formatDate = (isoStr: any) => { const formatDate = (isoStr: any) => {
@ -105,8 +102,8 @@ const formatDate = (isoStr: any) => {
.content_list { .content_list {
flex: 1; flex: 1;
overflow: hidden;
margin-top: base.$margin-base; margin-top: base.$margin-base;
min-height: 0;
} }
.bottom { .bottom {

View File

@ -161,10 +161,8 @@
</div> </div>
</div> </div>
</div> </div>
<Mask :is-show="is_add" :height="900" @close="is_add = false" title="新增"> <Edit ref="editRef" @close="is_add = false;init()"/>
<Edit ref="editRef" @close="is_add = false;init()"/> <Mask :is-show="open" :top="50" :height="600" @close="open = false" title="编辑">
</Mask>
<Mask :is-show="open" :height="600" @close="open = false" title="编辑">
<el-tabs v-model="activeName" @tab-change="changeTab"> <el-tabs v-model="activeName" @tab-change="changeTab">
<el-tab-pane label="商品信息" name="first"> <el-tab-pane label="商品信息" name="first">
<Edit ref="editRef" @close="open = false;init()"/> <Edit ref="editRef" @close="open = false;init()"/>
@ -289,7 +287,6 @@ let init = () => {
} }
let open_edit = (type: number, id: number) => { let open_edit = (type: number, id: number) => {
is_add.value = true
nextTick(() => { nextTick(() => {
editRef.value?.init(type, id); editRef.value?.init(type, id);
}); });
@ -415,11 +412,13 @@ const resetSearch = () => {
.search { .search {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.left{
.left {
flex: 1; flex: 1;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-right: 24px; margin-right: 24px;
.el-form-item { .el-form-item {
margin-right: 5px; margin-right: 5px;
} }

View File

@ -6,33 +6,35 @@
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
<el-table :data="tableData" style="width: 100%" @row-click="open_edit"> <el-scrollbar>
<el-table-column fixed label="进货单号" width="250" show-overflow-tooltip> <el-table :data="tableData" style="width: 100%" @row-click="open_edit">
<template #default="scope"> <el-table-column fixed label="进货单号" width="250" show-overflow-tooltip>
<div class="link">{{ scope.row.code }}</div> <template #default="scope">
</template> <div class="link">{{ scope.row.code }}</div>
</el-table-column> </template>
<el-table-column label="品种" prop="kindCount" width="100"> </el-table-column>
<el-table-column label="品种" prop="kindCount" width="100">
</el-table-column> </el-table-column>
<el-table-column label="入库金额" width="100"> <el-table-column label="入库金额" width="100">
<template #default="scope"> <template #default="scope">
{{ scope.row.totalPrice.toFixed(2) }} {{ scope.row.totalPrice.toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="采购人" prop="managerUserName" width="100"></el-table-column> <el-table-column label="采购人" prop="managerUserName" width="100"></el-table-column>
<el-table-column label="供应商" prop="supplierName"></el-table-column> <el-table-column label="供应商" prop="supplierName"></el-table-column>
<el-table-column prop="purchaseDate" label="采购时间"> <el-table-column prop="purchaseDate" label="采购时间">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.purchaseDate) }} {{ formatDate(scope.row.purchaseDate) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createDatetime" label="创建时间"> <el-table-column prop="createDatetime" label="创建时间">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.createDatetime) }} {{ formatDate(scope.row.createDatetime) }}
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-scrollbar>
</div> </div>
<div class="bottom"> <div class="bottom">
<div class="page_btn_list"> <div class="page_btn_list">
@ -83,11 +85,12 @@ let open_edit = (row: any) => {
let init = () => { let init = () => {
const query = { const query = {
page: 1, page: page.value,
pageSize: 20, pageSize: 20,
} }
post("inventory/order/list", {query: query}).then((res: any) => { post("inventory/order/list", {query: query}).then((res: any) => {
tableData.value = res.list tableData.value = res.list
total.value = res.total_count
}) })
} }
@ -105,14 +108,7 @@ let total = ref(0)
let page = ref(1) let page = ref(1)
let changePage = (value: number) => { let changePage = (value: number) => {
page.value = value page.value = value
const query = { init()
pageNum: value,
pageSize: pageSize.value,
}
post("goods/goods/searchDetail", {query: query}).then((res: any) => {
tableData.value = res.list
total.value = res.total_count
})
} }
// YYYY-MM-DD // YYYY-MM-DD
const formatDate = (isoStr: any) => { const formatDate = (isoStr: any) => {

View File

@ -2,7 +2,7 @@
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-dropdown> <el-dropdown>
<el-button type="primary" :icon="Plus" @click="openAdd">添加供应商</el-button> <el-button type="primary" :icon="Plus" @click="addSupplier(null)">添加供应商</el-button>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
@ -33,9 +33,7 @@
/> />
</div> </div>
</div> </div>
<Mask :width="540" :height="603" :is-show="showAdd" @close="showAdd = false" :title="id?'编辑':'添加供应商'"> <AddSupplier ref="addSupplierRef" @close="getSupplier()"></AddSupplier>
<AddSupplier @close="showAdd = false" @saveSuccess="getSupplier()" ref="addSupplierRef"></AddSupplier>
</Mask>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -48,29 +46,28 @@ import {Plus} from "@element-plus/icons-vue";
const tableData = ref([]) const tableData = ref([])
const getSupplier = () => { const getSupplier = () => {
const query = { const query = {
page: 1, page: page.value,
pageSize: 20, pageSize: 20,
} }
post("inventory/supplier/list", {query: query}, null).then( post("inventory/supplier/list", {query: query}, null).then(
(res: any) => { (res: any) => {
tableData.value = res.list tableData.value = res.list
total.value = res.total_count
} }
) )
} }
const addSupplierRef = ref(); const addSupplierRef = ref();
const openAdd = () => {
showAdd.value = true
}
const id = ref('')
const editSupplier = (row: any) => { const editSupplier = (row: any) => {
id.value = row.id
openAdd()
nextTick(() => { nextTick(() => {
addSupplierRef.value.edit(row) addSupplierRef.value.editInit(row)
})
}
const addSupplier = (row: any) => {
nextTick(() => {
addSupplierRef.value.addInit()
}) })
} }
const showAdd = ref(false)
onMounted(() => { onMounted(() => {
getSupplier() getSupplier()
}) })
@ -80,14 +77,7 @@ let total = ref(0)
let page = ref(1) let page = ref(1)
let changePage = (value: number) => { let changePage = (value: number) => {
page.value = value page.value = value
const query = { getSupplier()
pageNum: value,
pageSize: pageSize.value,
}
post("goods/goods/searchDetail", {query: query}).then((res: any) => {
tableData.value = res.list
total.value = res.total_count
})
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -44,12 +44,17 @@
<el-input v-model="ruleForm.social_certUrl"/> <el-input v-model="ruleForm.social_certUrl"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="8">
<el-form-item label="数字签名" prop="social_cainfo"> <el-form-item label="上传logo">
<el-input v-model="ruleForm.social_cainfo" type="textarea" :rows="5"/> <UpLoad v-model="uploadURL" ref="uploadRef" @uploadSuccess="(url)=>{ruleForm.logourl=url}"></UpLoad>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-form-item label="数字签名" prop="social_cainfo">
<el-input v-model="ruleForm.social_cainfo" type="textarea" :rows="5"/>
</el-form-item>
</el-row>
</el-form> </el-form>
</div> </div>
<div style="display: flex;justify-content: flex-end;padding: 0 24px"> <div style="display: flex;justify-content: flex-end;padding: 0 24px">
@ -64,6 +69,8 @@ import {onMounted, reactive, ref} from 'vue'
import {ElMessage, type FormInstance, type FormRules} from 'element-plus' import {ElMessage, type FormInstance, type FormRules} from 'element-plus'
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Panel from "@/components/common/Panel.vue"; import Panel from "@/components/common/Panel.vue";
import UpLoad from "@/components/UpLoad.vue";
import {loadConfig} from "@/utils/config.ts";
const ruleFormRef = ref<FormInstance>() const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<any>({ const ruleForm = reactive<any>({
@ -74,12 +81,17 @@ const ruleForm = reactive<any>({
social_insuplcAdmdvs: '', social_insuplcAdmdvs: '',
social_cainfo: '', social_cainfo: '',
social_url: "", social_url: "",
social_certUrl: "" social_certUrl: "",
logoUrl: "",
}) })
const uploadRef = ref<any>()
onMounted(() => { onMounted(() => {
loadConfig().then((res: any) => {
uploadURL.value = res.base_url + "file/upload";
})
uploadRef.value?.getImageUrl(localStorage.getItem('logoUrl'))
post("common/config/list", null).then((list: any) => { post("common/config/list", null).then((list: any) => {
for (let i = 0; i < list.length; i++) { for (let i = 0; i < list.length; i++) {
console.log(list[i].k)
ruleForm[list[i].k] = list[i].val ruleForm[list[i].k] = list[i].val
} }
}) })
@ -94,16 +106,16 @@ const rules = reactive<FormRules<any>>({
social_url: {required: true, message: '医保接口不能为空', trigger: 'blur'}, social_url: {required: true, message: '医保接口不能为空', trigger: 'blur'},
social_certUrl: {required: true, message: '电子平转增接口不能为空', trigger: 'blur'}, social_certUrl: {required: true, message: '电子平转增接口不能为空', trigger: 'blur'},
}) })
const submitForm = async (formEl: FormInstance | undefined) => { const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return if (!formEl) return
await formEl.validate((valid, fields) => { await formEl.validate((valid, fields) => {
if (valid) { if (valid) {
post("common/config/edit", ruleForm).then((res: any) => { post("common/config/edit", ruleForm).then((res: any) => {
ElMessage.success("保存成功") ElMessage.success("保存成功")
if (ruleForm.logourl) {
localStorage.setItem('logoUrl', ruleForm.logourl)
}
}) })
} else {
console.log('error submit!', fields)
} }
}) })
} }
@ -117,12 +129,16 @@ const options = Array.from({length: 10000}).map((_, idx) => ({
value: `${idx + 1}`, value: `${idx + 1}`,
label: `${idx + 1}`, label: `${idx + 1}`,
})) }))
//
const uploadURL = ref<any>()
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container-wrapper{ .container-wrapper {
padding:0 24px; padding: 0 24px;
background: #fff; background: #fff;
} }
.form { .form {
width: 100%; width: 100%;
padding: 0 24px; padding: 0 24px;

View File

@ -27,7 +27,7 @@
<div class="title-btn"> <div class="title-btn">
<el-button type="primary" @click="init()">查询</el-button> <el-button type="primary" @click="init()">查询</el-button>
<el-button type="primary" @click="resetSearch">重置</el-button> <el-button type="primary" @click="resetSearch">重置</el-button>
<el-button type="primary" :icon="Plus" @click="isShow=true">新增</el-button> <el-button type="primary" :icon="Plus" @click="openDialog">新增</el-button>
</div> </div>
</div> </div>
@ -72,14 +72,11 @@
/> />
</div> </div>
</div> </div>
<Mask :is-show="isShow" @close="isShow=false" :width="800" :height="600" title="成员管理"> <MemberEdit :id="id" ref="memberEditRef" @close="init()"></MemberEdit>
<MemberEdit :id="id" ref="memberEditRef" @onSubmit="init()"></MemberEdit>
</Mask>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref, nextTick} from "vue" import {onMounted, ref, nextTick} from "vue"
import Mask from '@/components/common/Mask.vue'
import MemberEdit from "@/components/settings/MemberEdit.vue"; import MemberEdit from "@/components/settings/MemberEdit.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {formatDate} from "@/utils/dateUtils.ts"; import {formatDate} from "@/utils/dateUtils.ts";
@ -91,9 +88,11 @@ const tableData = ref<any>([]);
const memberEditRef = ref<any>(null) const memberEditRef = ref<any>(null)
const rowClick = (row: any) => { const rowClick = (row: any) => {
id.value = row.memberInfo.id id.value = row.memberInfo.id
isShow.value = true openDialog()
}
const openDialog= () => {
nextTick(() => { nextTick(() => {
memberEditRef.value?.init(id.value) memberEditRef.value?.init()
}) })
} }
const roleList = [ const roleList = [

View File

@ -12,14 +12,15 @@
<el-input v-model="search.resperName" placeholder="负责人姓名" style="width: 200px"></el-input> <el-input v-model="search.resperName" placeholder="负责人姓名" style="width: 200px"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-cascader :props="{ checkStrictly: true }" v-model="search.caty" :options="options" placeholder="科室类别"/> <el-cascader :props="{ checkStrictly: true }" v-model="search.caty" :options="options"
placeholder="科室类别"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="title-btn"> <div class="title-btn">
<el-button type="primary" @click="init()">查询</el-button> <el-button type="primary" @click="init()">查询</el-button>
<el-button type="primary" @click="resetSearch">重置</el-button> <el-button type="primary" @click="resetSearch">重置</el-button>
<el-button type="primary" :icon="Plus" @click="isShow=true">新增</el-button> <el-button type="primary" :icon="Plus" @click="openDialog">新增</el-button>
</div> </div>
</div> </div>
<div class="table"> <div class="table">
@ -62,9 +63,7 @@
</div> </div>
</div> </div>
</div> </div>
<Mask :is-show="isShow" @close="init()" :height="570" :title="id?'编辑':'新增'"> <SectionEdit :id="id" ref="sectionRef" @onSubmit="init()"></SectionEdit>
<SectionEdit :id="id" ref="sectionRef" @onSubmit="init()"></SectionEdit>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {nextTick, onMounted, ref} from "vue" import {nextTick, onMounted, ref} from "vue"
@ -77,28 +76,15 @@ import depts from "@/assets/config/directory/depts.json";
import {Plus} from "@element-plus/icons-vue"; import {Plus} from "@element-plus/icons-vue";
const id = ref<any>("") const id = ref<any>("")
const isShow = ref(false)
const ChildMenuList = ref([
{
name: '首页',
path: '/settings/index',
},
{
name: '科室',
path: '/settings/section',
},
{
name: '成员',
path: '/settings/member',
}
])
const tableData = ref<any>([]) const tableData = ref<any>([])
const sectionRef = ref<any>() const sectionRef = ref<any>()
const rowClick = (row: any) => { const rowClick = (row: any) => {
id.value = row.id id.value = row.id
isShow.value = true openDialog()
}
const openDialog = () => {
nextTick(() => { nextTick(() => {
sectionRef.value?.init(row.id) sectionRef.value?.openDialog()
}) })
} }
onMounted(() => { onMounted(() => {
@ -110,7 +96,6 @@ interface Dept {
} }
const init = () => { const init = () => {
isShow.value = false
post('organization/section/list', {page: page.value, size: pageSize.value, ...search.value}).then((res: any) => { post('organization/section/list', {page: page.value, size: pageSize.value, ...search.value}).then((res: any) => {
tableData.value = res.list tableData.value = res.list
tableData.value.forEach((item: any) => { tableData.value.forEach((item: any) => {
@ -155,6 +140,7 @@ const resetSearch = () => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.title { .title {
height: 60px; height: 60px;
display: flex; display: flex;