|
@@ -0,0 +1,315 @@
|
|
|
+<template>
|
|
|
+ <div class="_PurchaseContractBox">
|
|
|
+ <div class="searchBox">
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">合同名称:</span>
|
|
|
+ <el-input v-model="queryParams.name" placeholder="请输入合同名称" style="width: 210px" />
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">合同编号:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.contractNumber"
|
|
|
+ placeholder="请输入合同编号"
|
|
|
+ style="width: 160px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">签订状态:</span>
|
|
|
+ <el-select
|
|
|
+ width="160px"
|
|
|
+ v-model="queryParams.isSign"
|
|
|
+ class="m-2"
|
|
|
+ placeholder="请选择行业"
|
|
|
+ size="large"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in isSignListAll"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">签订方式:</span>
|
|
|
+ <el-select
|
|
|
+ width="160px"
|
|
|
+ v-model="queryParams.signWay"
|
|
|
+ class="m-2"
|
|
|
+ placeholder="请选择行业"
|
|
|
+ size="large"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in signWayAllList"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">合同主类型:</span>
|
|
|
+ <el-select
|
|
|
+ width="160px"
|
|
|
+ v-model="queryParams.mainType"
|
|
|
+ class="m-2"
|
|
|
+ placeholder="请选择行业"
|
|
|
+ size="large"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in mainTypeAllList"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">合同次类型:</span>
|
|
|
+ <el-select
|
|
|
+ width="160px"
|
|
|
+ v-model="queryParams.secondType"
|
|
|
+ class="m-2"
|
|
|
+ placeholder="请选择行业"
|
|
|
+ size="large"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in secondTypeAllList"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="form">
|
|
|
+ <span class="formSpan">拿回时间:</span>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="lxsjObj"
|
|
|
+ type="daterange"
|
|
|
+ unlink-panels
|
|
|
+ range-separator="To"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="from">
|
|
|
+ <div class="btnBox">
|
|
|
+ <el-button type="primary" style="background: #3485ff" @click="searchHandle">
|
|
|
+ <img src="@/assets/imgs/OA/search.png" class="mr-8px" alt="" />
|
|
|
+ 查询</el-button
|
|
|
+ >
|
|
|
+ <el-button type="primary">
|
|
|
+ <img src="@/assets/imgs/OA/open.png" class="mr-8px" alt="" />
|
|
|
+ 导出</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="infoBox">
|
|
|
+ <ul>
|
|
|
+ <li v-for="(item, index) in infoList" :key="index" class="mr-40px">
|
|
|
+ <img class="mr-8px" :src="getAssetURL(item.icon)" alt="" />
|
|
|
+ <p>{{ item.name }}:</p>
|
|
|
+ <h4 class="font-size-18px">{{ item.num }}</h4>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div class="tableBox">
|
|
|
+ <div class="table" ref="tableRef">
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ style="width: 100%; height: 100%"
|
|
|
+ :style="{ height: tableHeight + 'px' }"
|
|
|
+ :header-cell-style="{
|
|
|
+ background: '#F7F8FA',
|
|
|
+ color: '#121518',
|
|
|
+ height: '50px'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-table-column label="序号" width="60">
|
|
|
+ <template #default="scope">{{ scope.$index + 1 }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="contractNumber" label="合同编号" width="180" />
|
|
|
+ <el-table-column prop="name" label="合同名称" width="240" />
|
|
|
+ <el-table-column prop="isSign" label="签订状态" width="100">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ isSignMap[scope.row.isSign] }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="areaManager" label="区域经理" width="120" />
|
|
|
+ <el-table-column prop="clientName" label="委托方" width="180" />
|
|
|
+ <el-table-column prop="mainType" label="合同主类型" width="80">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ mainTypeMap[scope.row.mainType] }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="amountStatus" label="合同状态" width="80">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ amountStatusMap[scope.row.amountStatus] }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="contractAmount" label="合同金额" width="100" />
|
|
|
+ <el-table-column prop="contractAmount" label="已回款金额" width="100" />
|
|
|
+ <el-table-column prop="receivableAmount" label="应收账款" width="100" />
|
|
|
+ <el-table-column prop="contractBalance" label="合同余额" width="100" />
|
|
|
+ <el-table-column prop="contractOn" label="拿出日期" width="120" />
|
|
|
+ <el-table-column prop="contractOff" label="拿回日期" width="120" />
|
|
|
+ <el-table-column label="操作" width="80">
|
|
|
+ <template #default="scope">
|
|
|
+ <div class="operateBtn" @click="operateClick(scope.row)">
|
|
|
+ <span>查看</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="pageBox">
|
|
|
+ <el-pagination
|
|
|
+ v-model:current-page="queryParams.pageNo"
|
|
|
+ :page-size="10"
|
|
|
+ background
|
|
|
+ layout="total, prev, pager, next, jumper"
|
|
|
+ :total="total"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+import moment from 'moment'
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
+import request from '@/config/axios'
|
|
|
+import { getAssetURL } from '@/utils/auth'
|
|
|
+import { isSignListAll } from '@/utils/business'
|
|
|
+import { signWayAllList } from '@/utils/business'
|
|
|
+import { mainTypeAllList } from '@/utils/business'
|
|
|
+import { secondTypeAllList } from '@/utils/business'
|
|
|
+import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
|
|
+
|
|
|
+defineOptions({ name: 'ProjectBook' })
|
|
|
+const amountStatusMap: any = { 2: '未付清', 3: '已付清', 4: '手动设置已付清' }
|
|
|
+const signWayMap: any = { 1: '跟单', 2: '半开拓', 3: '开拓' }
|
|
|
+const isSignMap: any = { 0: '未签', 1: '已签', 2: '待拿回', 3: '不签' }
|
|
|
+const mainTypeMap: any = { 1: '规划类', 2: '数据工程类', 3: '软件类', 4: '采购类' }
|
|
|
+const secondTypeMap: any = {
|
|
|
+ 1: '普通',
|
|
|
+ 2: '技贸',
|
|
|
+ 3: '入围',
|
|
|
+ 4: '补充协议/变更',
|
|
|
+ 5: '分包',
|
|
|
+ 6: '外包',
|
|
|
+ 7: '采购'
|
|
|
+}
|
|
|
+const router = useRouter()
|
|
|
+const { wsCache } = useCache()
|
|
|
+const tableRef: any = ref(null)
|
|
|
+const tableHeight: any = ref(0)
|
|
|
+const user = wsCache.get(CACHE_KEY.USER)
|
|
|
+const userId = user.user.id ? user.user.id : ''
|
|
|
+const deptId = user.user.deptId ? user.user.deptId : ''
|
|
|
+const queryParams = reactive<{
|
|
|
+ contractNumber: string
|
|
|
+ name: string
|
|
|
+ pageNo: number
|
|
|
+ pageSize: number
|
|
|
+ isSign: any
|
|
|
+ signWay: any
|
|
|
+ mainType: any
|
|
|
+ secondType: any
|
|
|
+ contractOn: string
|
|
|
+ contractOff: string
|
|
|
+ deptId: string
|
|
|
+}>({
|
|
|
+ contractNumber: '',
|
|
|
+ name: '',
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ isSign: '',
|
|
|
+ signWay: '',
|
|
|
+ mainType: '',
|
|
|
+ secondType: '',
|
|
|
+ contractOn: '',
|
|
|
+ contractOff: '',
|
|
|
+ deptId: deptId
|
|
|
+})
|
|
|
+const lxsjObj = ref()
|
|
|
+const infoList: any = ref([
|
|
|
+ {
|
|
|
+ icon: 'xmzx/xmzcz',
|
|
|
+ name: '总合同金额(万元)',
|
|
|
+ num: '0'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ icon: 'xmzx/xmzcb',
|
|
|
+ name: '总开票金额(万元)',
|
|
|
+ num: '0'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ icon: 'xmzx/xmzlr',
|
|
|
+ name: '总回款金额(万元)',
|
|
|
+ num: '-100000.57'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ icon: 'xmzx/xmzlr',
|
|
|
+ name: '总应收款(万元)',
|
|
|
+ num: '-100000.57'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ icon: 'xmzx/xmzlr',
|
|
|
+ name: '总合同余额(万元)',
|
|
|
+ num: '-100000.57'
|
|
|
+ }
|
|
|
+])
|
|
|
+
|
|
|
+const handleCurrentChange = (pageNo: number) => {
|
|
|
+ queryParams.pageNo = pageNo
|
|
|
+ queryContractListAjax()
|
|
|
+}
|
|
|
+const operateClick = (row: any) => {
|
|
|
+ router.push({
|
|
|
+ path: '/projectDetail',
|
|
|
+ query: { id: row.projectId, contractId: row.id }
|
|
|
+ })
|
|
|
+}
|
|
|
+const tableData = ref<Array<any>>([])
|
|
|
+const total = ref<number>()
|
|
|
+const searchHandle: () => void = () => {
|
|
|
+ queryContractListAjax()
|
|
|
+}
|
|
|
+const queryContractListAjax = async (): Promise<void> => {
|
|
|
+ const urlApi = `/contract/page`
|
|
|
+ if (lxsjObj.value && lxsjObj.value.length > 0) {
|
|
|
+ queryParams.contractOn = moment(lxsjObj.value[0]).format('YYYY-MM-DD')
|
|
|
+ queryParams.contractOff = moment(lxsjObj.value[1]).format('YYYY-MM-DD')
|
|
|
+ }
|
|
|
+ const sendData = {
|
|
|
+ ...queryParams,
|
|
|
+ pageSize: 10
|
|
|
+ }
|
|
|
+ const result = await request.get({ url: urlApi, params: sendData }, 'http://localhost:6010')
|
|
|
+ tableData.value = result['records']
|
|
|
+ total.value = result['total']
|
|
|
+}
|
|
|
+debugger
|
|
|
+queryContractListAjax()
|
|
|
+
|
|
|
+const filterNodeMethod = (value, data) => {
|
|
|
+ return data.name.includes(value)
|
|
|
+}
|
|
|
+onMounted(() => {
|
|
|
+ tableHeight.value = tableRef.value.clientHeight
|
|
|
+})
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import url(./purchaseContract.scss);
|
|
|
+.purchaseContractBox {
|
|
|
+ margin-top: 20px;
|
|
|
+ height: calc(100% - 20px);
|
|
|
+ background-color: #fff;
|
|
|
+ border-radius: 20px;
|
|
|
+ padding: 20px;
|
|
|
+ position: relative;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+</style>
|