0c30f3ed by 杨炀

发票

1 parent ff5d1fd2
......@@ -134,5 +134,40 @@ export function cancelOrder2(orderId) {
params: orderId
})
}
export function addressList(userId) {
return request({
url: `/ota/invoiceInfo/list`,
method: 'get',
params: {
createById: userId
}
})
}
export function submitInvoice(form) {
return request({
url: `/ota/invoice`,
method: 'post',
data: form
})
}
export function editInvoice(form) {
return request({
url: `/ota/invoice`,
method: 'put',
data: form
})
}
export function addAddress(form) {
return request({
url: `/ota/invoiceInfo`,
method: 'post',
data: form
})
}
export function delAddress(ids) {
return request({
url: `/ota/invoiceInfo/${ids}`,
method: 'delete'
})
}
......
......@@ -426,6 +426,12 @@ export const constantRoutes = [
component: () => import('@/viewsPc/booking/invoicing'),
name: 'invoice',
meta: { title: '我的发票' }
},
{
path: 'addInvoice/:id',
component: () => import('@/viewsPc/booking/addInvoice'),
name: 'addInvoice',
meta: { title: '编辑发票' }
}
]
},
......
......@@ -84,7 +84,11 @@ function goAdd() {
}
function getChoosed(list) {
console.log(list)
if(list.length>0){
// 去开票
}
}
</script>
<style scoped lang="scss">
......
<template>
<div>
<div class="box">
<el-card :body-style="{ padding: '0px' }" class="mt20">
<div slot="header">
<div class="bg-lineg">{{ language == 0 ? '发票开具' : 'Invoice application' }}</div>
</div>
<el-row class="pd20" :gutter="20">
<el-col :span="24">
<!--已选订单-->
<div class="border-info" v-for="b in list" :key="b.id">
<h3>{{ b.name }}</h3>
<!-- 酒店订单-->
<div v-if="b.orderType == 0">
<p>{{b.messageObj.roomInfo}}</p>
<p>{{b.messageObj.roomStayDate}}</p>
<p class="poPrice">¥{{b.total}}</p>
</div>
<!-- 接送订单-->
<div v-if="b.orderType == 1">
<p v-for="(car,index) in b.messageObj.carsList" :key="index" v-show="car.num>0">
<span>{{car.name}}{{car.num}}</span>
</p>
<p class="poPrice">¥{{b.total}}</p>
</div>
<!-- 餐饮订单-->
<div v-if="b.orderType == 2">
<p v-for="(n,index) in b.messageObj.foodsList" :key="index">
<span v-if="n.num > 0">
{{n.name}}({{n.categoryName}}) <span>{{n.num}}</span>
</span>
</p>
<p class="poPrice">¥{{b.total}}</p>
</div>
</div>
<div class="leftboderTT">{{ language == 0 ? '开票信息' : 'Invoice information' }}</div>
<div class="border-rr mt20 pd20">
<el-form class="mw500" :model="form" :label-width="language == 0 ?'100':'150'" :rules="rules" ref="formRef">
<el-form-item :label="'开票金额'">
<span class="bigprice">¥{{totalMoney}}</span>
</el-form-item>
<el-form-item :label="`发票形式`" required>
<el-radio-group v-model="form.invoiceForm">
<el-radio value="1">{{ language == 0 ? '电子发票' : 'E-invoice' }}</el-radio>
<el-radio value="2">{{ language == 0 ? '纸质普票' : 'Paper-invoice' }}</el-radio>
<el-radio value="3">{{ language == 0 ? '纸质专票' : 'Paper-special-invoice' }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="`邮箱`" required>
<el-input v-model="form.contacts"/>
</el-form-item>
<el-form-item :label="`邮寄地址`" required>
<el-button plain type="primary" size="small" v-if="addrList.length==0" @click="goEditAddress">
+{{ language==0?'添加地址':'Add' }}
</el-button>
<div v-else class="flexCenter">
<div>
<div class="bigSize">{{nowAddress.contact}} {{nowAddress.phone}}</div>
<div class="smallSize">{{nowAddress.addName}}</div>
</div>
<a @click="goEditAddress" class="text-primary">
<el-icon><Switch /></el-icon>切换
</a>
</div>
</el-form-item>
<el-form-item :label="`发票类型`" required>
<el-radio-group v-model="form.invoiceType">
<el-radio value="0">{{ language == 0 ? '企业' : 'Company' }}</el-radio>
<el-radio value="1">{{ language == 0 ? '个人非企业' : 'Individual' }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="`发票抬头`" required>
<el-input v-model="form.invoiceTitle"/>
</el-form-item>
<el-form-item :label="`税号`" required v-if="form.invoiceType=='0'">
<el-input v-model="form.invoiceTfn"/>
</el-form-item>
<div v-if="form.invoiceForm=='3'&&form.invoiceType=='0'">
<el-form-item :label="`地址`" required>
<el-input v-model="form.invoiceAddress"/>
</el-form-item>
<el-form-item :label="`电话`" required>
<el-input v-model="form.invoicePhone"/>
</el-form-item>
<el-form-item :label="`开户行`" required>
<el-input v-model="form.invoiceBank"/>
</el-form-item>
<el-form-item :label="`账户`" required>
<el-input v-model="form.invoiceAccount"/>
</el-form-item>
</div>
</el-form>
</div>
</el-col>
</el-row>
<el-row justify="center" align="middle" class="pd20">
<el-col :span="12" class="text-center">
<el-button type="primary" class="btn-lineG w200px" size="large" round @click="submit">
{{ language==0?'提交':'Submit' }}
</el-button>
</el-col>
</el-row>
</el-card>
<div style="height: 60px;"></div>
</div>
</div>
<address-list-dialog ref="dialogAddressListRef" @submit="getAddress"/>
</template>
<script setup>
import {useRouter, useRoute} from "vue-router";
import {ref, reactive, onMounted} from "vue";
import {useStorage} from "@vueuse/core/index";
import AddressListDialog from "./component/addressList"
import dayjs from 'dayjs'
import {ElMessage,ElMessageBox} from "element-plus";
import useUserStore from "@/store/modules/user";
import {getCurrentInstance} from "@vue/runtime-core";
import {addressList, editInvoice, submitInvoice} from "@/apiPc/booking";
const {proxy} = getCurrentInstance()
const user = useUserStore().user
const language = useStorage('language', 0)
const router = useRouter()
const route = useRoute()
const form = ref({
invoiceForm: '1',
invoiceType: '0'
})
const list = ref([])
const addrList = ref([])
const nowAddress = ref({})
const totalMoney = ref(0)
const choseDays = ref([])
const rules = ref({})
const isEdit = ref(false)
onMounted(() => {
if(route.query.orders){
list.value = JSON.parse(decodeURIComponent(route.query.orders)) || []
}
if (route.query.totalMoney) {
totalMoney.value = route.query.totalMoney
}
getAddrList()
})
function goEditAddress(id) {
var obj = {
title: language.value==0?'地址列表':'Address list',
show: true,
id: id
}
proxy.$refs['dialogAddressListRef'].open(obj)
}
function getAddrList() {
addressList(user.userId).then(res=>{
addrList.value = res.rows
if(addrList.value.length>0){
nowAddress.value = addrList.value[0]
}
})
}
function getAddress(obj) {
console.log(obj)
nowAddress.value = obj
console.log(nowAddress.value)
}
function submit() {
if(!user){
useUserStore().setReLogin()
return
}
// 提交确认
ElMessageBox.confirm(language.value == 0 ? '确认提交订单吗?' : 'Confirm to submit the order?', {
confirmButtonText: language.value == 0 ? '确定' : 'Confirm',
cancelButtonText: language.value == 0 ? '取消' : 'Cancel',
type: 'warning'
}).then(() => {
form.value.total = totalMoney.value
form.value.version = 2
if (isEdit.value) {
update()
} else {
add()
}
})
}
function update() {
editInvoice(form.value).then(res=>{
//返回列表
backList()
})
}
function add() {
submitInvoice(form.value).then(res=>{
//返回列表
backList()
})
}
function backList() {
router.push({
name: 'invoice'
})
}
</script>
<style scoped lang="scss">
.bigMoney {
font-size: 36px !important;
font-family: 'DIN Alternate';
font-weight: bold;
}
.btn-lineG{font-size: 16px}
.bg-lineg {
height: 40px;
line-height: 40px;
font-size: 18px;
text-align: center;
}
.leftboderTT {
font-weight: 600;
font-size: 16px;
color: #453DEA;
}
.border-rr {
border-radius: 5px;
border: 1px solid #DCDFE6;
}
.room {
font-weight: 400;
font-size: 14px;
color: #929AA0;
}
.ccitemBox {
overflow: auto;
label {
margin: 10px 0;
display: block;
min-height: 30px;
span {
color: #FF8124;
font-family: DIN Alternate;
font-size: 24px;
}
}
}
.ccitem {
display: flex;
justify-content: space-between;
font-size: 15px;
color: #666;
margin: 5px 0 10px;
label {
font-size: 16px;
color: #000;
}
span {
font-size: 13px;
}
}
.red {
color: #FF8124;
}
.tip{font-size: 14px;color: #666;padding: 0 10px;}
.mw500{max-width: 500px;margin: auto}
.bigSize {
font-size: 16px;
margin-bottom: 5px;
}
.smallSize {
font-size: 14px;
color: #999;
}
.flexCenter {
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
background: #f4f4f4;
padding: 10px;
box-sizing: border-box;
}
.bigprice {
font-size: 20px;
line-height: 2;
}
</style>
<template>
<el-dialog v-model="show" :title="title" width="1000px" append-to-body>
<el-button @click="add" type="primary" plain class="mb20">
{{language==0?'新建':'Add'}}
</el-button>
<el-table height="50vh" ref="allBills" :data="tableData" v-loading="loading">
<el-table-column prop="contact" :label="language==0?'联系人':'Contact'" min-width="100px">
<template #default="scope">
<div v-if="scope.row.id">{{scope.row.contact}}</div>
<el-input v-else v-model="scope.row.contact"/>
</template>
</el-table-column>
<el-table-column prop="phone" :label="language==0?'联系电话':'Phone'" min-width="120px">
<template #default="scope">
<div v-if="scope.row.id">{{scope.row.phone}}</div>
<el-input v-else v-model="scope.row.phone"/>
</template>
</el-table-column>
<el-table-column prop="id" :label="language==0?'地区':'Detail'" min-width="150px">
<template #default="scope">
<div v-if="scope.row.id">{{scope.row.provinceName}}{{scope.row.cityName}}{{scope.row.areaName}}</div>
<el-cascader v-else v-model="scope.row.regionArr" style="width: 100%;" :options="regionsList"
:props="{ label:'text' }" @change="changeRegion"
/>
</template>
</el-table-column>
<el-table-column prop="address" :label="language==0?'详细地址':'Address'" min-width="150px">
<template #default="scope">
<div v-if="scope.row.id">{{scope.row.address}}</div>
<el-input v-else type="textarea" rows="1" v-model="scope.row.address"/>
</template>
</el-table-column>
<el-table-column prop="total" :label="language==0?'操作':'Operation'" fixed="right" align="center" width="100">
<template #default="scope">
<div v-if="scope.row.id">
<a class="text-primary mr10" @click="del(scope.row.id)">{{language==0?'删除':'Delete'}}</a>
<!-- <el-button text type="primary" @click="edit(scope.row.id)">{{language==0?'编辑':'Edit'}}</el-button>-->
<a class="text-primary" @click="choose(scope.row)">{{language==0?'选择':'Choose'}}</a>
</div>
<div v-else>
<a class="text-primary mr10" @click="save(scope.row)">{{language==0?'保存':'Save'}}</a>
<a class="text-primary" @click="saveCancel(scope.row.id)">{{language==0?'取消':'Cancel'}}</a>
</div>
</template>
</el-table-column>
</el-table>
<paginationPc
v-show="total>0"
v-model:page="query.pageNum"
v-model:limit="query.pageSize"
:total="total"
@pagination="getList"
/>
</el-dialog>
</template>
<script setup>
import {reactive, ref, toRefs, watch} from 'vue'
import {getCurrentInstance} from "@vue/runtime-core";
import {useStorage} from "@vueuse/core/index";
import {addAddress, addressList, delAddress, getCanInvoiceBills} from "@/apiPc/booking";
import {ElMessage, ElMessageBox} from "element-plus";
import useUserStore from "@/store/modules/user";
import * as match from "@/apiPc/match";
const {proxy} = getCurrentInstance()
const emit = defineEmits([ 'submit'])
const language= useStorage('language',0)
const user = useUserStore().user
const data = reactive({
tableData: [],
regionsList:[],
show: false,
loading: false,
title: '',
query:{
status:1
},
total:0
})
const { tableData,regionsList,show,loading,title,query,total} = toRefs(data)
const open = (params) => {
title.value = params.title
show.value = true
if(params.id == '0'){
// 新建
} else {
getList()
}
getRegionsList()
}
defineExpose({
open
})
const getList = () => {
loading.value = true
addressList(user.userId).then(res=>{
loading.value = false
tableData.value = res.rows
})
}
function getRegionsList() {
match.regionsList().then(res => {
regionsList.value = res.data
})
}
const changeRegion = (val) => {
console.log(val)
}
const save = (row) => {
console.log(row)
row.province = row.regionArr[0]
row.city = row.regionArr[1]||''
row.area = row.regionArr[2]||''
addAddress(row).then(res=>{
ElMessage.success('保存成功')
getList()
})
}
const choose = (row) => {
emit('submit',row)
show.value = false
}
const add = () => {
tableData.value.push({})
}
const edit = (row) => {
}
const del = (row) => {
ElMessageBox.confirm('确认删除?').then(() => {
delAddress(row.id).then(res=>{
ElMessage.success('删除成功')
getList()
})
})
}
const saveCancel = (row) => {
//删除最后一条
getList()
}
</script>
<style scoped lang="scss">
</style>
......@@ -68,8 +68,8 @@ const props = defineProps({
})
const language= useStorage('language',0)
function goBooking(n) {
ElMessage.warning(language.value==0?'建设中,敬请期待':'Building!')
return
// ElMessage.warning(language.value==0?'建设中,敬请期待':'Building!')
// return
switch (n) {
case 0:
// 票务
......
......@@ -83,6 +83,9 @@ function init(){
getWeather().then(res=>{
weatherObj.value = JSON.parse(res.data).data
console.log(weatherObj.value)
}).catch(err=>{
console.log(err)
showgg.value = false
})
}
const popWeather = () => {
......
......@@ -5,7 +5,7 @@
destroy-on-close
>
<!-- 国际赛事随行人员-->
<el-form ref="dialogRef" :model="form" :rules="language==0?rules:rules_cn" label-width="140px"
<el-form ref="dialogRef" :model="form" :rules="language==0?rules_cn:rules" label-width="140px"
>
<el-row :gutter="30" class="mt30">
<el-col :lg="12" class="touxiang">
......@@ -165,10 +165,10 @@ const data = reactive({
// countryId: 240,
// sex: '0'
},
rules: {
// xing: [{required: true, message: '必填', trigger: 'blur'}],
rules_cn: {
xing: [{required: true, message: '必填', trigger: 'blur'}],
ming: [{required: true, message: '必填', trigger: 'blur'}],
// countryId: [{required: true, message: '必填', trigger: 'change'}],
countryId: [{required: true, message: '必填', trigger: 'change'}],
// idcType: [{required: true, message: '必填', trigger: 'change'}],
// idcCode: [{required: true, message: '必填', trigger: 'blur'}],
// phone: [{required: true, message: '必填', trigger: 'blur'}],
......@@ -179,8 +179,8 @@ const data = reactive({
sex: [{required: true, message: '必填', trigger: 'change'}],
labelArr: [{required: true, message: '必填', trigger: 'change'}]
},
rules_cn: {
// xing: [{required: true, message: 'required', trigger: 'blur'}],
rules: {
xing: [{required: true, message: 'required', trigger: 'blur'}],
ming: [{required: true, message: 'required', trigger: 'blur'}],
countryId: [{required: true, message: 'required', trigger: 'change'}],
// idcType: [{required: true, message: 'required', trigger: 'change'}],
......@@ -368,7 +368,7 @@ function giveBirthDay() {
// 判断身份证正确性/赋值生日
if (form.value.idcType == '0') {
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(form.value.idcCode))) {
ElMessage.warning('请输入正确的身份证号码')
ElMessage.warning(language.value == 0 ? '请输入正确的身份证号码' :'Please enter the correct Resident ID card')
} else {
let tmpStr = ''
if (form.value.idcCode.length == 15) {
......
......@@ -224,8 +224,8 @@ const submitForm = (n) => {
})
return
}
ElMessageBox.confirm(language.value == 0 ? '确定提交吗?' : 'Are you sure to submit?',
language.value == 0 ? '提示' : 'Tip',
ElMessageBox.confirm(language.value == 0 ? '请谨慎提交!请务必确保所有成员全部报名后,一次性提交。提交后不可修改!' : 'Please be cautious! Please make sure that all members have signed up ,it cannot be modified after submission!',
language.value == 0 ? '注意' : 'Note',
{
confirmButtonText: language.value == 0 ? '确定' : 'Yes',
cancelButtonText: language.value == 0 ? '取消' : 'Cancel',
......
......@@ -11,20 +11,20 @@
<!-- <el-tab-pane v-for="(tab,index) in list" :key="index" :label="tab.name" :name="index" />-->
<!-- </el-tabs>-->
<div class="pd20">
<el-row class="mb20">
<el-col :lg="24" :xs="24">
<div v-for="(n,index) in newsList?.slice(0,1)" v-show="index<1" :key="index" class="firstItem" @click="goDetail(n)">
<div class="date">
<p>{{ n.belongTime }}</p>
</div>
<div class="item-body">
<h3 class="esp_2">
<span class="istop" v-if="n.isTop == '1'">{{ language==0?'置顶':'TOP' }}</span>
{{n.name}}</h3>
</div>
<a class="go">{{ language==0?'查看详情':'DETAIL' }}</a>
</div>
</el-col>
<!-- <el-row class="mb20">-->
<!-- <el-col :lg="24" :xs="24">-->
<!-- <div v-for="(n,index) in newsList?.slice(0,1)" v-show="index<1" :key="index" class="firstItem" @click="goDetail(n)">-->
<!-- <div class="date">-->
<!-- <p>{{ n.belongTime }}</p>-->
<!-- </div>-->
<!-- <div class="item-body">-->
<!-- <h3 class="esp_2">-->
<!-- <span class="istop" v-if="n.isTop == '1'">{{ language==0?'置顶':'TOP' }}</span>-->
<!-- {{n.name}}</h3>-->
<!-- </div>-->
<!-- <a class="go">{{ language==0?'查看详情':'DETAIL' }}</a>-->
<!-- </div>-->
<!-- </el-col>-->
<!-- <el-col :lg="8" :xs="24" class="forPc">-->
<!-- <div class="searchPark">-->
<!-- <h3>通知搜索</h3>-->
......@@ -56,12 +56,22 @@
<!-- </el-form>-->
<!-- </div>-->
<!-- </el-col>-->
</el-row>
<div class="newsLine">
<!-- </el-row>-->
<div class="newsLine" v-for="(n,index) in newsList" :key="index">
<div v-if="n.isTop == '1'" class="firstItem" @click="goDetail(n)">
<div class="date">
<p>{{ n.belongTime }}</p>
</div>
<div class="item-body">
<h3 class="esp_2">
<span class="istop" v-if="n.isTop == '1'">{{ language==0?'置顶':'TOP' }}</span>
{{n.name}}</h3>
</div>
<a class="go">{{ language==0?'查看详情':'DETAIL' }}</a>
</div>
<div v-for="(n,index) in newsList" v-show="index>0" :key="index" class="item" @click=" goDetail(n)">
<div v-else class="item" @click=" goDetail(n)">
<div class="date">
<div class="day">{{ n.belongTime?.substring(8, 10) }}</div>
<p>{{ n.belongTime?.substring(0, 7).replace(/-/g, '/') }}</p>
......@@ -145,15 +155,17 @@ const goDetail = (n) => {
background: #F8F4FF;height: 100%;padding: 10px 20px;
.date{font-weight: bold;transform: scaleX(0.7);transform-origin: left;
font-size: 18px;
color: var(--el-color-primary);}
color: var(--el-color-primary);
p{margin: 5px 0;}
}
h3{margin: 10px 0;
font-size: 22px;}
.go{color: var(--el-color-primary);
font-size: 14px;padding: 0 0 5px;}
&:hover{background: linear-gradient(90deg, #8623fc3d, #453dea36);}
}
.newsLine{
.firstItem{margin-bottom: 10px;}
.item{display: flex;position: relative;width: 100%;height: 90px;
align-items: center;cursor: pointer;border-bottom: 1px dashed #EEEEEE;
.date{width: 60px;height: 60px;text-align: center;background: #FAFAFA;margin: 0 10px;
......
......@@ -70,19 +70,19 @@ export default defineConfig(({ mode, command }) => {
rewrite: (p) => p.replace(/^\/dev-api\/ztx-train/, '')
},
'/dev-api/ztx-match': {
target: 'http://192.168.1.131:8083',
target: 'http://192.168.1.118:8083',
// target: 'http://192.168.1.132:8081',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api\/ztx-match/, '')
},
'/dev-api/ztx-webSite': {
target: 'https://dance.itechtop.cn/stage-api',
// target: 'http://192.168.1.96:9083/',
// target: 'https://dance.itechtop.cn/stage-api',
target: 'http://192.168.1.118:8081/',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api\/ztx-webSite/, '')
},
'/dev-api': {
target: 'http://192.168.1.131:8081/',
target: 'http://192.168.1.118:8081/',
// target: 'https://dance.itechtop.cn/stage-api',
// target: 'https://wdsfwuxicenter.com/stage-api',
changeOrigin: true,
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!