You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
7.4 KiB
Vue

3 months ago
<template>
<view :style="{marginTop:barHeight+'px'}">
<Top text="合同查询" />
<scroll-view scroll-y="" style="background-color: #F2F3F5;"
:style="{height:`calc(${pageHeight+'px'} - 30rpx - 100rpx)`,paddingBottom:'30rpx'}"
@scrolltolower="onScrollToLower">
<view id="contain" ref="containRef">
<Card class="searchForm" :hideTitle="true">
<form @submit="getList" @reset="searchFormReset">
<FormItem :title="'合同编号'" v-if="!moreFormItem">
<SearchInput v-model="searchForm.contractCode" @search="getList" />
</FormItem>
<FormItem :title="'合同编号'" width="180rpx" v-if="moreFormItem">
<input class="uni-input" v-model="searchForm.contractCode" />
</FormItem>
<transition name="moreFormItem">
<view v-show="moreFormItem">
<FormItem :title="'客户合同编号'" width="201rpx">
<input class="uni-input" v-model="searchForm.customerContractCode" />
</FormItem>
<FormItem :title="'合同名称'" width="180rpx">
<input class="uni-input" v-model="searchForm.contractName" />
</FormItem>
<FormItem :title="'业务方向'" width="180rpx">
<Pickera key="label" :data="business_direction" :value="searchForm.businessDirection"
@change="e=>searchForm.businessDirection =e" />
</FormItem>
<FormItem :title="'合同状态'" width="180rpx">
<Pickera key="label" :data="contract_status" :value="searchForm.contractStatus"
@change="e=>searchForm.contractStatus =e" />
</FormItem>
3 months ago
</view>
</transition>
<view style="text-align: center;">
<button style="height:60rpx;width: 150rpx;line-height: 60rpx;display: inline-block;" v-if="moreFormItem"
form-type="submit" type="primary">搜索</button>
<button style="height:60rpx;width: 150rpx;line-height: 60rpx;display: inline-block;margin-left: 20rpx;"
v-if="moreFormItem" form-type="reset" plain="true" type="primary">重置</button>
3 months ago
</view>
<view class="toggle" @tap="toggleForm">
<view class="icon" :style="{transform: `rotate(${moreFormItem ? 180 : 0}deg)`}"></view>
3 months ago
</view>
</form>
</Card>
<Picker key="label" :data="business_direction" :value="searchForm.businessDirection"
@change="e=>searchForm.businessDirection =e" />
<Card class="table" :hideTitle="true">
<uni-collapse>
<uni-collapse-item v-for="i in list">
<template v-slot:title>
<view class="list-item-title">
<view class="leftText">
{{i.contractName}}
</view>
<view class="rightText">
<DictTag :options="contract_category" :value="i.contractCategory" />
</view>
</view>
</template>
<view style="padding:20rpx 0 " @tap="itemOperation(i)">
<view class="is-open-text">有无合同{{i.contractFlag}}
</view>
<view class="is-open-text">合同编号{{i.contractCode}}
</view>
<view class="is-open-text">业务方向
<DictTag :options="business_direction" :value="i.businessDirection" type="text" />
</view>
<view class="is-open-text">部门{{i.deptName}}</view>
<view class="is-open-text">合同签订日期{{i.contractDate}}
</view>
<view class="is-open-text">合同总价{{i.totalPrice}}
</view>
<view class="is-open-text">
甲方公司{{i.oneCustomerName}}
</view>
<view class="is-open-text">
乙方公司{{i.twoCustomerName}}
</view>
<view class="is-open-text">合同状态
<DictTag :options="contract_status" :value="i.contractStatus" type="text" />
</view>
<view class="is-open-text">流程状态{{i.flowStatus}}
</view>
<view class="is-open-text">
内部合同号{{i.internalContractCode}}</view>
<view class="is-open-text">
外部合同号{{i.externalContractCode}}</view>
</view>
</uni-collapse-item>
</uni-collapse>
</Card>
</view>
</scroll-view>
3 months ago
</view>
</template>
<script setup>
import {
ref,
toRefs,
onMounted,
nextTick,
3 months ago
} from 'vue';
import {
useDict
} from '@/utils/dict.js'
import {
listContractInfo
} from '@/api/contractInfo';
import {
getHeight
} from '@/utils/index.js'
3 months ago
const {
contract_category,
business_direction,
active_flag,
contract_flag,
contract_type,
contract_status
} = toRefs(
useDict(['contract_category', 'business_direction', 'active_flag', 'contract_flag', 'contract_type',
'contract_status'
])
);
const containRef = ref(null)
const moreFormItem = ref(false)
const toggleForm = () => {
moreFormItem.value = !moreFormItem.value
}
const searchForm = ref({
pageNum: 1,
pageSize: 10,
})
const list = ref([])
const total = ref(0)
3 months ago
const checkFull = () => {
let res = false
return new Promise(resolve => {
uni.createSelectorQuery()
.select('#contain') // 页面级查询,不用 .in(proxy)
.boundingClientRect(rect => {
resolve(rect?.height < pageHeight.value)
})
.exec()
})
}
const search = async () => {
const res = await listContractInfo(searchForm.value);
list.value = list.value.concat(res.rows);
total.value = res.total;
await nextTick()
if (await checkFull()) {
if (searchForm.value.pageNum * searchForm.value.pageSize < total.value) {
searchForm.value.pageNum += 1
search()
}
3 months ago
}
}
const getList = () => {
searchForm.value.pageNum = 1
list.value = []
search()
}
const searchFormReset = () => {
searchForm.value = {
pageNum: 1,
pageSize: 10,
}
}
const onScrollToLower = () => {
if (searchForm.value.pageNum * searchForm.value.pageSize < total.value) {
searchForm.value.pageNum += 1
search()
}
}
3 months ago
const itemOperation = (e) => {
if (e.contractStatus !== '1') {
uni.navigateTo({
url: '/pages/contract/info?type=1&id=' + e.contractId
})
}
if (e.contractStatus === '1') {
uni.navigateTo({
url: '/pages/contract/info?type=2&id=' + e.contractId
})
}
}
const pageHeight = ref(0)
const barHeight = ref(0)
3 months ago
const sys = uni.getSystemInfoSync()
onMounted(() => {
setTimeout(() => {
if ((process.env.UNI_PLATFORM === 'app-plus' || process.env.UNI_PLATFORM === 'app')) {
const statusBarHeight = plus.navigator.getStatusbarHeight()
barHeight.value = statusBarHeight
pageHeight.value = sys.windowHeight - statusBarHeight
} else {
pageHeight.value = sys.windowHeight
}
search()
}, 100)
3 months ago
})
</script>
<style lang="scss" scoped>
@import "@/uni.scss";
3 months ago
.searchForm {
margin-top: 30rpx;
padding-top: 0 !important;
display: inline-block;
3 months ago
:deep(.content) {
margin-top: 0 !important;
}
.toggle {
width: 100%;
height: 30rpx;
text-align: center;
padding: 10rpx 0;
.icon {
display: inline-block;
background-image: url(#{$img-url}/icon/toggle.png);
background-size: 100% 100%;
background-repeat: no-repeat;
width: 30rpx;
height: 30rpx;
transition: transform 0.3s;
}
}
3 months ago
}
.table {
margin-top: 30rpx;
padding-top: 0 !important;
display: inline-block;
3 months ago
:deep(.content) {
margin-top: 0 !important;
}
}
.list-item-title {
padding: 30rpx 0;
display: flex;
.leftText {
display: inline-block;
}
.rightText {
margin-left: auto;
}
}
.is-open-text {
padding-right: 20rpx;
display: inline-block;
min-width: calc(45% - 20rpx);
color: #999
}
</style>