工单批次列表,工单批次详情

This commit is contained in:
2024-11-04 11:09:50 +08:00
parent 8aafdc9bff
commit 8a822e829d
6 changed files with 594 additions and 90 deletions

View File

@ -147,21 +147,29 @@ export function deleteImage(data){
//开票通知列表
export function notifyInvoiceList(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/notifyInvoiceList',
url:'/order/taskInvoiceBatch/selectPageList',
method:'POST',
contentType:'application/json',
data
})
}
// contentType:'application/json',
//开票通知详情
export function notifyInvoiceDetail(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/notifyInvoiceDetail',
url:'/order/taskInvoiceBatch/selectById',
method:'POST',
contentType:'application/json',
data
})
}
// 关联案件
export function getOrderListByInvoice(data) {
return request({
url:'/order/taskOrderCostHisRecord/selectPageList',
method:'POST',
data
})
}
// 调度app获取新签列表
export function pageList(data){
return request({

View File

@ -88,6 +88,14 @@ const routes = [
title: '工单批次'
}
},
{
path: "/invoiceInfo",
name: 'invoiceInfo',
component: () => import('@/views/index/invoiceInfo.vue'),
meta: {
title: '开票信息'
}
},
{
path: "/invoicingDetail",
name: 'invoicingDetail',

View File

@ -25,7 +25,7 @@ service.interceptors.request.use(
if (reqUrl.includes("/driverApp")) {
// console.log("司机app")
config.headers['token'] = `${token}`;
} else if(reqUrl.includes("/supplierApp") || reqUrl.includes("/supplierKPI") || reqUrl.includes('/supplier/select')){
} else if(reqUrl.includes("/supplierApp") || reqUrl.includes("/supplierKPI") || reqUrl.includes('/supplier/select') || reqUrl.includes('/order')){
// console.log("调度app服务商kpi")
config.headers['Authorization'] = `${token}`;
}else{

View File

@ -0,0 +1,207 @@
<template>
<div class="wrap">
<div class="navBar">
<van-nav-bar
title="开票信息"
left-arrow
left-arrow-color="#FFFFFF"
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="goBack"
/>
</div>
<div class="contentWrap">
<div class="content_tab">
<div class="tab_title">批次信息</div>
<div class="tab_content">
<div class="item_wrap">
<div class="item_label">财务编号</div>
<div class="item_content">
<span id="copyText">11</span>
<img class="copyIcon" @click="copyHandler()" src="@/assets/copy.png" />
</div>
</div>
<div class="item_wrap">
<div class="item_label">工单数量</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">总金额</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">扣款</div>
<div class="item_content">
{{invoiceInfo.cutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">税额扣款</div>
<div class="item_content">
{{invoiceInfo.taxCutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">开票金额</div>
<div class="item_content">
{{invoiceInfo.invoiceMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">备注</div>
<div class="item_content">
{{invoiceInfo.remark || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">失败原因</div>
<div class="item_content">
{{invoiceInfo.remark || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">创建时间</div>
<div class="item_content">
{{invoiceInfo.createTime}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">对账状况</div>
<div class="item_content">
{{invoiceInfo.statusString}}
</div>
</div>
</div>
</div>
<div class="content_tab">
<div class="tab_title">批次信息</div>
<div class="tab_content">
<div class="item_wrap">
<div class="item_label">财务编号</div>
<div class="item_content">
<span>11</span>
<img class="copyIcon" @click="copyHandler()" src="@/assets/copy.png" />
</div>
</div>
<div class="item_wrap">
<div class="item_label">工单数量</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">总金额</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">扣款</div>
<div class="item_content">
{{invoiceInfo.cutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">税额扣款</div>
<div class="item_content">
{{invoiceInfo.taxCutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">开票金额</div>
<div class="item_content">
{{invoiceInfo.invoiceMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">备注</div>
<div class="item_content">
{{invoiceInfo.remark || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">失败原因</div>
<div class="item_content">
{{invoiceInfo.remark || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">创建时间</div>
<div class="item_content">
{{invoiceInfo.createTime}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">对账状况</div>
<div class="item_content">
{{invoiceInfo.statusString}}
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {myMixins} from "@/utils/myMixins"
export default {
name: "invoiceInfo",
mixins: [ myMixins ],
}
</script>
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap{
@include wh(100%,100%);
background-color: #F4F5F7;
overflow-y: auto;
box-sizing: border-box;
padding-bottom: 30px;
}
.navBar{
margin-bottom: 46px;
}
.contentWrap{
.content_tab {
background-color: #fff;
width: 100%;
padding: 15px 15px;
.tab_title {
font-size: 14px;
font-weight: bold;
margin-bottom: 5px;
}
.tab_content {
.item_wrap {
display: flex;
align-items: center;
line-height: 30px;
font-size: 12px;
.item_label {
color: rgba(0,0,0,0.5);
margin-right: 5px;
width: 60px;
}
.item_content {
display: flex;
align-items: center;
}
}
}
}
}
.copyIcon {
width: 35px;
height: 15px;
margin-left: 10px
}
</style>

View File

@ -12,52 +12,143 @@
/>
</div>
<div class="contentWrap">
<div class="item" v-for="(item,index) in detailList" :key="index">
<div class="itemContent">
<span> {{ item.orderCode }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span>{{ item.serviceName }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span> {{item.settleAmount}}</span>
</div>
<div class="line"></div>
<div class="content_tab">
<div class="tab_title">批次详情</div>
<div class="tab_content">
<div class="item_wrap">
<div class="item_label">批次编号</div>
<div class="item_content">
<span id="copyText">{{invoiceInfo.batchCode}}</span>
<img class="copyIcon" @click="copyHandler(invoiceInfo.batchCode)" src="@/assets/copy.png" />
</div>
</div>
<div class="item_wrap">
<div class="item_label">财务编号</div>
<div class="item_content">
<span id="copyText2">{{invoiceInfo.financeBatchCode}}</span>
<img class="copyIcon" @click="copyHandler(invoiceInfo.financeBatchCode)" src="@/assets/copy.png" />
</div>
</div>
<div class="item_wrap">
<div class="item_label">工单数量</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">总金额</div>
<div class="item_content">
{{invoiceInfo.orderNum}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">扣款</div>
<div class="item_content">
{{invoiceInfo.cutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">税额扣款</div>
<div class="item_content">
{{invoiceInfo.taxCutMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">开票金额</div>
<div class="item_content">
{{invoiceInfo.invoiceMoney || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">备注</div>
<div class="item_content">
{{invoiceInfo.remark || ''}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">创建时间</div>
<div class="item_content">
{{invoiceInfo.createTime}}
</div>
</div>
<div class="item_wrap">
<div class="item_label">对账状况</div>
<div class="item_content">
{{invoiceInfo.statusString}}
</div>
</div>
</div>
</div>
<div class="content_tab mt_cls">
<div class="tab_title">关联案件</div>
<table>
<tr>
<th class="text_left">案件编号</th>
<th>服务类型</th>
<th>结算类型</th>
</tr>
<tr v-for="(item, index) in orderList" :key="index">
<td class="text_left">
{{item.orderCode}}
<img class="copyIcon" @click="copyHandler(item.orderCode)" src="@/assets/copy.png" />
</td>
<td>{{item.serviceType || ''}}</td>
<td>{{item.settleAmount || ''}}</td>
</tr>
</table>
</div>
</div>
</div>
</template>
<script>
import {myMixins} from "@/utils/myMixins"
import {notifyInvoiceDetail} from "@/api/mine"
import { notifyInvoiceDetail, getOrderListByInvoice } from "@/api/mine"
export default {
name: "invoicingDetail",
mixins:[myMixins],
data(){
return{
pageNum:1,
pageSize:10,
detailList:[],
form:{
batchCode:'',
startTime:'',
overTime:'',
}
batchCode: '',
id: '',
invoiceInfo: {},
orderList: [],
}
},
async mounted() {
// console.log(this.$route.query?.id)
this.form.batchCode=this.$route.query?.id;
this.form.startTime=this.$route.query?.startTime;
this.form.overTime=this.$route.query?.overTime;
this.batchCode = this.$route.query?.batchCode;
this.id = this.$route.query?.id;
await this.getDetail()
await this.getOrderList();
},
methods:{
async getDetail(){
let res=await notifyInvoiceDetail({
pageNum:this.pageNum,
pageSize:this.pageSize,
...this.form,
})
this.detailList=res.data
}
copyHandler(copyText){
let inputNode = document.createElement('input') // 创建input
inputNode.value = copyText // 赋值给 input 值
document.body.appendChild(inputNode) // 插入进去
inputNode.select() // 选择对象
document.execCommand('Copy') // 原生调用执行浏览器复制命令
inputNode.className = 'oInput'
inputNode.style.display = 'none' // 隐藏
this.$toast('复制成功')
},
async getOrderList() {
let res = await getOrderListByInvoice({
batchCode: this.batchCode,
pageSize: 1000,
pageNum: 1,
createTime: this.invoiceInfo.startTime
})
this.orderList = res.data;
console.log('rerere', res);
},
async getDetail(){
let res = await notifyInvoiceDetail({
id: this.id
})
this.invoiceInfo = res.data
console.log('rerere', res)
}
}
}
</script>
@ -67,26 +158,61 @@ export default {
@import "@/styles/common.scss";
.wrap{
@include wh(100%,100%);
background-color: #F4F5F7;
}
.navBar{
height: 46px;
}
.contentWrap{
@include wh(100%,400px);
margin-left: 27px;
.item{
.mt_cls {
margin-top: 10px;
}
.content_tab {
background-color: #fff;
width: 100%;
@include all-height(47px);
.itemContent{
margin-left: 5px;
color: #323643;
@include fontWeightSize(400,13px);
padding: 15px 15px;
.tab_title {
font-size: 14px;
font-weight: bold;
margin-bottom: 5px;
}
.line{
@include wh(100%,1px);
@include bgcolorOpa(#E9E9EA,0.6);
.tab_content {
.item_wrap {
display: flex;
align-items: center;
line-height: 30px;
font-size: 12px;
.item_label {
color: rgba(0,0,0,0.5);
margin-right: 5px;
width: 60px;
}
.item_content {
display: flex;
align-items: center;
}
}
}
table {
line-height: 30px;
width: 100%;
.text_left {
text-align: left;
width: 50%;
}
th {
color: rgba(0, 0, 0, 0.5);
}
td {
text-align: center;
}
}
}
}
.copyIcon {
width: 35px;
height: 15px;
margin-left: 10px
}
</style>
</style>

View File

@ -11,41 +11,74 @@
@click-left="goBack"
/>
</div>
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
<div class="itemWrap" v-for="(item,index) in notifyList" :key="index" >
<div class="item line1">
<div class="itemTime">
<span class="title">开票月份:</span>
<span class="content">{{ item.invoiceMonth }}</span>
</div>
<div class="orderNum">
<span class="title">总案件数:</span>
<span class="content">{{ item.orderNum }}</span>
</div>
<div class="checkBtn" @click="goPage('invoicingDetail',{id:item.batchCode,startTime:item.startTime,overTime:item.overTime})">查看 </div>
</div>
<div class="item">
<span class="title">批次号:</span>
<span class="content">{{ item.batchCode }}</span>
</div>
<div class="item">
<span class="title">结算总金额:</span>
<span class="content">{{ item.totalMoney + '元' }}</span>
</div>
<div class="item">
<span class="title">扣款金额:</span>
<span class="content">{{ item.cutMoney + '元'}}</span>
</div>
<div class="item">
<span class="title">扣款原因:</span>
<span class="content" style="color: #FF8F37;">{{ item.remark }}</span>
</div>
<div class="item">
<span class="title">最终开票金额:</span>
<span class="content">{{ item.invoiceMoney+ '' }}</span>
</div>
<van-tabs v-model="active" sticky @click="changeTabHandler" background="#2C395F" color="#ffffff" title-active-color="#ffffff" title-inactive-color="#BDC1CD">
<van-tab title="全部" name="1"></van-tab>
<van-tab title="未开票" name="2"></van-tab>
<van-tab title="已开票" name="3"></van-tab>
</van-tabs>
<div class="content_wrap" :class="{ 'pd_cls': active == 2 }">
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="getMore"
>
<van-search
v-model="batchCode"
show-action
placeholder="请输入批次号或开票编号"
>
<template #action>
<div @click="onSearch">搜索</div>
</template>
</van-search>
<van-checkbox-group v-model="checkList">
<div class="itemWrap" v-for="(item,index) in notifyList" :key="index" @click="toggle(index)">
<div class="item line1">
<div class="itemTime">
<span class="title">批次号:</span>
<span class="content">{{ item.batchCode }}</span>
</div>
<div class="orderNum">
<span class="title">总案件数:</span>
<span class="content">{{ item?.orderNum || '' }}</span>
</div>
<div class="checkBtn" @click="goPage('invoicingDetail',{id:item.id, batchCode: item.batchCode})">查看</div>
</div>
<div class="item">
<span class="title">开票月份:</span>
<span class="content">{{ getMonth(item) }}</span>
</div>
<div class="item">
<span class="title">结算总金额:</span>
<span class="content">{{ item?.totalMoney ? item.totalMoney : 0 }}</span>
</div>
<div class="item">
<span class="title">扣款金额:</span>
<span class="content">{{ item?.cutMoney || 0 }}</span>
</div>
<div class="item">
<span class="title">扣款原因:</span>
<span class="content" style="color: #FF8F37;">{{ item.remark }}</span>
</div>
<div class="item">
<span class="title">最终开票金额:</span>
<span class="content">{{ item?.invoiceMoney || 0 }}</span>
</div>
<van-checkbox class="checkbox_cls" v-if="active == 2" :name="item" ref="checkboxes" />
</div>
</van-checkbox-group>
</van-list>
</van-pull-refresh>
</div>
<div class="invoice_btn_wrap" v-if="active == 2 && totalCount > 0">
<div class="invoice_btn_info">
<span class="invoice_btn_title">开票总金额</span>
<span class="invoice_btn_money">{{totalCount}}</span>
</div>
</van-pull-refresh>
<div class="btn">去开票</div>
</div>
<div v-show="show" class="bgShow">
<img src="@/assets/empty.png">
</div>
@ -63,14 +96,73 @@ export default {
notifyList:[],
pageNum:1,
pageSize:10,
total: 0,
show:false,
isLoading: false,
loading: false,
active: 1,
status: '',
dispatchAppSearchInvoiced: '',
batchCode: '',
finished: false,
checkList: [],
}
},
computed: {
totalCount () {
let total = 0;
this.checkList.map(item => {
total += item.invoiceMoney
})
return total
},
},
mounted() {
this.getNotifyList()
// this.getNotifyList()
},
methods:{
async onSearch() {
this.pageNum=1
await this.getNotifyList()
},
async getMore(){
if ( this.active != 2 ) {
await this.getNotifyList()
this.pageNum++;
// 加载状态结束
this.loading = false;
// 数据全部加载完成
if (this.notifyList.length >= this.total) {
this.finished = true;
}
}
},
changeTabHandler() {
this.pageNum = 1;
this.notifyList = [];
this.checkList = [];
if (this.active == 1) { // 全部, 需要分页
this.status = '';
this.dispatchAppSearchInvoiced = '';
this.pageSize = 10;
} else if(this.active == 2) { // 未开票, 不需要分页
this.status = 2;
this.dispatchAppSearchInvoiced = '';
this.pageSize = 10000
} else if(this.active == 3) { // 已开票,需要分页
this.status = '';
this.dispatchAppSearchInvoiced = 1;
this.pageSize = 10
}
this.getNotifyList()
},
getMonth(item) {
let str = '';
let startTime = new Date(item.createTime);
let endTime = new Date(item.overTime);
str = startTime.getFullYear() + '年' + (startTime.getMonth() + 1 ) + '月 - ' + endTime.getFullYear() + '年' + (endTime.getMonth() + 1) + '月'
return str
},
onRefresh() {
this.pageNum=1
this.getNotifyList()
@ -81,19 +173,33 @@ export default {
},
async getNotifyList(){
let res = await notifyInvoiceList({
pageNum:this.pageNum,
pageSize:this.pageSize
pageNum:this.pageNum,
pageSize:this.pageSize,
status: this.status,
dispatchAppSearchInvoiced: this.dispatchAppSearchInvoiced,
total: this.total,
batchCode: this.batchCode,
current: 1,
})
// if(res.code === 0){
this.notifyList=res.data;
console.log(this.notifyList)
if(this.notifyList.length === 0){
this.show=true
if(res.code == 200){
this.total=res.total
if(this.pageNum == 1){
this.notifyList=res.data;
}else{
let preList = this.notifyList;
let arr = res.data;
this.notifyList = preList.concat(arr)
}
if (this.notifyList.length === 0) {
this.show=true
}else{
this.show=false
}
}
// },
},
toggle(index) {
this.$refs.checkboxes[index].toggle();
},
}
}
</script>
@ -101,6 +207,11 @@ export default {
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.van-checkbox {
position: absolute;
bottom: 20px;
right: 15px;
}
.wrap{
@include wh(100%,100%);
background-color: #F4F5F7;
@ -113,6 +224,7 @@ export default {
}
.itemWrap{
background: #FFFFFF;
position: relative;
@include wh(100%,194px);
box-sizing: border-box;
padding: 14px 25px 18px 29px;
@ -125,6 +237,7 @@ export default {
}
.title{
opacity: .5;
margin-right: 5px;
}
}
.line1{
@ -141,10 +254,52 @@ export default {
}
.bgShow{
@include flexTwoCenter;
height:calc(100% - 46px);
/*height:calc(100% - 46px);*/
background-color: #FAFAFA;
img{
width: 100%;
}
}
</style>
.van-tabs {
position: fixed;
width: 100%;
background-color: #2c395f;
z-index: 1000000 !important;
}
.content_wrap {
padding-top: 1.17333rem;
}
.invoice_btn_wrap {
position: fixed;
bottom: 0;
width: 100%;
padding: 20px;
box-sizing: border-box;
background-color: #fff;
.invoice_btn_info {
display: flex;
justify-content: space-between;
align-items: center;
.invoice_btn_title {
font-size: 14px;
font-weight: bold;
}
.invoice_btn_money {
font-size: 26px;
color: red;
}
}
.btn {
width: 100%;
background-color: #2C395F;
color: #fff;
padding: 15px 0;
text-align: center;
border-radius: 6px;
}
}
.pd_cls {
padding-bottom: 40px;
}
</style>