Merge remote-tracking branch 'origin/main'

This commit is contained in:
LiJianZhao 2025-04-25 16:55:07 +08:00
commit 853f552ae4
9 changed files with 164 additions and 144 deletions

View File

@ -151,7 +151,7 @@ let logout = function () {
localStorage.removeItem('token') localStorage.removeItem('token')
useRouter().push("/manager/login") useRouter().push("/manager/login")
ElMessage({ ElMessage({
message: "退出成功,即将为您跳转到登页面", message: "退出成功,即将为您跳转到登页面",
type: 'success', type: 'success',
duration: 1000, duration: 1000,
}) })

View File

@ -1,6 +1,5 @@
<template> <template>
<div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......"> <div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......">
<div class="top"> <div class="top">
<el-form :model="inventory_order_data" :rules="formRules" ref="orderForm"> <el-form :model="inventory_order_data" :rules="formRules" ref="orderForm">
<el-descriptions title="采购订单" border> <el-descriptions title="采购订单" border>
@ -26,28 +25,28 @@
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="发票号"> <el-descriptions-item label="发票号">
<el-form-item prop="invoiceCode" > <el-form-item prop="invoiceCode">
<el-input v-model="inventory_order_data.invoiceCode"></el-input> <el-input v-model="inventory_order_data.invoiceCode"></el-input>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="供应商"> <el-descriptions-item label="供应商">
<el-form-item prop="supplierId" :label="''" :rules="formRules.supplierId"> <el-form-item prop="supplierId" :label="''" :rules="formRules.supplierId">
<el-select v-model="inventory_order_data.supplierId" placeholder="请选择供应商" style="width:300px"> <el-select v-model="inventory_order_data.supplierId" placeholder="请选择供应商" style="width:300px">
<el-option <el-option
v-for="item in supplier_list" v-for="item in supplier_list"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="备注"> <el-descriptions-item label="备注">
<el-input v-model="inventory_order_data.remark"/> <el-input v-model="inventory_order_data.remark"/>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-form> </el-form>
</div> </div>
<GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch> <GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch>
<div class="table_content"> <div class="table_content">
@ -84,37 +83,37 @@
</el-table-column> </el-table-column>
<el-table-column label="生产批号" width="150"> <el-table-column label="生产批号" width="150">
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model="scope.row.productionBatchCode" v-model="scope.row.productionBatchCode"
placeholder="生产批号" placeholder="生产批号"
style="width: 100px" style="width: 100px"
size="small"/> size="small"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="生产日期" width="140"> <el-table-column label="生产日期" width="140">
<template #default="scope"> <template #default="scope">
<el-date-picker <el-date-picker
:editable="false" :editable="false"
v-model="scope.row.productionDate" v-model="scope.row.productionDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="生产日期" placeholder="生产日期"
size="small" size="small"
@change="checkProductionDate(scope.row)" @change="checkProductionDate(scope.row)"
style="width: 100px;"/> style="width: 100px;"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="有效日期" width="140"> <el-table-column label="有效日期" width="140">
<template #default="scope"> <template #default="scope">
<el-date-picker <el-date-picker
:editable="false" :editable="false"
v-model="scope.row.expiryDate" v-model="scope.row.expiryDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="有效日期" placeholder="有效日期"
size="small" style="width: 100px;"/> size="small" style="width: 100px;"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="100"> <el-table-column label="操作" width="100">
@ -135,9 +134,9 @@
</div> </div>
</div> </div>
<Mask :is-show="is_add" :top="100"> <Mask :is-show="is_add" :top="100">
<Edit ref="editRef" @close="is_add = false;"/> <Edit ref="editRef" @close="is_add = false;"/>
</Mask> </Mask>
</template> </template>
@ -149,6 +148,7 @@ import Mask from "@/components/common/Mask.vue";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue"; import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CloseBtn from "@/components/CloseBtn.vue"; import CloseBtn from "@/components/CloseBtn.vue";
const orderForm = ref() const orderForm = ref()
const formRules = ref({ const formRules = ref({
shippingCode: [{required: true, message: '请输入货单号', trigger: 'blur'}], shippingCode: [{required: true, message: '请输入货单号', trigger: 'blur'}],
@ -171,20 +171,22 @@ let inventory_order_data = ref({
const checkProductionDate = (row: any) => { const checkProductionDate = (row: any) => {
if (!row.productionDate) { if (!row.productionDate) {
ElMessage.error('生产日期不能为空'); ElMessage.error('生产日期不能为空');
return; return false;
} }
const productionDate = new Date(row.productionDate); const productionDate = new Date(row.productionDate);
const currentDate = new Date(); const currentDate = new Date();
if (productionDate > currentDate) { if (productionDate > currentDate) {
ElMessage.error('生产日期不能晚于当前日期'); ElMessage.error('生产日期不能晚于当前日期');
row.productionDate = null; // row.productionDate = null; //
return false;
} }
return true;
}; };
const checkExpiryDate = (row: any) => { const checkExpiryDate = (row: any) => {
if (!row.expiryDate) { if (!row.expiryDate) {
ElMessage.error('有效期不能为空'); ElMessage.error('有效期不能为空');
return; return false;
} }
const productionDate = new Date(row.productionDate); const productionDate = new Date(row.productionDate);
const expiryDate = new Date(row.expiryDate); const expiryDate = new Date(row.expiryDate);
@ -193,10 +195,13 @@ const checkExpiryDate = (row: any) => {
if (expiryDate <= currentDate) { if (expiryDate <= currentDate) {
ElMessage.error('有效期不能早于当前日期'); ElMessage.error('有效期不能早于当前日期');
row.expiryDate = null; // row.expiryDate = null; //
return false;
} else if (expiryDate <= productionDate) { } else if (expiryDate <= productionDate) {
ElMessage.error('有效期必须晚于生产日期'); ElMessage.error('有效期必须晚于生产日期');
row.expiryDate = null; // row.expiryDate = null; //
return false;
} }
return true;
}; };
const isLoading = ref(false) const isLoading = ref(false)
@ -239,19 +244,22 @@ let confirm = async () => {
} }
// //
table_list.value.forEach((item: any) => { for (let i = 0; i < table_list.value.length; i++) {
checkProductionDate(item) if (!checkProductionDate(table_list.value[i])) {
checkExpiryDate(item); return
}); }
if (!checkExpiryDate(table_list.value[i])) {
return
}
}
let data = { let data = {
inventoryOrder: JSON.parse(JSON.stringify(inventory_order_data.value)), inventoryOrder: JSON.parse(JSON.stringify(inventory_order_data.value)),
inventoryOrderGoodsList: JSON.parse(JSON.stringify(table_list.value)) inventoryOrderGoodsList: JSON.parse(JSON.stringify(table_list.value))
} }
isLoading.value = true
post("inventory/order/create", data).then((res: any) => { post("inventory/order/create", data).then((res: any) => {
exit() exit()
isLoading.value = true
}) })
} catch (error) { } catch (error) {
@ -287,7 +295,7 @@ const getSupplierList = () => {
const query = { const query = {
turn: 1 turn: 1
} }
post("inventory/supplier/list", {query:query}).then((res: any) => { post("inventory/supplier/list", {query: query}).then((res: any) => {
supplier_list.value = res.list supplier_list.value = res.list
supplier_list.value = res.list supplier_list.value = res.list
}) })
@ -375,7 +383,8 @@ onMounted(() => {
right: 10px; right: 10px;
bottom: 10px; bottom: 10px;
} }
.error{
.error {
background-color: #F00; background-color: #F00;
} }
</style> </style>

View File

@ -9,69 +9,56 @@
show-word-limit show-word-limit
:autosize="{ minRows: 8, maxRows: 20 }" :autosize="{ minRows: 8, maxRows: 20 }"
type="textarea" type="textarea"
@input="parsing"
/> />
<div class="btn"> <div class="btn">
<el-button type="primary" @click="save">保存</el-button> <el-button type="primary" @click="save">保存</el-button>
</div> </div>
</el-form> </el-form>
<el-descriptions title="解析后的数据" size="small" :column="2" border v-if="flag"> <el-descriptions title="解析后的数据" size="small" :column="2" border>
<el-descriptions-item <!-- <el-descriptions-item-->
align="center" <!-- align="center"-->
label="定点机构编码" <!-- label="定点机构编码"-->
:span="2" <!-- :span="2"-->
> <!-- >-->
{{ decryptedText.fixmedinsCode }} <!-- {{ decryptedText.fixmedinsCode }}-->
</el-descriptions-item> <!-- </el-descriptions-item>-->
<el-descriptions-item <el-descriptions-item
align="center" align="center"
label="证书创建时间" label="证书创建时间"
> >
{{ decryptedText.createDate }} {{ formatDate(decryptedText.createDate) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item <el-descriptions-item
align="center" align="center"
label="证书过期时间" label="证书过期时间"
> >
{{ decryptedText.expiryDate }} {{ formatDate(decryptedText.expiryDate) }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {onMounted, onUnmounted, ref} from "vue"; import {onMounted, ref} from "vue";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
import {formatDate} from "@/utils/dateUtils.ts";
const decryptedText = ref<any>({}) const decryptedText = ref<any>({})
const ciphertext = ref<string>('') const ciphertext = ref<any>('')
const flag = ref<any>(false)
const parsing = () => {
if (ciphertext.value) {
post("common/config/parsing", {ciphertext: ciphertext.value}).then((res: any) => {
decryptedText.value = res;
flag.value = true;
})
} else {
flag.value = false;
}
}
const save = () => { const save = () => {
if (ciphertext.value) { if (ciphertext.value) {
post("common/config/setcert", {encryptedText: ciphertext.value}).then((res: any) => { post("common/auth/set", {ciphertext: ciphertext.value}).then(() => {
ElMessage.success("保存成功") ElMessage.success("保存成功")
init()
}) })
} }
} }
const get = () => { const init = async () => {
ciphertext.value=await post("common/auth/get");
decryptedText.value=await post("common/auth/check");
} }
onMounted(async () => { onMounted(async () => {
post("common/config/get", {key: 'common_cert'}).then((res: any) => { await init()
ciphertext.value = res.val;
parsing()
})
}) })

View File

@ -15,7 +15,7 @@ const handleLogin = () => {
post("manager/user/login", {username: username.value, password: password.value}).then((token: any) => { post("manager/user/login", {username: username.value, password: password.value}).then((token: any) => {
localStorage.setItem('token', token) localStorage.setItem('token', token)
ElMessage({ ElMessage({
message: "登成功,即将为您跳转到首页", message: "登成功,即将为您跳转到首页",
type: 'success', type: 'success',
duration: 1000, duration: 1000,
onClose: () => { onClose: () => {
@ -67,7 +67,7 @@ const showAuth = () => {
</div> </div>
</div> </div>
</div> </div>
<Mask :is-show="isShowAuth" @close="isShowAuth=false" :width="600" :height="600" title="授权"> <Mask :is-show="isShowAuth" @close="isShowAuth=false" :width="600" :height="450" title="授权">
<Auth></Auth> <Auth></Auth>
</Mask> </Mask>
</template> </template>

View File

@ -32,10 +32,10 @@
</div> </div>
</div> </div>
<Mask :width="1200" :height="500" :is-show="showAdd" :top="100" @close="showAdd = false"> <Mask :width="1200" :height="500" :is-show="showAdd" :top="100" @close="showAdd = false">
<Add @close="showAdd = false"/> <Add @close="showAdd = false;getCheck()"/>
</Mask> </Mask>
<Mask :width="1200" :height="500" :is-show="showDetail" :top="100" @close="showDetail = false"> <Mask :width="1200" :height="500" :is-show="showDetail" :top="100" @close="showDetail = false">
<Detail :id="id" @close="showDetail = false"/> <Detail :id="id" @close="showDetail = false;getCheck()"/>
</Mask> </Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -1,10 +1,10 @@
<template> <template>
<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="open_add(null)">新增采购</el-button> <el-button type="primary" :icon="Plus" @click="open_add(null)">新增采购</el-button>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
<el-table :data="tableData" style="width: 100%" @row-click="open_add"> <el-table :data="tableData" style="width: 100%" @row-click="open_add">
<el-table-column fixed label="进货单号" width="250" show-overflow-tooltip> <el-table-column fixed label="进货单号" width="250" show-overflow-tooltip>
@ -33,24 +33,25 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:page-size="pageSize"
:current-page="page"
:total="total"
@current-change="changePage"
/>
</div> </div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:page-size="pageSize"
:current-page="page"
:total="total"
@current-change="changePage"
/>
</div>
</div>
<Mask :width="1200" :top="100" :is-show="is_add" @close="is_add=false"
:title="open_code?'编辑':'新增'">
<AddOrder v-if="!open_code" @close="closeAddOrder"/>
<EditOrder v-else :code="open_code" @close="is_add=false" @updateOrderDetail="init"/>
</Mask>
</div> </div>
<Mask :width="1200" :height="700" :top="100" :is-show="is_add" @close="is_add=false" :title="open_code?'编辑':'新增'">
<AddOrder v-if="!open_code" @close="closeAddOrder"/>
<EditOrder v-else :code="open_code" @close="is_add=false" @updateOrderDetail="init"/>
</Mask>
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -70,8 +71,12 @@ onMounted(() => {
init() init()
}) })
let open_add = (row: any) => { let open_add = (row: any) => {
open_code.value = row.code
is_add.value = true is_add.value = true
if (row!=null) {
open_code.value = row.code
}else{
open_code.value = null
}
} }
@ -112,6 +117,7 @@ const formatDate = (isoStr: any) => {
</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;
@ -119,12 +125,14 @@ const formatDate = (isoStr: any) => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.content_list { .content_list {
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;
@ -138,6 +146,7 @@ const formatDate = (isoStr: any) => {
align-items: center; align-items: center;
} }
} }
.full_screen { .full_screen {
position: fixed; position: fixed;
left: 0; left: 0;

View File

@ -338,6 +338,8 @@ const openLevelEdit = (vip: any) => {
.container-wrapper { .container-wrapper {
display: flex; display: flex;
background: none;
padding: 0 24px;
.left { .left {
height: 100%; height: 100%;

View File

@ -18,17 +18,21 @@
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<div class="middle"> <div class="middle">
<el-date-picker <div class="date">
v-model="selectedDate" <el-date-picker
type="daterange" v-model="selectedDate"
range-separator="-" type="daterange"
@change="handleDateChange" range-separator="-"
start-placeholder="开始时间" @change="handleDateChange"
end-placeholder="结束时间" start-placeholder="开始时间"
/> end-placeholder="结束时间"
<List :patientList="patientList" @rowClick="rowClick"></List> />
</div> </div>
<div class="list">
<List :patientList="patientList" @rowClick="rowClick"></List>
</div>
</div>
<div class="bottom"> <div class="bottom">
<div class="page_btn_list"> <div class="page_btn_list">
<el-pagination <el-pagination
@ -55,7 +59,7 @@ import Mask from "@/components/common/Mask.vue";
import Edit from "@/components/registration/Edit.vue"; import Edit from "@/components/registration/Edit.vue";
import List from "@/components/registration/List.vue"; import List from "@/components/registration/List.vue";
import {post} from "@/utils/request"; import {post} from "@/utils/request";
import {formatDate,getToday,formatDateArray} from "@/utils/dateUtils.ts"; import {formatDate, getToday, formatDateArray} from "@/utils/dateUtils.ts";
const isShowNum = ref(0) const isShowNum = ref(0)
const roleList = ref<any>([]) const roleList = ref<any>([])
@ -72,13 +76,18 @@ const initDoctor = () => {
}) })
} }
const patientList = ref<any>([]) const patientList = ref<any>([])
const selectedDate = ref<any>([getToday().start,getToday().end]) const selectedDate = ref<any>([getToday().start, getToday().end])
const handleDateChange = (date: any[]) => { const handleDateChange = (date: any[]) => {
selectedDate.value = formatDateArray(date) selectedDate.value = formatDateArray(date)
getPatientList() getPatientList()
} }
const getPatientList = () => { const getPatientList = () => {
post('registration/list', {page: page.value, size: size.value,startDate:selectedDate.value[0],endDate:selectedDate.value[1]}).then((res: any) => { post('registration/list', {
page: page.value,
size: size.value,
startDate: selectedDate.value[0],
endDate: selectedDate.value[1]
}).then((res: any) => {
patientList.value = res.list patientList.value = res.list
}) })
isShow.value = false isShow.value = false
@ -98,7 +107,9 @@ const rowClick = (row: any) => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container-wrapper { .container-wrapper {
padding-top: 0; background: none;
height: 100%;
padding: 0 24px;
} }
.content { .content {
@ -108,6 +119,7 @@ const rowClick = (row: any) => {
.left { .left {
height: 100%; height: 100%;
width: 319px; width: 319px;
background: #fff;
li { li {
height: 50px; height: 50px;
@ -152,10 +164,24 @@ const rowClick = (row: any) => {
padding-left: 20px; padding-left: 20px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.middle{
.middle {
flex: 1; flex: 1;
min-height: 0; min-height: 0;
background: #fff;
display: flex;
flex-direction: column;
.date {
margin: 30px auto 0;
height: 60px;
}
.list {
flex: 1;
}
} }
.bottom { .bottom {
width: 100%; width: 100%;
height: 60px; height: 60px;
@ -163,13 +189,10 @@ const rowClick = (row: any) => {
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
display: flex;
.page_btn_list { justify-content: flex-end;
position: absolute; align-items: center;
left: 0;
top: 10px;
}
} }
} }
} }

View File

@ -33,7 +33,8 @@
<Mask :is-show="loading" :width="300" :height="300" title="更新版本" :close="false"> <Mask :is-show="loading" :width="300" :height="300" title="更新版本" :close="false">
{{ tip_message }} {{ tip_message }}
<div class="demo-progress" style="margin-top: 20px"> <div class="demo-progress" style="margin-top: 20px">
<el-progress :percentage="percentage" :format="format"/> <el-progress :percentage="100" :stroke-width="15" striped
striped-flow :show-text="false"/>
</div> </div>
</Mask> </Mask>
</div> </div>
@ -129,12 +130,10 @@ let percentage = ref(0)
const tip_message = ref("正在更新目录,请稍后...") const tip_message = ref("正在更新目录,请稍后...")
const start_type = () => { const start_type = () => {
loading.value = true loading.value = true
percentage.value = 0;
post("social/directory_version/get_current", {type: current_tab.value}, {catch_error: true}).then((res: any) => { post("social/directory_version/get_current", {type: current_tab.value}, {catch_error: true}).then((res: any) => {
tip_message.value = "正在更新目录,上一个版本:" + res.currentVersionName + ",请不要强制关闭程序,否则数据不完整"; tip_message.value = "正在更新目录,上一个版本:" + res.currentVersionName + ",请不要强制关闭程序,否则数据不完整";
download(res.currentVersionName, current_tab.value); download(res.currentVersionName, current_tab.value);
}).catch((err: any) => { }).catch((err: any) => {
percentage.value = 100
loading.value = false; loading.value = false;
ElNotification({ ElNotification({
title: '提示', title: '提示',
@ -145,11 +144,6 @@ const start_type = () => {
} }
let download = (ver: any, type: any) => { let download = (ver: any, type: any) => {
post("social/directory/download", {ver: ver, type: type}).then((res: any) => { post("social/directory/download", {ver: ver, type: type}).then((res: any) => {
percentage.value = setInterval(() => {
if (percentage.value < 100) {
percentage.value += 1;
}
}, 100);
if (res == null) { if (res == null) {
loading.value = false; loading.value = false;
ElNotification({ ElNotification({
@ -161,7 +155,6 @@ let download = (ver: any, type: any) => {
} }
start_type() start_type()
}).catch((err: any) => { }).catch((err: any) => {
percentage.value = 100
loading.value = false; loading.value = false;
ElNotification({ ElNotification({
title: '提示', title: '提示',
@ -209,13 +202,10 @@ let download = (ver: any, type: any) => {
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
display: flex;
.page_btn_list { justify-content: flex-end;
position: absolute; align-items: center;
left: 0;
top: 10px;
}
.download_btn { .download_btn {
position: absolute; position: absolute;