This commit is contained in:
ChenQiuYu 2025-05-16 15:04:58 +08:00
parent 5a346e1b2d
commit 8ee0dd89d7
4 changed files with 127 additions and 80 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,17 +1,34 @@
<template> <template>
<div class="container"> <Mask :width="798" :height="540" :is-show="isFlowingWater" @close="isFlowingWater = false" title="流水记录"
<div class="body"> :show-footer="true">
<div class="body_info"> <template #default>
<span class="name">{{props.info.realName}}</span> <div class="content">
<span>{{props.info.sex}}</span> <div class="head">
<span class="phone">{{props.info.phone}}</span> <img style="width: 60px;height: 60px"
<span>积分<span class="num">{{props.info.integralBalance}}</span></span> :src="'/static/images/member/' + (props.info.sex === 1 ? 'man' : 'women') + '.png'"
</div> alt="">
<div class="body_list"> <div class="right">
<el-table :data="tableData" style="width: 100%"> <div class="name">
{{ props.info.name }}
</div>
<div class="text">
<div class="phone">
{{ props.info.phone }}
</div>
<div class="grant-name">
积分
<img style="width: 16px;height: 16px" src="/static/images/member/1.png" alt="">
<span class="num">{{ props.info.integralBalance }}</span>
</div>
</div>
</div>
</div>
<el-table class="body_list" :data="tableData"
style="border-radius: 8px;border: 1px solid #EAEAEC;border-bottom: none"
:header-cell-style="{ backgroundColor: '#F1F5FB'}">
<el-table-column prop="createTime" label="创建时间" width="180"> <el-table-column prop="createTime" label="创建时间" width="180">
<template #default="scope"> <template #default="scope">
{{formatDate(scope.row.createTime)}} {{ formatDate(scope.row.createTime) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="beforeIntegral" label="变化前"/> <el-table-column prop="beforeIntegral" label="变化前"/>
@ -20,113 +37,141 @@
<el-table-column prop="remark" label="备注"/> <el-table-column prop="remark" label="备注"/>
</el-table> </el-table>
</div> </div>
</div> </template>
<div class="bottom"> <template #footer>
<el-pagination <div class="bottom">
background <el-pagination
layout="prev, pager, next" background
:page-size="20" layout="prev, pager, next"
:current-page="currentPage" :page-size="20"
:total="total" :current-page="currentPage"
@current-change="changePage" :total="total"
/> @current-change="changePage"
</div> />
</div> </div>
</template>
</Mask>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref,defineEmits, defineProps, onMounted} from 'vue' import {ref, defineEmits, defineProps, onMounted} from 'vue'
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue";
const isFlowingWater = defineModel()
const props = defineProps({ const props = defineProps({
info: { info: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
},
id: {
type: String || Number,
default: ""
} }
}) })
const currentPage = ref(1) const currentPage = ref(1)
const tableData:any = ref<any>([]) const tableData: any = ref<any>([])
const total = ref(0) const total = ref(0)
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
const close = () => { const close = () => {
emit('close') emit('close')
} }
onMounted(()=>{ onMounted(() => {
init() init()
}) })
const changePage = (page:any) => { const changePage = (page: any) => {
const query = { const query = {
pageNum: page, pageNum: page,
pageSize: 20, pageSize: 20,
vipId: props.info.id vipId: props.id
} }
post('vip/integral/list',{query:query}).then((res:any)=>{ post('vip/integral/list', {query: query}).then((res: any) => {
tableData.value.splice(0,tableData.length,...res.list) tableData.value.splice(0, tableData.length, ...res.list)
}) })
} }
const init = () => { const init = () => {
const query = { const query = {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
vipId: props.info.id vipId: props.id
} }
post('vip/integral/list',{query:query}).then((res:any)=>{ post('vip/integral/list', {query: query}).then((res: any) => {
tableData.value.splice(0,tableData.length,...res.list) tableData.value.splice(0, tableData.length, ...res.list)
total.value = res.total_count total.value = res.total_count
}) })
} }
// //
const formatDate = (isoStr:any) => { const formatDate = (isoStr: any) => {
const date = new Date(isoStr); const date = new Date(isoStr);
return `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2,'0')}-${date.getDate().toString().padStart(2,'0')}`; return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container { .content {
position: relative; padding-top: 24px;
width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between;
min-height: 0;
.title {
height: 60px;
font-size: 20px;
} .head {
.body {
flex: 1;
.body_info{
height: 50px;
display: flex;
font-size: 14px;
padding-left: 10px;
align-items: center;
color: #bac2ca;
.name{
font-size: 16px;
margin-right: 10px;
color: #121111;
}
.phone{
height: 15px;
margin: 0 17px;
line-height: 16px;
}
.num{
color: #df9b86;
margin-left: 10px;
}
}
}
.bottom {
position: absolute;
bottom: 0;
height: 60px; height: 60px;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 16px;
padding: 0 24px;
.name {
font-weight: bold;
font-size: 24px;
color: #333333;
line-height: 33px;
text-align: left;
font-style: normal;
}
.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;
}
}
}
}
}
.body_list {
width: 100%;
flex: 1;
background: #F9FAFC;
padding: 24px 24px 0;
} }
} }
.bottom {
height: 100%;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 24px;
}
</style> </style>

View File

@ -405,6 +405,7 @@ const init = (_id: any) => {
ruleForm.value = res ruleForm.value = res
ruleForm.value.area = JSON.parse(ruleForm.value.area) ruleForm.value.area = JSON.parse(ruleForm.value.area)
ruleForm.value.levelId = ruleForm.value.levelId == 0 ? null : ruleForm.value.levelId ruleForm.value.levelId = ruleForm.value.levelId == 0 ? null : ruleForm.value.levelId
ruleForm.value.certType=Number(ruleForm.value.certType)
if (!res.levelId) return if (!res.levelId) return
post("vip/vipLevel/get", {levelId: res.levelId}).then((res: any) => { post("vip/vipLevel/get", {levelId: res.levelId}).then((res: any) => {
levelName.value = res.name levelName.value = res.name

View File

@ -55,7 +55,7 @@
<span class="btn" @click="openEdit(listItem.id)">编辑资料</span> <span class="btn" @click="openEdit(listItem.id)">编辑资料</span>
<span class="btn" @click="openGrant()">发放积分</span> <span class="btn" @click="openGrant()">发放积分</span>
<span class="btn" @click="isExchange=true">兑换积分</span> <span class="btn" @click="isExchange=true">兑换积分</span>
<span class="btn" @click="isFlowingWater=true">查看流水</span> <span class="btn" @click="openFlowingWater">查看流水</span>
<!-- <span class="btn" @click="openLevelEdit(listItem)">患者等级编辑</span>--> <!-- <span class="btn" @click="openLevelEdit(listItem)">患者等级编辑</span>-->
</div> </div>
</div> </div>
@ -157,9 +157,7 @@
<VipLevelEdit ref="levelEditRef" @close="init"></VipLevelEdit> <VipLevelEdit ref="levelEditRef" @close="init"></VipLevelEdit>
<Grant v-model="isGrant" :info="listItem" @close="closeGrant()"></Grant> <Grant v-model="isGrant" :info="listItem" @close="closeGrant()"></Grant>
<Exchange v-model="isExchange" :info="listItem" @close="closeExchange()"></Exchange> <Exchange v-model="isExchange" :info="listItem" @close="closeExchange()"></Exchange>
<Mask :is-show="isFlowingWater" @close="isFlowingWater = false" title="流水记录"> <FlowingWater :id="flowingId" v-model="isFlowingWater" :info="listItem"></FlowingWater>
<FlowingWater :info="listItem"></FlowingWater>
</Mask>
<OrderDetail ref="orderDetailRef" @updateOrderList="getChargeList(listItem.id)"></OrderDetail> <OrderDetail ref="orderDetailRef" @updateOrderList="getChargeList(listItem.id)"></OrderDetail>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -304,7 +302,6 @@ 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([])
@ -380,7 +377,11 @@ const handleCurrentChange = (val: number) => {
const levelEditRef = ref(); const levelEditRef = ref();
const antysList = ref<any>(Object.entries(antys).map(([id, name]) => ({id, name}))) const antysList = ref<any>(Object.entries(antys).map(([id, name]) => ({id, name})))
const certTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => ({id, name}))) const certTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => ({id, name})))
const flowingId = ref();
const openFlowingWater=()=>{
isFlowingWater.value=true
flowingId.value=listItem.value.id
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";