添加采购、销售合同模板,对接导入接口

This commit is contained in:
wangchengming 2025-11-21 14:49:05 +08:00
parent ddc973fed0
commit f81e56e167
6 changed files with 699 additions and 733 deletions

Binary file not shown.

View File

@ -1,226 +1,112 @@
<template>
<el-drawer
title="导入失败列表"
:visible.sync="drawerVisible"
direction="rtl"
size="90%"
append-to-body>
<el-table
:data="importData"
style="width: 100%"
height="250">
<el-drawer title="导入失败列表" :visible.sync="drawerVisible" direction="rtl" size="90%" append-to-body>
<el-table :data="importData" style="width: 100%" height="250">
<el-table-column
prop="projectExecutor"
label="项目执行人"
width="150">
<el-table-column prop="projectExecutor" label="项目执行人" width="150">
</el-table-column>
<el-table-column
prop="department"
label="部门"
width="150">
<el-table-column prop="department" label="部门" width="150">
</el-table-column>
<el-table-column
prop="projectCode"
label="项目编号"
width="150">
<el-table-column prop="projectCode" label="项目编号" width="150">
</el-table-column>
<el-table-column
prop="orderCode"
label="订单编号"
width="150">
<el-table-column prop="orderCode" label="订单编号" width="150">
</el-table-column>
<el-table-column
prop="projectName"
label="项目名称"
width="150">
<el-table-column prop="projectName" label="项目名称" width="150">
</el-table-column>
<el-table-column
prop="clientName"
label="客户名称"
width="150">
<el-table-column prop="clientName" label="客户名称" width="150">
</el-table-column>
<el-table-column
prop="city"
label="城市"
width="120">
<el-table-column prop="city" label="城市" width="120">
</el-table-column>
<el-table-column
prop="publishStartDate"
label="上刊时间"
width="180">
<el-table-column prop="publishStartDate" label="上刊时间" width="180">
</el-table-column>
<el-table-column
prop="publishEndDate"
label="下刊时间"
width="180">
<el-table-column prop="publishEndDate" label="下刊时间" width="180">
</el-table-column>
<el-table-column
prop="mediaType"
label="媒体类型"
width="120">
<el-table-column prop="mediaType" label="媒体类型" width="120">
</el-table-column>
<el-table-column
prop="mediaPosition"
label="媒体位置"
width="150">
<el-table-column prop="mediaPosition" label="媒体位置" width="150">
</el-table-column>
<el-table-column
prop="quantity"
label="数量"
width="100">
<el-table-column prop="quantity" label="数量" width="100">
</el-table-column>
<el-table-column
prop="frequency"
label="频次"
width="100">
<el-table-column prop="frequency" label="频次" width="100">
</el-table-column>
<el-table-column
prop="listPrice"
label="刊例价"
width="120">
<el-table-column prop="listPrice" label="刊例价" width="120">
</el-table-column>
<el-table-column
prop="listPriceUnit"
label="刊例单位"
width="120">
<el-table-column prop="listPriceUnit" label="刊例单位" width="120">
</el-table-column>
<el-table-column
prop="discount"
label="折扣"
width="100">
<el-table-column prop="discount" label="折扣" width="100">
</el-table-column>
<el-table-column
prop="mediaCost"
label="媒体费"
width="120">
<el-table-column prop="mediaCost" label="媒体费" width="120">
</el-table-column>
<el-table-column
prop="productionCost"
label="制作费"
width="120">
<el-table-column prop="productionCost" label="制作费" width="120">
</el-table-column>
<el-table-column
prop="isBid"
label="是否比稿"
width="120">
<el-table-column prop="isBid" label="是否比稿" width="120">
</el-table-column>
<el-table-column
prop="bidRebate"
label="比稿返点"
width="120">
<el-table-column prop="bidRebate" label="比稿返点" width="120">
</el-table-column>
<el-table-column
prop="bidAmount"
label="比稿金额"
width="120">
<el-table-column prop="bidAmount" label="比稿金额" width="120">
</el-table-column>
<el-table-column
prop="ykToQunYiRebateRate"
label="YK给群邑返点比例"
width="180">
<el-table-column prop="ykToQunYiRebateRate" label="YK给群邑返点比例" width="180">
</el-table-column>
<el-table-column
prop="yuKeRebateToQunYi"
label="优客返点给群邑"
width="180">
<el-table-column prop="yuKeRebateToQunYi" label="优客返点给群邑" width="180">
</el-table-column>
<el-table-column
prop="ykToYYXRebateRate"
label="YK给YYX返点比例"
width="180">
<el-table-column prop="ykToYYXRebateRate" label="YK给YYX返点比例" width="180">
</el-table-column>
<el-table-column
prop="yuKeRebateToYYX"
label="优客返点给YYX"
width="180">
<el-table-column prop="yuKeRebateToYYX" label="优客返点给YYX" width="180">
</el-table-column>
<el-table-column
prop="orderAmountPerTransaction"
label="每笔订单金额"
width="180">
<el-table-column prop="orderAmountPerTransaction" label="每笔订单金额" width="180">
</el-table-column>
<el-table-column
prop="contractSignDate"
label="合同签订日期"
width="180">
<el-table-column prop="contractSignDate" label="合同签订日期" width="180">
</el-table-column>
<el-table-column
prop="actualInvoiceDate"
label="实际开票日期"
width="180">
<el-table-column prop="actualInvoiceDate" label="实际开票日期" width="180">
</el-table-column>
<el-table-column
prop="agreedPaymentDate"
label="约定回款日期"
width="180">
<el-table-column prop="agreedPaymentDate" label="约定回款日期" width="180">
</el-table-column>
<el-table-column
prop="actualPaymentDate"
label="实际回款日期"
width="180">
<el-table-column prop="actualPaymentDate" label="实际回款日期" width="180">
</el-table-column>
<el-table-column
prop="additionalNotes"
label="补充说明"
width="200">
<el-table-column prop="additionalNotes" label="补充说明" width="200">
</el-table-column>
<el-table-column
prop="partyA"
label="甲方"
width="150">
<el-table-column prop="partyA" label="甲方" width="150">
</el-table-column>
<el-table-column
prop="partyB"
label="乙方"
width="150">
<el-table-column prop="partyB" label="乙方" width="150">
</el-table-column>
<el-table-column
prop="status"
label="状态"
width="100">
<el-table-column prop="status" label="状态" width="100">
<div style="color:red;">导入失败</div>
</el-table-column>
<el-table-column
prop="notes"
label="备注"
width="200"
>
<el-table-column prop="notes" label="备注" width="200">
<template slot-scope="scope">
<span style="color: red;">{{ scope.row.notes }}</span>
</template>
@ -235,7 +121,10 @@ import { mapGetters } from 'vuex';
export default {
props: {
importData: [],
importData: {
type: Array, // Array
default: () => []
},
},
data() {
return {

View File

@ -13,8 +13,8 @@ export const searchItems = [
{ label: "", prop: "keyword", placeholder: "媒体位置/乙方姓名/项目编号/项目名称", isExtend: false },
{ label: "客户名称", prop: "clientId", placeholder: "请选择", type: 'selector', isExtend: true, available: false },
{ label: "媒介部门", prop: "mediaDeptId", placeholder: "请选择", type: 'selector', isExtend: true, available: false },
{ label: "城市", prop: "cityId", placeholder: "请选择", type: 'multiSelector', isExtend: true, available: false},
{ label: "媒体类型", prop: "mediaId", placeholder: "请选择", type: 'selector', isExtend: true, available: false},
{ label: "城市", prop: "cityId", placeholder: "请选择", type: 'multiSelector', isExtend: true, available: false },
{ label: "媒体类型", prop: "mediaId", placeholder: "请选择", type: 'selector', isExtend: true, available: false },
{ label: "时间范围", prop: "timesRange", placeholder: "请选择", isExtend: true, available: false },
{ label: "甲方", prop: "firstId", placeholder: "请选择", isExtend: true, available: false },
// { label: "乙方", prop: "secondName", placeholder: "请选择", isExtend: true, available: false },
@ -278,6 +278,14 @@ export const tableColumns = [
isCheck: false,
width: [78, 102],
},
{
title: "检测照片",
dataIndex: "detectPicAttr",
dataIndexType: "ordinary",
align: "center",
isCheck: false,
width: [78, 102],
},
{
title: "上刊",
dataIndex: "upPrint",

View File

@ -1,34 +1,15 @@
<template>
<div class="app-container">
<ElQueryTable
ref="tableRef"
:searchItems="searchItems"
:tableConfig="tableConfig"
:isExtendAction="false"
:selectedRowKeys.sync="selectedRowKeys"
:isRowCheck="showColumnBtn"
:showCheckFlag="showCheckFlag"
autoresize
@showExtendAction="showExtendAction"
@hiddenExtendActionColumn="hiddenExtendActionColumn"
@returnTableColumn="returnTableColumn"
@update:selectedRowKeys="updateSelectedRowKeys"
@search="handleCancelExport"
@reset="handleCancelExport"
:class="showCheckFlag? 'is-check-flag-show': ''"
>
<ElQueryTable ref="tableRef" :searchItems="searchItems" :tableConfig="tableConfig" :isExtendAction="false"
:selectedRowKeys.sync="selectedRowKeys" :isRowCheck="showColumnBtn" :showCheckFlag="showCheckFlag" autoresize
@showExtendAction="showExtendAction" @hiddenExtendActionColumn="hiddenExtendActionColumn"
@returnTableColumn="returnTableColumn" @update:selectedRowKeys="updateSelectedRowKeys"
@search="handleCancelExport" @reset="handleCancelExport" :class="showCheckFlag ? 'is-check-flag-show' : ''">
<!-- keyword -->
<template #query-keyword="{ queryParams }">
<div style="width:1200px;">
<el-input
v-model="queryParams.keyword"
type="search"
clearable
placeholder="媒体位置/乙方姓名/项目编号/项目名称/合同编号"
style="width: 547px;"
@change="handleSearch"
@keydown.enter.prevent
>
<el-input v-model="queryParams.keyword" type="search" clearable placeholder="媒体位置/乙方姓名/项目编号/项目名称/合同编号"
style="width: 547px;" @change="handleSearch" @keydown.enter.prevent>
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
</div>
@ -36,49 +17,44 @@
<!-- 客户名称 -->
<template #query-clientId="{ queryParams }">
<el-select v-model="queryParams.clientId" style="width: 200px;" placeholder="请选择" :clearable="false" @change="handleSearch">
<el-option
v-for="item in clientList"
:key="item.id"
:label="item.clientName"
:value="item.id">
<el-select v-model="queryParams.clientId" style="width: 200px;" placeholder="请选择" :clearable="false"
@change="handleSearch">
<el-option v-for="item in clientList" :key="item.id" :label="item.clientName" :value="item.id">
</el-option>
<template #prefix>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.clientId" @click="() => $refs.tableRef.queryParams.clientId = undefined"></span>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.clientId"
@click="() => $refs.tableRef.queryParams.clientId = undefined"></span>
</template>
</el-select>
</template>
<!-- 媒介部门 -->
<template #query-mediaDeptId="{ queryParams }">
<el-select v-model="queryParams.mediaDeptId" style="width: 200px;" placeholder="请选择" clearable @change="handleSearch">
<el-option
v-for="item in mediaDeptList"
:key="item.id"
:label="item.mediaDeptName"
:value="item.id">
<el-select v-model="queryParams.mediaDeptId" style="width: 200px;" placeholder="请选择" clearable
@change="handleSearch">
<el-option v-for="item in mediaDeptList" :key="item.id" :label="item.mediaDeptName" :value="item.id">
</el-option>
<template #prefix>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.mediaDeptId" @click="() => $refs.tableRef.queryParams.mediaDeptId = undefined"></span>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.mediaDeptId"
@click="() => $refs.tableRef.queryParams.mediaDeptId = undefined"></span>
</template>
</el-select>
</template>
<!-- 媒体类型 -->
<template #query-mediaId="{ queryParams }">
<el-select v-model="queryParams.mediaId" style="width: 200px;" placeholder="请选择" clearable @change="handleSearch">
<el-option
v-for="item in mediaTypeList"
:key="item.id"
:label="item.mediaType"
:value="item.id">
<el-select v-model="queryParams.mediaId" style="width: 200px;" placeholder="请选择" clearable
@change="handleSearch">
<el-option v-for="item in mediaTypeList" :key="item.id" :label="item.mediaType" :value="item.id">
</el-option>
<template #prefix>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.mediaId" @click="() => $refs.tableRef.queryParams.mediaId = undefined"></span>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.mediaId"
@click="() => $refs.tableRef.queryParams.mediaId = undefined"></span>
</template>
</el-select>
</template>
<!-- 城市 -->
<template #query-cityId="{ queryParams }">
<el-custom-cascader v-model="queryParams.cityIds" :cascaderStyle="{ width: '200px' }" :dataSource="cityList" @click="() => $refs.tableRef.queryParams.cityIds = undefined" />
<el-custom-cascader v-model="queryParams.cityIds" :cascaderStyle="{ width: '200px' }" :dataSource="cityList"
@click="() => $refs.tableRef.queryParams.cityIds = undefined" />
</template>
<!-- 时间段 -->
<template #query-timesRange="{ queryParams }">
@ -86,15 +62,13 @@
</template>
<!-- 甲方 乙方 -->
<template #query-firstId="{ queryParams }">
<el-select v-model="queryParams.firstId" style="width: 200px;" placeholder="请选择" clearable @change="handleSearch">
<el-option
v-for="item in firstList"
:key="item.id"
:label="item.firstName"
:value="item.id">
<el-select v-model="queryParams.firstId" style="width: 200px;" placeholder="请选择" clearable
@change="handleSearch">
<el-option v-for="item in firstList" :key="item.id" :label="item.firstName" :value="item.id">
</el-option>
<template #prefix>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.firstId" @click="() => $refs.tableRef.queryParams.firstId = undefined"></span>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.firstId"
@click="() => $refs.tableRef.queryParams.firstId = undefined"></span>
</template>
</el-select>
</template>
@ -103,15 +77,13 @@
</template> -->
<!-- 是否逾期 -->
<template #query-isOverdue="{ queryParams }">
<el-select v-model="queryParams.isOverdue" placeholder="请选择" style="width: 200px;" clearable @change="handleSearch">
<el-option
v-for="item in isOverdueList"
:key="item.id"
:label="item.label"
:value="item.id">
<el-select v-model="queryParams.isOverdue" placeholder="请选择" style="width: 200px;" clearable
@change="handleSearch">
<el-option v-for="item in isOverdueList" :key="item.id" :label="item.label" :value="item.id">
</el-option>
<template #prefix>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.isOverdue" @click="() => $refs.tableRef.queryParams.isOverdue = undefined"></span>
<span style="position: absolute;left: 150px;color: #3B588A;cursor: pointer;" v-if="queryParams.isOverdue"
@click="() => $refs.tableRef.queryParams.isOverdue = undefined"></span>
</template>
</el-select>
</template>
@ -135,8 +107,14 @@
</el-col> -->
<el-col :span="1.5">
<div class="flexRowCenter">
<el-upload class="flexCenterCenter pubBtn" :action="importUrl" :headers="importHeaders"
:on-success="handleUploadSuccess" :show-file-list="false" :file-list="fileList">
<el-button size="small" style="font-size: 16px" type="primary">导入</el-button>
</el-upload>
<div class="flexCenterCenter pubBtn" style="width:120px;" @click="downloadTemplate">下载导入模板</div>
<div class="flexCenterCenter pubBtn" @click="handleExport" v-if="!showColumnBtn">导出</div>
<div class="flexCenterCenter pubBtn" style="margin-right: 10px;" @click="handleCancelExport" v-if="showColumnBtn">取消</div>
<div class="flexCenterCenter pubBtn" style="margin-right: 10px;" @click="handleCancelExport"
v-if="showColumnBtn">取消</div>
<div class="flexCenterCenter pubBtn" @click="handleSureExport" v-if="showColumnBtn">确认导出</div>
<div class="flexCenterCenter pubBtn" @click="handleShowDownList">下载记录</div>
</div>
@ -189,21 +167,25 @@
<!-- 需要分行的字段VoList始 -->
<template #table-cityId="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<span :title="item.cityName">{{ item.cityName }}</span>
</div>
</div>
</template>
<template #table-mediaId="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<span :title="item.mediaName">{{ item.mediaName }}</span>
</div>
</div>
</template>
<template #table-mediaPosition="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''" :title="item.mediaPosition">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''"
:title="item.mediaPosition">
{{ item.mediaPosition }}
</div>
</div>
@ -212,7 +194,9 @@
<template #table-accountNumber="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''" :title="item.accountNumber">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''"
:title="item.accountNumber">
{{ item.accountNumber }}
</div>
</div>
@ -224,7 +208,9 @@
<template #table-releaseFrequency="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''" :title="item.releaseFrequency">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''"
:title="item.releaseFrequency">
{{ item.releaseFrequency }}
</div>
</div>
@ -235,35 +221,42 @@
</template>
<template #table-upTime="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''" :title="item.upTime">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''"
:title="item.upTime">
{{ item.upTime }}
</div>
</div>
</template>
<template #table-downTime="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''" :title="item.downTime">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''"
:title="item.downTime">
{{ item.downTime }}
</div>
</div>
</template>
<template #table-period="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="item.period" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="item.period"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
{{ item.period }}
</div>
</div>
</template>
<template #table-printPrice="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="formatNumber(item.printPrice)" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="formatNumber(item.printPrice)"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
{{ formatNumber(item.printPrice) }}
</div>
</div>
</template>
<template #table-discount="{ text, record, index, align }">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="item.discount" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="item.discount"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
{{
item.discount
}}
@ -273,7 +266,8 @@
<template #table-mediaFee="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="formatNumber(item.mediaFee)" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="formatNumber(item.mediaFee)"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
{{ formatNumber(item.mediaFee) }}
</div>
</div>
@ -285,7 +279,9 @@
<template #table-productFee="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<div class="table-column-child">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id" :title="formatNumber(item.productFee)" :style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
<div v-for="item in record.purchaseMediaVoList" :key="index + item.id"
:title="formatNumber(item.productFee)"
:style="align == 'right' ? 'text-align: right;' : align == 'left' ? 'text-align: left;' : align == 'center' ? 'text-align: center;' : ''">
{{ formatNumber(item.productFee) }}
</div>
</div>
@ -303,27 +299,50 @@
<!-- 附件始 -->
<template #table-contractAccess="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt="" :title="record.contractAccessList.map(item => item.realName).join('\n')" v-if="record.contractAccessList && record.contractAccessList.length > 0" @click="handleDown(record)" style="width: 22px; height: 27px;" />
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.contractAccessList.map(item => item.realName).join('\n')"
v-if="record.contractAccessList && record.contractAccessList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
<template #table-detectPicAttr="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.detectPicAttrList.map(item => item.realName).join('\n')"
v-if="record.detectPicAttrList && record.detectPicAttrList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
<template #table-upPrint="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt="" :title="record.upPrintList.map(item => item.realName).join('\n')" v-if="record.upPrintList && record.upPrintList.length > 0" @click="handleDown(record)" style="width: 22px; height: 27px;" />
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.upPrintList.map(item => item.realName).join('\n')"
v-if="record.upPrintList && record.upPrintList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
<template #table-exchangePrint="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt="" :title="record.exchangePrintList.map(item => item.realName).join('\n')" v-if="record.exchangePrintList && record.exchangePrintList.length > 0" @click="handleDown(record)" style="width: 22px; height: 27px;" />
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.exchangePrintList.map(item => item.realName).join('\n')"
v-if="record.exchangePrintList && record.exchangePrintList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
<template #table-nextPrint="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt="" :title="record.nextPrintList.map(item => item.realName).join('\n')" v-if="record.nextPrintList && record.nextPrintList.length > 0" @click="handleDown(record)" style="width: 22px; height: 27px;" />
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.nextPrintList.map(item => item.realName).join('\n')"
v-if="record.nextPrintList && record.nextPrintList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
<template #table-mediaLink="{ text, record, index, align }">
<template v-if="record.serial != '合计'">
<img src="@/assets/images/file-type/file2.png" alt="" :title="record.mediaLinkList.map(item => item.realName).join('\n')" v-if="record.mediaLinkList && record.mediaLinkList.length > 0" @click="handleDown(record)" style="width: 22px; height: 27px;" />
<img src="@/assets/images/file-type/file2.png" alt=""
:title="record.mediaLinkList.map(item => item.realName).join('\n')"
v-if="record.mediaLinkList && record.mediaLinkList.length > 0" @click="handleDown(record)"
style="width: 22px; height: 27px;" />
</template>
</template>
@ -335,7 +354,8 @@
</template>
<template #table-action="{ record }">
<template v-if="!tableConfig.isExtendAction">
<img src="@/assets/images/icon-option.png" alt="" style="width: 18px; height: 18px;" @click="showOrCloseActionExtend(true)">
<img src="@/assets/images/icon-option.png" alt="" style="width: 18px; height: 18px;"
@click="showOrCloseActionExtend(true)">
</template>
<template v-else>
<template v-if="record.serial != '合计'">
@ -358,47 +378,60 @@
</template>
</ElQueryTable>
<!-- 下载附件的弹窗 -->
<el-dialog-copy
class="el-custom-form"
:visible.sync="enclosureObj.visible"
title="附件下载"
@close="closeModal"
>
<el-dialog-copy class="el-custom-form" :visible.sync="enclosureObj.visible" title="附件下载" @close="closeModal">
<template #bo>
<div class="flexEndCenter" style="margin-bottom: 10px;">
<div class="pubBtn flexCenterCenter" @click="downloadAll">全部下载</div>
</div>
<Enclosure :fileList="enclosureObj.formModel.contractAccessList" title="合同附件" v-if="enclosureObj.formModel.contractAccessList && enclosureObj.formModel.contractAccessList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.upPrintList" title="上刊附件" v-if="enclosureObj.formModel.upPrintList && enclosureObj.formModel.upPrintList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.exchangePrintList" title="换刊附件" v-if="enclosureObj.formModel.exchangePrintList && enclosureObj.formModel.exchangePrintList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.nextPrintList" title="下刊附件" v-if="enclosureObj.formModel.nextPrintList && enclosureObj.formModel.nextPrintList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.mediaLinkList" title="媒体链条附件" v-if="enclosureObj.formModel.mediaLinkList && enclosureObj.formModel.mediaLinkList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.contractAccessList" title="合同附件"
v-if="enclosureObj.formModel.contractAccessList && enclosureObj.formModel.contractAccessList.length">
</Enclosure>
<Enclosure :fileList="enclosureObj.formModel.detectPicAttrList" title="检测照片"
v-if="enclosureObj.formModel.detectPicAttrList && enclosureObj.formModel.detectPicAttrList.length">
</Enclosure>
<Enclosure :fileList="enclosureObj.formModel.upPrintList" title="上刊附件"
v-if="enclosureObj.formModel.upPrintList && enclosureObj.formModel.upPrintList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.exchangePrintList" title="换刊附件"
v-if="enclosureObj.formModel.exchangePrintList && enclosureObj.formModel.exchangePrintList.length">
</Enclosure>
<Enclosure :fileList="enclosureObj.formModel.nextPrintList" title="下刊附件"
v-if="enclosureObj.formModel.nextPrintList && enclosureObj.formModel.nextPrintList.length"></Enclosure>
<Enclosure :fileList="enclosureObj.formModel.mediaLinkList" title="媒体链条附件"
v-if="enclosureObj.formModel.mediaLinkList && enclosureObj.formModel.mediaLinkList.length"></Enclosure>
</template>
</el-dialog-copy>
<DownloadList ref="downloadList"></DownloadList>
<ImportList ref="importList" :importData="importData"></ImportList>
</div>
</template>
<script>
import { mapMutations } from 'vuex';
import { cityDataCache } from "@/utils/cityDataCache";
import { getAction, postAction, exportAction, exportAction2 } from '@/api/manage'
import moment from 'moment'
import { tableColumns, searchItems, tableFormItems, tableFormRules } from './config/procurementContract.js'
import ElQueryTable from '@/components/ElTable/ElQueryTable.vue'
import Enclosure from '@/components/ElTable/Enclosure.vue'
import ElCustomForm from '@/components/ElForm/ElCustomForm.vue'
import ElDialogCopy from "@/components/ElForm/ElDialogCopy.vue";
import ElCustomCascader from "@/components/ElForm/ElCustomCascader.vue";
import ElCustomDateRangePicker from '@/components/ElForm/ElCustomDateRangePicker.vue'
import store from '@/store'
import ChildRows from '@/components/ElTable/ChildRows.vue'
import DownloadList from '@/components/ElTable/DownloadList.vue';
import { mapMutations } from 'vuex';
import { cityDataCache } from "@/utils/cityDataCache";
import { getAction, postAction, exportAction, exportAction2 } from '@/api/manage'
import moment from 'moment'
import { tableColumns, searchItems, tableFormItems, tableFormRules } from './config/procurementContract.js'
import ElQueryTable from '@/components/ElTable/ElQueryTable.vue'
import Enclosure from '@/components/ElTable/Enclosure.vue'
import ElCustomForm from '@/components/ElForm/ElCustomForm.vue'
import ElDialogCopy from "@/components/ElForm/ElDialogCopy.vue";
import ElCustomCascader from "@/components/ElForm/ElCustomCascader.vue";
import ElCustomDateRangePicker from '@/components/ElForm/ElCustomDateRangePicker.vue'
import store from '@/store'
import ChildRows from '@/components/ElTable/ChildRows.vue'
import DownloadList from '@/components/ElTable/DownloadList.vue';
import { getToken } from "@/utils/auth";
import ImportList from "@/components/ElTable/ImportList.vue";
export default {
export default {
name: 'ProcurementContract',
data () {
data() {
return {
importData: [],
importUrl: process.env.VUE_APP_BASE_API + '/system/purchase/importData',
fileList: [],
importHeaders: { Authorization: "Bearer " + getToken() },
searchItems,
selectedRowKeys: [],
showColumnBtn: false,
@ -464,13 +497,14 @@
ElCustomCascader,
ElCustomDateRangePicker,
ChildRows,
DownloadList
DownloadList,
ImportList,
},
async created() {
const rawData = await cityDataCache.getCityData();
this.cityList = Object.freeze(rawData); // 使
},
mounted () {
mounted() {
this.getClientList()
this.getMediaDeptListList()
this.getMediaTypeList()
@ -480,7 +514,7 @@
methods: {
...mapMutations(['addDownloadTask', 'updateDownloadTask']),
// Check
initHideCheck () {
initHideCheck() {
this.showCheckFlag = false
},
//
@ -503,17 +537,43 @@
const res = await getAction(`/contract/first/list?pageNum=1&&pageSize=10000`)
this.firstList = res.rows
},
handleSearch () {
handleSearch() {
this.$refs.tableRef.pageParams.pageNum = 1
this.$refs.tableRef.commitAction('query')
this.updateSelectedRowKeys()
},
//
downloadTemplate() {
// public
const fileUrl = '/template/采购合同导入模板.xlsx';
// <a>
const link = document.createElement('a');
link.href = fileUrl; // URL
link.download = '采购合同导入模板.xlsx'; //
//
link.click();
},
handleUploadSuccess(res, file) {
if (res.code === 500) {
this.importData = res.data
this.$refs.importList.drawerVisible = true
} else {
this.handleSearch()
this.$message.success('导入成功')
}
console.log("123", res)
},
//
handleExport() {
this.showColumnBtn = true
this.showCheckFlag = true
},
updateSelectedRowKeys () {
updateSelectedRowKeys() {
this.selectedRowKeys = this.selectedRowKeys.flat()
this.costSummarizing()
},
@ -538,7 +598,7 @@
const contractMoneySumEle = this.getSummaryElement('合同总金额', contractMoneySum, '元', '¥')
//
if(this.showCheckFlag) {
if (this.showCheckFlag) {
sums[1] = '合计'
sums[5] = totalEle
sums[10] = mediaNumEle
@ -580,7 +640,7 @@
<div class="media-summary-container">
<div class="media-summary-title">{title}</div>
<div class="media-summary-value" title={count}>
{ prefix? <span class="media-summary-prefix">{prefix}</span>: '' }
{prefix ? <span class="media-summary-prefix">{prefix}</span> : ''}
<span>{count}</span>
{unit}
</div>
@ -589,7 +649,7 @@
);
},
async costSummarizing () {
async costSummarizing() {
this.selectedRowKeys = this.selectedRowKeys.filter(element => element !== undefined);
const res2 = await postAction(`/system/purchase/costSummarizing`, {
...this.$refs.tableRef.queryParams,
@ -600,17 +660,18 @@
cityIds: undefined,
cityName: undefined,
timesRange: undefined,
ids: this.selectedRowKeys.length ? this.selectedRowKeys : undefined })
ids: this.selectedRowKeys.length ? this.selectedRowKeys : undefined
})
this.summarys = res2
},
//
handleAdd () {
handleAdd() {
this.handleCancelExport()
this.$router.push({ path: `/contract/procurement/AddProcurementContract` })
},
//
handleUpdate (record) {
handleUpdate(record) {
console.log('%c [ record ]-475', 'font-size:13px; background:pink; color:#bf2c9f;', record)
this.$router.push({ path: `/contract/procurement/EditProcurementContract`, query: { id: record.id } })
},
@ -624,9 +685,9 @@
this.enclosureObj.formModel = record
},
//
async downloadAll () {
async downloadAll() {
//
var list1 = ['contractAccessList', 'upPrintList', 'exchangePrintList', 'nextPrintList', 'mediaLinkList']
var list1 = ['contractAccessList', 'detectPicAttrList', 'upPrintList', 'exchangePrintList', 'nextPrintList', 'mediaLinkList']
for (const listStr of list1) {
if (JSON.stringify(this.enclosureObj.formModel) != '{}' && this.enclosureObj.formModel[listStr] && this.enclosureObj.formModel[listStr].length > 0) {
for (const item of this.enclosureObj.formModel[listStr]) {
@ -637,7 +698,7 @@
name: `文件名称:${item.realName}`,
status: 'pending'
});
this.downTaskList.push({identifier: item.identifier, name: item.name, realName: item.realName, taskId: taskId, a: listStr})
this.downTaskList.push({ identifier: item.identifier, name: item.name, realName: item.realName, taskId: taskId, a: listStr })
//
if (this.downTaskList && this.downTaskList.length) {
this.downTaskList = this.downTaskList.sort((x, y) => {
@ -665,17 +726,17 @@
}
}
},
handleShowDownList () {
handleShowDownList() {
this.$refs.downloadList.drawerVisible = true
},
handleDelete (id) {},
handleCommand () {},
handleDelete(id) { },
handleCommand() { },
//
handleView (record) {
handleView(record) {
this.$router.push({ path: `/contract/procurement/DetailProcurementContract`, query: { id: record.id } })
},
//
handleNullify (record) {
handleNullify(record) {
this.$confirm('确定作废吗?', '提示', { type: 'warning' }).then(async (result) => {
const res = await getAction(`/system/purchase/updatePurchaseAblish/${record.id}`)
if (res.code == 200) {
@ -685,7 +746,7 @@
});
},
//
handleRecovery (record) {
handleRecovery(record) {
this.$confirm('确定恢复吗?', '提示', { type: 'warning' }).then(async (result) => {
const res = await getAction(`/system/purchase/updatePurchaseRenew/${record.id}`)
if (res.code == 200) {
@ -699,7 +760,7 @@
this.tableConfig.columns = columns
},
//
async handleSureExport () {
async handleSureExport() {
try {
var columnArray = []
var mediaColumnArray = []
@ -738,7 +799,7 @@
calculateTotalRows() {
this.$refs.tableRef.commitAction('query')
},
ocClickShowExtendSearch (flag) {
ocClickShowExtendSearch(flag) {
this.tableConfig.showExtendSearch = flag
for (const i in this.searchItems) {
if (this.searchItems[i].isExtend) {
@ -750,16 +811,16 @@
this.$refs.tableRef.setMaxHeight()
})
},
showOrCloseActionExtend (flag) {
showOrCloseActionExtend(flag) {
this.tableConfig.isExtendAction = flag
},
showExtendAction() {
this.showOrCloseActionExtend(true)
},
hiddenExtendActionColumn () {
hiddenExtendActionColumn() {
this.tableConfig.isExtendAction = false
},
toggleExpandAll () {
toggleExpandAll() {
},
closeModal() {
@ -768,10 +829,10 @@
},
activated() {
const flag = this.$route.meta.flag
if(flag == 'edit') {
if (flag == 'edit') {
this.$refs.tableRef.commitAction('query')
}
if(flag == 'add') {
if (flag == 'add') {
this.$refs.tableRef.commitAction('gofirst')
}
},
@ -782,34 +843,41 @@
},
beforeRouteLeave(to, from, next) {
if(!['AddProcurementContract', 'DetailProcurementContract', 'EditProcurementContract'].includes(to.name)) {
if (!['AddProcurementContract', 'DetailProcurementContract', 'EditProcurementContract'].includes(to.name)) {
store.dispatch('tagsView/delCachedView', this.$route)
}
from.meta.flag = undefined
next()
}
}
}
</script>
<style lang="scss" scoped>
.table-column-child {
.table-column-child {
margin: -16px -16px;
div {
padding: 0 16px;
height: 45px;
line-height: 45px;
text-align: center;
border-bottom: 1px solid #e8e8e8;
white-space: nowrap; /* 确保文本在一行内显示 */
overflow: hidden; /* 超出容器部分隐藏 */
text-overflow: ellipsis; /* 超出部分显示为... */
white-space: nowrap;
/* 确保文本在一行内显示 */
overflow: hidden;
/* 超出容器部分隐藏 */
text-overflow: ellipsis;
/* 超出部分显示为... */
&:last-child {
border-bottom: none;
}
}
}
.table-column-child1 {
}
.table-column-child1 {
margin: -16px -16px;
div {
padding: 0 16px;
// height: 45px;
@ -818,13 +886,14 @@
white-space: normal;
word-break: break-word;
border-bottom: 1px solid #e8e8e8;
&:last-child {
border-bottom: none;
}
}
}
}
.el-query-table {
.el-query-table {
::v-deep {
.media-summary {
display: flex;
@ -866,7 +935,7 @@
display: flex;
flex-direction: column;
> div {
>div {
flex: 1;
&:first-child {
@ -910,5 +979,5 @@
}
}
}
}
}
</style>

View File

@ -579,7 +579,7 @@ export default {
data() {
return {
importData: [],
importUrl: process.env.VUE_APP_BASE_API + '/contract/sale/import',
importUrl: process.env.VUE_APP_BASE_API + '/contract/sale/importData',
fileList: [],
importHeaders: { Authorization: "Bearer " + getToken() },
searchItems,