5e2c88c5 by 杨炀

no message

1 parent f9c6474d
......@@ -370,8 +370,113 @@ function doVerity(data) {
params: data
})
}
function mergeRecords(data) {
return request({
url: '/exam/info/mergeRecords',
method: 'post',
params: data
})
}
function groupAudit(data) {
return request({
url: '/member/certified/audit',
method: 'post',
params: data
})
}
function groupMergeApi(data) {
return request({
url: `/member/certified/merge`,
method: 'post',
params:data
})
}
function getDetailList(data) {
return request({
url: `/member/certified/getDetailList`,
method: 'get',
params: data
})
}
function getPayList(data) {
return request({
url: `/member/certifiedRange/list`,
method: 'get',
params: data
})
}
function getFillAuditLog(rangeId) {
return request({
url: `/member/certifiedRange/fillAuditLog/${rangeId}`,
method: 'get'
})
}
function commitGroupPay(rangeId) {
return request({
url: `/member/certifiedRange/commit/${rangeId}`,
method: 'post'
})
}
function getGroupFeeBill(query) {
return request({
url: '/member/certifiedDoc/list',
method: 'get',
params: query
})
}
function groupCommitPaymentVoucher(data) {
return request({
url: '/member/certifiedDoc/commitPaymentVoucher',
method: 'post',
params: data
})
}
function getFeeBillById(id) {
return request({
url: `/member/certifiedDoc/${id}`,
method: 'get'
})
}
function personalCommit(id) {
return request({
url: `/person/paymentRange/commit/${id}`,
method: 'post',
params: id
})
}
function delPayment(payIds) {
return request({
url: `/person/payment/${payIds}`,
method: 'DELETE'
})
}
function editYear(id, year) {
return request({
url: `/person/payment/editYear/${id}`,
method: 'get',
params: { year: year }
})
}
function addPersonPaymentGroup(data) {
return request({
url: `/person/payment/addPersonPaymentGroup`,
method: 'post',
params: data
})
}
function commitRenew(id) {
return request({
url: `/person/paymentRange/commit/${id}`,
method: 'post'
})
}
function getVerityMergeList(params) {
return request({
url: '/exam/info/verityMergeList',
method: 'get',
params: params
})
}
export {
getMessage,
reader,
......@@ -410,5 +515,12 @@ export {
updateLevelInfo,addLevelInfo,
chooseStudentsList,batchChoose,getVerityList,
getGroupHistoryByRelateId,
createMyMember,doVerity
createMyMember,doVerity,mergeRecords,
groupAudit,groupMergeApi,
getDetailList,getPayList,
getFillAuditLog,commitGroupPay,getGroupFeeBill,
groupCommitPaymentVoucher,getFeeBillById,
personalCommit,
delPayment,editYear,addPersonPaymentGroup,
commitRenew,getVerityMergeList
}
\ No newline at end of file
......
......@@ -3,9 +3,13 @@ page {
overflow: auto;
background: #f5f7f9;
}
.w50{width: 50%;}
.w100{width: 100%;}
.vipData .w50{width: 45%;}
.esp{text-overflow: ellipsis;overflow: hidden;white-space: nowrap;}
.flexbox{display: flex;}
.mt30{margin-top: 30rpx;}
.mtb30{margin: 30rpx 0;}
.mt40{margin-top: 40rpx;}
.mt50{margin-top: 50rpx;}
.align-forms-item-placeHolder{color: #999;line-height: 2.6;}
......@@ -109,6 +113,7 @@ font-size: 30rpx!important;}
.appItem{background: #FFFFFF;padding: 30rpx;margin-bottom: 30rpx;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196,203,214,0.1);
border-radius: 15rpx;position: relative;
.iconbox{position: absolute;left: 20rpx;}
.pp{font-size: 28rpx;color: #666;margin-bottom: 10rpx;}
.date{
font-size: 28rpx;
......@@ -343,7 +348,9 @@ border-radius: 20rpx 20rpx 0rpx 0rpx;
image{width: 20vw;height: 20vw;display: block;margin: auto;}
}
}
.block-btn-box{padding: 30rpx;
.btn-red-kx{line-height: 2;font-size: 30rpx;}
}
......
......@@ -3,7 +3,8 @@
// staging
const baseUrl_api = "http://192.168.1.97:8787";
// const baseUrl_api = "http://22yidpjzjifv.ngrok.xiaomiqiu123.top/stage-api/";
const baseUrl_api = "http://192.168.1.95:8787";
const fileUrl_api = "http://192.168.1.11:8787";
export default {
......
......@@ -259,6 +259,13 @@
"enablePullDownRefresh": false
}
},{
"path" : "pages/group/feeBill",
"style" :
{
"navigationBarTitleText": "团体会员缴费单",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/personalVip/feeBillDetail",
......@@ -268,6 +275,14 @@
"enablePullDownRefresh": false
}
} ,{
"path" : "pages/group/feeBillDetail",
"style" :
{
"navigationBarTitleText": "缴费单详情",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/personalVip/mobilize",
......@@ -340,6 +355,30 @@
"enablePullDownRefresh": false
}
},{
"path" : "pages/level/merge",
"style" :
{
"navigationBarTitleText": "审核合并",
"enablePullDownRefresh": false
}
},{
"path" : "pages/group/apply/merge",
"style" :
{
"navigationBarTitleText": "审核合并",
"enablePullDownRefresh": false
}
},{
"path" : "pages/group/apply/mergeUp",
"style" :
{
"navigationBarTitleText": "审核合并提交",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/group/apply/applyDetail",
......@@ -359,6 +398,38 @@
}
}
,{
"path" : "pages/level/mergeUp",
"style" :
{
"navigationBarTitleText": "合并提交",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/group/apply/mergeUpDetail",
"style" :
{
"navigationBarTitleText": "缴费详情",
"enablePullDownRefresh": false
}
},{
"path" : "pages/group/pay",
"style" :
{
"navigationBarTitleText": "团队会员认证",
"enablePullDownRefresh": false
}
},{
"path" : "pages/group/payDetail",
"style" :
{
"navigationBarTitleText": "认证详情",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {
"navigationStyle": "custom",
......
<template>
<view>
<!-- 会员调动 -->
<!-- 团队会员审核 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus == 0">审核中</text>
<text v-if="item.auditStatus == 0" class="text-primary">审核中</text>
<text v-if="item.auditStatus == 1" class="text-success">审核通过</text>
<text v-if="item.auditStatus == 2" class="text-danger">审核拒绝</text>
<text v-if="item.auditStatus == 3" class="text-warning">审核退回</text>
......@@ -19,10 +19,18 @@
缴费单位
<view>{{ item.content.memberName }}</view>
</view>
<view v-if="userType = '3'">
<view v-if="userType == '3'">
所属省份
<view>{{item.content.province}}</view>
</view>
<view v-if="userType == '2'">
所属一级
<view>{{item.content.firstDeptName}}</view>
</view>
<view v-if="userType == '2'">
所属二级
<view>{{item.content.secondDeptName}}</view>
</view>
<view>
年限
<view>{{item.content.renewYear}}</view>
......@@ -36,6 +44,10 @@
<view> {{ (item?.content?.allFee*1).toFixed(2) }}</view>
</view>
</view>
<view class="func" v-if="(userType == '3'||userType == '2') && item.auditStatus == 0">
<button @click="audit(item.recordId,'0')">拒绝</button>
<button @click="audit(item.recordId,'1')">同意</button>
</view>
<view class="func" v-if="(deptType == 1&&item.ztxRes == 0)||((deptType == 2 || deptType == 3)&&item.shenRes == 0)">
<button @click="audit(item.recordId,'0')">拒绝</button>
<button @click="audit(item.recordId,'1')">同意</button>
......@@ -46,11 +58,12 @@
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
<view v-if="userType=='2'" class="block-btn-box">
<button @click="goMerge" class="btn-red-kx">前往合并 > </button>
</view>
</view>
</template>
......@@ -90,7 +103,8 @@
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
userType.value = app.globalData.userType
console.log(userType.value)
getList()
}
......@@ -165,7 +179,7 @@
}
obj.recordIds.push(recordId)
console.log(obj)
api.audit(obj).then((res) => {
api.groupAudit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
......@@ -184,15 +198,19 @@
uni.navigateTo({
url: path
});
} else if(userType.value=='3'){
} else if(userType.value=='2'||userType.value=='3'){
// 审核记录
let path = `/pages/group/apply/record?certId=${item.content.certId}`
uni.navigateTo({
url: path
});
}
}
}
function goMerge(){
let path = `/pages/group/apply/merge`
uni.navigateTo({
url: path
});
}
</script>
......
<template>
<view class="hasfixedbottom">
<!-- 审批合并 -->
<view class="appList">
<view class="appItem" v-for="item in infoList">
<view @click="checkThis(item)" class="iconbox">
<image class="icon" v-if="item.checked" src="@/static/member/dx_dwn.png" />
<image class="icon" v-else src="@/static/member/dx.png" />
</view>
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus == 0" class="text-primary">审核中</text>
<text v-if="item.auditStatus == 1" class="text-success">审核通过</text>
<text v-if="item.auditStatus == 2" class="text-danger">审核拒绝</text>
<text v-if="item.auditStatus == 3" class="text-warning">已撤回</text>
</view>
<view class="date" v-if="item.content.commitTime">提交日期:{{item.content.commitTime}}</view>
<view class="name mt0" @click="goDetail(item)">{{item.content.certName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
缴费单位
<view>{{item.content.memberName}}</view>
</view>
<view v-if="item.content.validityTime">
原有效期
<view>{{item.content.validityTime}}</view>
</view>
<view>
年限
<view>{{item.content.renewYear}}</view>
</view>
</view>
</view>
</view>
<view class="fixedBottom">
<button @click="handleMerge" v-if="infoList.length>0" style="width: 40%;" class="btn-red">合并</button>
<button @click="goMergeUp" class="btn-red-kx" style="width: 40%;">合并提交 > </button>
</view>
<view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
auditStatus: '',
mergeFlag: '0'
})
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const infoList = ref([])
const batchList = ref([])
const total = ref(0)
const totalCost = ref(0)
const deptType = ref('')
onLoad(() => {
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getList()
}
function getList() {
api.getGroupList(queryParams.value).then(response => {
infoList.value = response.rows
infoList.value.forEach(item => {
item.con = item.content
item.content = JSON.parse(item.content)
item.checked = false
})
total.value = response.total
uni.hideLoading()
})
}
function goDetail(item) {
let path = `/pages/group/apply/record?certId=${item.content.certId}`
uni.navigateTo({
url: path
});
}
function goMergeUp(){
// 合并提交
let path = `/pages/group/apply/mergeUp`
uni.navigateTo({
url: path
});
}
function checkThis(item) {
if(item.auditStatus != 1){
uni.showToast({
title:'审核未通过,无法合并',
icon:'error'
})
return
}
if (item.checked) {
item.checked = false
} else {
item.checked = true
}
}
var ids = []
function handleMerge() {
batchList.value = []
ids = []
for (var n of infoList.value) {
if (n.checked) {
batchList.value.push(n)
ids.push(n.recordId)
}
}
if (batchList.value.length == 0) {
uni.showToast({
title: `请选择至少一条数据`,
icon: 'none'
})
return
}
const mergeFlag = batchList.value.some(item => {
if (item.auditStatus != '1') {
return uni.showToast({
title: `${item.examCode}审核未通过,无法合并`,
icon: 'none'
})
}
})
uni.showModal({
title: '提示',
content: `确认合并已选中的数据?`,
success: function(res) {
if (res.confirm) {
api.groupMergeApi({
recordIds: ids
}).then(res => {
uni.showToast({
title: `操作成功`
})
getList()
})
}
}
})
}
</script>
<style scoped lang="scss">
.mt0 {
margin-top: 0 !important;
}
.appList .appItem{padding: 30rpx 30rpx 30rpx 120rpx;}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
.icon {
width: 60rpx;
height: 60rpx;
margin-right: 16rpx;
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 团队会员审核 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.status == 0" class="text-primary">审核中</text>
<text v-if="item.status == 1" class="text-success">审核通过</text>
<text v-if="item.status == 2" class="text-danger">审核拒绝</text>
<text v-if="item.status == 3" class="text-warning">审核撤回</text>
</view>
<view class="date">提交日期:{{item.content.commitTime}}</view>
<view class="date" v-if="item.content.validityTime">原有效期:{{item.content.validityTime}}</view>
<view class="name" @click="goDetail(item)">{{item.content.certName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
年限
<view>{{item.content.renewYear}}</view>
</view>
<view>
会员合计/新会员
<view>{{item.content.allCount}}/<text class="text-danger">{{item.content.newCount}}</text></view>
</view>
<view>
费用合计
<view> {{ (item?.content?.allFee*1).toFixed(2) }}</view>
</view>
</view>
<view class="func" v-if="item.auditStatus == 100">
<button @click="handleAudit(item)">提交</button>
<!-- <button v-if="item.lastIds?.slice(0, 1) != '-'" @click="resolution(item)">取消合并</button> -->
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
mergeFlag: 100,
statusFlag: '101'
})
const navs = ref(['待提交','审核中', '审核通过', '审核拒绝', '已撤回'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
const userType = ref('')
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
console.log(userType.value)
getList()
}
function onClickItem(e) {
console.log(e)
switch(e.currentIndex){
case 0:
queryParams.value.statusFlag = 101
break;
case 1:
queryParams.value.statusFlag = 102
break;
case 2:
queryParams.value.statusFlag = 103
break;
case 3:
queryParams.value.statusFlag = 104
break;
case 4:
queryParams.value.statusFlag = 105
break;
}
getList()
}
function getList() {
uni.showLoading({
title:'加载中'
})
if (queryParams.value.statusFlag == '') {
queryParams.value.mergeFlag = 100
queryParams.value.status = null
}
if (queryParams.value.statusFlag == 101) {
queryParams.value.mergeFlag = 101
queryParams.value.status = null
}
if (queryParams.value.statusFlag == 102) {
queryParams.value.mergeFlag = 1
queryParams.value.status = 0
}
if (queryParams.value.statusFlag == 103) {
queryParams.value.mergeFlag = 1
queryParams.value.status = 1
}
if (queryParams.value.statusFlag == 104) {
queryParams.value.mergeFlag = 1
queryParams.value.status = 2
}
if (queryParams.value.statusFlag == 105) {
queryParams.value.mergeFlag = 100
queryParams.value.status = 3
}
api.getGroupList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value.forEach(item => {
item.con = item.content
item.content = JSON.parse(item.content)
})
total.value = res.total
})
}
function handleAudit(item){
uni.showModal({
title: '提示',
content: `确定提交${item.content.certName}吗`,
success: function(res) {
if (res.confirm) {
api.groupAudit({
flag: '1',
recordIds: [item.recordId],
reason: null
}).then(res=>{
getList()
uni.showToast({
title:`操作成功!`
})
})
}
}
})
}
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
// 查看
let path = `/pages/group/apply/mergeUpDetail?&form=${form}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped>
.mt0{margin-top: 0!important;}
.appList .appItem .name{width: 80%;word-break: break-all;}
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{form.content.certName}}</view>
<view>
<view class="date" v-if="form.content.commitTime">提交日期:<text>{{ form.content.commitTime }}</text>
</view>
<view class="date">提交单位:<text>{{ form.content.memberName }}</text> </view>
</view>
<view class="vipData mt30" style="flex-wrap: wrap;">
<view class="w50">
团队会员合计:
<text>{{ form.content.allCount }}</text>
</view>
<view class="w50">
新会员合计:
<text>{{ form.content.newCount }}</text>
</view>
<view class="w50">
年限合计:
<text>{{ form.content.renewYear }}</text>
</view>
<view class="w50">
费用合计:
<text>{{ (form.content.allFee*1).toFixed(2) }}</text>
</view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view style="width: 100%">
<view class="name">{{n.memberName}}</view>
<view class="date">单位类型:
<text v-if="n.deptType==2">一级协会</text>
<text v-if="n.deptType==3">直属协会</text>
<text v-if="n.deptType==4">二级协会</text>
<text v-if="n.deptType==5">三级协会</text>
<text v-if="n.deptType==6">职业性团体会员</text>
</view>
<view class="flexbox">
<view>
单价
<text>¥{{n.unitPrice}}</text>
</view>
<view>
年限
<text>{{n.renewYear}}</text>
</view>
<view>
总价
<text>¥{{n.allFee}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核记录</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in auditList">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditStatus==1" class="text-success">审核通过</text>
<text v-if="n.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditStatus==0" class="text-primary"> 审核中</text>
<text v-if="n.auditStatus==3" class="text-warning">已撤回</text>
<text v-if="n.auditStatus==100" class="text-primary">审核中</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.handlerDeptName}}</view>
<view v-if="n.reason">
备注:{{n.reason||'/' }}
</view>
</view>
</view>
</view>
<view class="fixedBottom" v-if="(deptType == 1)&&form.ztxRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
<view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.shenRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
recordId: ''
})
const form = ref({})
const list = ref([])
const listArr = ref([])
const id = ref()
const auditList = ref([])
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
list.value = form.content?.certifiedSimpleList || []
listArr.value = form.content?.certifiedSimpleList || []
queryParams.value.recordId = form.value.recordId
console.log(form.value)
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getForm()
}
function getForm() {
uni.showLoading({
title: '加载中'
})
api.getDetailList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value[0].rangeId == 0 ? id.value = list.value[0].certId : id.value = list.value[0].rangeId
if (id.value) {
auditFN()
}
})
}
function auditFN() {
api.getGroupHistoryByRelateId(id.value).then(res => {
auditList.value = res.data
})
}
function audit(rangeId, flag) {
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeIds
}
console.log(obj)
api.mobilizeAudit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.date {
margin-top: 10rpx;
font-size: 26rpx;
color: #999;
}
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.fixedBottom {
justify-content: center;
button {
margin: 0 20rpx;
width: 286rpx;
}
.btn-red {
width: 286rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 会员缴费单 -->
<view class="appList">
<view class="vipData" v-show="totalCost>0">
<view>费用合计:<text>{{ totalCost.toFixed(2) }}</text></view>
</view>
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.record.auditStatus==0" class="text-primary">审核中</text>
<text v-if="item.record.auditStatus==1" class="text-success"> 审核通过</text>
<text v-if="item.record.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="item.record.auditStatus==3" class="text-warning">已退回</text>
</view>
<view class="date" @click="goDetail(item)" v-if="item.payTime">
<uni-icons type="calendar" size="16" color="#7D8592"></uni-icons>
<text>{{item.payTime}} 缴费</text>
</view>
<view class="name" @click="goDetail(item)">{{item.finalDocName}}</view>
<view v-if="deptType==1" class="date">
<text>{{item.payNoticeSendTime}} 下发</text>
</view>
<view class="flexbox" @click="goDetail(item)">
<view>
缴费状态
<view v-if="item.settleFlag == 0">
<text class="text-primary">已结算</text>
</view>
<view v-if="item.settleFlag == 1 && item?.payFlag == 0">
<text class="text-success">已上传凭证</text>
</view>
<view v-if="item.settleFlag == 1 && item?.payFlag == 1">
<text class="text-danger">未上传凭证</text>
</view>
</view>
<view>
年限合计
<view>{{item.yearCount}}</view>
</view>
<view>
费用合计
<view>¥{{item.allPrice}}</view>
</view>
</view>
<view class="func">
<button
v-if="(deptType == 2 || deptType == 3)&&item?.record?.auditStatus != 2 && item?.record?.auditStatus != 3"
@click="handleUpdate(item)">上传凭证</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
<!-- 上传凭证 -->
<uni-popup ref="UpPop" type="bottom" background-color="#fff" animation>
<view class="popBody">
<uni-forms v-model="form">
<uni-forms-item label="缴费日期" required>
<uni-datetime-picker v-model="form.payTime"></uni-datetime-picker>
</uni-forms-item>
<uni-forms-item label="缴费凭证" required>
<uni-file-picker limit="1" file-mediatype="all" file-extname="png,jpg,jpeg,pdf,zip"
@select="selectFile" @progress="fileProgress"
@delete="delSupplementFile(index)"></uni-file-picker>
</uni-forms-item>
<uni-forms-item label="备注">
<uni-easyinput v-model="form.remark" type="textarea"></uni-easyinput>
</uni-forms-item>
</uni-forms>
<button class="btn-red" @click="uploadSure">确定</button>
</view>
</uni-popup>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const list = ref([])
const queryParams = ref({})
const totalCost = ref(0)
const deptType = ref('')
const UpPop = ref(null)
const form = ref({
docId: '',
payTime: '',
url: '',
remark: ''
})
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function getList() {
if (queryParams.value.settle == 1) {
queryParams.value.settleFlag = undefined
queryParams.value.payFlag = undefined
}
totalCost.value = 0
api.getGroupFeeBill().then(res => {
list.value = res.rows
list.value.forEach(item => {
item.payEvidence = JSON.parse(item.payEvidence)
item.record.content = JSON.parse(item.record.content)
totalCost.value = totalCost.value + (item.allPrice * 1)
})
})
}
function handleUpdate(item) {
form.value.docId = item.docId
if (item.payEvidence) {
form.value.url = item.payEvidence
}
UpPop.value.open()
}
let selectFileValue = {}
function selectFile(e) {
let file = e.tempFiles[0]
api.uploadFile(e).then(data => {
selectFileValue = {
url: data.msg,
name: file.name,
extname: file.extname
}
form.value.url = JSON.stringify([selectFileValue])
});
}
function fileProgress(e) {
console.log('progress:' + e)
}
function delSupplementFile(index) {
selectFileValue = {}
}
function uploadSure() {
console.log(form.value)
if(!form.value.payTime){
uni.showToast({
icon:`none`,
title:'请选择缴费时间'
})
return
}
if(!form.value.url){
uni.showToast({
icon:`none`,
title:'请上传缴费凭证'
})
return
}
api.groupCommitPaymentVoucher(form.value).then(res => {
UpPop.value.close()
form.value = {}
uni.showToast({
icon: 'none',
title: '操作成功'
})
getList()
})
}
function goDetail(item) {
//详情
console.log(item.docId)
let path = `/pages/group/feeBillDetail?docId=${item.docId}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped lang="scss">
.popBody {
font-size: 28rpx;
line-height: 1.5;
overflow: auto;
padding: 30rpx;
.btn-red {
margin: 50rpx 0 30rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<view class="wBox">
<view class="tt">{{form.finalDocName}}</view>
<view class="subtt" v-if="form.payTime">提交日期:<text>{{ form.payTime }}</text></view>
<view class="subtt" v-if="form.payDeptName">提交单位:<text>{{ form.payDeptName }}</text></view>
<view class="vipData mtb30">
<view><text class="text-danger"> {{ form.deptCount}} </text> 团队</view>
<view>年限合计 <text class="text-danger"> {{ form.yearCount}} </text></view>
<view>费用合计 <text class="text-primary"> ¥{{ form.allPrice }} </text> </view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="w100">
<view class="name">{{n.certName}}</view>
<view class="date" v-if="n.validityTime">{{n.validityTime?.silce(0,10)}}</view>
<view class="flexbox">
<view>单价
<text>¥{{ (n.unitPrice*1).toFixed(2) }}</text>
</view>
<view>缴费年限
<text>{{n.renewYear}}</text>
</view>
<view>总价
<text class="text-danger">¥{{ (n.allFee*1).toFixed(2) }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
// mergeFlag: 0,
auditStatus: ''
})
const docId = ref('')
const form = ref([])
const list = ref([])
const deptType = ref()
onLoad((option) => {
if (app.globalData.isLogin) {
docId.value = option.docId
init()
} else {
app.firstLoadCallback = () => {
docId.value = option.docId
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
api.getFeeBillById(docId.value).then(res => {
list.value = res.data.certList
// arr.value = JSON.parse(JSON.stringify(list.value))
form.value = res.data
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
.subtt{
color: #666;margin: 20rpx 0 0;
font-size: 28rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;padding: 20rpx 0;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 26rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 会员认证 -->
<!-- <view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.rangeName" placeholder="缴费名称" @blur="getList" @clear="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goAddPay">+ 新建缴费</view>
</view> -->
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item?.content?.status==0" class="text-primary">待提交</text>
<text v-if="item?.content?.status==1" class="text-primary">审核中</text>
<text v-if="item?.content?.status==2" class="text-success"> 审核通过</text>
<text v-if="item?.content?.status==3" class="text-danger"> 审核拒绝</text>
<text v-if="item?.content?.status==4" class="text-warning">已撤回</text>
</view>
<view class="date">{{item?.content?.commitTime}} 提交</view>
<view class="name" @click="goDetail(item)">{{item.rangeName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
会员合计
<view>{{item.allCount}}</view>
</view>
<view>
续费年限
<view>{{item.content?.renewYear}}</view>
</view>
<view>
年限合计
<view>{{item.totalRenewYear}}</view>
</view>
</view>
<view class="func" v-if="item?.content?.status == 0">
<button
@click="commitFN(item)">提交审核</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const list = ref([])
const queryParams = ref({})
const deptType = ref('')
const UpPop = ref(null)
const form = ref({
docId:'',
payTime:'',
url:'',
remark:''
})
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function getList() {
api.getPayList(queryParams.value).then(res => {
for (const item of res.rows) {
item.content = null
if (item.certList?.length > 0) {
item.content = item.certList[0]
}
}
list.value = res.rows
})
}
function commitFN(row) {
api.commitGroupPay(row.rangeId).then(res=>{
uni.showToast({
title:`提交成功!`
})
getList()
})
}
function goDetail(item) {
//详情
const form = encodeURIComponent(JSON.stringify(item))
// 查看
let path = `/pages/group/payDetail?&form=${form}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped lang="scss">
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
.invertedbtn-red {
border-radius: 50px;
background-color: #fff;
font-size: 30rpx;
padding: 10rpx 20rpx;
}
}
.popBody {
font-size: 28rpx;
line-height: 1.5;
overflow: auto;
padding: 30rpx;
.btn-red {
margin: 50rpx 0 30rpx;
}
}
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="wBox">
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view style="width: 100%">
<view class="status">
<view v-if="n.status==0" class="text-primary">
待提交
</view>
<view v-if="n.status==1" class="text-primary">
审核中
</view>
<view v-if="n.status==2" class="text-success">
审核通过
</view>
<view v-if="n.status==3" class="text-danger">
审核拒绝
</view>
<view v-if="n.status==4" class="text-warning">
撤回
</view>
</view>
<view class="name">{{n.memberName}}</view>
<view class="date">提交日期:{{n.commitTime}}
</view>
<view class="flexbox">
<view v-if="n.validityTime">
原有效期
<text>{{n.validityTime.slice(0,10)}}</text>
</view>
<view>
续费年限
<text>{{n.renewYear}}</text>
</view>
<view>
总价
<text>¥{{n.allPrice}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核记录</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in feelList">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==1" class="text-success">审核通过</text>
<text v-if="n.auditResult==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditResult==0" class="text-primary"> 审核中</text>
<text v-if="n.auditResult==3" class="text-warning">已撤回</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.auditDeptName}}</view>
<view v-if="n.auditMsg">
备注:{{n.auditMsg||'/' }}
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
recordId: ''
})
const form = ref({})
const list = ref([])
const listArr = ref([])
const id = ref()
const auditList = ref([])
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
queryParams.value.rangeId = form.value.rangId
list.value = form.value.certList
console.log(form.value)
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getFillList()
}
function getFillList() {
api.getFillAuditLog(form.value.rangeId).then(res => {
uni.hideLoading()
feelList.value = res.data
})
}
</script>
<style scoped lang="scss">
.date {
margin-top: 10rpx;
font-size: 26rpx;
color: #999;
}
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.fixedBottom {
justify-content: center;
button {
margin: 0 20rpx;
width: 286rpx;
}
.btn-red {
width: 286rpx;
}
}
</style>
\ No newline at end of file
......@@ -2,7 +2,7 @@
<view class="page">
<view class="bgbg">
<view class="welcome">您好!
<!-- {{memberInfo.name}} -->
{{memberInfo.name}}
<br />欢迎使用中跆协会员管理系统</view>
<view class="flexbox">
<!-- userType 1:中跆协 2:省 3:市区 4:道馆-->
......@@ -25,13 +25,18 @@
</view>
<view v-if="userType!='4'" @click="goPath('/pages/group/list')">
<image />团体会员查询
</view>
</view>
<!--市区 省 中跆协 -->
<view v-if="userType!='4'" @click="goPath('/pages/group/apply/applyList')">
<image />团体会员审核
</view>
<view v-if="userType=='2'" @click="goPath('/pages/group/pay')">
<image />团体会员认证
</view>
<view v-if="userType=='2'" @click="goPath('/pages/group/feeBill')">
<image />团体会员缴费单
</view>
<view v-if="userType=='4'" @click="goPath('/pages/level/apply')">
<image />级位考试申请
......@@ -142,7 +147,7 @@
uni.showLoading({
title: '加载中'
});
// loginServer.getMyOwnMemberInfo().then(res=>{
loginServer.getMyOwnMemberInfo().then(res=>{
userType.value = app.globalData.userType
memberInfo.value = app.globalData.memberInfo
console.log(userType.value,app.globalData.authenticationStatus)
......@@ -156,7 +161,7 @@
getMes()
}
uni.hideLoading();
// })
})
}
......
......@@ -38,7 +38,9 @@
</view>
</view>
<view v-if="userType=='2'" class="block-btn-box">
<button @click="goMerge" class="btn-red-kx">前往合并 > </button>
</view>
<view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
......@@ -71,7 +73,8 @@
const current = ref()
const infoList = ref([])
const total = ref(0)
const deptType = ref('')
const deptType = ref('')
const userType = ref('')
onLoad(() => {
})
......@@ -90,7 +93,8 @@
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
getList()
}
......@@ -135,9 +139,13 @@
} else {
return
}
}
function goMerge(){
let path = `/pages/level/merge`
uni.navigateTo({
url: path
});
}
function audit(item, flag) {
console.log(item.sourceData)
var obj = {
......@@ -193,32 +201,7 @@
</script>
<style scoped>
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
.invertedbtn-red {
border-radius: 50px;
background-color: #fff;
font-size: 30rpx;
padding: 10rpx 20rpx;
}
}
<style scoped lang="scss">
.mt0 {
margin-top: 0 !important;
}
......@@ -226,5 +209,6 @@
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
}
</style>
......
<template>
<view class="hasfixedbottom">
<view class="appList">
<view class="appItem" v-for="item in infoList">
<view @click="checkThis(item)" class="iconbox">
<image class="icon" v-if="item.checked" src="@/static/member/dx_dwn.png" />
<image class="icon" v-else src="@/static/member/dx.png" />
</view>
<view class="status" @click="goDetail(item)">
<text :class="{
'text-success':item.auditStatus=='1',
'text-danger':item.auditStatus=='2',
'text-warning':item.auditStatus=='3'
}">{{ item.statusStr }}</text>
</view>
<view class="date" v-if="item.applyTime">上报日期:{{item.applyTime}}</view>
<view class="name mt0" @click="goDetail(item)">{{item.name}}</view>
<view class="pp esp">考级日期:{{item.startTime.substring(0,16)}}{{item.endTime.substring(0,16)}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
上报单位
<view>{{item.memberName}}</view>
</view>
<view>
考级考官
<view>{{item.examinerNames}}</view>
</view>
<view>
考级考生数
<view>{{item.totalNum}}</view>
</view>
</view>
</view>
</view>
<view class="fixedBottom">
<button @click="handleMerge" v-if="infoList.length>0" style="width: 40%;" class="btn-red">合并</button>
<button @click="goMergeUp" class="btn-red-kx" style="width: 40%;">合并提交 > </button>
</view>
<view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
status: '1',
mergeFlag: '0',
type: '1'
})
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const infoList = ref([])
const batchList = ref([])
const total = ref(0)
const totalCost = ref(0)
const deptType = ref('')
onLoad(() => {
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getList()
}
function getList() {
totalCost.value = 0
api.getVerityList(queryParams.value).then(res => {
const list = []
_.each(res.rows, r => {
const item = JSON.parse(r.content)
item.recordId = r.recordId
item.auditStatus = r.auditStatus
item.isView = r.isView
item.submitStatus = r.submitStatus
item.distributeTime = r.distributeTime
item.statusStr = statusArr[r.auditStatus]
item.remark = r.remark
item.cuLevels = r.cuLevels
item.sourceData = r
item.auditProcess = r.auditProcess
item.checked = false
console.log(item)
list.push(item)
totalCost.value += (item.totalAmount * 1)
})
infoList.value = list
total.value = res.total
uni.hideLoading()
})
}
function goDetail(item) {
if (item.status != '0') {
let path = `/pages/level/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
} else {
return
}
}
function goMergeUp(){
// 合并提交
let path = `/pages/level/mergeUp`
uni.navigateTo({
url: path
});
}
function checkThis(item) {
if (item.checked) {
item.checked = false
} else {
item.checked = true
}
}
var ids = []
function handleMerge() {
batchList.value = []
ids = []
for (var n of infoList.value) {
if (n.checked) {
batchList.value.push(n)
ids.push(n.recordId)
}
}
if (batchList.value.length == 0) {
uni.showToast({
title: `请选择至少一条数据`,
icon: 'none'
})
return
}
const mergeFlag = batchList.value.some(item => {
if (item.auditStatus != '1') {
return uni.showToast({
title: `${item.examCode}审核未通过,无法合并`,
icon: 'none'
})
}
})
uni.showModal({
title: '提示',
content: `确认合并已选中的数据?`,
success: function(res) {
if (res.confirm) {
api.mergeRecords({
body: ids.join(),
type: queryParams.value.type
}).then(res => {
uni.showToast({
title: `操作成功`
})
getList()
})
}
}
})
}
</script>
<style scoped lang="scss">
.mt0 {
margin-top: 0 !important;
}
.appList .appItem{padding: 30rpx 30rpx 30rpx 120rpx;}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
.icon {
width: 60rpx;
height: 60rpx;
margin-right: 16rpx;
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 级位合并提交 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="appList">
<view class="appItem" v-for="item in infoList">
<view class="status" @click="goDetail(item)">
<view :class="{
'text-success':item.status=='1',
'text-danger':item.status=='2',
'text-warning':item.status=='3'
}">
{{ item.auditStatus=='100'?'待提交':statusArr[item.status] }}
</view>
</view>
<view class="date" v-if="item.handleDate">{{item.handleDate}}</view>
<view class="name" @click="goDetail(item)">{{item.mergeName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
考试人数
<view>{{item.totalNum}}</view>
</view>
<view>
合并日期
<view>{{item.mergeTime.slice(0,16)}}</view>
</view>
<view>
总金额
<view>¥{{item.totalAmount}}</view>
</view>
</view>
<view class="func" v-if="item.auditStatus == 100">
<button @click="handleAudit(item)">提交</button>
<!-- <button v-if="item.lastIds?.slice(0, 1) != '-'" @click="resolution(item)">取消合并</button> -->
</view>
</view>
</view>
<view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
flowCode: undefined,
mergeName: undefined,
status: '100',
examCode: undefined,
type: '1'
})
const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const current = ref()
const list = ref([])
const infoList = ref([])
const totalCost = ref(0)
const deptType = ref('')
const userType = ref('')
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
getList()
}
function onClickItem(e) {
console.log(e)
switch (e.currentIndex) {
case 0:
queryParams.value.status = 100
break;
case 1:
queryParams.value.status = 0
break;
case 2:
queryParams.value.status = 1
break;
case 3:
queryParams.value.status = 2
break;
}
getList()
}
function getList() {
uni.showLoading({
title: '加载中'
})
api.getVerityMergeList(queryParams.value).then(response => {
uni.hideLoading()
const list = []
_.each(response.rows, r => {
const item = JSON.parse(r.remark)
item.recordId = r.recordId
item.auditStatus = r.auditStatus
item.status = r.status
item.isView = r.isView
item.payStatus = r.payStatus
item.sourceData = r
item.auditProcess = r.auditProcess
item.handleDate = r.handleDate
list.push(item)
totalCost.value += (item.totalAmount * 1)
})
infoList.value = list
})
}
function handleAudit(item) {
uni.showModal({
title: '提示',
content: `确定提交${item.content.certName}吗`,
success: function(res) {
if (res.confirm) {
api.groupAudit({
flag: '1',
recordIds: [item.recordId],
reason: null
}).then(res => {
getList()
uni.showToast({
title: `操作成功!`
})
})
}
}
})
}
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
// 查看
let path = `/pages/level/mergeUpDetail?&form=${form}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped>
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{form.content.certName}}</view>
<view>
<view class="date" v-if="form.content.commitTime">提交日期:<text>{{ form.content.commitTime }}</text>
</view>
<view class="date">提交单位:<text>{{ form.content.memberName }}</text> </view>
</view>
<view class="vipData mt30" style="flex-wrap: wrap;">
<view class="w50">
团队会员合计:
<text>{{ form.content.allCount }}</text>
</view>
<view class="w50">
新会员合计:
<text>{{ form.content.newCount }}</text>
</view>
<view class="w50">
年限合计:
<text>{{ form.content.renewYear }}</text>
</view>
<view class="w50">
费用合计:
<text>{{ (form.content.allFee*1).toFixed(2) }}</text>
</view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view style="width: 100%">
<view class="name">{{n.memberName}}</view>
<view class="date">单位类型:
<text v-if="n.deptType==2">一级协会</text>
<text v-if="n.deptType==3">直属协会</text>
<text v-if="n.deptType==4">二级协会</text>
<text v-if="n.deptType==5">三级协会</text>
<text v-if="n.deptType==6">职业性团体会员</text>
</view>
<view class="flexbox">
<view>
单价
<text>¥{{n.unitPrice}}</text>
</view>
<view>
年限
<text>{{n.renewYear}}</text>
</view>
<view>
总价
<text>¥{{n.allFee}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核记录</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in auditList">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditStatus==1" class="text-success">审核通过</text>
<text v-if="n.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditStatus==0" class="text-primary"> 审核中</text>
<text v-if="n.auditStatus==3" class="text-warning">已撤回</text>
<text v-if="n.auditStatus==100" class="text-primary">审核中</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.handlerDeptName}}</view>
<view v-if="n.reason">
备注:{{n.reason||'/' }}
</view>
</view>
</view>
</view>
<view class="fixedBottom" v-if="(deptType == 1)&&form.ztxRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
<view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.shenRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
recordId: ''
})
const form = ref({})
const list = ref([])
const listArr = ref([])
const id = ref()
const auditList = ref([])
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
list.value = form.content?.certifiedSimpleList || []
listArr.value = form.content?.certifiedSimpleList || []
queryParams.value.recordId = form.value.recordId
console.log(form.value)
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getForm()
}
function getForm() {
uni.showLoading({
title: '加载中'
})
api.getDetailList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value[0].rangeId == 0 ? id.value = list.value[0].certId : id.value = list.value[0].rangeId
if (id.value) {
auditFN()
}
})
}
function auditFN() {
api.getGroupHistoryByRelateId(id.value).then(res => {
auditList.value = res.data
})
}
function audit(rangeId, flag) {
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeIds
}
console.log(obj)
api.mobilizeAudit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.date {
margin-top: 10rpx;
font-size: 26rpx;
color: #999;
}
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.fixedBottom {
justify-content: center;
button {
margin: 0 20rpx;
width: 286rpx;
}
.btn-red {
width: 286rpx;
}
}
</style>
\ No newline at end of file
......@@ -6,7 +6,7 @@
<view class="searchbar" v-if="deptType == 6">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索调动名称" @blur="getList">
v-model="queryParams.name" placeholder="搜索调动名称" @blur="getList" @clear="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goAddMobilize">+ 新建调动</view>
</view>
......
<template>
<view>
<!-- 会员缴费 -->
<!-- <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control> -->
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.paymentName" placeholder="搜索缴费名称" @blur="getList" @clear="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goAdd">+ 新建缴费</view>
</view>
<!-- 会员缴费 -->
<view class="appList">
<view class="appItem" v-for="item in list" @click="goDteail(item)">
<view class="status">
<text v-if="item.status==1" class="text-primary">审核中</text>
<text v-if="item.status==2" class="text-success"> 审核通过</text>
<text v-if="item.status==3" class="text-danger"> 审核拒绝</text>
<text v-if="item.status==4" class="text-warning">已退回</text>
</view>
<view class="date">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.status==1" class="text-primary">审核中</text>
<text v-if="item.status==2" class="text-success"> 审核通过</text>
<text v-if="item.status==3" class="text-danger"> 审核拒绝</text>
<text v-if="item.status==4" class="text-warning">已退回</text>
</view>
<view class="date" @click="goDetail(item)" v-if="item.commitTime">
<uni-icons type="calendar" size="16" color="#7D8592"></uni-icons>
{{item.commitTime}} 提交
</view>
<view class="name">{{item.paymentName}}</view>
<view class="flexbox">
<view class="name" @click="goDetail(item)">{{item.paymentName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
人数合计
<view>{{item.personCount}}</view>
......@@ -29,8 +37,9 @@
<view>{{item.totalYear}}</view>
</view>
</view>
<view class="func" v-if="item.status==0">
<button>提交审核</button>
<view class="func" v-if="item.status==0||item.status==3||item.status==4">
<button @click="handleUpdate(item)">编辑</button>
<button @click="commitFN(item)">提交审核</button>
</view>
</view>
</view>
......@@ -42,20 +51,29 @@
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp()
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const list = ref([])
const total = ref(0)
onMounted(() => {
getList()
const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝'])
onShow(() => {
if (app.globalData.isLogin) {
getList()
} else {
app.firstLoadCallback = () => {
getList()
};
}
})
function getList() {
......@@ -65,14 +83,76 @@
})
}
function goDteail(item) {
let path = `/pages/personalVip/paymentDetail?wfCode=${item.wfCode}`
uni.navigateTo({
url: path
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
let path = `/pages/personalVip/paymentDetail?form=${form}`
uni.navigateTo({
url: path
});
}
function handleUpdate(item) {
let path = `/pages/personalVip/renew?rangeId=${item.rangId}`
uni.navigateTo({
url: path
});
}
function commitFN(row) {
uni.showModal({
title: '提示',
content: `确定提交${row.paymentName}吗`,
success: function(res) {
if (res.confirm) {
uni.showLoading({
icon: 'none',
title: '提交中'
})
api.personalCommit(row.rangId).then(res => {
uni.hideLoading()
uni.showToast({
title: '提交成功'
})
})
getList()
}
}
})
}
function goAdd() {
let path = `/pages/personalVip/renew`
uni.navigateTo({
url: path
});
}
</script>
<style>
<style lang="scss" scoped>
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
.invertedbtn-red {
border-radius: 50px;
background-color: #fff;
font-size: 30rpx;
padding: 10rpx 20rpx;
}
}
</style>
\ No newline at end of file
......
......@@ -14,7 +14,7 @@
</view>
<view>
<view class="name">{{n.personName}}<text>({{n.memberInfoName}})</text></view>
<view class="date">原有效期至{{n.originValidityDate||'--'}}</view>
<view class="date">原有效期至 {{n.originValidityDate?.slice(0,10)||'--'}}</view>
</view>
<view class="nian">
{{n.payYear}}
......@@ -24,8 +24,8 @@
</view>
<view class="h3-padding">审核流程</view>
<view class="wBox">
<view class="h3-padding" v-if="feelList.length>0">审核流程</view>
<view class="wBox" v-if="feelList.length>0">
<view class="stepItem" v-for="(n,index) in feelList">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
......@@ -66,23 +66,13 @@
const feelList = ref([])
const total = ref(0)
onLoad((option) => {
wfCode.value = option.wfCode
getForm()
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
getFillList(form.value.rangId)
getPersons()
})
function getForm() {
api.getPaymentList(queryParams.value).then(res => {
if(res.rows)
for (var n of res.rows) {
if (n.wfCode == wfCode.value) {
form.value = n
}
}
getFillList(form.value.rangId)
getPersons()
})
}
function getPersons() {
queryParams.value.rangeId = form.value.rangId
api.addSelectPageList(queryParams.value).then(res => {
......
<template>
<view>
<view class="hasfixedbottom">
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.name" placeholder="搜索姓名或证件号码" @iconClick="iconClick">
v-model="queryParams.personName" placeholder="搜索姓名或证件号码" @blur="getList" @clear="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goVipList">+ 添加会员</view>
</view>
<view class="vipData mtb30">
<view> 人数合计:<text>{{ formData.personCount? formData.personCount:0 }}</text></view>
<view> 新会员合计:<text>{{ formData.newPersonCount? formData.newPersonCount:0 }}</text></view>
<view> 续费会员合计:<text>{{ formData.oldPersonCount? formData.oldPersonCount:0 }}</text></view>
</view>
<uni-swipe-action>
<uni-swipe-action-item class="personitem" v-for="n in choseList">
<uni-swipe-action-item class="personitem" v-for="n in list">
<view class="content-box">
<view class="flexbox">
<view class="colorful">{{n.name.slice(0,1)}}</view>
{{n.name}}
<view class="colorful">{{n.personName?.slice(0,1)}}</view>
<view>{{n.personName}}
<view class="date">
证件号:{{n.personIdcCode}}
</view>
</view>
</view>
<view class="flexbox">
<uni-number-box :min="1" v-model="n.year" :max="5"></uni-number-box>
<view class="flexbox" @click="changeYear(n)">
<view class="text-danger">({{yearlist[n.payYear-1].text}})</view>
<uni-icons type="forward" size="18" color="#999"></uni-icons>
</view>
</view>
<template v-slot:right>
<view class="slot-button">
<view>
<view @click="handleDelete(n)">
<uni-icons type="trash-filled" color="#fff" size="20"></uni-icons>
<text class="slot-button-text">删除</text>
</view>
......@@ -30,10 +41,23 @@
</uni-swipe-action-item>
</uni-swipe-action>
<view class="nodata" v-if="choseList.length==0">
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<button class="btn-red" @click="goVipList">+ 添加会员</button>
<button class="btn-red" @click="goVipList">+ 在线选择</button>
</view>
<view class="fixedBottom">
<button class="btn-red" :disabled="list?.length <= 0" @click="commitFN">保存并提交</button>
</view>
<uni-popup ref="pickView" type="bottom">
<view class="pickViewBox">
<view v-for="n in yearlist" @click="bindyear(n)">
{{n.text}}<uni-icons v-show="n.value == (nowYear)" type="checkmarkempty" size="20"
color="green"></uni-icons>
</view>
</view>
</uni-popup>
</view>
</template>
......@@ -41,35 +65,133 @@
import {
ref
} from 'vue'
const query = ref({})
const choseList = ref([{
name: '张三',
year: '1'
}, {
name: '李三',
year: '1'
}])
import {
onShow,
onLoad
} from '@dcloudio/uni-app'
import * as api from '@/common/api.js'
import config from '@/config.js'
const app = getApp()
const queryParams = ref({
rangeId: -1
})
const formData = ref({})
const list = ref({})
const total = ref(0)
const nowYear = ref(1)
const nowItem = ref({})
const pickView = ref(null)
const visible = ref(true)
const yearlist = ref([{
text: '一年',
value: '1'
value: 1
}, {
text: '二年',
value: 2
}, {
text: '三年',
value: 3
}, {
text: '2年',
value: '2'
text: '四年',
value: 4
}, {
text: '五年',
value: 5
}])
onLoad((option) => {
if (option.rangeId) {
queryParams.value.rangeId = option.rangeId
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
getList()
}
function getList() {
api.addSelectPageList(queryParams.value).then(res => {
list.value = res.pageData.rows
total.value = res.pageData.total
formData.value = res
})
}
function goVipList() {
let path = '/pages/personalVip/vipList';
uni.navigateTo({
let path = `/pages/personalVip/vipList?rangeId=${queryParams.value.rangeId}`
uni.redirectTo({
url: path
});
}
function changeYear() {
function changeYear(e) {
nowItem.value = e
nowYear.value = e.payYear
pickView.value.open()
}
function bindyear(n) {
nowYear.value = n.value
pickView.value.close()
nowItem.value.payYear = n.value
api.editYear(nowItem.value.payId, nowItem.value.payYear).then(res => {
for (var nn of list.value) {
if (nn.perId == nowItem.value.perId) {
nn.payYear = nowItem.value.payYear
}
}
})
}
function handleDelete(row) {
uni.showModal({
title: '提示',
content: `确定删除${row.personName}吗`,
success: function(res) {
if (res.confirm) {
api.delPayment([row.payId]).then(res => {
uni.showToast({
title: '删除成功'
})
if (list.value.length == 1) {
queryParams.value.rangeId = -1
}
getList()
})
}
}
})
}
function commitFN(){
if (queryParams.value.rangeId == -1) return
api.commitRenew(queryParams.value.rangeId).then(res=>{
uni.showToast({
title: '提交成功'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.pickViewBox {
background-color: #fff;
text-align: center;
view {
line-height: 3;
}
}
.searchbar {
display: flex;
align-items: center;
......
<template>
<view>
<view class="hasfixedbottom">
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.name" placeholder="搜索姓名或证件号码" @blur="getList()" @clear="getList()">
v-model="queryParams.name" placeholder="搜索姓名或证件号码" @blur="getList()" @clear="getList()">
</uni-easyinput>
</view>
<view class="indexboxre">
......@@ -20,20 +20,20 @@
</view>
<view @click="handleInfo(n)">
<view class="name">{{n.name}}</view>
<view class="date" v-if="n.validityDate">到期时间:{{n.validityDate}}</view>
<view class="date" v-else>注册时间:{{n.createTime}}</view>
<view class="date" v-if="n.validityDate">到期时间:{{n.validityDate?.slice(0,10)}}</view>
<view class="date" v-else>注册时间:{{n.createTime?.slice(0,10)}}</view>
</view>
<view class="status">
<text v-if="n.certStage==0" class="text-green">
<text v-if="n.certStage==0" class="text-warning">
新会员
</text>
<text v-if="n.certStage==1" class="text-warning">
待提交
</text>
<text v-if="n.certStage==2" class="text-red">
<text v-if="n.certStage==2" class="text-danger">
缴费中
</text>
<text v-if="n.certStage==3">
<text v-if="n.certStage==3" class="text-success">
正常
</text>
<text v-if="n.certStage==4" class="text-gray">
......@@ -47,14 +47,15 @@
<view class="fixedBottom">
<button class="btn-red" @click="goAddRenew">添 加</button>
<button class="btn-red" @click="handleImport">导 入</button>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
ref,
getCurrentInstance
......@@ -66,35 +67,22 @@
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
pageNum: 1,
pageSize: 20,
showMyPersonFlag: null,
multiDeptFlag: 1,
perType: 1,
checkPaymentCommit: 1
const queryParams = ref({
showMyPersonFlag: 1,
checkPaymentCommit: 1,
queryParams: 1
})
const list = ref([])
const total = ref(0)
const userType = ref('')
onLoad(() => {
userType.value = app.globalData.userType
onLoad((option) => {
userType.value = app.globalData.userType
queryParams.value.paymentRangeId = option.rangeId
getList()
})
function getList() {
if (userType.value == '4') {
// 道馆
query.value.multiDeptFlag = null
query.value.showMyPersonFlag = 1
}
api.selectPageList(query.value).then(res => {
for (var p of res.rows) {
if (p.photo) {
p.photo = config.fileUrl_api + p.photo
console.log(p.photo)
}
}
api.selectPageList(queryParams.value).then(res => {
list.value = res.rows
total.value = res.total
})
......@@ -115,16 +103,27 @@
}else{
n.checked = true
}
}
function checkboxChange(e) {
let values = e.detail.value;
for (var n of list.value) {
if (values.includes(n)) {
proxy.$set(n, 'checked', true)
} else {
proxy.$set(n, 'checked', false)
}
}
}
function handleImport(){
var arr=[]
for(var n of list.value){
if(n.checked){
arr.push(n.perId)
}
}
if(arr.length==0){
uni.showToast({
title:"请选择会员",
icon:"none"
})
return
}
api.addPersonPaymentGroup({ rangeId: queryParams.value.paymentRangeId, personIdArray: arr.join(',') }).then(res=>{
let path = `/pages/personalVip/renew?rangeId=${res.data.rangeId}`
uni.redirectTo({
url: path
});
})
}
</script>
......@@ -141,7 +140,7 @@
}
position: relative;
height: calc(100vh - 300rpx);
height: calc(100vh - 280rpx);overflow: auto;
}
.searchbar {
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!