|
|
@@ -0,0 +1,430 @@
|
|
|
+<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="24">
|
|
|
+ <a-form-item label="甲方名称" name="customerName" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.customerName" placeholder="请选择客户名称" @click="showSelectProj" />
|
|
|
+ </a-form-item>
|
|
|
+ <table-info-select ref="customerSelectRef" @selectedRowList="handleSelect" :bs-table-bean="bsTableBean" />
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row :gutter="16" class="smart-query-form-row">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="甲方类型" name="customerType" class="smart-query-form-item">
|
|
|
+ <DictSelect
|
|
|
+ key-code="BLINK_CUSTOMER_INVOICE_TYPE"
|
|
|
+ v-model:value="formModel.customerType"
|
|
|
+ placeholder="请选择甲方类型"
|
|
|
+ width="100%"
|
|
|
+ disabled
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="省市区" name="provinceCityDistrictPartA" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.provinceCityDistrictPartA" placeholder="请输入省市区" disabled />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <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">提交</a-button> -->
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="steps-content">
|
|
|
+ <a-row :gutter="16" class="smart-query-form-row">
|
|
|
+ <a-col :span="16">
|
|
|
+ <a-form-item label="项目名称" name="projectName" class="smart-query-form-item">
|
|
|
+ <a-input v-model:value="formModel.projectName" placeholder="请输入项目名称" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="项目类型" name="projectType" class="smart-query-form-item">
|
|
|
+ <DictSelect key-code="BLINK_PROJECT_TYPE" v-model:value="formModel.projectType" placeholder="请选择项目类型" width="100%" />
|
|
|
+ </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="majorType" class="smart-query-form-item">
|
|
|
+ <DictSelect key-code="BLINK_PROJECT_MAJOR_TYPE" v-model:value="formModel.majorType" placeholder="请选择专业类型" width="100%" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="省市区" name="invoiceBankName" class="smart-query-form-item">
|
|
|
+ <AreaCascader
|
|
|
+ type="province_city_district"
|
|
|
+ style="width: 100%"
|
|
|
+ v-model:value="provinceCityDistrict"
|
|
|
+ placeholder="请选择省市区"
|
|
|
+ @change="changeArea"
|
|
|
+ />
|
|
|
+ </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="8">
|
|
|
+ <a-form-item label="预计合同额" name="contractAmount" class="smart-query-form-item">
|
|
|
+ <a-input-number v-model:value="formModel.contractAmount" placeholder="请输入预计合同额" style="width: 100%" addon-after="万" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="招标方式" name="tendersType" class="smart-query-form-item">
|
|
|
+ <DictSelect key-code="BLINK_PROJECT_TENDERS_TYPE" v-model:value="formModel.tendersType" placeholder="请选择招标方式" width="100%" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="预计开标日期" name="bidOpenDate" class="smart-query-form-item">
|
|
|
+ <a-date-picker v-model:value="formModel.bidOpenDate" placeholder="预计开标日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
+ </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="planStartDate" class="smart-query-form-item">
|
|
|
+ <a-date-picker v-model:value="formModel.planStartDate" placeholder="预计开工日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="预计竣工日期" name="planEndDate" class="smart-query-form-item">
|
|
|
+ <a-date-picker v-model:value="formModel.planEndDate" placeholder="预计竣工日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-form-item label="预计工期" name="planDays" class="smart-query-form-item">
|
|
|
+ <a-input-number v-model:value="formModel.planDays" placeholder="请输入预计工期" style="width: 100%" addon-after="天" />
|
|
|
+ </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="projectRemark" class="smart-query-form-item">
|
|
|
+ <a-textarea v-model:value="formModel.projectRemark" placeholder="请输入备注" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <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"></div>
|
|
|
+ </div>
|
|
|
+ <div class="steps-content">
|
|
|
+ <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>
|
|
|
+ </a-form>
|
|
|
+ </a-card>
|
|
|
+</template>
|
|
|
+<script setup>
|
|
|
+ import { onMounted, reactive, ref, useAttrs } from 'vue';
|
|
|
+ import { useRouter } from 'vue-router';
|
|
|
+ import { message, Modal } from 'ant-design-vue';
|
|
|
+
|
|
|
+ import _ from 'lodash';
|
|
|
+ import { useBsTable } from '/@/components/BsUi/Table/index.js';
|
|
|
+ import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';
|
|
|
+ import { clientManageApi } from '/@/api/market-manage/index.js';
|
|
|
+ import AreaCascader from '/@/components/framework/area-cascader/index.vue';
|
|
|
+ import DictSelect from '/@/components/support/dict-select/index.vue';
|
|
|
+ import Upload from '/@/components/support/file-upload/index.vue';
|
|
|
+ import tableInfoSelect from '/@/components/BsUi/TableInfoSelect/tableInfoSelect.vue'
|
|
|
+
|
|
|
+ const stepFormRef = ref(null);
|
|
|
+ const router = useRouter();
|
|
|
+
|
|
|
+ // --------------------- 数据定义 ---------------------
|
|
|
+ const formModel = reactive({
|
|
|
+ projectName: undefined, //项目名称
|
|
|
+ projectType: undefined, //项目类型
|
|
|
+ majorType: undefined, //专业类型
|
|
|
+ province: undefined, //省份
|
|
|
+ provinceName: undefined,
|
|
|
+ city: undefined, //城市
|
|
|
+ cityName: undefined,
|
|
|
+ district: undefined, //区或县
|
|
|
+ districtName: undefined,
|
|
|
+ address: undefined, //详细地址
|
|
|
+ contractAmount: undefined, //合同金额
|
|
|
+ tendersType: undefined, //招标方式
|
|
|
+ bidOpenDate: undefined, //预计开标日期
|
|
|
+ planStartDate: undefined, //预计开工日期
|
|
|
+ planEndDate: undefined, //预计完工日期
|
|
|
+ planDays: undefined, //预计工期
|
|
|
+ projectRemark: undefined, //备注
|
|
|
+ attachment: undefined, //附件集合
|
|
|
+ });
|
|
|
+
|
|
|
+ // ---------------------- 表单校验规则 ---------------------------
|
|
|
+ const formRules = {
|
|
|
+ // customerName: [{ required: true, message: '请输入客户名称', trigger: 'change' }],
|
|
|
+ customerManagerMobile: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }],
|
|
|
+ invoiceMobile: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }],
|
|
|
+ };
|
|
|
+
|
|
|
+ // ---------------------- 表格样式配置 ----------------------------
|
|
|
+ const labelCol = { style: { width: '110px', height: '50px' } };
|
|
|
+
|
|
|
+ // ----------------------- 上传附件 ----------------------------
|
|
|
+ // 已上传的附件列表
|
|
|
+ const defaultFileList = ref([]);
|
|
|
+ // 附件列表触发事件
|
|
|
+ function changeAttachment(fileList) {
|
|
|
+ defaultFileList.value = fileList;
|
|
|
+ formModel.attachment = _.isEmpty(fileList) ? [] : fileList;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ---------------------- 提交步骤相关 ---------------------------
|
|
|
+ const submit = () => {
|
|
|
+ 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 = () => {
|
|
|
+ clientManageApi.ProjectAddition(formModel).then((res) => {
|
|
|
+ message.success('提交成功');
|
|
|
+ router.push({ path: '/market-manage/external-manage/project-manage/project-list' });
|
|
|
+ });
|
|
|
+ };
|
|
|
+ //------------------------------地区-------------------------------------
|
|
|
+
|
|
|
+ const provinceCityDistrict = ref([]);
|
|
|
+ const provinceCityDistrictPartA = ref([]);
|
|
|
+ function changeArea(value, selectedOptions) {
|
|
|
+ Object.assign(formModel, {
|
|
|
+ province: '',
|
|
|
+ provinceName: '',
|
|
|
+ city: '',
|
|
|
+ cityName: '',
|
|
|
+ district: '',
|
|
|
+ districtName: '',
|
|
|
+ });
|
|
|
+ if (!_.isEmpty(selectedOptions)) {
|
|
|
+ // 地区组件地区信息拆分
|
|
|
+ formModel.province = provinceCityDistrict.value[0].value;
|
|
|
+ formModel.provinceName = provinceCityDistrict.value[0].label;
|
|
|
+ formModel.city = provinceCityDistrict.value[1].value;
|
|
|
+ formModel.cityName = provinceCityDistrict.value[1].label;
|
|
|
+ if (provinceCityDistrict.value[2]) {
|
|
|
+ formModel.district = provinceCityDistrict.value[2].value;
|
|
|
+ formModel.districtName = provinceCityDistrict.value[2].label;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //------------------------------表格数据选择器-------------------------------------
|
|
|
+
|
|
|
+ const customerSelectRef = ref(null);
|
|
|
+
|
|
|
+ //表格选择器配置项
|
|
|
+ const bsTableBean = useBsTable({
|
|
|
+ tableOptions: {
|
|
|
+ isLoadRequest: false,
|
|
|
+ url: '/supports/customer/queryPage',
|
|
|
+ gridOptions: {
|
|
|
+ loading: false,
|
|
|
+ columns: [
|
|
|
+ {
|
|
|
+ field: 'id',
|
|
|
+ title: 'ID',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'customerName',
|
|
|
+ title: '甲方名称',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'customerType',
|
|
|
+ title: '甲方类型',
|
|
|
+ cellRender: {
|
|
|
+ name: 'CellDict',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ field: 'provinceCityDistrict',
|
|
|
+ title: '省市区',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: '测试数据',
|
|
|
+ dictField: [
|
|
|
+ {
|
|
|
+ dictKeyId: '',
|
|
|
+ dictValueId: '',
|
|
|
+ remark: '',
|
|
|
+ sort: 3,
|
|
|
+ status: 1,
|
|
|
+ valueCode: '03',
|
|
|
+ valueName: '微信公众号',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ ], // 模拟数据源
|
|
|
+ },
|
|
|
+ searchConfig: {
|
|
|
+ enabled: false,
|
|
|
+ fieldSpan: 4,
|
|
|
+ fields: [
|
|
|
+ {
|
|
|
+ field: 'customerName',
|
|
|
+ label: '',
|
|
|
+ component: 'a-input',
|
|
|
+ componentProps: {
|
|
|
+ placeholder: '请输入客户名称',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ pagerConfig: {
|
|
|
+ enable: true,
|
|
|
+ pageSize: 10,
|
|
|
+ pageNum: 1,
|
|
|
+ },
|
|
|
+ toolbarConfig: {
|
|
|
+ enable: false,
|
|
|
+ },
|
|
|
+ // 每次查询接口之前,都会调用这个回调函数
|
|
|
+ tableSearchBeforeBiz() {
|
|
|
+ console.log('表格搜索前');
|
|
|
+ },
|
|
|
+ // 表格初始化之前,只加载一次
|
|
|
+ beforeMount() {
|
|
|
+ console.log('表格加载前');
|
|
|
+ },
|
|
|
+ // 表格初始化完成,只加载一次
|
|
|
+ mounted(gridRef) {
|
|
|
+ console.log('表格加载后', gridRef);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ });
|
|
|
+ //表格选择器开窗
|
|
|
+ function showSelectProj() {
|
|
|
+ customerSelectRef.value.showModal();
|
|
|
+ }
|
|
|
+ //表格选择器数据回显
|
|
|
+ function handleSelect(data) {
|
|
|
+ formModel.customerId = data[0].id;
|
|
|
+ formModel.customerName = data[0].customerName;
|
|
|
+ formModel.customerType = data[0].customerType[0].valueCode;
|
|
|
+ formModel.provinceCityDistrictPartA = data[0].provinceCityDistrict;
|
|
|
+ }
|
|
|
+</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>
|