Merge branch 'main' of ssh://git.jizhiweb.cn:2222/clinic-v2/web

This commit is contained in:
LiJianZhao 2025-05-16 14:24:15 +08:00
commit 5a346e1b2d
21 changed files with 772 additions and 519 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -108,11 +108,7 @@ body {
.clear-margin { .clear-margin {
margin: 0; margin: 0;
} }
.el-popper.is-light.type-popper, .el-popper.is-light>.el-popper__arrow:before{
background:#F5FAFF;
}
.el-popper.is-light.type-popper{ .el-popper.is-light.type-popper{
background:#F5FAFF;
padding: 0; padding: 0;
} }
.el-popper.is-light.id-code-popper{ .el-popper.is-light.id-code-popper{
@ -135,7 +131,7 @@ body {
border-radius: 8px 8px 0 0; border-radius: 8px 8px 0 0;
} }
$btn-color: #4D6DE4; $btn-color: #4D6DE4;
$lighter-color: #7c91e3; $lighter-color: rgba(#4D6DE4, 0.5);
.default-btn{ .default-btn{
cursor: pointer; cursor: pointer;
width: 120px; width: 120px;

View File

@ -1,5 +1,4 @@
<template> <template>
<el-popover placement="bottom-start" :visible="isVisible" :width="props.width" ref="popoverRef" <el-popover placement="bottom-start" :visible="isVisible" :width="props.width" ref="popoverRef"
:trigger-keys="[]" style="height: 500px" popper-class="type-popper"> :trigger-keys="[]" style="height: 500px" popper-class="type-popper">
<template #reference> <template #reference>
@ -19,7 +18,7 @@
/> />
</template> </template>
<div class="container"> <div class="container">
<el-scrollbar> <el-scrollbar style="max-height: 260px;width: 100%">
<table class="table" style="width: 100%; border-collapse: collapse;max-height: 50px"> <table class="table" style="width: 100%; border-collapse: collapse;max-height: 50px">
<!-- 表头 --> <!-- 表头 -->
<thead> <thead>
@ -33,7 +32,6 @@
</th> </th>
</tr> </tr>
</thead> </thead>
<!-- 表体 --> <!-- 表体 -->
<tbody> <tbody>
<tr class="table-body" <tr class="table-body"
@ -167,6 +165,7 @@ const handlerBlur = () => {
th { th {
text-align: left; text-align: left;
&:nth-child(1) { &:nth-child(1) {
width: 200px; width: 200px;
text-align: left; text-align: left;
@ -182,6 +181,7 @@ const handlerBlur = () => {
font-size: 14px; font-size: 14px;
color: #666666; color: #666666;
font-style: normal; font-style: normal;
td { td {
&:nth-child(1) { &:nth-child(1) {
width: 200px; width: 200px;
@ -194,7 +194,6 @@ const handlerBlur = () => {
} }
&:last-child { &:last-child {
border-radius: 0 0 8px 8px; border-radius: 0 0 8px 8px;
} }
@ -205,4 +204,8 @@ const handlerBlur = () => {
} }
} }
} }
table thead tr {
background: #F5FAFF;;
}
</style> </style>

View File

@ -16,6 +16,7 @@
</template> </template>
</el-input> </el-input>
<div class="list"> <div class="list">
<el-scrollbar>
<table class="table" style="border-spacing: 0"> <table class="table" style="border-spacing: 0">
<thead style="background:#F1F5FB"> <thead style="background:#F1F5FB">
<tr class="table-title" style="background: #f1f5fb"> <tr class="table-title" style="background: #f1f5fb">
@ -42,6 +43,7 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</el-scrollbar>
</div> </div>
</div> </div>
</template> </template>
@ -280,10 +282,12 @@ const addTraceAbilityCodeHandler = (item: any, code: any) => {
align-items: center; align-items: center;
padding: 24px; padding: 24px;
} }
table, tbody, td { table, tbody, td {
border-bottom: 1px solid #EAEAEC; /* 明确设置边框 */ border-bottom: 1px solid #EAEAEC; /* 明确设置边框 */
} }
table{
table {
border: none; border: none;
} }
</style> </style>

View File

@ -16,27 +16,26 @@
></el-input> ></el-input>
</template> </template>
<template #default> <template #default>
<table class="table" style="border-spacing: 0"> <div style="width: 100%;max-height: 20px">
<thead> <el-table :data="item.traceAbilityCodeList" :max-height="300" style="width: 100%"
<tr class="table-title"> :header-cell-style="{background: '#F1F5FB'}">
<th>追溯码</th> <el-table-column prop="value" label="追溯码" show-overflow-tooltip>
<th>操作</th> <template #default="scope">
</tr> {{ scope.row }}
</thead> </template>
<tbody class="table-body"> </el-table-column>
<tr v-for="(item,index) in item.traceAbilityCodeList" :key="index"> <el-table-column label="操作" width="80">
<td>{{ item }}</td> <template #default="scope">
<td> <span style="color: #ff0000" @click="removeTraceAbility(scope.row)">
<div @click="removeTraceAbility(item)">
<el-icon> <el-icon>
<Delete/> <Delete/>
</el-icon> </el-icon>
删除 删除
</span>
</template>
</el-table-column>
</el-table>
</div> </div>
</td>
</tr>
</tbody>
</table>
</template> </template>
</el-popover> </el-popover>
</template> </template>
@ -96,9 +95,11 @@ const removeTraceAbility = (code: any) => {
<style scoped lang="scss"> <style scoped lang="scss">
.table { .table {
width: 100%; width: 100%;
th { th {
background: none !important; background: none !important;
} }
.table-title { .table-title {
width: 100%; width: 100%;
height: 36px; height: 36px;
@ -108,19 +109,23 @@ const removeTraceAbility = (code: any) => {
font-style: normal; font-style: normal;
padding: 0 25px; padding: 0 25px;
background: #F5FAFF; background: #F5FAFF;
th { th {
text-align: left; text-align: left;
&:first-child { &:first-child {
width: 270px; width: 270px;
padding-left: 24px; padding-left: 24px;
overflow: hidden; overflow: hidden;
} }
&:last-child { &:last-child {
text-align: center; text-align: center;
line-height: 36px; line-height: 36px;
} }
} }
} }
.table-body { .table-body {
height: 52px; height: 52px;
font-weight: 500; font-weight: 500;
@ -128,12 +133,14 @@ const removeTraceAbility = (code: any) => {
color: #666666; color: #666666;
font-style: normal; font-style: normal;
padding: 0 25px; padding: 0 25px;
tr { tr {
height: 36px; height: 36px;
font-size: 14px; font-size: 14px;
color: #333333; color: #333333;
font-weight: 500; font-weight: 500;
font-style: normal; font-style: normal;
td { td {
height: 36px; height: 36px;
@ -160,6 +167,7 @@ const removeTraceAbility = (code: any) => {
table, tbody, td { table, tbody, td {
border-bottom: 1px solid #EAEAEC; /* 明确设置边框 */ border-bottom: 1px solid #EAEAEC; /* 明确设置边框 */
overflow: hidden;
} }
table { table {

View File

@ -1,5 +1,6 @@
<template> <template>
<panel title="药品耗材"> <panel title="药品耗材">
<div class="panel-content" style="padding: 0 24px 24px">
<el-table v-if="goodsDetail.length>0" :data="goodsDetail" max-height="300" style="width: 100%" <el-table v-if="goodsDetail.length>0" :data="goodsDetail" max-height="300" style="width: 100%"
:header-cell-style="{ backgroundColor: '#F5FAFF' }"> :header-cell-style="{ backgroundColor: '#F5FAFF' }">
<el-table-column prop="name" label="名称" width="400"> <el-table-column prop="name" label="名称" width="400">
@ -98,6 +99,7 @@
</div> </div>
<span v-if="status" style="padding: 10px">合计{{ getTotalPrice() }}</span> <span v-if="status" style="padding: 10px">合计{{ getTotalPrice() }}</span>
</div> </div>
</div>
</panel> </panel>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -1,6 +1,8 @@
<template> <template>
<Panel title="服务项目"> <Panel title="服务项目">
<el-table v-if="itemDetail.length>0" :data="itemDetail" max-height="300" :header-cell-style="{ backgroundColor: '#F5FAFF' }"> <div class="panel-content" style="padding: 0 24px 24px">
<el-table v-if="itemDetail.length>0" :data="itemDetail" max-height="300"
:header-cell-style="{ backgroundColor: '#F5FAFF' }">
<el-table-column prop="itemName" label="项目名称" show-overflow-tooltip width="400"> <el-table-column prop="itemName" label="项目名称" show-overflow-tooltip width="400">
<template #default="scope"> <template #default="scope">
<el-popover <el-popover
@ -48,7 +50,9 @@
<el-table-column label="操作" v-if="props.status"> <el-table-column label="操作" v-if="props.status">
<template #default="scope"> <template #default="scope">
<el-button type="danger" link @click="delService(scope.row)"> <el-button type="danger" link @click="delService(scope.row)">
<el-icon style="margin-right: 3px"><Delete /></el-icon> <el-icon style="margin-right: 3px">
<Delete/>
</el-icon>
删除 删除
</el-button> </el-button>
</template> </template>
@ -66,6 +70,7 @@
</div> </div>
<span v-if="status" style="padding: 10px">合计{{ getTotalPrice() || 0 }}</span> <span v-if="status" style="padding: 10px">合计{{ getTotalPrice() || 0 }}</span>
</div> </div>
</div>
</Panel> </Panel>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -46,7 +46,7 @@ const handleSelect = (item: any) => {
<div class="search_box"> <div class="search_box">
<el-select-v2 <el-select-v2
v-model="state" v-model="state"
style="width: 100%" style="width: 500px;height: 100%"
filterable filterable
remote remote
ref="selectRef" ref="selectRef"
@ -54,6 +54,9 @@ const handleSelect = (item: any) => {
:options="options" :options="options"
placeholder="输入关键字搜索药品" placeholder="输入关键字搜索药品"
> >
<template #prefix>
<span class="iconfont icon-RectangleCopy"></span>
</template>
<template #header> <template #header>
<div class="header"> <div class="header">
<div class="text">药品</div> <div class="text">药品</div>
@ -91,8 +94,6 @@ const handleSelect = (item: any) => {
box-sizing: border-box; box-sizing: border-box;
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.header { .header {
display: flex; display: flex;
@ -116,4 +117,7 @@ const handleSelect = (item: any) => {
white-space: nowrap; /* 防止换行 */ white-space: nowrap; /* 防止换行 */
} }
} }
:deep(.el-select__wrapper.is-filterable){
height: 42px;
}
</style> </style>

View File

@ -0,0 +1,96 @@
<template>
<Mask :width="400" :height="240" :is-show="isShow" @close="isShow=false" :show-footer="true" title="选择模板范围">
<template #default>
<div class="select">
<el-form style="height: 100%">
<el-form-item label="药品物资选择范围">
<el-cascader :collapse-tags="true" :props="props" :options="allCateList"
:show-all-levels="false"
v-model="cateIds" clearable @change="change"/>
</el-form-item>
</el-form>
</div>
</template>
<template #footer>
<div class="bottom">
<div class="default-btn" @click="isShow=false">上传数据</div>
<div class="default-btn" @click="uploadCateIds" style="margin-left: 24px">下载模板</div>
<div class="default-btn" @click="isShow=false" style="margin-left: 24px">取消</div>
</div>
</template>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/common/Mask.vue";
import {defineModel, onMounted, ref} from "vue";
import {post} from "@/utils/request.ts";
const isShow = defineModel()
const props = {multiple: true}
interface CateOption {
value: string;
label: string;
children: { value: number; label: string }[];
}
const typeList = {
"1301": "中西成药",
"1302": "中药饮片",
"1306": "医疗器材",
"0": "其他商品",
}
const cateIds = ref<number[]>([]);
const allCateList = ref<CateOption[]>([]);
const getAllCate = () => {
post("goods/cate/getAllList", null).then((res: any) => {
const options = [];
for (const key in res) {
if (typeList.hasOwnProperty(key)) { //
options.push({
value: key,
label: typeList[key as keyof typeof typeList], //
children: res[key].map((item: { id: number; name: string }) => ({
value: item.id,
label: item.name
})),
});
}
}
allCateList.value = options;
})
}
const ids = ref<any>([])
const change = (value: any) => {
cateIds.value = value
ids.value = []
}
const uploadCateIds = () => {
cateIds.value.map((item: any) => {
if (item[item.length - 1] === 0) return
ids.value.push(item[item.length - 1])
})
console.log(ids)
}
onMounted(() => {
getAllCate()
})
</script>
<style scoped lang="scss">
.select {
height: 100%;
padding: 24px;
display: flex;
justify-content: center;
align-items: center;
}
.bottom {
height: 100%;
display: flex;
justify-content: flex-end;
padding: 24px;
}
</style>

View File

@ -1,5 +1,5 @@
<template> <template>
<Mask :width="400" :height="600" :is-show="isShow" @close="isShow=false" :show-fotter="true" title="药品列表"> <Mask :width="400" :height="600" :is-show="isShow" @close="isShow=false" :show-footer="true" title="药品列表">
<el-table <el-table
:data="cateList" :data="cateList"
style="width: 100%" style="width: 100%"

View File

@ -693,7 +693,6 @@ const contrastCodeConfirm = (data: any) => {
} }
let save = async (isClose:Boolean) => { let save = async (isClose:Boolean) => {
try { try {
await formRef.value.validate() await formRef.value.validate()
if (!edit_data.value.purchaseUnitPrice || edit_data.value.purchaseUnitPrice<1){ if (!edit_data.value.purchaseUnitPrice || edit_data.value.purchaseUnitPrice<1){
ElMessage.error('参考进价不能为空或小于1'); ElMessage.error('参考进价不能为空或小于1');

View File

@ -3,7 +3,8 @@
title="新增" :height="760" :show-footer="true"> title="新增" :height="760" :show-footer="true">
<div class="add-panel" v-loading="isLoading" element-loading-text="正在保存......"> <div class="add-panel" v-loading="isLoading" element-loading-text="正在保存......">
<div class="top"> <div class="top">
<el-form :model="inventory_order_data" label-position="top" :rules="formRules" ref="orderForm"> <el-form :model="inventory_order_data" label-position="top" style="height: 100%" :rules="formRules"
ref="orderForm">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="订单编号"> <el-form-item label="订单编号">
@ -48,13 +49,14 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="invoiceCode" label="发票号"> <el-form-item prop="invoiceCode" label="发票号" style="margin-bottom: 0">
<el-input style="width: 234px;" v-model="inventory_order_data.invoiceCode"></el-input> <el-input style="width: 234px;" v-model="inventory_order_data.invoiceCode"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="supplierId" label="供应商" :rules="formRules.supplierId"> <el-form-item prop="supplierId" label="供应商" :rules="formRules.supplierId" style="margin-bottom: 0">
<el-select style="width: 130px;margin-right: 10px" v-model="inventory_order_data.supplierId" placeholder="请选择供应商"> <el-select style="width: 196px;margin-right: 10px" v-model="inventory_order_data.supplierId"
placeholder="请选择供应商">
<el-option <el-option
v-for="item in supplier_list" v-for="item in supplier_list"
:key="item.id" :key="item.id"
@ -62,11 +64,22 @@
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
<el-button type="primary" @click="addSupplier">添加供应商</el-button> <div class="default-btn"
style="
height: 32px;
width: 32px;
line-height: 32px;
border: 1px solid rgb(192, 196, 204);
background-color: #fff;"
@click="addSupplier">
<el-icon style="color: rgb(192, 196, 204)">
<Plus/>
</el-icon>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="备注" :rules="formRules.purchaseDate"> <el-form-item label="备注" :rules="formRules.purchaseDate" style="margin-bottom: 0">
<el-input v-model="inventory_order_data.remark"/> <el-input v-model="inventory_order_data.remark"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -77,10 +90,17 @@
<div class="add_goods"> <div class="add_goods">
<span>添加商品</span> <span>添加商品</span>
<div class="search"> <div class="search">
<GoodsSearch @selectCallBack="goodsSelectCallBack"></GoodsSearch> <GoodsSearch @selectCallBack="goodsSelectCallBack" style="height: 42px"></GoodsSearch>
<div class="default-btn" @click="goodsSelectCallBack" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div> </div>
</div> </div>
<el-table :data="table_list" style="width: 100%;flex: 1"> </div>
<div class="table" style="padding: 0 24px;">
<el-table :data="table_list"
style="width: 100%;height: 100%;background: #F9FAFC;border: 1px solid #EAEAEC;border-bottom: none"
:header-cell-style="{ backgroundColor:'#F1F5FB'}">
<el-table-column prop="name" label="药品名称" width="180" show-overflow-tooltip/> <el-table-column prop="name" label="药品名称" width="180" show-overflow-tooltip/>
<el-table-column label="售价" prop="unitPrice" width="80"> <el-table-column label="售价" prop="unitPrice" width="80">
</el-table-column> </el-table-column>
@ -119,7 +139,6 @@
style="width: 100px" style="width: 100px"
size="small"/> size="small"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="生产日期" width="140"> <el-table-column label="生产日期" width="140">
<template #default="scope"> <template #default="scope">
@ -146,24 +165,30 @@
</el-table-column> </el-table-column>
<el-table-column label="商品追溯码" width="150"> <el-table-column label="商品追溯码" width="150">
<template #default="scope"> <template #default="scope">
<!-- <el-input--> <!-- <el-input-->
<!-- v-model="scope.row.traceabilityCode"--> <!-- v-model="scope.row.traceabilityCode"-->
<!-- placeholder="商品追溯码"--> <!-- placeholder="商品追溯码"-->
<!-- style="width: 100px"--> <!-- style="width: 100px"-->
<!-- size="small"/>--> <!-- size="small"/>-->
<TraceabilityCodeInput v-model="scope.row.traceabilityCodeList"></TraceabilityCodeInput> <TraceabilityCodeInput v-model="scope.row.traceabilityCodeList"></TraceabilityCodeInput>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="150"> <el-table-column label="操作" width="200">
<template #default="scope"> <template #default="scope">
<!-- <el-button size="small" @click="openCheckoutDetail(scope.row)" type="danger" plain>溯源码</el-button>--> <!-- <el-button size="small" @click="openCheckoutDetail(scope.row)" type="danger" plain>溯源码</el-button>-->
<el-button size="small" @click="removeTableRow(scope.row)" type="danger" plain>移除</el-button> <span style="color: #ff0000" @click="removeTableRow(scope.row)">
<el-icon>
<Delete/>
</el-icon>
移除
</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</div> </div>
</div>
<template #footer> <template #footer>
<div class="bottom"> <div class="bottom">
<div class="totalPrice"> <div class="totalPrice">
@ -171,8 +196,8 @@
style="color: #FF282E">{{ inventory_order_data.totalPrice.toFixed(2) }}</span> style="color: #FF282E">{{ inventory_order_data.totalPrice.toFixed(2) }}</span>
</div> </div>
<div class="btn"> <div class="btn">
<el-button type="primary" @click="confirm">确认</el-button> <div class="default-btn" @click="exit">关闭</div>
<el-button type="primary" @click="exit">关闭</el-button> <div class="default-btn" @click="confirm" style="margin-left: 24px">确认</div>
</div> </div>
</div> </div>
</template> </template>
@ -193,8 +218,8 @@ import {ElMessage} from "element-plus";
import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue"; import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue"; import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CheckoutDetail from "@/components/inventory/CheckoutDetail.vue"; import CheckoutDetail from "@/components/inventory/CheckoutDetail.vue";
import {Search} from "@element-plus/icons-vue";
import TraceabilityCodeInput from "@/components/inventory/purchase/TraceabilityCodeInput.vue"; import TraceabilityCodeInput from "@/components/inventory/purchase/TraceabilityCodeInput.vue";
import {Plus, Delete} from "@element-plus/icons-vue";
const orderForm = ref() const orderForm = ref()
const checkoutDetailRef = ref<any>(false); const checkoutDetailRef = ref<any>(false);
@ -294,7 +319,7 @@ function getFormattedDate() {
} }
let confirm = async () => { let confirm = async () => {
console.log('table_list.value++++++++++++++',table_list.value) console.log('table_list.value++++++++++++++', table_list.value)
// //
try { try {
await orderForm.value.validate() await orderForm.value.validate()
@ -325,7 +350,7 @@ let confirm = async () => {
} }
table_list.value.forEach((item: any) => { table_list.value.forEach((item: any) => {
console.log(item.traceabilityCodeList) console.log(item.traceabilityCodeList)
item.traceabilityCode= JSON.stringify(item.traceabilityCodeList) item.traceabilityCode = JSON.stringify(item.traceabilityCodeList)
}) })
let data = { let data = {
inventoryOrder: JSON.parse(JSON.stringify(inventory_order_data.value)), inventoryOrder: JSON.parse(JSON.stringify(inventory_order_data.value)),
@ -398,8 +423,7 @@ const init = () => {
} }
const managerUserList: any = ref([]) const managerUserList: any = ref([])
const getManagerUserList = () => { const getManagerUserList = () => {
post("manager/user/list", { post("manager/user/list", {}).then((res: any) => {
}).then((res: any) => {
managerUserList.value = res managerUserList.value = res
}) })
} }
@ -473,19 +497,20 @@ defineExpose({init})
.add-panel { .add-panel {
height: 602px; height: 602px;
padding: 24px 24px 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.top { .top {
height: 180px; height: 204px;
padding: 24px;
} }
.table_content { .table_content {
flex: 1; flex: 1;
margin-top: 24px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: #F9FAFC;
min-height: 0;
.add_goods { .add_goods {
height: 90px; height: 90px;
@ -496,11 +521,21 @@ defineExpose({init})
font-size: 18px; font-size: 18px;
color: #333333; color: #333333;
font-style: normal; font-style: normal;
padding: 0 24px;
.search { .search {
width: 50%; display: flex;
align-items: center;
height: 42px;
} }
} }
.table {
flex: 1;
min-height: 0;
background: #F9FAFC;
}
} }
} }
@ -514,6 +549,10 @@ defineExpose({init})
font-size: 22px; font-size: 22px;
color: #333333; color: #333333;
font-style: normal; font-style: normal;
.btn {
display: flex;
}
} }
.error { .error {

View File

@ -5,8 +5,8 @@
@blur="handlerBlur" @keydown.enter="addCode"></el-input> @blur="handlerBlur" @keydown.enter="addCode"></el-input>
</template> </template>
<div class="code-popo"> <div class="code-popo">
<el-table :data="list"> <el-table :data="list" :max-height="260" :header-cell-style="{background: '#F1F5FB'}">
<el-table-column label="追溯码" prop="code"> <el-table-column label="追溯码" prop="code" show-overflow-tooltip>
<template #default="{row}"> <template #default="{row}">
{{ row.code.slice(0, 7) }}&nbsp;{{ row.code.slice(7) }} {{ row.code.slice(0, 7) }}&nbsp;{{ row.code.slice(7) }}
</template> </template>
@ -18,12 +18,13 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="70"> <el-table-column label="操作" width="90">
<template #default="{row}"> <template #default="{row}">
<span class="remove" @click="removeRow(row)"> <span class="remove" style="color: #ff0000" @click="removeRow(row)">
<el-icon> <el-icon>
<Close/> <Delete/>
</el-icon> </el-icon>
删除
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -34,7 +35,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref, watch, onMounted, onUnmounted, nextTick} from "vue"; import {ref, watch, onMounted, onUnmounted, nextTick} from "vue";
import {Close} from "@element-plus/icons-vue"; import {Delete} from "@element-plus/icons-vue";
import CodeNumEditDialog from "@/components/inventory/purchase/CodeNumEditDialog.vue"; import CodeNumEditDialog from "@/components/inventory/purchase/CodeNumEditDialog.vue";
interface listType { interface listType {

View File

@ -1,47 +1,67 @@
<template> <template>
<div class="container_grant"> <Mask :width="540" :height="363" :is-show="isExchange" @close="close" :title="'兑换积分'"
:show-footer="true">
<div class="content_grant"> <div class="content_grant">
<div class="head"> <div class="head">
<img style="width: 60px;height: 60px"
:src="'/static/images/member/' + (props.info.sex === 1 ? 'man' : 'women') + '.png'"
alt="">
<div class="right">
<div class="name"> <div class="name">
{{props.info.realName}} {{ props.info.name }}
</div>
<div class="sex">
{{props.info.sex}}
</div> </div>
<div class="text">
<div class="phone"> <div class="phone">
{{props.info.phone}} {{ props.info.phone }}
</div> </div>
<div class="point"> <div class="grant-name">
积分<span class="num">{{ props.info.integralBalance }}</span> 积分
<img style="width: 16px;height: 16px" src="/static/images/member/1.png" alt="">
<span class="num">{{ props.info.integralBalance }}</span>
</div> </div>
</div> </div>
<div> </div>
<el-form label-position="top" :rules="rules" ref="formDataRef" :model="data"> </div>
<el-form-item label="兑换积分" prop="integral" > <div style="width: 100%">
<el-form
label-position="top" :rules="rules" ref="formDataRef" :model="data"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="兑换积分" prop="integral">
<el-input placeholder="请输入兑换积分" v-model="data.integral"></el-input> <el-input placeholder="请输入兑换积分" v-model="data.integral"></el-input>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="兑换备注" prop="remark"> <el-form-item label="兑换备注" prop="remark">
<el-input placeholder="请输入兑换备注" v-model="data.remark"></el-input> <el-input placeholder="请输入兑换备注" v-model="data.remark"></el-input>
</el-form-item> </el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
</div> </div>
</div> </div>
<template #footer>
<div class="footer"> <div class="footer">
<div> <div>
<el-checkbox v-model="printReceipt">同时打印凭证</el-checkbox> <el-checkbox v-model="printReceipt">同时打印凭证</el-checkbox>
</div> </div>
<div> <div style="display:flex;">
<el-button type="primary" @click="reduceIntegral">发放</el-button> <div class="default-btn" @click="reduceIntegral">兑换</div>
<el-button @click="close">取消</el-button> <div class="default-btn" style="margin-left: 24px" @click="close">取消</div>
</div>
</div> </div>
</div> </div>
</template>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref,defineEmits, defineProps} from 'vue' import {ref, defineEmits, defineProps} from 'vue'
import {ElFormItem} from "element-plus"; import {ElFormItem} from "element-plus";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue";
const isExchange = defineModel()
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const props = defineProps({ const props = defineProps({
info: { info: {
@ -54,12 +74,12 @@ const close = () => {
data.value = {} data.value = {}
emit('close') emit('close')
} }
const rules ={ const rules = {
integral: [ integral: [
{required: true, message: '请输入发放积分', trigger: 'blur'}, {required: true, message: '请输入兑换积分', trigger: 'blur'},
{min: 1, message: '积分不能小于1', trigger: 'blur'} {min: 1, message: '积分不能小于1', trigger: 'blur'}
], ],
remark:[ remark: [
{required: true, message: '请输入兑换备注', trigger: 'blur'}, {required: true, message: '请输入兑换备注', trigger: 'blur'},
] ]
} }
@ -70,13 +90,12 @@ const formDataRef = ref();
const reduceIntegral = () => { const reduceIntegral = () => {
formDataRef.value?.validate((valid: boolean) => { formDataRef.value?.validate((valid: boolean) => {
if (!valid) { if (!valid) {
console.log("表单验证失败",data.value);
return; return;
} }
// //
data.value.integral =data.value.integral * -1 data.value.integral = data.value.integral * -1
data.value.vipId = props.info.id data.value.vipId = props.info.id
post("vip/integral/add",data.value).then((res: any) => { post("vip/integral/add", data.value).then((res: any) => {
formDataRef.value?.resetFields(); formDataRef.value?.resetFields();
close() close()
}) })
@ -86,42 +105,62 @@ const reduceIntegral = () => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container_grant { .content_grant {
background-color: #fff; height: 100%;
.title_grant { padding: 24px;
padding-bottom: 20px;
font-size: 18px;
}
.content_grant {
.head { .head {
height: 50px; height: 60px;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: rgba(220, 222, 223, 0.5); margin-bottom: 16px;
border-radius: 10px;
padding-left: 20px; .name {
margin-bottom: 20px; font-weight: bold;
border: 1px solid rgba(0, 0, 0, 0.05); font-size: 24px;
.sex{ color: #333333;
margin:0 10px; line-height: 33px;
text-align: left;
font-style: normal;
} }
.phone{
height: 21px; .right {
line-height: 25px;
}
.point{
margin:0 30px 0 50px;
.num{
color: rgba(237, 120, 23, 0.67);
}
}
}
}
.footer {
display: flex; display: flex;
justify-content: space-between; flex-direction: column;
padding-top: 20px; justify-content: center;
margin-left: 16px;
.text {
margin-top: 4px;
display: flex;
.phone {
margin-right: 20px;
}
.grant-name {
display: flex;
.num {
font-weight: bold;
font-size: 24px;
color: #4D6DE4;
font-style: normal;
line-height: 16px;
margin-left: 6px;
}
}
}
}
} }
} }
.footer {
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 24px;
}
</style> </style>

View File

@ -1,48 +1,63 @@
<template> <template>
<div class="container_grant"> <Mask :width="540" :height="363" :is-show="isGrant" @close="isGrant=false" :title="'发放积分'" :show-footer="true">
<template #default>
<div class="content_grant"> <div class="content_grant">
<div class="head"> <div class="head">
<img style="width: 60px;height: 60px"
:src="'/static/images/member/' + (props.info.sex === 1 ? 'man' : 'women') + '.png'"
alt="">
<div class="right">
<div class="name"> <div class="name">
{{props.info.realName}} {{ props.info.name }}
</div>
<div class="sex">
{{props.info.sex}}
</div> </div>
<div class="text">
<div class="phone"> <div class="phone">
{{props.info.phone}} {{ props.info.phone }}
</div> </div>
<div class="point"> <div class="grant-name">
积分<span class="num">{{props.info.integralBalance}}</span> 积分
<img style="width: 16px;height: 16px" src="/static/images/member/1.png" alt="">
<span class="num">{{ props.info.integralBalance }}</span>
</div> </div>
</div> </div>
<div> </div>
</div>
<div style="width: 100%">
<el-form <el-form
:rules="rules" label-position="top" :rules="rules" ref="ruleFormRef" :model="data"
v-model="data"
label-position="top"
ref="ruleFormRef"
require-asterisk-position="right"
> >
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="发放积分" prop="integral"> <el-form-item label="发放积分" prop="integral">
<el-input v-model="data.integral" placeholder="请输入发放积分"></el-input> <el-input v-model="data.integral" placeholder="请输入发放积分"></el-input>
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发放备注" prop="remark"> <el-form-item label="发放备注" prop="remark">
<el-input v-model="data.remark" placeholder="请输入发放备注"></el-input> <el-input v-model="data.remark" placeholder="请输入发放备注"></el-input>
</el-form-item> </el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
</div> </div>
</div> </div>
</template>
<template #footer>
<div class="footer"> <div class="footer">
<el-button type="primary" @click="grant()">发放</el-button> <div class="default-btn" @click="grant()">发放</div>
<el-button @click="close">取消</el-button> <div class="default-btn" style="margin-left: 24px" @click="close">取消</div>
</div>
</div> </div>
</template>
</Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref,defineEmits,defineProps} from 'vue' import {ref, defineEmits, defineProps, onMounted} from 'vue'
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {ElFormItem} from "element-plus"; import {ElFormItem, ElMessage} from "element-plus";
import Mask from "@/components/common/Mask.vue";
const isGrant = defineModel()
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const props = defineProps({ const props = defineProps({
info: { info: {
@ -50,64 +65,92 @@ const props = defineProps({
default: () => ({}) default: () => ({})
} }
}) })
const rules ={
const rules = {
integral: [ integral: [
{required: true, message: '请输入发放积分', trigger: 'blur'}, {required: true, message: '请输入兑换积分', trigger: 'blur'},
{min: 0, message: '积分不能小于0', trigger: 'blur'}
], ],
remark:[ remark: [
{required: true, message: '请输入备注', trigger: 'blur'}, {required: true, message: '请输入兑换备注', trigger: 'blur'},
] ]
} }
const close = () => { const close = () => {
data.value = {}
emit('close') emit('close')
} }
const data=ref<any>({}) const data = ref<any>({})
const ruleFormRef = ref()
const grant = async () => { const grant = async () => {
ruleFormRef.value?.validate((valid: any) => {
if (!valid) return
data.value.vipId = props.info.id data.value.vipId = props.info.id
post('vip/integral/add', data.value).then((res: any) => { post('vip/integral/add', data.value).then((res: any) => {
ElMessage.success('已发放')
close() close()
}) })
})
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container_grant { .content_grant {
background-color: #fff; height: 100%;
.title_grant { padding: 24px;
padding-bottom: 20px;
font-size: 18px;
}
.content_grant {
.head { .head {
height: 50px; height: 60px;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: rgba(220, 222, 223, 0.5); margin-bottom: 16px;
border-radius: 10px;
padding-left: 20px; .name {
margin-bottom: 20px; font-weight: bold;
border: 1px solid rgba(0, 0, 0, 0.05); font-size: 24px;
.sex{ color: #333333;
margin:0 10px; line-height: 33px;
} text-align: left;
.phone{ font-style: normal;
height: 21px;
line-height: 25px;
}
.point{
margin:0 30px 0 50px;
.num{
color: rgba(237, 120, 23, 0.67);
} }
.right {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 16px;
.text {
margin-top: 4px;
display: flex;
.phone {
margin-right: 20px;
} }
.grant-name {
display: flex;
.num {
font-weight: bold;
font-size: 24px;
color: #4D6DE4;
font-style: normal;
line-height: 16px;
margin-left: 6px;
} }
} }
.footer { }
display: flex; }
justify-content: flex-end;
padding-top: 20px;
} }
} }
.footer {
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
padding: 24px;
}
</style> </style>

View File

@ -1,7 +1,8 @@
<template> <template>
<div class="layout-container"> <div class="layout-container">
<Header class="header" /> <Header class="header"/>
<header> <div class="body">
<header style="height: 50px">
<div class="center-wrapper"> <div class="center-wrapper">
<div class="childMenu"> <div class="childMenu">
<router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index"> <router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index">
@ -10,46 +11,73 @@
</div> </div>
</div> </div>
</header> </header>
<div class="space"></div> <main class="layout-main" style="margin-top: 24px">
<main class="layout-main">
<router-view/> <router-view/>
</main> </main>
<div class="space"></div>
<Footer class="footer" />
</div> </div>
<Footer class="footer"/>
</div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.body{
height: 100%;
padding: 24px;
display: flex;
flex-direction: column;
}
.childMenu { .childMenu {
width: 100%; width: 100%;
height: 60px; height: 50px;
background: #fff; background: #fff;
display: flex; display: flex;
align-items: center; align-items: center;
border-radius: 8px;
.child-item { .child-item {
width: 136px;
display: inline-block; display: inline-block;
color: #151515; color: #151515;
outline: none; outline: none;
text-decoration: none; text-decoration: none;
font-size: 18px; font-size: 18px;
margin-left: 10px; height: 50px;
margin-right: 10px;
height: 35px;
position: relative; position: relative;
line-height: 50px;
text-align: center;
&::before{
content: '';
position: absolute;
right: 0;
top:50%;
display: block;
width: 2px;
height: 16px;
background: #D8D8D8;
border-radius: 1px;
transform: translate(0 ,-50%);
}
&:last-child::before{
display: none;
}
} }
.router-link-active:after { .router-link-active:after {
content: ''; content: '';
display: block; display: block;
width: 100%; width: 80px;
height: 2px; height: 4px;
background-color: #151515; // 线 background-color: #4D6DE4; // 线
position: absolute; position: absolute;
bottom: -5px; // 线 bottom: 0; // 线
left: 0; left: 50%;
transform: translateX(-50%);
border-radius: 2px;
} }
} }
a.router-link-active.router-link-exact-active.child-item{
color: #4D6DE4;
}
</style> </style>

View File

@ -19,7 +19,7 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-cascader style="width: 180px;height: 42px" :options="allCateList" :show-all-levels="false" <el-cascader :collapse-tags="true" :props="props" style="width: 180px;height: 42px" :options="allCateList" :show-all-levels="false"
v-model="searchModel.cateId" clearable/> v-model="searchModel.cateId" clearable/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -426,6 +426,7 @@ const getStatisticsData = () => {
statisticsData.value = res statisticsData.value = res
}) })
} }
const props = { multiple: true }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.v-enter-active, .v-enter-active,

View File

@ -77,7 +77,8 @@
</div> </div>
</div> </div>
<div class="addBtn"> <div class="addBtn">
<span @click="openAdd">新增采购</span> <span class="default-btn" @click="openAdd">新增采购</span>
<span class="default-btn" @click="openUpload">一键导入</span>
</div> </div>
</div> </div>
<div class="content_list"> <div class="content_list">
@ -129,6 +130,7 @@
</div> </div>
<AddOrder ref="addOrderRef" @close="closeAddOrder"/> <AddOrder ref="addOrderRef" @close="closeAddOrder"/>
<EditOrder ref="editOrderRef" @close="closeEditOrder" @updateOrderDetail="init"/> <EditOrder ref="editOrderRef" @close="closeEditOrder" @updateOrderDetail="init"/>
<UpLoad v-model="show"></UpLoad>
</div> </div>
</template> </template>
@ -141,6 +143,7 @@ import Mask from "@/components/common/Mask.vue";
import EditOrder from "@/components/inventory/purchase/EditOrder.vue"; import EditOrder from "@/components/inventory/purchase/EditOrder.vue";
import {Plus, Refresh, Search, SemiSelect} from "@element-plus/icons-vue"; import {Plus, Refresh, Search, SemiSelect} from "@element-plus/icons-vue";
import {formatDateArray, getEndOfDay} from "@/utils/dateUtils.ts"; import {formatDateArray, getEndOfDay} from "@/utils/dateUtils.ts";
import UpLoad from "@/components/inventory/Upload.vue";
let tableData = ref([]) let tableData = ref([])
let is_edit = ref(false) let is_edit = ref(false)
@ -242,6 +245,10 @@ const resetSearch = () => {
} }
init() init()
} }
const show = ref(false)
const openUpload= ()=>{
show.value=true
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
@ -377,26 +384,9 @@ const resetSearch = () => {
} }
.addBtn { .addBtn {
span { span{
display: inline-block; display: inline-block;
width: 120px;
height: 42px;
background: #FFFFFF;
border-radius: 6px;
border: 1px solid #4D6DE4;
margin-right: 24px; margin-right: 24px;
font-weight: 500;
font-size: 16px;
color: #4D6DE4;
text-align: center;
line-height: 42px;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #fff;
border: none;
}
} }
} }
} }

View File

@ -74,7 +74,7 @@
}} }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="证件类型"> <el-descriptions-item label="证件类型">
{{ certTypeList.find((item: any) => item.id == listItem.certType)?.name }} {{ certTypeList.find((item: any) => item.id == Number(listItem.certType))?.name }}
</el-descriptions-item> </el-descriptions-item>
> >
<el-descriptions-item label="证件号码">{{ listItem.certNo || "-" }}</el-descriptions-item> <el-descriptions-item label="证件号码">{{ listItem.certNo || "-" }}</el-descriptions-item>
@ -155,12 +155,8 @@
</div> </div>
<VipEdit ref="refEdit" @close="init"></VipEdit> <VipEdit ref="refEdit" @close="init"></VipEdit>
<VipLevelEdit ref="levelEditRef" @close="init"></VipLevelEdit> <VipLevelEdit ref="levelEditRef" @close="init"></VipLevelEdit>
<Mask :width="600" :height="400" :is-show="isGrant" @close="isGrant=false" :title="'发放积分'"> <Grant v-model="isGrant" :info="listItem" @close="closeGrant()"></Grant>
<Grant :info="listItem" @close="closeGrant()"></Grant> <Exchange v-model="isExchange" :info="listItem" @close="closeExchange()"></Exchange>
</Mask>
<Mask :width="600" :height="400" :is-show="isExchange" @close="isExchange=false" title="兑换积分">
<Exchange :info="listItem" @close="closeExchange()"></Exchange>
</Mask>
<Mask :is-show="isFlowingWater" @close="isFlowingWater = false" title="流水记录"> <Mask :is-show="isFlowingWater" @close="isFlowingWater = false" title="流水记录">
<FlowingWater :info="listItem"></FlowingWater> <FlowingWater :info="listItem"></FlowingWater>
</Mask> </Mask>
@ -238,8 +234,6 @@ const init = () => {
}); });
}); });
getChargeList(listItem.value.id); getChargeList(listItem.value.id);
}); });
}; };
const getVipIntegral = (id: any) => { const getVipIntegral = (id: any) => {
@ -310,6 +304,7 @@ const btn = (item: any, i: number) => {
// //
const openGrant = () => { const openGrant = () => {
isGrant.value = true isGrant.value = true
console.log(listItem.value)
} }
// //
const tableData = ref([]) const tableData = ref([])