|
|
@@ -0,0 +1,370 @@
|
|
|
+<template>
|
|
|
+ <a-card>
|
|
|
+ <a-form class="smart-query-form" ref="stepFormRef" labelWrap :label-col="labelCol" :model="formModel" :rules="formRules">
|
|
|
+ <div class="approval-steps">
|
|
|
+ <div>
|
|
|
+ <div class="basic-title">
|
|
|
+ <div class="basic-title-left">
|
|
|
+ <div class="basic-title-line"></div>
|
|
|
+ <span class="basic-title-text">项目报价登记</span>
|
|
|
+ </div>
|
|
|
+ <div class="basic-title-right">
|
|
|
+ <a-button type="primary" @click="submit">提交</a-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="steps-content">
|
|
|
+ <a-row :gutter="24" class="smart-query-form-row">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="是否参标" name="competitorName" class="smart-query-form-item">
|
|
|
+ <DictSelect
|
|
|
+ key-code="BLINK_ENTERPRISE_QUALIFICATION"
|
|
|
+ v-model:value="formModel.formerName"
|
|
|
+ placeholder="请选择资质名称"
|
|
|
+ width="100%"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="16">
|
|
|
+ <a-form-item label="项目名称" name="formerName" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.formerName" placeholder="请选择项目" @click="showSelectProj" />
|
|
|
+ <table-info-select ref="ProjectSelectRef" @selectedRowList="handleSelect" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row :gutter="24" class="smart-query-form-row">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="标段名称" name="attribute" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.registeredCapital" placeholder="请输入标段名称" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="标段日期" name="registeredTime" class="smart-query-form-item">
|
|
|
+ <a-date-picker v-model:value="formModel.registeredTime" placeholder="标段日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="是否中标" name="registeredCapital" class="smart-query-form-item">
|
|
|
+ <DictSelect
|
|
|
+ key-code="BLINK_CUSTOMER_ATTRIBUTE"
|
|
|
+ v-model:value="formModel.attribute"
|
|
|
+ placeholder="请选择是否中标"
|
|
|
+ width="100%"
|
|
|
+ @change="resetFromDate"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row :gutter="16" class="smart-query-form-row">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="报价金额" name="registeredAddress" class="smart-query-form-item">
|
|
|
+ <a-input-number v-model:value="formModel.address" placeholder="请输入注册详细地址" addon-after="元" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="客户名称" name="address" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.address" placeholder="请输入客户名称" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row :gutter="16" class="smart-query-form-row">
|
|
|
+ <a-col :span="24">
|
|
|
+ <a-form-item label="中标公示" name="attachment" class="smart-query-form-item">
|
|
|
+ <Upload
|
|
|
+ :defaultFileList="defaultFileList"
|
|
|
+ :maxUploadSize="10"
|
|
|
+ :folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
|
|
|
+ buttonText="上传附件"
|
|
|
+ listType="text"
|
|
|
+ extraMsg="最多上传10个附件"
|
|
|
+ @change="changeAttachment"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="!query.id">
|
|
|
+ <div class="basic-title">
|
|
|
+ <div class="basic-title-left">
|
|
|
+ <div class="basic-title-line"></div>
|
|
|
+ <span class="basic-title-text">项目报价</span>
|
|
|
+ </div>
|
|
|
+ <div class="basic-title-right">
|
|
|
+ <a-button type="primary" @click="handleAdd">添加</a-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="steps-content">
|
|
|
+ <a-form-item name="children" class="smart-query-form-item">
|
|
|
+ <div class="steps-content">
|
|
|
+ <!-- <a-button type="primary" @click="handleAdd" style="margin-bottom: 8px">分配任务</a-button> -->
|
|
|
+ <a-table :pagination="false" :columns="columns" :data-source="scheduleList" bordered>
|
|
|
+ <template v-for="col in ['qualificationName', 'remark']" #[col]="{ index }" :key="col">
|
|
|
+ <div>
|
|
|
+ <template v-if="col === 'qualificationName'">
|
|
|
+ <DictSelect
|
|
|
+ key-code="BLINK_ENTERPRISE_QUALIFICATION"
|
|
|
+ v-model:value="scheduleList[index].qualificationName"
|
|
|
+ placeholder="请选择资质名称"
|
|
|
+ width="100%"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <template v-if="col === 'remark'">
|
|
|
+ <a-input v-model:value="scheduleList[index][col]" />
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #operation="{ index }">
|
|
|
+ <div class="editable-row-operations">
|
|
|
+ <a @click="onDelete(index)">删除</a>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ </div>
|
|
|
+ </a-form-item>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </a-form>
|
|
|
+ </a-card>
|
|
|
+</template>
|
|
|
+<script setup>
|
|
|
+ import { onMounted, reactive, ref, useAttrs, watch, computed } from 'vue';
|
|
|
+ import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
|
|
|
+ import { useRouter } from 'vue-router';
|
|
|
+ import { message, Modal } from 'ant-design-vue';
|
|
|
+ import _ from 'lodash';
|
|
|
+ import DictSelect from '/@/components/support/dict-select/index.vue';
|
|
|
+ import Upload from '/@/components/support/file-upload/index.vue';
|
|
|
+ import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';
|
|
|
+ import { fetchCreateCompetitor, fetchUpdateCompetitor, fetchUpdateCompetitorDate } from '/@/api/support/supportManageApi/index.js';
|
|
|
+ import tableInfoSelect from '/@/views/support-manage/components/TableInfoSelect.vue';
|
|
|
+
|
|
|
+ const stepFormRef = ref(null);
|
|
|
+ const router = useRouter();
|
|
|
+ const query = router.currentRoute.value.query;
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ if (query.id) {
|
|
|
+ updateOpponentInfo(query.id);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ function updateOpponentInfo(param) {
|
|
|
+ fetchUpdateCompetitor(param).then((res) => {
|
|
|
+ Object.assign(formModel, res.data);
|
|
|
+ formModel.attribute = res.data.attribute[0].valueName;
|
|
|
+ defaultFileList.value = res.data.attachment;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // --------------------- 数据 ---------------------
|
|
|
+ const formModel = reactive({
|
|
|
+ competitorName: undefined, // 竞争对手名称
|
|
|
+ });
|
|
|
+
|
|
|
+ // --------------------- 校验规则 ---------------------
|
|
|
+ const formRules = {
|
|
|
+ // customerName: [{ required: true, message: '请输入客户名称', trigger: 'change' }],
|
|
|
+ // customerManagerMobile: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }],
|
|
|
+ };
|
|
|
+
|
|
|
+ const labelCol = { style: { width: '125px', height: '40px' } };
|
|
|
+
|
|
|
+ // ----------------------- 上传附件 ----------------------------
|
|
|
+
|
|
|
+ // 已上传的附件列表
|
|
|
+ const defaultFileList = ref([]);
|
|
|
+ function changeAttachment(fileList) {
|
|
|
+ console.log('fileList', fileList);
|
|
|
+ defaultFileList.value = fileList;
|
|
|
+ formModel.attachment = _.isEmpty(fileList) ? [] : fileList;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ----------------------- 步骤相关 ---------------------------
|
|
|
+
|
|
|
+ const submit = () => {
|
|
|
+ for (let i = 0; i < scheduleList.value.length; i++) {
|
|
|
+ formModel.qualificationList = scheduleList.value;
|
|
|
+ }
|
|
|
+ console.log('formModel', formModel);
|
|
|
+ stepFormRef.value
|
|
|
+ .validateFields()
|
|
|
+ .then((values) => {
|
|
|
+ Modal.confirm({
|
|
|
+ title: '提示',
|
|
|
+ content: '确定要提交吗?',
|
|
|
+ okText: '确认',
|
|
|
+ onOk() {
|
|
|
+ postFormData();
|
|
|
+ },
|
|
|
+ cancelText: '取消',
|
|
|
+ onCancel() {},
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch((error) => {
|
|
|
+ console.log('step1_error', error);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 竞争对手新增信息提交
|
|
|
+ const postFormData = () => {
|
|
|
+ fetchCreateCompetitor(formModel).then((res) => {
|
|
|
+ message.success('提交成功');
|
|
|
+ router.push({ path: '/support-manage/competition/opponent' });
|
|
|
+ });
|
|
|
+ };
|
|
|
+ //---------------------------Children表单列定义------------------------------
|
|
|
+ const scheduleList = ref([]);
|
|
|
+
|
|
|
+ const columns = ref([
|
|
|
+ {
|
|
|
+ title: '序号',
|
|
|
+ dataIndex: 'seq',
|
|
|
+ align: 'center',
|
|
|
+ customRender: ({ index }) => index + 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '竞争对手名称',
|
|
|
+ dataIndex: 'qualificationName',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'qualificationName',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '报价轮次',
|
|
|
+ dataIndex: 'remark',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'remark',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '报价金额(元)',
|
|
|
+ dataIndex: 'remark',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'remark',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '是否中标',
|
|
|
+ dataIndex: 'remark',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'remark',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '报价日期',
|
|
|
+ dataIndex: 'remark',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'remark',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作人',
|
|
|
+ dataIndex: 'remark',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'remark',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ dataIndex: 'operation',
|
|
|
+ align: 'center',
|
|
|
+ slots: {
|
|
|
+ customRender: 'operation',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ //---------------------------Children表单改变事件------------------------------
|
|
|
+
|
|
|
+ const handleAdd = () => {
|
|
|
+ const newData = {
|
|
|
+ qualificationName: '',
|
|
|
+ remark: '',
|
|
|
+ };
|
|
|
+ scheduleList.value.push(newData);
|
|
|
+ };
|
|
|
+ const onDelete = (index) => {
|
|
|
+ scheduleList.value = [...scheduleList.value.slice(0, index), ...scheduleList.value.slice(index + 1)];
|
|
|
+ };
|
|
|
+ //重置表单数据
|
|
|
+ function resetFromDate() {}
|
|
|
+ //------------------------------表格数据选择器-------------------------------------
|
|
|
+
|
|
|
+ const ProjectSelectRef = ref(null);
|
|
|
+
|
|
|
+ //表格选择器开窗
|
|
|
+ function showSelectProj() {
|
|
|
+ ProjectSelectRef.value.showModal();
|
|
|
+ }
|
|
|
+
|
|
|
+ //表格选择器数据回显
|
|
|
+ function handleSelect(data) {
|
|
|
+ console.log('data', data);
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="less">
|
|
|
+ .approval-steps {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 20px;
|
|
|
+ // width: 1350px;
|
|
|
+ margin: 0 auto;
|
|
|
+
|
|
|
+ .basic-title {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 40px;
|
|
|
+ padding: 0 16px 4px 16px;
|
|
|
+ border-bottom: 2px solid #f6f6f6;
|
|
|
+ background: #ffffff;
|
|
|
+ border-top-left-radius: 8px;
|
|
|
+ border-top-right-radius: 8px;
|
|
|
+
|
|
|
+ .basic-title-left {
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .basic-title-line {
|
|
|
+ width: 4px;
|
|
|
+ height: 20px;
|
|
|
+ border-radius: 4px;
|
|
|
+ background: #267ef8;
|
|
|
+ margin-right: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .basic-title-text {
|
|
|
+ font-size: 16px;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 600;
|
|
|
+ line-height: 20px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .basic-title-right {
|
|
|
+ display: flex;
|
|
|
+ gap: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .steps-content {
|
|
|
+ margin-top: 14px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .steps-action {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ margin-top: 18px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|