完成发票管理功能

main
王文龙 2024-02-27 10:25:29 +08:00
parent ab8ccc7741
commit 37a7089aa9
16 changed files with 316 additions and 111 deletions

View File

@ -44,6 +44,9 @@ export function imgUpload (params = {}) {
export function involiceList (params = {}) { export function involiceList (params = {}) {
return req.get(`/orders/invoice`, params) return req.get(`/orders/invoice`, params)
} }
export function involiceResend (params = {}) {
return req.post(`/orders/invoice/resend`, params)
}
export function zitiCode (params = {}) { export function zitiCode (params = {}) {
return req.get(`/ziticode`, params) return req.get(`/ziticode`, params)

View File

@ -116,6 +116,10 @@ export default class SearchBar extends Component {
handleBlurSearch = () => { handleBlurSearch = () => {
this.props.onBlur?.() this.props.onBlur?.()
this.setState({
showSearchDailog: false,
isShowAction: false
})
} }
render () { render () {

View File

@ -43,7 +43,7 @@ function SpGoodsPrice (props) {
</View> </View>
} }
{ {
!isPoint && <SpPrice size={36} className='sale-price' value={price} /> !isPoint && <SpPrice size={36} className='sale-price' value={price} showSeparator noDecimal={false} />
} }
{/* {marketPrice > 0 && enMarketPrice && ( {/* {marketPrice > 0 && enMarketPrice && (
<SpPrice className='mkt-price' lineThrough value={marketPrice} /> <SpPrice className='mkt-price' lineThrough value={marketPrice} />

View File

@ -123,6 +123,7 @@ export const GOODS_INFO = {
itemBn: 'item_bn', itemBn: 'item_bn',
itemName: 'itemName', itemName: 'itemName',
itemName2: 'item_name_2', itemName2: 'item_name_2',
pdp: 'pdp',
brief: 'brief', brief: 'brief',
img: 'pics[0]', img: 'pics[0]',
imgs: 'pics', imgs: 'pics',

View File

@ -128,6 +128,7 @@ export const TRADE_AFTER_SALES_ITEM = {
afterSalesMobile: ({ aftersales_address }) => aftersales_address.aftersales_mobile, afterSalesMobile: ({ aftersales_address }) => aftersales_address.aftersales_mobile,
afterSalesAddress: ({ aftersales_address }) => aftersales_address.aftersales_address, afterSalesAddress: ({ aftersales_address }) => aftersales_address.aftersales_address,
afterSalesContact: ({ aftersales_address }) => aftersales_address.aftersales_contact, afterSalesContact: ({ aftersales_address }) => aftersales_address.aftersales_contact,
afterSalesZip: ({ aftersales_address }) => aftersales_address.post_code,
aftersalesHours: ({ aftersales_address }) => aftersales_address.aftersales_hours, aftersalesHours: ({ aftersales_address }) => aftersales_address.aftersales_hours,
refundFee: ({ refund_fee }) => refund_fee / 100, refundFee: ({ refund_fee }) => refund_fee / 100,
sendbackData: 'sendback_data', sendbackData: 'sendback_data',

View File

@ -19,11 +19,11 @@ export default (props = {}) => {
// const { params, orderInfo } = state // const { params, orderInfo } = state
const cashierResultUrl = `/pages/cart/cashier-result` const cashierResultUrl = `/pages/cart/cashier-result`
const $instance = getCurrentInstance() const $instance = getCurrentInstance()
console.log("🚀 ~ $instance.router:", $instance.router) // console.log("🚀 ~ $instance.router:", $instance.router)
const currentPath = $instance.router?.path const currentPath = $instance.router?.path
const cashierPayment = (params, orderInfo) => { const cashierPayment = (params, orderInfo) => {
console.log(`cashierPayment:`, params, orderInfo) // console.log(`cashierPayment:`, params, orderInfo)
const { pay_type, pay_channel } = params const { pay_type, pay_channel } = params
switch (pay_type) { switch (pay_type) {
case 'wxpay': case 'wxpay':

View File

@ -124,7 +124,7 @@ function CartCheckout (props) {
scene, // 情景值 scene, // 情景值
goodType = routerParams.goodType goodType = routerParams.goodType
} = $instance?.router?.params || {} } = $instance?.router?.params || {}
console.log('$instance.router?.params:', $instance.router) // console.log('$instance.router?.params:', $instance.router)
useEffect(() => { useEffect(() => {
if (isLogin) { if (isLogin) {
getTradeSetting() getTradeSetting()
@ -148,7 +148,7 @@ function CartCheckout (props) {
}, [isNewUser]) }, [isNewUser])
useEffect(() => { useEffect(() => {
console.log(`useEffect: payType: ${payType}, address: ${address}, zitiAddress: ${zitiAddress}, receiptType: ${receiptType}`) // console.log(`useEffect: payType: ${payType}, address: ${address}, zitiAddress: ${zitiAddress}, receiptType: ${receiptType}`)
if (receiptType && payType) { if (receiptType && payType) {
calcOrder() calcOrder()
} }
@ -249,7 +249,7 @@ function CartCheckout (props) {
params['building_number'] = buildingNumber params['building_number'] = buildingNumber
params['house_number'] = houseNumber params['house_number'] = houseNumber
} }
console.log('trade params:', params) // console.log('trade params:', params)
if (params.pay_type === 'deposit') { if (params.pay_type === 'deposit') {
// 验证余额额度是否可用 // 验证余额额度是否可用
if (userInfo.deposit < totalInfo.total_fee / 100) { if (userInfo.deposit < totalInfo.total_fee / 100) {
@ -365,6 +365,24 @@ function CartCheckout (props) {
// 开发票 // 开发票
const handleInvoiceClick = () => { const handleInvoiceClick = () => {
Taro.navigateTo({
url: `/subpage/pages/trade/invoice-info?id=${totalInfo.tid || ''}`,
events: {
// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
acceptDataFromOpenedPage: function ({ data = {} }) {
const { invoiceTitle } = data
setState((draft) => {
draft.invoiceTitle = invoiceTitle
draft.paramsInfo = { ...paramsInfo, ...(data.paramsInfo || {}) }
})
},
},
success: function (res) {
// 通过eventChannel向被打开页面传送数据
res.eventChannel.emit('acceptDataFromOpenerPage', { data: totalInfo })
}
})
return
authSetting('invoiceTitle', async () => { authSetting('invoiceTitle', async () => {
const res = await Taro.chooseInvoiceTitle() const res = await Taro.chooseInvoiceTitle()
if (res.errMsg === 'chooseInvoiceTitle:ok') { if (res.errMsg === 'chooseInvoiceTitle:ok') {

View File

@ -215,7 +215,7 @@ function Home () {
postions: 'left', postions: 'left',
url: '', url: '',
img: 'index/rec/new.png', img: 'index/rec/new.png',
list: newList list: newList.map(item => ({ ...item, price: (item.price / 100) }))
}, { }, {
type: 'hot', type: 'hot',
text: "热销单品", text: "热销单品",
@ -223,7 +223,7 @@ function Home () {
postions: 'left', postions: 'left',
url: '', url: '',
img: 'index/rec/hot.png', img: 'index/rec/hot.png',
list: hotList list: hotList.map(item => ({ ...item, price: (item.price / 100) }))
}, { }, {
type: 'jd', type: 'jd',
text: "ARIZONA", text: "ARIZONA",
@ -231,7 +231,7 @@ function Home () {
postions: 'right', postions: 'right',
url: '', url: '',
img: 'index/rec/jd.png', img: 'index/rec/jd.png',
list: jdList list: jdList.map(item => ({ ...item, price: (item.price / 100) }))
} }
] ]
}) })
@ -246,12 +246,11 @@ function Home () {
goods: (item.goods_info_detail || []).map((ite) => { goods: (item.goods_info_detail || []).map((ite) => {
return { return {
itemName: ite.item_name, itemName: ite.item_name,
price: ite.price,
goods_id: ite.item_id, goods_id: ite.item_id,
itemId: ite.item_id, itemId: ite.item_id,
pic: ite.pics?.[0], pic: ite.pics?.[0],
brief: ite.brief, brief: ite.brief,
price: ite.price, price: ite.price ? ite.price / 100 : 0,
spec_images: ite.spec_images || [], spec_images: ite.spec_images || [],
tagList: ite.tagList || [] tagList: ite.tagList || []
} }

View File

@ -604,7 +604,7 @@ function EspierDetail (props) {
<View className='goods-name-wrap'> <View className='goods-name-wrap'>
<View className='goods-name'> <View className='goods-name'>
<View className='brief'>{info.brief}</View> {info.pdp && <View className='brief'>{info.pdp}</View>}
<View className='title'>{info?.itemName2 || info?.itemName}</View> <View className='title'>{info?.itemName2 || info?.itemName}</View>
</View> </View>
{/* {(isWeixin || isAPP()) && ( {/* {(isWeixin || isAPP()) && (

View File

@ -357,6 +357,7 @@ function ItemList () {
placeholder='搜索商品' placeholder='搜索商品'
isOpened={true} isOpened={true}
onFocus={handleOnFocus} onFocus={handleOnFocus}
onBlur={() => handleConfirm(keywords)}
onChange={handleOnChange} onChange={handleOnChange}
onClear={handleOnClear} onClear={handleOnClear}
onCancel={handleSearchOff} onCancel={handleSearchOff}

View File

@ -10,22 +10,54 @@ import doc from '@/doc'
import './invoice-info.scss' import './invoice-info.scss'
import { useImmer } from 'use-immer' import { useImmer } from 'use-immer'
import { useEffect } from 'react'
const initState = { const initState = {
formList: [ formList: [
{ {
name: '抬头类型', name: '抬头类型',
type: 'checkbox', type: 'checkbox',
key: 'invoice_title', key: 'title',
required: true, required: true,
}, },
{ {
name: '发票抬头', name: '发票抬头',
type: 'input', type: 'input',
key: 'invoice_title', key: 'content',
placeholder: '请填写抬头名称(必填)', placeholder: '请填写抬头名称(必填)',
required: true, required: true,
}, },
{
name: '企业税号',
type: 'input',
key: 'registration_number',
placeholder: '请填写企业税号(选填)',
required: true,
},
{
name: '注册地址',
type: 'input',
key: 'company_address',
placeholder: '(选填)',
},
{
name: '注册电话',
type: 'input',
key: 'company_phone',
placeholder: '(选填)',
},
{
name: '开户银行',
type: 'input',
key: 'bankname',
placeholder: '(选填)',
},
{
name: '银行账号',
type: 'input',
key: 'bankaccount',
placeholder: '(选填)',
},
{ {
name: '邮箱地址', name: '邮箱地址',
type: 'input', type: 'input',
@ -33,42 +65,52 @@ const initState = {
placeholder: '用于接收电子发票(必填)', placeholder: '用于接收电子发票(必填)',
required: true, required: true,
}, },
{
name: '注册地址',
type: 'input',
key: 'addr',
placeholder: '(选填)',
},
{
name: '注册电话',
type: 'input',
key: 'tel',
placeholder: '(选填)',
},
{
name: '开户银行',
type: 'input',
key: 'yh',
placeholder: '(选填)',
},
{
name: '银行账号',
type: 'input',
key: 'zh',
placeholder: '(选填)',
},
], ],
form: {}, form: {},
showModal: false, showModal: false,
visible: false, visible: false,
showDetail: false showDetail: false,
invoiceId: '',
invoice: {},
orderInfo: {},
loading: false,
title: '',
totalFee: '',
toastShow: false,
invoiceInfo: {}
} }
function InvoiceInfo (props) { function InvoiceInfo (props) {
const $instance = getCurrentInstance()
const [state, setState] = useImmer(initState) const [state, setState] = useImmer(initState)
const { formList, form, showModal, visible, showDetail } = state const { formList, form, showModal, visible, showDetail, invoiceId, invoice, orderInfo, loading, title, totalFee, toastShow, invoiceInfo } = state
const pages = getCurrentPages()
const current = pages[pages.length - 1]
const eventChannel = current.getOpenerEventChannel()
const onChangeItemCheck = () => { useEffect(() => {
const { id } = $instance.router.params
if (id && id !== 'undefined') {
setState((draft) => {
draft.showDetail = true,
draft.invoiceId = id
})
}
// 监听acceptDataFromOpenerPage事件获取上一页面通过eventChannel传送到当前页面的数据
eventChannel?.on('acceptDataFromOpenerPage', function ({ data }) {
setState((draft) => {
draft.orderInfo = data.order || data || {}
draft.invoiceInfo = data.invoice || {}
draft.form = data.order?.invoice || {}
draft.title = data.order?.title ? data.order.title === 'unit' ? '个人' : '企业' : ''
draft.totalFee = data.order?.total_fee ?? ''
})
})
}, [])
const onChangeItemCheck = (val) => {
setState((draft) => {
draft.form = { ...form, title: val }
})
} }
const hadnleInput = (val, item) => { const hadnleInput = (val, item) => {
@ -83,11 +125,72 @@ function InvoiceInfo (props) {
draft.visible = false draft.visible = false
}) })
} }
const handleSubmit = async () => {
const { email } = form
const emailReg = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
if (!emailReg.test(email)) {
Taro.showToast({
title: '邮箱格式不正确',
icon: 'none',
duration: 1000
})
return
}
setState((draft) => {
draft.visible = false
// draft.toastShow = true
// draft.showModal = true
})
const res = await api.trade.involiceResend({
order_id: orderInfo.order_id,
email
})
Taro.showToast({
title: '发送成功',
icon: 'success',
duration: 1500
})
setTimeout(() => {
Taro.navigateBack()
}, 2000)
}
const handSubmitInvoice = () => {
const { email, title, content } = form
if (!title) {
Taro.showToast({
title: '请选择抬头类型',
icon: 'none',
duration: 1000
})
return
}
if (!content) {
Taro.showToast({
title: '请填写抬头名称',
icon: 'none',
duration: 1000
})
return
}
const emailReg = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
if (!emailReg.test(email)) {
Taro.showToast({
title: '邮箱格式不正确',
icon: 'none',
duration: 1000
})
return
}
eventChannel?.emit('acceptDataFromOpenedPage', { data: invoice })
Taro.navigateBack()
}
const handleInvoiceClick = () => { const handleInvoiceClick = () => {
authSetting('invoiceTitle', async () => { authSetting('invoiceTitle', async () => {
const res = await Taro.chooseInvoiceTitle() const res = await Taro.chooseInvoiceTitle()
if (res.errMsg === 'chooseInvoiceTitle:ok') { if (res.errMsg === 'chooseInvoiceTitle:ok') {
log.debug('[invoice] info:', res) // log.debug('[invoice] info:', res)
const { const {
type, type,
content, content,
@ -110,50 +213,84 @@ function InvoiceInfo (props) {
company_phone company_phone
} }
} }
console.log("🚀 ~ invoice_parmas:", invoice_parmas) // console.log("🚀 ~ invoice_parmas:", invoice_parmas)
// setState((draft) => { setState((draft) => {
// draft.invoiceTitle = content draft.invoice = {
// draft.paramsInfo = { ...paramsInfo, ...invoice_parmas } invoiceTitle: content,
// }) paramsInfo: invoice_parmas
}
draft.form = invoice_parmas.invoice_content
})
} }
}) })
} }
return <SpPage className='page-invoice-info has-navbar' navigationBarTitleText='开票信息'> // 预览文件
const preview = (url, fileName) => {
Taro.downloadFile({
url: url,
success: function (res) {
console.log("下载:", res)
var filePath = res.tempFilePath
Taro.openDocument({
filePath: filePath,
fileType: getFileType(url),
fileName: fileName,
success: function (res) {
console.log("打开:", res)
},
})
},
})
}
// 获取文件类型
const getFileType = (name = '') => {
if (name.lastIndexOf(".") > -1) {
return name.slice(name.lastIndexOf(".") + 1).toLowerCase()
} else {
return ""
}
}
return <SpPage className='page-invoice-info has-navbar' loading={loading} navigationBarTitleText='开票信息'>
<View className="info-bd"> <View className="info-bd">
{showDetail && <View className="info-bd-tips">{0}张发票{1}个订单</View>} {showDetail && <View className="info-bd-tips">{1}张发票{1}个订单</View>}
<View className="info-item"> <View className="info-item">
<View className="tit">发票类型</View> <View className="tit">发票类型</View>
<View className="content"> <View className="content">
<Text>电子发票</Text> <Text>电子发票</Text>
{showDetail ? <View className='flex'> {showDetail ? <View className='flex'>
<Text className='ck'>查看</Text> <Text className='ck' onClick={() => preview(invoiceInfo.pdf_info, invoiceInfo.invoice_title + invoiceInfo.invoice_no)}>查看</Text>
<AtIcon value='chevron-right' size='18' color='#000'></AtIcon> <Text className='iconfont icon-qianwang-01'></Text>
{/* <AtIcon value='chevron-right' size='18' color='#000'></AtIcon> */}
</View> : <Text className='sq' onClick={handleInvoiceClick}></Text>} </View> : <Text className='sq' onClick={handleInvoiceClick}></Text>}
</View> </View>
</View> </View>
{showDetail && <View className="info-item"> {showDetail && <View className="info-item">
<View className="tit">发票状态</View> <View className="tit">发票状态</View>
<View className="content"> <View className="content">
<Text>已申请</Text> <Text>{orderInfo.is_invoiced == 1 ? '已开票' : '已申请'}</Text>
</View> </View>
</View>} </View>}
<View className="info-item"> <View className="info-item">
<View className="tit">发票金额</View> <View className="tit">发票金额</View>
<View className="content"> <View className="content">
<Text>¥9999</Text> <Text>¥{totalFee ? parseFloat(totalFee).toFixed(2) : (orderInfo.total_fee ? (orderInfo.total_fee / 100).toFixed(2) : 0)}</Text>
</View> </View>
</View> </View>
{formList.map((item) => <View className="info-item"> {formList.map((item) => <View className="info-item">
<View className="tit">{item.name}</View> <View className="tit">{item.name}</View>
{showDetail ? <View className="content">{form[item.key] || '测试'}</View> : <>{item.type === 'checkbox' && <View className="content"> {showDetail && item.key !== 'email' ? <View className="content">{item.key === 'title' ? title || orderInfo.invoice?.[item.key] || form[item.key] : orderInfo.invoice?.[item.key] || form[item.key] || ''}</View> : <>{item.type === 'checkbox' && <View className="content">
<View className="content-item"> <View className="content-item">
<SpCheckboxNew checked={form.gr === '1'} onChange={() => onChangeItemCheck()} > <SpCheckboxNew checked={form.title === 'individual'} onChange={() => onChangeItemCheck('individual')} >
<Text className="">个人/非企业单位</Text> <Text className="">个人/非企业单位</Text>
</SpCheckboxNew> </SpCheckboxNew>
</View> </View>
<View className="content-item"> <View className="content-item">
<SpCheckboxNew checked={form.gr === '2'} onChange={onChangeItemCheck()} > <SpCheckboxNew checked={form.title === 'unit'} onChange={() => onChangeItemCheck('unit')} >
<Text className="">企业</Text> <Text className="">企业</Text>
</SpCheckboxNew> </SpCheckboxNew>
</View> </View>
@ -173,11 +310,20 @@ function InvoiceInfo (props) {
</View> </View>
</View>} </View>}
</View> </View>
<View className={classNames("bottom")}> {!showDetail ? <View className={classNames("bottom")}>
<View onClick={() => setState((draft) => { <View onClick={() => {
draft.visible = true handSubmitInvoice()
})} className={classNames("btn", { "btn-disabled": true })}>提交申请</View> // setState((draft) => {
</View> // draft.visible = true
// })
}} className={classNames("btn", { "btn-disabled": !form.title || !form.content || !form.email })}>提交申请</View>
</View> : orderInfo.is_invoiced == 1 && <View className={classNames("bottom")}>
<View onClick={() => {
setState((draft) => {
draft.visible = true
})
}} className={classNames("btn")}>重发发票</View>
</View>}
<View className="sp-picker"> <View className="sp-picker">
<View <View
@ -204,29 +350,31 @@ function InvoiceInfo (props) {
</View> </View>
<View className='sp-picker-bd-item'> <View className='sp-picker-bd-item'>
<View className="tit">抬头类型</View> <View className="tit">抬头类型</View>
<View className="content">电子发票</View> <View className="content">{form.title === 'unit' ? '企业' : '个人'}</View>
</View> </View>
<View className='sp-picker-bd-item'> <View className='sp-picker-bd-item'>
<View className="tit">发票抬头</View> <View className="tit">发票抬头</View>
<View className="content">电子发票</View> <View className="content">{form.content}</View>
</View>
<View className='sp-picker-bd-item'>
<View className="tit">税号</View>
<View className="content">{form.registration_number}</View>
</View> </View>
</>} </>}
<View className='sp-picker-bd-item'> <View className='sp-picker-bd-item'>
<View className="tit">邮箱地址</View> <View className="tit">邮箱地址</View>
<View className="content">电子发票</View> <View className="content">{form.email}</View>
</View> </View>
<View onClick={() => setState((draft) => { <View onClick={handleSubmit} className={classNames("btn", { "notop": showDetail })}>提交申请</View>
draft.visible = false
draft.showModal = true
})} className={classNames("btn", { "notop": showDetail })}>提交申请</View>
</View> </View>
</View> </View>
</View> </View>
<View className={classNames('toast', { <View className={classNames('toast', {
visible: false visible: toastShow
})}> })}>
<View>已超重开发票时限</View> {/* <View></View>
<View>不可操作重开发票</View> <View>不可操作重开发票</View> */}
<View>提交申请成功请耐心等待</View>
</View> </View>
<AtModal <AtModal

View File

@ -58,6 +58,10 @@
color: #163586; color: #163586;
margin-right: 2px; margin-right: 2px;
} }
.icon-qianwang-01 {
font-size: 20px;
color: #000;
}
} }
} }
.ipt { .ipt {
@ -66,7 +70,7 @@
font-size: 26px; font-size: 26px;
line-height: 1; line-height: 1;
color: #000; color: #000;
padding-right: 40px; // padding-right: 40px;
box-sizing: border-box; box-sizing: border-box;
&-placeholder { &-placeholder {
color: #808080; color: #808080;
@ -190,6 +194,9 @@
display: flex; display: flex;
flex: 1; flex: 1;
color: #000; color: #000;
.icon-qianwang-01 {
font-size: 20px;
}
} }
} }
.btn { .btn {

View File

@ -182,7 +182,7 @@ export default class InvoiceList extends Component {
onChange={this.onChangeItemCheck.bind(this, {})} onChange={this.onChangeItemCheck.bind(this, {})}
/> />
<View className="bottom-txt">本页全选</View> <View className="bottom-txt">本页全选</View>
<View className="bottom-btn">下一步</View> <View className="bottom-btn" onClick={() => Taro.navigateTo({ url: '/subpage/pages/trade/invoice-info' })}>下一步</View>
</View> </View>
</View>} </View>}
{/*<AtButton {/*<AtButton

View File

@ -5,7 +5,7 @@ import _mapKeys from 'lodash/mapKeys'
import { Loading, SpNote, SpPage, SpPrice, SpCheckboxNew } from '@/components' import { Loading, SpNote, SpPage, SpPrice, SpCheckboxNew } from '@/components'
import api from '@/api' import api from '@/api'
import { withPager, withLogin } from '@/hocs' import { withPager, withLogin } from '@/hocs'
import { log, pickBy, resolveOrderStatus, authSetting } from '@/utils' import { log, pickBy, resolveOrderStatus, authSetting, formatDateTime } from '@/utils'
import { AtIcon } from 'taro-ui' import { AtIcon } from 'taro-ui'
import './invoice-record.scss' import './invoice-record.scss'
@ -45,27 +45,32 @@ export default class InvoiceList extends Component {
tid: 'order_id', tid: 'order_id',
status_desc: 'order_status_msg', status_desc: 'order_status_msg',
status: ({ order_status }) => resolveOrderStatus(order_status), status: ({ order_status }) => resolveOrderStatus(order_status),
totalItems: ({ items }) => items.reduce((acc, item) => +item.num + acc, 0), totalItems: ({ items }) => items?.reduce((acc, item) => +item.num + acc, 0),
payment: ({ total_fee }) => (total_fee / 100).toFixed(2), payment: ({ total_fee }) => (total_fee / 100).toFixed(2),
pay_type: 'pay_type', pay_type: 'pay_type',
point: 'point', point: 'point',
create_date: 'create_date', create_date: 'create_date',
order: ({ items }) => invoice: ({ invoice }) => invoice ? JSON.parse(invoice) : {},
pickBy(items, { id: 'id',
order_id: 'order_id', order_id: 'order_id',
item_id: 'item_id', status: 'status',
pic_path: 'pic', order: ({ order: { orderInfo }, order }) => {
title: 'item_name', return order.orderInfo ? {
price: ({ item_fee }) => (+item_fee / 100).toFixed(2), time: formatDateTime(orderInfo.create_time),
point: 'item_point', tid: orderInfo.order_id,
num: 'num' total_fee: orderInfo.total_fee / 100,
}) order_id: orderInfo.order_id,
title: orderInfo.title,
invoice: orderInfo.invoice,
is_invoiced: orderInfo.is_invoiced
} : {}
}
}) })
log.debug('[trade list] list fetched and processed: ', nList) log.debug('[trade list] list fetched and processed: ', nList)
this.setState({ this.setState({
list: [...this.state.list, ...nList, {}, {}, {}, {}, {}, {}, {}, {}] list: [...this.state.list, ...nList]
}) })
return { total } return { total }
@ -130,6 +135,14 @@ export default class InvoiceList extends Component {
onChangeItemCheck = (item) => { onChangeItemCheck = (item) => {
console.log(item, 'ckeck点击') console.log(item, 'ckeck点击')
} }
goDetail = (item) => {
Taro.navigateTo({
url: `/subpage/pages/trade/invoice-info?id=${item.id}`,
success: function (res) {
res.eventChannel?.emit('acceptDataFromOpenerPage', { data: item })
}
})
}
render () { render () {
const { list, page } = this.state const { list, page } = this.state
@ -139,18 +152,23 @@ export default class InvoiceList extends Component {
<ScrollView scrollY className='trade-list__scroll' onScrollToLower={this.nextPage}> <ScrollView scrollY className='trade-list__scroll' onScrollToLower={this.nextPage}>
{list.map((item, idx) => { {list.map((item, idx) => {
return ( return (
<View className='invoice-item' key={`invoice_item_${idx}`}> <View className='invoice-item' onClick={() => this.goDetail(item)} key={`invoice_item_${idx}`}>
<View className="right"> <View className="right-item">商品名称{item.order?.title}</View>
<View className="right-item">{idx + 1}发票金额 <View className='invoice-item-box'>
<SpPrice size={28} className='total-pirce' value={item.payment / 100} showSeparator noDecimal /> <View className="right">
<View className="right-item">订单编号{item.order?.order_id}</View>
<View className="right-item">发票金额
<SpPrice size={26} className='total-pirce' value={item.order?.total_fee} showSeparator noDecimal={false} />
</View>
<View className="right-item">发票类型电子发票</View>
<View className="right-item">抬头类型{item.order?.invoice?.title === 'unit' ? '企业' : '个人'}</View>
<View className="right-item">申请时间{item.order?.time || ''}</View>
</View>
<View className="status">
<Text className="txt">{item.order?.is_invoiced == 1 ? '已开票' : "已申请"}</Text>
{/* <AtIcon value='chevron-right' size={20} color='#888'></AtIcon> */}
<Text className='iconfont icon-qianwang-01'></Text>
</View> </View>
<View className="right-item">发票类型电子发票</View>
<View className="right-item">抬头类型{item.create_date}</View>
<View className="right-item">申请时间{item.create_date || '2023-12-18 10:10'}</View>
</View>
<View className="status">
<Text className="txt">已申请</Text>
<AtIcon value='chevron-right' size='18' color='#888'></AtIcon>
</View> </View>
</View> </View>
) )

View File

@ -4,9 +4,9 @@
.trade-list { .trade-list {
&__scroll { &__scroll {
// @include page-scroll($tabs-height + $navigate-height + 10px, 0); // @include page-scroll($tabs-height + $navigate-height + 10px, 0);
@include page-scroll(var(--nav-height), 140px); @include page-scroll(var(--nav-height), 10px);
padding-top: 20px; padding-top: 20px;
padding-bottom: 210px; padding-bottom: 50px;
} }
} }
.invoice-item { .invoice-item {
@ -15,18 +15,23 @@
box-sizing: border-box; box-sizing: border-box;
background: #f7f7f7; background: #f7f7f7;
border-radius: 6px; border-radius: 6px;
display: flex; &-box {
align-items: center; display: flex;
justify-content: space-between; align-items: center;
justify-content: space-between;
}
.icon-qianwang-01 {
font-size: 26px;
}
.right-item {
color: #000;
margin-bottom: 20px;
font-size: 26px;
line-height: 1;
}
.right { .right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-left: 10px;
&-item {
color: #000;
margin-bottom: 20px;
line-height: 1;
}
&-item:last-child { &-item:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
@ -36,7 +41,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
.txt { .txt {
margin-right: 20px; margin-right: 14px;
} }
} }
} }

View File

@ -452,7 +452,7 @@ function MemberIndex (props) {
const { memberConfig } = config const { memberConfig } = config
console.log('====config===', config.menu) // console.log('====config===', config.menu)
return ( return (
<SpPage className='pages-member-index has-navbar' renderFooter={<SpTabbar />} isTop> <SpPage className='pages-member-index has-navbar' renderFooter={<SpTabbar />} isTop>
@ -709,7 +709,7 @@ function MemberIndex (props) {
<SpImage className="member_con_item_img" src="member/dizhi.png" height={190} mode='aspectFill' isNew /> <SpImage className="member_con_item_img" src="member/dizhi.png" height={190} mode='aspectFill' isNew />
<View className="member_con_item_txt">地址管理</View> <View className="member_con_item_txt">地址管理</View>
</View> </View>
<View className="member_con_item" onClick={isLogin && handleClickLink.bind(this, '/subpage/pages/trade/invoice-list')}> <View className="member_con_item" onClick={isLogin && handleClickLink.bind(this, '/subpage/pages/trade/invoice-record')}>
<SpImage className="member_con_item_img" src="member/fapiao.png" height={190} mode='aspectFill' isNew /> <SpImage className="member_con_item_img" src="member/fapiao.png" height={190} mode='aspectFill' isNew />
<View className="member_con_item_txt">发票管理</View> <View className="member_con_item_txt">发票管理</View>
</View> </View>