This commit is contained in:
zmj 2024-03-21 16:41:28 +08:00
parent bb46964ee8
commit 7f50fc08c3
35 changed files with 515 additions and 1047 deletions

View File

@ -16,7 +16,7 @@
<el-table :data="pager.lists" @cell-click="handleCurrentChange">
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="组织" prop="custom_id" show-overflow-tooltip />
<el-table-column label="组织" prop="org_name" show-overflow-tooltip />
<el-table-column label="姓名" prop="name" show-overflow-tooltip />
<el-table-column label="职位" prop="position" show-overflow-tooltip />
<el-table-column label="手机" prop="phone" show-overflow-tooltip />
@ -34,7 +34,7 @@
</el-card>
</div>
</template>
<script lang="ts" setup>
import { usePaging } from "@/hooks/usePaging"
import { useDictData } from "@/hooks/useDictOptions"

View File

@ -25,18 +25,6 @@
<el-table-column label="重要程度" prop="importance_text" show-overflow-tooltip />
<el-table-column label="记录时间" prop="recording_time" show-overflow-tooltip />
<el-table-column label="需求内容" prop="demand_content" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
</el-table>
</div>
@ -46,14 +34,12 @@
</el-card>
</div>
</template>
<script lang="ts" setup>
import { usePaging } from "@/hooks/usePaging"
import { useDictData } from "@/hooks/useDictOptions"
import { apiCustomerDemandLists } from '@/api/customer_demand'
import { defineEmits } from "vue"
import { timeFormat } from '@/utils/util'
const props = defineProps({
productid: {
type: String

View File

@ -32,7 +32,7 @@
</div>
</template>
<script lang="ts" setup>
import { defineProps } from "vue"
import { defineProps, onMounted, ref } from "vue"
import { useDictData } from '@/hooks/useDictOptions'
/** config
@ -55,14 +55,10 @@ const props = defineProps({
config: {
type: Object,
require: true
}
},
dictData: Object
})
//
const dictValue = props.config.tableConfig.map(item => Array.isArray(item.select) ? null : item.select).filter(item => item).join(',')
const { dictData } = useDictData(dictValue)
// table
const list = props.config.tableConfig.map(item => item.value)
const getInitialData = () => {
@ -87,4 +83,12 @@ const handleDelete = async (row: any) => {
};
//
// const dictValue = props.config.tableConfig.map(item => Array.isArray(item.select) ? null : item.select).filter(item => item).join(',')
// if (!props.dictData) {
// props.dictData = useDictData(dictValue)
// }
</script>

View File

@ -0,0 +1,32 @@
<template>
<el-tooltip :content="content" v-if="settingStore.showToolTip">
<el-icon :class="class">
<InfoFilled />
</el-icon>
</el-tooltip>
</template>
<script setup lang="ts">
import { defineProps } from 'vue';
import useSettingStore from '@/stores/modules/setting'
const settingStore = useSettingStore()
defineProps({
class: {
type: String,
default: "ml-2 mt-4"
},
content: {
type: String
}
})
</script>

View File

@ -1,6 +1,7 @@
const defaultSetting = {
showCrumb: true, // 是否显示面包屑
showLogo: true, // 是否显示logo
showToolTip:false,//是否开启文字提示
isUniqueOpened: true, //只展开一个一级菜单
sideWidth: 250, //侧边栏宽度
sideTheme: 'dark', //侧边栏主题

View File

@ -1,27 +1,13 @@
<template>
<div class="setting-drawer">
<el-drawer
v-model="showSetting"
append-to-body
direction="rtl"
size="250px"
title="主题设置"
>
<el-drawer v-model="showSetting" append-to-body direction="rtl" size="250px" title="主题设置">
<div class="setting-item mb-5">
<span class="text-tx-secondary">风格设置</span>
<div class="flex mt-4 cursor-pointer">
<div
class="mr-4 flex relative text-primary"
v-for="item in sideThemeList"
:key="item.type"
@click="sideTheme = item.type"
>
<div class="mr-4 flex relative text-primary" v-for="item in sideThemeList" :key="item.type"
@click="sideTheme = item.type">
<img :src="item.image" width="52" height="36" />
<icon
v-if="sideTheme == item.type"
class="icon-select"
name="el-icon-Select"
/>
<icon v-if="sideTheme == item.type" class="icon-select" name="el-icon-Select" />
</div>
</div>
</div>
@ -40,21 +26,13 @@
<div class="setting-item mb-5 flex justify-between items-center">
<span class="text-tx-secondary">开启多页签栏</span>
<div>
<el-switch
v-model="openMultipleTabs"
:active-value="true"
:inactive-value="false"
/>
<el-switch v-model="openMultipleTabs" :active-value="true" :inactive-value="false" />
</div>
</div>
<div class="setting-item mb-5 flex justify-between items-center">
<span class="text-tx-secondary">只展开一个一级菜单</span>
<div>
<el-switch
v-model="isUniqueOpened"
:active-value="true"
:inactive-value="false"
/>
<el-switch v-model="isUniqueOpened" :active-value="true" :inactive-value="false" />
</div>
</div>
<div class="setting-item mb-5 flex justify-between items-center">
@ -75,6 +53,12 @@
<el-switch v-model="showCrumb" :active-value="true" :inactive-value="false" />
</div>
</div>
<div class="setting-item mb-5 flex justify-between items-center">
<div class="text-tx-secondary flex-none mr-3">显示Tooltip</div>
<div>
<el-switch v-model="showToolTip" :active-value="true" :inactive-value="false" />
</div>
</div>
<div class="setting-item mb-5 flex justify-between items-center">
<el-button @click="resetTheme">重置主题</el-button>
</div>
@ -196,6 +180,21 @@ const showCrumb = computed({
}
})
const showToolTip = computed({
get() {
return settingStore.showToolTip
},
set(value) {
settingStore.setSetting({
key: 'showToolTip',
value
})
}
})
const isDark = useDark()
const themeChange = () => {
settingStore.setTheme(isDark.value)

View File

@ -2,195 +2,228 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules" inline>
<el-form ref="formRef" :model="formData" label-width="150px" :rules="formRules">
<el-card>
<template #header>
标书信息
</template>
<el-row>
<el-col :span="8">
<el-form-item label="标书编号" prop="buy_bidding_document_id" @click="showDialog = true"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="bid_document_no" clearable readonly placeholder="请选择标书编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买人员" prop="buy_bidding_document_id">
<el-input v-model="buyer" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="buy_bidding_document_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.custom_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="buy_bidding_document_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-row>
<el-col :span="8">
<el-form-item label="标书编号" prop="buy_bidding_document_id" @click="showDialog = true"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="bid_document_no" clearable readonly placeholder="请选择标书编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买人员" prop="buy_bidding_document_id">
<el-input v-model="buyer" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="buy_bidding_document_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.custom_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="buy_bidding_document_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.project_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="招标公司名称" prop="buy_bidding_document_id">
<el-input v-model="invite_tenders_company_name" clearable disabled
placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投标公司名称" prop="buy_bidding_document_id">
<el-input v-model="bid_company_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买标书金额" prop="buy_bidding_document_id">
<el-input v-model="amount" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8">
<el-form-item label="招标公司名称" prop="buy_bidding_document_id">
<el-input v-model="invite_tenders_company_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投标公司名称" prop="buy_bidding_document_id">
<el-input v-model="bid_company_name" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买标书金额" prop="buy_bidding_document_id">
<el-input v-model="amount" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="招标项目资金来源" prop="buy_bidding_document_id">
<el-input v-model="bidding_project_fund_source" clearable disabled
placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投标时间" prop="buy_bidding_document_id">
<el-input v-model="bid_date" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买标书时间" prop="buy_bidding_document_id">
<el-input v-model="buy_date" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="招标方式" prop="buy_bidding_document_id">
<el-input v-model="invite_tenders_type" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-form-item label="招标项目资金来源" prop="buy_bidding_document_id">
<el-input v-model="bidding_project_fund_source" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投标时间" prop="buy_bidding_document_id">
<el-input v-model="bid_date" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="购买标书时间" prop="buy_bidding_document_id">
<el-input v-model="buy_date" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="招标方式" prop="buy_bidding_document_id">
<el-input v-model="invite_tenders_type" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否需要保证金" prop="is_margin">
<el-input v-model="formData.is_margin" clearable disabled placeholder="系统自动填写" />
<el-col :span="8">
<el-form-item label="是否需要保证金" prop="is_margin">
<el-input v-model="formData.is_margin" clearable disabled placeholder="系统自动填写" />
</el-form-item>
</el-col>
</el-row>
</el-form-item>
</el-col>
</el-row>
<div class="tit">技术审查</div>
<el-row>
</el-card>
<el-col :span="8">
<el-form-item label="技术协议偏差" prop="technical_protocol_deviation">
<el-input v-model="formData.technical_protocol_deviation" clearable
placeholder="请输入技术协议偏差" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="协议偏差处理方案" prop="protocol_deviation_handling_plan">
<el-input v-model="formData.protocol_deviation_handling_plan" clearable
placeholder="请输入协议偏差处理方案" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="技术审查附件" prop="technical_review_annex">
<uploadAnnex :formData="formData" value="technical_review_annex"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
<div class="tit">商务审查</div>
<el-row>
<el-col :span="8">
<el-form-item label="总金额" prop="business_review_total_amount">
<el-input v-model="formData.business_review_total_amount" clearable placeholder="系统自动计算"
disabled />
</el-form-item></el-col> <el-col :span="8">
<el-form-item label="税率" prop="tax_rate">
<el-select class="flex-1" v-model="formData.tax_rate" clearable placeholder="请选择税率">
<el-option v-for="(item, index) in dictData.tax_rate" :key="index" :label="item.name"
:value="parseInt(item.value)" />
</el-select>
</el-form-item></el-col> <el-col :span="8">
<el-form-item label="付款方式" prop="pay_type">
<el-select class="flex-1" v-model="formData.pay_type" clearable placeholder="请选择付款方式">
<el-option v-for="(item, index) in dictData.pay_type" :key="index" :label="item.name"
:value="parseInt(item.value)" />
</el-select>
</el-form-item></el-col> <el-col :span="8">
<el-form-item label="付款比例" prop="pay_rate">
<el-input v-model="formData.pay_rate" clearable placeholder="请输入付款比例" />
</el-form-item></el-col> <el-col :span="8">
<el-form-item label="商务合同偏差" prop="business_contract_deviation">
<el-input v-model="formData.business_contract_deviation" clearable
placeholder="请输入商务合同偏差" />
</el-form-item></el-col> <el-col :span="8">
<el-form-item label="偏差处理方案" prop="business_contract_deviation_handling_plan">
<el-input v-model="formData.business_contract_deviation_handling_plan" clearable
placeholder="请输入偏差处理方案" />
</el-form-item></el-col> <el-col :span="24">
<el-form-item label="商务审查附件" prop="business_contract_deviation_annex">
<uploadAnnex :formData="formData" value="business_contract_deviation_annex"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
<div class="tit">审查明细</div>
<div style="margin-bottom: 30px;">
<el-table :data="tableData">
<el-table-column label="序号">
<template #default="{ row }">
<el-card>
<template #header>技术审查</template>
<el-row>
<el-col :span="8">
<el-form-item label="技术协议偏差" prop="technical_protocol_deviation">
<el-input v-model="formData.technical_protocol_deviation" clearable
placeholder="请输入技术协议偏差" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="协议偏差处理方案" prop="protocol_deviation_handling_plan">
<el-input v-model="formData.protocol_deviation_handling_plan" clearable
placeholder="请输入协议偏差处理方案" />
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="技术审查附件" prop="technical_review_annex">
<uploadAnnex :formData="formData" value="technical_review_annex"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card>
<template #header>
商务审查
</template>
<el-row>
<el-col :span="8">
<el-form-item label="总金额" prop="business_review_total_amount">
<el-input v-model="formData.business_review_total_amount" clearable placeholder="系统自动计算"
disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="税率" prop="tax_rate">
<el-select class="flex-1 " v-model="formData.tax_rate" clearable placeholder="请选择税率">
<el-option v-for="(item, index) in dictData.tax_rate" :key="index"
:label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="付款方式" prop="pay_type">
<el-select class="flex-1" v-model="formData.pay_type" clearable placeholder="请选择付款方式">
<el-option v-for="(item, index) in dictData.pay_type" :key="index"
:label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="付款比例" prop="pay_rate">
<el-input v-model="formData.pay_rate" clearable placeholder="请输入付款比例" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="商务合同偏差" prop="business_contract_deviation">
<el-input v-model="formData.business_contract_deviation" clearable
placeholder="请输入商务合同偏差" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="偏差处理方案" prop="business_contract_deviation_handling_plan">
<el-input v-model="formData.business_contract_deviation_handling_plan" clearable
placeholder="请输入偏差处理方案" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="商务审查附件" prop="business_contract_deviation_annex">
<uploadAnnex :formData="formData" value="business_contract_deviation_annex">
</uploadAnnex>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-button @click="handleAdd(row)" size="small">+</el-button>
<el-button @click="handleDelete(row)" size="small">-</el-button>
</template>
</el-table-column>
<el-table-column label="产品名称" prop="name">
<template #default="{ row, $index }">
<el-input v-model="row.product_name" readonly @click="productDiag(row, $index)"
placeholder="请选择产品">
<template #suffix>
<icon name="el-icon-Search" />
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="型号规格" prop="specs">
<template #default="{ row }">
<el-input v-model="row.product_specs" />
</template></el-table-column>
<el-table-column label="单位" prop="unit">
<template #default="{ row }">
<el-input v-model="row.product_unit" /> </template>
</el-table-column>
<el-table-column label="数量" prop="num">
<template #default="{ row, $index }">
<el-input v-model="row.num" type="number" @change="calcTotalAmount"
@input="jiprice1(row, $index)" /> </template>
</el-table-column>
<el-card>
<template #header>
审查明细
</template>
<div style="margin-bottom: 30px;">
<el-table :data="tableData">
<el-table-column label="序号">
<template #default="{ row }">
<el-table-column label="成本单价" prop="cost_price">
<template #default="{ row, $index }">
<el-input v-model="row.cost_price" @change="calcTotalAmount" type="number"
@input="jiprice2(row, $index)" />
</template>
</el-table-column>
<el-button @click="handleAdd(row)" size="small">+</el-button>
<el-button @click="handleDelete(row)" size="small">-</el-button>
</template>
</el-table-column>
<el-table-column label="产品名称" prop="name">
<template #default="{ row, $index }">
<el-input v-model="row.product_name" readonly @click="productDiag(row, $index)"
placeholder="请选择产品">
<template #suffix>
<icon name="el-icon-Search" />
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="型号规格" prop="specs">
<template #default="{ row }">
<el-input v-model="row.product_specs" />
</template></el-table-column>
<el-table-column label="单位" prop="unit">
<template #default="{ row }">
<el-input v-model="row.product_unit" /> </template>
</el-table-column>
<el-table-column label="数量" prop="num">
<template #default="{ row, $index }">
<el-input v-model="row.num" type="number" @change="calcTotalAmount"
@input="jiprice1(row, $index)" /> </template>
</el-table-column>
<el-table-column label="成本单价" prop="cost_price">
<template #default="{ row, $index }">
<el-input v-model="row.cost_price" @change="calcTotalAmount" type="number"
@input="jiprice2(row, $index)" />
</template>
</el-table-column>
<el-table-column label="成本金额" prop="cost_amount">
<template #default="{ row }">
<el-input v-model="row.cost_amount" type="number" disabled placeholder="系统自动计算" />
</template>
</el-table-column>
<el-table-column label="点数" prop="points">
<template #default="{ row }">
<el-input v-model="row.points" type="number" @change="calcTotalAmount" />
</template>
</el-table-column>
<el-table-column label="报价单价" prop="sale_price">
<template #default="{ row, $index }">
<el-input v-model="row.sale_price" type="number" @change="calcTotalAmount"
@input="jiprice3(row, $index)" />
</template>
</el-table-column>
<el-table-column label="报价金额" prop="total_amount">
<template #default="{ row }">
<el-input v-model="row.sale_amount" type="number" disabled placeholder="系统自动计算" />
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<el-table-column label="成本金额" prop="cost_amount">
<template #default="{ row }">
<el-input v-model="row.cost_amount" type="number" disabled placeholder="系统自动计算" />
</template>
</el-table-column>
<el-table-column label="点数" prop="points">
<template #default="{ row }">
<el-input v-model="row.points" type="number" @change="calcTotalAmount" /> </template>
</el-table-column>
<el-table-column label="报价单价" prop="sale_price">
<template #default="{ row, $index }">
<el-input v-model="row.sale_price" type="number" @change="calcTotalAmount"
@input="jiprice3(row, $index)" />
</template>
</el-table-column>
<el-table-column label="报价金额" prop="total_amount">
<template #default="{ row }">
<el-input v-model="row.sale_amount" type="number" disabled placeholder="系统自动计算" />
</template>
</el-table-column>
</el-table>
</div>
</el-form>
<el-dialog v-model="showDialog" title="选择标书" width="70%">
<biddocumentTable @customEvent="customEvent" :project_id="project?.id || ''"></biddocumentTable>

View File

@ -37,7 +37,7 @@
<el-descriptions-item label="添加人" label-align="left" align="left" label-class-name="my-label">{{
formData.add_user_name }}</el-descriptions-item>
<el-descriptions-item label="创建日期" label-align="left" align="left" label-class-name="my-label">{{
formData.create_time }}</el-descriptions-item>
formData.create_time }}</el-descriptions-item>
<el-descriptions-item label="更新人" label-align="left" align="left" label-class-name="my-label">{{
formData.update_user_name }}</el-descriptions-item>
<el-descriptions-item label="更新日期" label-align="left" align="left" label-class-name="my-label">{{

View File

@ -1,13 +1,15 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
<el-row>
<el-col :span="8">
<el-form-item label="标书审查" prop="bid_document_examination_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]" @click="showDialog = true">
<el-input v-model="formData.code" readonly clearable placeholder="请选择标书审查" />
<el-input v-model="formData.bid_document_examination_code" readonly clearable
placeholder="请选择标书审查" />
</el-form-item>
</el-col>
@ -84,8 +86,6 @@ import Popup from '@/components/popup/index.vue'
import biddocumentTable from "@/components/document_examination/index.vue"
import prodctTable from '@/components/product/index.vue'
import { apiBidDocumentExaminationDetailAdd, apiBidDocumentExaminationDetailEdit, apiBidDocumentExaminationDetailDetail } from '@/api/bid_document_examination_detail'
import { timeFormat } from '@/utils/util'
import projectTable from "@/components/project/index.vue"
import type { PropType } from 'vue'
defineProps({
dictData: {
@ -114,6 +114,7 @@ const popupTitle = computed(() => {
const formData = reactive({
id: '',
bid_document_examination_id: '',
bid_document_examination_code: "",
product_id: '',
num: '',
points: '',
@ -138,7 +139,7 @@ const customEvent = (e: any) => {
project_name.value = e.project_name
project_code.value = e.project_code
formData.bid_document_examination_id = e.id
formData.code = e.code
formData.bid_document_examination_code = e.code
showDialog.value = false;

View File

@ -121,10 +121,11 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
let res = await apiBidDocumentExaminationDetailDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(data)
editRef.value?.setFormData(res)
}
//
@ -144,4 +145,3 @@ const handledetail = async (data: any) => {
}
getLists()
</script>

View File

@ -1,7 +1,8 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
@ -10,25 +11,29 @@
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="分部工程" prop="division_engineering" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="分部工程" prop="division_engineering"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.division_engineering" clearable placeholder="请输入分部工程" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="子分部工程" prop="sub_division_engineering" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="子分部工程" prop="sub_division_engineering"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.sub_division_engineering" clearable placeholder="请输入子分部工程" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="分项工程" prop="subentry_engineering" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="分项工程" prop="subentry_engineering"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.subentry_engineering" clearable placeholder="请输入分项工程" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="分项工程编码" prop="subentry_engineering_code" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-form-item label="分项工程编码" prop="subentry_engineering_code"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.subentry_engineering_code" clearable placeholder="请输入分项工程编码" />
</el-form-item>
</el-col>

View File

@ -42,22 +42,7 @@
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item>
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri"
target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-form>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
@ -85,11 +70,7 @@ let props = defineProps({
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const orglist = reactive([])
const jobs = reactive([])
const project_name
= ref('')
const project_code
@ -99,29 +80,9 @@ const custom_name
const customer_demand_name = ref('')
const formDataannex = reactive([])
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
import feedback from '@/utils/feedback'
const userStore = useUserStore();
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
@ -191,15 +152,7 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
project_name.value = data.project_name
custom_name.value = data.custom_name
project_code.value = data.project_code
@ -225,9 +178,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = formDataannex.map((item) => item.uri)
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'

View File

@ -33,6 +33,7 @@
<el-col :span="8">
<el-form-item label="合同类型" prop="contract_type"
:rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-select class="flex-1" v-model="formData.contract_type" clearable placeholder="请选择合同类型">
<el-option v-for="(item, index) in dictData.contract_type" :key="index"
:label="item.name" :value="parseInt(item.value)" />
@ -100,7 +101,6 @@
<el-input v-model="business_director_name" readonly clearable placeholder="请输入业务负责人" />
</el-form-item></el-col>
<el-col :span="24">
<el-form-item label="合同状态" prop="contract_status"
:rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-radio-group v-model="formData.contract_status" placeholder="请选择合同状态">
@ -119,13 +119,14 @@
value-format="YYYY-MM-DD" placeholder="选择合同有效期">
</el-date-picker>
</el-form-item></el-col><el-col :span="8">
<el-form-item label="签约日期" prop="contract_date"
:rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-date-picker class="flex-1 !flex" v-model="formData.contract_date" clearable type="date"
value-format="YYYY-MM-DD" placeholder="选择签约日期">
</el-date-picker>
</el-form-item></el-col><el-col :span="8">
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主要条款" prop="main_content">
<el-input v-model="formData.main_content" clearable placeholder="请输入主要条款" />
@ -134,64 +135,12 @@
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item></el-col><el-col :span="24">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
<div style="margin-bottom: 30px;">回款计划</div>
<div style="margin-bottom: 30px;">
<el-table :data="paymentList">
<el-table-column label="序号">
<template #default="{ row }">
<el-button @click="handleAdd(row)">+</el-button>
<el-button @click="handleDelete(row)">-</el-button>
</template>
</el-table-column>
<el-table-column label="期次" prop="name1">
<formTable :formData="formData.returned_money" :config="tableConfig" :dictData="dictData"></formTable>
<template #default="{ row }">
<el-select v-model="row.period" clearable placeholder="请选择期次">
<el-option v-for="(item, index) in dictData.pay_period " :key="index"
:label="item.name" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="计划回款日期" prop="return_date">
<template #default="{ row }">
<el-date-picker v-model="row.return_date" clearable type="date"
value-format="YYYY-MM-DD" placeholder="选择签订日期">
</el-date-picker>
</template></el-table-column>
<el-table-column label="金额" prop="amount">
<template #default="{ row }"> <el-input v-model="row.amount" />
</template></el-table-column>
<el-table-column label="备注" prop="remark">
<template #default="{ row }">
<el-input v-model="row.remark" />
</template>
</el-table-column>
</el-table>
</div>
</el-form>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
@ -207,7 +156,6 @@
</el-dialog>
</div>
<personnelselector ref="personnel" @confirm="submituser" type="1"></personnelselector>
<!-- <reviewprocess /> -->
</popup>
</div>
@ -220,23 +168,21 @@ import biddocumentTable from "@/components/biddocument/index.vue"
import projectTable from "@/components/project/index.vue"
import personnelselector from '@/components/personnelselector/index.vue'
import { apiContractAdd, apiContractEdit, apiContractDetail } from '@/api/contract'
import { apireturnedLists } from "@/api/remittance.ts"
import { apireturnedLists, apireturnedDelete } from "@/api/remittance.ts"
import { useDictData } from '@/hooks/useDictOptions'
import { toChinesNum } from "@/utils/util";
import feedback from '@/utils/feedback'
let props = defineProps({
project: Object
})
const { dictData } = useDictData('contract_type,contract_pricing_method,contract_status,pay_period')
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const formDataannex = reactive([])
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
import { toChinesNum } from "@/utils/util";
const showDialog = ref(false)
const showDialog1 = ref(false)
const showDialog2 = ref(false)
@ -247,12 +193,7 @@ const bidding_code = ref('')
const amount_daxie = ref('')
const project_id = ref('')
const business_director_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const paymentList = reactive([{}])
const personnel = ref<any>()
import feedback from '@/utils/feedback'
const userStore = useUserStore();
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
@ -272,36 +213,10 @@ const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined)
}
};
const handleAdd = (row: any) => {
// row
const index = paymentList.indexOf(row);
paymentList.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
// row
const index = paymentList.indexOf(row);
paymentList.splice(index, 1);
};
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
const { dictData } = useDictData('contract_type,contract_pricing_method,contract_status,pay_period')
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
@ -336,6 +251,40 @@ const formData = reactive({
annex: [],
})
const tableConfig = reactive(
{
title: "回款计划",
tableConfig: [
{
label: "期次",
value: 'period',
select: "pay_period"
},
{
label: "计划回款日期",
value: 'return_date',
date: true
},
{
label: "金额",
value: 'amount',
},
{
label: "备注",
value: 'remark',
},
],
deleteApi: apireturnedDelete,
dictData
}
)
//
const userclick = () => {
@ -415,18 +364,6 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
@ -442,11 +379,7 @@ const setFormData = async (data: Record<any, any>) => {
bidding_code.value = data.bid_document_no
business_director_name.value = data.business_director_name
let res = await apireturnedLists({ contract_id: data.id })
paymentList.splice(0, 9999)
res.lists.forEach((item: any) => {
paymentList.push(item)
})
formData.returned_money = res.lists
}
@ -460,18 +393,6 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = formDataannex.map((item) => item.uri)
}
if (paymentList.length > 0) {
formData.returned_money = paymentList.map((item) => ({
'id': item.id,
'period': item.period,
'remark': item.remark,
'amount': item.amount,
'return_date': item.return_date,
}))
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'

View File

@ -26,7 +26,7 @@
<el-col :span="8">
<el-form-item label="合同类型" prop="contract_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="contract_type" clearable disabled placeholder="请选择合同类型">
<el-select v-model="contract_type" clearable disabled placeholder="请选择合同类型" class=" flex-1">
<el-option v-for="(item, index) in dictData.contract_type" :key="index"
:label="item.name" :value="parseInt(item.value)" />
</el-select>
@ -95,44 +95,10 @@
<el-input v-model="formData.negotiation_detail" clearable placeholder="请输入具体说明" />
</el-form-item></el-col><el-col :span="24">
<el-form-item label="签证报价表" prop="negotiation_quotation">
<!-- <el-input v-model="formData.negotiation_quotation" clearable placeholder="请输入签证报价表" /> -->
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four1" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex1" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn1(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData" value="negotiation_quotation"></uploadAnnex>
</el-form-item></el-col><el-col :span="24">
<el-form-item label="洽商依据" prop="negotiation_basis">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four2" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex2" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn2(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData" value="negotiation_basis"></uploadAnnex>
</el-form-item></el-col>
</el-row>
@ -154,17 +120,10 @@ import { useDictData } from '@/hooks/useDictOptions'
let props = defineProps({
project: Object
})
const { dictData } = useDictData('negotiation_type,contract_type,contract_pricing_method')
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
const mode = ref('add')
const showDialog = ref(false)
const contract_name = ref('')
@ -176,50 +135,13 @@ const contract_type = ref('')
const profit_rate = ref(0)
const negotiation_no = ref('')
const profit = ref(0)
const formDataannex1 = reactive([])
const formDataannex2 = reactive([])
const contract_pricing_method = ref('')
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑合同洽商' : '新增合同洽商'
})
//
const handleAvatarSuccess_four1 = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex1.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn1 = (index: number) => {
formDataannex1.splice(index, 1)
}
//
const handleAvatarSuccess_four2 = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex2.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn2 = (index: number) => {
formDataannex2.splice(index, 1)
}
//
const formData = reactive({
id: '',
@ -304,28 +226,6 @@ watch(
//
const setFormData = async (data: Record<any, any>) => {
if (data.negotiation_quotation && data.negotiation_quotation.length > 0) {
const arry1 = data.negotiation_quotation.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex1, arry1)
}
if (data.negotiation_basis && data.negotiation_basis.length > 0) {
const arry1 = data.negotiation_basis.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex2, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
@ -353,12 +253,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex1.length > 0) {
formData.negotiation_quotation = formDataannex1.map((item) => item.uri)
}
if (formDataannex2.length > 0) {
formData.negotiation_basis = formDataannex2.map((item) => item.uri)
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'

View File

@ -196,7 +196,7 @@
</div>
</el-tab-pane>
<!-- <el-tab-pane label="订单" name="new_name_5">Task</el-tab-pane> -->
<el-tab-pane label="发票" name="new_name_6">Task</el-tab-pane>
<!-- <el-tab-pane label="发票" name="new_name_6">Task</el-tab-pane> -->
<el-tab-pane label="回款" name="new_name_7">
<div class="tit" style="margin:20px 0">回款计划</div>
<div>

View File

@ -3,34 +3,30 @@
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
<el-row>
<el-form-item label="客户名称" prop="custom_name">
<el-input v-model="formData.custom_name" clearable placeholder="请选择客户"
@click="showDialog = true" />
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="职位" prop="position">
<el-input v-model="formData.position" clearable placeholder="请输入职位" />
</el-form-item>
<el-form-item label="手机" prop="phone">
<el-input v-model="formData.phone" clearable placeholder="请输入手机" />
</el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input v-model="formData.telephone" clearable placeholder="请输入电话" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" clearable placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="备注" prop="notes">
<el-input v-model="formData.notes" clearable placeholder="请输入备注" />
</el-form-item>
<el-form-item label="附件">
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-row>
<el-form-item label="客户名称" prop="custom_name">
<el-input v-model="formData.custom_name" clearable placeholder="请选择客户" @click="showDialog = true" />
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="职位" prop="position">
<el-input v-model="formData.position" clearable placeholder="请输入职位" />
</el-form-item>
<el-form-item label="手机" prop="phone">
<el-input v-model="formData.phone" clearable placeholder="请输入手机" />
</el-form-item>
<el-form-item label="电话" prop="telephone">
<el-input v-model="formData.telephone" clearable placeholder="请输入电话" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" clearable placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="备注" prop="notes">
<el-input v-model="formData.notes" clearable placeholder="请输入备注" type="textarea" />
</el-form-item>
<el-form-item label="附件">
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
</el-dialog>
@ -48,16 +44,6 @@ import { apiCustomContactsAdd, apiCustomContactsEdit, apiCustomContactsDetail }
import { apiCustomLists } from '@/api/custom'
import type { PropType } from 'vue'
const handleAvatarSuccess_four = (response: any) => {
formData.annex ||= []
// @ts-ignore
response.code != 0 ? formData.annex.push({ uri: response.data.uri, name: response.data.name }) : ElMessage.error(response.msg);
};
//
const delFileFn = (index: number) => { formData.annex.splice(index, 1) }
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
@ -147,12 +133,6 @@ const handleSubmit = async () => {
emit('success')
}
//
const handleCurrentChange = (e: any) => {
formData.custom_name = e.name
formData.custom_id = e.id
showDialog.value = false
}
//
const open = (type = 'add') => {

View File

@ -1,8 +1,8 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="60%" @confirm="handleSubmit"
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
<el-form ref="formRef" :model="formData" label-width="100px" :rules="formRules">
<el-form-item label="主题" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入主题" />
</el-form-item>
@ -28,9 +28,9 @@
<el-input v-model="formData.executor" clearable placeholder="请输入执行人" />
</el-form-item>
<el-form-item label="行动描述" prop="description">
<el-input v-model="formData.description" clearable placeholder="请输入行动描述" />
<el-input v-model="formData.description" clearable placeholder="请输入行动描述" type="textarea" />
</el-form-item>
<el-form-item label="附件/现场照片" prop="annex">
<el-form-item label="附件" prop="annex">
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
<el-form-item label="位置" prop="coordinate">
@ -54,7 +54,6 @@
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomFollowAdd, apiCustomFollowEdit, apiCustomFollowDetail } from '@/api/custom_follow'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
import { usePaging } from '@/hooks/usePaging'
import { apiCustomLists } from '@/api/custom'

View File

@ -43,18 +43,6 @@
<el-table-column label="提交时间" prop="submission_time" show-overflow-tooltip />
<el-table-column label="方案内容" prop="solution_content" show-overflow-tooltip />
<el-table-column label="客户反馈" prop="customer_feedback" show-overflow-tooltip />
<el-table-column label="附件" prop="annex" show-overflow-tooltip>
<template #default="{ row }">
<div v-if="row.annex && row.annex.length > 0">
<div v-for="(item, i) in row.annex " :key='i'>
<el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link>
</div>
</div>
<div v-else>
暂无文件
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['custom.customer_demand_solution/edit']" type="primary" link
@ -154,4 +142,3 @@ const handledetail = async (data: any) => {
getLists()
</script>

View File

@ -21,7 +21,7 @@
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable readonly placeholder="系统自动填写" />
<el-input v-model="project_name" clearable readonly placeholder="点击选择项目" />
</el-form-item>
</el-col> <el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
@ -53,29 +53,9 @@
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
@ -84,7 +64,7 @@
<el-col :span="24" v-if="mode == 'add'">
<div style=" display: flex;justify-content: flex-end;margin-bottom: 30px;">
<el-button @click="showDialog = true" type="primary" plain>选择材料</el-button>
<toolTip content="可在项目管理-项目预算-材料预算-材料预算添加"></toolTip>
</div>
</el-col>
<el-row v-if="mode == 'add'">
@ -169,50 +149,24 @@
import materialDialog from '@/components/material_budget_detail/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { toChinesNum } from "@/utils/util";
import projectDialog from '@/components/project/index.vue'
import { materialrequestAdd, materialrequestEdit, materialrequestDetail } from '@/api/material_purchase_request'
import { materialrequestDetailLists } from '@/api/material_purchase_request_detail'
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const project_name = ref('')
const project_code = ref('')
const tablist1 = reactive([])
const next = () => {
if (active.value++ > 3) active.value = 0
}
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
const handleAdd = (row: any) => {
// row
const index = tablist1.indexOf(row);

View File

@ -90,29 +90,14 @@
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
</el-row>
<div style=" display: flex;justify-content: flex-end;margin-bottom: 30px;">
<el-button @click="showDialog2 = true" type="primary" :disabled="!formData.project_id"
plain>选择采购申请</el-button>
<toolTip content="可在材料管理-采购申请-采购申请添加"></toolTip>
</div>
<el-row>
<el-col :span="24">
@ -121,7 +106,6 @@
<el-table :data="materialList">
<el-table-column label="序号">
<template #default="{ row }">
<!-- <el-button @click="handleAdd1(row)">+</el-button> -->
<el-button @click="handleDelete1(row)">-</el-button>
</template>
</el-table-column>
@ -267,9 +251,8 @@ import projectTable from '@/components/project/index.vue'
import suppliertable from '@/components/supplier/index.vue'
import { useDictData } from '@/hooks/useDictOptions'
import prodctTable from '@/components/Materialprocurement_details/index.vue'
import { paymentplanLists } from '@/api/paymentplan'
import { apiProcurementContractDetailLists } from '@/api/procurement_contract_detail'
import { paymentplanLists, paymentplanDelete } from '@/api/paymentplan'
import { apiProcurementContractDetailLists, apiProcurementContractDetailDelete } from '@/api/procurement_contract_detail'
import { apiProcurementContractAdd, apiProcurementContractEdit, apiProcurementContractDetail } from '@/api/procurement_contract'
const { dictData } = useDictData('procurement_contract_type,pay_type,tax_rate,account_period,pay_period')
let props = defineProps({
@ -304,38 +287,17 @@ const paymentList = reactive([
])
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
feedback.msgError(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
const handleAdd = (row: any) => {
// row
const index = paymentList.indexOf(row);
paymentList.splice(index + 1, 0, {});
};
const handleDelete = (row: any) => {
if (paymentList.length <= 1) return
const handleDelete = async (row: any) => {
// if (paymentList.length <= 1) return
if (row.id) await paymentplanDelete({ id: row.id })
// row
const index = paymentList.indexOf(row);
paymentList.splice(index, 1);
@ -346,7 +308,8 @@ const handleAdd1 = (row: any) => {
materialList.splice(index + 1, 0, {});
};
const handleDelete1 = (row: any) => {
const handleDelete1 = async (row: any) => {
if (row.id) await apiProcurementContractDetailDelete({ id: row.id })
// row
const index = materialList.indexOf(row);
materialList.splice(index, 1);
@ -381,6 +344,7 @@ const procurementList = (id) => {
const paymentplanList = (id: any) => {
paymentplanLists({ 'page_no': 1, 'page_size': 5000, 'contract_type': 1, 'contract_id': id }).then((res) => {
const data = res.lists.map((item: any) => ({
id: item.id,
'period': item.period,
'pay_date': item.pay_date,
'amount': item.amount,
@ -476,15 +440,6 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
@ -498,6 +453,8 @@ const setFormData = async (data: Record<any, any>) => {
contract_no.value = data.contract_no
supplier_name.value = data.supplier_name
supplier_code.value = data.supplier_code
let res = await apiProcurementContractDetailLists({ contract_id: data.id })
Object.assign(materialList, res.lists)
}

View File

@ -91,8 +91,6 @@ const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
const projectList = ref([])
const supplierList = ref([])
//
const queryParams = reactive({
supplier_id: '',
@ -147,21 +145,5 @@ const handleDetail = async (data: any) => {
detailRef.value?.setFormData(res)
}
//
const projectlist = async () => {
let res = await apiProjectLists({ page_no: 1, page_size: 9999 })
projectList.value = res.lists
}
//
const supplierlist = async () => {
let res = await apisupplierLists({ page_no: 1, page_size: 9999 })
supplierList.value = res.lists
}
projectlist()
supplierlist()
getLists()
</script>

View File

@ -44,10 +44,10 @@
<el-table-column label="参数说明" prop="material_parameter_description" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button v-perms="['procurement_contract_detail/edit']" type="primary" link
<!-- <el-button v-perms="['procurement_contract_detail/edit']" type="primary" link
@click="handleEdit(row)">
编辑
</el-button>
</el-button> -->
<el-button v-perms="['procurement_contract_detail/delete']" type="danger" link
@click="handleDelete(row.id)">
删除
@ -71,7 +71,7 @@
<script lang="ts" setup name="procurementContractDetailLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiProcurementContractDetailLists, apiProcurementContractDetailDetail } from '@/api/procurement_contract_detail'
import { apiProcurementContractDetailLists, apiProcurementContractDetailDetail, apiProcurementContractDetailDelete } from '@/api/procurement_contract_detail'
import { apiProcurementContractSearch } from '@/api/procurement_contract'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'

View File

@ -47,7 +47,7 @@
<el-descriptions-item label="负责人" label-align="left" align="left" label-class-name="my-label">
{{ formData.person }}</el-descriptions-item>
<el-descriptions-item label="项目内容" label-align="left" align="left" label-class-name="my-label">
{{ formData.project_content }}</el-descriptions-item>
{{ formData.project_content_text }}</el-descriptions-item>
<el-descriptions-item label="竞争对手" label-align="left" align="left" label-class-name="my-label">
{{ formData.competitor }}</el-descriptions-item>
<el-descriptions-item label="项目建设资金来源" label-align="left" align="left" label-class-name="my-label"> {{

View File

@ -3,12 +3,12 @@
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-row>
<el-col :span="8">
<el-form-item label="客户名称" prop="custom_name"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.custom_name" @click="showDialog = true" clearable
placeholder="请选择客户" />
placeholder="请选择客户" class="flex-1" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -18,6 +18,7 @@
<el-option v-for="(item, index) in protype" :key="index" :label="item.name"
:value="parseInt(item.id)" />
</el-select>
<ToolTip content="可在项目管理--项目设置--项目类型设置里面添加项目类型"></ToolTip>
</el-form-item>
</el-col>
<el-col :span="8">
@ -34,7 +35,7 @@
<el-col :span="24">
<el-form-item label="项目内容" prop="project_content">
<el-checkbox-group v-model="formData.project_content" placeholder="请选择项目内容">
<el-checkbox v-for="(item, index) in dictData.project_content" :key="index"
<el-checkbox v-for="( item, index ) in dictData.project_content " :key="index"
:label="item.value">
{{ item.name }}
</el-checkbox>
@ -66,7 +67,7 @@
<el-col :span="24">
<el-form-item label="招标方式" prop="bidding_method">
<el-radio-group v-model="formData.bidding_method" placeholder="请选择招标方式">
<el-radio v-for="(item, index) in dictData.bidding_method" :key="index"
<el-radio v-for="( item, index ) in dictData.bidding_method " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -112,7 +113,7 @@
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select class="flex-1" v-model="formData.information_sources" clearable
placeholder="请选择信息来源">
<el-option v-for="(item, index) in dictData.information_sources" :key="index"
<el-option v-for="( item, index ) in dictData.information_sources " :key="index"
:label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
@ -131,7 +132,7 @@
<el-col :span="12">
<el-form-item label="关系度" prop="relationship">
<el-radio-group v-model="formData.relationship" placeholder="请选择关系度">
<el-radio v-for="(item, index) in dictData.relationship" :key="index"
<el-radio v-for="( item, index ) in dictData.relationship " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -141,7 +142,7 @@
<el-col :span="12">
<el-form-item label="项目建设资金来源" prop="construction_funds_sources">
<el-radio-group v-model="formData.construction_funds_sources" placeholder="请选择项目建设资金来源">
<el-radio v-for="(item, index) in dictData.construction_funds_sources" :key="index"
<el-radio v-for="( item, index ) in dictData.construction_funds_sources " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -152,8 +153,8 @@
<el-col :span="12">
<el-form-item label="建设方财务状况" prop="construction_financial_status">
<el-radio-group v-model="formData.construction_financial_status" placeholder="请选择建设方财务状况">
<el-radio v-for="(item, index) in dictData.construction_financial_status" :key="index"
:label="parseInt(item.value)">
<el-radio v-for="( item, index ) in dictData.construction_financial_status "
:key="index" :label="parseInt(item.value)">
{{ item.name }}
</el-radio>
</el-radio-group>
@ -162,7 +163,7 @@
<el-col :span="12">
<el-form-item label="建设方对我方认可度" prop="construction_recognition">
<el-radio-group v-model="formData.construction_recognition" placeholder="请选择建设方对我方认可度">
<el-radio v-for="(item, index) in dictData.construction_recognition" :key="index"
<el-radio v-for="( item, index ) in dictData.construction_recognition " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -172,7 +173,7 @@
<el-col :span="12">
<el-form-item label="我方对建设方认可度" prop="my_construction_recognition">
<el-radio-group v-model="formData.my_construction_recognition" placeholder="请选择我方对建设方认可度">
<el-radio v-for="(item, index) in dictData.my_construction_recognition" :key="index"
<el-radio v-for="( item, index ) in dictData.my_construction_recognition " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -182,7 +183,7 @@
<el-col :span="12">
<el-form-item label="战略意义" prop="strategic_significance">
<el-radio-group v-model="formData.strategic_significance" placeholder="请选择战略意义">
<el-radio v-for="(item, index) in dictData.strategic_significance" :key="index"
<el-radio v-for="( item, index ) in dictData.strategic_significance " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -192,7 +193,7 @@
<el-col :span="12">
<el-form-item label="所属行业" prop="industry">
<el-radio-group v-model="formData.industry" placeholder="请选择所属行业">
<el-radio v-for="(item, index) in dictData.industry" :key="index"
<el-radio v-for="( item, index ) in dictData.industry " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>
@ -202,7 +203,7 @@
<el-col :span="12">
<el-form-item label="单位性质" prop="unit_nature">
<el-radio-group v-model="formData.unit_nature" placeholder="请选择单位性质">
<el-radio v-for="(item, index) in dictData.unit_nature" :key="index"
<el-radio v-for="( item, index ) in dictData.unit_nature " :key="index"
:label="parseInt(item.value)">
{{ item.name }}
</el-radio>

View File

@ -7,8 +7,7 @@
<el-col :span="12">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true"
:rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
<el-input v-model="project_name" readonly clearable placeholder="请输入项目名称"
:disabled="project" />
<el-input v-model="project_name" readonly clearable placeholder="请输入项目名称" />
</el-form-item></el-col><el-col :span="12">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" disabled clearable placeholder="系统自动填写" />
@ -27,7 +26,7 @@
<el-form-item label="联系电话" prop="contact_phone"
:rules="[{ validator: checkPhone, trigger: 'blur' }]">
<el-input v-model="contact_phone" clearable disabled placeholder="系统自动填写" />
</el-form-item></el-col><el-col :span="24">
</el-form-item></el-col><el-col :span="12">
<el-form-item label="概算来源" prop="estimate_source">
<el-radio-group v-model="formData.estimate_source" placeholder="请选择概算来源">
<el-radio v-for="(item, index) in dictData.estimate_source" :key="index"
@ -35,17 +34,21 @@
{{ item.name }}
</el-radio>
</el-radio-group>
</el-form-item></el-col><el-col :span="12">
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="制单人" prop="create_user">
<el-input v-model="formData.create_user" clearable placeholder="请输入制单人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报价日期" prop="quotation_date">
<el-date-picker class="flex-1 !flex" v-model="formData.quotation_date" clearable type="date"
value-format="YYYY-MM-DD" placeholder="选择报价日期">
</el-date-picker>
</el-form-item></el-col>
<el-col :span="24">
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发票类型" prop="invoice_type">
<el-radio-group v-model="formData.invoice_type" placeholder="请选择发票类型">
<el-radio v-for="(item, index) in dictData.invoice_type" :key="index"
@ -55,37 +58,27 @@
</el-radio-group>
</el-form-item></el-col><el-col :span="12">
<el-form-item label="技术人员" prop="technician">
<el-select class="flex-1" v-model="formData.technician" clearable placeholder="点击选择技术人员">
<!-- <el-select class="flex-1" v-model="formData.technician" clearable placeholder="点击选择技术人员">
<el-option v-for="(item, index) in jlist" :key="index" :label="item.name"
:value="parseInt(item.id)" />
</el-select>
<!-- <el-input v-model="formData.technician" clearable placeholder="请输入技术人员id" /> -->
</el-form-item></el-col><el-col :span="12">
</el-select> -->
<el-input v-model="formData.technician_name" @click="openUserList" clearable
placeholder="点击选择技术人员" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="概算金额" prop="estimate_amount">
<el-input v-model="formData.estimate_amount" clearable placeholder="请输入概算金额" />
</el-form-item></el-col><el-col :span="12">
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="要求" prop="ask">
<el-input v-model="formData.ask" clearable placeholder="请输入要求" />
</el-form-item></el-col><el-col :span="24">
<el-input v-model="formData.ask" clearable placeholder="请输入要求" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
@ -104,6 +97,10 @@
<contactsTable @customEvent="customEvent2" :custom_id="customid"></contactsTable>
</el-dialog>
</div>
<div v-if="showDialog3">
<personnelselector ref="personnel" @confirm="submituser" :type="1">
</personnelselector>
</div>
</popup>
</div>
</template>
@ -114,8 +111,11 @@ import Popup from '@/components/popup/index.vue'
import projectTable from "@/components/project/index.vue"
import contactsTable from "@/components/contacts/index.vue"
import { useDictData } from '@/hooks/useDictOptions'
import { getAdminsByDept } from '@/api/common'
import { apiProjectEstimateAdd, apiProjectEstimateEdit, apiProjectEstimateDetail } from '@/api/project_estimate'
import feedback from '@/utils/feedback'
let props = defineProps({
project: Object
})
@ -125,8 +125,6 @@ const { dictData } = useDictData('estimate_source,invoice_type')
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const orglist = reactive([])
const jobs = reactive([])
const jlist = reactive([])
const project_name
= ref('')
@ -138,31 +136,9 @@ const customer_demand_name = ref('')
const contact_name = ref('')
const contact_phone = ref('')
const customid = ref('')
const formDataannex = reactive([])
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
import feedback from '@/utils/feedback'
const personnel = ref<any>();
const userStore = useUserStore();
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const formData = reactive({
id: '',
@ -173,16 +149,22 @@ const formData = reactive({
quotation_date: '',
invoice_type: '',
technician: '',
technician_name: "",
estimate_amount: '',
ask: '',
annex: [],
contact_id: ''
})
// dialog
const showDialog = ref(false)
const showDialog1 = ref(false)
const showDialog2 = ref(false)
const showDialog3 = ref(false)
const customEvent = (e: any) => {
@ -210,6 +192,23 @@ const customEvent2 = (e: any) => {
showDialog2.value = false;
};
const openUserList = async () => {
showDialog3.value = true;
await nextTick();
personnel.value.open();
}
//
const submituser = (e: any) => {
formData.technician_name = e.name
formData.technician = e.id
console.log(e)
showDialog3.value = false;
};
//
const demandclck = () => {
if (formData.project_id) {
@ -222,11 +221,11 @@ const demandclck = () => {
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
// if (value && !/^1\d{10}$/.test(value)) {
// callback(new Error(''));
// } else {
// callback()
// }
}
//
@ -257,15 +256,6 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
//@ts-ignore
// formData.quotation_date = timeFormat(formData.quotation_date, 'YYYY-MM-DD ')
}
@ -280,10 +270,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = formDataannex.map((item) => item.uri)
}
await formRef.value?.validate()
// await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'
? await apiProjectEstimateEdit(data)

View File

@ -2,7 +2,7 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit"
@close="handleClose">
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules" inline>
<el-form ref="formRef" :model="formData" label-width="100px" :rules="formRules">
<div
style="display: flex; flex-direction: row-reverse; justify-content: flex-start;margin-bottom: 30px;">
@ -18,9 +18,11 @@
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="project_name" readonly clearable placeholder="请输入项目名称"
:disabled="project" />
</el-form-item> </el-col>
<el-input v-model="project_name" readonly clearable placeholder="点击选择项目" :disabled="project"
class="flex-1" />
<toolTip content="需要在项目管理-项目预算-总预算编制的总预算项目"></toolTip>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id">
<el-input v-model="project_code" disabled clearable placeholder="系统自动填写" />
@ -28,22 +30,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
<el-col :span="24">
@ -56,11 +43,8 @@
<el-col :span="24">
<div style=" display: flex;justify-content: flex-end;margin-bottom: 30px;">
<el-button @click="showDialog1 = true" type="primary" plain>选择材料</el-button>
<el-button type="primary" plain>清空</el-button>
</div>
</el-col>
<el-col :span="24">
<div style="margin-bottom: 30px;">材料预算清单</div>
<div style="margin-bottom: 30px;">
@ -164,11 +148,6 @@ const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
//
const formData = reactive({
id: '',
@ -193,7 +172,6 @@ const customEvent = (e) => {
if (props.project) customEvent(props.project);
const customEvent1 = (e) => {
tableData.value.push({
"material_id": e.id,
"name": e.name,
@ -213,27 +191,6 @@ const customEvent1 = (e) => {
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑材料预算' : '新增材料预算'
})
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
@ -268,8 +225,6 @@ const getlist1 = (id: any) => {
//
const budgetDetailLists = (id) => {
MaterialbudgetDetailLists({ 'page_no': 1, 'page_size': 20, material_budget_id: id }).then((res) => {
@ -311,16 +266,7 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
budgetDetailLists(data.id)
if (data.dept_id) {
getlist1(data.org_id)
@ -347,9 +293,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = formDataannex.map((item: any) => item.uri)
}
if (tableData.value.length > 0) {
formData.material_budget_detail = tableData.value.map((item: any) => ({
'id': item.id,

View File

@ -101,26 +101,7 @@
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
</el-form-item> </el-col> <el-col :span="8">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item>
</el-col>
@ -128,7 +109,7 @@
<div style=" display: flex;justify-content: flex-end;margin-bottom: 30px;">
<el-button @click="showDialog2 = true" type="primary" plain
:disabled="!formData.project_id">选择分包明细</el-button>
<toolTip content="可在项目管理-项目预算-分包预算-分包预算添加"></toolTip>
</div>
<el-row>
<el-col :span="24">
@ -302,32 +283,12 @@ const paymentList = reactive([{}])
const formDataannex = reactive([])
import feedback from '@/utils/feedback'
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
const { dictData } = useDictData('divide_contract_type,account_period,tax_rate,pay_type,pay_period ')
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
feedback.msgError(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
const handleAdd = (row: any) => {
// row
const index = paymentList.indexOf(row);
@ -501,15 +462,7 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
if (data.dept_id) {
getlist1(data.org_id)
}

View File

@ -106,8 +106,8 @@
</div>
</el-form>
<formTable :formData="formData.accept_check_result" :config="tableConfig"></formTable>
<formTable :formData="formData.accept_check_problem" :config="tableConfig1"></formTable>
<formTable :formData="formData.accept_check_problem" :config="tableConfig1" :dictData="dictData">
</formTable>
</popup>
</div>
</template>

View File

@ -136,7 +136,7 @@
</el-table-column>
</el-table>
</div>
<formTable :formData="formData.entry_problem" :config="tableConfig"></formTable>
<formTable :formData="formData.entry_problem" :config="tableConfig" :dictData="dictData"></formTable>
</popup>
</div>

View File

@ -76,7 +76,7 @@
:query="{ project_id: formData.project_id, node_type: 2 }"></dialogTable>
</el-dialog>
</div>
<formTable :formData="formData.problem" :config="tableConfig"></formTable>
<formTable :formData="formData.problem" :config="tableConfig" :dictData="dictData"></formTable>
</el-form>
</popup>
</div>

View File

@ -130,7 +130,7 @@
</div>
</el-form>
<formTable :formData="formData.inspection_result" :config="tableConfig"></formTable>
<formTable :formData="formData.inspection_problem" :config="tableConfig1"></formTable>
<formTable :formData="formData.inspection_problem" :config="tableConfig1" :dictData="dictData"></formTable>
</popup>
</div>
</template>

View File

@ -129,7 +129,7 @@
</div>
</el-form>
<formTable :formData="formData.side_result" :config="tableConfig"></formTable>
<formTable :formData="formData.side_problem" :config="tableConfig1"></formTable>
<formTable :formData="formData.side_problem" :config="tableConfig1" :dictData="dictData"></formTable>
</popup>
</div>
</template>

View File

@ -82,7 +82,7 @@
</dialogTable>
</el-dialog>
</div>
<formTable :formData="formData.problem" :config="tableConfig"></formTable>
<formTable :formData="formData.problem" :config="tableConfig" :dictData="dictData"></formTable>
</popup>
</div>
</template>

View File

@ -14,8 +14,8 @@
<el-col :span="8">
<el-form-item label="组织" prop="org_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织"
@change="deptrmt">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt"
class="flex-1">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name"
:value="item.id" />
</el-select>
@ -24,7 +24,7 @@
<el-col :span="8">
<el-form-item label="部门" prop="dept_id"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门" class="flex-1">
<el-option v-for="(item, index) in list2" :key="index" :label="item.name"
:value="item.id" />
</el-select>
@ -33,10 +33,6 @@
<el-col :span="8">
<el-form-item label="供应商名称" prop="supplier_name"
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.supplier_name" clearable placeholder="请输入" />
</el-form-item>
</el-col>
@ -53,29 +49,7 @@
<el-col :span="24">
<el-form-item label="供应商照片" prop="supplier_photos">
<!-- <material-picker v-model="formData.supplier_photos" /> -->
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four1" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formData.supplier_photos"
style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;"
@click="delFileFn1(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData" value="supplier_photos"></uploadAnnex>
</el-form-item>
</el-col>
@ -110,7 +84,7 @@
<el-form-item label="联系人" prop="contacts">
<el-input v-model="formData.contacts" clearable placeholder="请输入" />
</el-form-item></el-col>
<el-col :span="24">
<el-col :span="8">
<el-form-item label="性别" label-width="130px" prop="contacts_sex">
<el-radio-group v-model="formData.contacts_sex" placeholder="请选择性别">
<el-radio v-for="(item, index) in dictData.sex" :key="index"
@ -119,14 +93,11 @@
</el-radio>
</el-radio-group>
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="出生日期" prop="birthday">
<el-date-picker v-model="formData.birthday" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" placeholder="请选择出生日期" clearable></el-date-picker>
value-format="YYYY-MM-DD" placeholder="请选择出生日期" clearable
class="flex-1 !flex"></el-date-picker>
</el-form-item></el-col>
<el-col :span="8">
<el-form-item label="电话号码" prop="phone"
@ -150,31 +121,10 @@
<el-col :span="8">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
<el-input v-model="formData.remark" clearable placeholder="请输入备注" type="textarea" />
</el-form-item></el-col><el-col :span="24">
<el-form-item label="附件">
<el-upload
accept="doc, docx, xls, xlsx, ppt, pptx, pdf, txt, zip, rar, tar, jpg, png, gif, jpeg, webp, wmv, avi, mpg, mpeg, 3gp, mov, mp4, flv, f4v, rmvb, mkv"
class="upload-demo" :show-file-list="false" aria-hidden="true"
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
:on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="(item, index) in formDataannex"
style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start"
:href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;"
@click="delFileFn(index)">x</span>
</div>
</div>
<uploadAnnex :formData="formData"></uploadAnnex>
</el-form-item></el-col>
</el-row>
</el-tab-pane>
@ -264,51 +214,13 @@ const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
import configs from "@/config"
const base_url = configs.baseUrl + configs.urlPrefix
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
const userInfo = userStore.userInfo
const formDataannex = reactive([])
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
//
const handleAvatarSuccess_four1 = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formData.supplier_photos.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn1 = (index: number) => {
formData.supplier_photos.splice(index, 1)
}
//
@ -424,17 +336,7 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.annex && data.annex.length > 0) {
const arry1 = data.annex.map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
}
if (data.dept_id) {
getlist1(data.org_id)
}
@ -458,12 +360,6 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.annex = formDataannex.map((item: any) => item.uri)
}
if (formData.supplier_photos.length > 0) {
formData.supplier_photos = formData.supplier_photos
}
await formRef.value?.validate()
const data = { ...formData, }
mode.value == 'edit'

View File

@ -54,7 +54,7 @@
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="建档人" prop="create_user" show-overflow-tooltip />
<el-table-column label="建档人" prop="create_user_name" show-overflow-tooltip />
<el-table-column label="供应商编码" prop="supplier_code" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="supplier_name" show-overflow-tooltip />
<el-table-column label="品牌类别" prop="brand_category" show-overflow-tooltip />