2f7e2ea6 by 杨炀

no message

1 parent 937f2316
import request from './request.js'
import config from '@/config.js'
import * as loginServer from '@/common/login.js';
import _ from 'lodash'
// 激活
export function active(data) {
......@@ -10,13 +9,13 @@ export function active(data) {
method: 'post',
params: data
})
}
export function getBlack() {
return request({
url: '/member/info/check',
method: 'get'
})
}
}
export function getBlack() {
return request({
url: '/member/info/check',
method: 'get'
})
}
export function commitPaymentVoucherYJ(data) {
return request({
url: '/person/paymentDocYj/commitPaymentVoucher',
......@@ -130,13 +129,13 @@ export function deptTreeSelect(params) {
})
}
const setIdToString = (list) => {
_.each(list, (l) => {
for (var l of list) {
l.id += ''
l.parentId += ''
if (l.children && l.children.length > 0) {
setIdToString(l.children)
}
})
}
}
// 会员认证
......@@ -263,7 +262,7 @@ export function uploadImgCorp(tempFilePath) {
uni.hideLoading();
});
}
//only for addVip photoUp
//only for addVip photoUp
export function uploadImgCorpPhoto(tempFilePath) {
const imgUrl = tempFilePath
uni.showLoading({
......@@ -806,7 +805,13 @@ export function submitCert(data) {
params: data
})
}
export function submitCert2(data) {
return request({
url: `/exam/payment/submitCerts/updateCerts`,
method: 'put',
params: data
})
}
export function getCertsLList(query) {
return request({
url: '/exam/payment/certsList',
......@@ -1197,32 +1202,50 @@ export function getMyCertStage() {
url: `/member/certified/getMyCertStage`,
method: 'get'
})
}
// 月结列表
export function mentDocList(data) {
return request({
url: '/person/paymentDocYj/list',
method: 'get',
params: data
})
}
export function wdBack(yjIds) {
return request({
url: `/person/paymentDocYj/wd/${yjIds}`,
method: 'get'
})
}
// 个人会员月结缴费单
export function downJiaoYJFei(arr) {
return request({
url: `/person/paymentDocYj/downJiaoFei/${arr}`,
method: 'post'
})
}
export function queryProcess(id) {
return request({
url: `/system/fileInfo/queryProcess/${id}`,
method: 'get'
})
}
// 月结列表
export function mentDocList(data) {
return request({
url: '/person/paymentDocYj/list',
method: 'get',
params: data
})
}
export function wdBack(yjIds) {
return request({
url: `/person/paymentDocYj/wd/${yjIds}`,
method: 'get'
})
}
// 个人会员月结缴费单
export function downJiaoYJFei(arr) {
return request({
url: `/person/paymentDocYj/downJiaoFei/${arr}`,
method: 'post'
})
}
export function queryProcess(id) {
return request({
url: `/system/fileInfo/queryProcess/${id}`,
method: 'get'
})
}
export function checkPersonByPayIds(payIds) {
return request({
url: `/exam/person/checkPersonByPayIds/${payIds}`,
method: 'get'
})
}
export function checkPersonByExamIds(examIds) {
return request({
url: `/exam/person/checkPersonByExamIds/${examIds}`,
method: 'get'
})
}
export function checkPersonByPersonId(perId) {
return request({
url: `/exam/person/checkPersonByPersonId/${perId}`,
method: 'get'
})
}
\ No newline at end of file
......
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
const excludeUrls = ['getMemberCountInfo', 'getInfo']
......
import CryptoJS from 'crypto-js'
export function szToHz(num) {
const hzArr = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
return hzArr[parseInt(num)]
}
export function AESEncrypt(data) {
const key = CryptoJS.enc.Utf8.parse('abcdefgabcdegf21')
// 将数据转换为字符串
const parseByte2HexStr = (wordArray) => {
const hexStr = wordArray.ciphertext.toString(CryptoJS.enc.Hex)
return hexStr
}
let dataStr
if (typeof data === 'object') {
dataStr = JSON.stringify(data)
} else {
dataStr = String(data)
}
// 加密
const encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(dataStr), key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return parseByte2HexStr(encrypted)
}
export function AESDecrypt(str) {
const key = CryptoJS.enc.Utf8.parse('abcdefgabcdegf21')
const decrypt = CryptoJS.AES.decrypt(str, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
const aesStr = CryptoJS.enc.Utf8.stringify(decrypt).toString()
try {
return JSON.parse(aesStr)
} catch (e) {
return aesStr
}
}
\ No newline at end of file
......
......@@ -6,10 +6,9 @@
// const baseUrl_api = "http://22yidpjzjifv.ngrok.xiaomiqiu123.top/stage-api/";
// const baseUrl_api = "http://36.153.235.222:7899/stage-api";
// const baseUrl_api = 'http://192.168.1.132:8787'
// const baseUrl_api = 'https://ztx.itechtop.cn/stage-api'
// const baseUrl_api = 'https://tkcn.19wk.cn:8443/stage-api'
const baseUrl_api = 'https://tkcn.19wk.cn:8443/stage-api'
const baseUrl_api = 'https://system.taekwondo.org.cn/stage-api'
// const baseUrl_api = 'https://system.taekwondo.org.cn/stage-api'
export default {
baseUrl_api
}
......
......@@ -56,7 +56,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
......@@ -175,7 +175,7 @@
} from '@dcloudio/uni-app';
import config from '@/config.js'
import dayjs from 'dayjs'
import _ from 'lodash'
import _ from 'underscore'
const app = getApp();
const memberInfo = app.globalData.memberInfo
const form = ref({
......
......@@ -106,7 +106,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
......@@ -60,7 +60,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.idcCode" placeholder="证件号码" @blur="getList">
</uni-easyinput>
</view>
<view class="indexboxre">
<view class="userlist">
<view class="item" v-for="(n,index) in list" :key="index">
<!-- <view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.name.slice(1,2)}}</view>
</view> -->
<view>
<view class="name">{{n.name}}</view>
<view class="date">会员号:{{n.perCode||'-'}}</view>
</view>
<view class="status">
<text v-if="n.disabled">选择</text>
<text v-else class="text-primary" @click="handleChoose(n)">选择</text>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>请输入证件号查找</text>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import _ from 'lodash'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
})
const list = ref([])
const total = ref(0)
const userType = ref('')
let chosen = []
let ec = null
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.idcCode" placeholder="证件号码" @blur="getList">
</uni-easyinput>
</view>
<view class="indexboxre">
<view class="userlist">
<view class="item" v-for="(n,index) in list" :key="index">
<!-- <view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.name.slice(1,2)}}</view>
</view> -->
<view>
<view class="name">{{n.name}}</view>
<view class="date">会员号:{{n.perCode||'-'}}</view>
</view>
<view class="status">
<text v-if="n.disabled">选择</text>
<text v-else class="text-primary" @click="handleChoose(n)">选择</text>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>请输入证件号查找</text>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import _ from 'underscore'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
})
const list = ref([])
const total = ref(0)
const userType = ref('')
let chosen = []
let ec = null
onLoad((option) => {
query.value.type = option.type
chosen = JSON.parse(decodeURIComponent(option.chosen)) || []
query.value.type = option.type
chosen = JSON.parse(decodeURIComponent(option.chosen)) || []
ec = option.ec
console.log(chosen)
})
function getList() {
if (!query.value.idcCode) {
return
}
uni.showLoading({
title: `查找中`
})
api.getCoachList(query.value).then(res => {
if (res.data.length == 0) {
uni.showToast({
title: '未查询到考官信息',
icon: "error"
console.log(chosen)
})
function getList() {
if (!query.value.idcCode) {
return
}
uni.showLoading({
title: `查找中`
})
api.getCoachList(query.value).then(res => {
if (res.data.length == 0) {
uni.showToast({
title: '未查询到考官信息',
icon: "error"
})
list.value = []
return
}
list.value = []
return
}
list.value = res.data
for(var l of list.value){
if(l.photo&&l.photo.indexOf('http')==-1){
......@@ -88,67 +88,67 @@
}
}
}
uni.hideLoading()
})
}
function checkChosen(n) {
return _.some(chosen, (c) => {
return c.perId == n.perId
})
}
function handleChoose(row) {
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
var obj = {
perId: row.perId,
name: row.name,
uni.hideLoading()
})
}
function checkChosen(n) {
return _.some(chosen, (c) => {
return c.perId == n.perId
})
}
function handleChoose(row) {
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
var obj = {
perId: row.perId,
name: row.name,
}
// prevPage.onShow(obj)
uni.$emit('chosen',{
obj:obj,
ec
})
uni.navigateBack({delta:1})
}
function handleInfo(n) {
uni.navigateTo({
url: `/personalVip/detail?perId=${n.perId}`
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 300rpx);
}
.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;
}
}
uni.navigateBack({delta:1})
}
function handleInfo(n) {
uni.navigateTo({
url: `/personalVip/detail?perId=${n.perId}`
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 300rpx);
}
.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;
}
}
</style>
\ No newline at end of file
......
<template>
<template>
<view>
<z-paging ref="paging" v-model="list" @query="getQuery" emptyViewImg="/static/nodata.png">
<view class="vipData" :slot="top" style="flex-wrap: wrap;">
<view class="w25"><text>{{ tablePersonInfo.total }}</text></view>
<view class="w25" v-for="l in tablePersonInfo.levelArr" :key="l.level">
......@@ -39,33 +39,33 @@
</view>
</view>
</view>
</view>
</z-paging>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
</view>
</z-paging>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {szToHz} from '@/common/utils.js'
import {
onMounted,
ref
import {szToHz} from '@/common/utils.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import _ from 'lodash'
const queryParams = ref({
pageNum: 1,
pageSize: 10
import _ from 'underscore'
const queryParams = ref({
pageNum: 1,
pageSize: 10
})
const studentquery = ref({})
const paging = ref(null)
const paging = ref(null)
const userType = ref('')
const list = ref([])
const tablePersonInfo = ref({})
const tablePersonInfo = ref({})
const total = ref(0)
const app = getApp();
onLoad((option)=>{
......@@ -80,11 +80,11 @@
userType.value = app.globalData.userType
};
}
})
onMounted(() => {
// getList()
})
})
onMounted(() => {
// getList()
})
function getList() {
api.getStudentList(queryParams.value).then(res => {
paging.value.complete(res.rows);
......@@ -100,7 +100,7 @@
type:'1'
})
}
})
})
}
function getVipData(obj){
const levelArr = []
......@@ -140,8 +140,8 @@
})
})
}
</script>
</script>
<style scoped lang="scss">
.userlist{ box-sizing: border-box;padding:20rpx 20rpx 0;
.item{border-bottom: 1px dashed #e5e5e5;position: relative;
......@@ -155,33 +155,33 @@
font-size: 30rpx;
color: #AD181F;}
}
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
</style>
\ No newline at end of file
......
......@@ -57,7 +57,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
......@@ -60,7 +60,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
......@@ -64,7 +64,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
......@@ -2,42 +2,44 @@
<view>
<!-- 级位证书发布 -->
<z-paging ref="paging" v-model="infoList" @query="getQuery" emptyViewImg="/static/nodata.png">
<view class="appList">
<view class="appItem" v-for="(item,index) in infoList" :key="index">
<view class="status" @click="goDetail(item)">
<text :class="{
<view class="appList">
<view class="appItem" v-for="(item,index) in infoList" :key="index">
<view class="status" @click="goDetail(item)">
<text :class="{
'text-warning':item.certStatus=='0',
'text-primary':item.certStatus=='1',
'text-success':item.certStatus=='2'
}">{{ item.certStatusStr }}</text>
</view>
</view>
<view class="date">
<uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons>
{{item.submitTimeStr}} 提交</view>
<view class="text-primary" v-if="item.payCode" @click="goDetail(item)">{{item.payCode}}</view>
<view class="name mt0 w100" @click="goDetail(item)"><text class="dot"></text>{{item.name}}</view>
<view class="pp esp" v-if="item.certTimeStr">证书发送时间:{{item.certTimeStr}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
申请单位
<view>{{item.memberName||'--'}}</view>
<view class="date">
<uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons>
{{item.submitTimeStr}} 提交
</view>
<view>
已发/待发
<view>{{item.hasCerts}}/<text class="text-primary">{{item.noCerts}}</text></view>
<view class="text-primary" v-if="item.payCode" @click="goDetail(item)">{{item.payCode}}</view>
<view class="name mt0 w100" @click="goDetail(item)"><text class="dot"></text>{{item.name}}</view>
<view class="pp esp" v-if="item.certTimeStr">证书发送时间:{{item.certTimeStr}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
申请单位
<view>{{item.memberName||'--'}}</view>
</view>
<view>
已发/待发
<view>{{item.hasCerts}}/<text class="text-primary">{{item.noCerts}}</text></view>
</view>
</view>
<!-- v-if="item.certStatus != '2'" -->
<view class="func">
<button @click="send(item)">更新证书</button>
</view>
</view>
<view class="func" v-if="item.certStatus != '2'">
<button @click="send(item)">一键生成</button>
</view>
</view>
</view>
</z-paging>
<!-- <view class="nodata" v-if="infoList.length==0">
<!-- <view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view> -->
......@@ -47,7 +49,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......@@ -72,14 +74,14 @@
const paging = ref(null)
onLoad((option) => {
queryParams.value.type = option.type
if(option.type==2){
if (option.type == 2) {
uni.setNavigationBarTitle({
title:'段位考试详情'
title: '段位考试详情'
})
}
if(option.type==3){
if (option.type == 3) {
uni.setNavigationBarTitle({
title:'越段考试详情'
title: '越段考试详情'
})
}
})
......@@ -100,14 +102,15 @@
getList()
}
function getQuery(pageNum,pageSize){
function getQuery(pageNum, pageSize) {
queryParams.value.pageNum = pageNum,
queryParams.value.pageSize = pageSize
queryParams.value.pageSize = pageSize
api.getCertsLList(queryParams.value).then(res => {
paging.value.complete(res.rows);
total.value = res.total
})
}
function getList() {
uni.showLoading({
title: '加载中'
......@@ -126,24 +129,45 @@
});
}
function send(row) {
uni.showModal({
title: '提示',
content: `确定生成 ${row.name} 的证书吗`,
success: function(res) {
if (res.confirm) {
api.submitCert([{
id: row.payId
}]).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
}
function checkCert(payIds, sureFunc, confirmFunc) {
return api.checkPersonByPayIds(payIds).then(res => {
if (res.data == 1) {
confirmFunc().then((kk)=>{
if(kk.confirm){
sureFunc()
}
})
} else if (res.data == 2 || res.data == 3) {
uni.showModal({
title: '提示',
content:`存在学员没有照片,是否继续生成?`,
success: (rr) => {
if(rr.confirm){
sureFunc()
}
}
})
}
})
}
function send(row) {
checkCert(row.payId, () => {
api.submitCert2([{
id: row.payId
}]).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
},()=>{
return uni.showModal({
title: '提示',
content:`确定下发 ${row.name} 的证书吗`
})
})
}
</script>
......
<template>
<view>
<!-- 级位证书发布 -->
<view class="appList">
<view class="appItem" v-for="item in infoList" :key="item.examId">
<view class="status" @click="goDetail(item)">
<text :class="{
'text-warning':item.isCert=='0',
'text-primary':item.isCert=='1',
'text-success':item.isCert=='2'
}">{{ statusArr[item.isCert]}}</text>
</view>
<view class="date">申请日期: {{item.applyTime?.slice(0,10)}}</view>
<view class="name mt0" @click="goDetail(item)">{{item.name}}</view>
<view class="pp esp">考级考官:{{item.examinerNames}}</view>
<view class="flexbox" @click="goDetail(item)">
<!-- <view>
申请单位
<view>{{item.memberName}}</view>
</view> -->
<view>
已发/待发证书
<view>{{item.hasCerts}}/<text class="text-danger">{{item.noCerts}}</text></view>
</view>
<view class="w50">
考生数/通过数
<view>{{item.totalNum}}/<text class="text-danger">{{item.pass}}</text></view>
</view>
</view>
<view class="func" v-if="item.isCert != '2'">
<button @click="send(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,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const statusArr = ['未发放', '部分发放', '已发放']
const current = ref()
const infoList = ref([])
const total = ref(0)
const deptType = ref('')
const userType = ref('')
onLoad((option) => {
queryParams.value.payId = option.payId
queryParams.value.type = option.type
if (option.type == 2) {
uni.setNavigationBarTitle({
title: '段位考试详情'
})
}
if (option.type == 3) {
uni.setNavigationBarTitle({
title: '越段考试详情'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
getList()
}
function getList() {
uni.showLoading({
title: '加载中'
})
api.getExamListByPayId(queryParams.value).then(res => {
infoList.value = res.rows
uni.hideLoading()
})
}
function goDetail(item) {
// const form = encodeURIComponent(JSON.stringify(item))
let path =
`/level/ztx/studentList?type=${queryParams.value.type}&examId=${item.examId}&payId=${queryParams.value.payId}`
uni.navigateTo({
url: path
});
}
function send(row) {
uni.showModal({
title: '提示',
content: `确定一键下发 ${row.name} 的证书`,
success: function(res) {
if (res.confirm) {
api.submitCert([{
id: queryParams.value.payId,
children: [{
id: row.examId
}]
}]).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
}
}
})
}
</script>
<style scoped lang="scss">
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
<template>
<view>
<!-- 级位证书发布 -->
<view class="appList">
<view class="appItem" v-for="item in infoList" :key="item.examId">
<view class="status" @click="goDetail(item)">
<text :class="{
'text-warning':item.isCert=='0',
'text-primary':item.isCert=='1',
'text-success':item.isCert=='2'
}">{{ statusArr[item.isCert]}}</text>
</view>
<view class="date">申请日期: {{item.applyTime?.slice(0,10)}}</view>
<view class="name mt0" @click="goDetail(item)">{{item.name}}</view>
<view class="pp esp">考级考官:{{item.examinerNames}}</view>
<view class="flexbox" @click="goDetail(item)">
<!-- <view>
申请单位
<view>{{item.memberName}}</view>
</view> -->
<view>
已发/待发证书
<view>{{item.hasCerts}}/<text class="text-danger">{{item.noCerts}}</text></view>
</view>
<view class="w50">
考生数/通过数
<view>{{item.totalNum}}/<text class="text-danger">{{item.pass}}</text></view>
</view>
</view>
<!-- v-if="item.isCert != '2'" -->
<view class="func">
<button @click="send(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 'underscore'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const statusArr = ['未发放', '部分发放', '已发放']
const current = ref()
const infoList = ref([])
const total = ref(0)
const deptType = ref('')
const userType = ref('')
onLoad((option) => {
queryParams.value.payId = option.payId
queryParams.value.type = option.type
if (option.type == 2) {
uni.setNavigationBarTitle({
title: '段位考试详情'
})
}
if (option.type == 3) {
uni.setNavigationBarTitle({
title: '越段考试详情'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
userType.value = app.globalData.userType
getList()
}
function getList() {
uni.showLoading({
title: '加载中'
})
api.getExamListByPayId(queryParams.value).then(res => {
infoList.value = res.rows
uni.hideLoading()
})
}
function goDetail(item) {
// const form = encodeURIComponent(JSON.stringify(item))
let path =
`/level/ztx/studentList?type=${queryParams.value.type}&examId=${item.examId}&payId=${queryParams.value.payId}`
uni.navigateTo({
url: path
});
}
function checkCert(examIds,$sureFunc,$confirmFunc){
return api.checkPersonByExamIds(examIds).then(res=>{
if (res.data == 1) {
$confirmFunc().then((kk)=>{
if(kk.confirm){
$sureFunc()
}
})
} else if (res.data == 2 || res.data == 3) {
uni.showModal({
title: '提示',
content:`存在学员没有照片,是否继续生成?`,
success: (rr) => {
if(rr.confirm){
$sureFunc()
}
}
})
}
})
}
function send(row) {
checkCert(row.examId,()=>{
api.submitCert2([{
id: queryParams.value.payId,
children: [{
id: row.examId
}]
}]).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
},()=>{
return uni.showModal({
title: '提示',
content:`确定下发 ${row.name} 的证书吗`
})
})
}
</script>
<style scoped lang="scss">
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
\ No newline at end of file
......
......@@ -8,18 +8,18 @@
<view class="indexboxre" style="height: calc(100vh - 180rpx)">
<view class="userlist">
<view class="item" v-for="n in list" :key="n.id">
<view class="w100">
<view class="status">
<text class="text-success" v-if="n.isCert == '1' ">已发送</text>
<text class="text-warning" v-else>未发送</text>
<view class="w100">
<view class="status">
<text class="text-success" v-if="n.isCert == '1' ">已发送</text>
<text class="text-warning" v-else>未发送</text>
</view>
<view class="name">{{n.realName}}</view>
<view class="date">
所属团体: {{n.memName}}
<view class="name">{{n.realName}}</view>
<view class="date">
所属团体: {{n.memName}}
</view>
<view class="flexbox mtb30">
<view>
<view>
会员有效期
<text>{{n.vaildityDate?.slice(0,10)}}</text>
</view>
......@@ -44,8 +44,10 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {szToHz} from '@/common/utils.js'
import config from '@/config.js'
import {
szToHz
} from '@/common/utils.js'
import {
ref,
getCurrentInstance
......@@ -62,53 +64,66 @@
const total = ref(0)
const userType = ref('')
onLoad((option) => {
queryParams.value.examId = option.examId
queryParams.value.payId = option.payId
queryParams.value.type = option.type
queryParams.value.examId = option.examId
queryParams.value.payId = option.payId
queryParams.value.type = option.type
getList()
})
function getList() {
uni.showLoading({
title: '加载中'
})
if(queryParams.value.name==''){
delete queryParams.value.name
function getList() {
uni.showLoading({
title: '加载中'
})
if (queryParams.value.name == '') {
delete queryParams.value.name
}
api.certStudentList(queryParams.value).then(res => {
list.value = res.rows
uni.hideLoading()
})
}
function sendCert(row) {
let msg
if(row.isCert==1){
msg = `更新`
}else{
msg = `下发`
function checkCert(row){
return api.checkPersonByPersonId(row.perId).then(res => {
if (!res.data) {
uni.showModal({
title: '提示',
content:'该学员没有照片,无法生成证书!',
success: () => {}
})
return Promise.reject()
}
})
}
function sendCert(row) {
let msg
if (row.isCert == 1) {
msg = `更新`
} else {
msg = `下发`
}
uni.showModal({
title: '提示',
content: `确定${msg}${row.realName}的证书吗`,
success: function(res) {
if (res.confirm) {
const params = [{
id: queryParams.value.payId,
children: [{
id: queryParams.value.examId,
children: [row.id]
checkCert(row).then(() => {
uni.showModal({
title: '提示',
content: `确定${msg}${row.realName}的证书吗`,
success: function(res) {
if (res.confirm) {
const params = [{
id: queryParams.value.payId,
children: [{
id: queryParams.value.examId,
children: [row.id]
}]
}]
}]
api.submitCert(params).then(res => {
uni.showToast({
title: `下发成功`
api.submitCert2(params).then(res => {
uni.showToast({
title: `下发成功`
})
getList()
})
getList()
})
}
}
}
})
})
}
......
<template>
<view>
<view class="wBox">
<view class="tt">
审核信息
</view>
<view>
<view class="stepItem" v-for="(n,index) in recordList" :key="index">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==0"> 审核中</text>
<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==3" class="text-warning"> 已撤回</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.auditDeptName}}</view>
<view v-if="n.auditStatus==2">
备注:{{n.auditMsg||'/' }}
</view>
</view>
</view>
</view>
</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 userType = ref('')
const recordList = ref([])
onLoad((option) => {
getMyCertStageFN()
})
function getMyCertStageFN() {
api.getMyCertStage().then(res => {
recordList.value = res.data
console.log(res)
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
margin: 0 0 30rpx;
font-size: 30rpx;
}
.ddd {
font-size: 28rpx;
color: #333;
margin: 0 0 10rpx;
.lab {
color: #999;
display: inline-block;
text-align: justify;
}
}
}
<template>
<view>
<view class="wBox">
<view class="tt">
审核信息
</view>
<view>
<view class="stepItem" v-for="(n,index) in recordList" :key="index">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==0"> 审核中</text>
<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==3" class="text-warning"> 已撤回</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.auditDeptName}}</view>
<view v-if="n.auditStatus==2">
备注:{{n.auditMsg||'/' }}
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'underscore'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const userType = ref('')
const recordList = ref([])
onLoad((option) => {
getMyCertStageFN()
})
function getMyCertStageFN() {
api.getMyCertStage().then(res => {
recordList.value = res.data
console.log(res)
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
margin: 0 0 30rpx;
font-size: 30rpx;
}
.ddd {
font-size: 28rpx;
color: #333;
margin: 0 0 10rpx;
.lab {
color: #999;
display: inline-block;
text-align: justify;
}
}
}
</style>
\ No newline at end of file
......
{
"dependencies": {
"crypto-js": "^4.1.1",
"dayjs": "^1.11.6",
"lodash": "^4.17.21"
"lodash": "^4.17.21",
"underscore": "^1.13.6"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^22.0.0"
......
......@@ -60,7 +60,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
<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" :key="item.recordId">
<view @click="goDetail(item)">
<view class="status">
<text :class="{
'text-primary':item.scoreStatus=='0',
'text-success':item.scoreStatus=='2',
'text-danger':item.scoreStatus=='3',
'text-warning':item.scoreStatus=='4'
}">{{ item.scoreStatusStr }}</text>
</view>
<view class="date" v-if="item.status!='0'&&item.submitTime">提交时间:{{item.submitTime}}</view>
<view class="name mt0">{{item.name}}</view>
<view class="pp esp">考段日期:{{item.startTime?.substring(0,16)}}{{item.endTime?.substring(0,16)}}
</view>
<view class="flexbox">
<view>
申请日期
<view>{{item.applyTime?.substring(0, 10)}}</view>
</view>
<view>
考段考生数
<view>{{item.totalNum||'--'}}</view>
</view>
<view>
总金额
<view><text class="text-danger">¥{{(item.totalAmount*1).toFixed(2)}}</text></view>
</view>
</view>
</view>
<!-- <view class="func" v-if="(item.scoreStatus=='0'||item.scoreStatus=='3' || item.scoreStatus=='4')&& item.rankStatus == '1'">
<button @click="scoreEdit(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 examApi from '@/common/api_exam.js'
import _ from 'lodash'
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
status: '0',
rankStatus: '1'
})
const current = ref()
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const deptType = ref('')
const infoList = ref([])
const total = ref(0)
onLoad((options) => {
queryParams.value.type = options.type
if (options.type == 2) {
uni.setNavigationBarTitle({
title: '段位成绩录入'
})
}
if (options.type == 3) {
uni.setNavigationBarTitle({
title: '越段成绩录入'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e) {
queryParams.value.status = e.currentIndex
getList()
}
<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" :key="item.recordId">
<view @click="goDetail(item)">
<view class="status">
<text :class="{
'text-primary':item.scoreStatus=='0',
'text-success':item.scoreStatus=='2',
'text-danger':item.scoreStatus=='3',
'text-warning':item.scoreStatus=='4'
}">{{ item.scoreStatusStr }}</text>
</view>
<view class="date" v-if="item.status!='0'&&item.submitTime">提交时间:{{item.submitTime}}</view>
<view class="name mt0">{{item.name}}</view>
<view class="pp esp">考段日期:{{item.startTime?.substring(0,16)}}{{item.endTime?.substring(0,16)}}
</view>
<view class="flexbox">
<view>
申请日期
<view>{{item.applyTime?.substring(0, 10)}}</view>
</view>
<view>
考段考生数
<view>{{item.totalNum||'--'}}</view>
</view>
<view>
总金额
<view><text class="text-danger">¥{{(item.totalAmount*1).toFixed(2)}}</text></view>
</view>
</view>
</view>
<!-- <view class="func" v-if="(item.scoreStatus=='0'||item.scoreStatus=='3' || item.scoreStatus=='4')&& item.rankStatus == '1'">
<button @click="scoreEdit(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 examApi from '@/common/api_exam.js'
import _ from 'underscore'
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
status: '0',
rankStatus: '1'
})
const current = ref()
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const deptType = ref('')
const infoList = ref([])
const total = ref(0)
onLoad((options) => {
queryParams.value.type = options.type
if (options.type == 2) {
uni.setNavigationBarTitle({
title: '段位成绩录入'
})
}
if (options.type == 3) {
uni.setNavigationBarTitle({
title: '越段成绩录入'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e) {
queryParams.value.status = e.currentIndex
getList()
}
function getList() {
uni.showLoading({
title: '加载中',
mask: true
})
examApi.getRankScoreList(queryParams.value).then(res => {
infoList.value = res.rows
total.value = res.total
uni.hideLoading()
})
}
function scoreEdit(item) {
console.log(item.sourceData)
var obj = {
flag: flag,
reason: null,
id: item.recordId
}
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
obj.reason = res.content
doApproval(obj)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(obj)
}
}
})
}
}
})
examApi.getRankScoreList(queryParams.value).then(res => {
infoList.value = res.rows
total.value = res.total
uni.hideLoading()
})
}
function scoreEdit(item) {
console.log(item.sourceData)
var obj = {
flag: flag,
reason: null,
id: item.recordId
}
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
obj.reason = res.content
doApproval(obj)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(obj)
}
}
})
}
}
function doApproval(obj) {
uni.showLoading({
title: '加载中'
})
})
examApi.doMergeFlows(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
}
</script>
<style lang="scss" scoped>
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
......
<template>
<view class="mainbox">
<template>
<view class="mainbox">
<view class="title">{{form.name}}</view>
<view class="infos">
<text>{{ form.source }}</text>
<text>{{ form.belongTime }}</text>
</view>
<view class="content">
<view v-html="form.content"></view>
<view v-if="attachmentMp4.length>0">
<video v-for="(f,index) in attachmentMp4" :key="index" controls :src="config.baseUrl_api + f.url"></video>
</view>
</view>
<view class="content">
<view v-html="form.content"></view>
<view v-if="attachmentMp4.length>0">
<video v-for="(f,index) in attachmentMp4" :key="index" controls :src="config.baseUrl_api + f.url"></video>
</view>
<view v-if="attachmentFile.length>0" class="mt20">
<!-- 附件-->
<view class="fwb mt20">附件下载:</view>
......@@ -20,34 +20,34 @@
{{ index + 1 }}{{ f.name }}
</view>
</view>
<view>
<text v-if=" form.author">发布人:{{ form.author }}</text>
</view>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import * as api from '@/common/api.js';
import {
onLoad
} from '@dcloudio/uni-app';
import _ from 'lodash'
import config from '@/config.js'
const form = ref({})
</view>
<view>
<text v-if=" form.author">发布人:{{ form.author }}</text>
</view>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import * as api from '@/common/api.js';
import {
onLoad
} from '@dcloudio/uni-app';
import _ from 'underscore'
import config from '@/config.js'
const form = ref({})
const attachmentFile = ref([])
const attachmentMp4 = ref([])
onLoad((option) => {
getData(option.noteId)
})
function getData(noteId) {
api.getNewsById(noteId).then(res => {
const attachmentMp4 = ref([])
onLoad((option) => {
getData(option.noteId)
})
function getData(noteId) {
api.getNewsById(noteId).then(res => {
form.value = res.data
var html = res.data.content.replace(/<img([\s\w"-=\/\.:;]+)((?:(height="[^"]+")))/ig, '<img$1')
.replace(/<img([\s\w"-=\/\.:;]+)((?:(width="[^"]+")))/ig, '<img$1')
......@@ -55,14 +55,14 @@ const attachmentMp4 = ref([])
.replace(/<img([\s\w"-=\/\.:;]+)((?:(alt="[^"]+")))/ig, '<img$1')
.replace(/<img([\s\w"-=\/\.:;]+)/ig, '<img style="width: 100%;" $1');
if (form.value.attacthJson) {
if (form.value.attacthJson) {
const attachment = JSON.parse(form.value.attacthJson)
attachmentFile.value = _.filter(attachment, (a) => a.url.toLowerCase().indexOf('.mp4') === -1) || []
attachmentMp4.value = _.filter(attachment, (a) => a.url.toLowerCase().indexOf('.mp4') !== -1) || []
}
})
}
attachmentMp4.value = _.filter(attachment, (a) => a.url.toLowerCase().indexOf('.mp4') !== -1) || []
}
})
}
function downLoad(url){
console.log(url)
var str = config.baseUrl_api + url
......@@ -131,9 +131,9 @@ const attachmentMp4 = ref([])
}
});
}
</script>
<style scoped lang="scss">
</script>
<style scoped lang="scss">
.mainbox {
box-sizing: border-box;
padding: 50rpx 25rpx 160rpx;
......@@ -190,5 +190,5 @@ const attachmentMp4 = ref([])
video {
width: 100%;
}
}
</style>
\ No newline at end of file
......
<template>
<view>
<view class="wBox">
<view class="tt">考段基本信息</view>
<view class="ddd">
<text class="lab">考段名称:</text>{{ form.name }}
</view>
<view class="ddd">
<text class="lab">申请日期:</text>{{form.applyTime?.slice(0,10)}}
</view>
<view class="ddd">
<text class="lab">申请单位:</text>{{ form.memberName }}
</view>
<view class="ddd">
<text class="lab">考官:</text>{{form.examinerNames?.split(',').join('/')}}
</view>
<view class="ddd">
<text class="lab">考试开始时间:</text>{{form.startTime}}
</view>
<view class="ddd">
<text class="lab">考试结束时间:</text>{{form.endTime}}
</view>
<view class="ddd">
<text class="lab">考段地点:</text>{{form.address}}
</view>
<view class="ddd" v-if="userType=='2'||userType=='1'">
<template>
<view>
<view class="wBox">
<view class="tt">考段基本信息</view>
<view class="ddd">
<text class="lab">考段名称:</text>{{ form.name }}
</view>
<view class="ddd">
<text class="lab">申请日期:</text>{{form.applyTime?.slice(0,10)}}
</view>
<view class="ddd">
<text class="lab">申请单位:</text>{{ form.memberName }}
</view>
<view class="ddd">
<text class="lab">考官:</text>{{form.examinerNames?.split(',').join('/')}}
</view>
<view class="ddd">
<text class="lab">考试开始时间:</text>{{form.startTime}}
</view>
<view class="ddd">
<text class="lab">考试结束时间:</text>{{form.endTime}}
</view>
<view class="ddd">
<text class="lab">考段地点:</text>{{form.address}}
</view>
<view class="ddd" v-if="userType=='2'||userType=='1'">
<text class="lab">总金额:</text>
<text class="text-danger">¥{{(form.totalAmount*1).toFixed(2) }}</text>
</view>
</view>
<view class="wBox">
<view class="tt">
考生信息
</view>
<view class="vipData">
<view><text>{{ tablePersonInfo.total }}</text></view>
<view v-for="l in tablePersonInfo.levelArr" :key="l.level">
{{ szToHz(l.level) }}段: <text>{{ l.num }} </text>
</view>
</view>
<view class="userlist">
<view class="item" v-for="n in list" :key="n.id" style="background-color: #fffafa;">
<view class="w100">
<view class="name">{{n.realName}} <text>{{n.memName}}</text></view>
<!-- <view class="date">{{n.idcTypeStr}}{{n.idcCode}}</view> -->
<text class="text-danger">¥{{(form.totalAmount*1).toFixed(2) }}</text>
</view>
</view>
<view class="wBox">
<view class="tt">
考生信息
</view>
<view class="vipData">
<view><text>{{ tablePersonInfo.total }}</text></view>
<view v-for="l in tablePersonInfo.levelArr" :key="l.level">
{{ szToHz(l.level) }}段: <text>{{ l.num }} </text>
</view>
</view>
<view class="userlist">
<view class="item" v-for="n in list" :key="n.id" style="background-color: #fffafa;">
<view class="w100">
<view class="name">{{n.realName}} <text>{{n.memName}}</text></view>
<!-- <view class="date">{{n.idcTypeStr}}{{n.idcCode}}</view> -->
<view class="flexbox">
<view>
原有段位
......@@ -65,97 +65,97 @@
<text v-if="n.isPass=='1'" class="text-success">通过</text>
<text v-else class="text-danger">未通过</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="wBox">
<view class="tt">
审核信息
</view>
<view>
<view class="stepItem" v-for="(n,index) in recordList" :key="index">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text :class="{
'text-success':n.auditStatus=='1',
'text-danger':n.auditStatus=='2',
'text-warning':n.auditStatus=='3'
}">{{ n.auditStatusStr }}</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.deptName}}</view>
<view v-if="n.reason">
备注:{{n.reason||'' }}
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
</view>
</view>
</view>
</view>
</view>
<view class="wBox">
<view class="tt">
审核信息
</view>
<view>
<view class="stepItem" v-for="(n,index) in recordList" :key="index">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text :class="{
'text-success':n.auditStatus=='1',
'text-danger':n.auditStatus=='2',
'text-warning':n.auditStatus=='3'
}">{{ n.auditStatusStr }}</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.deptName}}</view>
<view v-if="n.reason">
备注:{{n.reason||'' }}
</view>
</view>
</view>
</view>
</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
import _ from 'underscore'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
import {szToHz} from '@/common/utils.js'
const app = getApp();
const userType = ref('')
const form = ref({})
const tablePersonInfo = ref({})
const app = getApp();
const userType = ref('')
const form = ref({})
const tablePersonInfo = ref({})
const recordList = ref([])
const list = ref([])
let examId = ''
onLoad((option) => {
examId = option.examId
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
userType.value = app.globalData.userType
const list = ref([])
let examId = ''
onLoad((option) => {
examId = option.examId
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
userType.value = app.globalData.userType
getForm()
getRecordList()
getTablePersonInfo()
}
function getForm() {
getTablePersonInfo()
}
function getForm() {
api.getLevelApplyInfo(examId).then(res => {
uni.hideLoading()
form.value = res.data
})
}
function getRecordList() {
api.getApprovalRecord(examId).then(res => {
recordList.value = res.data.levelSteps
})
uni.hideLoading()
form.value = res.data
})
}
function getRecordList() {
api.getApprovalRecord(examId).then(res => {
recordList.value = res.data.levelSteps
})
}
function getTablePersonInfo() {
api.getStudentList({
......@@ -187,26 +187,26 @@ function getTablePersonInfo() {
}
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;margin: 0 0 30rpx;
font-size: 30rpx;
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;margin: 0 0 30rpx;
font-size: 30rpx;
}
.ddd{font-size: 28rpx;color: #333; margin: 0 0 10rpx;
.lab{color: #999;display: inline-block;text-align: justify;}
}
}
}
</style>
\ No newline at end of file
......
......@@ -49,10 +49,10 @@
</template>
<script setup>
import * as examApi from '@/common/api_exam.js'
import _ from 'lodash'
import { ref } from 'vue'
import { onLoad,onShow } from '@dcloudio/uni-app'
import * as examApi from '@/common/api_exam.js'
import _ from 'underscore'
import { ref } from 'vue'
import { onLoad,onShow } from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
......@@ -63,7 +63,7 @@ const current = ref()
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const deptType = ref('')
const infoList = ref([])
const infoList = ref([])
const total = ref(0)
onLoad((options)=>{
......@@ -85,9 +85,9 @@ function init(){
getList()
}
function onClickItem(e) {
queryParams.value.status = e.currentIndex
getList()
function onClickItem(e) {
queryParams.value.status = e.currentIndex
getList()
}
function getList() {
......@@ -180,7 +180,7 @@ function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
});
}
function handleBack(row){
uni.showModal({
......
......@@ -49,17 +49,17 @@
</template>
<script setup>
import * as examApi from '@/common/api_exam.js'
import _ from 'lodash'
import { ref } from 'vue'
import { onLoad,onShow } from '@dcloudio/uni-app'
import * as examApi from '@/common/api_exam.js'
import _ from 'underscore'
import { ref } from 'vue'
import { onLoad,onShow } from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({})
const current = ref()
const navs = ref(['未发放', '部分发放', '已发放'])
const deptType = ref('')
const infoList = ref([])
const infoList = ref([])
const total = ref(0)
onLoad((options)=>{
......@@ -81,9 +81,9 @@ function init(){
getList()
}
function onClickItem(e) {
queryParams.value.certStatus = e.currentIndex
getList()
function onClickItem(e) {
queryParams.value.certStatus = e.currentIndex
getList()
}
function getList() {
......@@ -122,7 +122,7 @@ function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
});
}
</script>
......
<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" :key="item.recordId">
<view @click="goDetail(item)">
<view class="status">
<text :class="{
'text-primary':item.auditStatus=='0',
'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.status!='0'&&item.submitTime">
<uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons>
提交时间:{{item.submitTime}}
</view>
<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" :key="item.recordId">
<view @click="goDetail(item)">
<view class="status">
<text :class="{
'text-primary':item.auditStatus=='0',
'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.status!='0'&&item.submitTime">
<uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons>
提交时间:{{item.submitTime}}
</view>
<view class="text-primary">{{item.examCode}}</view>
<view class="name mt10"><text class="dot"></text>{{item.name}}</view>
<view class="pp esp">考段日期:{{item.startTime.substring(0,16)}}{{item.endTime.substring(0,16)}}
</view>
<view class="flexbox">
<view>
申请日期
<view>{{item.applyTime.substring(0, 10)}}</view>
</view>
<view>
考段考生数
<view>{{item.totalNum}}</view>
</view>
<view>
总金额
<view>
<text class="text-danger">¥{{(item.totalAmount*1).toFixed(2)}}</text>
</view>
</view>
</view>
</view>
<view class="func" v-if="item.auditStatus=='0'">
<button @click="audit(item,'2')">拒绝</button>
<button @click="audit(item,'1')">同意</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 examApi from '@/common/api_exam.js'
import _ from 'lodash'
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
status: '0',
rankStatus: '1'
})
const current = ref()
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const deptType = ref('')
const infoList = ref([])
const total = ref(0)
onLoad((options) => {
queryParams.value.type = options.type
if (options.type == 2) {
uni.setNavigationBarTitle({
title: '段位考试审核'
})
}
if (options.type == 3) {
uni.setNavigationBarTitle({
title: '越段考试审核'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e) {
uni.showLoading({
title: '加载中'
})
queryParams.value.status = e.currentIndex
getList()
}
function getList() {
examApi.getVerityList(queryParams.value).then(res => {
uni.hideLoading()
const list = []
_.each(res.rows, r => {
const item = JSON.parse(r.content)
item.recordId = r.recordId
item.auditStatus = r.auditStatus
item.submitStatus = r.submitStatus
item.distributeTime = r.distributeTime
item.statusStr = statusArr[r.auditStatus]
item.sourceData = r
item.scoreStatus = r.scoreStatus
item.status = r.status
item.isView = r.isView
item.payStatus = r.payStatus
item.rankStatus = r.rankStatus
item.processCentBar = r.processCentBar
list.push(item)
})
infoList.value = list
total.value = res.total
})
}
function audit(item, flag) {
console.log(item.sourceData)
var obj = {
flag: flag,
reason: null,
id: item.recordId
}
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
obj.reason = res.content
doApproval(obj)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(obj)
}
}
})
}
}
<view class="name mt10"><text class="dot"></text>{{item.name}}</view>
<view class="pp esp">考段日期:{{item.startTime.substring(0,16)}}{{item.endTime.substring(0,16)}}
</view>
<view class="flexbox">
<view>
申请日期
<view>{{item.applyTime.substring(0, 10)}}</view>
</view>
<view>
考段考生数
<view>{{item.totalNum}}</view>
</view>
<view>
总金额
<view>
<text class="text-danger">¥{{(item.totalAmount*1).toFixed(2)}}</text>
</view>
</view>
</view>
</view>
<view class="func" v-if="item.auditStatus=='0'">
<button @click="audit(item,'2')">拒绝</button>
<button @click="audit(item,'1')">同意</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 examApi from '@/common/api_exam.js'
import _ from 'underscore'
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
status: '0',
rankStatus: '1'
})
const current = ref()
const navs = ref(['审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const deptType = ref('')
const infoList = ref([])
const total = ref(0)
onLoad((options) => {
queryParams.value.type = options.type
if (options.type == 2) {
uni.setNavigationBarTitle({
title: '段位考试审核'
})
}
if (options.type == 3) {
uni.setNavigationBarTitle({
title: '越段考试审核'
})
}
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e) {
uni.showLoading({
title: '加载中'
})
queryParams.value.status = e.currentIndex
getList()
}
function getList() {
examApi.getVerityList(queryParams.value).then(res => {
uni.hideLoading()
const list = []
_.each(res.rows, r => {
const item = JSON.parse(r.content)
item.recordId = r.recordId
item.auditStatus = r.auditStatus
item.submitStatus = r.submitStatus
item.distributeTime = r.distributeTime
item.statusStr = statusArr[r.auditStatus]
item.sourceData = r
item.scoreStatus = r.scoreStatus
item.status = r.status
item.isView = r.isView
item.payStatus = r.payStatus
item.rankStatus = r.rankStatus
item.processCentBar = r.processCentBar
list.push(item)
})
infoList.value = list
total.value = res.total
})
}
function audit(item, flag) {
console.log(item.sourceData)
var obj = {
flag: flag,
reason: null,
id: item.recordId
}
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
obj.reason = res.content
doApproval(obj)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(obj)
}
}
})
}
}
function doApproval(obj) {
uni.showLoading({
title: '加载中',
mask: true
})
})
examApi.doMergeFlows(obj).then((res) => {
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
}
</script>
<style lang="scss" scoped>
uni.hideLoading()
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
let path = `/pages/rank/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
......
......@@ -128,7 +128,8 @@
import {
onLoad
} from '@dcloudio/uni-app'
import config from '@/config.js'
import config from '@/config.js'
import * as aes2 from '@/common/utils.js'
const current = ref(0)
const popup = ref(null)
const infoConfirm = ref(null)
......@@ -498,7 +499,12 @@
if(baseFormData.value.idcType=='4'){
baseFormData.value.idcType='0'
}
delete baseFormData.value.card
delete baseFormData.value.card
const time = new Date().valueOf() + ''
baseFormData.t = time + Math.floor(Math.random() * 10)
baseFormData.signT = aes2.AESEncrypt(baseFormData.idcType + time)
api.addPersonToMyDept(baseFormData.value).then(Response => {
if (Response.data == 0) {
let msg = '该成员,实名认证未通过,注册失败!'
......
<template>
<template>
<view class="hasfixedbottom">
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索姓名" @blur="search()" @clear="search()">
</uni-easyinput>
</view>
<view class="userlist">
<view class="item" v-for=" (n,index) in studentList" :key="index">
<view @click="checkThis(n)">
<image class="icon" v-if="n.checked"
:src="config.baseUrl_api+'/fs/static/member/dx_dwn.png'" />
<image class="icon" v-else :src="config.baseUrl_api+'/fs/static/member/dx.png'" />
</view>
<view>
<view class="name">{{n.name}} <text>{{n.perCode}}</text></view>
<view class="date">{{ cardType[n.idcType]?.text }}{{n.idcCode}}</view>
</view>
</view>
<view class="nodata" v-if="studentList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>无可变更会员</text>
</view>
</view>
<uni-load-more @clickLoadMore="clickLoadMore" :contentText="contentText" :status="status"></uni-load-more>
</view>
<view class="userlist">
<view class="item" v-for=" (n,index) in studentList" :key="index">
<view @click="checkThis(n)">
<image class="icon" v-if="n.checked"
:src="config.baseUrl_api+'/fs/static/member/dx_dwn.png'" />
<image class="icon" v-else :src="config.baseUrl_api+'/fs/static/member/dx.png'" />
</view>
<view>
<view class="name">{{n.name}} <text>{{n.perCode}}</text></view>
<view class="date">{{ cardType[n.idcType]?.text }}{{n.idcCode}}</view>
</view>
</view>
<view class="nodata" v-if="studentList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>无可变更会员</text>
</view>
</view>
<uni-load-more @clickLoadMore="clickLoadMore" :contentText="contentText" :status="status"></uni-load-more>
<view class="fixedBottom" v-if="studentList.length!=0">
<button class="btn-red" @click="handleImport">批量添加</button>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
<view class="fixedBottom" v-if="studentList.length!=0">
<button class="btn-red" @click="handleImport">批量添加</button>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
import * as api from '@/common/api.js'
import _ from 'lodash'
import config from '/config.js'
import _ from 'underscore'
import config from '/config.js'
const queryParams = ref({
paymentRangeId:-1,
multiDeptFlag: 1,
......@@ -50,52 +50,52 @@ const queryParams = ref({
pageNum:1,
pageSize:10
})
const paging = ref(null)
const paging = ref(null)
const total = ref(0)
const status = ref('no-more')
const list = ref([])
const popup = ref(null)
const choseStudent = ref(null)
const studentList = ref([])
const type = ref('')
const status = ref('no-more')
const list = ref([])
const popup = ref(null)
const choseStudent = ref(null)
const studentList = ref([])
const type = ref('')
const form = ref({})
const contentText = ref({contentdown: "点击加载更多",contentrefresh: "正在加载...",contentnomore: "没有更多数据了"})
const cardType = ref([{
text: '身份证',
value: '0'
},
{
text: '来往大陆(内地)通行证',
value: '1'
},
{
text: '中国护照',
value: '2'
},
{
text: '护照',
value: '3'
},
{
text: '其它',
value: '4'
},
{
text: '香港身份证',
value: '5'
},
{
text: '往来港澳台通行证',
value: '6'
}
])
onLoad((option) => {
if (option.rangeId) {
const cardType = ref([{
text: '身份证',
value: '0'
},
{
text: '来往大陆(内地)通行证',
value: '1'
},
{
text: '中国护照',
value: '2'
},
{
text: '护照',
value: '3'
},
{
text: '其它',
value: '4'
},
{
text: '香港身份证',
value: '5'
},
{
text: '往来港澳台通行证',
value: '6'
}
])
onLoad((option) => {
if (option.rangeId) {
queryParams.value.paymentRangeId = option.rangeId
}
getList()
})
onShow(() => {})
getList()
})
onShow(() => {})
function clickLoadMore(){
getList()
}
......@@ -111,7 +111,7 @@ function search(){
}
uni.hideLoading()
})
}
}
function getList() {
if(total.value>0&&total.value>studentList.value.length){
uni.showLoading({
......@@ -133,87 +133,87 @@ function getList() {
}else if(total.value==0){
search()
}
}
function checkThis(n) {
if (n.checked) {
n.checked = false
} else {
n.checked = true
}
}
function handleImport() {
var arr = []
for (var n of studentList.value) {
if (n.checked) {
arr.push(n.perId)
}
}
api.addInfoModeToRange({
perIds: arr,
rangeIdStr: queryParams.value.paymentRangeId || '-1'
}).then(res => {
}
}
function checkThis(n) {
if (n.checked) {
n.checked = false
} else {
n.checked = true
}
}
function handleImport() {
var arr = []
for (var n of studentList.value) {
if (n.checked) {
arr.push(n.perId)
}
}
api.addInfoModeToRange({
perIds: arr,
rangeIdStr: queryParams.value.paymentRangeId || '-1'
}).then(res => {
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
prevPage.onShow(res.data)
uni.navigateBack()
})
}
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.flexbox {
padding: 30rpx 30rpx 0
}
.danger-button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
</script>
<style scoped lang="scss">
.flexbox {
padding: 30rpx 30rpx 0
}
.danger-button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.userlist{
padding: 0 25rpx;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
.popBody {
background: #fff;
padding: 30rpx;
}
.text-center .btn-red-kx {
border-radius: 50px;
font-size: 28rpx;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
.popBody {
background: #fff;
padding: 30rpx;
}
.text-center .btn-red-kx {
border-radius: 50px;
font-size: 28rpx;
}
:deep(.file-picker__progress) {
opacity: 0;background-color: transparent;
}
}
</style>
\ No newline at end of file
......
<template>
<view class="mainbox">
<view class="topBg">
<view class="mainbox">
<view class="topBg">
<view class="photobox">
<image class="photo" v-if="form.photo" :src="form.photo" mode='aspectFit'></image>
<view class="colorful" v-else>{{form.name?.slice(0,1)}}</view>
</view>
<view class="infoBox">
<view class="name">
{{form.name}}
</view>
<view class="infoBox">
<view class="name">
{{form.name}}
</view>
<view class="flexbox">
<label>证件号:</label>
<text>{{ form.idcCode}}</text>
<view class="flexbox">
<label>证件号:</label>
<text>{{ form.idcCode}}</text>
</view>
<view class="flexbox">
<label>会员编号:</label>
<text>{{ form.perCode}}</text>
<view class="flexbox">
<label>会员编号:</label>
<text>{{ form.perCode}}</text>
</view>
<view class="flexbox">
<label>有效期:</label>
<text>{{ form.idcType==3?'--': form.validityDate?.slice(0,10)||'--' }}</text>
</view>
</view>
<view class="flexbox">
<label>有效期:</label>
<text>{{ form.idcType==3?'--': form.validityDate?.slice(0,10)||'--' }}</text>
</view>
</view>
</view>
<!-- 会员证 -->
<view style="margin: 30rpx 0 0;" v-if="form.certStage!=0&&form.idcType!=3&&form.certStage!=2&&form.certStage!=1">
<view class="zhengBox">
<image v-if="form.certStage == 4" style="width: 600rpx; height: 380rpx;position: relative" :src="config.baseUrl_api+'/fs/static/icon/memberCardU.png'" :fit="fit" />
<image v-else style="width: 600rpx; height: 380rpx;position: relative" :src="config.baseUrl_api+'/fs/static/icon/memberCard.png'" :fit="fit" />
<view class="zhengbody" @contextmenu.prevent="youji">
<image mode="aspectFill" :src="(form.photo)" class="head"/>
<view class="memberNumber">{{ form.perCode }}</view>
<view class="birthday">{{ fileData(form.birth) }}</view>
<view class="phone">010-87188971</view>
<view class="service">https://www.taekwondo.org.cn/</view>
<view class="validity">{{ fileData(form.beginTime) +'-'+fileData(form.validityDate) }}</view>
<view class="nameC">
<view ref="content" class="content">{{ form.name }} </view>
</view>
</view>
</view>
</view>
<uni-list>
<uni-list-item title="姓名" :rightText="form.name" />
<uni-list-item title="证件类型" :rightText="cardType?.[form?.idcType]?.label" />
......@@ -72,14 +92,15 @@
label: '其它',
value: '4'
}, {
label: '香港身份证',
label: '香港身份证',
value: '5'
}, {
label: '往来港澳台通行证',
label: '往来港澳台通行证',
value: '6'
}
])
const form = ref({})
const form = ref({})
const urlHref = ref()
onLoad((option) => {
console.log(option)
api.getInfo(option.perId).then(res => {
......@@ -108,34 +129,65 @@
}
}
})
}
</script>
<style scoped lang="scss">
.flexbox{width: 60%;margin:10rpx auto;font-size: 28rpx;align-items: center;
label{color: #7b7f83;width: 5em;font-size: 24rpx;}
}
.topBg{background: #f5f5f5;}
.infoBox{padding: 1rpx 1rpx 30rpx;
.name{font-size: 34rpx;text-align: center;}
function fileData(time) {
if (!time) return
const data = new Date(time.replace(/-/g, '/'))
const year = data.getFullYear()
const month = data.getMonth() + 1
const dates = data.getDate()
return year + '年' + month + '月' + dates + '日'
}
.photobox {
position: relative;
padding: 30rpx 0 30rpx;
.photo {
width: 255rpx;
height: 318rpx;
background-color: #f4f4f4;
display: block;
margin: auto;
}
</script>
<style scoped lang="scss">
.flexbox {
width: 60%;
margin: 10rpx auto;
font-size: 28rpx;
align-items: center;
label {
color: #7b7f83;
width: 5em;
font-size: 24rpx;
}
}
.topBg {
background: #f5f5f5;
}
.infoBox {
padding: 1rpx 1rpx 30rpx;
.name {
font-size: 34rpx;
text-align: center;
}
}
.photobox {
position: relative;
padding: 30rpx 0 30rpx;
.photo {
width: 255rpx;
height: 318rpx;
background-color: #f4f4f4;
display: block;
margin: auto;
}
}
.height1 {
height: 1rpx
}
.mainbox {
margin: 30rpx 25rpx 60rpx;box-shadow:0 0 8rpx #ddd;
margin: 30rpx 25rpx 60rpx;
box-shadow: 0 0 8rpx #ddd;
background: #FFFFFF;
border-radius: 15rpx;
......@@ -163,5 +215,63 @@
color: #fff;
text-align: center;
border-radius: 50%;
}
.zhengBox{
position: relative;width: 600rpx; height: 380rpx;margin:0 auto 30rpx;
.zhengbody{
.head{width: 114rpx;height: 114rpx;border-radius: 50%;position: absolute;left: 65rpx;top: 132rpx;}
.birthday{
position: absolute; top: 158rpx;left: 434rpx;
font-size: 16rpx;
color: #9f6a44;
}
.memberNumber{
position: absolute;top: 182rpx;left: 290rpx;
font-size: 19rpx;
color: #9f6a44;
font-weight: 600;
letter-spacing: 1px;
}
.phone{
position: absolute; top: 292rpx;left: 340rpx;
font-size: 16rpx;
color: #bc9060;
}
.service{
position: absolute;
top: 313rpx;
left: 340rpx;
font-size: 16rpx;
color: #bc9060;
}
.validity{
position: absolute;
top: 336rpx;
left: 340rpx;
font-size: 16rpx;
color: #bc9060;
}
.nameC{
position: absolute;
top: 146rpx;
left: 240rpx;
color: #9f6a44;
font-weight: 600;
line-height: 1;
}
.content{
width: 120rpx;
box-sizing: border-box;
display: flex;
align-items: center;
//white-space: nowrap;
overflow: hidden;
overflow-x: auto;
transform-origin: 0 55%;
white-space: nowrap;
}
}
}
</style>
\ No newline at end of file
......
<template>
<template>
<view class="hasfixedbottom">
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索姓名" @blur="search()" @clear="search()">
</uni-easyinput>
</view>
<view class="userlist">
<view class="item" v-for=" (n,index) in studentList" :key="index">
<view @click="checkThis(n)">
<image class="icon" v-if="n.checked"
:src="config.baseUrl_api+'/fs/static/member/dx_dwn.png'" />
<image class="icon" v-else :src="config.baseUrl_api+'/fs/static/member/dx.png'" />
</view>
<view>
<view class="name">{{n.name}} <text>{{n.perCode}}</text></view>
<view class="date">{{ cardType[n.idcType]?.text }}{{n.idcCode}}</view>
</view>
</view>
<view class="nodata" v-if="studentList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>无可变更会员</text>
</view>
</view>
<uni-load-more @clickLoadMore="clickLoadMore" :contentText="contentText" :status="status"></uni-load-more>
</view>
<view class="userlist">
<view class="item" v-for=" (n,index) in studentList" :key="index">
<view @click="checkThis(n)">
<image class="icon" v-if="n.checked"
:src="config.baseUrl_api+'/fs/static/member/dx_dwn.png'" />
<image class="icon" v-else :src="config.baseUrl_api+'/fs/static/member/dx.png'" />
</view>
<view>
<view class="name">{{n.name}} <text>{{n.perCode}}</text></view>
<view class="date">{{ cardType[n.idcType]?.text }}{{n.idcCode}}</view>
</view>
</view>
<view class="nodata" v-if="studentList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>无可变更会员</text>
</view>
</view>
<uni-load-more @clickLoadMore="clickLoadMore" :contentText="contentText" :status="status"></uni-load-more>
<view class="fixedBottom" v-if="studentList.length!=0">
<button class="btn-red" @click="handleImport">批量添加</button>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
<view class="fixedBottom" v-if="studentList.length!=0">
<button class="btn-red" @click="handleImport">批量添加</button>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
import * as api from '@/common/api.js'
import _ from 'lodash'
import config from '/config.js'
import _ from 'underscore'
import config from '/config.js'
const queryParams = ref({
paymentRangeId:-1,
multiDeptFlag: 1,
......@@ -50,53 +50,53 @@ const queryParams = ref({
pageNum:1,
pageSize:10
})
const paging = ref(null)
const paging = ref(null)
const total = ref(0)
const status = ref('no-more')
const list = ref([])
const popup = ref(null)
const choseStudent = ref(null)
const studentList = ref([])
const type = ref('')
const status = ref('no-more')
const list = ref([])
const popup = ref(null)
const choseStudent = ref(null)
const studentList = ref([])
const type = ref('')
const form = ref({})
const contentText = ref({contentdown: "点击加载更多",contentrefresh: "正在加载...",contentnomore: "没有更多数据了"})
const cardType = ref([{
text: '身份证',
value: '0'
},
{
text: '来往大陆(内地)通行证',
value: '1'
},
{
text: '中国护照',
value: '2'
},
{
text: '护照',
value: '3'
},
{
text: '其它',
value: '4'
},
{
text: '香港身份证',
value: '5'
},
{
text: '往来港澳台通行证',
value: '6'
}
])
onLoad((option) => {
const cardType = ref([{
text: '身份证',
value: '0'
},
{
text: '来往大陆(内地)通行证',
value: '1'
},
{
text: '中国护照',
value: '2'
},
{
text: '护照',
value: '3'
},
{
text: '其它',
value: '4'
},
{
text: '香港身份证',
value: '5'
},
{
text: '往来港澳台通行证',
value: '6'
}
])
onLoad((option) => {
if (option.rangeId) {
queryParams.value.paymentRangeId = option.rangeId
}
console.log(option.rangeId)
getList()
})
onShow(() => {})
getList()
})
onShow(() => {})
function clickLoadMore(){
getList()
}
......@@ -112,7 +112,7 @@ function search(){
}
uni.hideLoading()
})
}
}
function getList() {
if(total.value>0&&total.value>studentList.value.length){
uni.showLoading({
......@@ -134,87 +134,87 @@ function getList() {
}else if(total.value==0){
search()
}
}
function checkThis(n) {
if (n.checked) {
n.checked = false
} else {
n.checked = true
}
}
function handleImport() {
var arr = []
for (var n of studentList.value) {
if (n.checked) {
arr.push(n.perId)
}
}
api.addMergeToRange({
perIds: arr,
rangeIdStr: queryParams.value.paymentRangeId || '-1'
}).then(res => {
}
}
function checkThis(n) {
if (n.checked) {
n.checked = false
} else {
n.checked = true
}
}
function handleImport() {
var arr = []
for (var n of studentList.value) {
if (n.checked) {
arr.push(n.perId)
}
}
api.addMergeToRange({
perIds: arr,
rangeIdStr: queryParams.value.paymentRangeId || '-1'
}).then(res => {
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
prevPage.onShow(res.data)
uni.navigateBack()
})
}
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.flexbox {
padding: 30rpx 30rpx 0
}
.danger-button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
</script>
<style scoped lang="scss">
.flexbox {
padding: 30rpx 30rpx 0
}
.danger-button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.userlist{
padding: 0 25rpx;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
.popBody {
background: #fff;
padding: 30rpx;
}
.text-center .btn-red-kx {
border-radius: 50px;
font-size: 28rpx;
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
.popBody {
background: #fff;
padding: 30rpx;
}
.text-center .btn-red-kx {
border-radius: 50px;
font-size: 28rpx;
}
:deep(.file-picker__progress) {
opacity: 0;background-color: transparent;
}
}
</style>
\ No newline at end of file
......
<template>
<template>
<view>
<view class="text-center whitebg">
<view class="cardNav">
......@@ -6,9 +6,9 @@
<view @click="goMerge">合并</view>
<view class="active">提交</view>
</view>
</view>
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
</view>
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="vipData" v-show="total>0" style="flex-wrap: wrap;">
<view class="w50">费用合计:<text>{{ statistical.totalCost?.toFixed(2)}}</text></view>
<view class="w50">人数合计:<text>{{ statistical.personCount }}</text></view>
......@@ -16,125 +16,125 @@
<view class="w50">续费合计:<text>{{ statistical.oldPersonCount }}</text></view>
<view class="w50">年限合计:<text>{{ statistical.totalYear }}</text></view>
</view>
<view class="appList">
<view class="appItem" v-for="(item,index) in infoList" :key="index">
<view class="status" @click="goDetail(item)">
<view :class="{
<view class="appList">
<view class="appItem" v-for="(item,index) in infoList" :key="index">
<view class="status" @click="goDetail(item)">
<view :class="{
'text-primary':item.status=='0',
'text-success':item.status=='1',
'text-danger':item.status=='2',
'text-warning':item.status=='3'
'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.content?.commitTime">{{item.content.commitTime}}</view>
{{ item.auditStatus=='100'?'待提交':statusArr[item.status] }}
</view>
</view>
<view class="date" v-if="item.content?.commitTime">{{item.content.commitTime}}</view>
<view class="text-primary" v-if="item.content?.wfCode" @click="goDetail(item)">{{item.content?.wfCode}}</view>
<view class="name" style="width: 100%;" @click="goDetail(item)">{{item.content?.name}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
人数合计
<view>{{item.content.personCount}}</view>
</view>
<view>
续费
<view>{{item.content.oldPersonCount}}</view>
</view>
<view>
年限
<view>{{item.content.totalYear}}</view>
</view>
<view>
费用合计
<view>{{item.content.allFee}}</view>
</view>
</view>
<view class="name" style="width: 100%;" @click="goDetail(item)">{{item.content?.name}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
人数合计
<view>{{item.content.personCount}}</view>
</view>
<view>
续费
<view>{{item.content.oldPersonCount}}</view>
</view>
<view>
年限
<view>{{item.content.totalYear}}</view>
</view>
<view>
费用合计
<view>{{item.content.allFee}}</view>
</view>
</view>
<view class="func" v-if="item.auditStatus == 100">
<button @click="resolution(item)">取消合并</button>
<button @click="handleAudit(item)">提交</button>
<!-- <button v-if="item.lastIds?.slice(0, 1) != '-'" @click="resolution(item)">取消合并</button> -->
</view>
<view class="func" v-if="item.auditStatus == 1&& item.isView == 1">
<button @click="resolution(item)">取消合并</button>
<button @click="handleAudit(item)">提交</button>
<!-- <button v-if="item.lastIds?.slice(0, 1) != '-'" @click="resolution(item)">取消合并</button> -->
</view>
<view class="func" v-if="item.auditStatus == 1&& item.isView == 1">
<button @click="handleDelete(item)">撤回</button>
</view>
</view>
</view>
<view class="nodata" v-if="infoList.length==0">
</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 { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'underscore'
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10,
mergeFlag: 101,
statusFlag: 101
})
const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const current = ref()
const list = ref([])
statusFlag: 101
})
const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝'])
const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回']
const current = ref()
const list = ref([])
const infoList = ref([])
const statistical = 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
getList()
}
function onClickItem(e) {
console.log(e)
switch (e.currentIndex) {
case 0:
const statistical = 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
getList()
}
function onClickItem(e) {
console.log(e)
switch (e.currentIndex) {
case 0:
queryParams.value.mergeFlag = 101
queryParams.value.statusFlag = 101
break;
case 1:
queryParams.value.statusFlag = 101
break;
case 1:
queryParams.value.mergeFlag = 1
queryParams.value.status = 0
queryParams.value.statusFlag = 102
break;
case 2:
queryParams.value.statusFlag = 102
break;
case 2:
queryParams.value.mergeFlag = 1
queryParams.value.status = 1
queryParams.value.statusFlag = 103
break;
case 3:
queryParams.value.statusFlag = 103
break;
case 3:
queryParams.value.mergeFlag = 1
queryParams.value.status = 2
queryParams.value.statusFlag = 104
break;
}
getList()
}
function getList() {
uni.showLoading({
title: '加载中'
queryParams.value.statusFlag = 104
break;
}
getList()
}
function getList() {
uni.showLoading({
title: '加载中'
})
statistical.value = {
totalCost: 0,
......@@ -142,46 +142,46 @@
newPersonCount: 0,
oldPersonCount: 0,
totalYear: 0
}
api.getpaymentVerityMergeList(queryParams.value).then(response => {
infoList.value = response.rows
_.each(infoList.value, item => {
}
api.getpaymentVerityMergeList(queryParams.value).then(response => {
infoList.value = response.rows
_.each(infoList.value, item => {
item.content = JSON.parse(item.content)
statistical.value.totalCost += (item.content.allFee * 1)
statistical.value.personCount += (item.content.personCount * 1)
statistical.value.newPersonCount += (item.content.newPersonCount * 1)
statistical.value.oldPersonCount += (item.content.oldPersonCount * 1)
statistical.value.totalYear += (item.content.totalYear * 1)
})
statistical.value.totalYear += (item.content.totalYear * 1)
})
total.value = response.total
uni.hideLoading()
})
}
function handleAudit(item) {
uni.showModal({
title: '提示',
content: `确定提交${item.content.name}?`,
success: function(res) {
uni.hideLoading()
})
}
function handleAudit(item) {
uni.showModal({
title: '提示',
content: `确定提交${item.content.name}?`,
success: function(res) {
if (res.confirm) {
uni.showLoading({
title: '加载中'
})
api.doMergeFlowsPer({
})
api.doMergeFlowsPer({
recordIds: [item.recordId],
flag: '1',
reason: null
reason: null
}).then(res => {
uni.hideToast()
uni.showToast({
title: `操作成功!`
uni.hideToast()
uni.showToast({
title: `操作成功!`
})
getList()
})
}
}
})
getList()
})
}
}
})
}
function handleDelete(row) {
uni.showModal({
......@@ -198,7 +198,7 @@
}
}
})
}
}
function resolution(row) {
uni.showModal({
title: '提示',
......@@ -214,15 +214,15 @@
}
}
})
}
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
// 查看
let path = `/personalVip/auditDetail?form=${form}`
uni.navigateTo({
url: path
});
}
function goDetail(item) {
const form = encodeURIComponent(JSON.stringify(item))
// 查看
let path = `/personalVip/auditDetail?form=${form}`
uni.navigateTo({
url: path
});
}
function goAudit(){
let path = `/personalVip/audit`
......@@ -235,16 +235,16 @@
uni.redirectTo({
url: path
});
}
</script>
<style scoped>
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
}
</script>
<style scoped>
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
\ No newline at end of file
......
......@@ -59,7 +59,7 @@
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import _ from 'underscore'
import {
onMounted,
ref
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!