This commit is contained in:
ChenQiuYu 2025-05-27 15:42:21 +08:00
parent 9d584330dc
commit bd07d4af27
59 changed files with 157 additions and 2697 deletions

View File

@ -6,6 +6,7 @@ import {ElMessage} from "element-plus";
import {post} from "@/utils/request.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {useWsStore} from "@/stores/wsStore.ts";
import {API} from "@/assets/config/API.ts";
const wsStore = useWsStore();
const isReading = ref(false)
@ -13,7 +14,7 @@ const socialCard: any = defineModel();
const ReadSocialCard = async (readType: string) => {
socialCard.value.lastUse = "cardPay"
isReading.value = true;
let config_db: any = await post('common/config/getall');
let config_db: any = await post(API.Common.Config.GetAll);
let config: any = {}
config.ACCESS_KEY = config_db.social_ACCESS_KEY;
config.SECRETKEY = config_db.social_SECRETKEY;
@ -63,7 +64,7 @@ const reciceMessage = (response: Response) => {
getInfoFor1101(params)
}
const getInfoFor1101 = (params: any) => {
post("social/person/getCustomSocialInfo", {data: params}).then((res: any) => {
post(API.Social.Person.GetCustomSocialInfo, {data: params}).then((res: any) => {
socialCard.value.data = res;
socialCard.value.mdtrtCertType = res.mdtrtCertType;
socialCard.value.mdtrtCertNo = res.mdtrtCertNo;

View File

@ -86,6 +86,7 @@ import {formatListTime, getCurrentDate, getEndOfDay, getToday} from "@/utils/dat
import {Search, Calendar} from "@element-plus/icons-vue";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import Edit from "@/components/registration/Edit.vue";
import {API} from "@/assets/config/API.ts";
const curItem = ref<any>({});
const emit = defineEmits(['clickItem', 'getStatus'])
@ -119,7 +120,7 @@ const init = async () => {
query.value.endTime = getEndOfDay(selectedDate.value[1])
loading.value = true
try {
let data: any = await post(apiConfig.RecordGetChargeQueue, {query: query.value}, {catch_error: true})
let data: any = await post(API.Charge.Order.ListWithDetail, {query: query.value}, {catch_error: true})
ChargeQueueList.value = data.list
} catch {
ChargeQueueList.value = []
@ -162,7 +163,7 @@ const tab = (item: any) => {
init()
}
const getTipCount = () => {
post('statistics/getTipCount', {
post(API.Statistics.GetQueueCount, {
beginTime: query.value.beginTime,
endTime: query.value.endTime
}).then((res: any) => {

View File

@ -30,19 +30,20 @@ import {apiConfig} from "@/assets/config/apiConfig.ts";
import {getEndOfDay} from "@/utils/dateUtils.ts";
import {post} from "@/utils/request.ts";
import {ElMessage} from "element-plus";
import {API} from "@/assets/config/API.ts";
const is_show = ref(false);
const init = async () => {
is_show.value = true
try {
let data: any = await post(apiConfig.RegistrationList, {
let data: any = await post(API.Patient.Registration.List, {
query: {
status: 1,
beginTime: new Date(),
endTime: getEndOfDay(new Date())
}
}, {catch_error: true});
post('registration/changeStatus', {id: data.list[0].id, status: 2}).then((res: any) => {
post(API.Patient.Registration.ChangeStatus, {id: data.list[0].id, status: 2}).then((res: any) => {
registerId.value = res.id
patientId.value = res.patientInfoId
})
@ -50,7 +51,7 @@ const init = async () => {
is_show.value = false
}
}
const diagnosisSearchApi = "social/diagnose/search"
const diagnosisSearchApi = API.Social.Diagnose.Search
interface ShowConfig {
label: string;
@ -84,7 +85,7 @@ const save = () => {
itemList: [],
goodsList: [],
}
post('medical/record/save', {data: data}).then((res: any) => {
post(API.Diagnosis.Base.Save, {data: data}).then((res: any) => {
ElMessage.success("快速接诊成功")
is_show.value = false
emit('close')

View File

@ -61,6 +61,7 @@ import {medTypeJson, priceBtnList} from "@/assets/config/constants.ts"
import {useWsStore} from "@/stores/wsStore.ts";
import PersonalPayment from "@/components/charge/PersonalPayment.vue";
import {ElMessage} from "element-plus";
import {API} from "@/assets/config/API.ts";
const wsStore = useWsStore();
const socialCard = ref<any>({
@ -91,9 +92,9 @@ const init = async (code: any, psnNo: any) => {
selectedIndex.value = 0
payType.value = 1
}
retailOrder.value = await post("charge/getByCode", {code: code});
retailOrder.value = await post(API.Charge.Order.GetByCode, {code: code});
if (psnNo != null) {
let result: any = await post("social/person/getSocialInfoByPsnNo", {psnNo: psnNo});
let result: any = await post(API.Social.Person.GetSocialInfoByPsnNo, {psnNo: psnNo});
if (result) {
socialCard.value.data = result;
socialCard.value.mdtrtCertType = result.mdtrtCertType;
@ -126,7 +127,7 @@ const completeSettlement = () => {
} else {
//
loading.value = true;
post('charge/completeOrder', {
post(API.Charge.Order.Complete, {
id: retailOrder.value.id,
payType: payType.value
}, {catch_error: true}).then((res: any) => {
@ -175,9 +176,9 @@ const socialSettlement = () => {
insutype: socialCard.value.payInfo.selfpay_prop_type,
changeOrderCode: retailOrder.value.code,
}
post("charge/uploadCostDetails", {changeOrderCode: retailOrder.value.code}).then((res: any) => {
post(API.Charge.Social.Upload, {changeOrderCode: retailOrder.value.code}).then((res: any) => {
//
post("charge/socialPrePay", {...params}).then((res: any) => {
post(API.Charge.Social.PrePay, {...params}).then((res: any) => {
openPsnPayment(res, params)
})
})

View File

@ -197,6 +197,7 @@ import {apiConfig} from "@/assets/config/apiConfig.ts";
import {post} from "@/utils/request";
import {Right} from "@element-plus/icons-vue";
import {onMounted, ref} from "vue";
import {API} from "@/assets/config/API.ts";
let logout = function () {
@ -211,7 +212,7 @@ let logout = function () {
)
.then(() => {
localStorage.removeItem('token')
post(apiConfig.signOut).then((res: any) => {
post(API.Common.Sign.SignOut).then((res: any) => {
useRouter().push("/manager/login")
})
ElMessage({
@ -228,7 +229,7 @@ onMounted(() => {
})
const username = ref<any>('')
const getInfo = () => {
post(apiConfig.managerUserVerify).then((res: any) => {
post(API.Common.ManagerUser.Verify).then((res: any) => {
username.value = res.username
})
}

View File

@ -45,16 +45,16 @@
</el-table-column>
<el-table-column label="使用方法" width="200">
<template #default="scope">
<el-input v-model="usage" placeholder="请输入使用方法" style="width: 100px"></el-input>
<el-popover
placement="bottom"
title="Title"
title=""
:width="200"
trigger="click"
>
<template #default>
<Usage></Usage>
<template #reference>
<el-input v-model="usage" placeholder="使用方法" style="width: 100px"></el-input>
</template>
<Usage :usageObj="usageObj"></Usage>
</el-popover>
</template>
</el-table-column>
@ -132,7 +132,8 @@ import {post} from "@/utils/request.ts";
import {ElMessage} from "element-plus";
import {Delete} from "@element-plus/icons-vue";
import Usage from "./goodsDetail/Usage.vue"
import usageList from "@/assets/config/directory/drugMedcWayCode.json"
import usageObj from "@/assets/config/directory/drugMedcWayCode.json"
import {API} from "@/assets/config/API.ts";
const props = defineProps({
status: {
@ -244,7 +245,7 @@ const focus = (e: any) => {
const hilistInfo = ref<any>({})
const getHilistInfo = (item: any) => {
if (item.hilistCode != null) {
post("social/directory/getByCode", {code: item.hilistCode}).then((res: any) => {
post(API.Social.Directory.GetByCode, {code: item.hilistCode}).then((res: any) => {
if (!res) {
hilistInfo.value = {}
return

View File

@ -1,9 +1,20 @@
<script setup lang="ts">
import {defineProps, onMounted} from "vue";
const props = defineProps({
usageObj: {
type: Object,
default: () => []
}
});
</script>
<template>
<div>11111111</div>
<div v-for="(item, index) in Object.entries(props.usageObj)" :key="index">
<div class="item">
<div class="item-title">{{ item }}</div>
</div>
</div>
</template>
<style scoped lang="scss">

View File

@ -81,6 +81,7 @@ import {post} from "@/utils/request.ts";
import chrgitm_lv from "@/assets/config/directory/chrgitmLv.json"
import {ElMessage} from "element-plus"
import {Delete} from "@element-plus/icons-vue";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
status: {
@ -159,7 +160,7 @@ const popoverRef = ref<any>(null);
const itemInfo = ref<any>({});
const show = (item: any) => {
if (!item.itemSocialCode) return
post('social/directory/getItemByCode', {code: item.itemSocialCode}).then((res: any) => {
post(API.Social.Directory.GetItemByCode, {code: item.itemSocialCode}).then((res: any) => {
itemInfo.value = res
})
}

View File

@ -4,6 +4,7 @@ import {onMounted, onUnmounted, ref} from "vue";
import * as echarts from "echarts";
import {getThisWeek} from "@/utils/dateUtils.ts";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
const echart = ref<HTMLElement | null>(null)
let myChart: echarts.ECharts | null = null;
onMounted(()=>{
@ -22,7 +23,7 @@ const handleResize = () => {
};
const getPersonPayOverview = () => {
const thisWeek = getThisWeek();
post("statistics/getPersonPayOverview", {beginTime: thisWeek.start, endTime: thisWeek.end}).then((res: any) => {
post(API.Statistics.GetPayOverview, {beginTime: thisWeek.start, endTime: thisWeek.end}).then((res: any) => {
dateList.value = res.dateList
commonData.value = res.commonPrice
initEcharts(dateList.value, vipData.value, commonData.value)

View File

@ -3,6 +3,7 @@ import Panel from "@/components/common/Panel.vue";
import InventoryWarnDetail from "@/components/home/index/Dialog/InventoryWarnDetail.vue";
import {nextTick, onMounted, ref} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
onMounted(() => {
getInventoryWarning()
@ -16,7 +17,7 @@ const openInventoryWarnDetail = () => {
}
const getInventoryWarning = () => {
post("statistics/numberEarlyWarning", {pageNum: 1, pageSize: 20}).then((res: any) => {
post(API.Statistics.NumberEarlyWarning, {pageNum: 1, pageSize: 20}).then((res: any) => {
inventoryWarnList.value = res.list.slice(0, 4)
})
}

View File

@ -3,6 +3,7 @@ import Panel from "@/components/common/Panel.vue";
import {onMounted, ref} from "vue";
import {formatDateArray, getEndOfDay, getThisMonth, getThisWeek, getToday, getYesterday} from "@/utils/dateUtils.ts";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
onMounted(() => {
getRevenueOverview()
@ -55,7 +56,7 @@ const getDateRange = () => {
}
const getRevenueOverview = () => {
let date=getDateRange()
post("statistics/getRevenueOverview", {
post(API.Statistics.GetRevenueOverview, {
beginTime: date.begin,
endTime: date.end}).then((res: any) => {
if (res.payTypeRevenue.length === 0) return

View File

@ -3,6 +3,7 @@ import Panel from "@/components/common/Panel.vue";
import {nextTick, onMounted, ref} from "vue";
import {post} from "@/utils/request.ts";
import ExpireWarnDetail from "@/components/home/index/Dialog/ExpireWarnDetail.vue";
import {API} from "@/assets/config/API.ts";
const expireWarnDetailRef = ref()
const openExpireWarnDetail = () => {
@ -18,7 +19,7 @@ const expireDateWarningListSrc = ref<any>([]);
const expireDateWarningList = ref<any>([]);
const getExpiryDateWarning = () => {
post("statistics/expiryDateWarning", {pageNum: 1, pageSize: 20}).then((res: any) => {
post(API.Statistics.ExpiryDateWarning, {pageNum: 1, pageSize: 20}).then((res: any) => {
expireDateWarningList.value = res.list.slice(0, 4)
})
}

View File

@ -1,12 +1,13 @@
<script setup lang="ts">
import {ref} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
const state = ref([])
const options = ref([])
const selectRef = ref();
const querySearchAsync = (queryString: string, cb: (arg: any) => void) => {
post("goods/goods/search", {keyword: queryString}).then((res: any) => {
post(API.Goods.Base.Search, {keyword: queryString}).then((res: any) => {
options.value = res;
let list = res;
for (let i = 0; i < list.length; i++) {

View File

@ -139,11 +139,11 @@
</template>
<script setup lang="ts">
import {onMounted, ref, unref} from "vue";
import {ref} from "vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const isShow = ref<any>(false)
const emit = defineEmits(['close'])
@ -192,7 +192,7 @@ const findIndexForTableList = (goodId: any) => {
}
const goodsSelectCallBack = (inventory: any) => {
if (findIndexForTableList(inventory.goodId) != -1) return
post("inventory/goods/getByGoodsId", {goodsId: inventory.goodId,isZero:false}).then((res: any) => {
post(API.Inventory.Goods.GetByGoodsId, {goodsId: inventory.goodId,isZero:false}).then((res: any) => {
inventory.batchList = res.inventoryGoodsList
inventory.minPackagingUnit = res.minPackagingUnit
inventory.trdnFlag = res.trdnFlag
@ -271,7 +271,7 @@ const changeOutNumber = (row: any) => {
row.totalFragmentNumber = totalOutFragmentNumber;
}
const save = () => {
post("inventory/apply/create", {useInfo: formData.value, data: tableList.value}).then((res: any) => {
post(API.Inventory.Apply.Create, {useInfo: formData.value, data: tableList.value}).then((res: any) => {
exit()
})
@ -283,13 +283,13 @@ const init = () => {
getUserInfo()
}
const getUserInfo = () => {
post("manager/user/verify", null).then((res: any) => {
post(API.Common.ManagerUser.Verify, null).then((res: any) => {
formData.value.useUserId = res.id;
})
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {}).then((res: any) => {
post(API.Common.ManagerUser.List, {}).then((res: any) => {
managerUserList.value = res
})
}

View File

@ -109,6 +109,7 @@ import {onMounted, ref, defineProps} from "vue";
import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
id: {
@ -207,7 +208,7 @@ const addLine = (row: any) => {
})
}
const getUserInfo = () => {
post("manager/user/verify").then((res: any) => {
post(API.Common.ManagerUser.Verify).then((res: any) => {
formData.value.useUserId = res.id;
formData.value.name = res.name;
formData.value.username = res.username;
@ -215,7 +216,7 @@ const getUserInfo = () => {
}
const detail = (id: any) => {
isShow.value = true
post("inventory/apply/getApplyDetail", {id}).then((res: any) => {
post(API.Inventory.Apply.GetDetail, {id}).then((res: any) => {
tableList.value = JSON.parse(res);
})
}

View File

@ -152,6 +152,7 @@ import {ref} from "vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import Mask from "@/components/common/Mask.vue";
import {ElMessage} from "element-plus";
import {API} from "@/assets/config/API.ts";
const form = ref<any>({
remark: ""
@ -237,7 +238,7 @@ let setChange = function (row: any) {
row.change.fragmentNumber = diff % row.minPackagingNumber
}
let addLine = (row: any) => {
post("inventory/goods/getListByIds", {idList: row.childIdList}).then((list: any) => {
post(API.Inventory.Goods.ListByIds, {idList: row.childIdList}).then((list: any) => {
let children = [];
for (let i = 0; i < list.length; i++) {
let inventoryGoods = list[i];
@ -271,7 +272,7 @@ let addLine = (row: any) => {
})
}
let addRow = (goodsId: number) => {
post("inventory/goods/getByGoodsId", {goodsId, isZero: true}).then((res: any) => {
post(API.Inventory.Goods.GetByGoodsId, {goodsId, isZero: true}).then((res: any) => {
let check: Check = {
goodsId: res.id,
name: res.name,
@ -315,7 +316,7 @@ let addRow = (goodsId: number) => {
})
}
let save = () => {
post("inventory/check/save", {list: list.value, remark: form.value.remark,checkUserId: form.value.checkUserId}).then((res: any) => {
post(API.Inventory.Check.Save, {list: list.value, remark: form.value.remark,checkUserId: form.value.checkUserId}).then((res: any) => {
ElMessage.success('保存成功')
exit()
})
@ -339,12 +340,12 @@ defineExpose({init})
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {}).then((res: any) => {
post(API.Common.ManagerUser.List, {}).then((res: any) => {
managerUserList.value = res
})
}
const getUserInfo = () => {
post("manager/user/verify", null).then((res: any) => {
post(API.Common.ManagerUser.Verify, null).then((res: any) => {
form.value.useUserId = res.id;
})
}

View File

@ -128,6 +128,7 @@ import {onMounted,defineProps} from "vue";
import {post} from "@/utils/request.ts";
import {ref} from "vue";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
id: {
type: String,
@ -205,7 +206,7 @@ let exit = () => {
}
const detail = (id: any) => {
isShow.value = true
post("inventory/check/getCheckDetail",{id}).then((res: any) => {
post(API.Inventory.Check.GetDetail,{id}).then((res: any) => {
list.value = JSON.parse(res);
})
}

View File

@ -43,6 +43,7 @@ import {post} from "@/utils/request.ts";
import {ElMessageBox} from "element-plus";
import Mask from "@/components/common/Mask.vue";
import {ArrowUpBold, ArrowDownBold, Delete, Edit} from "@element-plus/icons-vue";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
type: {
@ -61,7 +62,7 @@ interface CateItem {
const cateList = ref<CateItem[]>([]);
const getCateList = () => {
post("goods/cate/list", {type: props.type}).then((res: any) => {
post(API.Goods.Cate.List, {type: props.type}).then((res: any) => {
cateList.value = res
})
}
@ -88,7 +89,7 @@ const close = () => {
const isShow = ref<any>(false)
const getCountByCateId = (cateId: any) => {
let count = 0;
post("goods/goods/getByCateId", {cateId: cateId}).then((res: any) => {
post(API.Goods.Base.GetByCateId, {cateId: cateId}).then((res: any) => {
count = res
ElMessageBox.confirm(
`${count}个西药属于该二级分类,删除后将一同清空西药的分类。是否确定删除?`,
@ -106,7 +107,7 @@ const getCountByCateId = (cateId: any) => {
}
const del = async (id: any) => {
await post("goods/cate/del", {id})
await post(API.Goods.Cate.Del, {id})
getCateList()
}
const saveDo = async () => {
@ -118,7 +119,7 @@ const saveDo = async () => {
})
if (cateList.value.length === 0) return
await post("goods/cate/save", {cateList: cateList.value})
await post(API.Goods.Cate.Save, {cateList: cateList.value})
getCateList()
}
const init = () => {
@ -135,10 +136,6 @@ const removeItemByIndex = (index: number) => {
cateList.value.splice(index, 1);
}
}
// const save = async ()=>{
// await post("goods/cate/save",cateList.value)
// getCateList()
// }
const add = () => {
const newCate: CateItem = {

View File

@ -454,6 +454,7 @@ import Divider from "@/components/Divider.vue";
import UnitSelector from "@/components/UnitSelector.vue";
import SocialInfo from "@/components/inventory/goods/SocialInfo.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {API} from "@/assets/config/API.ts";
let _type = ref(0);
@ -624,7 +625,7 @@ const init = (type: number, id: number) => {
isShow.value = true
_type.value = type;
if (id != null && id != 0) {
post("goods/goods/get", {id: id}).then((res: any) => {
post(API.Goods.Base.Get, {id: id}).then((res: any) => {
edit_data.value = res;
edit_data.value.tags = edit_data.value.tags ? edit_data.value.tags.split(",") : null;
edit_data.value.extra = JSON.parse(edit_data.value.extra);
@ -700,7 +701,7 @@ let save = async (isClose: Boolean) => {
data.tags = data.tags ? data.tags.join(",") : null;
data.idCode = idCodeList.value.join(",");
data.type = _type.value;
post("goods/goods/save", data).then((res: any) => {
post(API.Goods.Base.Save, data).then((res: any) => {
ElMessage.success('保存成功')
if (isClose) {
//
@ -721,7 +722,7 @@ let save = async (isClose: Boolean) => {
//
const cate_list: any = ref([]);
const getCateList = () => {
post("goods/cate/list", {type: _type.value}).then((res: any) => {
post(API.Goods.Cate.List, {type: _type.value}).then((res: any) => {
cate_list.value = res
})
}
@ -758,7 +759,7 @@ const returnInit = () => {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
post("goods/goods/returnInit", {id: edit_data.value.id})
post(API.Goods.Base.ReturnInit, {id: edit_data.value.id})
})
}
@ -791,7 +792,7 @@ const formRef = ref()
const hilistInfo = ref<any>({})
const getHilistInfo = () => {
if (edit_data.value.hilistCode) {
post("social/directory/getByCode", {code: edit_data.value.hilistCode}).then((res: any) => {
post(API.Social.Directory.GetByCode, {code: edit_data.value.hilistCode}).then((res: any) => {
hilistInfo.value = res
type.value = res.type
})
@ -824,7 +825,7 @@ const disableSale = () => {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
post(apiConfig.GoodsDisableSale, {id: edit_data.value.id}).then((res: any) => {
post(API.Goods.Base.DisableSale, {id: edit_data.value.id}).then((res: any) => {
ElMessage.success("下架成功")
exit()
})
@ -839,7 +840,7 @@ const enableSale = () => {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
post(apiConfig.GoodsEnableSale, {id: edit_data.value.id}).then((res: any) => {
post(API.Goods.Base.EnableSale, {id: edit_data.value.id}).then((res: any) => {
ElMessage.success("启用成功")
exit()
})

View File

@ -30,12 +30,13 @@
<script setup lang="ts">
import {ref} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
const packagingUnit = ref();
const minPackagingUnit = ref();
const show = ref(false)
const list = ref()
const init = (goodId: any) => {
post("inventory/goods/getListByGoodsId", {goodsId: goodId}).then((res) => {
post(API.Inventory.Goods.ListByGoodsId, {goodsId: goodId}).then((res) => {
list.value = res
if (list.value.length == 0) return
packagingUnit.value = list.value[0].packagingUnit

View File

@ -92,6 +92,7 @@
import {post} from "@/utils/request.ts";
import {onMounted, ref, defineProps} from "vue";
import {Minus, Plus, Setting} from "@element-plus/icons-vue";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
id: {
@ -126,7 +127,7 @@ onMounted(() => {
})
const init = () => {
if (!props.id) return
post("inventory/goods/getInventoryStatistics", {
post(API.Inventory.Goods.Statistics, {
goodsId: props.id,
startDate: formatDate(dateList.value[0]),
endDate: formatDate(dateList.value[1])

View File

@ -60,6 +60,7 @@
import {onMounted, ref, defineProps} from "vue";
import {post} from '@/utils/request.ts'
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
let current_search_data: any = null;
let keyword = ref('');
@ -146,7 +147,7 @@ let confirm = () => {
let isloading = ref(false);
let search_social = () => {
isloading.value = true;
post("social/directory/search", {
post(API.Social.Directory.Search, {
keyword: keyword.value,
produce: produce.value,
page: current_page.value,

View File

@ -40,6 +40,7 @@
<script setup lang="ts">
import {onMounted, ref, watch} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
interface HilistInfo {
type?: number;
@ -61,7 +62,7 @@ const hilistCode = defineModel<string>();
const hilistInfo = ref<HilistInfo>({});
const getHilistInfo = () => {
if (hilistCode.value) {
post("social/directory/getByCode", {code: hilistCode.value}).then((res: any) => {
post(API.Social.Directory.GetByCode, {code: hilistCode.value}).then((res: any) => {
hilistInfo.value = res
})
}

View File

@ -220,6 +220,7 @@ import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CheckoutDetail from "@/components/inventory/CheckoutDetail.vue";
import TraceabilityCodeInput from "@/components/inventory/purchase/TraceabilityCodeInput.vue";
import {Plus, Delete} from "@element-plus/icons-vue";
import {API} from "@/assets/config/API.ts";
const orderForm = ref()
const checkoutDetailRef = ref<any>(false);
@ -355,7 +356,7 @@ let confirm = async () => {
inventoryOrderGoodsList: JSON.parse(JSON.stringify(table_list.value))
}
isLoading.value = true
post("inventory/order/create", data).then((res: any) => {
post(API.Inventory.Order.Create, data).then((res: any) => {
isLoading.value = false
exit()
})
@ -393,13 +394,13 @@ const getSupplierList = () => {
const query = {
turn: 1
}
post("inventory/supplier/list", {query: query}).then((res: any) => {
post(API.Inventory.Supplier.List, {query: query}).then((res: any) => {
supplier_list.value = res.list
})
}
const userInfo = ref<any>({})
const getUserInfo = () => {
post("manager/user/verify", null).then((res: any) => {
post(API.Common.ManagerUser.Verify, null).then((res: any) => {
userInfo.value = res
inventory_order_data.value.managerUserId = res.id
})
@ -428,7 +429,7 @@ const init = (orderInfo: any,goodList: any) => {
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {}).then((res: any) => {
post(API.Common.ManagerUser.List, {}).then((res: any) => {
managerUserList.value = res
})
}

View File

@ -233,6 +233,7 @@ import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue";
import {Plus} from "@element-plus/icons-vue"
import {API} from "@/assets/config/API.ts";
const props = defineProps({
code: {
@ -265,7 +266,7 @@ const saveGoodEdit = (row: any) => {
const list = [];
list.push(row);
isLoading.value = true
post("inventory/goods/update", {list: list})
post(API.Inventory.Goods.Update, {list: list})
.then((res) => {
row.isEdit = false
getOrderDetail()
@ -307,7 +308,7 @@ const returnableAll = () => {
}
const returnableDo = (idList: any) => {
isLoading.value = true
post("inventory/order/returnable", {idList: idList}).then((res) => {
post(API.Inventory.Order.Refund, {idList: idList}).then((res) => {
getOrderDetail()
emit('updateOrderDetail')
isLoading.value = false
@ -315,7 +316,7 @@ const returnableDo = (idList: any) => {
}
const saveOrderEdit = () => {
isLoading.value = true
post("inventory/order/update", {inventoryOrder: inventory_order_data.value}).then((res) => {
post(API.Inventory.Order.Update, {inventoryOrder: inventory_order_data.value}).then((res) => {
orderInfoIsEdit.value = false
getOrderDetail()
emit('updateOrderDetail')
@ -365,12 +366,12 @@ const getSupplierList = () => {
const query = {
turn: 1
}
post("inventory/supplier/list", {query: query}).then((res: any) => {
post(API.Inventory.Supplier.List, {query: query}).then((res: any) => {
supplier_list.value = res.list
})
}
const getOrderDetail = () => {
post("inventory/order/detail", {code: code.value}).then((res: any) => {
post(API.Inventory.Order.Detail, {code: code.value}).then((res: any) => {
inventory_order_data.value = res.inventoryOrder
table_list.value = res.inventoryOrderGoodsList
})
@ -382,7 +383,7 @@ const addOneGoods = (row: any) => {
return
}
isLoading.value = true
post("inventory/order/addOneGoods", {data: data}).then(
post(API.Inventory.Order.AddGoods, {data: data}).then(
(res: any) => {
getOrderDetail()
emit('updateOrderDetail')
@ -392,7 +393,7 @@ const addOneGoods = (row: any) => {
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {}).then((res: any) => {
post(API.Common.ManagerUser.List, {}).then((res: any) => {
managerUserList.value = res
})
}

View File

@ -60,6 +60,7 @@ import {ref} from "vue";
import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const formData = ref({
name: null,
@ -78,7 +79,7 @@ const save = () => {
errorMsg.value = '供货商名称不能为空'
return
}
post("inventory/supplier/save", {inventorySupplier: formData.value}).then((res: any) => {
post(API.Inventory.Supplier.Save, {inventorySupplier: formData.value}).then((res: any) => {
close()
})
}

View File

@ -60,6 +60,7 @@ import {ref, defineEmits, defineProps} from 'vue'
import {ElFormItem} from "element-plus";
import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const isExchange = defineModel()
const emit = defineEmits(['close'])
@ -95,7 +96,7 @@ const reduceIntegral = () => {
//
data.value.integral = data.value.integral * -1
data.value.vipId = props.info.id
post("vip/integral/add", data.value).then((res: any) => {
post(API.Patient.Integral.Add, data.value).then((res: any) => {
formDataRef.value?.resetFields();
close()
})

View File

@ -57,6 +57,7 @@
import {ref, defineEmits, defineProps, onMounted} from 'vue'
import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue";
import {API} from "@/assets/config/API.ts";
const isFlowingWater = defineModel()
const props = defineProps({
@ -80,7 +81,7 @@ const changePage = (page: any) => {
pageSize: 20,
vipId: id.value
}
post('vip/integral/list', {query: query}).then((res: any) => {
post(API.Patient.Integral.List, {query: query}).then((res: any) => {
tableData.value.splice(0, tableData.length, ...res.list)
})
}
@ -92,7 +93,7 @@ const init = (id: any) => {
pageSize: 10,
vipId: id
}
post('vip/integral/list', {query: query}).then((res: any) => {
post(API.Patient.Base.List, {query: query}).then((res: any) => {
tableData.value.splice(0, tableData.length, ...res.list)
total.value = res.total_count
})

View File

@ -215,6 +215,7 @@ import {formatDate} from "@/utils/dateUtils.ts";
import CardDefault from "@/components/registration/CardDefault.vue";
import {getKey} from "@/utils/discrotyUtil.ts";
import insutypes from "@/assets/config/directory/insutypes.json";
import {API} from "@/assets/config/API.ts";
const ruleFormRef = ref<FormInstance>()
@ -354,11 +355,11 @@ const submitForm = async () => {
if (valid) {
ruleForm.value.birthday = formatDate(ruleForm.value.birthday)
if (ruleForm.value.id) {
post("vip/vip/update", {vipInfo: ruleForm.value}).then(() => {
post(API.Patient.Base.Update, {vipInfo: ruleForm.value}).then(() => {
close()
})
} else {
post("vip/vip/create", {vipInfo: ruleForm.value}).then(() => {
post(API.Patient.Base.Create, {vipInfo: ruleForm.value}).then(() => {
close()
})
}
@ -399,14 +400,14 @@ const init = (_id: any) => {
ruleForm.value = {}
return
} else {
post("vip/vip/get", {id: _id}).then((res: any) => {
post(API.Patient.Base.Get, {id: _id}).then((res: any) => {
ruleForm.value = res
ruleForm.value.area = JSON.parse(ruleForm.value.area)
ruleForm.value.levelId = ruleForm.value.levelId == 0 ? null : ruleForm.value.levelId
ruleForm.value.certType=Number(ruleForm.value.certType)
ruleForm.value.nation=Number(ruleForm.value.nation)||''
if (!res.levelId) return
post("vip/vipLevel/get", {levelId: res.levelId}).then((res: any) => {
post(API.Patient.LevelConfig.Get, {levelId: res.levelId}).then((res: any) => {
levelName.value = res.name
})
})
@ -416,7 +417,7 @@ const init = (_id: any) => {
}
const levelList = ref<any>([])
const getLevelConfig = () => {
post("vip/vipLevel/list").then((res: any) => {
post(API.Patient.LevelConfig.List).then((res: any) => {
levelList.value = res
})
}

View File

@ -18,18 +18,19 @@
import Mask from "@/components/common/Mask.vue";
import {onMounted, ref} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
const show = ref(false);
const options = ref<any>([])
const levelId = ref(0);
const curVip =ref<any>({})
const getLevelConfig = () => {
post("vip/vipLevel/list").then((res: any) => {
post(API.Patient.LevelConfig.List).then((res: any) => {
options.value = res
})
}
const emit = defineEmits(['close'])
const save = () => {
post("vip/vip/changeLevel",{vipId:curVip.value.id,levelId:levelId.value}).then((res:any)=>{
post(API.Patient.LevelConfig.Edit,{vipId:curVip.value.id,levelId:levelId.value}).then((res:any)=>{
close()
})
}

View File

@ -95,7 +95,7 @@ interface ShowConfig {
prop: string;
}
const diagnosisSearchApi = apiConfig.SocialDiagnoseSearch
const diagnosisSearchApi = API.Social.Diagnose.Search
const diagnosisShowConfig: ShowConfig[] = [
{
label: "诊断名称",

View File

@ -27,6 +27,7 @@ import DiseaseDetails from './DiseaseDetails.vue';
import {post} from "@/utils/request.ts";
import {ref} from "vue";
import {formatListTime} from "@/utils/dateUtils.ts";
import {API} from "@/assets/config/API.ts";
const props = defineProps({
status: {
@ -36,7 +37,7 @@ const props = defineProps({
})
const list = ref<any>([])
const init = (patientId: any) => {
post("medical/record/listByPatient", {patientId: patientId}).then((res: any) => {
post(API.Diagnosis.ListByPatient, {patientId: patientId}).then((res: any) => {
list.value = res
})
}

View File

@ -58,6 +58,7 @@ import {formatListTime, getToday, getThisMonth, getCurrentDate, getEndOfDay} fro
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {ElMessageBox} from "element-plus";
import {Calendar} from '@element-plus/icons-vue'
import {API} from "@/assets/config/API.ts";
const curStatus = ref(1)
const search = ref('')
@ -117,7 +118,7 @@ onUnmounted(() => {
const initList = async () => {
selectedDateStr.value = setDateTip()
try {
let data: any = await post(apiConfig.RegistrationList, {
let data: any = await post(API.Patient.Registration.AllList, {
query: {
status: curStatus.value,
beginTime: selectedDate.value,
@ -144,7 +145,7 @@ const init = async () => {
clickLi(null)
loading.value = true
try {
let data: any = await post(apiConfig.RegistrationListByType, {
let data: any = await post(API.Patient.Registration.ListByType, {
query: {
status: curStatus.value,
beginTime: selectedDate.value,
@ -168,7 +169,7 @@ const init = async () => {
initStatusList()
}
const initStatusList = () => {
post(apiConfig.StatisticsGetTipCount, {
post(API.Patient.Registration.ChangeStatus, {
beginTime: selectedDate.value,
endTime: getEndOfDay(new Date(selectedDate.value))
}).then((res: any) => {
@ -192,7 +193,7 @@ const clickLi = (item: any, showBox: any = true) => {
return
}
if (action == "confirm") {
post(apiConfig.RegistrationChangeStatus, {id: item.id, status: 2}).then((res: any) => {
post(API.Patient.Registration.ChangeStatus, {id: item.id, status: 2}).then((res: any) => {
curStatus.value = 2
curItem.value = res
initStatusList()

View File

@ -4,6 +4,7 @@ import {ElMessage} from "element-plus";
import {post} from "@/utils/request.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {useWsStore} from "@/stores/wsStore.ts";
import {API} from "@/assets/config/API.ts";
const wsStore = useWsStore();
const isReading = ref(false)
@ -76,7 +77,7 @@ const getInfoFor1101 = (params: any) => {
duration: 500,
type: 'info',
});
post("social/person/getCustomSocialInfo", {data: params}, {catch_error: true}).then((res: any) => {
post(API.Social.Person.GetCustomSocialInfo, {data: params}, {catch_error: true}).then((res: any) => {
emit('changeLoading', false)
socialCard.value.data = res;
socialCard.value.mdtrtCertType = params.mdtrtCertType;

View File

@ -225,6 +225,7 @@ import insutypes from "@/assets/config/directory/insutypes.json"
import {apiConfig} from "@/assets/config/apiConfig.ts";
import Quick from "@/components/charge/RecordsLog/Quick.vue";
import {getCurrentTime, getToday} from "@/utils/dateUtils.ts";
import {API} from "@/assets/config/API.ts";
const height = ref(570)
const certTypeList = ref<any>([])
@ -311,7 +312,7 @@ const save = () => {
}
if (edit_data.value.id) {
post(apiConfig.RegistrationEdit, {
post(API.Patient.Base.Update, {
data: data, mdtrtCertNo: socialCard.value?.mdtrtCertNo,
mdtrtCertType: socialCard.value?.mdtrtCertType
}).then(() => {
@ -319,7 +320,7 @@ const save = () => {
close()
})
} else {
post(apiConfig.RegistrationAdd, {
post(API.Patient.Base.Create, {
data: data,
mdtrtCertNo: socialCard.value?.mdtrtCertNo,
mdtrtCertType: socialCard.value?.mdtrtCertType
@ -341,7 +342,7 @@ const save = () => {
}
//退
const registrationCancel = () => {
post(apiConfig.RegistrationChangeStatus, {id: edit_data.value.id, status: 0}).then(() => {
post(API.Patient.Base.Del, {id: edit_data.value.id, status: 0}).then(() => {
ElMessage.success('退号成功')
close()
})
@ -441,7 +442,7 @@ const hide = () => {
const sectionList = ref<any>([])
const getSectionList = () => {
if (!edit_data.value.organizationDoctorId) return
post(apiConfig.OrganizationSectionListByMemberId, {memberId: edit_data.value.organizationDoctorId}).then((res: any) => {
post(API.Organization.Member.List, {memberId: edit_data.value.organizationDoctorId}).then((res: any) => {
sectionList.value = res
if (res.length > 0) {
edit_data.value.organizationSectionId = res[0].id

View File

@ -1,152 +0,0 @@
<template>
<Mask :height="600" :width="700" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card>
<div class="panel">
<div class="header">
请勾选该追溯码关联的发药项目商品
</div>
<div class="code">
<div class="before-code">
{{ traceabilityCode.slice(0, 7) }}
</div>
<div class="after-code">
{{ traceabilityCode.slice(7, traceabilityCode.length) }}
</div>
</div>
<div class="table">
<table class="simple-table">
<thead>
<tr>
<th>选择</th>
<th>发药项目</th>
<th>产品标识码</th>
<th>系统处理</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in tableData">
<td><input class="blue-radio" type="radio" :value="item.id" v-model="selected"/></td>
<td>{{ item.name }}</td>
<td>
<IdCodeListShow :idCodeList="item.idCode" v-if="item.idCode && item.idCode.length > 0"/>
<div v-else>未关联</div>
</td>
<td style="width: 300px;">
<template v-if="selected === item.id">
关联产品标识码采集追溯码自动识别商品
</template>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<el-button @click="addIdCode" type="primary">确定</el-button>
<el-button @click="show = false" type="primary">关闭</el-button>
</template>
</el-card>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {ref} from "vue"
import IdCodeListShow from "@/components/retail/IdCodeListShow.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts";
import {ElMessage} from "element-plus";
interface TableItem {
id: string;
name: string;
idCode?: string[] | undefined; // undefined
gatherNumber?: number;
retailNumber?: number;
packagingUnit?: string;
minPackagingUnit?: string;
selectedUnit?: string;
minPackagingNumber?: number;
traceAbilityCodeList?: { code: string; number: number }[];
}
const show = ref(false);
const traceabilityCode = ref("");
const tableData = ref<TableItem[]>([]);
const init = (newIdCode: any, newTableDate: any) => {
traceabilityCode.value = newIdCode;
tableData.value = newTableDate;
show.value = true;
}
const selected = ref()
defineExpose({init})
const addIdCode = ()=>{
if (traceabilityCode.value ==""){
return;
}
let idCode = traceabilityCode.value.slice(0, 7);
post("goods/goods/addIdCode",{goodsId:selected.value,idCode:idCode}).then((res:any)=>{
show.value = false;
for (let subItem of tableData.value){
if (subItem.id === selected.value){
subItem.idCode?.push(idCode);
break
}
}
})
const selectedItem = tableData.value.find((item: any) => item.id === selected.value);
if(!selectedItem){
return
}
addTraceabilityCode(selectedItem)
}
const emit = defineEmits(["addIdCode","addTraceabilityCode"])
const addTraceabilityCode = (item: any) => {
emit("addTraceabilityCode",traceabilityCode)
}
</script>
<style scoped lang="scss">
.panel {
height: 400px;
.header {
margin-top: 20px;
font-size: 24px;
display: flex;
justify-content: center;
align-items: center;
}
.code {
height: 50px;
display: flex;
font-size: 24px;
justify-content: center;
align-items: center;
.before-code {
color: #7a8794;
}
.after-code {
margin-left: 10px;
}
}
.table {
.simple-table {
.blue-radio {
accent-color: #28addd;
}
}
}
}
</style>

View File

@ -1,128 +0,0 @@
<template>
<Mask :height="600" :width="900" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card>
<template #header>
<div class="card-header">
<div class="header">选择批次</div>
</div>
</template>
<div class="detail">
<div class="total">
<div class="name">{{ item.name }}</div>
<div class="number">总量
<el-input-number v-model="item.retailNumber" @change="changeTotalNumber()"></el-input-number>
{{ item.selectedUnit }}
</div>
</div>
<div class="batch">
<table class="simple-table table">
<thead>
<tr>
<th>生产批号</th>
<th>效期</th>
<th>生产日期</th>
<th>进价</th>
<th>入库日期</th>
<th>库存</th>
<th>数量</th>
<th>单位</th>
</tr>
</thead>
<tbody>
<tr v-for="(subItem,index) in item.retailOrderList">
<td>{{ subItem.inventory.purchaseUnitPrice }}</td>
<td>{{ subItem.inventory.expiryDate }}</td>
<td>{{ subItem.inventory.productionDate }}</td>
<td>{{ subItem.inventory.purchaseUnitPrice.toFixed(2) }}</td>
<td>{{ subItem.inventory.createDatetime }}</td>
<td>{{ subItem.inventory.wholeNumber }}{{ subItem.inventory.packagingUnit }}
<template v-if="item.trdnFlag ==1">
{{ subItem.inventory.fragmentNumber }}{{ subItem.inventory.minPackagingUnit }}
</template>
</td>
<td>
<template v-if="item.selectedUnit == item.packagingUnit">
<el-input-number v-model="subItem.deductWhole" @click="changeBatchNumber()"></el-input-number>
</template>
<template v-else>
<el-input-number v-model="subItem.deductFragment" @click="changeBatchNumber()"></el-input-number>
</template>
</td>
<td>{{ item.selectedUnit }}</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<div>
<el-button @click="show = false" type="primary">确定</el-button>
<el-button @click="show = false">关闭</el-button>
</div>
</template>
</el-card>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {ref} from "vue";
import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue";
const item = ref();
const show = ref(false);
const init = (data: any) => {
item.value = data;
show.value = true;
}
defineExpose({init});
const getPreout = (item: any) => {
post("retail/preout", {id: item.value.id, wholeNumber: item.value.retailNumber}).then((res: any) => {
item.value.retailOrderList = res;
})
}
const changeBatchNumber = () => {
item.value.retailNumber = 0;
item.value.retailOrderList.forEach((subItem: any) => {
item.value.retailNumber += subItem.deductWhole;
})
item.value.totalPrice = Number(item.value.retailNumber) * Number(item.value.unitPrice)
}
const changeTotalNumber = () => {
item.value.totalPrice = Number(item.value.retailNumber) * Number(item.value.unitPrice)
getPreout(item);
}
</script>
<style scoped lang="scss">
.header {
font-size: 18px;
font-weight: bold;
}
.detail {
margin-top: 10px;
height: 350px;
.total {
display: flex;
.name {
width: 70%;
}
.number {
margin-left: 20px;
}
}
}
</style>

View File

@ -1,236 +0,0 @@
<script setup lang="ts">
import {getKey} from "@/utils/discrotyUtil.ts";
import gends from "@/assets/config/directory/gends.json";
import natys from "@/assets/config/directory/antys.json";
import psnCertTypes from "@/assets/config/directory/psnCertTypes.json";
import insutypes from "@/assets/config/directory/insutypes.json";
import {onMounted, onUnmounted, ref} from "vue";
import {ElMessage} from "element-plus";
import {post} from "@/utils/request.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {useWsStore} from "@/stores/wsStore.ts";
const wsStore = useWsStore();
const isReading = ref(false)
const socialCard: any = defineModel();
const ReadSocialCard = async (readType: string) => {
socialCard.value.lastUse = "CardDefault"
isReading.value = true;
let config_db: any = await post('common/config/getall');
let config: any = {}
config.ACCESS_KEY = config_db.social_ACCESS_KEY;
config.SECRETKEY = config_db.social_SECRETKEY;
config.IP = config_db.social_IP;
config.PORT = config_db.social_PORT;
config.ORGID = config_db.social_fixmedinsCode;
config.EC_URL = config_db.social_EC_URL;
let data: any = {}
data.officeId = "1"
data.officeName = "内科";
data.operatorId = "1";
data.operatorName = "陈庭荣";
data.readType = readType;
let request: Request = {
type: "ReadCard",
config: config,
data: data
}
wsStore.sendMessage(request);
};
const reciceMessage = (response: Response) => {
if (socialCard.value.lastUse != "CardDefault") {
return;
}
if (response.Code == 301) {
let msg = response.Message;
ElMessage({
message: msg,
type: 'warning',
});
isReading.value = false;
return;
}
let readType = response.Data.readType;
if (!readType) {
return
}
const params = {
mdtrtCertType: readType,
mdtrtCertNo: response.Data.mdtrt_cert_no,
certno: response.Data.certno,
psnName: response.Data.psn_name,
psnCertType: "01",
cardSn: response.Data.card_sn ? response.Data.card_sn : "",
}
getInfoFor1101(params)
}
const emit = defineEmits(['socialCardUpdate'])
const getInfoFor1101 = (params: any) => {
post("social/person/getCustomSocialInfo", {data: params}).then((res: any) => {
socialCard.value.data = res;
socialCard.value.mdtrtCertType = params.mdtrtCertType;
socialCard.value.mdtrtCertNo = params.mdtrtCertNo;
emit('socialCardUpdate')
}).finally(() => {
isReading.value = false;
})
}
onMounted(async () => {
wsStore.setMessageCallback(reciceMessage)
});
onUnmounted(() => {
wsStore.removeAllMessageCallback()
})
</script>
<template>
<div class="card-default">
<div class="info" v-if="socialCard.data">
<el-descriptions title="医保卡信息" column="2" border>
<el-descriptions-item label="姓名">{{ socialCard.data.baseinfo.psn_name }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ getKey(gends, socialCard.data.baseinfo.gend) }}</el-descriptions-item>
<el-descriptions-item label="年龄">{{ Math.floor(socialCard.data.baseinfo.age) }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ getKey(natys, socialCard.data.baseinfo.naty) }}</el-descriptions-item>
<el-descriptions-item label="证件类型" span="2">{{
getKey(psnCertTypes, socialCard.data.baseinfo.psn_cert_type)
}}
</el-descriptions-item>
<el-descriptions-item label="证件号码" span="2">{{ socialCard.data.baseinfo.certno }}</el-descriptions-item>
</el-descriptions>
<div class="btn-wrapper">
<el-button text bg @click="socialCard.data = null">退出医保卡</el-button>
</div>
<div class="insuinfo" v-if="socialCard.data.insuinfo">
<el-scrollbar max-height="180">
<div class="item" v-for="(item,index) in socialCard.data.insuinfo"><span
class="name">账户余额({{ getKey(insutypes, item.insutype) }})</span><span
class="value">{{ item.balc.toFixed(2) }}</span></div>
</el-scrollbar>
</div>
</div>
<div class="empty" v-else>
<div class="tip" v-loading="isReading">
<img style="width: 100%;height: 226px" src="/static/images/retail/null.png" alt="">
</div>
<div class="btn-wrapper">
<div class="btn" @click="ReadSocialCard('03')" @keydown.enter.prevent tabindex="-1">医保卡</div>
<div class="btn" @click="ReadSocialCard('01')" @keydown.enter.prevent tabindex="-1">电子凭证</div>
<div class="btn" @click="ReadSocialCard('02')" @keydown.enter.prevent tabindex="-1">身份证</div>
<div class="btn" @click="ReadSocialCard('04')" @keydown.enter.prevent tabindex="-1">人脸识别</div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.card-default {
position: relative;
width: 100%;
height: 100%;
.insuinfo {
position: relative;
width: 100%;
box-sizing: border-box;
border-radius: 5px;
padding: 10px;
background: #EEE;
max-height: 200px;
.item {
position: relative;
width: 100%;
height: 30px;
line-height: 30px;
font-size: 14px;
color: #666;
display: flex;
.name {
flex: 1;
}
.value {
width: 80px;
text-align: right;
}
}
}
.empty {
padding: 0 24px;
.tip {
height: 100%;
background: linear-gradient(157deg, #FAFCFF 0%, #F2F5FC 100%);
border-radius: 8px 8px 8px 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-weight: 400;
font-size: 12px;
color: #AAAAAA;
line-height: 17px;
text-align: left;
font-style: normal;
text-transform: none;
}
.btn-wrapper {
height: 100%;
display: flex;
margin-top: 24px;
.btn {
flex: 1;
height: 40px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #4D6DE4;
cursor: pointer;
font-weight: bold;
font-size: 16px;
color: #4D6DE4;
font-style: normal;
line-height: 40px;
text-align: center;
&:hover {
background: #4D6DE4;
color: #FFFFFF;
}
&:nth-child(2n) {
margin:0 8px;
}
&:last-child{
margin-right: 0;
}
}
}
}
.top {
margin: 20px 0 8px 0;
}
}
.info {
position: relative;
width: 100%;
height: 100%;
.btn-wrapper {
position: relative;
width: 100%;
height: 60px;
line-height: 60px;
text-align: right;
}
}
</style>

View File

@ -1,197 +0,0 @@
<script setup lang="ts">
import {getKey} from "@/utils/discrotyUtil.ts";
import insutypes from "@/assets/config/directory/insutypes.json";
import {onMounted, onUnmounted, ref} from "vue";
import {ElMessage} from "element-plus";
import {post} from "@/utils/request.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {useWsStore} from "@/stores/wsStore.ts";
const wsStore = useWsStore();
const isReading = ref(false)
const socialCard:any = defineModel();
const ReadSocialCard = async (readType: string) => {
socialCard.value.lastUse="cardPay"
isReading.value = true;
let config_db: any = await post('common/config/getall');
let config: any = {}
config.ACCESS_KEY = config_db.social_ACCESS_KEY;
config.SECRETKEY = config_db.social_SECRETKEY;
config.IP = config_db.social_IP;
config.PORT = config_db.social_PORT;
config.ORGID = config_db.social_fixmedinsCode;
config.EC_URL = config_db.social_EC_URL;
let data: any = {}
data.officeId = "1"
data.officeName = "内科";
data.operatorId = "1";
data.operatorName = "陈庭荣";
data.readType = readType;
let request: Request = {
type: "ReadCard",
config: config,
data: data
}
wsStore.sendMessage(request);
};
const reciceMessage = (response: Response) => {
if(socialCard.value.lastUse!="cardPay"){
return;
}
if (response.Code == 301) {
let msg = response.Message;
ElMessage({
message: msg,
type: 'warning',
});
isReading.value = false;
return;
}
let readType = response.Data.readType;
if (!readType) {
return
}
const params = {
mdtrtCertType: readType,
mdtrtCertNo: response.Data.mdtrt_cert_no,
certno: response.Data.certno,
psnName: response.Data.psn_name,
psnCertType: "01",
cardSn: response.Data.card_sn ? response.Data.card_sn : "",
}
getInfoFor1101(params)
}
const getInfoFor1101 = (params: any) => {
post("social/person/getCustomSocialInfo", {data: params}).then((res: any) => {
socialCard.value.data = res;
socialCard.value.mdtrtCertType = params.mdtrtCertType;
socialCard.value.mdtrtCertNo = params.mdtrtCertNo;
socialCard.value.payInfo.selfpay_prop_type = socialCard.value.data.insuinfo[0].insutype;
}).finally(() => {
isReading.value = false;
})
}
onMounted(async () => {
wsStore.setMessageCallback(reciceMessage)
});
onUnmounted(()=>{
wsStore.removeAllMessageCallback()
})
</script>
<template>
<div class="card-pay">
<div class="left">医保<br/>信息</div>
<div class="right">
<div class="insuinfo" v-if="socialCard.data">
<div class="line">
<div class="label">姓名</div>
<div class="info">{{ socialCard.data.baseinfo.psn_name }}</div>
<div class="btn" @click="socialCard.data=null">退出</div>
</div>
<div class="line">
<div class="label">险种</div>
<div class="info">
<el-select v-model="socialCard.payInfo.selfpay_prop_type" placeholder="请选择" style="width: 100%">
<el-option
v-for="(item,index) in socialCard.data.insuinfo"
:key="item.insutype"
:label="'账户余额'+getKey(insutypes, item.insutype)+'('+item.balc.toFixed(2)+')'"
:value="item.insutype"
>
</el-option>
</el-select>
</div>
</div>
</div>
<div class="card-empty" v-else>
<div class="tip" v-loading="isReading">暂无医保信息</div>
<div class="btn-wrapper"> <div class="btn" @click="ReadSocialCard('03')" tabindex="-1">医保卡</div>
<div class="btn" @click="ReadSocialCard('01')" tabindex="-1">电子码</div>
<div class="btn" @click="ReadSocialCard('02')" tabindex="-1">身份证</div>
<div class="btn" @click="ReadSocialCard('04')" tabindex="-1">人脸识别</div></div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.card-pay {
position: relative;
display: flex;
.left {
width: 100px;
height: 100px;
background: #DDD;
text-align: center;
line-height: 30px;
font-size: 24px;
color: #666;
padding: 20px;
box-sizing: border-box;
border-radius: 10px 0 0 10px;
}
.right {
position: relative;
flex: 1;
background: #EEE;
box-sizing: border-box;
padding: 10px;
border-radius: 0 10px 10px 0;
.line{
position: relative;
display: flex;
height: 40px;
box-sizing: border-box;
padding-left: 10px;
padding-right: 10px;
line-height: 40px;
.label{
position: relative;
width: 40px;
}
.info{
flex: 1;
}
}
.card-empty{
width: 100%;
height: 100%;
overflow: hidden;
.tip{
position: relative;
width: 100%;
height: 50px;
text-align: center;
line-height: 40px;
}
.btn-wrapper{
position: relative;
height: 30px;
display: flex;
.btn{
flex: 1;
margin-left: 5px;
margin-right: 5px;
}
}
}
.btn{
text-align: center;
line-height: 30px;
outline: none;
color: #409EFF;
cursor: pointer;
}
}
}
</style>

View File

@ -1,213 +0,0 @@
<template>
<Mask :height="650" :width="900" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card>
<template #header>
<div class="header">追溯码采集</div>
</template>
<div class="detail">
<el-input placeholder="请输入追溯码" v-model="inputIdCode" clearable @keydown.enter="openAssociationIdCode()">
<template #prefix>
<el-icon>
<Monitor/>
</el-icon>
</template>
</el-input>
<div class="list">
<table class="simple-table">
<thead>
<tr>
<th>发药项目</th>
<th>产品标识码</th>
<th>发药数量</th>
<th>已采/应采</th>
<th>追溯码</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in list" :key="index">
<td>{{ item.name }}</td>
<td>
<IdCodeListShow :idCodeList="item.idCode" v-if="item.idCode.length>0"/>
<div v-else>未关联</div>
</td>
<td>{{ item.retailNumber }}{{ item.selectedUnit }}</td>
<td>{{ item.gatherNumber }}/{{ item.retailNumber }}</td>
<td>
<TraceabilityCodeAdd :item="item"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<div class="bottom-btn">
<el-button @click="saveRetail()" type="primary">确定</el-button>
<el-button @click="show = false">关闭</el-button>
</div>
</template>
</el-card>
<AssociationIdCode ref="associationIdCodeRef" @addIdCode="cleanInputIdCode"></AssociationIdCode>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {nextTick, ref} from "vue";
import IdCodeListShow from "@/components/retail/IdCodeListShow.vue";
import AssociationIdCode from "@/components/retail/AssociationIdCode.vue";
import TraceabilityCodeAdd from "@/components/retail/TraceabilityCodeAdd.vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {post} from "@/utils/request.ts";
const show = ref(false)
const list = ref()
const orderInfo = ref()
const init = (data: any) => {
list.value = data
show.value = true
}
const close = () => {
show.value = false
}
defineExpose({init, close})
const emit = defineEmits(['confirm'])
const saveRetail = () => {
if (!checkTraceCode()) {
ElMessageBox.confirm(
`追溯码采集未完成是否继续?`,
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
emit('confirm')
})
return
}
emit('confirm')
}
const checkTraceCode = () => {
for (let i = 0; i < list.value.length; i++) {
const item = list.value[i];
if (item.gatherNumber !== item.retailNumber) {
return false;
}
}
return true;
}
const inputIdCode = ref()
const associationIdCodeRef = ref()
const openAssociationIdCode = () => {
if (addTraceAbilityCode()) {
return
}
nextTick(() => {
associationIdCodeRef.value.init(inputIdCode.value, list.value)
})
}
const addTraceAbilityCode = () => {
for (let i = 0; i < list.value.length; i++) {
let item = list.value[i];
let idCode = inputIdCode.value.slice(0, 7);
if (item.idCode.includes(idCode)) {
addTraceabilityCodeDo(item);
return true
}
}
return false
}
const addTraceabilityCodeDo = (item: any) => {
if (!item.traceAbilityCodeList) {
item.traceAbilityCodeList = []
}
if (item.retailNumber == item.gatherNumber) {
ElMessage({
message: '采集数量已满',
type: 'warning',
})
return
}
const index = item.traceAbilityCodeList.findIndex((codeObj: any) => codeObj.code === inputIdCode.value);
if (index == -1 && item.selectedUnit == item.packagingUnit) {
item.traceAbilityCodeList.push({
code: inputIdCode.value,
number: 1
})
cleanInputIdCode()
getGatherNumber(item)
return;
}
if (index == -1 && item.selectedUnit == item.minPackagingUnit) {
let needCodeCount = item.retailNumber - item.gatherNumber;
let number = 1;
if (needCodeCount >= item.minPackagingNumber) {
number = item.minPackagingNumber;
}
if (needCodeCount < item.minPackagingNumber) {
number = needCodeCount;
}
item.traceAbilityCodeList.push({
code: inputIdCode.value,
number: number
})
cleanInputIdCode()
getGatherNumber(item)
return;
}
if (item.selectedUnit == item.packagingUnit) {
//
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
} else {
//使minPackagingNumber
if (item.traceAbilityCodeList[index].number == item.minPackagingNumber) {
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
}
item.traceAbilityCodeList[index].number += 1;
}
cleanInputIdCode()
getGatherNumber(item)
}
const getGatherNumber = (item: any) => {
let gatherNumber = 0;
for (let subItem of item.traceAbilityCodeList) {
gatherNumber += subItem.number;
}
item.gatherNumber = gatherNumber;
}
const cleanInputIdCode = () => {
inputIdCode.value = ''
}
</script>
<style scoped lang="scss">
.header {
font-size: 18px;
font-weight: bold;
}
.detail {
.list {
height: 400px;
}
}
</style>

View File

@ -1,57 +0,0 @@
<script setup lang="ts">
const props = defineProps({
idCodeList: {
type: Array,
default: () => []
}
})
</script>
<template>
<el-popover
title="已关联的追溯码产品标识码:"
placement="bottom-start"
trigger="hover"
width="250px"
popper-class="id-code-popper"
>
<template #reference>
<div class="id-code-panel">
<div class="code" v-if="props.idCodeList.length >0">{{props.idCodeList[0]}}</div>
<div class="number" v-if="props.idCodeList.length >1">
+{{props.idCodeList.length-1}}
</div>
</div>
</template>
<template #default>
<div class="id-code-detail">
<div class="item" v-for="(item,index) in props.idCodeList" :key="index">
{{index+1}}.{{item}}
</div>
</div>
</template>
</el-popover>
</template>
<style scoped lang="scss">
.id-code-panel{
display: flex;
.number{
margin-left: 10px;
color: #4D6DE4;
}
}
.id-code-detail{
.item{
height: 35px;
line-height: 35px;
border-bottom: 1px solid #DCDFE6;
padding-left: 24px;
&:last-child{
border-bottom: none;
}
}
}
</style>

View File

@ -1,52 +0,0 @@
<template>
<Mask :width="800" :height="600" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<div class="table">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="createTime" label="创建时间"></el-table-column>
<el-table-column prop="goodsName" label="商品"></el-table-column>
<el-table-column prop="totalPrice" label="应收金额"></el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" @click="ladingBill(scope.row)">提单</el-button>
</template>
</el-table-column>
</el-table>
</div>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {ref} from "vue";
import {post} from "@/utils/request.ts";
import CloseBtn from "@/components/CloseBtn.vue";
const show = ref(false)
const tableData = ref<any>([])
const emit = defineEmits(['ladingBill'])
const getBillList = () => {
post("retail/regis/list").then((res: any) => {
tableData.value = res
tableData.value.forEach((item:any)=>{
item.data = JSON.parse(item.data)
})
})
}
const ladingBill = (row:any)=>{
emit('ladingBill',row)
show.value = false
}
const init = () => {
show.value = true
getBillList()
}
defineExpose({init})
</script>
<style scoped lang="scss">
.table{
margin-top: 30px;
}
</style>

View File

@ -1,386 +0,0 @@
<template>
<Mask :width="1000" :height="560" :is-show="show" @close="show = false" title="订单详情">
<div class="container">
<div class="title">
<CloseBtn @click="show = false"></CloseBtn>
</div>
<div class="content">
<div class="left">
<div class="goods-detail">
<div class="title">药品详情</div>
<el-table border :header-cell-style="{ backgroundColor: '#f5f7fa' }" :data="orderInfo.goodsDetail" style="height: 100%">
<el-table-column label="商品" prop="name" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="数量" prop="number" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单位" prop="unit" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.preUnitPrice }}
</template>
</el-table-column >
<el-table-column label="实价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.unitPrice }}
</template>
</el-table-column>
<el-table-column label="小计" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.subTotalPrice }}
</template>
</el-table-column>
<el-table-column label="追溯码" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.traceabilityCode?.length ==2 ?"未绑定追溯码":scope.row.traceabilityCode}}
</template>
</el-table-column>
</el-table>
</div>
<div class="service-detail">
<div class="title">服务详情</div>
<el-table border :header-cell-style="{ backgroundColor: '#f5f7fa' }" :data="orderInfo.serviceDetail" style="height: 100%">
<el-table-column label="商品" prop="name" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="数量" prop="number" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单位" prop="unit" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.preUnitPrice }}
</template>
</el-table-column >
<el-table-column label="实价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.unitPrice }}
</template>
</el-table-column>
<el-table-column label="小计" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.subTotalPrice }}
</template>
</el-table-column>
<el-table-column label="追溯码" show-overflow-tooltip>
<template #default="scope">
-
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="right">
<div class="right_head">
<div class="title">支付信息</div>
<div class="info">
<div class="item">
<div class="label">开单时间</div>
<div class="value">{{formatDate(orderInfo.createDatetime)}}</div>
</div>
<div class="item">
<div class="label">完成时间</div>
<div class="value">{{ formatDate(orderInfo.payTime)}}</div>
</div>
<div class="item">
<div class="label">收费员</div>
<div class="value">{{ orderInfo.salePersonName }}</div>
</div>
<div class="item">
<div class="label">药师</div>
<div class="value">{{ orderInfo.dockerName}}</div>
</div>
<div class="item">
<div class="label">销售人</div>
<div class="value">{{ orderInfo.salePersonName }}</div>
</div>
<div class="item">
<div class="label">原价</div>
<div class="value">{{ orderInfo.preTotalPrice }}</div>
</div>
<div class="item">
<div class="label">优惠</div>
<div class="value">{{ (orderInfo.preTotalPrice-orderInfo.totalPrice).toFixed(2)}}</div>
</div>
<div class="item">
<div class="label">应收</div>
<div class="value">{{ orderInfo.totalPrice }}</div>
</div>
<div class="item">
<div class="label">实收</div>
<div class="value">{{ orderInfo.totalPrice }}</div>
</div>
<div class="item">
<div class="label">支付方式</div>
<div class="value">{{ orderInfo.orderId }}</div>
</div>
<div class="item">
<div class="label">零售备注</div>
<div class="value">{{ orderInfo.orderId }}</div>
</div>
</div>
</div>
<div class="right_body">
<div class="label">发票状态</div>
<div class="value">未开票</div>
</div>
<div class="right_foot">
<div class="label">
<div class="pay">-{{ orderInfo.payType ? getPayTypeStr(orderInfo.payType) : "" }}</div>
<div class="name">{{ orderInfo.salePersonName }}</div>
<div>备注-</div>
</div>
<div class="value">{{orderInfo.totalPrice}}</div>
</div>
</div>
</div>
<div class="footer">
<!-- <el-button type="primary" plain>追溯码</el-button>-->
<div>
<!-- <el-button type="danger" plain @click="cancel" v-if="orderInfo.status == 0">取消</el-button>-->
<!-- <el-button type="danger" plain @click="refund" v-if="orderInfo.status == 1">退款</el-button>-->
<!-- <el-button type="primary" @click="print" v-if="orderInfo.status == 1">-->
<!-- 打印<el-icon class="el-icon&#45;&#45;right"><Upload /></el-icon>-->
<!-- </el-button>-->
</div>
</div>
</div>
</Mask>
</template>
<script setup lang="ts">
import {onMounted, onUnmounted, ref} from "vue";
import Mask from "@/components/common/Mask.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {Upload} from "@element-plus/icons-vue";
import {post} from "@/utils/request.ts";
import {useWsStore} from "@/stores/wsStore.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {ElMessage} from "element-plus";
import {medTypeJson} from "@/assets/config/constants.ts";
const show = ref<boolean>(false);
const orderInfo = ref<any>({});
const init = (code: any) => {
show.value = true;
post("charge/getByCode", {code: code}).then((res: any)=>{
orderInfo.value = res;
})
}
//
const formatDate = (isoStr: any) => {
if (!isoStr) {
return ""
}
const date = new Date(isoStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const payTypeObj = {
0: "微信",
1: "支付宝",
2: "现金",
3: "医保"
}
type PayTypeKey = 0 | 1 | 2 | 3;
const emit = defineEmits(['updateOrderList'])
const getPayTypeStr = (payType: number): string => {
if (Object.keys(payTypeObj).includes(String(payType))) {
return payTypeObj[payType as PayTypeKey] || "未知";
}
return "未知";
};
const close = () => {
show.value = false;
emit('updateOrderList')
}
defineExpose({init})
const refund = () => {
post("retail/refund",{orderId:orderInfo.value.id}).then((res:any)=>{
close()
})
}
const cancel = () => {
post("retail/cancelOrder",{orderId:orderInfo.value.id}).then((res:any)=>{
close()
})
}
const wsStore = useWsStore();
// medType
type MedTypeKey = keyof typeof medTypeJson;
const print = () => {
if (!orderInfo.value.code){
return
}
let code = orderInfo.value.code;
const printConfig = {} as any;
post("common/config/getPrintConfig").then((res:any)=>{
printConfig.printName=res.printName
printConfig.pageType=res.pageType
if (!printConfig.printName || !printConfig.pageType){
ElMessage.error("打印机未设置,请先到设置-打印管理中设置")
return;
}
post("retail/getDetailByCode", {code}).then((res: any) => {
res.printerName = printConfig.printName
res.pageType = printConfig.pageType
if (res.retailSocialPayLog){
res.retailSocialPayLog.medTypeStr = medTypeJson[res.retailSocialPayLog.medType as MedTypeKey];
}
wsStore.sendMessage({
type: "PrintReceipt",
config: null,
data: res
})
})
})
}
let request: Request = {
type: "getPrintList",
config: null,
data: null
}
wsStore.sendMessage(request);
const reciceMessage = (response: Response) => {
}
onMounted(async () => {
wsStore.setMessageCallback(reciceMessage)
})
onUnmounted(() => {
wsStore.removeAllMessageCallback()
})
</script>
<style scoped lang="scss">
@use "@/assets/scss/base";
:deep(.el-scrollbar__view){
height: 100%;
}
.container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
min-height: 0;
padding:0 24px;
.title {
height: 35px;
}
.content {
flex: 1;
display: flex;
.left {
flex: 2;
height: 100%;
margin-right: 10px;
min-height: 0;
.goods-detail{
height: 40%;
.title{
font-weight: bold;
}
}
.service-detail{
height: 40%;
margin-top: 50px;
.title{
font-weight: bold;
}
}
}
.right {
min-width: 100px;
height: 100%;
flex: 1;
min-height: 0;
border: solid 1px #e6e6e6;
display: flex;
flex-direction: column;
.right_head {
padding: 10px;
.title {
font-size: 12px;
font-weight: 600;
height: 25px;
}
.info {
font-size: 12px;
font-weight: 400;
color: #999ca1;
.item {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
.value {
color: #000;
}
}
}
}
.right_body {
padding: 0 10px;
font-size: 12px;
font-weight: 400;
height: 30px;
color: #999ca1;
border-top: 1px solid #e6e6e6;
display: flex;
justify-content: space-between;
align-items: center;
.value {
color: base.$warning-color;
}
}
.right_foot {
flex: 1;
padding: 0 10px;
font-size: 12px;
font-weight: 400;
color: #999ca1;
border-top: 1px solid #e6e6e6;
display: flex;
justify-content: space-between;
align-items: center;
.label {
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
.pay{
color: #000;
}
.name{
margin: 5px 0;
}
}
.value {
color: #000;
}
}
}
}
.footer {
height: 40px;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
}
}
</style>

View File

@ -1,140 +0,0 @@
<template>
<Mask :is-show="show" :width=500 :height="500">
<div class="container-wrapper">
<CloseBtn @click="show = false"></CloseBtn>
<div class="header">
个人现金部分
</div>
<div class="container">
<div>
总金额{{socialPayInfo.setlinfo.medfee_sumamt}}<br>
基金支付金额{{socialPayInfo.setlinfo.fund_pay_sumamt}}<br>
个人医保支付金额{{socialPayInfo.setlinfo.acct_pay}}<br>
个人现金支付金额{{socialPayInfo.setlinfo.psn_cash_pay}}<br>
</div>
<div class="price-type" v-if="socialPayInfo.setlinfo.psn_cash_pay>0">
<div
class="price-type-item"
:class="['btn',payType==item.type?'active':'']"
v-for="(item,index) in priceBtnListNoSocial"
@click="changePriceType(item.type)"
>
<div class="image" :style="{'background-color':item.color}">
<img style="width: 16px;height: 16px;" :src="item.img" alt=""/>
</div>
<span>{{item.name}}</span>
</div>
<el-input v-model="cash" placeholder="请输入收到现金的数量"></el-input>
</div>
</div>
<el-button type="primary" @click="completeSettlement">完成订单</el-button>
<el-button @click="cecalOrder">取消订单</el-button>
</div>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {ref} from "vue";
import {priceBtnListNoSocial} from "@/assets/config/constants.ts";
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts";
import {ElMessage, ElMessageBox} from "element-plus";
const socialPayInfo = ref<any>(null)
const payType = ref(null)
const changePriceType = (type: any) => {
payType.value = type;
}
const orderInfo = ref<any>(null)
const show = ref(false)
const open = (payInfo:any,order:any)=>{
show.value = true
socialPayInfo.value = payInfo;
orderInfo.value = order;
}
const cash = ref<number>(0)
const emit = defineEmits(["orderCompleted","orderCancel"])
const completeSettlement = ()=>{
if (cash.value != socialPayInfo.value.setlinfo.psn_cash_pay){
ElMessage({
message: '现金支付金额与实际收款金额不一致',
type: 'warning',
})
return
}
post("retail/socialRealPay",{orderInfo:orderInfo.value,payType:payType.value}).then((res:any)=>{
show.value = false;
emit('orderCompleted')
})
}
const cecalOrder = ()=>{
ElMessageBox.confirm(
`取消后不能恢复,是否确定取消当前订单?`,
'Warning',
{
confirmButtonText: '确认取消',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
post("retail/cancelOrder",{orderId:orderInfo.value.orderId}).then((res:any)=>{
show.value = false;
emit('orderCancel')
})
})
}
defineExpose({open})
</script>
<style scoped lang="scss">
.price-type {
display: flex;
margin-top: 20px;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
.btn {
height: 45px;
width: 95px;
font-size: 14px;
border-radius: 10px;
display: flex;
background: #efecec;
margin-bottom: 10px;
justify-content: center;
align-items: center;
padding: 10px;
cursor: pointer;
.image{
width: 16px;
height: 16px;
margin-right: 3px;
border-radius: 23px;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
&:hover {
//color: #fff;
//background-color: #409EFF;
border: 1px solid #409EFF;
}
}
.active {
color: #fff;
background-color: #409EFF;
}
}
</style>

View File

@ -1,82 +0,0 @@
<template>
<el-scrollbar>
<el-table :data="list" style="width: 100%" @cell-click="openDetail">
<el-table-column prop="code" label="订单号" show-overflow-tooltip/>
<el-table-column prop="status" label="状态" width="80">
<template #default="scope">
<el-tag :type="scope.row.status === 0 ? 'info' : scope.row.status === 1 ? 'success' : scope.row.status === 2 ? 'warning' : 'danger'">{{ getStatusStr(scope.row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="payType" label="类别">
<template #default="scope">
{{ getPayTypeStr(scope.row.payType) }}
</template>
</el-table-column>
<el-table-column prop="address" label="日期">
<template #default="{row}">
{{ formatDate(row.payTime) }}
</template>
</el-table-column>
</el-table>
</el-scrollbar>
<OrderDetail ref="orderDetailRef"></OrderDetail>
</template>
<script setup lang="ts">
import {ref, defineProps, onMounted, watch} from 'vue'
import OrderDetail from "@/components/retail/OrderDetail.vue";
const prop = defineProps({
purchaseList: {
type: Array,
default: () => []
}
})
const list = ref<any[]>([])
onMounted(() => {
list.value = prop.purchaseList
})
watch(() => prop.purchaseList, (newVal) => {
list.value = newVal
})
const statusObj = {
0: "未完成",
1: "已完成",
2: "已取消",
3: "已退款"
}
const payTypeObj = {
0: "微信",
1: "支付宝",
2: "现金",
3: "医保"
}
type StatusKey = 0 | 1 | 2 | 3;
type PayTypeKey = 0 | 1 | 2 | 3;
//
const formatDate = (isoStr: any) => {
const date = new Date(isoStr);
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
}
const getStatusStr = (status: number): string => {
if (Object.keys(statusObj).includes(String(status))) {
return statusObj[status as StatusKey] || "未知";
}
return "未知";
};
const getPayTypeStr = (payType: number): string => {
if (Object.keys(payTypeObj).includes(String(payType))) {
return payTypeObj[payType as PayTypeKey] || "未知";
}
return "未知";
};
const orderDetailRef = ref<any>();
const openDetail = (row: any) => {
orderDetailRef.value.init(row)
}
</script>
<style scoped lang="scss">
</style>

View File

@ -1,80 +0,0 @@
<template>
<Mask :is-show="show" :width=800 :height="800" >
<div class="container-wrapper">
<CloseBtn @click="close"></CloseBtn>
<el-table :data="tableData" style="width: 100%" class="list" highlight-current-row @current-change="handleCurrentChange">
<el-table-column type="index" width="50" />
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="data" label="内容" width="500">
<template #default="scope">
{{getContent(scope.row.data)}}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button @click="selected" type="primary">确定</el-button>
<el-button @click="close">取消</el-button>
</div>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {onMounted, ref} from "vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts";
const show = ref(false)
const open = ()=>{
getTableData()
show.value = true
}
const tableData = ref<any>([]);
const getTableData = () => {
post("retail/associate/getList").then((res: any) => {
tableData.value = res;
tableData.value.forEach((item:any)=> {
item.data = JSON.parse(item.data)
} )
})
}
const getContent = (data:any)=>{
let str = "";
data.forEach((item:any)=>{
str += item.name + ":" + item.retailNumber + item.selectedUnit+" "
})
return str
}
const del = (row:any)=>{
post("retail/associate/del",{id:row.id}).then((res:any)=>{
getTableData()
})
}
const close = ()=>{
show.value = false
currentRow.value = null
}
const currentRow = ref<any>(null)
const handleCurrentChange = (val:any)=>{
currentRow.value = val
}
const emit = defineEmits(['selected'])
const selected = ()=>{
emit("selected",currentRow.value)
close()
}
defineExpose({open})
</script>
<style scoped lang="scss">
.container-wrapper{
.list{
margin-top: 20px;
}
}
</style>

View File

@ -1,193 +0,0 @@
<template>
<Mask :width="585" :height="438" :is-show="show">
<el-card>
<template #header>
<div class="header">
<span>收费</span>
<CloseBtn @click="show = false" style="margin-top: 12px"></CloseBtn>
</div>
</template>
<div class="panel">
<div class="price">{{ prop.money }}</div>
<div class="social" >
<CardPay v-model="socialCard"/>
</div>
<div class="price-type">
<div
class="price-type-item"
:class="['btn',payType==item.type?'active':'']"
v-for="(item,index) in priceBtnList"
@click="changePriceType(item.type)"
>
<div class="image" :style="{'background-color':item.color}">
<img style="width: 16px;height: 16px;" :src="item.img" alt=""/>
</div>
<span>{{item.name}}</span>
</div>
</div>
</div>
<template #footer>
<div class="footer">
<el-checkbox v-model="printReceipt">同时打印凭证</el-checkbox>
<el-button @click="completeSettlement()" type="primary">完成收费</el-button>
</div>
</template>
</el-card>
</Mask>
<PersonalPayment ref="psnPaymentRef" @orderCompleted="orderCompleted" @orderCancel="orderCanceled"></PersonalPayment>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {nextTick, onMounted, onUnmounted, ref} from "vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts";
import CardPay from "@/components/retail/CardPay.vue";
import {medTypeJson, priceBtnList} from "@/assets/config/constants.ts"
import PersonalPayment from "@/components/retail/PersonalPayment.vue";
import {useWsStore} from "@/stores/wsStore.ts";
const wsStore = useWsStore();
const socialCard =defineModel<any>();
const prop=defineProps({
money: {
type: String,
default: ''
}
})
const show = ref(false)
const printReceipt = ref(false);
const payType = ref(null);
const retailOrder = ref<any>(null);
const init = (order: any) => {
retailOrder.value = order;
show.value = true;
}
defineExpose({init})
const changePriceType = (type: any) => {
payType.value = type;
}
const emit = defineEmits(['orderComplete','orderCanceled'])
const completeSettlement = ()=>{
if (!retailOrder.value){
return;
}
if (payType.value == null){
return
}
if(payType.value == 1){
//
socialSettlement();
}else {
//
post('retail/completeOrder',{retailId:retailOrder.value.id,payType:payType.value}).then((res:any)=>{
orderCompleted()
})
}
}
const orderCompleted = ()=>{
show.value = false;
emit('orderComplete',printReceipt.value)
}
const orderCanceled = ()=>{
show.value = false;
emit('orderCanceled')
}
const getBalcByInsutype = (type:any) =>{
let balc =0;
for (const item of socialCard.value.data.insuinfo) {
if (item.insutype == type) {
balc = item.balc;
break;
}
}
return balc
}
const socialSettlement = ()=>{
const params = {
mdtrtCertType: socialCard.value.mdtrtCertType,
mdtrtCertNo: socialCard.value.mdtrtCertNo,
psnNo: socialCard.value.data.baseinfo.psn_no,
orderId:retailOrder.value.id,
insutype: socialCard.value.payInfo.selfpay_prop_type,
payType: payType.value,
curBalc:getBalcByInsutype(socialCard.value.payInfo.selfpay_prop_type)
}
//
post("retail/socialPrePay",{orderInfo:params}).then((res:any)=>{
openPsnPayment(res,params)
})
}
const psnPaymentRef = ref();
const openPsnPayment = (payInfo:any,orderInfo:any)=>{
nextTick(()=>{
psnPaymentRef.value.open(payInfo,orderInfo);
})
}
</script>
<style scoped lang="scss">
.panel {
.price{
height: 50px;
text-align: center;
font-size: 25px;
font-weight: 600;
color: rgba(237, 120, 23, 0.8);
}
.price-type {
display: flex;
margin-top: 20px;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
.btn {
height: 45px;
width: 95px;
font-size: 14px;
border-radius: 10px;
display: flex;
background: #efecec;
margin-bottom: 10px;
justify-content: center;
align-items: center;
padding: 10px;
cursor: pointer;
.image{
width: 16px;
height: 16px;
margin-right: 3px;
border-radius: 23px;
display: flex;
align-items: center;
justify-content: center;
}
&:hover {
//color: #fff;
//background-color: #409EFF;
border: 1px solid #409EFF;
}
}
.active {
color: #fff;
background-color: #409EFF;
}
}
}
.footer{
display: flex;
justify-content: space-between;
}
</style>

View File

@ -1,228 +0,0 @@
<template>
<el-popover
title="追溯码:"
placement="bottom-start"
trigger="click"
width="300px"
>
<template #reference>
<el-input
placeholder="追溯码"
clearable
v-model="inputTraceabilityCode"
style="width: 300px;"
@keydown.enter="addTraceabilityCode(props.item)"
></el-input>
</template>
<template #default>
<div v-for="(subItem,index) in item.traceAbilityCodeList" class="list">
<div class="code"> {{ subItem.code }}</div>
<div class="number">
<el-input
size="small"
v-model.number="changeNumber"
v-if="subItem.showNumberInput"
@keydown.enter="subItem.showNumberInput = false"
@change="handleNumberChange(subItem)"
></el-input>
<span v-else @click="openNumberInput(subItem)">x{{ subItem.number }}</span>
</div>
<div class="remove" @click="removeTraceAbility(item)">
<el-icon>
<CloseBold/>
</el-icon>
</div>
</div>
</template>
</el-popover>
</template>
<script setup lang="ts">
import {ref,watch} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {CloseBold} from "@element-plus/icons-vue";
import {post} from "@/utils/request.ts";
interface TraceAbilityCode {
code: string;
number: number;
showNumberInput?: boolean;
}
const props = defineProps({
item: {
type: Object as () => {
id?: number|undefined;
traceAbilityCodeList: TraceAbilityCode[];
retailNumber: number;
gatherNumber: number;
selectedUnit: string;
idCode: string[];
packagingUnit: string;
minPackagingUnit: string;
minPackagingNumber: number;
},
default: () => ({
traceAbilityCodeList: [],
retailNumber: 0,
gatherNumber: 0,
selectedUnit: "",
idCode:[],
packagingUnit: "",
minPackagingUnit: "",
minPackagingNumber: 0,
}),
},
})
const getGatherNumber = (item: any) => {
let gatherNumber = 0;
for (let subItem of item.traceAbilityCodeList) {
gatherNumber += subItem.number;
}
item.gatherNumber = gatherNumber;
}
const inputTraceabilityCode = ref("");
const addTraceabilityCode = (item: any) => {
if (!item.traceAbilityCodeList) {
item.traceAbilityCodeList = []
}
if (item.retailNumber == item.gatherNumber) {
ElMessage({
message: '采集数量已满',
type: 'warning',
})
return
}
let idCode = inputTraceabilityCode.value?inputTraceabilityCode.value.slice(0, 7):"";
const index = item.traceAbilityCodeList.findIndex((codeObj: any) => codeObj.code === inputTraceabilityCode.value);
if (index == -1 && item.selectedUnit == item.packagingUnit){
item.traceAbilityCodeList.push({
code: inputTraceabilityCode.value,
number: 1
})
inputTraceabilityCode.value = "";
getGatherNumber(item)
addIdCode(idCode)
return;
}
if (index == -1&& item.selectedUnit == item.minPackagingUnit){
let needCodeCount = item.retailNumber - item.gatherNumber;
let number = 1;
if (needCodeCount >= item.minPackagingNumber){
number = item.minPackagingNumber;
}
if (needCodeCount < item.minPackagingNumber){
number = needCodeCount;
}
item.traceAbilityCodeList.push({
code: inputTraceabilityCode.value,
number: number
})
inputTraceabilityCode.value = "";
getGatherNumber(item)
addIdCode(idCode)
return;
}
if(item.selectedUnit == item.packagingUnit){
//
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
}else {
//使minPackagingNumber
if (item.traceAbilityCodeList[index].number == item.minPackagingNumber) {
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
}
item.traceAbilityCodeList[index].number += 1;
}
inputTraceabilityCode.value = "";
getGatherNumber(item)
addIdCode(idCode)
}
const removeTraceAbility = (item: any) => {
item.traceAbilityCodeList.splice(item.traceAbilityCodeList.findIndex((codeObj: any) => codeObj.code === inputTraceabilityCode.value), 1)
getGatherNumber(item)
}
const changeNumber=ref(0);
const openNumberInput = (subItem: any) => {
subItem.showNumberInput = true;
changeNumber.value = subItem.number;
}
const handleNumberChange = (subItem:any)=>{
let limit = 1;
if (props.item.selectedUnit == props.item.minPackagingUnit){
limit = props.item.minPackagingNumber;
}
if (changeNumber.value>limit) {
ElMessage({
message: '单个追溯码采集数量超过限制',
type: 'warning',
})
subItem.showNumberInput = false;
return
}
//
let totalNumber = 0;
for (let subItem of props.item.traceAbilityCodeList) {
totalNumber += subItem.number;
}
totalNumber = totalNumber - subItem.number + changeNumber.value;
if (totalNumber > props.item.retailNumber) {
ElMessage({
message: '采集数量超过上限',
type: 'warning',
})
subItem.showNumberInput = false;
return;
}
subItem.number = changeNumber.value;
}
const addIdCode = (idCode:any)=>{
if (idCode==null || idCode.value ==""){
return;
}
if (props.item.idCode.includes(idCode)){
return;
}
ElMessageBox.confirm(
`当前标识码未绑定是否确认绑定标识码?`,
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
post("goods/goods/addIdCode",{goodsId:props.item.id,idCode:idCode}).then((res:any)=>{
props.item.idCode.push(idCode);
})
})
}
</script>
<style scoped lang="scss">
.list {
display: flex;
.code {
width: 100px;
}
.number {
width: 100px;
}
.remove {
font-size: 16px;
width: 50px;
&:hover {
color: #409eff;
}
}
}
</style>

View File

@ -1,275 +0,0 @@
<script setup lang="ts">
import {ref,defineProps} from "vue";
import {post} from "@/utils/request.ts";
import { ElCol, ElRow} from "element-plus";
const props = defineProps({
purchaseNum: {
type: Number,
default: 0
},
sum: {
type: Number,
default: 0
}
})
const state = ref([])
const options = ref<any>([])
const selectRef = ref();
const noActive = ref(false)
const querySearchAsync = (queryString: string) => {
if (!queryString) return
post("vip/vip/search", {keyword: queryString}).then((res: any) => {
options.value = res;
let list = res;
for (let i = 0; i < list.length; i++) {
list[i].value = list[i].name;
if (!list[i].levelId) return
post("vip/vipLevel/get", {levelId: list[i].levelId}).then((res: any) => {
options.value.levelName = res.name
})
}
})
}
const listItem = ref<any>({})
const emit = defineEmits(['selectCallBack', 'closePurchaseList'])
const handleSelect = (item: any) => {
let goods = JSON.parse(JSON.stringify(item));
noActive.value = true
listItem.value = goods
post("vip/vipLevel/get", {levelId: goods.levelId}).then((res: any) => {
listItem.value.levelName = res.name
listItem.value.discountRate = res.discountRate
emit('selectCallBack', listItem.value)
})
}
const clear = () => {
closePurchaseList()
}
defineExpose({handleSelect,clear})
const isTrue = ref(false)
const closePurchaseList = () => {
noActive.value = false
options.value = []
emit('closePurchaseList')
}
</script>
<template>
<div class="search_box">
<el-select-v2
v-if="!noActive"
v-model="state"
style="width: 100%"
filterable
remote
ref="selectRef"
:remote-method="querySearchAsync"
:options="options"
placeholder="输入患者号"
:fit-input-width="500"
>
<template #prefix>
<div class="prefix-wrapper">
<el-icon>
<Search/>
</el-icon>
</div>
</template>
<template #header>
<div class="header">
<div class="text">患者信息</div>
<div class="text">联系电话</div>
<div class="text">患者等级</div>
</div>
</template>
<template #default="{ item }">
<div class="row" @click="handleSelect(item)">
<div class="text">{{ item.realName }}</div>
<div class="text">{{ item.phone }}</div>
<div class="text">{{ options.levelName || '无' }}</div>
</div>
</template>
<template #footer>
</template>
</el-select-v2>
<div v-else>
<el-popover
class="box-item"
title=""
content=""
placement="bottom-start"
:width="500"
>
<template #reference>
<div class="detail" :class="isTrue?'active':''" @mouseleave="isTrue=false" @mousemove="isTrue=true">
<div class="info">
<div>{{ listItem.realName }}</div>
<div class="levelName">
<el-tag type="success">{{ listItem.levelName || '-' }}</el-tag>
</div>
</div>
<div>余额{{ listItem.balance }} <span style="margin: 0 10px" @click="closePurchaseList()">X</span></div>
</div>
</template>
<div v-if="isTrue" class="detail_box">
<div class="content">
<div class="head_box">
<el-tag type="success">{{ listItem.levelName || '-' }}</el-tag>
<div style="margin: 10px 0">消费{{ props.purchaseNum }}累计{{props.sum}}</div>
</div>
<div class="middle_box">
<div class="title">患者详情</div>
<div class="right_content">
<div class="bottom_box">
<el-row style="margin-bottom: 10px">
<el-col :span="12">
<span class="col_name">出生日期</span>
<span>{{ listItem.birthday || "2000-03-06" }}</span>
</el-col>
<el-col :span="12">
<span class="col_name">民族</span>
<span>{{ listItem.nation || "汉族" }}</span>
</el-col>
</el-row>
<el-row style="margin-bottom: 10px">
<el-col :span="12">
<span class="col_name">创建日期</span>
<span>{{ listItem.createDatetime || "2024-03-06" }}</span>
</el-col>
<el-col class="col" :span="12">
<span class="col_name">身份证号码</span>
<span>{{ listItem.idCode || "123141424" }}</span>
</el-col>
</el-row>
<el-row style="margin-bottom: 10px">
<el-col class="col" :span="12">
<span class="col_name">来源</span>
<span>{{ listItem.source || "皇姑" }}</span>
</el-col>
<el-col class="col" :span="12">
<span class="col_name">家庭地址</span>
<span>{{ listItem.address || "沈阳站" }}</span>
</el-col>
</el-row>
<el-row style="margin-bottom: 10px">
<el-col :span="24">
<span class="col_name">备注</span>
<span>{{ listItem.remark || "加撒比打算大大的" }}</span>
</el-col>
</el-row>
</div>
</div>
</div>
</div>
</div>
</el-popover>
</div>
</div>
</template>
<style scoped lang="scss">
.search_box {
background-color: #fff;
padding: 10px;
border-radius: 10px;
box-sizing: border-box;
margin-top: 10px;
margin-bottom: 10px;
position: relative;
}
.header {
padding: 10px;
font-size: 18px;
display: flex;
.text {
font-size: 16px;
width: 200px;
color: #6a6a6a;
}
}
.row {
display: flex;
max-height: 500px;
.text {
font-size: 12px;
width: 150px;
margin-left: 10px;
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: nowrap; /* 防止换行 */
}
}
.el-popper.is-pure {
padding: 10px;
}
.detail {
min-width: 400px;
height: 32px;
border: 1px solid #8b8e8f;
border-radius: 10px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
font-family: inherit;
font-size: 14px;
.info {
position: relative;
display: flex;
align-items: center;
.levelName {
margin: 0 50px 0 20px;
}
}
}
.active {
border: 1px solid #00ace9;
}
.detail_box {
.title {
font-size: 15px;
font-weight: bold;
margin: 20px 0;
}
.content {
font-size: 14px;
.head_box {
border-bottom: 1px solid rgba(165, 162, 162, 0.5);
}
.middle_box {
background-color: #fff;
.right_content {
font-size: 14px;
.bottom_box {
.col_name {
display: inline-block;
width: 100px;
color: #6e6e6e;
margin-right: 10px;
}
}
}
}
}
}
</style>

View File

@ -1,168 +0,0 @@
<template>
<Mask :width="400" :height="400" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card style="width: 360px;height: 360px">
<template #header>
整单议价
</template>
<div class="negotiation-panel">
<el-input v-model="finalPrice" readonly class="price-input" size="large">
<template #prefix>
</template>
<template #suffix>
<span :class="[finalPrice == originalPrice?'disable':'link-btn']" @click="restore">恢复</span>
</template>
</el-input>
<div class="negotiation-type">
<div :class="['btn',type==3?'active':'']">折比例</div>
</div>
<div class="bottom-input">
<div class="reduce-ratio" v-if="type==3">
<el-input placeholder="9折输入90" size="large" v-model.number="reduceRation" @change="reduceRationChangeHandler" >
<template #suffix>
%
</template>
</el-input>
</div>
</div>
</div>
<template #footer>
<el-button type="primary" @click="saveNegotiation">确定</el-button>
<el-button @click="show = false" plain>关闭</el-button>
</template>
</el-card>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {computed, ref} from "vue";
import CloseBtn from "@/components/CloseBtn.vue";
const finalPrice = ref(0.0);
const originalPrice = ref(0.0);
const show = ref(false);
const init = (orgPrice: number,newFinalPrice: number,ration: number) => {
finalPrice.value = newFinalPrice;
originalPrice.value = orgPrice;
reduceRation.value = ration;
show.value = true;
}
defineExpose({init})
const restore = () => {
finalPrice.value = originalPrice.value;
reduceRation.value = 100;
}
const type = ref(3);
const emit = defineEmits(['saveNegotiation'])
const saveNegotiation = () => {
show.value = false;
emit('saveNegotiation', reduceRation.value)
}
const reduceRation =ref(0);
const reduceRationChangeHandler = (value: number) => {
if (!value){
reduceRation.value = 0;
finalPrice.value = originalPrice.value;
return
}
rationChangeHandler(reduceRation.value,false)
}
const rationChangeHandler = (ration:number,type:boolean) => {
let proportion = parseInt(ration.toString());
if (type){
proportion =100+proportion;
}
finalPrice.value = originalPrice.value * 100 * proportion/10000;
}
</script>
<style scoped lang="scss">
.negotiation-panel {
font-size: 16px;
height: 200px;
.price-input{
font-weight: bold;
}
.link-btn {
color: #409EFF;
margin-left: 10px;
cursor: pointer;
}
.disable {
color: #999;
margin-left: 10px;
cursor: not-allowed;
}
.negotiation-type {
display: flex;
margin-top: 20px;
justify-content: center;
align-items: center;
.btn {
font-size: 14px;
padding: 10px;
margin-left: 10px;
border: 1px solid #ddd;
border-radius: 5px;
&:hover {
border: 1px solid #409EFF;
}
}
.active{
border: 1px solid #409EFF;
color: #409EFF;
}
}
.bottom-input {
margin-top: 20px;
.add-price{
display: flex;
justify-content: center;
align-items: center;
.btn{
font-size: 14px;
width: 100px;
padding: 10px;
text-align: center;
margin-left: 10px;
border: 1px solid #ddd;
border-radius: 5px;
&:hover {
border: 1px solid #409EFF;
}
}
}
.reduce-price{
display: flex;
justify-content: center;
align-items: center;
.btn{
font-size: 14px;
padding: 10px;
width: 100px;
margin-left: 10px;
text-align: center;
border: 1px solid #ddd;
border-radius: 5px;
&:hover {
border: 1px solid #409EFF;
}
}
}
}
}
</style>

View File

@ -136,6 +136,7 @@ import UpLoad from "@/components/UpLoad.vue";
import {ElMessage} from 'element-plus'
import Mask from "@/components/common/Mask.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {API} from "@/assets/config/API.ts";
const ganderOptions = [
{
@ -256,7 +257,7 @@ const save = () => {
if (valid) {
ruleFormRef.value.validate((valid: any) => {
if (valid) {
post(apiConfig.OrganizationMemberSave, {data: form}).then(() => {
post(API.Organization.Member.Save, {data: form}).then(() => {
if(memberInfo.value.id){
ElMessage.success('修改成功')
}else{
@ -278,7 +279,7 @@ const uploadRef = ref<any>('')
const getById = (id: any) => {
memberInfo.value = {}
userInfo.value = {}
post("organization/member/getById", {id: id}).then((res: any) => {
post(API.Organization.Member.Get, {id: id}).then((res: any) => {
memberInfo.value = res.memberInfo
if (res.userInfo) {
userInfo.value = res.userInfo

View File

@ -1,6 +1,7 @@
import axios from "axios";
import {ElMessage, ElNotification} from 'element-plus'
import {loadConfig} from './config.ts'
import {API} from "@/assets/config/API.ts";
let globalConfig: any = null
let router;
// 添加初始化方法(在应用启动时调用)
@ -35,7 +36,7 @@ function post(path: string, data: any = {}, options: any = {}) {
resolve(data.data);
}
else if (data.code == 301) {
router.push('/manager/login')
router.push(API.Common.ManagerUser.Login)
return;
}
else{

View File

@ -44,7 +44,7 @@ const loginCore=async ()=>{
let token:any=await post(API.Common.ManagerUser.Login, {username: username.value, password: password.value},{catch_error: true})
localStorage.setItem('token', token)
try{
await post(apiConfig.signIn, {mac: netWork.value.mac, ip: netWork.value.ip}, {catch_error: true})
await post(API.Common.Sign.SignIn, {mac: netWork.value.mac, ip: netWork.value.ip}, {catch_error: true})
}catch (e){
ElMessage.warning("签到失败,将以非签到状态访问本系统")
}finally {

View File

@ -106,6 +106,7 @@ import {ElMessage} from "element-plus";
import {medTypeJson} from "@/assets/config/constants.ts";
import {useWsStore} from "@/stores/wsStore.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {API} from "@/assets/config/API.ts";
const formData = ref<any>({
patientInfo: {},
@ -183,7 +184,7 @@ const saveAndCharge = () => {
})
}
const diagnosisSearchRef = ref()
const diagnosisSearchApi = "social/diagnose/search"
const diagnosisSearchApi = API.Social.Diagnose.Search
const diagnosisShowConfig = [
{
label: "诊断名称",
@ -332,7 +333,7 @@ const cardTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => (
const doctorList = ref<any>([])
const sectionDoctorOption = ref<any>('')
const list = () => {
post(apiConfig.OrganizationMemberSearch, {query: {role: 1}}).then((res: any) => {
post(API.Charge.Order.List, {query: {role: 1}}).then((res: any) => {
doctorList.value = res
})
}

View File

@ -32,10 +32,11 @@
<script lang="ts" setup>
import {ref} from "vue";
import {post} from "@/utils/request.ts";
import {API} from "@/assets/config/API.ts";
const tableData = ref([])
post("organization/section/list", {page: 1, size: 10}).then((res:any)=>{
post(API.Organization.Section.List, {page: 1, size: 10}).then((res:any)=>{
tableData.value = res.list
})
</script>

View File

@ -48,6 +48,7 @@ import {apiConfig} from "@/assets/config/apiConfig.ts";
import PatientCard from "@/components/charge/PatientCard.vue";
import ServiceDetail from "@/components/common/service/ServiceDetail.vue";
import GoodsDetail from "@/components/common/goods/GoodsDetail.vue";
import {API} from "@/assets/config/API.ts";
const curRegister = ref<any>()
const registerId = ref()
@ -100,7 +101,7 @@ const save = () => {
if (!formData.value.diagnosisDetail || JSON.parse(formData.value.diagnosisDetail).length == 0) {
ElMessage.error("请填写诊断信息")
} else {
post(apiConfig.MedicalRecordSave, {data: data}).then((res: any) => {
post(API.Diagnosis.Base.Save, {data: data}).then((res: any) => {
ElMessage.success("接诊完毕,请到收费页面收费")
debugger
medicalQueueRef.value?.changeCurItemOrStatus(res, 3);
@ -124,7 +125,7 @@ const clickItem = (item: any) => {
initFormData()
}
if (item.status == 3) {
post(apiConfig.MedicalDetailByRegisId, {
post(API.Diagnosis.Base.GetByRegisId, {
regisId: item.id
}).then((res: any) => {
formData.value = res.diagnosisMedicalRecord
@ -147,7 +148,7 @@ const clickItem = (item: any) => {
}
const medicalQueueRef = ref();
const cancelReception = () => {
post(apiConfig.RegistrationChangeStatus, {id: registerId.value, status: 1}).then((res: any) => {
post(API.Patient.Registration.ChangeStatus, {id: registerId.value, status: 1}).then((res: any) => {
nextTick(() => {
medicalQueueRef.value?.changeCurItemOrStatus(res, 1);
initFormData()
@ -170,7 +171,7 @@ const changeTab = (e: any) => {
}
const itemId = ref<any>('')
const edit = () => {
post('registration/changeStatus', {id: registerId.value, status: 2}).then((res: any) => {
post(API.Patient.Registration.ChangeStatus, {id: registerId.value, status: 2}).then((res: any) => {
medicalQueueRef.value?.changeCurItemOrStatus(res, 2);
})
}
@ -206,7 +207,7 @@ const copyGoodsList = (item: any) => {
const seeDockerInfo = ref<any>()
const getSeeDockerInfo = (newValue: any) => {
if (!registerId.value) return;
post('medical/record/getSeeDockerInfo', {regisId: newValue}).then((res: any) => {
post(API.Diagnosis.Base.GetRegistrationDetail, {regisId: newValue}).then((res: any) => {
seeDockerInfo.value = res
formData.value.allergyHistory = res.patientInfo.allergyHistory;
formData.value.beforeMedicalHistory = res.patientInfo.beforeMedicalHistory;

View File

@ -99,6 +99,7 @@ import Calendar from "@/components/common/Calendar.vue";
import Panel from "@/components/common/Panel.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {Search} from "@element-plus/icons-vue";
import {API} from "@/assets/config/API.ts";
const dateName = ref<any>('挂号')
const selectDate = (date: any) => {
@ -140,7 +141,7 @@ const initDoctor = () => {
keyword: keyword.value,
role: 1
}
post(apiConfig.OrganizationMemberSearch, {query: query}).then((res: any) => {
post(API.Patient.Registration.List, {query: query}).then((res: any) => {
roleList.value = res
})
}
@ -158,7 +159,7 @@ const getPatientList = async () => {
listLoading.value = true
id.value = null
try {
const data: any = await post(apiConfig.RegistrationList, {
const data: any = await post(API.Patient.Registration.List, {
page: page.value,
size: size.value,
startDate: selectedDate.value[0],

View File

@ -89,6 +89,7 @@ import MemberEdit from "@/components/settings/MemberEdit.vue";
import {post} from "@/utils/request.ts";
import {formatDate} from "@/utils/dateUtils.ts";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {API} from "@/assets/config/API.ts";
const isShow = ref(false)
const tableData = ref<any>([]);
@ -145,7 +146,7 @@ const init = (() => {
})
const sectionList = ref<any>([]);
const list = () => {
post(apiConfig.OrganizationSectionAllList).then((res: any) => {
post(API.Organization.Section.AllList).then((res: any) => {
sectionList.value = res
})
}

View File

@ -49,6 +49,7 @@ import {post} from "@/utils/request.ts";
import {getToday, formatDateArray, getThisMonth} from "@/utils/dateUtils.ts";
import {apiConfig} from "@/assets/config/apiConfig.ts";
import {reconciliationResult} from "@/assets/config/constants.ts";
import {API} from "@/assets/config/API.ts";
const payTypeMapping = {
1: "医保",
@ -67,7 +68,7 @@ const dateChangeHandler = () => {
const getTableData = () => {
post(apiConfig.ChargeListChargeLog, {beginTime: date.value[0], endTime: date.value[1]}).then((res: any) => {
post(API.Charge.Log.List, {beginTime: date.value[0], endTime: date.value[1]}).then((res: any) => {
tableData.value = res
})
}