开票接口对接

This commit is contained in:
yyy 2024-12-06 16:43:09 +08:00
parent 26e6d5b611
commit 07169ff815
4 changed files with 497 additions and 444 deletions

View File

@ -1,36 +1,27 @@
<template>
<uv-navbar
:fixed="false"
:title="title"
left-arrow
@leftClick="$onClickLeft"
/>
<view >
<uv-navbar :fixed="false" :title="title" left-arrow @leftClick="$onClickLeft" />
<view>
<view class="set-box bg-white pb-5">
<uv-form :model="form" ref="uForm" :rules="rules" :errorType="errorType" labelWidth="80">
<uv-form-item label="跟进线索:" prop="name">
<uv-form :model="form" ref="uForm" :rules="rules" :errorType="errorType" labelWidth="80">
<uv-form-item label="跟进线索:" prop="name">
<uv-input v-model="cluesName" border="none" disabled disabledColor="#ffffff" />
</uv-form-item>
<uv-form-item label="跟进状态:" prop="followStatus" @click="followShow" required>
<uv-input v-model="followName" placeholder="选择跟进状态" disabled disabledColor="#ffffff" >
<uv-form-item label="跟进状态:" prop="followStatus" @click="followShow" required>
<uv-input v-model="followName" placeholder="选择跟进状态" disabled disabledColor="#ffffff">
<template v-slot:suffix>
<uv-icon name="arrow-right"></uv-icon>
</template>
</uv-input>
</uv-form-item>
<uv-form-item label="跟进方式:" prop="recordType" @click="selectShow" required>
<uv-form-item label="跟进方式:" prop="recordType" @click="selectShow" required>
<uv-input v-model="recordTypeName" disabled disabledColor="#ffffff" placeholder="选择跟进方式">
<template v-slot:suffix>
<uv-icon name="arrow-right"></uv-icon>
</template>
</uv-input>
</uv-form-item>
<uv-form-item :label-position="labelPosition" label="下次跟进 :" @click="createTimeShow">
<uv-input v-model="nextTime" placeholder="选择跟进时间" disabled disabledColor="#ffffff" >
<template v-slot:suffix>
<uv-icon name="arrow-right"></uv-icon>
</template>
</uv-input>
<uv-form-item :label-position="labelPosition" label="下次跟进 :">
<uni-datetime-picker type="datetime" v-model="form.nextTime" />
</uv-form-item>
<uv-form-item required label="跟进内容:" prop="content">
<uv-textarea v-model="form.content" placeholder="请输入跟进内容"></uv-textarea>
@ -38,157 +29,167 @@
</uv-form>
<view class="mt-5" style="text-align: center;">
<view class="mb-3">
<uv-button @click="submit(false)" :ripple="true" color="#09b4f1" >立即提交</uv-button>
<uv-button @click="submit(false)" :ripple="true" color="#09b4f1">立即提交</uv-button>
</view>
</view>
</view>
<!-- 选择跟进方式 -->
<uv-action-sheet :actions="selectList" ref="selectShowRef" title="请选择跟进方式" @select="recordTypeClick"></uv-action-sheet>
<uv-action-sheet :actions="selectList" ref="selectShowRef" title="请选择跟进方式"
@select="recordTypeClick"></uv-action-sheet>
<!-- 选择跟进状态 -->
<uv-action-sheet :actions="followList" ref="followStatusShowRef" title="请选择跟进状态" @select="followClick"></uv-action-sheet>
<uv-datetime-picker ref="datetimePicker" v-model="timeValue" mode="datetime" @confirm="createTimeChange"></uv-datetime-picker>
<uv-action-sheet :actions="followList" ref="followStatusShowRef" title="请选择跟进状态"
@select="followClick"></uv-action-sheet>
</view>
</template>
<script setup>
import {
ref,
unref,
computed
} from 'vue'
import { onLoad,onShow ,onReady} from '@dcloudio/uni-app'
import {
getDictData,
createRecord
} from '@/api/customer'
import { formatDateTime } from '@/utils/util'
const title = ref('添加线索跟进')
const selectList = ref([])
const followList = ref([])
const followName = ref('')
const lists = ref([])
const content = ref('')
const recordTypeName = ref('')
const form = ref({
name: '',
nexxTime: '',
recordType: '',
followStatus: '',
content: '',
types: 'clues',
})
const cluesId = ref(0)
const cluesName = ref('')
const errorType = ref('message')
const nextTime = ref('')
const rules = ref({
followStatus: [
{
import {
ref,
unref,
computed
} from 'vue'
import {
onLoad,
onShow,
onReady
} from '@dcloudio/uni-app'
import {
getDictData,
createRecord
} from '@/api/customer'
import {
formatDateTime
} from '@/utils/util'
const title = ref('添加线索跟进')
const selectList = ref([])
const followList = ref([])
const followName = ref('')
const lists = ref([])
const content = ref('')
const recordTypeName = ref('')
const form = ref({
name: '',
nextTime: '',
recordType: '',
followStatus: '',
content: '',
types: 'clues',
})
const cluesId = ref(0)
const cluesName = ref('')
const errorType = ref('message')
const rules = ref({
followStatus: [{
required: true,
message: '请选择跟进状态',
trigger: ['change','blur']
},
],
recordType: [
{
trigger: ['change', 'blur']
}, ],
recordType: [{
required: true,
message: '请选择跟进方式',
trigger: ['change','blur']
},
],
content: [
{
trigger: ['change', 'blur']
}, ],
content: [{
required: true,
message: '请填写跟进内容',
trigger: ['change','blur']
},
],
})
onLoad((e) => {
cluesId.value = e.cluesId
cluesName.value = e.cluesName
getBaseConfig()
})
const followStatusShowRef = ref()
const followShow = () => {
followStatusShowRef.value.open()
}
const selectShowRef = ref()
const selectShow = () => {
selectShowRef.value.open()
}
const datetimePicker = ref()
const createTimeShow = () => {
unref(datetimePicker).open()
}
//
const getBaseConfig = async() => {
followList.value = await getDictData({type:'follow_status'})
selectList.value = await getDictData({type:'follow_type'})
}
//
const recordTypeClick = (index) => {
recordTypeName.value = index.name
form.value.recordType = index.value
}
//
const followClick = (index) => {
followName.value = index.name
form.value.followStatus = index.value
}
const createTimeChange = (e) => {
form.value.nextTime = e.value
nextTime.value = formatDateTime(e.value)
}
//
const uForm = ref()
const submit = (val) => {
uForm.value.validate().then(res => {
onSubmit()
}).catch(errors => {
uni.showToast({
icon: 'error',
title: '校验失败'
})
trigger: ['change', 'blur']
}, ],
})
}
//
const onSubmit = async() => {
form.value.typesId = cluesId.value
form.value.content = '【'+followName.value+'】' + form.value.content
await createRecord(form.value)
uni.navigateBack()
}
onLoad((e) => {
cluesId.value = e.cluesId
cluesName.value = e.cluesName
getBaseConfig()
})
const getNowTime = () => {
// Date
let currentDate = new Date();
let year = currentDate.getFullYear();
let month = currentDate.getMonth() + 1;
let day = currentDate.getDate();
let hours = currentDate.getHours();
let minutes = currentDate.getMinutes();
let seconds = currentDate.getSeconds();
return year + '-' + month + '-' + day + '-' + hours + '-' + minutes + '-' + seconds
}
const followStatusShowRef = ref()
const followShow = () => {
followStatusShowRef.value.open()
}
const selectShowRef = ref()
const selectShow = () => {
selectShowRef.value.open()
}
const datetimePicker = ref()
const createTimeShow = () => {
unref(datetimePicker).open()
}
//
const getBaseConfig = async () => {
followList.value = await getDictData({
type: 'follow_status'
})
selectList.value = await getDictData({
type: 'follow_type'
})
}
//
const recordTypeClick = (index) => {
recordTypeName.value = index.name
form.value.recordType = index.value
}
//
const followClick = (index) => {
followName.value = index.name
form.value.followStatus = index.value
}
//
const uForm = ref()
const submit = (val) => {
uForm.value.validate().then(res => {
onSubmit()
}).catch(errors => {
uni.showToast({
icon: 'error',
title: '校验失败'
})
})
}
//
const onSubmit = async () => {
form.value.typesId = cluesId.value
form.value.content = '【' + followName.value + '】' + form.value.content
await createRecord(form.value)
uni.navigateBack()
}
</script>
<style lang="scss" scoped>
.set-box {
padding: 0rpx 22rpx;
margin-bottom: 80rpx;
.option {
.text {
color: #747474;
font-size: 26rpx;
text-align: justify;
padding-bottom: 15rpx;
}
.input-box {
width: 200rpx;
margin-right: 15rpx;
}
}
}
.set-box {
padding: 0rpx 22rpx;
margin-bottom: 80rpx;
.option {
.text {
color: #747474;
font-size: 26rpx;
text-align: justify;
padding-bottom: 15rpx;
}
.input-box {
width: 200rpx;
margin-right: 15rpx;
}
}
}
</style>

View File

@ -332,11 +332,11 @@
</view>
</uv-popup>
<uv-datetime-picker ref="datetimePicker" v-model="timeValue" mode="date"
<uv-datetime-picker ref="datetimePicker" v-model="form.signingDate" mode="date"
@confirm="createTimeChange"></uv-datetime-picker>
<uv-datetime-picker ref="datetimePicker2" v-model="timeValue2" mode="date"
<uv-datetime-picker ref="datetimePicker2" v-model="form.startDate" mode="date"
@confirm="createTimeChange2"></uv-datetime-picker>
<uv-datetime-picker ref="datetimePicker3" v-model="timeValue2" mode="date"
<uv-datetime-picker ref="datetimePicker3" v-model="form.endDate" mode="date"
@confirm="createTimeChange3"></uv-datetime-picker>
</view>
</template>

View File

@ -2,100 +2,106 @@
<uv-navbar :fixed="false" :title="title" left-arrow @leftClick="$onClickLeft" />
<view style="overflow:hidden">
<view class="set-box bg-white">
<uv-alert type="warning" v-if="form.checkStatus == 1" description="发票正在审核中,不可以修改!"></uv-alert>
<uv-alert type="warning" v-else-if="form.checkStatus == 2" description="发票已经审核通过,不可以修改,可以开具!"></uv-alert>
<uv-form :model="form" ref="uForm" :errorType="errorType" labelPosition="top" labelWidth="130" :rules="rules">
<uv-form-item label="选择合同:" @click="type != 'check' ? selectShow() : ''" required prop="contractName"
v-if="form.checkStatus != 2">
<uv-input disabledColor="#ffffff" disabled v-model="form.contractName" placeholder="选择合同">
<uv-form-item label="选择合同:" @click="!isCheck ? selectShow() : ''" required prop="contractName">
<uv-input :disabled="isCheck" v-model="form.contractName" placeholder="选择合同">
<template v-slot:suffix>
<uv-icon name="arrow-right"></uv-icon>
</template>
</uv-input>
</uv-form-item>
<uv-form-item label="开票主体:" required prop="invoiceBody" v-if="form.checkStatus != 2">
<uv-input v-model="form.invoiceBody" :disabled="isCheck" placeholder="开票主体" />
<uv-form-item label="计划开票日期:" required prop="invoiceDate">
<uni-datetime-picker v-if="!isCheck" type="date" placeholder="请选择计划开票日期" :clear-icon="false"
v-model="form.invoiceDate" />
<uv-input v-else v-model="form.invoiceDate" :disabled="isCheck" placeholder="请输入开票内容" />
</uv-form-item>
<uv-form-item label="发票抬头:" prop="invoiceName" required v-if="form.checkStatus != 2">
<uv-input v-model="form.invoiceName" :disabled="isCheck" placeholder="发票抬头" />
<uv-form-item label="开票主体:" required prop="invoiceBody">
<uv-input v-model="form.invoiceBody" :disabled="isCheck" placeholder="请输入开票主体" />
</uv-form-item>
<uv-form-item label="抬头类型:" v-if="form.checkStatus != 2">
<uv-form-item label="发票抬头:" prop="invoiceName" required>
<uv-input v-model="form.invoiceName" :disabled="isCheck" placeholder="请输入发票抬头" />
</uv-form-item>
<uv-form-item label="抬头类型:" required prop="invoiceIssue">
<view style="margin-top: 14rpx;">
<uv-radio-group v-model="form.invoiceIssue" required>
<uv-radio-group v-model="form.invoiceIssue" required :disabled="isCheck">
<uv-radio v-for="(item, index) in sexList" :key="index" :name="item.name">
<text style="padding-right: 20rpx;">{{ item.text }}</text>
</uv-radio>
</uv-radio-group>
</view>
</uv-form-item>
<uv-form-item label="发票类型:" v-if="form.checkStatus != 2">
<uv-form-item label="发票类型:" required prop="invoiceType">
<view style="margin-top: 14rpx;">
<uv-radio-group v-model="form.invoiceType" required>
<uv-radio-group v-model="form.invoiceType" required :disabled="isCheck">
<uv-radio v-for="(item, index) in typeList" :key="index" :name="item.name">
<text style="padding-right: 20rpx;">{{ item.text }}</text>
</uv-radio>
</uv-radio-group>
</view>
</uv-form-item>
<uv-form-item label="统一社会信用代码:" v-if="form.checkStatus != 2">
<uv-input v-model="form.registerNo" :disabled="isCheck" placeholder="统一社会信用代码" />
<uv-form-item label="统一社会信用代码:" required prop="registerNo">
<uv-input v-model="form.registerNo" :disabled="isCheck" placeholder="请输入统一社会信用代码" />
</uv-form-item>
<uv-form-item label="开户行名称:" v-if="form.checkStatus != 2">
<uv-input v-model="form.bankName" :disabled="isCheck" placeholder="开户行名称" />
<uv-form-item label="开票金额:" prop="amount" required>
<uv-input type="number" v-model="form.amount" :disabled="isCheck" placeholder="请输入开票金额" />
</uv-form-item>
<uv-form-item label="开户账户:" v-if="form.checkStatus != 2">
<uv-input v-model="form.bankNo" :disabled="isCheck" placeholder="开户账户" />
<uv-form-item label="开票内容:" prop="content">
<uv-input v-model="form.content" :disabled="isCheck" placeholder="请输入开票内容" />
</uv-form-item>
<uv-form-item label="开票金额:" prop="money" required>
<uv-input type="number" v-model="form.money" :disabled="isCheck" placeholder="开票金额" />
<uv-form-item label="开票单位地址:" prop="unitAddress">
<uv-input v-model="form.unitAddress" :disabled="isCheck" placeholder="请输入开票单位地址" />
</uv-form-item>
<uv-form-item label="开票税率(%):">
<uv-input type="number" v-model="form.taxRate" :disabled="isCheck" placeholder="开票税率" />
<uv-form-item label="开票单位电话:" prop="unitPhone">
<uv-input v-model="form.unitPhone" :disabled="isCheck" placeholder="请输入开票单位电话" />
</uv-form-item>
<uv-form-item label="开票内容:">
<uv-input v-model="form.content" :disabled="isCheck" placeholder="开票内容" />
<uv-form-item label="开票单位开户银行:" prop="unitBankName">
<uv-input v-model="form.unitBankName" :disabled="isCheck" placeholder="请输入开票单位开户银行" />
</uv-form-item>
<uv-form-item label="接收邮箱:">
<uv-input v-model="form.email" :disabled="isCheck" placeholder="开票时会把发票附件发送到邮箱" />
<uv-form-item label="开票单位银行账号:" prop="unitBankNo">
<uv-input v-model="form.unitBankNo" :disabled="isCheck" placeholder="请输入开票单位银行账号" />
</uv-form-item>
<uv-form-item label="收件人:">
<uv-input v-model="form.userName" :disabled="isCheck" placeholder="如果需要邮寄请填写" />
</uv-form-item>
<uv-form-item label="手机:">
<uv-input v-model="form.userPhone" :disabled="isCheck" placeholder="如果需要邮寄请填写" />
</uv-form-item>
<uv-form-item label="邮寄地址:">
<uv-input v-model="form.userAddress" :disabled="isCheck" placeholder="如果需要邮寄请填写" />
</uv-form-item>
<uv-form-item label="审批人:" v-if="form.checkStatus != 2">
<uv-input disabledColor="#ffffff" disabled v-model="form.flowAdminIdName" placeholder="请去审批流程里配置合同审批" />
</uv-form-item>
<uv-form-item label="发票附件:" v-if="form.checkStatus == 2">
<!-- <uv-upload
:fileList="fileList1"
name="1"
:maxCount="1"
@afterRead="afterRead"
@delete="deletePic"
></uv-upload> -->
<upload-file v-model="fileList" />
</uv-form-item>
<uv-form-item label="备注:">
<uv-textarea v-model="form.remarks" :disabled="isCheck" placeholder="请输入备注"></uv-textarea>
<uv-form-item label="开票单位邮箱:" prop="email">
<uv-input v-model="form.email" :disabled="isCheck" placeholder="请输入开票单位邮箱" />
</uv-form-item>
<view class="container-item" style="flex-direction: column;align-items: flex-start;border-bottom: none;">
<view class="container-item-upload">
<view class="container-item-label">图片</view>
</view>
<view class="item-photo-list">
<view class="item-photo-list-item" style="font-size: 0; position: relative;margin-bottom: 60rpx;"
:style="{marginRight:(index+1)%3==0?'0rpx':'20rpx'}" v-for="(item, index) in imgFiles" :key="item"
@click="replaceImage(item, index)">
<image v-if="!isCheck" src="@/static/greyguanbi.png" mode="aspectFit" class="item-photo-list-item-close"
@click.stop="deleteItem(item, index)"></image>
<image v-if="!isCheck" :src="item.url" mode="" style="width: 100%; height: 100%"></image>
</view>
<image src="http://sys.znkjfw.com/imgs/process/uploadzp.png" mode="aspectFill" class="item-photo-list-item"
v-if="imgFiles.length<9 && !isCheck" @click="chooseImage"></image>
</view>
</view>
<view class="container-item" style="flex-direction: column;align-items: flex-start;border-bottom: none;">
<view class="container-item-upload">
<view class="container-item-label">附件 pdf</view>
</view>
<view class="item-photo-list">
<view class="item-photo-list-item" style="font-size: 0; position: relative;margin-bottom: 60rpx;"
:style="{marginRight:(index+1)%3==0?'0rpx':'20rpx'}" v-for="(item, index) in pdfList" :key="item">
<image v-if="!isCheck" src="@/static/greyguanbi.png" mode="aspectFit" class="item-photo-list-item-close"
@click.stop="deleteFiles(item, index)"></image>
<image v-if="!isCheck" src="http://sys.znkjfw.com/imgs/process/pdfIcon.png" mode=""
style="width: 100%; height: 100%">
</image>
<view class="item-photo-list-item-name">
{{item.name || ''}}
</view>
</view>
<image v-if="!isCheck" src="http://sys.znkjfw.com/imgs/process/uploadzp.png" mode="aspectFill"
class="item-photo-list-item" @click="chooseFiles"></image>
</view>
</view>
</uv-form>
<view class="mt-4" style="text-align: center;" v-if="!isCheck">
<uv-button color="#09b4f1" @click="submit" v-if="form.checkStatus == 0 || form.checkStatus == 3"
:ripple="true">确定提交</uv-button>
<uv-button color="#09b4f1" @click="submit2" v-if="form.checkStatus == 2" :ripple="true">开具发票</uv-button>
</view>
<view class="mt-4 flex justify-end" style="text-align: center;" v-else>
<view style="width: 25%;margin-right: 10rpx;">
<uv-button color="#09b4f1" @click="submitCheck(1)">审核</uv-button>
</view>
<view style="width: 25%;">
<uv-button type="error" @click="selectShow5()">拒绝</uv-button>
</view>
<view class="mt-4" style="text-align: center;">
<uv-button color="#09b4f1" @click="submit" :disabled="isCheck" :ripple="true">确定提交</uv-button>
</view>
</view>
<uv-popup mode="bottom" round="38" ref="selectShowRef5">
@ -114,7 +120,6 @@
<view style="padding: 20rpx;">
<uv-button color="#09b4f1" @click="submitCheck(2)">确定</uv-button>
</view>
</view>
</uv-popup>
<!-- 选择客户弹窗 -->
@ -128,20 +133,17 @@
<uv-icon name="close" color="#909399" size="30"></uv-icon>
</view>
</view>
<uv-search margin="30rpx 20rpx" shape="square" v-model="keyword" :show-action="false" :clearabled="true"
placeholder="输入客户名称搜索" @change="onSearch"></uv-search>
<scroll-view scroll-y style="height: 760rpx;width: 100%;" @scrolltolower="reachBottom">
<view class="list">
<block v-if="customerList.length > 0">
<view class="mb-4">
<view class="item flex" v-for="(item,index) in customerList" :key="index" @click="onItem(item,index)">
<view class="title">{{item.name}}</view>
<view class="title">{{item.contractName}}</view>
<view class="check-icon">
<uv-icon v-if="item.checked" name="checkmark" color="#09b4f1" size="28"></uv-icon>
</view>
</view>
</view>
<uv-load-more :status="listStatus"></uv-load-more>
</block>
<uv-empty text="暂无数据" v-else mode="list"></uv-empty>
</view>
@ -164,7 +166,7 @@
onShow
} from '@dcloudio/uni-app'
import {
getContractPage
getListByDeptId
} from '@/api/contract'
import {
invoiceCreate,
@ -176,7 +178,9 @@
import {
getSimpleUserList,
getFlowUsers,
getSimpleUserList2
getSimpleUserList2,
uploadFile,
deleteBpmFile
} from '@/api/user'
import AddressSelect from '@/components/AddressSelect/index.vue'
import {
@ -185,8 +189,6 @@
} from '@/utils/util'
const title = ref('申请发票')
const labelPosition = ref('left')
const keyword = ref('')
const listStatus = ref('loadmore')
const listStatus3 = ref('loadmore')
const customerList = ref([])
const accountName = ref('')
@ -205,12 +207,25 @@
const content = ref('')
const customerName = ref('')
const form = ref({
invoiceIssue: 1,
invoiceType: 1,
contractName: '',
invoiceBody: '',
invoiceName: '',
money: '',
invoiceDate: undefined, //
customerName: undefined, //
customerId: undefined, //
projectId: [], //
invoiceBody: undefined, //
invoiceName: undefined, //
invoiceIssue: 1, // | 123
invoiceType: 1, // | 12
registerNo: undefined, //
amount: undefined, //
content: undefined, //
unitAddress: undefined, //
unitPhone: undefined, //
unitBankName: undefined, //
unitBankNo: undefined, //
email: undefined, //
contractId: undefined, //
contractInstanceId: undefined, //
fileItems: []
})
const timeText = ref('')
const errorType = ref('message')
@ -219,22 +234,32 @@
required: true,
message: '请选择合同',
trigger: ['change', 'blur']
}, ],
}],
invoiceDate: [{
required: true,
message: '请选择开票日期',
trigger: ['change', 'blur']
}],
invoiceBody: [{
required: true,
message: '请填写开票主体',
trigger: ['change', 'blur']
}, ],
}],
invoiceName: [{
required: true,
message: '请填写发票抬头',
trigger: ['change', 'blur']
}, ],
money: [{
}],
registerNo: [{
required: true,
message: '请填写统一社会信用代码',
trigger: ['change', 'blur']
}],
amount: [{
required: true,
message: '请填写发票金额',
trigger: ['change', 'blur']
}, ],
}],
})
const customerContacts = ref([])
const userList = ref([])
@ -262,59 +287,24 @@
])
const typeList = ref([{
name: 1,
text: '增值税普票',
text: '普票',
},
{
name: 2,
text: '增值税专票',
text: '专票',
},
])
const fileList = ref([])
onLoad((e) => {
if (e.type) {
type.value = e.type
}
if (type.value == 'check') {
isCheck.value = true
title.value = '审核发票'
contractId.value = e.id
getContractInfo()
}
if (type.value == "edit") {
title.value = '编辑发票'
contractId.value = e.id
getContractInfo()
}
type.value = e.type
getCustomerList()
getFlowUsersList()
})
onShow(() => {
})
const getFlowUsersList = async () => {
let data = await getFlowUsers({
flowType: 'invoice'
})
let users = await getSimpleUserList2()
let userIdArr = []
let userArr = []
for (var i = 0; i <= data.length; i++) {
users.forEach((item, index) => {
if (data[i] == item.id) {
userIdArr.push(item.id)
userArr.push(item.nickname)
}
})
if (type.value == 'detail') {
isCheck.value = true
title.value = '发票详情'
contractId.value = e.id
getContractInfo()
}
form.value.flowAdminIdName = userArr.join(',')
form.value.flowAdminId = userIdArr
}
})
const getNumber = async () => {
form.value.number = await getCode()
@ -328,96 +318,53 @@
unref(selectShowRef).close()
}
//
const getContractInfo = async () => {
form.value = await getInvoice({
id: contractId.value
})
form.value.flowAdminId = form.value.flowAdminId2
}
//
const onSearch = () => {
page.value = 1
lastPage.value = false
getCustomerList()
}
form.value.invoiceDate = form.value.invoiceDate.join("-")
if (form.value.fileItems.length) {
form.value.fileItems.forEach(item => {
if (getFileType(item.name) == 'image') {
imgFiles.value.push(item)
}
if (getFileType(item.name) == 'pdf') {
pdfList.value.push(item)
}
})
}
const getCustomerList = async (isNextPage, pages) => {
await getContractPage({
pageNo: page.value,
pageSize: pageSize.value,
relation: 'my',
name: keyword.value,
}).then(res => {
if (res) {
//
if (res.list.length < 10) {
listStatus.value = 'nomore'
}
//
if (res.list.length == 0) {
lastPage.value = true
}
//
if (isNextPage) {
customerList.value = customerList.value.concat(res.list)
return
}
customerList.value = res.list
if (form.value.customerId) {
customerList.value.forEach((item, index) => {
if (form.value.customerId == item.id) {
item.checked = true
customerName.value = item.name
} else {
item.checked = false
}
})
}
customerList.value.forEach(item => {
if (item.id == form.value.contractId) {
form.value.contractName = item.contractName
}
})
}
//
const reachBottom = () => {
if (lastPage.value || listStatus.value == 'loading') return
listStatus.value = 'loading'
setTimeout(() => {
getCustomerList(true, ++page.value)
if (customerList.value.length >= 10) {
listStatus.value = 'loadmore';
} else {
listStatus.values = 'loading';
}
}, 1200)
//
const getCustomerList = async () => {
await getListByDeptId().then(res => {
customerList.value = res
})
}
//
const onItem = async (val, i) => {
customerList.value.forEach((item, index) => {
if (val.id == item.id) {
item.checked = true
val.name = val.name ? val.name : item.name;
} else {
item.checked = false
}
})
form.value.contractId = val.id
form.value.invoiceBody = val.customerName
form.value.invoiceName = val.customerName
//customerId.value = val.id
form.value.contractName = val.name ? val.name : ''
form.value.contractName = val.contractName
form.value.contractInstanceId = val.processInstanceId
selectShowClose()
}
const selectShowRef5 = ref()
const selectShow5 = async () => {
unref(selectShowRef5).open()
@ -426,15 +373,12 @@
unref(selectShowRef5).close()
}
const submitCheck = async (type) => {
if (type == 2 && form2.value.remark == '') {
uni.showToast({
icon: 'error',
title: '请填写驳回理由'
})
return
}
form2.value.id = contractId.value
@ -452,34 +396,6 @@
}, 1000);
}
const submit2 = async () => {
console.log('fileList:', fileList.value)
if (fileList.value.length == 0) {
uni.showToast({
icon: 'error',
title: '请上传发票附件'
})
return
}
let fileArr = []
fileList.value.forEach((item, index) => {
fileArr.push(item.url)
})
const files = fileArr.join(",")
form.value.files = files
await invoiceIssue(form.value)
uni.showToast({
title: '开具成功',
icon: 'success',
duration: 2000
})
prePage().$vm.isRefresh = true
setTimeout(() => {
uni.navigateBack();
}, 1000);
}
//
const uForm = ref()
@ -489,57 +405,145 @@
icon: 'error',
title: '请选择合同'
})
return
}
uForm.value.validate().then(res => {
onSubmit()
}).catch(errors => {
uni.showToast({
icon: 'error',
title: '校验失败'
title: '请完善发票信息'
})
})
}
//
const onSubmit = async () => {
if (type.value == 'add') {
await invoiceCreate(form.value)
await invoiceCreate(form.value)
uni.showToast({
title: '申请成功',
icon: 'success',
duration: 2000
})
prePage().$vm.isRefresh = true
setTimeout(() => {
uni.navigateBack();
}, 1000);
}
uni.showToast({
title: '申请成功',
icon: 'success',
duration: 2000
})
prePage().$vm.isRefresh = true
setTimeout(() => {
uni.navigateBack();
}, 1000);
} else {
await invoiceUpdate(form.value)
uni.showToast({
title: '修改成功',
icon: 'success',
duration: 2000
})
prePage().$vm.isRefresh = true
setTimeout(() => {
uni.navigateBack();
}, 1000);
}
//
const imgFiles = ref([]) //
const pdfList = ref([]) //pdf
//
const deleteFiles = (val, i) => {
deleteBpmFile({
url: val.url
}).then(res => {
pdfList.value.splice(i, 1)
})
}
//
const uploadFileApi = (url) => {
return new Promise((reslove, reject) => {
uploadFile(url, true)
.then((res) => {
console.log(res, 'success')
reslove(res);
})
.catch((err) => {
console.log(err, 'err')
reject(err);
});
});
}
//
const getExtension = (fileName) => {
let arr = fileName.split('.');
return arr[arr.length - 1];
}
//
const chooseImage = () => {
uni.chooseImage({
count: 9 - imgFiles.value.length, //9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: (res) => {
let promise = Promise.resolve();
let arr = [];
uni.showLoading({
title: '上传中'
})
res.tempFilePaths.forEach((item) => {
promise = promise.then(() => uploadFileApi(item));
promise
.then((ress) => {
arr.push(1)
imgFiles.value.push({
name: ress.name,
url: ress.url
})
if (arr.length >= res.tempFilePaths.length) {
uni.hideLoading()
}
})
.catch((err) => {
uni.hideLoading()
});
});
}
});
}
// pdf
const chooseFiles = () => {
wx.chooseMessageFile({
count: 9 - pdfList.value.length, //100
extension: ['pdf', '.pdf'],
success: (res) => {
let isUploadFile = true
res.tempFiles.forEach(item => {
if (getExtension(item.name) != 'pdf') {
isUploadFile = false
}
})
if (!isUploadFile) {
uni.showToast({
title: '请您上传pdf格式文件',
});
return
}
let promise = Promise.resolve();
let arr = [];
uni.showLoading({
title: '上传中'
})
res.tempFiles.forEach((item) => {
promise = promise.then(() => uploadFileApi(item.path));
promise
.then((ress) => {
arr.push(1)
pdfList.value.push({
name: ress.name,
url: ress.url
})
if (arr.length >= res.tempFilePaths.length) {
uni.hideLoading()
}
})
.catch((err) => {
uni.hideLoading()
});
});
}
});
}
</script>
<style lang="scss" scoped>
.set-box {
padding: 0rpx 22rpx 20rpx 34rpx;
margin-bottom: 80rpx;
padding: 0rpx 22rpx 50rpx 34rpx;
.list {
margin: 40rpx 15rpx 60rpx;
@ -590,6 +594,8 @@
}
.popup-content {
width: 750rpx;
.popup-title {
display: flex;
align-items: center;
@ -629,4 +635,69 @@
padding: 28rpx 10rpx 45rpx;
}
}
.container-item {
width: 100%;
padding: 25rpx 0;
border-bottom: 1rpx solid #e8e8e8;
display: flex;
align-items: center;
justify-content: space-between;
}
.container-item-label {
flex-shrink: 0;
color: #020202;
font-weight: 400;
font-face: PingFang SC;
font-size: 30rpx;
margin-right: 15rpx;
}
.item-photo-list {
display: flex;
flex-wrap: wrap;
padding: 0 30rpx;
margin-top: 20rpx;
}
.item-photo-list-item-name {
position: absolute;
width: 100%;
left: 0;
bottom: -40rpx;
font-size: 22rpx;
text-align: center;
overflow: hidden;
/* 确保超出容器的文本被裁剪 */
white-space: nowrap;
/* 确保文本在一行内显示 */
text-overflow: ellipsis;
/* 超出部分显示为省略号 */
}
.item-photo-list-item-close {
width: 40rpx;
height: 40rpx;
position: absolute;
right: -20rpx;
top: -20rpx;
}
.item-photo-list-item {
width: 180rpx;
height: 180rpx;
flex-shrink: 0;
border: 2rpx solid #e5e5e5;
border-radius: 10rpx;
margin-bottom: 20rpx;
/* margin-right: 20rpx; */
}
.container-item-upload {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
</style>

View File

@ -18,7 +18,7 @@
@scrolltolower="reachBottom">
<view class="page-box">
<block v-if="dataList.length > 0">
<view class="client" v-for="(items, index) in dataList" :key="index" @click="onItem(items.id)">
<view class="client" v-for="(items, index) in dataList" :key="index">
<view class="top">
<view class="left uv-line-1">
<view class="store uv-line-1">{{items.invoiceName}}</view>
@ -39,11 +39,8 @@
<view class="bottom">
<view class="client_time">¥{{items.amount}}</view>
<view class="flex">
<block v-if="items.isCheck">
<view class="btn ml-1 entity" @click.stop="onCheck(items.id)">审核</view>
</block>
<block v-else-if="items.checkStatus == 2">
<view class="btn ml-1 primary" @click.stop="onCheck(items.id,'look')">开具</view>
<block>
<view class="btn ml-1 primary" @click="onCheck(items.id)">详情</view>
</block>
</view>
</view>
@ -140,16 +137,10 @@
}
//
const onCheck = (id, type) => {
if (type == 'look') {
uni.navigateTo({
url: '/pages/components/pages/invoice/add?id=' + id + '&type=edit'
});
} else {
uni.navigateTo({
url: '/pages/components/pages/invoice/add?id=' + id + '&type=check'
});
}
const onCheck = (id) => {
uni.navigateTo({
url: '/pages/components/pages/invoice/add?id=' + id + '&type=detail'
});
}
const handleSelect = (key) => {
@ -228,12 +219,6 @@
getList()
}
const onItem = (val) => {
uni.navigateTo({
url: '/pages/components/pages/invoice/add?id=' + val + '&type=edit'
});
}
//
const onAdd = () => {
uni.navigateTo({
@ -324,10 +309,6 @@
color: $uv-info-dark;
}
.entity {
color: #fff;
background-color: #FF6146;
}
.primary {
color: #FFF;