Browse Source

Merge branch 'md0612'

master
刘嘉炜 24 hours ago
parent
commit
f777eb0cd5
  1. 7
      src/style/iconfonts.scss
  2. 35
      src/subpackage/common/components/card_search.vue
  3. 2
      src/subpackage/common/js/api.js
  4. 305
      src/subpackage/common/pages/pay_type_select.vue
  5. BIN
      src/subpackage/common/static/images/ic_0.png
  6. BIN
      src/subpackage/common/static/images/ic_1.png
  7. BIN
      src/subpackage/common/static/images/ic_2.png
  8. BIN
      src/subpackage/common/static/images/ic_3.png
  9. BIN
      src/subpackage/common/static/images/ic_4.png
  10. BIN
      src/subpackage/common/static/images/pay_types/ic_0.png
  11. BIN
      src/subpackage/common/static/images/pay_types/ic_1.png
  12. BIN
      src/subpackage/common/static/images/pay_types/ic_2.png
  13. BIN
      src/subpackage/common/static/images/pay_types/ic_3.png
  14. BIN
      src/subpackage/common/static/images/pay_types/ic_4.png
  15. BIN
      src/subpackage/common/static/images/pay_types/ic_5.png
  16. 4
      src/subpackage/order/js/api.js
  17. 28
      src/subpackage/order/pages/timekeeping/modules/order_detail/end_billing_modal.vue
  18. 67
      src/subpackage/order/pages/timekeeping/modules/order_list/site.vue
  19. 20
      src/subpackage/order/pages/timekeeping/order_detail/common.js
  20. 104
      src/subpackage/order/pages/timekeeping/order_detail/site.vue
  21. 7
      src/subpackage/order/pages/timekeeping/order_list.vue
  22. 77
      src/uni.scss
  23. 81
      src/utils/calculate.js

7
src/style/iconfonts.scss

@ -0,0 +1,7 @@
// iconfont 圆圈白勾选中 ()
@mixin circleSelected {
@font-face {
font-family: 'circleSelected';
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALMAAsAAAAABoQAAAKBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACCcAp8gQ4BNgIkAwgLBgAEIAWEZwcyG8wFyJ6aPIECCiFAG9Z64OAyRBCtsdm7Q0SSehbLoiGSIFGSWKuETKZBEyvhf35/7xnAdOP4FUenrzQ93Pfh+85nGtpWwQhHqTkqbZGKQ4bcuXlAiXC5XLju838/+ZcX8D0+5w6Kakp8YPOB7IMu22YtvjPzgU9heNVB7sQ1Ao2WVAnfberQQ/IFh07IF8nuD7L6uLCYOIiVIopC8/VCLbq2QDyJIl2nC+Ax+nz800QsSGoy2E0H540iHN2nOhNyX9UH8pu++TroZQk1yJgDCnHSndkTIZqkCI2eSCO0tQi+UqsqcItdO4T419m1zWCYKu9J5alvVTGBwnDGgNVR7yBHUrac2Pd6NXxz0399PXR5Sfsh+6bGsf6V4SyDML6+NJMpjsxG4KYXz3lfXN57Pg9ffgSe1w5hut+np28LXwreQ6Gwz7e+tZi3tRuiYROget7NpRCG4LJzKj0pFX/1CZEAH/pajELVC2A+UL9rT/CfTJ0gsRgxUjlciUBSrBGn1jc6cSp2oNPdWGvX/RRCva678tUZypDVG6EKN4MaTVZQq94aGs1q3Nyki1uEKHHAhEGC0G4JSatnZO2OqcLdoEavB9Rq949GZ5G0X5OJEOoZ5ZCKhA8Si+BySq4FI7laavLaOVaXNFImW2icqBWqcr6ZOimbYoHsM2kQJSIxl4M0CZdRu91F3MxlpQIqzIjuMqVSarqJQnA5oB5DcRAlInhBhIXAxUkKyFj8Pi3KxMuOw0DKmGFkFiqfUFNQAVSz0Qn13MkhMh8TDYQkhISRnAPRJI2i7OxcCHfzKCtKgBTMI1JuZZQOSUKNivXNjk87AI1sWwqnJALqr6j9DsNUBAA=') format('woff2');
}
}

35
src/subpackage/common/components/card_search.vue

@ -44,16 +44,15 @@ import API from '../js/api.js';
export default {
props: {
sid: {
type: String,
default: ''
},
amount: {
type: String,
default: ''
},
},
data(){
return {
initData: { /* stadium_id: '', pay_amount: 0 */ },
isShow: false,
searchKey: '',
cardLs: [],
@ -61,6 +60,10 @@ export default {
}
},
methods: {
init(data){
this.initData = { ...data };
this.show();
},
//
hide(){
this.isShow = false;
@ -71,8 +74,9 @@ export default {
this.$emit('show');
},
confirmBtn(){
let { selectedCard } = this;
let { selectedCard, initData } = this;
if(!selectedCard?.card_no)return util.showNone('请选择储值卡');
initData?.success?.(selectedCard);
this.hide();
this.$emit('confirm', selectedCard);
},
@ -123,15 +127,12 @@ export default {
left: 0;
bottom: 0;
padding: 46upx 24upx 0upx;
padding-bottom: calc( 0upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
padding-bottom: calc( 0upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
width: 100%;
background-color: #fff;
@include isPd(0upx);
.cc-tit{
line-height: 44upx;
text-align: center;
font-size: 32upx;
font-weight: 500;
@include flcw(32upx, 44upx, #1a1a1a, 500);
}
.cc-close{
position: absolute;
@ -149,8 +150,7 @@ export default {
.cs-input{
width: 100%;
height: 100%;
font-size: 32upx;
color: #1A1A1A;
@include flcw(32upx, 44upx, #1a1a1a);
}
}
.cc-list{
@ -161,17 +161,15 @@ export default {
padding: 20upx;
border: 2upx solid #979797;
border-radius: 10upx;
@include centerFlex(space-between);
@include ctf(space-between);
&:not(:first-child){
margin-top: 24upx;
}
.ci-content{
flex-grow: 1;
.cc-line{
line-height: 40upx;
font-size: 28upx;
color: #1A1A1A;
@include textHide(1);
@include flcw(28upx, 40upx, #1a1a1a);
@include tHide(1);
.cc-txt{
color: #9C9C9F;
}
@ -204,12 +202,11 @@ export default {
}
.cc-btn{
margin-top: 14upx;
line-height: 112upx;
text-align: center;
font-size: 32upx;
border-radius: 10upx;
background-color: $themeColor;
color: #fff;
background-color: $mColor;
@include flcw(32upx, 112upx, #fff);
}
}
</style>

2
src/subpackage/common/js/api.js

@ -5,6 +5,8 @@ export const COMMON_API = {
takeUpBbocPay:`${ORIGIN}/admin/stadium/venue/takeUpBbocPay`, // 挂账收款的接口
venueTakeUp: `${ORIGIN}/admin/stadium/venue/takeUp`, // 商家助手-占用场地提交
canUseValueCardList: `${ORIGIN}/admin/stadium/canUseValueCard/list`, // 商家助手-占用场地可用储值卡列表
}
export default COMMON_API;

305
src/subpackage/common/pages/pay_type_select.vue

@ -13,40 +13,47 @@
</block>
</view>
</view>
<view class="pts-container">
<view class="pc-tit-bar">支付方式</view>
<view class="pc-ls">
<view class="pl-item" v-for="(e, i) in payMethodsLs" :key="i">
<image mode="aspectFit" :src="'/subpackage/common/static/images/ic_'+e.id+'.png'"></image>
<view class="pi-right" @click="payMethodsChange(e)">
<view class="pr-top">
<view class="pr-txt">{{ e.name || '-' }}</view>
<view class="pr-ipt" v-if="e.id == 4">
<input v-model="otherTypeRemark" />
</view>
<view :class="['pr-icon', e.id == payMethodsID? 'active': '']">
<image mode="aspectFit" src="/subpackage/common/static/images/choose.png"></image>
</view>
</view>
<view class="pr-content" v-if="e.id == 3&&selectedCard&&selectedCard.card_no">
<view class="pc-line">
<view class="pl-txt">储值卡卡号{{ selectedCard.card_no || '-' }}</view>
<view class="pl-tag" v-if="selectedCard.discount&&selectedCard.discount<10">使用会员卡支付{{ selectedCard.discount || '-' }}</view>
</view>
<view class="pc-line">
<view class="pl-txt">微信昵称{{ selectedCard.nickname || '-' }}</view>
</view>
<view class="pc-line">
<view class="pl-txt">手机号码{{ selectedCard.mobile || '-' }}</view>
</view>
<view class="pc-line">
<view class="pl-txt">卡名称{{ selectedCard.card_name || '-' }}</view>
</view>
<view class="pc-line">
<view class="pl-txt">卡余额{{ selectedCard.balance || '0' }}</view>
</view>
</view>
</view>
<view class="pts-content">
<view class="pc-box" @click="payMethodsChange(5)" v-if="depositOrderInfo">
<view class="pc-methods-item">
<image mode="aspectFit" src="/subpackage/common/static/images/pay_types/ic_0.png" class="pi-icon"></image>
<view class="pi-txt">押金抵扣</view>
<view class="pi-selected" v-if="payMethodsID === 5">&#xe610;</view>
</view>
<view class="pc-info">
<view class="pi-txt"><text class="pt-black">押金订单号</text>{{ depositOrderInfo.order_no || '-' }}</view>
<view class="pi-txt"><text class="pt-black">押金金额</text>¥{{ depositOrderInfo.amount || '0' }}</view>
<view class="pi-txt">押金金额实收金额才可支付扣除费用后剩余押金会原路退回给用户</view>
</view>
</view>
<view class="pc-box" @click="payMethodsChange(3)">
<view class="pc-methods-item">
<image mode="aspectFit" src="/subpackage/common/static/images/pay_types/ic_1.png" class="pi-icon"></image>
<view class="pi-txt">储值卡支付</view>
<view class="pi-selected" v-if="payMethodsID === 3">&#xe610;</view>
</view>
<view class="pc-info" v-if="payMethodsID === 3&&selectedCard&&selectedCard.card_no">
<view class="pi-txt" v-if="selectedCard.discount&&selectedCard.discount<10">使用会员卡支付{{ selectedCard.discount || '-' }}</view>
<view class="pi-txt"><text class="pt-black">储值卡卡号{{ selectedCard.card_no || '-' }}</text></view>
<view class="pi-txt"><text class="pt-black">微信昵称{{ selectedCard.nickname || '-' }}</text></view>
<view class="pi-txt"><text class="pt-black">手机号码{{ selectedCard.mobile || '-' }}</text></view>
<view class="pi-txt"><text class="pt-black">卡名称{{ selectedCard.card_name || '-' }}</text></view>
<view class="pi-txt"><text class="pt-black">卡余额{{ selectedCard.balance || '0' }}</text></view>
</view>
</view>
<view class="pc-box pc-box-succession">
<view class="pc-methods-item" v-for="(e, i) in ['微信支付', '支付宝支付', '现金支付']" :key="i" @click="payMethodsChange(i)">
<image mode="aspectFit" :src="'/subpackage/common/static/images/pay_types/ic_' + (Number(i)+2) +'.png'" class="pi-icon"></image>
<view class="pi-txt">{{ e }}</view>
<view class="pi-selected" v-if="payMethodsID === Number(i)">&#xe610;</view>
</view>
</view>
<view class="pc-box" @click="payMethodsChange(4)">
<view class="pc-methods-item">
<image mode="aspectFit" src="/subpackage/common/static/images/pay_types/ic_5.png" class="pi-icon"></image>
<view class="pi-txt">其他</view>
<input type="text" class="pi-ipt" v-model="otherTypeRemark">
<view class="pi-selected" v-if="payMethodsID === 4">&#xe610;</view>
</view>
</view>
</view>
@ -73,10 +80,9 @@ import server from '../js/server.js';
import API from '../js/api.js';
import util from '../../../utils/util.js';
import cardSearch from '../components/card_search';
import { accAdd, accSub, accMul, accDiv } from "@/utils/calculate";
export default {
components: {
'card-search': cardSearch
},
components: { 'card-search': cardSearch },
computed: {
stadiumInfo(){
return this?.optionsQuery?.stadiumInfo || {};
@ -87,31 +93,32 @@ export default {
discountAmount(){
let { selectedCard, optionsQuery, payAmount, payMethodsID } = this;
if(selectedCard?.discount && payMethodsID == 3){
return Math.floor((optionsQuery?.amount * 100) - (payAmount * 100))/100;
return accSub(optionsQuery?.amount ?? 0, payAmount ?? 0);
}
return 0;
},
payAmount(){
let { selectedCard, optionsQuery, payMethodsID } = this;
if(selectedCard?.discount && payMethodsID == 3){
return Math.floor((optionsQuery?.amount * 100) * (selectedCard?.discount / 10))/100;
if(selectedCard?.discount && payMethodsID === 3){
return accMul(optionsQuery?.amount ?? 0, accDiv(selectedCard?.discount ?? 0, 10));
}
return optionsQuery?.amount;
return optionsQuery?.amount ?? 0;
}
},
data() {
return {
isCardSelectModal: false,
payMethodsLs: this.getPayMethodsLs(),
payMethodsID: 0,
optionsQuery: {},
otherTypeRemark: '',
selectedCard: {}
selectedCard: {},
// md0612
depositOrderInfo: null,
}
},
/**
* @param {Object} _options = JSON.parse(decodeURIComponent(option.query))
* @param {String} _options.type 1 -> 客户订场 2-> 散客 3-> 锁场, 4 -> 挂账
* @param {String} _options.type 1 -> 客户订场 2-> 散客 3-> 锁场, 4 -> 挂账 5-> 场地计时订单结束计费
* @param {String} _options.brand_id
* @param {String} _options.amount
* @param {Object} _options.stadiumInfo
@ -126,6 +133,14 @@ export default {
onLoad(option){
let optionsQuery = util.jsonPar(decodeURIComponent(option.query));
this.optionsQuery = optionsQuery;
const eventChannel = this.getOpenerEventChannel();
// md0612
eventChannel.on('emitFromSiteOrder', async data =>{
let _dpInfo = data?.depositInfo || null;
this.depositOrderInfo = _dpInfo;
if(_dpInfo?.order_no)this.payMethodsID = 5;
})
},
methods: {
cardSelectConfirm(e){
@ -135,13 +150,33 @@ export default {
},
submitBtn: util.debounce(function(){
let _type = this.optionsQuery?.type;
if(+_type === 5)return this.siteOrderEndPay();
//
if(+_type === 4)return this.takeUpBbocPay();
if(_type !== 4)return this.takeUpSubmit();
}, 300, true),
payMethodsChange(e){
if(e.id == 3)return this.$refs.cardSearch.show();
this.payMethodsID = e.id;
siteOrderEndPay(){
let { optionsQuery, payMethodsID, otherTypeRemark, selectedCard, payAmount } = this;
const eventChannel = this.getOpenerEventChannel();
let _data = { pay_type: this.getPayMethodsName(payMethodsID) };
if(selectedCard?.card_no&& payMethodsID === 3)_data['card_no'] = selectedCard?.card_no;
if(otherTypeRemark&& payMethodsID === 4)_data['mark'] = otherTypeRemark;
eventChannel.emit('orderPay', _data);
},
payMethodsChange(typeNum){
let { stadiumInfo, optionsQuery } = this;
//
if(+typeNum === 3)return this.$refs.cardSearch.init({
stadium_id: stadiumInfo?.id ?? '',
pay_amount: optionsQuery?.amount ?? '',
success: cardRes =>{
if(!cardRes?.card_no)return this.payMethodsID = 0;
this.selectedCard = cardRes;
this.payMethodsID = 3;
}
});
this.payMethodsID = +typeNum;
},
getPayMethodsLs(){
return [
@ -150,6 +185,7 @@ export default {
{ name: '现金支付', id: 2 },
{ name: '储值卡支付', id: 3 },
{ name: '其它', id: 4 },
{ name: '押金抵扣', id: 5 },
]
},
@ -224,8 +260,7 @@ export default {
padding-bottom: calc( 120rpx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
}
.pts-header{
margin-bottom: 24upx;
padding: 26upx 36upx 110upx;
padding: 26upx 36upx 62upx;
background-color: #fff;
.ph-stadium-info{
padding-bottom: 34upx;
@ -245,7 +280,7 @@ export default {
}
}
.ph-type-text{
margin-top: 76upx;
margin-top: 26upx;
text-align: center;
font-size: 28upx;
font-weight: 500;
@ -253,7 +288,7 @@ export default {
@include textHide(1);
}
.ph-price{
margin-top: 84upx;
margin-top: 28upx;
text-align: center;
font-size: 80upx;
font-weight: 500;
@ -276,108 +311,69 @@ export default {
}
}
}
.pts-container{
background-color: #fff;
.pc-tit-bar{
padding-left: 24upx;
line-height: 72upx;
font-size: 28upx;
color: #9A9A9D;
.pts-content{
padding: 24upx;
.pc-box{
padding: 40upx 20upx;
border-radius: 10upx;
background-color: #fff;
&+.pc-box{
margin-top: 24upx;
}
}
.pc-ls{
padding: 16upx 30upx 0;
.pl-item{
display: flex;
&:not(:last-child){
.pi-right{
border-bottom: 1px solid #D8D8D8;
}
}
>image{
flex-shrink: 0;
margin-right: 16upx;
width: 54upx;
height: 54upx;
transform: translateY(24upx);
}
.pi-right{
flex-grow: 1;
.pr-top{
width: 100%;
height: 102upx;
@include centerFlex(space-between);
.pr-txt{
flex-shrink: 0;
font-size: 28upx;
color: #181818;
}
.pr-ipt{
margin-left: 40upx;
margin-right: auto;
padding: 0 16upx;
width: 340upx;
height: 64upx;
border: 2upx solid #D8D8D8;
border-radius: 10upx;
>input{
width: 100%;
height: 100%;
font-size: 28upx;
color: #181818;
}
}
.pr-icon{
flex-shrink: 0;
width: 36upx;
height: 36upx;
border-radius: 50%;
border: 2upx solid #aaaaaa;
overflow: hidden;
@include centerFlex(center);
&.active{
border-color: transparent;
>image{
visibility: visible;
}
}
>image{
visibility: hidden;
display: block;
border: none;
width: 100%;
height: 100%;
}
}
}
.pr-content{
padding-top: 4upx;
padding-bottom: 30upx;
.pc-line{
@include centerFlex(flex-start);
.pl-txt{
line-height: 44upx;
font-size: 24upx;
color: #181818;
@include textHide(1);
}
.pl-tag{
flex-shrink: 0;
margin-left: 10upx;
padding: 0 6upx;
line-height: 28upx;
font-size: 24upx;
color: #FF873D;
border: 1px solid #FF873D;
border-radius: 4upx;
}
}
}
.pc-methods-item{
font-size: 0;
@include ctf;
.pi-icon{
display: block;
flex-shrink: 0;
width: 44upx;
height: 44upx;
}
.pi-txt{
margin-left: 20upx;
@include flcw(32upx, 44upx, #1a1a1a);
}
.pi-ipt{
flex-shrink: 0;
padding: 0 20upx;
margin-left: 40upx;
width: 340upx;
height: 64upx;
border: 2upx solid #D8D8D8;
border-radius: 10upx;
@include flcw(28upx, 1.2em, #181818);
}
@include circleSelected;
.pi-selected{
flex-shrink: 0;
margin-left: auto;
margin-right: 20upx;
font-size: 36upx;
font-family: circleSelected;
color: $mColor;
}
}
.pc-info{
margin: 0 auto;
padding: 18upx 46upx;
width: 622upx;
margin-top: 20upx;
background: rgba($color: #70F4D5, $alpha: .1);
.pi-txt{
@include flcw(24upx, 44upx, #FF801D);
.pt-black{
@include flcw(24upx, 44upx, #1A1A1A);
}
}
}
.pc-box-succession{
padding: 10upx 20upx;
.pc-methods-item{
padding: 30upx 0;
}
}
}
.sc-fixed-bot{
position: fixed;
@ -385,20 +381,15 @@ export default {
bottom: 0;
width: 100%;
padding-top: 10upx;
padding-bottom: 10upx;
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
background-color: #fff;
@include isPd(10upx);
.sfb-view{
margin: 0 auto;
width: 702upx;
height: 88upx;
line-height: 88upx;
text-align: center;
font-size: 32upx;
background-color: #FF873D;
color: #fff;
border-radius: 44upx;
border-radius: 10upx;
@include flcw(32upx, 88upx, #fff);
}
}
</style>

BIN
src/subpackage/common/static/images/ic_0.png

Before

Width: 54  |  Height: 54  |  Size: 659 B

BIN
src/subpackage/common/static/images/ic_1.png

Before

Width: 54  |  Height: 54  |  Size: 627 B

BIN
src/subpackage/common/static/images/ic_2.png

Before

Width: 52  |  Height: 52  |  Size: 1.3 KiB

BIN
src/subpackage/common/static/images/ic_3.png

Before

Width: 52  |  Height: 52  |  Size: 764 B

BIN
src/subpackage/common/static/images/ic_4.png

Before

Width: 54  |  Height: 54  |  Size: 1.3 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_0.png

After

Width: 88  |  Height: 88  |  Size: 2.8 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_1.png

After

Width: 88  |  Height: 88  |  Size: 1.7 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_2.png

After

Width: 88  |  Height: 88  |  Size: 1.2 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_3.png

After

Width: 87  |  Height: 88  |  Size: 1.3 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_4.png

After

Width: 88  |  Height: 88  |  Size: 2.0 KiB

BIN
src/subpackage/common/static/images/pay_types/ic_5.png

After

Width: 88  |  Height: 88  |  Size: 1.9 KiB

4
src/subpackage/order/js/api.js

@ -55,6 +55,10 @@ export const ORDER_API = {
cardOrderGet:`${ORIGIN}/admin/venue/number/card/order/get`, // 订场卡订单 - 详情
cardOrderRefund:`${ORIGIN}/admin/venue/number/card/order/refund`, // 订场卡订单 - 退款
cardSoldUsage:`${ORIGIN}/admin/venue/number/card/sold/usage`, // 已售订场卡 - 使用记录
// md 250612
orderPayinfo: `${ORIGIN}/admin/assistant/billing/order/payinfo`, // 【1001429】【收银系统】场时 - 支付信息
orderPay: `${ORIGIN}/admin/assistant/billing/order/pay`, // 【1001429】【收银系统】场时 - 支付
orderBfuend: `${ORIGIN}/admin/assistant/billing/order/bfuend`, // 【1001984】【商家助手】- 场时 - 用前结算结束订单
}

28
src/subpackage/order/pages/timekeeping/modules/order_detail/end_billing_modal.vue

@ -7,12 +7,20 @@
<view class="ec-info">
<view class="ei-line"><text class="el-txt">操作人</text>{{ info.operator || '-' }}</view>
<view class="ei-line"><text class="el-txt">时长合计</text>{{ info.duration || '-' }}</view>
<view class="ei-line"><text class="el-txt">金额合计</text>{{ info.amount || '-' }}</view>
<view class="ei-line"><text class="el-txt">金额合计</text>{{ info.amount || '0' }}</view>
</view>
<view class="ec-opts">
<view
class="eo-item"
:class="{ active: end_type === 'pay_timing' }"
@click="end_type = 'pay_timing'"
>
<view class="ei-icon"></view>
<view class="ei-txt">支付订单</view>
</view>
<view
class="eo-item"
:class="{ active: end_type === 'end_timing' }"
@click="end_type = 'end_timing'"
>
@ -20,6 +28,7 @@
<view class="ei-txt">停止计时</view>
</view>
<view
v-if="false"
class="eo-item"
:class="{ active: end_type === 'end_order' }"
@click="end_type = 'end_order'"
@ -30,8 +39,7 @@
</view>
<view class="ec-amount">
<view class="et-name"><text class="en-txt">*</text>请输入金额</view>
<input type="digit" class="ea-ipt" v-model="amount">
<input placeholder="请输入金额" type="digit" class="ea-ipt" v-model="amount">
</view>
<view class="ec-btn" @click="confirmBtn">确认</view>
@ -53,7 +61,7 @@ export default {
// duration: '1259',
// amount: '¥100.2'
},
end_type: 'end_timing', // end_timing/ end_order
end_type: 'end_timing', // end_timing/ end_order/ pay_timing[md250612 ]
amount: '',
initOptions: {}
}
@ -69,14 +77,18 @@ export default {
let { operator, duration, amount, ...opts } = data;
this.info.operator = operator || '';
this.info.duration = duration || '';
this.info.amount = amount || '';
this.info.amount = amount ?? '';
this.initOptions = opts;
this.amount = amount ?? '';
this.show();
},
async confirmBtn(){
let { end_type, amount, initOptions } = this;
// initOptions?.success?.({ type: end_type, amount: +amount || 0 });
// this.hide();
if(end_type === 'pay_timing')return initOptions?.toPay?.({
amount: +amount,
});
try{
let { end_type, amount, initOptions } = this;
showLoad();
@ -242,12 +254,6 @@ export default {
.ec-amount{
padding-top: 48upx;
.et-name{
@include flcw(28upx, 48upx, #1A1A1A);
.en-txt{
color: #EA5061;
}
}
.ea-ipt{
margin-top: 8upx;
padding: 0 12upx;

67
src/subpackage/order/pages/timekeeping/modules/order_list/site.vue

@ -2,7 +2,7 @@
<list-item-temp
:stadium="order.stadium_name || ''"
:status="order.status_text || ''"
:price="order.pay_amount || ''"
:price="getPayAmount"
:status-active="['待支付', '计费中','待使用', '使用中'].includes(order.status_text)"
:price-show="['待支付', '待使用', '使用中', '已完成', '已失效', '已退款'].includes(order.status_text)"
@click:item="toDetail"
@ -28,6 +28,7 @@
<view class="lc-btns">
<view class="lb-item" v-if="order.status_text === '待使用'" @click.stop="cancelBtn">取消预约</view>
<view class="lb-item" v-if="order.status_text === '计费中'" @click.stop="endBilling">结束计费</view>
<view class="lb-item" v-if="order.status_text === '使用中'&&order.settlement_type === 1" @click.stop="endEarly">提前结束订单</view>
</view>
</template>
</list-item-temp>
@ -36,7 +37,10 @@
<script>
import kvLine from "../../../../components/kv_line.vue";
import listItemTemp from "./item_temp.vue";
import { routeTo } from '@/utils/util';
import { routeTo, showModal, showLoad, hideLoad } from '@/utils/util';
import { ORDER_API } from '../../../../js/api';
import server from '../../../../js/server';
export default {
props: {
order: {
@ -48,6 +52,13 @@ export default {
'kv-line': kvLine,
'list-item-temp': listItemTemp
},
computed: {
getPayAmount(){
let { order } = this;
if(order?.pay_type_text === '押金抵扣')return order?.deposit_deduction_amount ?? 0
return order?.pay_amount ?? 0;
},
},
methods: {
toDetail(){
let { order } = this;
@ -60,7 +71,55 @@ export default {
cancelBtn(){
let { order } = this;
routeTo(`/subpackage/order/pages/timekeeping/order_detail/site?order_no=${order?.order_no || ''}&brand_id=${order?.brand_id || ''}&is_end=2`, 'nT');
}
},
endEarly(){
showModal({
title: '是否确认结束订单',
content: '结束订单操作不可逆,请谨慎操作!\n结束订单后,设备将关闭!\n如若有剩余可用时间将不会退款!',
showCancel: true,
confirmText: '确认',
cancelText: '取消',
success: async res => {
if (res.confirm) {
let { order } = this;
let _obeRes = await this.orderBfuend({
brand_id: order?.brand_id ?? '',
order_no: order?.order_no ?? ''
});
if(_obeRes === 'success'){
this.$emit('click:endearly', {
...order,
status_text: '已完成',
});
}
}
}
})
},
orderBfuend({ brand_id, order_no }){
showLoad();
return server.post({
url: ORDER_API.orderBfuend,
data: { brand_id, order_no },
isDefaultGet: false
})
.then(res =>{
hideLoad();
if(res.data.code == 0){
console.log(res);
return 'success'
}else{
return Promise.reject(res);
}
})
.catch(err =>{
hideLoad();
showModal({ content: err?.data?.message ?? '操作失败!' });
console.warn('subpackage order timekeeping modules order list site err -->', err);
})
},
}
}
</script>
@ -80,7 +139,7 @@ export default {
margin-top: 24upx;
@include ctf(flex-end);
.lb-item{
width: 192upx;
padding: 0 20upx;
height: 80upx;
text-align: center;
border-radius: 10upx;

20
src/subpackage/order/pages/timekeeping/order_detail/common.js

@ -124,3 +124,23 @@ export function siteAndPeopleRefundServer({ order_no = '', amount = 0, integral
console.warn('getOrderDetail err -->', err);
})
}
export function orderPay({ brand_id, order_no, amount, pay_type, card_no, mark }){
return server.post({
url: ORDER_API.orderPay,
data: {
brand_id, order_no, amount, pay_type, card_no, mark
},
isDefaultGet: false
})
.then(res =>{
if(res.data.code == 0){
return res?.data?.data ?? {};
}else{
return Promise.reject(res);
}
})
.catch(err =>{
console.warn('subpackage order timekeeping order detail common.js err -->', err);
})
}

104
src/subpackage/order/pages/timekeeping/order_detail/site.vue

@ -24,7 +24,7 @@
<kv-line label="进场时间:">{{ orderInfo.start_time || '-' }}</kv-line>
<kv-line
label="离场时间:"
v-if="[ '待使用', '已取消预约', '计费中', '使用中' ].includes(orderInfo.status_text)&&orderInfo.settlement_type === 1"
v-if="[ '待使用', '已取消预约', '计费中', '使用中' ].includes(orderInfo.status_text)&&orderInfo.settlement_type === 0"
>现场扫码结算</kv-line>
<kv-line label="离场时间:" v-else>{{ orderInfo.end_time || '-' }}</kv-line>
<kv-line label="时长合计:">{{ orderInfo.extension&&orderInfo.extension.duration || '-' }}</kv-line>
@ -36,6 +36,10 @@
<kvs-line label="金额小计">¥{{ orderInfo.amount || '0' }}</kvs-line>
<kvs-line label="折扣金额">-¥{{ orderInfo.discount_amount || '0' }}</kvs-line>
<kvs-line label="积分抵扣">-¥{{ orderInfo.deduction_amount || '0' }}</kvs-line>
<kvs-line v-if="orderInfo.deposit_deduction_amount" label="押金抵扣">-¥{{ orderInfo.deposit_deduction_amount || '0' }}</kvs-line>
<kvs-line v-if="orderInfo.extension&&orderInfo.extension.meituan_args&&orderInfo.extension.meituan_args.meituan_coupon_deduction_amount" label="团购券抵扣">
-¥{{ orderInfo.extension.meituan_args.meituan_coupon_deduction_amount || '0' }}
</kvs-line>
<kvs-line label="优惠券优惠">-¥{{ orderInfo.coupons_amount || '0' }}</kvs-line>
</view>
<view class="od-total">
@ -121,7 +125,7 @@
class="pod-btn"
v-if="orderInfo.status_text === '待支付'"
@click="finishOrder"
>完结订单</view>
>支付订单</view>
<view
class="pod-btn"
v-if="orderInfo.status_text === '计费中'"
@ -180,7 +184,9 @@ import refundButton from "@/components/order_refund/permission_btn.vue";
import orderRefundModal from '@/components/order_refund/modal.vue';
import orderRefundInfo from '@/components/order_refund/info.vue';
import { showModal, routeTo } from '@/utils/util';
import { ORDER_API } from '../../../js/api';
import server from '../../../js/server';
import { showModal, routeTo, jsonStr, showLoad, hideLoad, showNone } from '@/utils/util';
import { getOrderDetail, cancelOrderServer, finishOrder, siteAndPeopleRefundServer } from "./common";
export default {
components: {
@ -222,6 +228,30 @@ export default {
});
},
methods: {
orderPay({ brand_id, order_no, amount, pay_type, card_no, mark }){
showLoad();
return server.post({
url: ORDER_API.orderPay,
data: {
brand_id, order_no, amount, pay_type, card_no, mark
},
isDefaultGet: false
})
.then(res =>{
hideLoad();
if(res.data.code == 0){
console.log(res);
return 'success'
}else{
return Promise.reject(res);
}
})
.catch(err =>{
hideLoad();
showModal({ content: err?.data?.message ?? '操作失败!' });
console.warn('subpackage order timekeeping order detail site err -->', err);
})
},
refundOrder(){
let { orderInfo, extension, refundList } = this;
this.$refs.orderRefundModal.show({
@ -288,27 +318,65 @@ export default {
order_no: orderInfo?.order_no
});
}, 1000);
},
toPay: pRes =>{
this.endToPay(pRes?.amount ?? 0);
}
});
},
// //
finishOrder(){
endToPay(payAmount){
let { orderInfo } = this;
finishOrder({
brand_id: orderInfo?.brand_id,
order_no: orderInfo?.order_no,
stadium_id: orderInfo?.stadium_id,
opts: {
finally: ()=> {
setTimeout(()=>{
this.getOrderDetail({
brand_id: orderInfo?.brand_id,
order_no: orderInfo?.order_no
});
}, 1000);
let _brand_id = orderInfo?.brand_id ?? '',
_amount = payAmount ?? 0,
_order_no = orderInfo?.order_no ?? '';
let _query = {
brand_id: _brand_id,
amount: _amount,
type: 5,
stadiumInfo: {
id: orderInfo?.stadium_id,
name: orderInfo?.stadium_name,
logo: orderInfo?.stadium_logo,
},
};
uni.navigateTo({
url: `/subpackage/common/pages/pay_type_select?query=${jsonStr(_query)}`,
events: {
orderPay: opRes=>{
this.orderPay({
...opRes, brand_id: _brand_id, order_no: _order_no, amount: _amount,
})
.then(rRes=>{
if(rRes === 'success'){
routeTo();
this.$nextTick(_=>{
this.$refs.endBillingModal.hide();
showNone('操作成功!');
setTimeout(_=>{
this.getOrderDetail({ brand_id: _brand_id, order_no: _order_no });
}, 1000);
})
}
})
}
},
success: navRes=> {
let _query = {};
if(orderInfo?.extension?.show_deposit)_query.depositInfo = {
amount: orderInfo?.extension?.deposit_amount ?? 0,
order_no: orderInfo?.deposit_order_no ?? '',
}
navRes.eventChannel.emit('emitFromSiteOrder', _query);
}
})
});
},
// //
finishOrder(){
let { orderInfo } = this;
// md0612
this.endToPay(orderInfo?.amount ?? 0);
},
toDepoistDetail(){
let { orderInfo } = this;

7
src/subpackage/order/pages/timekeeping/order_list.vue

@ -14,7 +14,7 @@
<view class="tol-list">
<block v-for="(e, i) in orderList" :key="i">
<view class="tl-item" v-if="e.order_type === 1">
<site-list-item :order="e"></site-list-item>
<site-list-item @click:endearly="siteOrderEndEarly($event, i)" :order="e"></site-list-item>
</view>
<view class="tl-item" v-if="e.order_type === 2">
<person-list-item :order="e"></person-list-item>
@ -123,6 +123,11 @@ export default {
})
},
methods: {
//
siteOrderEndEarly(e, idx){
this.orderList[idx] = e;
this.$nextTick(this.$forceUpdate);
},
//
searchOrder(){
let { brand_id, order_type } = this;

77
src/uni.scss

@ -1,79 +1,4 @@
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场https://ext.dcloud.net.cn上很多三方插件均使用了这些样式变量
* 如果你是插件开发者建议你使用scss预处理并在插件代码中直接使用这些变量无需 import 这个文件方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者插件使用者你可以通过修改这些变量来定制自己的插件主题实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理你也可以直接在你的 scss 代码中使用如下变量同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:24rpx;
$uni-font-size-base:28rpx;
$uni-font-size-lg:32rpx;
/* 图片尺寸 */
$uni-img-size-sm:40rpx;
$uni-img-size-base:52rpx;
$uni-img-size-lg:80rpx;
/* Border Radius */
$uni-border-radius-sm: 4rpx;
$uni-border-radius-base: 6rpx;
$uni-border-radius-lg: 12rpx;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 10px;
$uni-spacing-row-base: 20rpx;
$uni-spacing-row-lg: 30rpx;
/* 垂直间距 */
$uni-spacing-col-sm: 8rpx;
$uni-spacing-col-base: 16rpx;
$uni-spacing-col-lg: 24rpx;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:40rpx;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:36rpx;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:30rpx;
@import '~style/iconfonts.scss';
$mColor: #009874;

81
src/utils/calculate.js

@ -0,0 +1,81 @@
/**
* 加法函数
* @param {number} arg1 数字1
* @param {number} arg2 数字2
* @returns {number} 返回两数相加的结果
* */
export function accAdd(arg1, arg2) {
var r1, r2, m, c;
try { r1 = arg1.toString().split(".")[1].length; }catch (e) { r1 = 0 };
try { r2 = arg2.toString().split(".")[1].length }catch (e) { r2 = 0 };
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
}else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
}else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
}
/**
* 减法函数
* @param {number} arg1 数字1
* @param {number} arg2 数字2
* @returns {number} 返回两数相减的结果
*
*/
export function accSub(arg1, arg2) {
var r1, r2, m, n;
try { r1 = arg1.toString().split(".")[1].length }catch (e) { r1 = 0 };
try { r2 = arg2.toString().split(".")[1].length }catch (e) { r2 = 0 };
m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
/**
* 乘法函数
* @param {number} arg1 数字1
* @param {number} arg2 数字2
* @returns {number} 返回两数相乘的结果
*
*/
export function accMul(arg1, arg2) {
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try { m += s1.split(".")[1].length }catch (e) { };
try { m += s2.split(".")[1].length }catch (e) { };
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
/**
* 除法函数
* @param {number} arg1 数字1
* @param {number} arg2 数字2
* @param {number} precision 数字2
*
* @returns {number} 返回两数相除的结果
*
*/
export function accDiv(arg1, arg2, precision = 10) {
var t1 = 0, t2 = 0, r1, r2;
try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
const result = (r1 / r2) * Math.pow(10, t2 - t1);
// 使用四舍五入控制精度
return parseFloat(result.toFixed(precision));
}
Loading…
Cancel
Save