Explorar o código

fix:服务商门户客户管理、账户管理

liqh hai 7 meses
pai
achega
ebb16161aa
Modificáronse 18 ficheiros con 1026 adicións e 1098 borrados
  1. 10 5
      src/api/market-manage/index.js
  2. 50 25
      src/views/market-manage/external-manage/account-manage/index.vue
  3. 32 24
      src/views/market-manage/external-manage/account-manage/modules/BankCardInfo.vue
  4. 72 60
      src/views/market-manage/external-manage/basic-info/index.vue
  5. 20 13
      src/views/market-manage/external-manage/customer-manage/customer-create/index.vue
  6. 71 5
      src/views/market-manage/external-manage/customer-manage/customer-list/index.vue
  7. 244 51
      src/views/market-manage/external-manage/customer-manage/single-customer/components/customer-info.vue
  8. 2 2
      src/views/market-manage/external-manage/customer-manage/single-customer/components/file-info.vue
  9. 51 19
      src/views/market-manage/external-manage/customer-manage/single-customer/components/project-list.vue
  10. 17 28
      src/views/market-manage/external-manage/customer-manage/single-customer/index.vue
  11. 81 184
      src/views/market-manage/external-manage/project-manage/project-create/index.vue
  12. 133 68
      src/views/market-manage/external-manage/project-manage/project-list/index.vue
  13. 0 58
      src/views/market-manage/external-manage/project-manage/single-project/components/customer-info.vue
  14. 0 259
      src/views/market-manage/external-manage/project-manage/single-project/components/invoice-list.vue
  15. 231 0
      src/views/market-manage/external-manage/project-manage/single-project/components/project-info.vue
  16. 0 262
      src/views/market-manage/external-manage/project-manage/single-project/components/project-list.vue
  17. 12 31
      src/views/market-manage/external-manage/project-manage/single-project/index.vue
  18. 0 4
      src/views/support/portal-configure/portal-configure.vue

+ 10 - 5
src/api/market-manage/index.js

@@ -21,7 +21,7 @@ export const clientManageApi = {
 
   //项目新增表单提交
   ProjectAddition: (params) => {
-    return postRequest('/supports/project/create', params);
+    return postRequest('/portal/project/create', params);
   },
 
   //单项目详情查询
@@ -37,12 +37,17 @@ export const clientManageApi = {
 
   //------------------ 银行账户信息 -------------------
   //银行账号新增表单提交
-  FileAddition: (params) => {
-    return postRequest('/supports/biz/file/create', params);
+  BandCardAddition: (params) => {
+    return postRequest('/portal/provider/bank/create', params);
   },
 
   //银行账号修改表单提交
-  FileAddition: (params) => {
-    return postRequest('/supports/biz/file/create', params);
+  BandCardUpdate: (params) => {
+    return postRequest('/portal/provider/bank/create', params);
+  },
+
+  //银行账号删除
+  DeleteBankCard: (params) => {
+    return postRequest('/portal/provider/bank/delete', params);
   },
 };

+ 50 - 25
src/views/market-manage/external-manage/account-manage/index.vue

@@ -13,15 +13,17 @@
       </template>
     </bs-table>
   </div>
-  <BankCardInfo ref="BankCardInfoRef"></BankCardInfo>
+  <BankCardInfo ref="BankCardInfoRef" :refreshTable="refreshTable"></BankCardInfo>
 </template>
 
 <script setup lang="jsx">
   import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
   import { onMounted, ref, watch } from 'vue';
   import { useRouter } from 'vue-router';
+  import { message } from 'ant-design-vue';
 
-  import BankCardInfo from "./modules/BankCardInfo.vue"
+  import BankCardInfo from './modules/BankCardInfo.vue';
+  import { clientManageApi } from '/@/api/market-manage/index.js';
 
   const BankCardInfoRef = ref();
 
@@ -33,7 +35,7 @@
     getTablePropsValue: getValue,
   } = useBsTable({
     tableOptions: {
-      url: '/supports/customer/queryPage',
+      url: '/supports/provider/bank/queryPage',
       gridOptions: {
         loading: false,
         columns: [
@@ -42,48 +44,53 @@
             width: 80,
             align: 'center',
           },
-          
+
           {
             title: '户号',
-            field: 'customerName',
+            field: 'bankName',
             align: 'center',
             width: 200,
           },
           {
             title: '银行卡号',
-            field: 'socialCode',
+            field: 'bankAccount',
             align: 'center',
             width: 200,
           },
           {
             title: '开户行',
-            field: 'provinceCityDistrict',
+            field: 'openBankName',
             align: 'center',
-            width: 200,
+            width: 250,
           },
           {
-            title: '行号',
-            field: 'provinceCityDistrict',
+            title: '行号',
+            field: 'innerBankNumber',
             align: 'center',
-            width: 200,
+            width: 150,
           },
           {
             title: '卡类型',
-            field: 'cooperationMark',
+            field: 'bankCardType',
             align: 'center',
             width: 100,
+            slots: {
+              default({ row, column }) {
+                return <span>{row?.bankCardType?.[0]?.valueName || ''}</span>;
+              },
+            },
           },
           {
             title: '开户行地址',
-            field: 'cooperationAmount',
+            field: 'bankAddress',
             align: 'center',
             width: 200,
           },
           {
             title: '操作时间',
-            field: 'customerManager',
+            field: 'createTime',
             align: 'center',
-            width: 100,
+            width: 150,
           },
           {
             field: 'opt',
@@ -95,15 +102,25 @@
               default({ row, column }) {
                 return (
                   <>
-                  <a-button
-                    type='text'
-                    size='small'
-                    onClick={() => {
-                      goDetailPage(row);
-                    } }
-                  >
+                    <a-button
+                      type='text'
+                      size='small'
+                      onClick={() => {
+                        goDetailPage(row);
+                      }}
+                    >
                       编辑
-                    </a-button></>
+                    </a-button>
+                    <a-button
+                      type='text'
+                      size='small'
+                      onClick={() => {
+                        goDeleteBankCard(row);
+                      }}
+                    >
+                      删除
+                    </a-button>
+                  </>
                 );
               },
             },
@@ -142,11 +159,19 @@
   });
 
   const router = useRouter();
-  
-  //新增银行卡信息
+
+  //新增| 编辑银行卡信息
   function goDetailPage(record) {
     BankCardInfoRef.value.showModal(record);
   }
+
+  //删除银行卡信息
+  function goDeleteBankCard(record) {
+    console.log('recode',record);
+    clientManageApi.DeleteBankCard(record.id);
+    message.success('删除成功');
+    fetchTableData();
+  }
 </script>
 
 <style scoped lang="scss">

+ 32 - 24
src/views/market-manage/external-manage/account-manage/modules/BankCardInfo.vue

@@ -6,43 +6,49 @@
 -->
 <template>
   <a-modal v-model:open="visible" width="60%" title="银行卡信息" @ok="onSubmit" @cancel="closeModal" destroyOnClose>
-    <a-form class="smart-query-form" ref="formRef" labelWrap :label-col="labelCol" :model="form" :rules="rules">
+    <a-form class="smart-query-form" ref="formRef" labelWrap :label-col="labelCol" :model="formModel" :rules="rules">
       <div class="cost-compose">
         <div class="basic-info">
           <div class="basic-info-form">
             <a-row :gutter="16" class="smart-query-form-row">
               <a-col :span="12">
-                <a-form-item label="开户名称" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="开户名称" name="bankName" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.bankName" placeholder="请输入开户名称" />
                 </a-form-item>
               </a-col>
               <a-col :span="12">
-                <a-form-item label="银行卡账号" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="银行卡账号" name="bankAccount" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.bankAccount" placeholder="请输入银行卡账号" />
                 </a-form-item>
               </a-col>
             </a-row>
             <a-row :gutter="16" class="smart-query-form-row">
               <a-col :span="12">
-                <a-form-item label="开户行" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="开户行" name="openBankName" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.openBankName" placeholder="请输入开户行" />
                 </a-form-item>
               </a-col>
               <a-col :span="12">
-                <a-form-item label="行号" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="联行号" name="innerBankNumber" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.innerBankNumber" placeholder="请输入联行号" />
                 </a-form-item>
               </a-col>
             </a-row>
             <a-row :gutter="16" class="smart-query-form-row">
               <a-col :span="12">
-                <a-form-item label="开户行地址" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="开户行地址" name="bankAddress" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.bankAddress" placeholder="请输入开户行地址" />
                 </a-form-item>
               </a-col>
               <a-col :span="12">
-                <a-form-item label="卡类型" name="fileType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_CUSTOMER_FILE_TYPE" v-model:value="form.fileType" placeholder="请选择文件类别" width="100%" />
+                <a-form-item label="卡类型" name="bankCardType" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_COMMON_BANK_TYPE"
+                    v-model:value="formModel.bankCardType"
+                    placeholder="请选择卡类型"
+                    width="100%"
+                    @change="resetFromDate"
+                  />
                 </a-form-item>
               </a-col>
             </a-row>
@@ -80,14 +86,15 @@
   const formRef = ref();
 
   const formDefault = {
-    bizId: undefined, // 项目id
-    fileType: undefined, // 文件类别
-    remark: undefined, //备注
-    attachment: undefined, // 文件
-    bizModule: 'customer', //标记 文件来源
+    bankName: undefined, //开户名称
+    bankAccount: undefined, //银行卡号
+    openBankName: undefined, //开户行
+    innerBankNumber: undefined, //联行号
+    bankAddress: undefined, //银行地址
+    bankCardType: undefined, //银行卡类型
   };
 
-  let form = reactive({
+  let formModel = reactive({
     ...formDefault,
   });
 
@@ -98,12 +105,12 @@
 
   // 重置表单数据
   function resetFormData() {
-    Object.assign(form, formDefault);
+    Object.assign(formModel, formDefault);
   }
 
   // ----------------------- form 表单 ---------------------
   function onSubmit() {
-    console.log('form', form);
+    console.log('formModel', formModel);
     formRef.value
       .validateFields()
       .then((values) => {
@@ -124,18 +131,19 @@
   }
 
   const postFileData = async () => {
-    await clientManageApi.FileAddition(form);
+    await clientManageApi.BandCardAddition(formModel);
     message.success('提交成功');
     emits('refreshTable');
     onClose();
   };
   //更新表单数据
   function updateFormData(data) {
-    console.log('kaishishfishf');
+    Object.assign(formModel, data);
+    formModel.bankCardType = data?.bankCardType?.[0].valueCode;
   }
 
   function onClose() {
-    Object.assign(form, formDefault);
+    Object.assign(formModel, formDefault);
     visible.value = false;
   }
 

+ 72 - 60
src/views/market-manage/external-manage/basic-info/index.vue

@@ -8,62 +8,72 @@
               <div class="basic-title-line"></div>
               <span class="basic-title-text">基本信息</span>
             </div>
-            <div class="basic-title-right">
-            </div>
+            <div class="basic-title-right"></div>
           </div>
           <div class="steps-content">
             <a-row :gutter="24" class="smart-query-form-row">
               <a-col :span="8">
-                <a-form-item label="服务商名称" name="customerName" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.customerName" placeholder="请输入服务商名称"  disabled/>
-                </a-form-item>
-              </a-col>
-              <a-col :span="8">
-                <a-form-item label="服务商地址" name="customerType" class="smart-query-form-item">
-                    <a-input v-model:value="formModel.customerName" placeholder="请输入服务商地址" disabled/>
+                <a-form-item label="服务商类型" name="customerType" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_PROVIDER_TYPE"
+                    v-model:value="formModel.customerType"
+                    placeholder="请选择服务商类型"
+                    width="100%"
+                    disabled
+                  />
                 </a-form-item>
               </a-col>
-              <a-col :span="8">
-                <a-form-item label="服务商类型" name="customerType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_PROVIDER_TYPE" v-model:value="formModel.customerType" placeholder="请选择服务商类型" width="100%" disabled/>
+            </a-row>
+            <a-row :gutter="24" class="smart-query-form-row">
+              <a-col :span="24">
+                <a-form-item label="企业名称" name="customerType" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_PROVIDER_TYPE"
+                    v-model:value="formModel.customerType"
+                    placeholder="请选择企业名称"
+                    width="100%"
+                    disabled
+                  />
                 </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="socialCode" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.socialCode" placeholder="请输入统一社会代码" disabled/>
+                <a-form-item label="所在地区" name="socialCode" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.socialCode" placeholder="请输入所在地区" disabled />
                 </a-form-item>
               </a-col>
               <a-col :span="8">
-                <a-form-item label="注册时间" name="companyRegisterDate" class="smart-query-form-item">
-                  <a-date-picker v-model:value="formModel.companyRegisterDate" placeholder="注册时间" value-format="YYYY-MM-DD" style="width: 100%" disabled/>
+                <a-form-item label="省市区" name="companyRegisterDate" 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="companyRegisterCapital" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.companyRegisterCapital" placeholder="请输入注册资本" disabled/>
+                <a-form-item label="详细地址" name="companyRegisterCapital" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.companyRegisterCapital" placeholder="请输入详细地址" disabled />
                 </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="1"
-                    buttonText="上传营业执照"
-                    listType="picture-card"
-                    @change="changeAttachment"
-                    disabled
-                  />
+              <a-col :span="8">
+                <a-form-item label="统一社会代码" name="socialCode" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.socialCode" placeholder="请输入统一社会代码" disabled />
                 </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="invoiceTitle" class="smart-query-form-item">
-                  <a-textarea v-model:value="formModel.invoiceTitle" placeholder="请输入经营范围" disabled/>
+              <a-col :span="8">
+                <a-form-item label="法定代表人" name="companyRegisterDate" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.socialCode" placeholder="请输入法定代表人" disabled />
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="销售团队" name="companyRegisterCapital" class="smart-query-form-item">
+                  <a-input-number v-model:value="formModel.companyRegisterCapital" placeholder="请输入销售团队" style="width: 100%" disabled />
                 </a-form-item>
               </a-col>
             </a-row>
@@ -73,7 +83,7 @@
           <div class="basic-title">
             <div class="basic-title-left">
               <div class="basic-title-line"></div>
-              <span class="basic-title-text">联系人信息</span>
+              <span class="basic-title-text">其他信息</span>
             </div>
             <div class="basic-title-right">
               <!-- <a-button type="primary">提交</a-button> -->
@@ -83,49 +93,51 @@
             <a-row :gutter="16" class="smart-query-form-row">
               <a-col :span="8">
                 <a-form-item label="联系人" name="invoiceTitle" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.invoiceTitle" placeholder="请输入联系人" disabled/>
+                  <a-input v-model:value="formModel.invoiceTitle" placeholder="请输入联系人" disabled />
                 </a-form-item>
               </a-col>
               <a-col :span="8">
                 <a-form-item label="联系电话" name="invoiceCode" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.invoiceCode" placeholder="请输入联系电话" disabled/>
+                  <a-input v-model:value="formModel.invoiceCode" placeholder="请输入联系电话" disabled />
                 </a-form-item>
               </a-col>
               <a-col :span="8">
-                <a-form-item label="职务" name="invoiceAddress" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.invoiceAddress" placeholder="请输入职务" disabled/>
+                <a-form-item label="当前职务" name="invoiceAddress" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.invoiceAddress" placeholder="请输入职务" disabled />
                 </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="invoiceMobile" class="smart-query-form-item">
-                  <a-input v-model:value="formModel.invoiceMobile" placeholder="请输入身份证件号" disabled/>
+                <a-form-item label="是否有项目在手" name="invoiceTitle" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.invoiceTitle" placeholder="是否有项目在手" disabled />
                 </a-form-item>
               </a-col>
             </a-row>
-            <a-row :gutter="16" class="smart-query-form-row upload-row">
-              <a-col :span="8">
-                <a-form-item label="身份证人像面" name="attachment" class="smart-query-form-item">
-                  <Upload
-                    :defaultFileList="defaultFileList"
-                    :maxUploadSize="1"
-                    buttonText="上传身份证人像面"
-                    listType="picture-card"
-                    @change="changeAttachment"
-                    disabled
-                  />
+            <a-row :gutter="16" class="smart-query-form-row">
+              <a-col :span="24">
+                <a-form-item label="企业业务简介" name="invoiceTitle" class="smart-query-form-item">
+                  <a-textarea v-model:value="formModel.invoiceTitle" placeholder="企业业务简介" disabled />
                 </a-form-item>
               </a-col>
-              <a-col :span="8">
-                <a-form-item label="身份证国徽面" name="attachment" class="smart-query-form-item">
+            </a-row>
+            <a-row :gutter="16" class="smart-query-form-row">
+              <a-col :span="24">
+                <a-form-item label="业务资源简介" name="invoiceTitle" class="smart-query-form-item">
+                  <a-textarea v-model:value="formModel.invoiceTitle" placeholder="业务资源简介" disabled />
+                </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="1"
-                    buttonText="上传身份证国徽面"
-                    listType="picture-card"
+                    :maxUploadSize="10"
+                    buttonText="上传附件"
+                    listType="text"
+                    extraMsg="最多上传10个附件"
                     @change="changeAttachment"
-                    disabled
                   />
                 </a-form-item>
               </a-col>
@@ -144,6 +156,7 @@
   import { clientManageApi } from '/@/api/market-manage/index.js';
   import DictSelect from '/@/components/support/dict-select/index.vue';
   import Upload from '/@/components/support/file-upload/index.vue';
+  import AreaCascader from '/@/components/framework/area-cascader/index.vue';
 
   const stepFormRef = ref(null);
   const router = useRouter();
@@ -163,7 +176,6 @@
     companyRegisterCapital: undefined, //身份证件号
     companyRegisterDate: undefined, //身份证正面
     customerDescription: undefined, //身份证反面
-    
   });
 
   // --------------------- 校验规则 ---------------------
@@ -173,7 +185,7 @@
     invoiceMobile: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }],
   };
 
-  const labelCol = { style: { width: '110px', height: '50px' } };
+  const labelCol = { style: { width: '120px', height: '50px' } };
 
   // ----------------------- 上传附件 ----------------------------
   // 已上传的附件列表
@@ -263,7 +275,7 @@
 
     .steps-content {
       margin-top: 14px;
-      .smart-query-form-item{
+      .smart-query-form-item {
       }
     }
 

+ 20 - 13
src/views/market-manage/external-manage/customer-manage/customer-create/index.vue

@@ -34,7 +34,13 @@
               </a-col>
               <a-col :span="8">
                 <a-form-item label="客户类型" name="customerType" class="smart-query-form-item">
-                  <a-select :options="customerTypesOption"  v-model:value="formModel.customerType"  placeholder="请选择客户类型"  @update:value="handleSelectChange" allowClear></a-select>
+                  <a-select
+                    :options="customerTypesOption"
+                    v-model:value="formModel.customerType"
+                    placeholder="请选择客户类型"
+                    @update:value="handleSelectChange"
+                    allowClear
+                  ></a-select>
                 </a-form-item>
               </a-col>
             </a-row>
@@ -119,6 +125,7 @@
                       v-model:value="formModel.companyRegisterDate"
                       placeholder="注册时间"
                       value-format="YYYY-MM-DD"
+                      format="YYYY-MM-DD"
                       style="width: 100%"
                     />
                   </a-form-item>
@@ -214,7 +221,7 @@
   </a-card>
 </template>
 <script setup>
-  import { onMounted, reactive, ref, useAttrs,watch } from 'vue';
+  import { onMounted, reactive, ref, useAttrs, watch } from 'vue';
   import { useRouter } from 'vue-router';
   import { message, Modal } from 'ant-design-vue';
   import _ from 'lodash';
@@ -290,10 +297,10 @@
     { immediate: true }
   );
 
-   // 处理选择变化的逻辑
-    const handleSelectChange = (value) => {
-      formModel.customerType = [value];
-    };
+  // 处理选择变化的逻辑
+  const handleSelectChange = (value) => {
+    formModel.customerType = [value];
+  };
 
   // --------------------- 校验规则 ---------------------
   const formRules = {
@@ -307,6 +314,7 @@
   // 已上传的附件列表
   const defaultFileList = ref([]);
   function changeAttachment(fileList) {
+    console.log("fileList",fileList);
     defaultFileList.value = fileList;
     formModel.attachment = _.isEmpty(fileList) ? [] : fileList;
   }
@@ -346,13 +354,12 @@
   const workProvinceCityDistrict = ref([]);
   function changeArea(value, selectedOptions) {
     Object.assign(formModel, {
-      workProvince: undefined, //省份
-      workProvinceName: undefined,
-      workCity: undefined, //城市
-      workCityName: undefined,
-      workDistrict: undefined, //区或县
-      workDistrictName: undefined,
-      workAddress: undefined, //详细地址
+      province: '',
+      provinceName: '',
+      city: '',
+      cityName: '',
+      district: '',
+      districtName: '',
     });
     if (!_.isEmpty(selectedOptions)) {
       // 地区信息

+ 71 - 5
src/views/market-manage/external-manage/customer-manage/customer-list/index.vue

@@ -1,5 +1,15 @@
 <template>
   <div class="table-demo">
+    <a-tabs v-model:activeKey="activeKey" class="tabs">
+      <a-tab-pane v-for="(item, index) in tabsOptions" :key="index">
+        <template #tab>
+          <span @click="item.onClick(item.params)" style="font-size: 16px">
+            <component :is="item.icon"></component>
+            {{ item.title }}
+          </span>
+        </template>
+      </a-tab-pane>
+    </a-tabs>
     <bs-table v-bind="tableOptions">
       <template #toolbarLeft>
         <a-space>
@@ -17,9 +27,45 @@
 
 <script setup lang="jsx">
   import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
-  import { onMounted, ref, watch } from 'vue';
+  import { onMounted, ref, watch, nextTick } from 'vue';
   import { useRouter } from 'vue-router';
 
+  const router = useRouter();
+  const selectedStatus = ref(''); // 定义状态变量
+  const pagerConfig1 = ref('1');
+
+  //自定义tab页切换信息
+  const tabsOptions = [
+    {
+      title: `全部(${pagerConfig1.value})`,
+      icon: 'AppstoreOutlined',
+      params: {
+        a: 1,
+      },
+      onClick: (value) => {
+        console.log(value);
+        searchFormDate();
+      },
+    },
+    {
+      title: `审核中(${pagerConfig1.value})`,
+      icon: 'FileSyncOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('shz');
+      },
+    },
+    {
+      title: `无效客户(${pagerConfig1.value})`,
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+  ];
+
+  //自定义表单信息
   const {
     tableOptions,
     fetchTableData,
@@ -30,6 +76,9 @@
       url: '/supports/customer/queryPage',
       gridOptions: {
         loading: false,
+        cellConfig: {
+          height: '50px',
+        },
         columns: [
           {
             type: 'seq',
@@ -165,7 +214,11 @@
       toolbarConfig: {},
       tableSearchBeforeBiz() {
         const searchParams = getValue('searchConfig.data');
-        setValue('searchConfig.data', { ...searchParams });
+        setValue('searchConfig.data', { ...searchParams, status: selectedStatus.value });
+      },
+       mounted() {
+      const total = getValue('pagerConfig');
+      console.log('pagerConfig1', total);
       },
     },
   });
@@ -173,10 +226,13 @@
   onMounted(() => {
     console.log('表格已加载');
   });
+  //自定义搜索传值
+  function searchFormDate(status) {
+    selectedStatus.value = status; // 更新状态值
+    fetchTableData(); // 触发表格数据的重新加载
+  }
 
-  const router = useRouter();
-
-  //查看客户详情
+  //新增客户信息
   function goAddCustomerPage(record) {
     console.log('record', record);
     router.push({
@@ -198,5 +254,15 @@
 
 <style scoped lang="scss">
   .table-demo {
+    background-color: #fff;
+    height: 100%;
+
+    .tabs {
+      padding: 0 24px;
+
+      :deep(.anticon) {
+        margin: 0;
+      }
+    }
   }
 </style>

+ 244 - 51
src/views/market-manage/external-manage/customer-manage/single-customer/components/customer-info.vue

@@ -1,58 +1,251 @@
 <template>
-  <a-flex style="padding: 0 20px" vertical gap="large">
-    <a-descriptions v-for="desc in customerInfo" :key="desc.title" :title="desc.title" :column="4">
-      <a-descriptions-item v-for="item in desc.descItem" :key="item.id" :label="item.label" :span="item.span">
-        {{ item.value }}
-      </a-descriptions-item>
-    </a-descriptions>
-  </a-flex>
+  <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"></div>
+          </div>
+          <div class="steps-content">
+            <a-row :gutter="24" class="smart-query-form-row">
+             <a-col :span="16">
+                <a-form-item label="客户地区" name="regionType" class="smart-query-form-item">
+                  <a-span>{{ formModel.regionType }}</a-span>
+                </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="customerName" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerName }}</a-span>
+                </a-form-item>
+              </a-col>
+              
+              <a-col :span="8">
+                <a-form-item label="类型" name="customerType" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerType }}</a-span>
+                </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="socialCode" class="smart-query-form-item">
+                   <a-span>{{ formModel.socialCode }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="法定代表人" name="legalPerson" class="smart-query-form-item">
+                   <a-span>{{ formModel.legalPerson }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="存续状态" name="survivalStatus" class="smart-query-form-item">
+                   <a-span>{{ formModel.survivalStatus }}</a-span>
+                </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="provinceCityDistrict" class="smart-query-form-item">
+                   <a-span>{{ formModel.provinceCityDistrict }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="注册详细地址" name="address" class="smart-query-form-item">
+                   <a-span>{{ formModel.address }}</a-span>
+                </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="companyRegisterDate" class="smart-query-form-item">
+                  <a-span>{{ formModel.companyRegisterDate }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="注册资本" name="companyRegisterCapital" class="smart-query-form-item">
+                  <a-span>{{ formModel.companyRegisterCapital }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="官网地址" name="officialWebsite" class="smart-query-form-item">
+                  <a-span>{{ formModel.officialWebsite }}</a-span>
+                </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="customerDescription" class="smart-query-form-item">
+                   <a-span>{{ formModel.customerDescription }}</a-span>
+                </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="customerNature" class="smart-query-form-item">
+                   <a-span>{{ formModel.customerNature }}</a-span>
+                </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="customerManager" class="smart-query-form-item">
+                 <a-span>{{ formModel.customerManager }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="初始对接人电话" name="customerManagerMobile" class="smart-query-form-item">
+                   <a-span>{{ formModel.customerManagerMobile }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="办公省市区" name="workProvinceCityDistrict" class="smart-query-form-item">
+                   <a-span>{{ formModel.workProvinceCityDistrict }}</a-span>
+                </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="workAddress" class="smart-query-form-item">
+                   <a-span>{{ formModel.workAddress }}</a-span>
+                </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="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, watchEffect } from 'vue';
+  import { useRouter } from 'vue-router';
+  import { message, Modal } from 'ant-design-vue';
 
-<script setup name="客户信息">
-import { ref, onMounted, watchEffect } from 'vue';
-
-const props = defineProps({
-  id: {
-    type: String,
-  },
-  descData: {
-    type: Object,
-  },
-});
-
-const customerInfo = ref([]);
-
-onMounted(() => {
-  updateCustomerInfo();
-});
-
-watchEffect(() => {
-  updateCustomerInfo();
-});
-
-function updateCustomerInfo() {
-  customerInfo.value = [
-    {
-      title: '基本信息',
-      descItem: [
-        { label: '客户编号', value: props.descData?.customerCode },
-        { label: '客户名称', value: props.descData?.customerName },
-      ],
+  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';
+
+  const props = defineProps({
+    id: {
+      type: String,
     },
-    {
-      title: '企业信息',
-      descItem: [
-        { label: '公司名称', value: props.descData?.customerName },
-        { label: '统一社会信用代码', value: props.descData?.socialCode },
-        { label: '电话', value: props.descData?.customerManagerMobile, span: 2 },
-        { label: '注册资本', value: props.descData?.companyRegisterCapital },
-        { label: '注册时间', value: props.descData?.companyRegisterDate },
-        { label: '注册地址', value: props.descData?.address, span: 2 },
-        { label: '企业简介', value: props.descData?.customerDescription },
-      ],
+    descData: {
+      type: Object,
+      default: () => ({}), // 提供默认值,避免初始值为 null 导致错误
     },
-  ];
-}
+  });
+  // ---------------------- 表格样式配置 ----------------------------
+  const labelCol = { style: { width: '120px' } };
+  // ---------------------- 字段自定义 ----------------------------
+  const formModel = reactive({});
+  const stepFormRef = ref(null);
+
+  watchEffect(() => {
+    if (props.descData) {
+      Object.assign(formModel, _.cloneDeep(props.descData));
+      formModel.survivalStatus=props?.descData?.survivalStatus?.[0].valueCode
+      formModel.customerType=props?.descData?.customerType?.[0].valueName
+      formModel.regionType=props?.descData?.regionType?.[0].valueName
+    }
+  });
+
+  onMounted(() => {
+    console.log('子组件接收到的 descData:', props.descData);
+  });
 </script>
 
-<style lang="less" scoped></style>
+<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>

+ 2 - 2
src/views/market-manage/external-manage/customer-manage/single-customer/components/file-info.vue

@@ -44,7 +44,7 @@
             title: '文件名称',
             // field: 'fileType',
             align: 'center',
-            width: 300,
+            width: 400,
             slots: {
               default({ row, column }) {
                 return <span>{row?.attachment?.[0]?.fileName || ''}</span>;
@@ -55,7 +55,7 @@
             title: '文件类别',
             // field: 'fileType',
             align: 'center',
-            width: 100,
+            width: 200,
             slots: {
               default({ row, column }) {
                 return <span>{row?.fileType?.[0]?.valueName || ''}</span>;

+ 51 - 19
src/views/market-manage/external-manage/customer-manage/single-customer/components/project-list.vue

@@ -1,13 +1,16 @@
 <template>
   <div class="table-demo">
-    <bs-table v-bind="tableOptions">
-      <template #searchRight>
-        <a-space>
-        </a-space>
-      </template>
-      <template #toolbarLeft>
-      </template>
-    </bs-table>
+    <a-tabs v-model:activeKey="activeKey" class="tabs">
+      <a-tab-pane v-for="(item, index) in tabsOptions" :key="index">
+        <template #tab>
+          <span @click="item.onClick(item.params)" style="font-size: 16px;">
+            <component :is="item.icon"></component>
+            {{ item.title }}
+          </span>
+        </template>
+      </a-tab-pane>
+    </a-tabs>
+    <bs-table v-bind="tableOptions"> </bs-table>
   </div>
 </template>
 
@@ -16,6 +19,41 @@
   import { onMounted, ref, watch } from 'vue';
   import { useRouter } from 'vue-router';
 
+  const selectedStatus = ref(''); // 定义状态变量
+  const router = useRouter();
+
+  //自定义tab页切换信息
+  const tabsOptions = [
+    {
+      title: '全部',
+      icon: 'AppstoreOutlined',
+      params: {
+        a: 1,
+      },
+      onClick: (value) => {
+        console.log(value);
+        searchFormDate();
+      },
+    },
+    {
+      title: '审核中',
+      icon: 'FileSyncOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('shz');
+      },
+    },
+    {
+      title: '无效客户',
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+  ];
+
+  //自定义表单信息
   const {
     tableOptions,
     fetchTableData,
@@ -185,7 +223,7 @@
       toolbarConfig: {},
       tableSearchBeforeBiz() {
         const searchParams = getValue('searchConfig.data');
-        setValue('searchConfig.data', { ...searchParams});
+        setValue('searchConfig.data', { ...searchParams, status: selectedStatus.value });
       },
     },
   });
@@ -194,16 +232,10 @@
     console.log('表格已加载');
   });
 
-  const router = useRouter();
-
-  function goDetailPage(record) {
-    console.log('record', record);
-    router.push({
-      path: '/market-manage/external-manage/project-manage/single-project/',
-      query: {
-        id: record.id,
-      },
-    });
+  //自定义搜索传值
+  function searchFormDate(status) {
+    selectedStatus.value = status; // 更新状态值
+    fetchTableData(); // 触发表格数据的重新加载
   }
 </script>
 

+ 17 - 28
src/views/market-manage/external-manage/customer-manage/single-customer/index.vue

@@ -7,12 +7,12 @@
             <div class="header-info">
               <div class="header-info-top">
                 <span>{{ singleCusValue?.customerName }}</span>
-                <a-tag color="#D4AF37" style="font-size: 15px">{{ singleCusValue?.partnerLevel[0]?.valueName }}</a-tag>
+                <a-tag color="#D4AF37" style="font-size: 15px">111</a-tag>
               </div>
               <div class="header-info-bottom">
                 <div>
                   客户类型:
-                  <span>{{ singleCusValue?.customerType[0]?.valueName }}</span>
+                  <span>{{ singleCusValue?.customerType?.[0]?.valueName }}</span>
                 </div>
                 <div>
                   客户编码:
@@ -49,19 +49,21 @@
   import { clientManageApi } from '/@/api/market-manage/index.js';
   import { useRouter } from 'vue-router';
 
+  
+  onMounted(() => {
+    getSingleCustomerList();
+  });
+
   const router = useRouter();
   const query = router.currentRoute.value.query;
-  const singleCusValue = ref({
-    customerName: '',
-    partnerLevel: [],
-    customerType: [],
-  });
+
+  const singleCusValue = ref();
 
   const descList = ref([
-    { id: '1', label: '合同数量', value: '' },
-    { id: '2', label: '累计产值', value: '' },
-    { id: '3', label: '已开票', value: '' },
-    { id: '4', label: '未开票', value: '' },
+    { id: '1', label: '合同数量', value: '0' },
+    { id: '2', label: '累计合同额', value: '0' },
+    { id: '3', label: '联系人', value: '0' },
+    { id: '4', label: '联系电话', value: '0' },
   ]);
 
   const tabKey = ref('0');
@@ -78,24 +80,11 @@
     },
     {
       key: '2',
-      tab: '结算管理',
-      component: defineAsyncComponent(() => import('./components/settlement-list.vue')),
-    },
-    {
-      key: '3',
-      tab: '开票管理',
-      component: defineAsyncComponent(() => import('./components/invoice-list.vue')),
-    },
-    {
-      key: '4',
       tab: '文件资料',
       component: defineAsyncComponent(() => import('./components/file-info.vue')),
     },
   ];
 
-  onMounted(() => {
-    getSingleCustomerList();
-  });
 
   // 查询列表
   function getSingleCustomerList() {
@@ -104,10 +93,10 @@
         singleCusValue.value = res.data;
         // 动态更新 descList
         descList.value = [
-          { id: '1', label: '合同数量', value: singleCusValue.value.contractQuantity },
-          { id: '2', label: '累计产值', value: singleCusValue.value.totalOutputValue },
-          { id: '3', label: '已开票', value: singleCusValue.value.invoiceAmount },
-          { id: '4', label: '未开票', value: singleCusValue.value.unlicensedAmount },
+          { id: '1', label: '合同数量', value: singleCusValue.value.customerManager },
+          { id: '2', label: '累计合同额', value: singleCusValue.value.customerManager },
+          { id: '3', label: '联系人', value: singleCusValue.value.customerManager },
+          { id: '4', label: '联系电话', value: singleCusValue.value.customerManagerMobile },
         ];
       },
       (err) => {

+ 81 - 184
src/views/market-manage/external-manage/project-manage/project-create/index.vue

@@ -6,72 +6,33 @@
           <div class="basic-title">
             <div class="basic-title-left">
               <div class="basic-title-line"></div>
-              <span class="basic-title-text">甲方信息</span>
+              <span class="basic-title-text">线索登记</span>
             </div>
             <div class="basic-title-right">
-              <a-button type="primary" @click="submit">提交</a-button>
+               <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 label="项目类型" name="projectType" class="smart-query-form-item">
+                  <DictSelect key-code="BLINK_MARKET_PROJECT_TYPE" v-model:value="formModel.projectType" placeholder="请选择项目类型" width="100%" />
                 </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 label="线索名称" name="clueName" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.clueName" 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="majorType" class="smart-query-form-item">
-                  <DictSelect key-code="BLINK_PROJECT_MAJOR_TYPE" v-model:value="formModel.majorType" placeholder="请选择专业类型" width="100%" />
+                <a-form-item label="地区" name="countryRegion" class="smart-query-form-item">
+                  <DictSelect key-code="BLINK_COMMON_REGION" v-model:value="formModel.countryRegion" placeholder="请选择地区" width="100%" />
                 </a-form-item>
               </a-col>
               <a-col :span="8">
-                <a-form-item label="省市区" name="invoiceBankName" class="smart-query-form-item">
+                <a-form-item label="省市区" name="provinceCityDistrict" class="smart-query-form-item">
                   <AreaCascader
                     type="province_city_district"
                     style="width: 100%"
@@ -82,49 +43,84 @@
                 </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 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-row :gutter="24" 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 label="业主单位" name="landlordUnitId" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.landlordUnitId" placeholder="请输入业主单位" />
                 </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 label="工程属性" name="engineeringAttribute" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_MARKET_PROJECT_ENGINEERING_TYPE"
+                    v-model:value="formModel.engineeringAttribute"
+                    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 label="项目所属行业" name="belongIndustry" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_MARKET_PROJECT_INDUSTRY "
+                    v-model:value="formModel.belongIndustry"
+                    placeholder="请选择所属行业"
+                    width="100%"
+                  />
                 </a-form-item>
               </a-col>
             </a-row>
-            <a-row :gutter="16" class="smart-query-form-row">
+            <a-row :gutter="16" class="smart-query-form-row" v-if="!formModel?.projectType?.includes('02')">
               <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 label="招标平台" name="tenderPlatform" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.tenderPlatform" placeholder="请输入招标平台" />
                 </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 label="项目资金来源" name="financeSource" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_MARKET_PROJECT_FINANCE_SOURCE "
+                    v-model:value="formModel.financeSource"
+                    placeholder="请选择项目资金来源"
+                    width="100%"
+                  />
                 </a-form-item>
               </a-col>
+            </a-row>
+            <a-row :gutter="16" class="smart-query-form-row" v-if="!formModel?.projectType?.includes('02')">
               <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 label="是否联合体" name="coalitionUnitState" class="smart-query-form-item">
+                  <DictSelect
+                    key-code="BLINK_COMMON_JUDGE"
+                    v-model:value="formModel.coalitionUnitState"
+                    placeholder="请选择是否联合体"
+                    width="100%"
+                  />
+                </a-form-item>
+              </a-col>
+              <a-col :span="16">
+                <a-form-item label="联合体情况说明" name="coalitionDescription" class="smart-query-form-item">
+                  <a-input v-model:value="formModel.coalitionDescription" 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="projectRemark" class="smart-query-form-item">
-                  <a-textarea v-model:value="formModel.projectRemark" placeholder="请输入备注" />
+                <a-form-item label="项目背景" name="projectBackground" class="smart-query-form-item">
+                  <a-textarea v-model:value="formModel.projectBackground" placeholder="请输入项目背景" />
+                </a-form-item>
+              </a-col>
+            </a-row>
+            <a-row :gutter="16" class="smart-query-form-row" v-if="!formModel?.projectType?.includes('02')">
+              <a-col :span="24">
+                <a-form-item label="项目阶段" name="projectProgress" class="smart-query-form-item">
+                  <a-textarea v-model:value="formModel.projectProgress" placeholder="请输入项目阶段" />
                 </a-form-item>
               </a-col>
             </a-row>
@@ -136,7 +132,9 @@
               <div class="basic-title-line"></div>
               <span class="basic-title-text">其他信息</span>
             </div>
-            <div class="basic-title-right"></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">
@@ -172,7 +170,7 @@
   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'
+  import tableInfoSelect from '/@/components/BsUi/TableInfoSelect/TableInfoSelect.vue';
 
   const stepFormRef = ref(null);
   const router = useRouter();
@@ -181,22 +179,19 @@
   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, //附件集合
+    clueName: undefined,
+    countryRegion: undefined,
+    address: undefined,
+    landlordUnitId: undefined,
+    engineeringAttribute: undefined,
+    belongIndustry: undefined,
+    tenderPlatform: undefined,
+    financeSource: undefined,
+    coalitionUnitState: undefined,
+    coalitionDescription: undefined,
+    projectBackground: undefined,
+    projectProgress: undefined,
+    attachment: undefined,
   });
 
   // ---------------------- 表单校验规则 ---------------------------
@@ -207,12 +202,12 @@
   };
 
   // ---------------------- 表格样式配置 ----------------------------
-  const labelCol = { style: { width: '110px', height: '50px' } };
+  const labelCol = { style: { width: '120px', height: '50px' } };
 
   // ----------------------- 上传附件 ----------------------------
   // 已上传的附件列表
   const defaultFileList = ref([]);
-   // 附件列表触发事件
+  // 附件列表触发事件
   function changeAttachment(fileList) {
     defaultFileList.value = fileList;
     formModel.attachment = _.isEmpty(fileList) ? [] : fileList;
@@ -249,7 +244,6 @@
   //------------------------------地区-------------------------------------
 
   const provinceCityDistrict = ref([]);
-  const provinceCityDistrictPartA = ref([]);
   function changeArea(value, selectedOptions) {
     Object.assign(formModel, {
       province: '',
@@ -271,103 +265,6 @@
       }
     }
   }
-  //------------------------------表格数据选择器-------------------------------------
-
-  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">

+ 133 - 68
src/views/market-manage/external-manage/project-manage/project-list/index.vue

@@ -1,5 +1,15 @@
 <template>
   <div class="table-demo">
+    <a-tabs v-model:activeKey="activeKey" class="tabs">
+      <a-tab-pane v-for="(item, index) in tabsOptions" :key="index">
+        <template #tab>
+          <span @click="item.onClick(item.params)" style="font-size: 16px;">
+            <component :is="item.icon"></component>
+            {{ item.title }}
+          </span>
+        </template>
+      </a-tab-pane>
+    </a-tabs>
     <bs-table v-bind="tableOptions">
       <template #toolbarLeft>
         <a-space>
@@ -19,6 +29,63 @@
   import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
   import { onMounted, ref, watch } from 'vue';
   import { useRouter } from 'vue-router';
+  import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
+
+  const selectedStatus = ref(''); // 定义状态变量
+
+  const tabsOptions = [
+    {
+      title: '全部',
+      icon: 'AppstoreOutlined',
+      params: {
+        a: 1,
+      },
+      onClick: (value) => {
+        console.log(value);
+        searchFormDate();
+      },
+    },
+    {
+      title: '跟进中',
+      icon: 'FileSyncOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('shz');
+      },
+    },
+    {
+      title: '已签约',
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+    {
+      title: '交付中',
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+    {
+      title: '已结算',
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+    {
+      title: '无效信息',
+      icon: 'UserDeleteOutlined',
+      params: {},
+      onClick: (value) => {
+        searchFormDate('wxkh');
+      },
+    },
+  ];
 
   const {
     tableOptions,
@@ -33,21 +100,21 @@
         columns: [
           {
             type: 'seq',
-            width: 80,
+            width: 100,
             align: 'center',
           },
 
           {
             title: '项目名称',
-            field: 'projectName',
+            field: 'clueName',
             align: 'center',
             width: 200,
           },
           {
-            title: '项目类型',
+            title: '项目进度',
             // field: 'projectType',
             align: 'center',
-            width: 100,
+            width: 110,
             slots: {
               default({ row, column }) {
                 return <span>{row?.projectType?.[0]?.valueName || ''}</span>;
@@ -55,96 +122,78 @@
             },
           },
           {
-            title: '专业类型',
-            // field: 'majorType',
-            align: 'center',
-            width: 100,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.majorType?.[0]?.valueName || ''}</span>;
-              },
-            },
-          },
-          {
-            title: '省市区',
+            title: '项目地址',
             field: 'provinceCityDistrict',
             align: 'center',
             width: 200,
           },
           {
-            title: '详细地址',
-            field: 'address',
+            title: '甲方',
+            field: 'landlordUnitId',
             align: 'center',
-            width: 100,
+            width: 110,
           },
           {
-            title: '合同金额',
-            field: 'contractAmount',
+            title: '概算金额(万)',
+            field: 'address',
             align: 'center',
-            width: 100,
+            width: 150,
           },
           {
-            title: '招标方式',
+            title: '项目类型',
             // field: 'tendersType',
             align: 'center',
-            width: 100,
+            width: 110,
             slots: {
               default({ row, column }) {
-                return <span>{row?.tendersType?.[0]?.valueName || ''}</span>;
+                return <span>{row?.projectType?.[0]?.valueName || ''}</span>;
               },
             },
           },
           {
-            title: '预计开标日期',
-            field: 'bidOpenDate',
-            align: 'center',
-            width: 100,
-          },
-          {
-            title: '预计开工日期',
-            field: 'planStartDate',
-            align: 'center',
-            width: 100,
-          },
-          {
-            title: '预计完工日期',
-            field: 'planEndDate',
+            title: '工程属性',
+            // field: 'tendersType',
             align: 'center',
-            width: 100,
+            width: 110,
+            slots: {
+              default({ row, column }) {
+                return <span>{row?.engineeringAttribute?.[0]?.valueName || ''}</span>;
+              },
+            },
           },
           {
-            title: '预计工期',
-            field: 'planDays',
+            title: '对接营销经理',
+            field: 'bidOpenDate',
             align: 'center',
             width: 150,
           },
           {
-            title: '备注',
-            field: 'projectRemark',
+            title: '创建时间',
+            field: 'planStartDate',
             align: 'center',
             width: 150,
           },
           {
-            field: 'opt',
-            title: '操作',
-            width: '120px',
-            fixed: 'right',
-            align: 'center',
-            slots: {
-              default({ row, column }) {
-                return (
-                  <>
-                    <a-button
-                      type='text'
-                      size='small'
-                      onClick={() => {
-                        goDetailPage(row);
-                      }}
-                    >
-                      项目详情
-                    </a-button>
-                  </>
-                );
+            fixed: 'center',
+            cellRender: {
+              name: 'CellOption',
+              extraProps: {
+                buttons: [
+                  {
+                    title: '编辑',
+                    code: 'edit',
+                    display: ({ row }) => {
+                      return DISPLAY_STATE.VISIBLE;
+                    },
+                    disabled({ row }) {
+                      return false;
+                    },
+                    onClick({ row }) {
+                      goDetailPage(row);
+                    },
+                    extraProps: {},
+                  },
+                ],
               },
             },
           },
@@ -172,11 +221,11 @@
         fieldSpan: 4,
         fields: [
           {
-            field: 'customerName',
+            field: 'clueName',
             label: '',
             component: 'a-input',
             componentProps: {
-              placeholder: '请输入客户名称',
+              placeholder: '请输入项目名称',
             },
           },
         ],
@@ -189,7 +238,7 @@
       toolbarConfig: {},
       tableSearchBeforeBiz() {
         const searchParams = getValue('searchConfig.data');
-        setValue('searchConfig.data', { ...searchParams });
+        setValue('searchConfig.data', { ...searchParams,status: selectedStatus.value});
       },
     },
   });
@@ -200,6 +249,12 @@
 
   const router = useRouter();
 
+    //自定义搜索传值
+  function searchFormDate(status) {
+    selectedStatus.value = status; // 更新状态值
+    fetchTableData(); // 触发表格数据的重新加载
+  }
+
   //新增项目信息
   function goAddProjectPage(record) {
     console.log('record', record);
@@ -221,6 +276,16 @@
 </script>
 
 <style scoped lang="scss">
-  .table-demo {
+   .table-demo {
+    background-color: #fff;
+    height: 100%;
+
+    .tabs {
+      padding: 0 24px;
+
+      :deep(.anticon) {
+        margin: 0;
+      }
+    }
   }
 </style>

+ 0 - 58
src/views/market-manage/external-manage/project-manage/single-project/components/customer-info.vue

@@ -1,58 +0,0 @@
-<template>
-  <a-flex style="padding: 0 20px" vertical gap="large">
-    <a-descriptions v-for="desc in customerInfo" :key="desc.title" :title="desc.title" :column="4">
-      <a-descriptions-item v-for="item in desc.descItem" :key="item.id" :label="item.label" :span="item.span">
-        {{ item.value }}
-      </a-descriptions-item>
-    </a-descriptions>
-  </a-flex>
-</template>
-
-<script setup name="项目信息">
-import { ref, onMounted, watchEffect } from 'vue';
-
-const props = defineProps({
-  id: {
-    type: String,
-  },
-  descData: {
-    type: Object,
-  },
-});
-
-const customerInfo = ref([]);
-
-onMounted(() => {
-  updateCustomerInfo();
-});
-
-watchEffect(() => {
-  updateCustomerInfo();
-});
-
-function updateCustomerInfo() {
-  customerInfo.value = [
-    {
-      title: '基本信息',
-      descItem: [
-        { label: '客户编号', value: props.descData?.customerCode },
-        { label: '客户名称', value: props.descData?.customerName },
-      ],
-    },
-    {
-      title: '企业信息',
-      descItem: [
-        { label: '公司名称', value: props.descData?.customerName },
-        { label: '统一社会信用代码', value: props.descData?.socialCode },
-        { label: '电话', value: props.descData?.customerManagerMobile, span: 2 },
-        { label: '注册资本', value: props.descData?.companyRegisterCapital },
-        { label: '注册时间', value: props.descData?.companyRegisterDate },
-        { label: '注册地址', value: props.descData?.address, span: 2 },
-        { label: '企业简介', value: props.descData?.customerDescription },
-      ],
-    },
-  ];
-}
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 259
src/views/market-manage/external-manage/project-manage/single-project/components/invoice-list.vue

@@ -1,259 +0,0 @@
-<template>
-  <div class="table-demo">
-    <bs-table v-bind="tableOptions">
-      <template #searchRight>
-        <a-space>
-          <a-button type="primary" @click="goDetailPage">
-            <template #icon>
-              <PlusOutlined />
-            </template>
-            <span>新增</span>
-          </a-button>
-        </a-space>
-      </template>
-    </bs-table>
-  </div>
-</template>
-
-<script setup lang="jsx">
-  import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
-  import { onMounted, ref, watch } from 'vue';
-  import { useRouter } from 'vue-router';
-
-  const props = defineProps({
-    selectedRulesId: String,
-  });
-
-  const {
-    tableOptions,
-    fetchTableData,
-    setTablePropsValue: setValue,
-    getTablePropsValue: getValue,
-  } = useBsTable({
-    tableOptions: {
-      url: '/supports/risk/rule/queryPage',
-      gridOptions: {
-        loading: false,
-        columns: [
-          {
-            type: 'seq',
-            width: 80,
-            align: 'center',
-          },
-          {
-            title: '风险维度',
-            field: 'riskDimension',
-            width: 85,
-            ellipsis: true,
-            formatter: ({ cellValue }) => {
-              return cellValue && cellValue.length > 0 ? cellValue[0].valueName : '';
-            },
-          },
-          {
-            title: '风险模板',
-            // field: 'riskModel',
-            width: 85,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskModel?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '风险等级',
-            field: 'riskLevel',
-            width: 85,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskLevel?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '风险指标',
-            field: 'riskMetrics',
-            width: 110,
-            ellipsis: true,
-          },
-          {
-            title: '指标定义',
-            field: 'definedMetrics',
-            width: 100,
-            ellipsis: true,
-          },
-          {
-            title: '条件运算符',
-            field: 'operator',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.operator?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '条件控制值',
-            field: 'conditionalValue',
-            width: 100,
-            ellipsis: true,
-          },
-          {
-            title: '提醒方式',
-            field: 'remindWay',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.remindWay?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '提醒时间(每天)',
-            field: 'remindTime',
-            width: 120,
-            ellipsis: true,
-          },
-          {
-            title: '风险等级',
-            field: 'riskGrade',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskGrade?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '状态',
-            field: 'enable',
-            width: 100,
-            ellipsis: true,
-            // formatter: (cellValue) => {
-            //   return cellValue === 'true' ? '启用' : '禁用';
-            // },
-            slots: {
-              default({ row, column }) {
-                return <span>{row.enable === 'true' ? '启用' : '禁用'}</span>;
-              },
-            },
-          },
-          {
-            field: 'opt',
-            title: '操作',
-            width: '120px',
-            fixed: 'right',
-            align: 'center',
-            slots: {
-              default({ row, column }) {
-                return (
-                  <a-button
-                    type='text'
-                    size='small'
-                    onClick={() => {
-                      goDetailPage(row);
-                    }}
-                  >
-                    编辑
-                  </a-button>
-                );
-              },
-            },
-          },
-        ],
-        data: [
-          {
-            id: 1,
-            name: '测试数据',
-            dictField: [
-              {
-                dictKeyId: '',
-                dictValueId: '',
-                remark: '',
-                sort: 3,
-                status: 1,
-                valueCode: '03',
-                valueName: '微信公众号',
-              },
-            ],
-          },
-        ], // 模拟数据源
-      },
-      searchConfig: {
-        enabled: false,
-        fieldSpan: 4,
-        fields: [
-          {
-            field: 'name',
-            label: '',
-            component: 'a-input',
-            componentProps: {
-              placeholder: '请输入服务商名称',
-            },
-          },
-          {
-            field: 'name1',
-            label: '',
-            component: 'a-select',
-            componentProps: {
-              placeholder: '请选择地址',
-            },
-          },
-          {
-            field: 'name2',
-            label: '',
-            component: 'a-select',
-            componentProps: {
-              placeholder: '请选择服务商类型',
-            },
-          },
-        ],
-      },
-      pagerConfig: {
-        enabled: true,
-        pageSize: 10,
-        pageNum: 1,
-      },
-      toolbarConfig: {},
-      tableSearchBeforeBiz() {
-        const searchParams = getValue('searchConfig.data');
-        setValue('searchConfig.data', { ...searchParams, key: props.selectedRulesId });
-      },
-    },
-  });
-
-  // 监听 selectedRulesId 的变化
-  watch(
-    () => props.selectedRulesId,
-    (newVal, oldVal) => {
-      if (newVal !== oldVal) {
-        fetchTableData(newVal);
-      }
-    },
-    { immediate: true }
-  );
-
-  onMounted(() => {
-    console.log('表格已加载');
-  });
-
-  const router = useRouter();
-  function goDetailPage(record) {
-    console.log('record', record);
-    router.push({
-      path: '/market-manage/external-manage/customer-manage/customer-create',
-      query: {
-        id: record.id,
-      },
-    });
-  }
-</script>
-
-<style scoped lang="scss">
-  .table-demo {
-  }
-</style>

+ 231 - 0
src/views/market-manage/external-manage/project-manage/single-project/components/project-info.vue

@@ -0,0 +1,231 @@
+<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"></div>
+          </div>
+          <div class="steps-content">
+            <a-row :gutter="24" class="smart-query-form-row">
+             <a-col :span="16">
+                <a-form-item label="项目类型" name="regionType" class="smart-query-form-item">
+                  <a-span>{{ formModel.regionType }}</a-span>
+                </a-form-item>
+              </a-col>
+               <a-col :span="8">
+                <a-form-item label="线索名称" name="customerName" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerName }}</a-span>
+                </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="customerType" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerType }}</a-span>
+                </a-form-item>
+              </a-col>
+               <a-col :span="8">
+                <a-form-item label="省市区" name="customerType" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerType }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="项目地址" name="customerType" class="smart-query-form-item">
+                  <a-span>{{ formModel.customerType }}</a-span>
+                </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="socialCode" class="smart-query-form-item">
+                   <a-span>{{ formModel.socialCode }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="工程属性" name="legalPerson" class="smart-query-form-item">
+                   <a-span>{{ formModel.legalPerson }}</a-span>
+                </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="provinceCityDistrict" class="smart-query-form-item">
+                   <a-span>{{ formModel.provinceCityDistrict }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="联合体情况说明" name="address" class="smart-query-form-item">
+                   <a-span>{{ formModel.address }}</a-span>
+                </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="companyRegisterDate" class="smart-query-form-item">
+                  <a-span>{{ formModel.companyRegisterDate }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="招标平台" name="companyRegisterCapital" class="smart-query-form-item">
+                  <a-span>{{ formModel.companyRegisterCapital }}</a-span>
+                </a-form-item>
+              </a-col>
+              <a-col :span="8">
+                <a-form-item label="项目资金来源" name="officialWebsite" class="smart-query-form-item">
+                  <a-span>{{ formModel.officialWebsite }}</a-span>
+                </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="customerDescription" class="smart-query-form-item">
+                   <a-span>{{ formModel.customerDescription }}</a-span>
+                </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="customerNature" class="smart-query-form-item">
+                   <a-span>{{ formModel.customerNature }}</a-span>
+                </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="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, watchEffect } 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';
+
+  const props = defineProps({
+    id: {
+      type: String,
+    },
+    descData: {
+      type: Object,
+      default: () => ({}), // 提供默认值,避免初始值为 null 导致错误
+    },
+  });
+  // ---------------------- 表格样式配置 ----------------------------
+  const labelCol = { style: { width: '120px' } };
+  // ---------------------- 字段自定义 ----------------------------
+  const formModel = reactive({});
+  const stepFormRef = ref(null);
+
+  watchEffect(() => {
+    if (props.descData) {
+      Object.assign(formModel, _.cloneDeep(props.descData));
+      formModel.survivalStatus=props?.descData?.survivalStatus?.[0].valueCode
+      formModel.customerType=props?.descData?.customerType?.[0].valueName
+      formModel.regionType=props?.descData?.regionType?.[0].valueName
+    }
+  });
+
+  onMounted(() => {
+    console.log('子组件接收到的 descData:', props.descData);
+  });
+</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>

+ 0 - 262
src/views/market-manage/external-manage/project-manage/single-project/components/project-list.vue

@@ -1,262 +0,0 @@
-<template>
-  <div class="table-demo">
-    <bs-table v-bind="tableOptions">
-      <template #searchRight>
-        <a-space>
-          <a-button type="primary" @click="goDetailPage">
-            <template #icon>
-              <PlusOutlined />
-            </template>
-            <span>新增</span>
-          </a-button>
-        </a-space>
-      </template>
-      <template #toolbarLeft>
-        <a-space> 累计客户:XXX|黑名单客户:XXX|S级客户 </a-space>
-      </template>
-    </bs-table>
-  </div>
-</template>
-
-<script setup lang="jsx">
-  import BsTable, { useBsTable } from '/@/components/BsUi/Table/index.js';
-  import { onMounted, ref, watch } from 'vue';
-  import { useRouter } from 'vue-router';
-
-  const props = defineProps({
-    selectedRulesId: String,
-  });
-
-  const {
-    tableOptions,
-    fetchTableData,
-    setTablePropsValue: setValue,
-    getTablePropsValue: getValue,
-  } = useBsTable({
-    tableOptions: {
-      url: '/supports/risk/rule/queryPage',
-      gridOptions: {
-        loading: false,
-        columns: [
-          {
-            type: 'seq',
-            width: 80,
-            align: 'center',
-          },
-          {
-            title: '风险维度',
-            field: 'riskDimension',
-            width: 85,
-            ellipsis: true,
-            formatter: ({ cellValue }) => {
-              return cellValue && cellValue.length > 0 ? cellValue[0].valueName : '';
-            },
-          },
-          {
-            title: '风险模板',
-            // field: 'riskModel',
-            width: 85,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskModel?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '风险等级',
-            field: 'riskLevel',
-            width: 85,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskLevel?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '风险指标',
-            field: 'riskMetrics',
-            width: 110,
-            ellipsis: true,
-          },
-          {
-            title: '指标定义',
-            field: 'definedMetrics',
-            width: 100,
-            ellipsis: true,
-          },
-          {
-            title: '条件运算符',
-            field: 'operator',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.operator?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '条件控制值',
-            field: 'conditionalValue',
-            width: 100,
-            ellipsis: true,
-          },
-          {
-            title: '提醒方式',
-            field: 'remindWay',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.remindWay?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '提醒时间(每天)',
-            field: 'remindTime',
-            width: 120,
-            ellipsis: true,
-          },
-          {
-            title: '风险等级',
-            field: 'riskGrade',
-            width: 100,
-            ellipsis: true,
-            slots: {
-              default({ row, column }) {
-                return <span>{row?.riskGrade?.[0].valueName}</span>;
-              },
-            },
-          },
-          {
-            title: '状态',
-            field: 'enable',
-            width: 100,
-            ellipsis: true,
-            // formatter: (cellValue) => {
-            //   return cellValue === 'true' ? '启用' : '禁用';
-            // },
-            slots: {
-              default({ row, column }) {
-                return <span>{row.enable === 'true' ? '启用' : '禁用'}</span>;
-              },
-            },
-          },
-          {
-            field: 'opt',
-            title: '操作',
-            width: '120px',
-            fixed: 'right',
-            align: 'center',
-            slots: {
-              default({ row, column }) {
-                return (
-                  <a-button
-                    type='text'
-                    size='small'
-                    onClick={() => {
-                      goDetailPage(row);
-                    }}
-                  >
-                    编辑
-                  </a-button>
-                );
-              },
-            },
-          },
-        ],
-        data: [
-          {
-            id: 1,
-            name: '测试数据',
-            dictField: [
-              {
-                dictKeyId: '',
-                dictValueId: '',
-                remark: '',
-                sort: 3,
-                status: 1,
-                valueCode: '03',
-                valueName: '微信公众号',
-              },
-            ],
-          },
-        ], // 模拟数据源
-      },
-      searchConfig: {
-        enabled: false,
-        fieldSpan: 4,
-        fields: [
-          {
-            field: 'name',
-            label: '',
-            component: 'a-input',
-            componentProps: {
-              placeholder: '请输入服务商名称',
-            },
-          },
-          {
-            field: 'name1',
-            label: '',
-            component: 'a-select',
-            componentProps: {
-              placeholder: '请选择地址',
-            },
-          },
-          {
-            field: 'name2',
-            label: '',
-            component: 'a-select',
-            componentProps: {
-              placeholder: '请选择服务商类型',
-            },
-          },
-        ],
-      },
-      pagerConfig: {
-        enabled: true,
-        pageSize: 10,
-        pageNum: 1,
-      },
-      toolbarConfig: {},
-      tableSearchBeforeBiz() {
-        const searchParams = getValue('searchConfig.data');
-        setValue('searchConfig.data', { ...searchParams, key: props.selectedRulesId });
-      },
-    },
-  });
-
-  // 监听 selectedRulesId 的变化
-  watch(
-    () => props.selectedRulesId,
-    (newVal, oldVal) => {
-      if (newVal !== oldVal) {
-        fetchTableData(newVal);
-      }
-    },
-    { immediate: true }
-  );
-
-  onMounted(() => {
-    console.log('表格已加载');
-  });
-
-  const router = useRouter();
-  function goDetailPage(record) {
-    console.log('record', record);
-    router.push({
-      path: '/market-manage/external-manage/customer-manage/customer-create',
-      query: {
-        id: record.id,
-      },
-    });
-  }
-</script>
-
-<style scoped lang="scss">
-  .table-demo {
-  }
-</style>

+ 12 - 31
src/views/market-manage/external-manage/project-manage/single-project/index.vue

@@ -6,7 +6,7 @@
           <a-flex vertical gap="small">
             <div class="header-info">
               <div class="header-info-top">
-                <span>{{ singleProjValue?.customerName }}</span>
+                <span>{{ singleProjValue?.projectName }}</span>
                 <a-tag color="#D4AF37" style="font-size: 15px">{{ singleProjValue?.partnerLevel?.[0]?.valueName }}</a-tag>
               </div>
               <div class="header-info-bottom">
@@ -20,7 +20,7 @@
                 </div>
                 <div>
                   所在省市:
-                  <span>{{ `${singleProjValue?.provinceName}${singleProjValue?.cityName}` }}</span>
+                  <span>{{ `${singleProjValue?.provinceName}-${singleProjValue?.cityName}` }}</span>
                 </div>
               </div>
             </div>
@@ -51,17 +51,13 @@
 
   const router = useRouter();
   const query = router.currentRoute.value.query;
-  const singleProjValue = ref({
-    customerName: '',
-    partnerLevel: [],
-    customerType: [],
-  });
+  const singleProjValue = ref();
 
   const descList = ref([
-    { id: '1', label: '合同数量', value: '' },
-    { id: '2', label: '累计产值', value: '' },
-    { id: '3', label: '已开票', value: '' },
-    { id: '4', label: '未开票', value: '' },
+    { id: '1', label: '预计合同金额', value: '' },
+    { id: '2', label: '招标方式', value: '' },
+    { id: '3', label: '对接营销经理', value: '' },
+    { id: '4', label: '营销经理联系电话', value: '' },
   ]);
 
   const tabKey = ref('0');
@@ -69,25 +65,10 @@
     {
       key: '0',
       tab: '基本信息',
-      component: defineAsyncComponent(() => import('./components/customer-info.vue')),
+      component: defineAsyncComponent(() => import('./components/project-info.vue')),
     },
     {
       key: '1',
-      tab: '项目信息',
-      component: defineAsyncComponent(() => import('./components/project-list.vue')),
-    },
-    {
-      key: '2',
-      tab: '结算管理',
-      component: defineAsyncComponent(() => import('./components/settlement-list.vue')),
-    },
-    {
-      key: '3',
-      tab: '开票管理',
-      component: defineAsyncComponent(() => import('./components/invoice-list.vue')),
-    },
-    {
-      key: '4',
       tab: '文件资料',
       component: defineAsyncComponent(() => import('./components/file-info.vue')),
     },
@@ -104,10 +85,10 @@
         singleProjValue.value = res.data;
         // 动态更新 descList
         descList.value = [
-          { id: '1', label: '合同数量', value: singleProjValue.value.contractQuantity },
-          { id: '2', label: '累计产值', value: singleProjValue.value.totalOutputValue },
-          { id: '3', label: '已开票', value: singleProjValue.value.invoiceAmount },
-          { id: '4', label: '未开票', value: singleProjValue.value.unlicensedAmount },
+          { id: '1', label: '预计合同金额', value: singleProjValue.value.contractQuantity },
+          { id: '2', label: '招标方式', value: singleProjValue.value.totalOutputValue },
+          { id: '3', label: '对接营销经理', value: singleProjValue.value.invoiceAmount },
+          { id: '4', label: '营销经理联系电话', value: singleProjValue.value.unlicensedAmount },
         ];
       },
       (err) => {

+ 0 - 4
src/views/support/portal-configure/portal-configure.vue

@@ -214,10 +214,6 @@
 </script>
 
 <style scoped lang="less">
-  ::v-deep .ant-row {
-    display: flex;
-    align-items: center;
-  }
   .approval-steps {
     display: flex;
     flex-direction: column;