完成退款项目

This commit is contained in:
itgaojian163 2025-05-08 17:42:26 +08:00
parent 1d05f8ae3d
commit c62203c57f
18 changed files with 1715 additions and 94 deletions

View File

@ -24,7 +24,8 @@
"pages/mine/mineAccount/mineMsgNotice/mineMsgNotice",
"pages/copyright/refund/refund",
"pages/copyright/repair/repair",
"pages/copyright/applyRepair/applyRepair"
"pages/copyright/applyRepair/applyRepair",
"pages/copyright/applyRefund/applyRefund"
],
"window": {
"navigationBarTextStyle": "black",

View File

@ -232,8 +232,9 @@
.single-line-front {
white-space: nowrap;
overflow: hidden;
direction: rtl;
text-overflow: ellipsis;
direction: rtl;
text-align: left;
}
.multiple-3-ellipsis {

View File

@ -22,8 +22,10 @@ const apiPath = {
canProRepairList: '/api/proj/correction/apply/listpage-proj-unapply/self', //可以补正的项目列表
cancelProPepair: '/api/proj/correction/apply/cancel/self/{projCorrectionApplyId}', //取消补正
applyProRepair: '/api/proj/correction/apply/save', //申请补正
refundProList: '/api/proj/refund/apply/listpage/self', //我的退款项目
canRefundProList: '/api/proj/refund/apply/listpage-proj-unapply/self', //可以退款的项目
applyRefundPro: '/api/proj/refund/apply/save', //申请退款
cancelRefundPro: '/api/proj/refund/apply/cancel/self/{projRefundApplyId}', //取消申请退款
}
class ProjectService {
//首页介绍数量
@ -104,6 +106,22 @@ class ProjectService {
static doGetCanProRepairList(data) {
return request(apiPath.canProRepairList, "GET", data)
}
//退款项目列表
static doGetMineRefundProList(data) {
return request(apiPath.refundProList, "GET", data)
}
static doGetCanRefundProList(data) {
return request(apiPath.canRefundProList, "GET", data)
}
//取消申请退款
static doCancelRefundPro(id) {
const path = apiPath.cancelRefundPro.replace('{projRefundApplyId}', id)
return request(path, "PUT")
}
//提交申请退款
static doApplyRefundPro(data) {
return request(apiPath.applyRefundPro, "POST", data)
}
}
export default ProjectService;

View File

@ -0,0 +1,305 @@
// pages/copyright/applyRepair/applyRepair.js
import {
uploadImgUrl
} from '../../../net/http'
import ProApi from '../../../net/api/projectApi'
const Cache = require('../../../utils/storage')
const data = require('../../../utils/data')
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
imgAssets: app.globalData.imgAssetsUrl,
msgHint: '',
msgType: '',
msgShow: false,
selPro: null,
selType: null,
files: [],
proList: [],
tempSelPro: null,
typeList: data.kindList,
showSelPro: false,
showSelType: false,
tempSelType: null,
remark: '',
proKeywords: '',
proPageData: {
page: 1,
rows: 10,
keywords: ''
},
listRefreshTrig: false,
loadingState: 'loading',
hasMore: true,
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
wx.setNavigationBarTitle({
title: '退款申请',
})
wx.setNavigationBarColor({
frontColor: '#000000', // 必写项,字体颜色仅支持#ffffff和#000000
backgroundColor: '#F0F0F0', // 传递的颜色值,仅支持十六进制颜色
animation: { // 可选项
duration: 500,
timingFunc: 'easeIn'
}
})
this.setData({
selectFile: this.selectFile.bind(this),
uploadFile: this.uploadFile.bind(this)
})
//获取可以申请补正的列表
this.getCanRepairList(false)
},
inputKeywords(e) {
this.setData({
proKeywords: e.detail.value
})
},
clearSearch() {
this.setData({
proKeywords: ''
})
this.doRefreshList()
},
//搜索项目
doSearchKeyWord() {
this.doRefreshList()
},
doRefreshList() {
const _self = this
_self.setData({
listRefreshTrig: true,
loadingState: 'loading',
hasMore: true,
isLoadMore: false,
'proPageData.page': 1,
'proPageData.keywords': _self.data.proKeywords
})
_self.getCanRepairList(true)
},
doLoadMore() {
//判断是否正在加载中 与是否存在更多数据
const _self = this
if (_self.data.isLoadMore || !_self.data.hasMore) {
return
}
_self.setData({
isLoadMore: true,
'proPageData.page': ++_self.data.proPageData.page,
'proPageData.keywords': _self.data.proKeywords
})
_self.getCanRepairList(false)
},
//获取可以补正的项目列表
getCanRepairList(isRefresh) {
const _self = this
_self.setData({
proList: isRefresh ? [] : _self.data.proList,
loadingState: isRefresh ? 'loading' : ''
})
ProApi.doGetCanRefundProList(_self.data.proPageData)
.then(res => {
console.log(res)
var status = 'success'
status = res.rows && res.rows.length > 0 ? 'success' : 'empty'
_self.setData({
loadingState: isRefresh ? status : '',
proList: _self.data.proList.concat(res.rows),
listRefreshTrig: false,
isLoadMore: false
})
_self.setData({
hasMore: _self.data.proList.length < res.total
})
})
.catch(err => {
_self.setData({
loadingState: 'error',
listRefreshTrig: false,
isLoadMore: false,
hasMore: true
})
})
},
//显示补正软著选择
showSelProDialog() {
const _self = this
if (_self.data.proList.length <= 0) {
_self.getCanRepairList(true)
} else {
_self.setData({
showSelPro: true,
tempSelPro: _self.data.selPro
})
}
},
chooseType(e) {
this.setData({
tempSelType: e.currentTarget.dataset.value
})
},
choosePro(e) {
this.setData({
tempSelPro: e.currentTarget.dataset.value
})
},
//关闭补正软件选择
closeDialog(e) {
this.setData({
showSelPro: false,
showSelType: false
})
},
showSelTypeDialog() {
this.setData({
showSelType: true,
})
},
confirmSelType() {
this.setData({
showSelType: false,
selType: this.data.tempSelType,
tempSelType: null
})
},
//确定选择补正软著
confirmSelPro() {
this.setData({
showSelPro: false,
selPro: this.data.tempSelPro,
tempSelPro: null
})
},
inputRemark(e) {
this.setData({
remark: e.detail.value
})
},
deleteImage: function (e) {
var index = e.detail.index;
this.data.files.splice(index, 1);
},
previewImage(e) {
wx.previewImage({
current: e.currentTarget.id,
urls: this.data.files
})
},
selectFile(files) {
console.log('files', files)
},
uploadFile(files) {
console.log(files)
const tempFilePaths = files.tempFilePaths;
const token = Cache.get('token')
const header = {}
if (token) {
header.Auth = `Bearer ${token}`;
}
var that = this
for (let i = 0; i < tempFilePaths.length; i++) {
wx.uploadFile({
url: uploadImgUrl,
header: header,
filePath: tempFilePaths[i],
name: 'image',
success(res) {
console.log(res)
let result = JSON.parse(res.data)
that.data.files.push(result.data)
},
fail(err) {
console.log(err);
}
})
}
// 文件上传的函数返回一个promise
return new Promise((resolve, reject) => {
var result = {};
result['urls'] = tempFilePaths;
resolve(result);
})
},
//提交
doApply() {
const legal = this.checkParams()
if (legal) {
const _self = this
wx.showLoading({
title: '提交中...',
})
const ids = _self.data.files.map(item => item.fileId).join(',');
const data = {
projId: _self.data.selPro.projId,
refundReason: _self.data.remark,
refundVoucher: ids
}
ProApi.doApplyRefundPro(data)
.then(res => {
wx.hideLoading()
_self.setData({
msgHint: '提交成功,请耐心等待审核',
msgType: 'success',
msgShow: true
})
setTimeout(() => {
_self.backPageRefresh()
}, 2000);
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgHint: err.msg ? err.msg : '提交失败,请稍后重试',
msgType: 'error',
msgShow: true
})
})
}
},
//校验参数
checkParams() {
const _self = this
if (_self.data.selPro == null) {
_self.setData({
msgHint: '请选择退款软著',
msgType: 'error',
msgShow: true
})
return false
}
if (_self.data.remark == '') {
_self.setData({
msgHint: '请输入退款原因',
msgType: 'error',
msgShow: true
})
return false
}
if (_self.data.files.length <= 0) {
_self.setData({
msgHint: '请上传退款凭证',
msgType: 'error',
msgShow: true
})
return false
}
return true
},
backPageRefresh() {
const _self = this
let pages = getCurrentPages();
let beforePage = pages[pages.length - 2];
beforePage.doRefreshList()
wx.navigateBack()
}
})

View File

@ -0,0 +1,9 @@
{
"usingComponents": {
"mp-toptips": "weui-miniprogram/toptips/toptips",
"mp-half-screen-dialog": "weui-miniprogram/half-screen-dialog/half-screen-dialog",
"mp-uploader": "weui-miniprogram/uploader/uploader",
"container-loading": "/components/container-loading/container-loading",
"mp-loading": "weui-miniprogram/loading/loading"
}
}

View File

@ -0,0 +1,80 @@
<!--pages/copyright/applyRepair/applyRepair.wxml-->
<view class="page-container">
<swiper indicator-dots style="height: 120rpx;" autoplay indicator-active-color="#fff">
<swiper-item>
<image src="{{imgAssets}}/banner_1.png" style="width: 100vw;height: 120rpx;"></image>
</swiper-item>
<swiper-item>
<image src="{{imgAssets}}/banner_2.png" style="width: 100vw;height: 120rpx;"></image>
</swiper-item>
</swiper>
<view class="apply-box">
<text class="label">申请退款</text>
<view class="apply-item-row mt-20 ml-10">
<view class="apply-title star" style="align-self: center;">退款软著</view>
<view class="apply-content" bind:tap="showSelProDialog">
<view class="{{selPro == null? 'text-hint':'text-sel'}}">{{selPro==null? '选择需要退款的软著' :selPro.projName}}</view>
<view class="icon-arrow-down-line" style="width: 24rpx;height: 24rpx;margin:0rpx 20rpx;"></view>
</view>
</view>
<view class="apply-item-column mt-20 ml-10">
<view class="apply-title star">退款原因</view>
<textarea bindinput="inputRemark" value="{{remark}}" placeholder="请输入退款原因" placeholder-style="font-size:28rpx;color:var(--text-gray-hint-color)" class="reason-content mt-10"></textarea>
</view>
<view class="apply-item-column mt-20 ml-10">
<view class="apply-title star">退款凭证</view>
<view>
<mp-uploader max-count="4" delete="true" select="{{selectFile}}" upload="{{uploadFile}}" bind:delete="deleteImage" files="{{files}}" title=""></mp-uploader>
</view>
<view class="hint">
*上传完整的补正通知书或者完整的补正通知书的截图,要求右上方的流水号和右下方的补正通知书的日期都得完整显示
</view>
</view>
</view>
<view class="bottom-fixed-footer">
<view class="bottom-btn-green" bind:tap="doApply">提交</view>
</view>
</view>
<!-- 补正软著列表 -->
<mp-half-screen-dialog show="{{showSelPro}}" bindclose="closeDialog">
<view slot="title">
<view class="search-container">
<input class="search-input" value="{{proKeywords}}" bindinput="inputKeywords" bindconfirm="doSearchKeyWord" type="text" confirm-type="search" placeholder="请输入项目名称" />
<view wx:if="{{proKeywords !=''}}" bind:tap="clearSearch" class="icon-clear" style="width: 20px;height: 20px;"></view>
</view>
</view>
<view slot="desc">
<view style="height: 600rpx;">
<container-loading loadingState="{{loadingState}}" style="height: 600rpx;" bindrefresh="doRefreshList">
<scroll-view scroll-y="{{true}}" style="height: 600rpx;" bindrefresherrefresh="doRefreshList" refresher-enabled refresher-triggered="{{listRefreshTrig}}" bindscrolltolower="doLoadMore" lower-threshold='50'>
<view class="pro-list-box">
<radio-group>
<block wx:for="{{proList}}" wx:key="index">
<view class="pro-list-item" bind:tap="" data-value="{{item}}">
<radio class="custom-radio" style="margin-left: 5px;" checked="{{tempSelPro.projId==item.projId}}"></radio>
<view class="pro-list-item-left" bind:tap="choosePro" data-value="{{item}}">
<view class="pro-list-item-left-title">
<view class="pro-list-name">{{item.projName}}</view>
</view>
<view class="pro-list-item-left-footer">
<view class="pro-list-item-left-tag">{{item.applyContactName}}</view>
<view class="pro-list-item-left-tag">{{item.projContext}}</view>
<view class="pro-list-item-left-tag">{{item.gmtCreate}}</view>
</view>
</view>
</view>
</block>
</radio-group>
<mp-loading show="{{isLoadMore}}" type="circle"></mp-loading>
</view>
</scroll-view>
</container-loading>
</view>
</view>
<view slot="footer">
<view class="bottom-btn-green" bind:tap="confirmSelPro">确定</view>
</view>
</mp-half-screen-dialog>
<mp-toptips msg="{{msgHint}}" type="{{msgType}}" show="{{msgShow}}" :delay="2000"></mp-toptips>

View File

@ -0,0 +1,236 @@
/* pages/copyright/applyRepair/applyRepair.wxss */
.apply-box {
margin-top: 20rpx;
display: flex;
flex-direction: column;
padding: 30rpx;
background-color: var(--white-color);
border-radius: 5rpx;
}
.label {
font-size: 32rpx;
font-weight: bold;
}
.apply-item-row {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.apply-item-column {
display: flex;
flex-direction: column;
}
.apply-title {
font-size: 28rpx;
color: var(--text-color);
flex: 0.3;
}
.apply-content {
font-size: 28rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;
flex: 0.7;
}
.reason-content {
border-radius: 10rpx;
border: 1rpx solid var(--divider-color);
height: 120rpx;
font-size: 28rpx;
padding: 20rpx;
}
.text-hint {
color: var(--text-gray-hint-color);
}
.text-sel {
color: var(--text-color);
}
.hint {
margin-top: 10rpx;
font-size: 26rpx;
color: var(--red-color);
}
.pro-list-box {
display: flex;
flex-direction: column;
}
.pro-list-item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
background-color: var(--primary-color-light);
border-radius: 10rpx;
padding: 30rpx;
}
.pro-list-item:nth-of-type(n+2) {
margin-top: 20rpx;
}
.pro-list-item-left {
display: flex;
flex-direction: column;
flex: 1;
margin-left: 30rpx;
}
.pro-list-item-left-title {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.pro-list-item-left-footer {
display: flex;
flex-direction: row;
justify-content: space-between;
margin-top: 20rpx;
}
.pro-list-item-left-count {
font-size: 24rpx;
color: var(--text-color);
flex-wrap: nowrap;
margin-top: 4rpx;
}
.pro-list-item-left-tag {
font-size: 24rpx;
color: var(--text-color);
}
.pro-list-name {
font-size: 26rpx;
font-weight: bold;
flex: 1;
}
.search-container {
position: relative;
align-self: center;
border-radius: 5px;
background-color: var(--bg-gray-color);
padding: 5px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 100%;
}
.search-input {
box-sizing: border-box;
color: var(--text-color);
font-size: 28rpx;
text-align: center;
flex: 1;
}
.search-input::after {
content: '';
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
margin-top: -1px;
background-size: cover;
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iMTQiIGhlaWdodD0iMTkiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTkwOS42IDg1NC41TDY0OS45IDU5NC44QzY5MC4yIDU0Mi43IDcxMiA0NzkgNzEyIDQxMmMwLTgwLjItMzEuMy0xNTUuNC04Ny45LTIxMi4xLTU2LjYtNTYuNy0xMzItODcuOS0yMTIuMS04Ny45cy0xNTUuNSAzMS4zLTIxMi4xIDg3LjlDMTQzLjIgMjU2LjUgMTEyIDMzMS44IDExMiA0MTJjMCA4MC4xIDMxLjMgMTU1LjUgODcuOSAyMTIuMUMyNTYuNSA2ODAuOCAzMzEuOCA3MTIgNDEyIDcxMmM2NyAwIDEzMC42LTIxLjggMTgyLjctNjJsMjU5LjcgMjU5LjZhOC4yIDguMiAwIDAgMCAxMS42IDBsNDMuNi00My41YTguMiA4LjIgMCAwIDAgMC0xMS42ek01NzAuNCA1NzAuNEM1MjggNjEyLjcgNDcxLjggNjM2IDQxMiA2MzZzLTExNi0yMy4zLTE1OC40LTY1LjZDMjExLjMgNTI4IDE4OCA0NzEuOCAxODggNDEyczIzLjMtMTE2LjEgNjUuNi0xNTguNEMyOTYgMjExLjMgMzUyLjIgMTg4IDQxMiAxODhzMTE2LjEgMjMuMiAxNTguNCA2NS42UzYzNiAzNTIuMiA2MzYgNDEycy0yMy4zIDExNi4xLTY1LjYgMTU4LjR6IiBmaWxsPSJyZ2JhKDIwNCwyMDQsMjA0LDEpIj48L3BhdGg+CiAgICA8L2c+CiAgPC9zdmc+');
}
/* 上传图片 */
.weui-uploader {
margin-top: 10rpx;
width: 100%;
}
.weui-uploader__bd {
display: flex;
flex-direction: row;
margin-bottom: 0;
}
.weui-uploader__hd {
display: none;
}
.weui-uploader__input-box {
width: 65px;
height: 65px;
border-radius: 5px;
}
.weui-uploader__file {
width: 65px;
height: 65px;
border-radius: 5px;
}
.weui-uploader__img {
border-radius: 5px;
}
.weui-uploader__overview {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 65vw;
}
.weui-uploader__input-box {
background: white;
border: 1px solid var(--divider-color);
}
/* 未选中状态 */
.custom-radio .wx-radio-input {
border-color: var(--primary-color);
/* 自定义未选中时的边框颜色 */
background-color: transparent;
width: 32rpx;
height: 32rpx;
}
/* 选中状态 */
.custom-radio .wx-radio-input.wx-radio-input-checked {
border-color: var(--primary-color);
/* 自定义选中时的边框颜色 */
background: linear-gradient(to right, var(--primary-color), var(--primary-color-light));
/* 自定义选中时的背景颜色 */
}
/* 选中状态下的内部圆圈 */
.custom-radio .wx-radio-input.wx-radio-input-checked::before {
color: #fff;
/* 自定义选中时内部圆圈的颜色 */
}
.weui-half-screen-dialog__bd {
padding-bottom: 40rpx;
}
.weui-half-screen-dialog__ft {
padding: 0rpx 0rpx 20rpx;
}
.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main {
padding: 0 46rpx;
}

View File

@ -1,66 +1,306 @@
// pages/copyright/refund/refund.js
import ProApi from '../../../net/api/projectApi'
import {
previewUrl
} from '../../../net/http'
const app = getApp()
const jsonData = require('../../../utils/data')
const Cache = require('../../../utils/storage')
Page({
/**
* 页面的初始数据
*/
data: {
/**
* 页面的初始数据
*/
data: {
pageData: {
page: 1,
rows: 10,
applyStatus: '', //状态
projName: '' //项目名称
},
keywords: '',
stateList: jsonData.stateList,
selectState: '',
msgHint: '',
msgType: 'error',
msgShow: false,
loadingState: 'loading',
listRefreshTrig: false,
isLoadMore: false,
hasMore: true,
refundList: [],
slideBtns: app.globalData.cancelEditBtns,
showHint: false,
buttons: [{
text: '关闭'
}],
tempItem: null,
},
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
wx.setNavigationBarTitle({
title: '退款项目',
})
wx.setNavigationBarColor({
frontColor: '#000000', // 必写项,字体颜色仅支持#ffffff和#000000
backgroundColor: '#F0F0F0', // 传递的颜色值,仅支持十六进制颜色
animation: { // 可选项
duration: 500,
timingFunc: 'easeIn'
}
})
this.getRefundList(true)
},
//去退款
applyRefund() {
wx.navigateTo({
url: '/pages/copyright/applyRefund/applyRefund',
})
},
inputKeywords(e) {
this.setData({
keywords: e.detail.value
})
},
clearSearch() {
this.setData({
keywords: ''
})
this.doRefreshList()
},
doSearchKeyWord() {
this.doRefreshList()
},
chooseState(e) {
const value = e.currentTarget.dataset.value
this.setData({
selectState: value == this.data.selectState ? '' : value
})
this.doRefreshList()
},
doRefreshList() {
console.log('正在刷新...')
const _self = this
_self.setData({
listRefreshTrig: true,
loadingState: 'loading',
hasMore: true,
'pageData.page': 1,
'pageData.projName': _self.data.keywords,
'pageData.applyStatus': _self.data.selectState,
isLoadMore: false
})
_self.getRefundList(true)
},
doLoadMore() {
//判断是否正在加载中 与是否存在更多数据
const _self = this
if (_self.data.isLoadMore || !_self.data.hasMore) {
return
}
_self.setData({
isLoadMore: true,
'pageData.page': ++_self.data.pageData.page,
'pageData.projName': _self.data.keywords,
'pageData.applyStatus': _self.data.selectState,
})
_self.getRefundList(false)
},
getRefundList(isRefresh) {
const _self = this
_self.setData({
refundList: isRefresh ? [] : _self.data.refundList,
loadingState: isRefresh ? 'loading' : ''
})
ProApi.doGetMineRefundProList(_self.data.pageData)
.then(res => {
console.log(res)
var status = 'success'
status = res.rows && res.rows.length > 0 ? 'success' : 'empty'
_self.setData({
loadingState: isRefresh ? status : '',
refundList: _self.data.refundList.concat(res.rows),
listRefreshTrig: false,
isLoadMore: false
})
_self.setData({
hasMore: _self.data.refundList.length < res.total
})
}, err => {
_self.setData({
loadingState: 'error',
listRefreshTrig: false,
isLoadMore: false,
hasMore: true
})
})
},
show(e) {
console.log('显示', e)
//判断状态
const _self = this
const value = e.currentTarget.dataset.value
const id = e.currentTarget.id
if (value.applyStatus != 'PENDING') {
//通过 或 取消 后不能撤销
const item = _self.selectComponent(`#${id}`)
if (item) {
item.setData({
show: false
})
}
}
},
slideButtonTap(e) {
const index = e.detail.index
const item = e.currentTarget.dataset.value
console.log(e)
if (index == 0) {
//取消
this.showCancel(item)
}
},
showCancel(item) {
const _self = this
wx.showModal({
title: '警告',
content: '您确定要撤销申请吗?',
complete: (res) => {
if (res.confirm) {
_self.doCancel(item)
}
}
})
},
doCancel(item) {
const _self = this
wx.showLoading({
title: '取消中...',
})
ProApi.doCancelRefundPro(item.projRefundApplyId)
.then(res => {
wx.hideLoading()
_self.setData({
msgType: 'success',
msgHint: '撤销成功',
msgShow: true
})
_self.doRefreshList()
})
.catch(err => {
wx.hideLoading()
_self.setData({
msgType: 'error',
msgHint: err.msg ? err.msg : '撤销失败,请稍后重试',
msgShow: true
})
})
},
showReason(e) {
const item = e.currentTarget.dataset.value
item.refundVoucherFileKVs.map(value => {
value.url = previewUrl + value.key
return value
})
const _self = this
_self.setData({
tempItem: item,
showHint: true
})
},
closeHint(e) {
this.setData({
showHint: false,
tempItem: null
})
},
previewImg(e) {
const _self = this
const current = e.currentTarget.dataset.value
//判断是pdf还是图片
if (current.value.toLowerCase().endsWith('.pdf')) {
//文件,下载文件
_self.doDownloadApprovePdf(current)
} else {
//图片
const urls = [current.url]
wx.previewImage({
urls: urls,
})
}
},
doDownloadApprovePdf(item) {
const _self = this
_self.setData({
showHint: false
})
wx.showLoading({
title: '加载中...',
})
const token = Cache.get('token')
const header = {}
if (token) {
header.Auth = `Bearer ${token}`;
}
wx.downloadFile({
url: item.url,
header: header,
success: res => {
wx.hideLoading()
if (res.statusCode === 200) {
// 从响应头中获取文件名
let fileName = item.value;
if (fileName) {
// 保存文件时使用获取到的文件名
wx.getFileSystemManager().saveFile({
tempFilePath: res.tempFilePath,
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
success: function (res) {
const savedFilePath = res.savedFilePath;
console.log('文件下载并保存成功', savedFilePath);
if (savedFilePath.endsWith(".txt")) {
wx.navigateTo({
url: '/pages/readTxt/readTxt?filePath=' + savedFilePath,
})
} else {
wx.openDocument({
filePath: savedFilePath,
showMenu: true
})
}
},
fail: function (err) {
console.error('文件保存失败', err);
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
})
} else {
console.error('未从响应头中获取到文件名');
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
} else {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
}
},
fail: err => {
_self.showErr('很抱歉,文件下载出现问题。建议您稍作等待,之后再尝试下载。')
console.log(`下载失败${err}`)
}
})
},
//显示错误信息
showErr(msg) {
const _self = this
_self.setData({
msgHint: msg,
msgType: 'error',
msgShow: true,
showDownloadDialog: false,
downloading: false,
downloadProgress: 0
})
}
})

View File

@ -1,3 +1,9 @@
{
"usingComponents": {}
"usingComponents": {
"mp-loading": "weui-miniprogram/loading/loading",
"container-loading": "/components/container-loading/container-loading",
"mp-toptips": "weui-miniprogram/toptips/toptips",
"mp-dialog": "weui-miniprogram/dialog/dialog",
"mp-slideview": "weui-miniprogram/slideview/slideview"
}
}

View File

@ -1,2 +1,73 @@
<!--pages/copyright/refund/refund.wxml-->
<text>pages/copyright/refund/refund.wxml</text>
<view class="page-container">
<view class="search-box">
<view class="search-input-box">
<view class="search-container">
<input class="search-input" value="{{keywords}}" bindinput="inputKeywords" bindconfirm="doSearchKeyWord" type="text" confirm-type="search" placeholder="请输入项目名称" />
<view wx:if="{{keywords !=''}}" bind:tap="clearSearch" class="icon-clear" style="width: 20px;height: 20px;"></view>
</view>
<view class="add-btn" bind:tap="applyRefund">申请退款</view>
</view>
<!-- 条件 -->
<view class="options-list-box">
<block wx:for="{{stateList}}" wx:key="index">
<view class="{{selectState==item.value ? 'options-tab-select':'options-tab-normal'}}" data-value="{{item.value}}" bind:tap="chooseState">{{item.title}}</view>
</block>
</view>
</view>
<view class="content-container">
<container-loading loadingState="{{loadingState}}" style="height: 82vh;" bindrefresh="doRefreshList">
<scroll-view scroll-y="{{true}}" style="height: 82vh;padding-bottom: 40px;" bindrefresherrefresh="doRefreshList" refresher-enabled refresher-triggered="{{listRefreshTrig}}" bindscrolltolower="doLoadMore" lower-threshold='30'>
<view class="repair-list-box">
<block wx:for="{{refundList}}" wx:key="index">
<mp-slideview id="mp-slide-{{index}}" buttons="{{slideBtns}}" icon="{{true}}" data-value="{{item}}" bindshow="show" bindbuttontap="slideButtonTap" class="{{index > 0 ? 'mt-20':''}}">
<view class="repair-list-item">
<view class="repair-item-title-box" data-value="{{item}}" bind:tap="showReason">
<view class="repair-title-box">
<view class="{{tools.repairStatusColor(item.applyStatus)}} repair-status-content">{{tools.repairStatus(item.applyStatus)}}</view>
</view>
<view class="repair-title-apply-time">{{item.gmtCreate}}</view>
</view>
<view class="divider-v mt-20"></view>
<view class="repair-name-box mt-10" data-value="{{item}}" bind:tap="showReason">
<view class="repair-title-content">{{item.projName}}</view>
</view>
<view data-value="{{item}}" bind:tap="showReason" class="repair-reason-desc multiple-2-ellipsis">{{item.refundReason}}</view>
<view class="repair-footer-box">
<view class="repair-attr-box" data-value="{{item}}" bind:tap="showReason">
<view class="repair-attr-item">{{item.userInfoName}}</view>
<rich-text style="color:var(--red-color);font-weight: bold;" nodes="{{tools.moneyTxt(10,item.projPayment/100)}}"></rich-text>
</view>
</view>
</view>
</mp-slideview>
</block>
<mp-loading show="{{isLoadMore}}" type="circle"></mp-loading>
</view>
</scroll-view>
</container-loading>
</view>
</view>
<mp-dialog show="{{showHint}}" buttons="{{buttons}}" bindbuttontap="closeHint">
<view class="approve-box">
<view class="approve-title">退款原因</view>
<view class="approve-content mt-10">{{tempItem.refundReason}}</view>
<view class="approve-title mt-10">退款凭证</view>
<view class="approve-img-box mt-10">
<block wx:for="{{tempItem.refundVoucherFileKVs}}" wx:key="index">
<view class="approve-img-item single-line" bind:tap="previewImg" data-value="{{item}}">
{{item.value}}
</view>
</block>
</view>
<view wx:if="{{tempItem.gmtReview !=''}}" class="approve-content-box">
<view class="approve-title mt-10">审核时间</view>
<view class="approve-content mt-10">{{tempItem.gmtReview}}</view>
<view class="approve-title mt-10">审核意见</view>
<view class="approve-content mt-10">{{tempItem.reviewReason}}</view>
</view>
</view>
</mp-dialog>
<!-- 下载dialog -->
<mp-toptips msg="{{msgHint}}" type="{{msgType}}" show="{{msgShow}}" :delay="2000"></mp-toptips>
<wxs src="../../../utils/comm.wxs" module="tools"></wxs>

View File

@ -1 +1,640 @@
/* pages/copyright/refund/refund.wxss */
.ic-user {
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzQzOTg4MzkwNjkwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM0MDkiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTUxMiAxMDI0QzIyOS4yMDUzMzMgMTAyNCAwIDc5NC43OTQ2NjcgMCA1MTJTMjI5LjIwNTMzMyAwIDUxMiAwczUxMiAyMjkuMjA1MzMzIDUxMiA1MTItMjI5LjIwNTMzMyA1MTItNTEyIDUxMnogbTAtNDk2LjQ2OTMzM2ExNzAuNjY2NjY3IDE3MC42NjY2NjcgMCAxIDAgMC0zNDEuMzMzMzM0IDE3MC42NjY2NjcgMTcwLjY2NjY2NyAwIDAgMCAwIDM0MS4zMzMzMzR6IG0yNjMuNzY1MzMzIDI2My43MjI2NjZhMjYzLjc2NTMzMyAyNjMuNzY1MzMzIDAgMSAwLTUyNy41MzA2NjYgMGg1MjcuNTMwNjY2eiIgcC1pZD0iMzQxMCIgZmlsbD0iIzEyOTZkYiI+PC9wYXRoPjwvc3ZnPg==');
background-size: cover;
background-repeat: no-repeat;
}
.search-box {
position: fixed;
top: 0;
left: 0;
display: flex;
flex-direction: column;
box-sizing: border-box;
width: 100%;
padding: 20rpx 30rpx 0rpx 30rpx;
}
.search-input-box {
display: flex;
flex-direction: row;
align-items: center;
}
.search-container {
position: relative;
align-self: center;
border-radius: 5px;
background-color: var(--white-color);
padding: 5px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex: 1;
}
.search-input {
box-sizing: border-box;
color: var(--text-color);
font-size: 28rpx;
text-align: center;
flex: 1;
}
.search-input::after {
content: '';
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
margin-top: -1px;
background-size: cover;
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iMTQiIGhlaWdodD0iMTkiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTkwOS42IDg1NC41TDY0OS45IDU5NC44QzY5MC4yIDU0Mi43IDcxMiA0NzkgNzEyIDQxMmMwLTgwLjItMzEuMy0xNTUuNC04Ny45LTIxMi4xLTU2LjYtNTYuNy0xMzItODcuOS0yMTIuMS04Ny45cy0xNTUuNSAzMS4zLTIxMi4xIDg3LjlDMTQzLjIgMjU2LjUgMTEyIDMzMS44IDExMiA0MTJjMCA4MC4xIDMxLjMgMTU1LjUgODcuOSAyMTIuMUMyNTYuNSA2ODAuOCAzMzEuOCA3MTIgNDEyIDcxMmM2NyAwIDEzMC42LTIxLjggMTgyLjctNjJsMjU5LjcgMjU5LjZhOC4yIDguMiAwIDAgMCAxMS42IDBsNDMuNi00My41YTguMiA4LjIgMCAwIDAgMC0xMS42ek01NzAuNCA1NzAuNEM1MjggNjEyLjcgNDcxLjggNjM2IDQxMiA2MzZzLTExNi0yMy4zLTE1OC40LTY1LjZDMjExLjMgNTI4IDE4OCA0NzEuOCAxODggNDEyczIzLjMtMTE2LjEgNjUuNi0xNTguNEMyOTYgMjExLjMgMzUyLjIgMTg4IDQxMiAxODhzMTE2LjEgMjMuMiAxNTguNCA2NS42UzYzNiAzNTIuMiA2MzYgNDEycy0yMy4zIDExNi4xLTY1LjYgMTU4LjR6IiBmaWxsPSJyZ2JhKDIwNCwyMDQsMjA0LDEpIj48L3BhdGg+CiAgICA8L2c+CiAgPC9zdmc+');
}
.options-list-box {
display: flex;
flex-direction: row;
justify-content: space-between;
padding-top: 30rpx;
flex-wrap: nowrap;
}
.options-tab-select {
white-space: nowrap;
line-height: 17px;
border-radius: 2px;
border: 1rpx solid var(--primary-color-light);
background-color: var(--primary-color-light);
color: var(--text-brown-color);
font-size: 12px;
text-align: center;
padding: 2px 8px;
}
.options-tab-normal {
line-height: 17px;
border-radius: 2px;
border: 1rpx solid transparent;
color: rgba(154, 154, 154, 1);
font-size: 12px;
text-align: center;
white-space: nowrap;
padding: 2px 8px;
}
.add-btn {
border-radius: 8rpx;
background-color: var(--btn-green-color);
color: rgba(255, 255, 255, 1);
font-size: 28rpx;
text-align: center;
height: 50rpx;
margin-left: 20rpx;
line-height: 50rpx;
font-family: PingFangSC-regular;
padding: 5rpx 10rpx;
}
.add-btn:active {
background-color: var(--btn-green-color-active);
}
.content-container {
height: 82vh;
margin-top: 80px;
}
.bottom-btn {
position: fixed;
bottom: 40rpx;
left: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 100%;
}
.repair-list-box {
display: flex;
flex-direction: column;
}
.repair-list-item {
display: flex;
flex-direction: column;
background-color: var(--white-color);
padding: 20rpx;
border-radius: 8rpx;
}
.repair-list-item:nth-of-type(n+2) {
margin-top: 20rpx;
}
.repair-item-title-box {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.repair-title-box {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 28rpx;
}
.repair-name-box {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.repair-title-content {
font-size: 28rpx;
font-weight: bold;
}
.repair-reason-desc {
margin-top: 10rpx;
font-size: 24rpx;
color: var(--text-gray-desc-color);
}
.repair-footer-box {
margin-top: 20rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: flex-end;
}
.repair-attr-box {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: baseline;
width: 100%;
}
.repair-attr-item {
font-size: 24rpx;
color: var(--text-brown-color);
background-color: var(--divider-color);
padding: 5rpx 15rpx;
border-radius: 5rpx;
line-height: 40rpx;
height: 40rpx;
text-align: center;
}
.repair-attr-item:nth-of-type(n+2) {
margin-left: 10rpx;
}
.repair-title-apply-time {
font-size: 22rpx;
color: var(--text-gray-hint-color);
}
.repair-status-green {
background-color: var(--bg-green-color);
}
.repair-status-red {
background-color: var(--bg-red-color);
}
.repair-status-yellow {
background-color: var(--primary-color);
}
.repair-status-content {
padding: 2rpx 10rpx;
font-size: 22rpx;
border-radius: 5rpx;
height: 30rpx;
line-height: 30rpx;
text-align: center;
color: var(--text-color);
}
.repair-status-gray {
background-color: var(--bg-gray-deep-color);
}
.order-item {
display: flex;
flex-direction: column;
background-color: white;
border-radius: 10rpx;
padding: 10rpx 20rpx;
}
.record-title-box {
display: flex;
flex-direction: row;
}
.record-options {
display: flex;
flex-direction: row;
}
.options-btn {
font-size: 24rpx;
line-height: 24rpx;
height: 24rpx;
padding: 10rpx 20rpx;
border-radius: 5rpx;
background-color: var(--btn-green-color);
color: var(--white-color);
}
.options-btn:active {
background-color: var(--btn-green-color-active);
}
.red:active {
background-color: var(--red-color);
}
.record-title-status {
font-size: 20rpx;
line-height: 24rpx;
height: 24rpx;
margin-top: 8rpx;
text-align: center;
padding: 5rpx;
min-width: 80rpx;
border-radius: 5rpx;
margin-right: 15rpx;
}
.approve-box {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.approve-title {
font-size: 28rpx;
color: var(--text-color);
font-weight: bold;
}
.approve-content-box {
margin-top: 10rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
}
.approve-img-box {
display: flex;
flex-direction: column;
margin-top: 15rpx;
box-sizing: border-box;
width: 100%;
}
.approve-img-item {
font-size: 24rpx;
border-radius: 5rpx;
padding: 10rpx;
text-align: left;
background-color: var(--gray-bg-color);
width: 100%;
margin: 10rpx;
box-sizing: border-box;
}
.approve-img-item:nth-of-type(n+2) {
margin-top: 10rpx;
}
.approve-content {
font-size: 24rpx;
margin-left: 20rpx;
text-align: left;
color: var(--text-gray-desc-color);
}
.approve-hint {
margin-top: 20rpx;
font-size: 24rpx;
color: var(--text-gray-hint-color);
}
.col-yellow {
background-color: var(--primary-color);
color: var(--text-color);
}
.col-gray {
background-color: var(--bg-gray-deep-color);
color: var(--text-gray-desc-color);
}
.col-green {
background-color: var(--bg-green-color);
color: #006400;
}
.col-red {
background-color: var(--bg-red-color);
color: #8b0000;
}
.record-title-name {
font-size: 32rpx;
color: var(--text-color);
font-weight: bold;
flex: 1;
}
.record-number {
font-size: 24rpx;
color: var(--text-gray-desc-color);
margin-left: 10rpx;
}
.record-time {
display: flex;
flex-direction: row;
align-items: center;
font-size: 24rpx;
}
.record-bottom-box {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.icon-time::before {
content: '';
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzQ1ODEyODg5NzI5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM2MTgwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01MTMgMzMuMjJjLTI2NS4xIDAtNDgwIDIxNC45LTQ4MCA0ODBzMjE0LjkgNDgwIDQ4MCA0ODAgNDgwLTIxNC45IDQ4MC00ODAtMjE0LjktNDgwLTQ4MC00ODB6IG0yMDguOSA2NTIuNTljLTExLjA1IDE5LjEzLTM1LjUxIDI1LjY5LTU0LjY0IDE0LjY0TDQ3NC4xIDU4OC45M2MtMTMuMDYtNy41NC0yMC4yNi0yMS4zNC0xOS45OS0zNS40MiAwLTAuMTctMC4wMS0wLjM0LTAuMDEtMC41MVYzMjkuOTVjMC0yMi4wOSAxNy45MS00MCA0MC00MHM0MCAxNy45MSA0MCA0MHYyMDEuMjNsMTczLjE3IDk5Ljk4YzE5LjEyIDExLjA1IDI1LjY4IDM1LjUxIDE0LjYzIDU0LjY1eiIgZmlsbD0iI2RiZGJkYiIgcC1pZD0iMzYxODEiPjwvcGF0aD48L3N2Zz4=');
background-size: cover;
width: 28rpx;
height: 28rpx;
display: flex;
flex-direction: row;
margin-right: 10rpx;
}
.order-item:nth-of-type(n+2) {
margin-top: 15px;
}
.contact-desc {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 15px;
align-items: center;
}
.contact-icon {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.name {
line-height: 23rpx;
color: var(--text-color);
font-size: 32rpx;
text-align: left;
font-weight: bold;
font-family: SourceHanSansSC-black;
}
.service-desc {
padding: 0px 15px 15px 15px;
line-height: 20px;
color: var(--text-color);
font-size: 14px;
text-align: left;
font-family: SourceHanSansSC-regular;
}
.edit {
line-height: 20px;
border-radius: 4px;
background-color: var(--btn-green-color);
color: rgba(255, 255, 255, 1);
font-size: 28rpx;
text-align: center;
font-family: PingFangSC-regular;
padding: 5rpx 10rpx;
}
.del {
line-height: 20px;
border-radius: 4px;
background-color: var(--btn-red-color);
color: rgba(255, 255, 255, 1);
font-size: 28rpx;
text-align: center;
font-family: PingFangSC-regular;
padding: 5rpx 10rpx;
margin-left: 5px;
}
.del:active {
background-color: var(--btn-red-color-active);
}
.options-box {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.edit:active {
background-color: var(--btn-green-color-active);
}
.form-box {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
font-size: 14px;
width: 100vw;
}
.form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
width: 80vw;
padding: 10px;
}
.form-item-title {
flex: .3;
font-size: 14px;
color: var(--text-color);
font-weight: 500;
text-align: left;
}
.form-item-title:not(.no-after)::before {
content: "*";
color: var(--red-color);
font-size: 14px;
margin-left: 1px;
text-align: center;
}
.form-item-content {
flex: 1;
text-align: right;
}
.confirm-btn {
background-color: var(--btn-green-color);
color: white;
font-size: 16px;
height: 70rpx;
line-height: 70rpx;
border-radius: 5px;
text-align: center;
width: 85vw !important;
}
.confirm-btn:active {
background-color: var(--btn-green-color-active);
color: white;
}
.weui-half-screen-dialog__ft {
padding: 0rpx 0rpx 40rpx;
}
.weui-half-screen-dialog__bd {
padding-bottom: 40rpx;
}
.weui-dialog__hd {
padding: 30rpx;
}
.download-item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 10px;
background-color: var(--white-color);
border-radius: 5px;
height: 80px;
}
.download-item:nth-of-type(n+2) {
margin-top: 10px;
}
.download-item:last-child {
margin-bottom: 80px;
}
.download-title {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 10px;
width: 75px;
}
.download-title-txt {
font-size: 16px;
font-weight: bold;
margin-top: 10px;
}
.download-btn-box {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
height: 70px;
flex: .6;
}
.download-btn {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
color: var(--text-color);
padding: 5px 10px;
border-radius: 5px;
border: 1px solid var(--divider-color);
width: 105px;
}
.download-btn-txt {
font-size: 12px;
text-align: center;
}
.download-btn:active {
background-color: var(--divider-color);
}
.icon-table {
content: "";
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgc3R5bGU9IiIgZmlsdGVyPSJub25lIj4KICAgIAogICAgPGc+CiAgICA8cGF0aCBkPSJNMTYgMjFoLTR2Mmg0di0yek0xNyAyMWg0djJoLTR2LTJ6TTE2IDI2aC00di0yaDR2MnpNMTcgMjZoNHYtMmgtNHYyek0xNiAxOGgtNHYyaDR2LTJ6TTE3IDE4aDR2MmgtNHYtMnpNMTYgMTVoLTR2Mmg0di0yek0xNyAxNWg0djJoLTR2LTJ6TTE5IDN2Ni4wMDJjMCAxLjExMSAwLjg5OCAxLjk5OCAyLjAwNiAxLjk5OGg0Ljk5NHYxNy4wMDNjMCAxLjEwNy0wLjg5NCAxLjk5Ny0xLjk5NyAxLjk5N2gtMTUuMDA1Yy0xLjEwNyAwLTEuOTk3LTAuODk5LTEuOTk3LTIuMDA3di0yMi45ODVjMC0xLjEwOSAwLjg5OS0yLjAwNyAyLjAwOS0yLjAwN2g5Ljk5MXpNMjAgM3Y1Ljk5N2MwIDAuNTU0IDAuNDUxIDEuMDAzIDAuOTkxIDEuMDAzaDUuMDA5bC02LTd6TTExIDEzdjE0aDExdi0xNGgtMTF6IiBmaWxsPSJyZ2JhKDI1NSwxNjksMCwxKSI+PC9wYXRoPgogICAgPC9nPgogIDwvc3ZnPg==');
background-size: cover;
background-repeat: no-repeat;
width: 48px;
height: 48px;
}
.icon-tool {
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iNTIiIGhlaWdodD0iNTIiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTg4MCAxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNNTEzLjEgNTE4LjFsLTE5MiAxNjFjLTUuMiA0LjQtMTMuMS43LTEzLjEtNi4xdi02Mi43YzAtMi4zIDEuMS00LjYgMi45LTYuMUw0MjAuNyA1MTJsLTEwOS44LTkyLjJhNy42MyA3LjYzIDAgMCAxLTIuOS02LjFWMzUxYzAtNi44IDcuOS0xMC41IDEzLjEtNi4xbDE5MiAxNjAuOWMzLjkgMy4yIDMuOSA5LjEgMCAxMi4zek03MTYgNjczYzAgNC40LTMuNCA4LTcuNSA4aC0xODVjLTQuMSAwLTcuNS0zLjYtNy41LTh2LTQ4YzAtNC40IDMuNC04IDcuNS04aDE4NWM0LjEgMCA3LjUgMy42IDcuNSA4djQ4eiIgZmlsbD0icmdiYSg1MiwxMjQsMTc1LDEpIj48L3BhdGg+CiAgICA8L2c+CiAgPC9zdmc+');
background-size: cover;
background-repeat: no-repeat;
width: 42px;
height: 42px;
}
.icon-source {
background-image: url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSI2NCA2NCA4OTYgODk2IiB3aWR0aD0iNTIiIGhlaWdodD0iNTIiIHN0eWxlPSIiIGZpbHRlcj0ibm9uZSI+CiAgICAKICAgIDxnPgogICAgPHBhdGggZD0iTTkyOCAxNjFINjk5LjJjLTQ5LjEgMC05Ny4xIDE0LjEtMTM4LjQgNDAuN0w1MTIgMjMzbC00OC44LTMxLjNBMjU1LjIgMjU1LjIgMCAwIDAgMzI0LjggMTYxSDk2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1NjhjMCAxNy43IDE0LjMgMzIgMzIgMzJoMjI4LjhjNDkuMSAwIDk3LjEgMTQuMSAxMzguNCA0MC43bDQ0LjQgMjguNmMxLjMuOCAyLjggMS4zIDQuMyAxLjNzMy0uNCA0LjMtMS4zbDQ0LjQtMjguNkM2MDIgODA3LjEgNjUwLjEgNzkzIDY5OS4yIDc5M0g5MjhjMTcuNyAwIDMyLTE0LjMgMzItMzJWMTkzYzAtMTcuNy0xNC4zLTMyLTMyLTMyek00MDQgNTUzLjVjMCA0LjEtMy4yIDcuNS03LjEgNy41SDIxMS4xYy0zLjkgMC03LjEtMy40LTcuMS03LjV2LTQ1YzAtNC4xIDMuMi03LjUgNy4xLTcuNWgxODUuN2MzLjkgMCA3LjEgMy40IDcuMSA3LjV2NDV6bTAtMTQwYzAgNC4xLTMuMiA3LjUtNy4xIDcuNUgyMTEuMWMtMy45IDAtNy4xLTMuNC03LjEtNy41di00NWMwLTQuMSAzLjItNy41IDcuMS03LjVoMTg1LjdjMy45IDAgNy4xIDMuNCA3LjEgNy41djQ1em00MTYgMTQwYzAgNC4xLTMuMiA3LjUtNy4xIDcuNUg2MjcuMWMtMy45IDAtNy4xLTMuNC03LjEtNy41di00NWMwLTQuMSAzLjItNy41IDcuMS03LjVoMTg1LjdjMy45IDAgNy4xIDMuNCA3LjEgNy41djQ1em0wLTE0MGMwIDQuMS0zLjIgNy41LTcuMSA3LjVINjI3LjFjLTMuOSAwLTcuMS0zLjQtNy4xLTcuNXYtNDVjMC00LjEgMy4yLTcuNSA3LjEtNy41aDE4NS43YzMuOSAwIDcuMSAzLjQgNy4xIDcuNXY0NXoiIGZpbGw9InJnYmEoMTI5LDE3OSw1NSwxKSI+PC9wYXRoPgogICAgPC9nPgogIDwvc3ZnPg==');
background-size: cover;
background-repeat: no-repeat;
width: 42px;
height: 42px;
}
.hint {
font-size: 14px;
text-align: center;
color: var(--primary-color);
font-weight: bold;
}

View File

@ -178,7 +178,7 @@ Page({
const _self = this
const value = e.currentTarget.dataset.value
const id = e.currentTarget.id
if (value.applyStatus == 'APPROVED' || value.applyStatus == 'CANCELED') {
if (value.applyStatus != 'PENDING') {
//通过 或 取消 后不能撤销
const item = _self.selectComponent(`#${id}`)
if (item) {
@ -199,6 +199,18 @@ Page({
},
//取消
showCancel(item) {
const _self = this
wx.showModal({
title: '警告',
content: '您确定要撤销申请吗?',
complete: (res) => {
if (res.confirm) {
_self.doCancel(item)
}
}
})
},
doCancel(item) {
const _self = this
wx.showLoading({
title: '取消中...',

View File

@ -66,7 +66,7 @@
<view class="approve-title mt-10">补正凭证</view>
<view class="approve-img-box mt-10">
<block wx:for="{{approveImgs}}" wx:key="index">
<view class="approve-img-item single-line-front" bind:tap="previewImg" data-value="{{item}}">
<view class="approve-img-item single-line" bind:tap="previewImg" data-value="{{item}}">
{{item.value}}
</view>
</block>

View File

@ -15,33 +15,33 @@
</view>
</view>
</view> -->
<view style="margin-top: 10rpx;">
<view style="margin-top: 5rpx;">
<container-loading loadingState="{{loadingState}}">
<scroll-view scroll-y style="height: 83vh;" bindrefresherrefresh="doRefreshList" refresher-enabled refresher-triggered="{{listRefreshTrig}}" bindscrolltolower="doLoadMore" lower-threshold='40'>
<scroll-view scroll-y style="height: 80vh;" bindrefresherrefresh="doRefreshList" refresher-enabled refresher-triggered="{{listRefreshTrig}}" bindscrolltolower="doLoadMore" lower-threshold='40'>
<view class="order-list-box">
<block wx:for="{{orderList}}" wx:key="index">
<view class="order-list-item" bind:tap="checkItem" data-value="{{item}}">
<checkbox checked="{{item.checked}}" wx:if="{{currentStatus=='not'}}" class="custom-wx-checkbox"></checkbox>
<view class="order-list-item-content">
<view class="order-item-time-box">
<view class="time-content icon-time">{{item.reconciliationTime}}</view>
<view class="{{tools.payWay(item.thirdParty)}} pay-icon-size"></view>
</view>
<view class="order-item-title-box">
<view class="success-time">到账时间:{{item.rechargeFinalTime}}</view>
<rich-text class="pay-money" nodes="{{tools.moneyTxt(10,item.rechargeMoney)}}"></rich-text>
</view>
<view class="order-list-item" bind:tap="checkItem" data-value="{{item}}">
<checkbox checked="{{item.checked}}" wx:if="{{currentStatus=='not'}}" class="custom-wx-checkbox"></checkbox>
<view class="order-list-item-content">
<view class="order-item-time-box">
<view class="time-content icon-time">{{item.reconciliationTime}}</view>
<view class="{{tools.payWay(item.thirdParty)}} pay-icon-size"></view>
</view>
<view class="order-item-title-box">
<view class="success-time">到账时间:{{item.rechargeFinalTime}}</view>
<rich-text class="pay-money" nodes="{{tools.moneyTxt(10,item.rechargeMoney)}}"></rich-text>
</view>
</view>
</view>
</block>
<mp-loading show="{{isLoadMore}}" type="circle"></mp-loading>
</view>
</scroll-view>
</container-loading>
</view>
<view class="bottom-footer">
<view class="bottom-fixed-footer">
<view class="money">开票金额:<text class="price">{{money}}元</text></view>
<view class="confirm-btn" bind:tap="goMakeInvoice">去开票</view>
<view class="bottom-btn-green" bind:tap="goMakeInvoice">去开票</view>
</view>
</view>
<wxs src="../../../../utils/comm.wxs" module="tools"></wxs>

View File

@ -67,7 +67,8 @@
align-items: center;
padding: 10rpx 20rpx;
}
.order-list-item:nth-of-type(n+2){
.order-list-item:nth-of-type(n+2) {
margin-top: 20rpx;
}
@ -113,7 +114,7 @@
.success-time {
font-size: 24rpx;
padding-left: 5rpx;
color: var(--text-gray-desc-color);
color: var(--text-gray-hint-color);
}
.icon-time::before {
@ -165,9 +166,11 @@
.money {
color: var(--text-brown-color);
font-size: 20px;
font-size: 32rpx;
display: flex;
flex-direction: row;
align-self: center;
margin-bottom: 15rpx;
}
.price {

View File

@ -13,8 +13,8 @@
</view>
</view>
</view>
<view class="bottom-box">
<view class="green-bottom-btn" bind:tap="doUpdateInfo">保存</view>
<view class="bottom-fixed-footer">
<view class="bottom-btn-green" bind:tap="doUpdateInfo">保存</view>
</view>
</view>
<mp-toptips msg="{{errorHint}}" delay="2000" type="error" show="{{showError}}"></mp-toptips>

View File

@ -1,5 +1,5 @@
.info-container {
height: 100vh;
height: 90vh;
background-color: white;
border-radius: 10px;
padding: 20px;

View File

@ -34,8 +34,8 @@
</scroll-view>
</container-loading>
</view>
<view class="bottom-btn">
<view class="confirm-btn" bind:tap="openMake">去开票</view>
<view class="bottom-fixed-footer">
<view class="bottom-btn-green" bind:tap="openMake">去开票</view>
</view>
</view>
<mp-toptips msg="{{msgHint}}" type="{{msgType}}" show="{{msgShow}}" :delay="2000"></mp-toptips>