mysql 各个拼接字符函数: GROUP_CONCAT(ts.siteName) concat函数 concat_ws函数

本文介绍MySQL中使用GROUP_CONCAT、concat和concat_ws函数进行字段拼接的方法,包括如何将多列数据合并为一列,以及如何在拼接时使用指定的分隔符。

1、mysql 把查询结果的多列拼接成在一起,用逗号隔开:GROUP_CONCAT(ts.siteName)

 

2、MySQL的查询时字段拼接 :concat函数

 

3、MySQL的查询时用指定分隔符 分隔符的位置放在要连接的两个字符串之间进行拼接concat_ws函数

 

 

<select id="findSiteInfoListForLinkEdit" resultType="com.huawei.it.isd.dim.networknode.entity.NetworkSiteVO"> select site.id as id, site.node_number as siteNumber, site.site_id as siteID, site.site_name as siteName, site.country as country, site.province as province, site.city as city, site.network_region as regionName, site.town as town, site.SENSITIVE_SITE as sensitive, site.FLOOR_ROOM as floorEquipmentRoom, site.CONTACT_PERSON as contactPerson, site.CONTACT_PERSON_TEL as contactTel, site.status as status, site.address as detailedAddress, site.Delivery_Address as deliveryAddress, site.post_code as postCode, dnn.source as source, TO_TIMESTAMP(site.last_update_date::VARCHAR,'YYYY/MM/DD HH24:MI:SS')::TIMESTAMP WITHOUT TIME ZONE AS last_update_date from DIA_PLAN_SITEBASE_T site left join DIA_NETWORK_NODE_T dnn on site.node_number=dnn.node_number and dnn.project_number = site.project_number and dnn.delete_flag = '0' where site.delete_flag = '0' and site.project_number = #{0.projectNumber} <if test='_parameter.get("0").searchID != null'> and site.node_number = #{0.searchID} </if> <if test='null != _parameter.get("0").searchKey'> and (lower(site.site_id) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) or lower(site.site_name) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) or lower(site.node_number) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) ) </if> <if test='_parameter.get("0").isContainsVirtual != null'> and site.Is_Virtual_Site = '2' </if> </select> <select id="findSiteInfoListForLinkEditCount" resultType="int"> select count(1) from DIA_PLAN_SITEBASE_T site left join DIA_NETWORK_NODE_T dnn on site.node_number=dnn.node_number and dnn.project_number = site.project_number and dnn.delete_flag = '0' where site.delete_flag = '0' and site.project_number = #{0.projectNumber} <if test='_parameter.get("1").lstRegionsLst != null'> AND (upper(site.network_region) IN <foreach collection='_parameter.get("1").lstRegionsLst' item='item' index='index' open="(" separator="," close=")"> <if test='index!=0 and index % 800 == 0'> null ) OR upper(site.network_region) IN ( </if> #{item, jdbcType=VARCHAR} </foreach> ) </if> <if test='_parameter.get("0").searchID != null'> and site.node_number = #{0.searchID} </if> <if test='_parameter.get("0").isContainsVirtual != null'> and site.Is_Virtual_Site = '2' </if> <if test='null != _parameter.get("0").searchKey'> and (lower(site.site_id) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) or lower(site.site_name) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) or lower(site.node_number) like (concat('%', lower(#{0.searchKey,jdbcType=VARCHAR}) ,'%')) ) </if> </select>解释一下 并检索有无错误
06-11
<wxs module="order"> var getTotal = function (orderTypeCurrentIndex,array) { var total = 0.00; for (var i = 0; i < array.length;i++){ total += orderTypeCurrentIndex === 0 ? array[i].invoiceMoney : array[i].payAmount; } return Math.floor(total * 100) / 100; } module.exports.getTotal = getTotal; </wxs> <view class="container"> <view class="tab-content"> <view class="time-frame-content"> <van-row gutter="10"> <view class="order-type-content"> <van-row> <van-col span="12" class="tx-c" wx:for="{{orderTypeList}}" wx:key="value"> <text class="order-type-item {{orderTypeCurrentIndex === item.value ? 'order-type-current' : ''}}" data-index="{{item.value}}" bindtap="chooseOrderTypeItem">{{item.label}}</text> </van-col> </van-row> </view> </van-row> </view> <view class="bc-ffffff header-tab"> <view class="tips-text-content"> <text class="tips-text">温馨提醒:小程序开具电子发票有效期为3个月!过期请进站开具纸质发票</text> </view> <view class="df f-ac"> <view class="fg-1 order-type-title-class"> <view class="df f-ac"> <van-icon name="map-marked" class="map-marked" color="#666666" size="18"/> <view class="station-name">{{listSiteInfo.siteName}}</view> <view class="switch-site-text" bindtap="switchSite">切换</view> </view> <!-- <van-dropdown-menu active-color="#01A23D"> <van-dropdown-item value="{{ invState }}" bind:change="orderTypeOnChange" title-class="order-type-title-class" options="{{ orderTypeOptions }}" /> </van-dropdown-menu> --> </view> <view class="fg-1 order-screen order-screen-title-class tx-r" bindtap="showOrderScreen"> <van-icon name="filter-o" class="filter-icon"/> <text>订单筛选</text> </view> </view> </view> </view> <view class="fixed-height"></view> <view class="order-list"> <view-list showNotify="{{showNotify}}" loading="{{loading}}" dataList="{{orderList}}" nowPage="{{nowPage}}" totalPage="{{totalPage}}"> <van-checkbox-group value="{{ formOrderIds }}" bind:change="checkedOnChange"> <view class="df f-ac" wx:for="{{orderList}}" data-index="{{ index }}" wx:key="omsOrderId" bindtap="toggle"> <view class="checkbox-content" wx:if="{{invState === 0}}"> <van-checkbox checked-color="#01A23D" custom-class="checkbox-class" catch:tap="noop" class="checkboxes-{{ index }}" name="{{ item.omsOrderId }}" bind:click="toggle"/> </view> <view class="fg-1"> <order-list-tmp showOrderState="{{invState === 1}}" showDetails="{{true}}" paymentTime="{{item.createTime}}" payAmount="{{orderTypeCurrentIndex === 0 ? item.invoiceMoney : item.payAmount}}" bind:details="toDetails" hiddenTip="{{showTipIndex !== index}}" bind:orderStateTap="orderStateTap" data-index="{{index}}" index="{{index}}"> <view slot="header-title" wx:if="{{ invState === 1 && item.invNum >=2}}"> <!-- 开票上限制 --> <text class="fs-25 fc-01A23D">已达到开票上限</text> </view> <view slot="desc"> <view class="info-cell fs-27"> <text class="fc-999999">消费门店:</text> <text class="fc-666666">{{item.stationName}}</text> </view> <view class="info-cell fs-27"> <text class="fc-999999">交易说明:</text> <text class="fc-666666">{{item.costTypeStr}}</text> </view> </view> </order-list-tmp> </view> </view> </van-checkbox-group> </view-list> </view> <view class="footer-operation-height" wx:if="{{invState === 0}}"></view> <view class="footer-operation" wx:if="{{invState === 0}}"> <view class="footer-operation-content"> <view class="operation-order-sum-text"> <text class="fc-01A23D plr-10">{{formOrderIds.length}}</text><text>笔订单,共</text><text class="fc-01A23D plr-10">{{order.getTotal(orderTypeCurrentIndex,chooseOrder)}}</text>元 </view> <van-divider></van-divider> <van-radio-group bind:change="onChange"> <view class="df f-ac operation-content"> <view class="mr-35"> <van-checkbox value="{{selectPageChecked}}" checked-color="#01A23D" bind:change="selectPageOnChange" label-class="label-class">本页全选 </van-checkbox> </view> <view> <van-checkbox value="{{selectAllChecked}}" checked-color="#01A23D" bind:change="selectAllOnChange" label-class="label-class">全部全选 </van-checkbox> </view> <view class="fg-1 tx-r"> <van-button type="primary" disabled="{{formOrderIds.length === 0}}" color="#01A23D" bind:click="toInvoicing">下一步 </van-button> </view> </view> </van-radio-group> </view> </view> </view> <screen-tmp propDate="{{propDate}}" isShowOrderScreen="{{isShowOrderScreen}}" siteInfo="{{screenSiteInfo}}" bind:popupclose="onOrderScreenClose" bind:confirm="screenConfirm" bind:reset="resetOrderSearch"></screen-tmp> import { initOrderData } from '../../../../utils/orderInterface'; import moment from "../../../../utils/moment"; const app = getApp(); App.Page({ data: { loading: true, useProp: ["user", "invoive", "site"], currentDate: [moment(new Date()).subtract(3, "months").format("YYYY-MM-DD"), moment(new Date()).add(1, 'm').format("YYYY-MM-DD")], propDate: [moment(new Date()).subtract(3, "months").format("YYYY-MM-DD"), moment(new Date()).add(1, 'm').format("YYYY-MM-DD")], payAmountStart: "", // 实付支付金额() payAmountEnd: "", // 实付支付金额() orderList: [], orderTypeCurrentIndex: 6, // 默认甲醇 screenSiteInfo: null, listSiteInfo: null, showNotify: null, tabHeight: 0, orderTypeList: [ // { // value: 0, // label: "能源消费" // }, // { // value: 1, // label: "便利店消费" // }, { value: 6, label: "甲醇消费" }, { value: 7, label: "天然气消费" } ], orderTypeOptions: [{ text: '可开订单', value: 0 }, { text: '其他订单', value: 1 }, ], // nowDate: moment().format("YYYY-MM"), isShowOrderScreen: false, invState: 0, formOrderIds: [], // 选中的订单id selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 showTipIndex: null, totalCount: 0, totalPage: 0, nowPage: 1, pageSize: 10, chooseOrder: [] // 选中的订单对象 }, initData(isRefresh = false) { // 获取订单数据 let that = this; let { mobile, } = that.data.$state.user.userInfo; let { currentDate, invState, orderTypeCurrentIndex, nowPage, pageSize, payAmountStart, payAmountEnd, listSiteInfo } = that.data; this.setData({ loading: true }); return new Promise((resolve, reject) => { initOrderData({ state:orderTypeCurrentIndex }, { memberId:that.data.$state.user.memberInfo.id, phone: mobile, memberNum: that.data.$state.user.memberInfo.number, invState, payAmountStart, payAmountEnd, stationId: listSiteInfo.pkId, stationName:listSiteInfo.siteName, startTime: currentDate[0] ? currentDate[0] : null, endTime: currentDate[1] ? currentDate[1] : null, nowPage: nowPage, pageSize: pageSize, }).then((res) => { let tmp = that.data.orderList.concat(res.list); that.setData({ orderList: tmp, loading: false, totalCount: res.totalCount, totalPage: res.totalPage, showNotify: isRefresh ? { zIndex: 99, top: this.data.tabHeight, } : null, }); wx.stopPullDownRefresh() return resolve(); }); }) }, selectPageOnChange({ detail }) { // 本页全选的事件 let ids = this.data.orderList.map((val, index) => { return String(val.omsOrderId); }); const params = this.getOrderListParams(ids); this.setData({ selectPageChecked: detail, formOrderIds: detail ? ids : [], chooseOrder: detail ? params : [] }); }, async selectAllOnChange({ detail }) { // 全部全选的事件 if (detail) { this.setData({ pageSize: this.data.totalCount, orderList: [], }); await this.initData(); } let ids = this.data.orderList.map((val, index) => { return String(val.omsOrderId); }); const params = this.getOrderListParams(ids); this.setData({ selectPageChecked: detail, selectAllChecked: detail, formOrderIds: detail ? ids : [], chooseOrder: detail ? params : [] }); }, checkedOnChange({ detail }) { // 点击选择订单 const params = this.getOrderListParams(detail); this.setData({ formOrderIds: detail, chooseOrder: params }); }, getOrderListParams(detail) { let { orderList } = this.data; return orderList.filter(item => detail.some(ele => ele == item.omsOrderId)) }, toggle(event) { if (this.data.invState !== 0) { return; } const { index } = event.currentTarget.dataset; const checkbox = this.selectComponent(`.checkboxes-${index}`); checkbox.toggle(); }, orderStateTap(e) { let { index } = e.currentTarget.dataset; this.setData({ showTipIndex: this.data.showTipIndex === index ? null : index }) }, orderTypeOnChange({ detail }) { // 查询可开订单和其他订单 this.setData({ invState: detail }, () => { this.setData({ nowPage: 1, pageSize: 10, formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 orderList: [] }); this.initData(); }); }, resetOrderSearch() { // 重置订单搜索 this.setData({ nowPage: 1, pageSize: 10, // currentDate: moment().format("YYYY-MM"),// 重置间为当前月份 currentDate: [moment(new Date()).subtract(3, "months").format("YYYY-MM-DD"), moment(new Date()).add(1, 'm').format("YYYY-MM-DD")], payAmountStart: "", // 实付支付金额() payAmountEnd: "", // 实付支付金额() orderList: [], formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 isShowOrderScreen: false }); this.initData(); }, screenConfirm({detail}) { // 筛选弹窗 确定事件 this.setData({ nowPage: 1, pageSize: 10, currentDate: detail.currentDate, payAmountStart: detail.payAmountStart, payAmountEnd: detail.payAmountEnd, orderList: [], listSiteInfo: detail.siteInfo, formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 isShowOrderScreen: false }); this.initData(); }, toDetails({ detail }) { // 查看详情 let { index } = detail.currentTarget.dataset; let orderPrams = this.data.orderList[index]; let omsOrderId = (this.data.orderTypeCurrentIndex === 0 || this.data.orderTypeCurrentIndex === 6 || this.data.orderTypeCurrentIndex === 7) ? orderPrams.orderNum : orderPrams.omsOrderId; wx.navigateTo({ url: `/pages/order/details/index?omsOrderId=${omsOrderId}&orderType=${this.data.orderTypeCurrentIndex}`, }); }, toInvoicing() { // 点击下一步 进入开票页面 app.store.setState({ ['invoive.chooseOrderList']: this.data.chooseOrder, }); wx.navigateTo({ url: `/pages/order/invoice/makeInvoice/index?orderType=${this.data.orderTypeCurrentIndex}&stationId=${this.data.listSiteInfo.pkId}`, }) }, refreshData() { this.setData({ nowPage: 1, pageSize: 10, orderList: [], formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 }, () => { this.initData(); }); }, showOrderScreen() { this.setData({ isShowOrderScreen: true }) }, onOrderScreenClose() { this.setData({ isShowOrderScreen: false }) }, chooseOrderTypeItem(e) { // 订单类型的样式切换 let { index } = e.currentTarget.dataset; this.setData({ orderTypeCurrentIndex: index, nowPage: 1, pageSize: 10, loading: true, formOrderIds: [], orderList: [], chooseOrder: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 }, () => { this.initData(); }); }, selecSitCallBack(item) { // 切换门店 选择门店后的回调函数 this.setData({ screenSiteInfo: item, listSiteInfo: item, nowPage: 1, loading: true, orderList: [], formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 }, () => { this.initData(true); }); }, switchSite() { // 订单切换门店 wx.navigateTo({ url: `/pages/selectSite/index`, }); }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { let that = this; wx.createSelectorQuery().selectAll('.fixed-height').boundingClientRect().exec(function (res) { that.setData({ tabHeight: res[0][0].height }) }); let type = Number(options.orderType); let { stationId, siteInfo } = that.data.$state.site; this.setData({ orderTypeCurrentIndex: 6, screenSiteInfo: siteInfo, listSiteInfo: siteInfo }, () => { this.initData(); }); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { this.setData({ nowPage: 1, loading: true, orderList: [], formOrderIds: [], selectPageChecked: false, // 本页全选的状态 selectAllChecked: false, // 全部全选的状态 }, () => { this.initData(true); }); }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { if (this.data.totalCount === this.data.orderList.length) { return; } this.setData({ nowPage: this.data.nowPage + 1, selectAllChecked: false, // 全部全选的状态 }, () => { this.initData(); }); }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } }) 组件 // components/screenTmp/index.js import moment from '../../utils/moment'; Component({ /** * 组件的属性列表 */ options: { addGlobalClass: true }, properties: { propDate:{ type:Array, value: [new Date(moment().subtract(2, "d").format("YYYY-MM-DD")).getTime(), new Date(moment().format("YYYY-MM-DD")).getTime()] }, siteInfo: { type: Object, value: () => { return {} } }, isShowOrderScreen: { type: Boolean, value: false }, isShowPayAmount: { type: Boolean, value: true }, isShowStation: { type: Boolean, value: false } }, /** * 组件的初始数据 */ data: { currentDate: ["", ""], calendarShow: false, defaultDate: [], //默认的开始间结束间 minDate: new Date(moment().subtract(3, "months").format("YYYY-MM-DD")).getTime(), // 最小显示的日期 maxDate: new Date(moment().add(1, 'm').format("YYYY-MM-DD")).getTime(), // 最大显示的日期 payAmountStart: "", payAmountEnd: "" }, /** * 组件的方法列表 */ methods: { onCalendarClose() { this.setData({ calendarShow: false }); }, onConfirm(event) { // 日期选择确定事件 const [start, end] = event.detail; this.setData({ calendarShow: false, currentDate: [moment(new Date(start)).format("YYYY-MM-DD"), moment(new Date(end)).format("YYYY-MM-DD")], }); }, showCalendar() { this.setData({ calendarShow: !this.data.calendarShow }) }, switchBtn() { this.triggerEvent('switchBtn'); }, calendarOnClose() { this.setData({ calendarShow: !this.data.calendarShow }) }, popupClose() { this.triggerEvent('popupclose'); }, payAmountonChange(e) { // 金额范围的input 事件 let { name } = e.currentTarget.dataset; this.setData({ [name]: e.detail }); }, reset() { // 重置按钮 this.setData({ currentDate: ["", ""], payAmountStart: "", payAmountEnd: "" }) this.triggerEvent('reset'); }, confirm(e) { // 确定筛选按钮 let params = { currentDate: this.data.currentDate, payAmountStart: this.data.payAmountStart, payAmountEnd: this.data.payAmountEnd, siteInfo:this.data.siteInfo } this.triggerEvent('confirm', params); }, } }) resetOrderSearch重置如何更改组件中的间数据,现在只是清除了输入框的数据,点日期还是上一次选的日期
最新发布
12-20
import {Text, View} from '@tarojs/components'; import {Image, Button} from '@antmjs/vantui'; import {ReactNode} from 'react'; import './index.scss'; interface BalanceInfoCardPropTypes { money:number, headerTitle?:ReactNode|string, tipsNode?:ReactNode, moneyTips?:ReactNode } const BalanceInfoCard = ({ money=0.00, headerTitle='可用额度', tipsNode=(<></>), moneyTips=(<></>) }:BalanceInfoCardPropTypes) => { return ( <View className='header-content'> <View className='header'> <View className='fg-1 ml-45 header-title'> <View> {typeof headerTitle === 'string' && (<Text className=''>{headerTitle}</Text>)} {typeof headerTitle === 'object' && (headerTitle)} </View> {tipsNode} <View> <Text className='header-title-money'>¥ {money.toFixed(2)}</Text> {moneyTips} </View> {/* 退款按钮 */} <View className='refund-button-container'> <Button block color='#4687FF' plain onClick={()=>{ // showDialog({ // selector: 'vanDialog', // message:'是否退出登录?', // showCancelButton:true // }).then(()=>{ // dispatch({ // type:CLEAR_USER, // text:null // }); // clearStorageSync(); // Taro.showLoading({ // title: '正在加载' // });; // setTimeout(()=>{ // Taro.hideLoading(); // Taro.switchTab({ // url:'/pages/tabBarPages/index/index' // }); // },1000); // }); }}>退款</Button> </View> </View> <View className='fg-1 money-big-content'> <View className='money-big'> <Image src={require('@/assets/images/money-big.png')} showLoading={false} width='220rpx' height='240rpx'></Image> </View> </View> </View> </View> ); }; export default BalanceInfoCard; import { View, Text } from '@tarojs/components'; import { Image, Row, Col, Field, Cell, ConfigProvider, Button, Icon } from '@antmjs/vantui'; import { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { getRechargeActivity } from '@/api/market'; import { insetPayRecord, wxAppOrders, insertRechargeOrderByAliPay } from '@/api/order'; import { getMemberInfo } from '@/store/actions/userAction'; import { aliPayment, wechatPayment } from '@/utils/appPay'; import Taro, { ENV_TYPE, useRouter, useLoad } from '@tarojs/taro'; import BalanceInfoCard from '../Components/BalanceInfoCard'; import './index.scss'; interface EventList { activityType: number, couponsCount: number, couponsList: Array<any> | null eventId: number, eventName: string, [propsName: string]: any } const themeVars = { cellVerticalPadding: '8rpx', cellFontSize: '26rpx', cellValueColor: '#333333', cellTextColor: '#333333', cellBorderColor: '#DDDDDD' }; // * 获取的充值活动 const BalanceRecharge = () => { const router = useRouter(); let { goBack } = router.params; const userInfo = useSelector((state: any) => state.userInfo_Store); const userRecentSite = useSelector((state: any) => state.userLocation_Store.recentSite); const [moneyList] = useState<Array<{ money: number }>>([ { money: 50 }, { money: 100 }, { money: 200 }, { money: 300 }, { money: 500 }, { money: 1000 }, { money: 2000 }, { money: 3000 }, { money: 5000 }, ]); const [customMoney, setCustomMoney] = useState<number | string>(''); const [moneyIndex, setMoneyIndex] = useState<number | null>(null); const [payMoney, setPayMoney] = useState<number>(0); const [currentEventList, setCurrentEventList] = useState<EventList | null>(null); // ? 是否选中活动 const [eventChecked, setEventChecked] = useState<boolean>(false); // ? 支付 是否同意协议 // const [agreeChecked,setAgreeChecked] = useState<boolean>(false); // @ts-ignore useLoad(async (option) => { console.log('===================================='); console.log(option.rechargeMoney); console.log('===================================='); option.rechargeMoney ? (() => { let index = moneyList.findIndex((v) => v.money === parseInt(option.rechargeMoney)); index === -1 ? setMoneyIndex(3) : setMoneyIndex(index); })() : (() => { setMoneyIndex(3); })(); // await getMemberInfo(userInfo.mobile, option.siteId); }); useEffect(() => { (customMoney || moneyIndex !== null) && getRechargeEvent(); }, [moneyIndex, customMoney]); // * 充值活动 const [eventList, setEventList] = useState<Array<EventList>>([]); const getRechargeEvent = () => { let money = moneyIndex === null ? customMoney : moneyList[moneyIndex].money; getRechargeActivity({ birthday: userInfo.birthday, busChannel: 1, cardType: 2, levelId: userInfo.levelId, memberType: userInfo.type, merchantId: userRecentSite.siteId, memberId: userInfo.id, moneyAmount: money, payType: Taro.getEnv() === ENV_TYPE.ALIPAY ? 1 : 2, type: 2 }).then((res: any) => { if (res.resultData.length === 0) { setCurrentEventList(null); setEventChecked(false); } if (res.resultData.length > 0) { setCurrentEventList(res.resultData[0]); setEventChecked(true); } setEventList(res.resultData); Taro.setStorageSync('eventList', res.resultData); setPayMoney(money as number); // setEventList(res.resultData); }); }; const toSelectEvent = (): void => { let changeIndex = eventList.findIndex((val) => { return val.eventId === currentEventList?.eventId; }); Taro.eventCenter.on('getSelectEvent', (params: EventList) => { !eventChecked && setEventChecked(true); setCurrentEventList(params); }); Taro.navigateTo({ url: `/pages/selectEvent/index?changeIndex=${changeIndex}` }); }; // const getEventParams = ()=>{ // // 选择活动之后传入接口 // if(eventChecked){ // return { // activityID: currentEventList?.eventId, // rechargeAmount: (payMoney +currentEventList?.rewardAddAmount), // sendIntegral: currentEventList?.rewardAddIntegral ? currentEventList?.rewardAddIntegral : 0, // rewardCoupon: !currentEventList?.couponsList ? // null : (() => { // return currentEventList?.couponsList.map((val) => { // return val.couponId; // }).join(','); // })(), // }; // } // return {}; // // }; const submitRecharge = () => { // if(Taro.getEnv() === ENV_TYPE.ALIPAY){ // Taro.showModal({ // title:'支付宝暂不支持充值', // showCancel:false // }); // return; // } // if(![49].includes(userRecentSite.companyId)){ // Taro.showModal({ // content:'当前站点不支持充值', // showCancel:false // }); // return; // } if (customMoney) { let reg = new RegExp(/^0\.([1-9]|\d[1-9])$|^[1-9]\d{0,8}\.\d{0,2}$|^[1-9]\d{0,8}$/); if (!reg.test(String(customMoney))) { Taro.showToast({ icon: 'error', title: '金额格式错误' }); return; } } Taro.showLoading({ title: '请求支付' }); let payment: number | string = moneyIndex === null ? customMoney : moneyList[moneyIndex].money; Taro.getEnv() === ENV_TYPE.ALIPAY ? (() => { // 支付宝支付 insertRechargeOrderByAliPay({ actualMoney: payment as number, buyerOpenId: userInfo.openId, discountMoney: eventChecked ? currentEventList?.rewardAddAmount : 0, eventId: eventChecked ? currentEventList?.eventId : null, eventName: eventChecked ? currentEventList?.eventName : null, memberId: userInfo.id, siteCode: userRecentSite.siteCode, totalAmount: eventChecked ? (Number(payment) + currentEventList?.rewardAddAmount) : Number(payment) }).then((r) => { aliPayment(r.resultData.tradeNo).then(async () => { await paySuccessCallBack(); }).catch(() => { Taro.hideLoading(); }); }).catch(() => { Taro.hideLoading(); }); })() : (() => { // 微信支付 insetPayRecord({ actualMoney: payment as number, balance: userInfo.totalBalance, cardNum: userInfo.number, company: userRecentSite.companyName, discountMoney: eventChecked ? currentEventList?.rewardAddAmount : 0, discountType: eventChecked ? 0 : 3, eventId: eventChecked ? currentEventList?.eventId : null, eventName: eventChecked ? currentEventList?.eventName : null, memberId: userInfo.id, mobile: userInfo.mobile, payType: 2, siteCode: userRecentSite.siteCode, siteName: userRecentSite.siteName, totalMoney: eventChecked ? (Number(payMoney) + currentEventList?.rewardAddAmount) : Number(payMoney) }).then((r: any) => { wxAppOrders({ orderId: r.resultData.orderNum, siteId: userRecentSite.siteId, subOpenId: userInfo.openId, txnAmt: r.resultData.actualMoney, }).then((res: any) => { wechatPayment(res.data.data).then(async () => { await paySuccessCallBack(); }).catch(() => { Taro.hideLoading(); }); }); }).catch(() => { Taro.hideLoading(); }); })(); }; const paySuccessCallBack = async () => { Taro.showToast({ icon: 'success', title: '充值成功' }); await getMemberInfo(userInfo.mobile); Taro.hideLoading(); if (goBack) { Taro.navigateBack({ delta: 1 }); } else { setMoneyIndex(3); setCustomMoney(''); } }; return ( <ConfigProvider themeVars={themeVars}> <View className='index'> <BalanceInfoCard money={userInfo.totalBalance}></BalanceInfoCard> <View className='operation-content'> <View className='container' style={{ marginBottom: 0 }}> <View className='df f-ac'> <View className='title-block'></View> <View className='fs-35'>我要充值</View> </View> {/* 充值金额*/} <Row className='money-content' gutter={20}> { moneyList.map((val: any, index: number) => { return ( <Col span={8} key={index}> <View className={`money-list-item ${moneyIndex === index ? 'money-list-item-active' : ''}`} onClick={() => { setCustomMoney(''); setMoneyIndex(index); }}> <Image className='money-icon' src={require('@/assets/images/money-icon.png')} width='43rpx' height='43rpx'></Image> <Text className='money'>{val.money}</Text> <Text className='company'>元</Text> <Icon name='success' style={{ display: moneyIndex === index ? 'block' : 'none' }} className='success-icon' size='15px' color='#ffffff'></Icon> </View> </Col> ); }) } {/*自定义金额*/} <Col span={24} className=''> <View className={`money-list-item df f-ac ${customMoney !== '' ? 'money-list-item-active' : ''}`}> <View className='fg-1 custom-money-content'> <Row> <Col span={8} className='tx-r'> <Image src={require('@/assets/images/money-icon.png')} width='43rpx' height='43rpx'></Image></Col> <Col span={16}> <Field value={customMoney} placeholder='请输入其他面额' border={false} type='digit' onFocus={() => { // * 自定义价格获得焦点 setMoneyIndex(null); }} onBlur={(e) => { {/* 在ide 当前方法没效果 真机调试无问题 */ } if (!e.detail || e.detail === '') { setMoneyIndex(3); setCustomMoney(''); return; } setCustomMoney(e.detail); }} /> </Col> </Row> </View> <Icon name='success' style={{ display: customMoney ? 'block' : 'none' }} className='success-icon' size='15px' color='#ffffff'></Icon> </View> </Col> </Row> </View> {/*活动选择*/} <View className='event-change-content'> <View className='select-current-event df f-ac'> <View className='df f-ac fg-1' onClick={() => { if (!currentEventList) return; setEventChecked(!eventChecked); }}> <View className={`checked-box ${eventChecked && 'checked-box-active'}`}> { eventChecked && ( <Icon name='success' color='#ffffff' size={35}></Icon> ) } </View> <View className='event-content'> <View> { !currentEventList ? ( <Text>暂无可用活动</Text> ) : ( <Text>{currentEventList['eventName']}</Text> ) } </View> </View> </View> { eventList.length > 0 && ( <> <View onClick={() => { toSelectEvent(); }}> <Text className='fc-666666 fs-26'>共 {eventList.length} 个活动可选</Text> </View> <View> <Icon name='arrow' className='arrow-icon'></Icon> </View></> ) } </View> </View> <View className='card-content'> <Cell renderTitle={ <Text className='fs-26'>赠送金额:</Text> } renderExtra={ <Text className='price'>¥ {eventChecked && currentEventList ? currentEventList['rewardAddAmount'] : 0.00}</Text> } /> <Cell renderTitle={ <Text className='fs-26'>实充金额:</Text> } renderExtra={ <Text className='price'>¥ {payMoney}</Text> } /> </View> </View> <View className='pay-content'> {/*<Checkbox value={agreeChecked} checkedColor='#FFB01D' onChange={(e) => setAgreeChecked(e.detail)}>*/} {/* <Text>我已阅读并同意</Text>*/} {/* <Text className='fc-FFB01D'>《小惠易电-充电用户充值协议》</Text>*/} {/*</Checkbox>*/} <Button block color='#4687FF' round className='mt-30' onClick={() => submitRecharge()}> {Taro.getEnv() === ENV_TYPE.ALIPAY ? '支付宝支付' : '微信支付'} </Button> <View className='safe-area-inset-bottom'></View> </View> </View> </ConfigProvider> ); }; export default BalanceRecharge; import {View,ScrollView,Text} from '@tarojs/components'; import {useState, useCallback, useEffect, useRef} from 'react'; import Taro, {usePullDownRefresh,ENV_TYPE} from '@tarojs/taro'; import {Button,Icon,DatetimePicker,Popup,Dialog} from '@antmjs/vantui'; import moment from 'moment'; import {useSelector} from 'react-redux'; import {selectRechargeOrderList,selectWaitChargeOrder} from '@/api/order'; import EmptyList from '@/Components/EmptyList'; import ListLoading from '@/Components/ListLoading'; import {showDialog} from '@/utils/UIControl'; import BalanceInfoCard from '../Components/BalanceInfoCard'; import './index.scss'; export interface ListChildren { cardNum:string, actualMoney:number, balance:number, memberId:number, state:number, orderNum:string, orderSource:number, payType:number, totalMoney:number, siteId:number, [propName:string]:any } interface RechargeListOptions { totalCount:number, loading:boolean, list:Array<ListChildren> } interface DateOptions { show:boolean, currentDate:string|number, minDate:string|number, maxDate:string|number } const BalanceDetail = () => { const nowPage = useRef<number>(1); const [rechargeListOptions,setRechargeListOptions] = useState<RechargeListOptions>({ totalCount:0, loading:true, list:[] }); const userInfo = useSelector((state:any)=>state.userInfo_Store); const userRecentSite = useSelector((state:any)=> state.userLocation_Store.recentSite); const [dateOptions, setDateOptions] = useState<DateOptions>({ show:false, currentDate:new Date().getTime(), maxDate:new Date().getTime(), minDate: new Date('2019-01-01').getTime(), }); const [refreshLoading,setRefreshLoading] = useState<boolean>(false); const formatter = useCallback((type, value)=>{ if (type === 'year') { return `${value}年`; } if (type === 'month') { return `${value}月`; } return value; },[]); const dateOnConfirm = ({detail}):void=>{ nowPage.current = 1; setRechargeListOptions({ ...rechargeListOptions, loading:true, list:[] }); setDateOptions({ ...dateOptions, show:false, currentDate:detail.value }); }; useEffect(()=>{ rechargeListOptions.loading && getRechargeList(); },[dateOptions.currentDate,rechargeListOptions.loading]); useEffect(()=>{ refreshLoading && getRechargeList(); },[refreshLoading]); usePullDownRefresh(() => { refreshData(); }); const refreshData = ()=>{ setRechargeListOptions({ totalCount:0, list:[], loading:true }); nowPage.current = 1; setRefreshLoading(true); }; const getRechargeList = ():void=>{ selectRechargeOrderList({ memberMobile: userInfo.mobile, state:[1,2,3], pageSize: 10, startTime: moment(dateOptions.currentDate).format('YYYY-MM-01 00:00:00'), endTime: moment(dateOptions.currentDate).endOf('month').format('YYYY-MM-DD 23:59:59'), nowPage:nowPage.current }).then((res:any)=>{ let data:RechargeListOptions = { loading:false, ...res.resultData, list: rechargeListOptions.list.concat(res.resultData.list) }; setRechargeListOptions({...rechargeListOptions,...data}); setRefreshLoading(false); Taro.stopPullDownRefresh(); }); }; const toDetail = (val):void=>{ Taro.navigateTo({ url:'./refundOperation/index', success:(res)=>{ res.eventChannel.emit('getRechargeInfo', val); } }).then(()=>{ Taro.eventCenter.on('refreshRechargeRecords',()=>{ setRechargeListOptions({ totalCount:0, list:[], loading:true }); nowPage.current = 1; setRefreshLoading(true); }); }); }; return ( <View className='balance-info-card-content'> <Dialog id='balanceDialog'/> <View> <BalanceInfoCard money={userInfo.totalBalance}></BalanceInfoCard> </View> <View className='list-content '> <View className='date-btn-content'> <Button color='#EAF0FE' round size='small' className='list-date-btn' onClick={()=>{ setDateOptions({ ...dateOptions, show:true }); }}> <Text>{moment(dateOptions.currentDate).format('YYYY-MM')}</Text> <Icon name='arrow-down' size='30' className='arrow-down'></Icon> </Button> </View> <View className='list-item-content'> <ScrollView className='list-scroll-view' scrollY refresherEnabled={false} refresherTriggered={refreshLoading} onScrollToLower={()=>{ if(rechargeListOptions.loading || rechargeListOptions.list.length === rechargeListOptions.totalCount){ return; } nowPage.current = nowPage.current+1; getRechargeList(); }}> <ListLoading total={rechargeListOptions.totalCount} loading={rechargeListOptions.loading}> <View className='list-card'> { rechargeListOptions.list.length > 0 && rechargeListOptions.list.map((val:ListChildren,index:number)=>{ return ( <View className='list-card-item' key={index} onClick={()=>{ if(val.state=== 2 || val.state === 3) toDetail(val); }}> { (val.state=== 2 || val.state === 3) && ( <View className='fc-4687FF fs-24 order-state-content'> <Text>{val.stateStr}</Text> <Icon name='arrow' className='arrow-icon' size={23}></Icon> </View> ) } <View className='df f-ac'> <View className='fg-1'> <View className=''> <Text className='fc-333333 fs-28'>{val.orderNum}</Text> </View> <View> <Text className='fs-24 fc-aaaaaa'>{moment(val.createTime).format('MM-DD HH:mm:ss')}</Text> </View> </View> <View> <View className='tx-r'> <Text className='fs-28 fc-F83D46'>{val.state=== 1 ? '+' : '-'}{val.totalMoney}</Text> </View> <View className='tx-r'> <Text className='fs-24 fc-999999'>余额:¥{val.balance}</Text> </View> </View> <View className='ml-15'> <Button size='mini' disabled={(val.state !== 1)} color='#FDE6E7' onClick={()=>{ //如果当前有充电中订单,不允许退款 selectWaitChargeOrder({ memberCreateTime: userInfo.createdAt, memberId: userInfo.id, memberMobile: userInfo.mobile, nowTime: moment(new Date()).format('YYYY-MM-DD HH:mm:ss') }).then((res: any) => { if (res.resultData && res.resultData.length > 0) { Taro.showToast({ icon:'error', title:'充电中不可退款' }); } else { toDetail(val); } }); }}> <Text className='fc-F83D46'>{ val.state !== 3 ? '退款' : '已退款' }</Text> </Button> </View> </View> </View> ); }) } { rechargeListOptions.list.length === 0 && ( <EmptyList></EmptyList> ) } </View> </ListLoading> </ScrollView> </View> </View> { Taro.getEnv() === ENV_TYPE.WEAPP && ( <View className='recharge-btn-content safe-area-inset-bottom'> <Button round color='#288CFF' block onClick={()=>{ if(userRecentSite && userRecentSite.siteId){ Taro.navigateTo({ url:'../balanceRecharge/index' }); }else{ showDialog({ selector: 'balanceDialog', message: '请在首页切换有站点地区', showCancelButton: false, }).then(() => { return; }).catch(()=>{ return; }); } }}>充值</Button> </View> ) } <Popup show={dateOptions.show} position='bottom'> <DatetimePicker type='year-month' value={dateOptions.currentDate} minDate={dateOptions.minDate} maxDate={dateOptions.maxDate} onConfirm={dateOnConfirm} formatter={formatter} onCancel={()=>{ setDateOptions({ ...dateOptions, show:false }); }} /> </Popup> </View> ); }; export default BalanceDetail; BalanceInfoCard是一个公用组件,在其他页面如BalanceRecharge充值、 BalanceDetail账户详情、都有引用,只在账户详情页面引用才展示退款按钮,该如何修改这几个文件
12-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值