From cb165187ddcf5d9cfd8aad97a2868d0343b14bd9 Mon Sep 17 00:00:00 2001
From: Sanakey <714737083@qq.com>
Date: 星期五, 27 九月 2024 18:14:48 +0800
Subject: [PATCH] feat:完善客户Drawer详情

---
 src/views/clues/components/drawer/Schedule.vue      |    6 
 src/views/customer/components/drawer/Business.vue   |  286 +++++++++++-----
 src/components/Upload/src/BasicUpload.vue           |    5 
 src/views/customer/components/Drawer.vue            |    2 
 src/components/NewSchedule/src/scheduleFormData.tsx |    2 
 src/views/clues/components/drawer/Dynamic.vue       |   10 
 src/views/clues/components/drawer/index.vue         |    5 
 src/views/clues/components/Drawer.vue               |    3 
 src/views/customer/components/drawer/Document.vue   |  233 +++++++++++--
 src/views/customer/components/drawer/Dynamic.vue    |  257 ++++++++++++--
 src/views/customer/components/drawer/Tips.vue       |  203 +++--------
 mock/clues/clues-table.ts                           |    1 
 src/views/customer/components/drawer/index.vue      |    5 
 13 files changed, 690 insertions(+), 328 deletions(-)

diff --git a/mock/clues/clues-table.ts b/mock/clues/clues-table.ts
index 89c4617..5b9f27c 100644
--- a/mock/clues/clues-table.ts
+++ b/mock/clues/clues-table.ts
@@ -15,6 +15,7 @@
   for (let index = 0; index < 200; index++) {
     result.push({
       id: `${index}`,
+      color: Random.color(),
       cluesName: '@ctitle()',
       formId: `@integer(100000, 999999)`,
       archiveTime: '@datetime',
diff --git a/src/components/NewSchedule/src/scheduleFormData.tsx b/src/components/NewSchedule/src/scheduleFormData.tsx
index 3138fbd..1305c31 100644
--- a/src/components/NewSchedule/src/scheduleFormData.tsx
+++ b/src/components/NewSchedule/src/scheduleFormData.tsx
@@ -102,7 +102,7 @@
               colors.map((item) => {
                 return <RadioButton class="mr-5px" value={item.type_id} onChange={onChange}
                                     style={{backgroundColor: item.color,borderColor:item.color}}>
-                  <span class={ model[field] === item.type_id ?'':'c-white select-none op0'}>鉁�</span>
+                  <span class={'c-white' + (model[field] === item.type_id ?'':' select-none op0')}>鉁�</span>
                 </RadioButton>;
               })
             }
diff --git a/src/components/Upload/src/BasicUpload.vue b/src/components/Upload/src/BasicUpload.vue
index 92aff62..122830b 100644
--- a/src/components/Upload/src/BasicUpload.vue
+++ b/src/components/Upload/src/BasicUpload.vue
@@ -162,4 +162,9 @@
   function handlePreviewDelete(url: string) {
     emit('preview-delete', url);
   }
+
+  // 鏆撮湶openUploadModal 渚涚埗缁勪欢浣跨敤
+  defineExpose({
+    openUploadModal,
+  });
 </script>
diff --git a/src/views/clues/components/Drawer.vue b/src/views/clues/components/Drawer.vue
index 49a4501..ec71ae4 100644
--- a/src/views/clues/components/Drawer.vue
+++ b/src/views/clues/components/Drawer.vue
@@ -1,11 +1,12 @@
 <template>
   <BasicDrawer
+    class="basic-drawer-1"
     v-bind="$attrs"
     title="Basic Drawer"
     @register="registerDrawer"
     :maskClosable="false"
     :keyboard="false"
-    width="500px"
+    width="550px"
   >
     <template #title>
       <div class="text-right">
diff --git a/src/views/clues/components/drawer/Dynamic.vue b/src/views/clues/components/drawer/Dynamic.vue
index bf131d2..49b1e4b 100644
--- a/src/views/clues/components/drawer/Dynamic.vue
+++ b/src/views/clues/components/drawer/Dynamic.vue
@@ -8,7 +8,7 @@
         娣诲姞璺熻繘
       </a-button>
     </div>
-    <div ref="wrapEl">
+    <div ref="loadingEl">
       <div class="mb-20px flex justify-between flex-items-center">
         <span class="font-bold">鍏� {{totalData}} 鏉�</span>
         <TreeSelect
@@ -120,16 +120,18 @@
   }
 
   // 鍔ㄦ�佸垪琛ㄥ姞杞�
-  const wrapEl = ref<ElRef>(null);
+  const loadingEl = ref<ElRef>(null);
   const [openWrapLoading, closeWrapLoading] = useLoading({
-    target: wrapEl,
+    target: loadingEl,
     props: {
       tip: '鍔犺浇涓�...',
       absolute: true,
     },
   });
   // 鍔ㄦ�佸垪琛ㄦ暟鎹�
-  getCluesDynamicData();
+  setTimeout(()=>{
+    getCluesDynamicData();
+  },50)
   async function getCluesDynamicData(){
     openWrapLoading();
     let params = {
diff --git a/src/views/clues/components/drawer/Schedule.vue b/src/views/clues/components/drawer/Schedule.vue
index a76795b..bfc19be 100644
--- a/src/views/clues/components/drawer/Schedule.vue
+++ b/src/views/clues/components/drawer/Schedule.vue
@@ -92,12 +92,6 @@
   });
 };
 
-const pagination = {
-  onChange: (page: number) => {
-    console.log(page);
-  },
-  pageSize: 3,
-};
 
 const openChange = (status: boolean) => {
   Logger.log('openChange', status);
diff --git a/src/views/clues/components/drawer/index.vue b/src/views/clues/components/drawer/index.vue
index f4289f0..c7dc367 100644
--- a/src/views/clues/components/drawer/index.vue
+++ b/src/views/clues/components/drawer/index.vue
@@ -150,7 +150,10 @@
       background-color: @component-background;
     }
     .scroll-wrap{
-      height: calc(100vh - 290px);
+      height: calc(100vh - 310px);
     }
+    //:deep(.scrollbar__wrap)   {
+    //  padding: 10px !important;
+    //}
   }
 </style>
diff --git a/src/views/customer/components/Drawer.vue b/src/views/customer/components/Drawer.vue
index 49a4501..5d0baf4 100644
--- a/src/views/customer/components/Drawer.vue
+++ b/src/views/customer/components/Drawer.vue
@@ -5,7 +5,7 @@
     @register="registerDrawer"
     :maskClosable="false"
     :keyboard="false"
-    width="500px"
+    width="550px"
   >
     <template #title>
       <div class="text-right">
diff --git a/src/views/customer/components/drawer/Business.vue b/src/views/customer/components/drawer/Business.vue
index a76795b..5041e3c 100644
--- a/src/views/customer/components/drawer/Business.vue
+++ b/src/views/customer/components/drawer/Business.vue
@@ -1,88 +1,74 @@
 <template>
-  <Row class="mb-10px">
-    <Col span="12">
-      <Dropdown :trigger="['click']" arrow @openChange="openChange">
-        <span class="cursor-pointer" @click.prevent>
-          {{ dropDownTitle }}
-          <BasicArrow :expand="false" down/>
-        </span>
-        <template #overlay>
-          <Menu @click="onMenuItemClick">
-            <MenuItem key="0">
-              <span>鏈畬鎴�</span>
-            </MenuItem>
-            <MenuItem key="1">
-              <span>宸插畬鎴�</span>
-            </MenuItem>
-          </Menu>
+  <a-collapse :class="prefixCls" v-model:activeKey="activeKey" ghost>
+    <a-collapse-panel key="1" header="鍟嗘満">
+      <a-row :gutter="[12,12]" class="pb-20px">
+        <template v-for="item in cardList" :key="item.title">
+          <a-col :span="8">
+            <a-card :class="`${prefixCls}-card`">
+              <div :class="`${prefixCls}-card-title`">
+<!--                <BasicTitle  :helpMessage="item.tips"></BasicTitle>-->
+                {{ item.title }}
+                <span v-if="item?.tips?.length>0" ><BasicHelp :text="item.tips" placement="top" /></span>
+              </div>
+              <div :class="`${prefixCls}__card-detail font-bold`">
+                {{ item.detail || '--' }}
+              </div>
+            </a-card>
+          </a-col>
         </template>
-      </Dropdown>
-    </Col>
-    <Col span="12" :style="'text-align:right'">
-      <Tooltip title="鏂板缓鏃ョ▼">
-        <PlusSquareOutlined class="cursor-pointer" style="fontSize:24px;color: #aaa"
-                            @click="openScheduleModal"/>
-      </Tooltip>
+      </a-row>
 
-    </Col>
-  </Row>
-  <BasicTable
-    @register="registerTable"
-    @row-click="handleScheduleRowClick"
-  >
-    <template #bodyCell="{ column, record }">
-      <template v-if="column.key === 'cluesName'">
-        <div>
-          <Avatar :size="16" :style="'background-color:'+ record.color"></Avatar>
-          <span class="ml-5px">
-            {{ record.cluesName }}
-          </span>
-        </div>
+
+      <BasicTable
+        @register="registerTable"
+      >
+        <template #bodyCell="{ column, record, index }">
+          <template v-if="column.key === 'cluesName'">
+            <div>
+              <a class="ml-5px ">
+                {{ record.cluesName }}
+              </a>
+            </div>
+          </template>
+          <template v-if="column.key === 'status'">
+            <a-tag color="green">
+              {{ record.status }}
+            </a-tag>
+          </template>
+          <template v-if="column.key === 'endTime'">
+            <span class="c-red">
+              {{ record.endTime }}
+            </span>
+          </template>
+        </template>
+
+      </BasicTable>
+      <template #extra >
+        <PlusCircleOutlined @click="addBusinessForm" />
       </template>
-    </template>
-  </BasicTable>
+    </a-collapse-panel>
+  </a-collapse>
+
   <ScheduleDetailModal @register="registerScheduleModal"></ScheduleDetailModal>
-  <div>
-    <template v-for="item in projectList" :key="item.title">
-      <Row class="cursor-pointer" :gutter="[22,26]" align="middle">
-        <Col span="12">
-          <Avatar :size="16" :style="'background-color:'+ item.color"></Avatar>
-          <span class="ml-5px">{{ item.title }}</span>
-        </Col>
-        <Col span="12" :style="'text-align:right'">
-          <span>{{ item.content }}</span>
-        </Col>
-      </Row>
-    </template>
 
-  </div>
-  <!--  <List :class="prefixCls" item-layout="horizontal" :data-source="projectList" :grid="{ column: 1, gutter: 12}" :pagination="pagination" >-->
-  <!--    <template #renderItem="{ item }">-->
-  <!--      <ListItem>-->
-  <!--        -->
-  <!--      </ListItem>-->
-
-  <!--    </template>-->
-  <!--&lt;!&ndash;    <template v-for="item in projectList" :key="item.title"></template>&ndash;&gt;-->
-  <!--  </List>-->
 </template>
 <script lang="ts" setup>
-import {List, Avatar, Card, Row, Col, Dropdown, Menu, Tooltip, Tag} from 'ant-design-vue';
 import {projectList} from './data';
-import {PlusSquareOutlined} from '@ant-design/icons-vue';
+import {PlusSquareOutlined,FileImageFilled,PlusCircleOutlined} from '@ant-design/icons-vue';
 import {BasicArrow} from "@/components/Basic";
 import {ref} from 'vue';
 import ScheduleDetailModal from './ScheduleDetail.vue';
 
-const ListItem = List.Item;
-const MenuItem = Menu.Item;
-
+import { BasicHelp } from '@/components/Basic';
 import EventBus from '@/utils/eventBus';
 import {BasicTable, ColumnChangeParam, TableAction, useTable} from "@/components/Table";
 import {cluesListApi} from "@/api/clues/table";
 import {getEditCellColumns, getFormConfig} from "@/views/clues/components/tableData";
 import {useModal} from "@/components/Modal";
-
+import {Row} from "ant-design-vue";
+import {applicationList} from "@/views/demo/page/account/center/data";
+import Business from "@/router/routes/modules/business";
+import {cluesDynamicApi} from "@/api/clues/dynamic";
 const [registerScheduleModal, {openModal, setModalProps}] = useModal();
 const openScheduleModal = () => {
   Logger.log('鐐瑰嚮openScheduleModal');
@@ -92,22 +78,86 @@
   });
 };
 
-const pagination = {
-  onChange: (page: number) => {
-    console.log(page);
-  },
-  pageSize: 3,
-};
+const activeKey = ref(['1']);
+function addBusinessForm(event) {
+  Logger.log('addBusinessForm', event);
+  event.stopPropagation();
+}
 
-const openChange = (status: boolean) => {
-  Logger.log('openChange', status);
-};
-const dropDownTitle = ref('鏈畬鎴�');
-const onMenuItemClick = (e: any) => {
-  let titles = ['鏈畬鎴�', '宸插畬鎴�'];
-  Logger.log('onMenuItemClick', e);
-  dropDownTitle.value = titles[e.key];
-};
+
+
+
+let cardList = ref([
+  {
+    title: '璧㈠崟鍟嗘満閲戦(CNY)',
+    detail: '0.00',
+  },
+  {
+    title: '璧㈠崟鍟嗘満鍧囦环(CNY)',
+    detail: '0.00',
+  },
+  {
+    title: '棣栨璧㈠崟鏃ユ湡',
+    tips: '鎵�鏈夎耽鍗曞晢鏈轰腑鏈�鏃╃殑缁撴潫鏃ユ湡',
+    detail: '',
+  },
+  {
+    title: '鏈�杩戣耽鍗曟棩鏈�',
+    tips: '鎵�鏈夎耽鍗曞晢鏈轰腑鏈�杩戠殑缁撴潫鏃ユ湡',
+    detail: '',
+  },
+  {
+    title: '杩涜涓殑鍟嗘満鏁�',
+    tips: '銆岃繘琛屼腑銆嶆槸鎸囬櫎璧㈠崟&杈撳崟涔嬪鐨勫晢鏈洪樁娈�',
+    detail: '10',
+  },
+  {
+    title: '璧㈠崟鍟嗘満鏁�',
+    detail: '0',
+  },
+  {
+    title: '璧㈠崟鐜�',
+    detail: '0%',
+  },
+  {
+    title: '骞冲潎閿�鍞懆鏈�',
+    detail: '0灏忔椂',
+  },
+  {
+    title: '宸茬敓鏁堝洖娆惧崟鏁�',
+    detail: '0',
+  },
+  {
+    title: '宸茬敓鏁堝洖娆鹃噾棰�',
+    detail: '0',
+  },
+]);
+// 鍟嗘満鎬昏鍒楄〃鏁版嵁
+setTimeout(() => {
+  // getCustomerCardData();
+}, 50);
+async function getCustomerCardData(){
+  let params = {
+    page: 1,
+    pageSize: 10,
+  };
+  try {
+    let res = await cluesDynamicApi(params)
+    Logger.log('cluesDynamicApi...',res);
+    cardList.value = res.items;
+  } catch (e) {
+    Logger.error(e);
+  } finally {
+  }
+}
+
+// const pagination = {
+//   onChange: (page: number) => {
+//     console.log(page);
+//   },
+//   pageSize: 3,
+// };
+
 
 const [
   registerTable,
@@ -136,16 +186,48 @@
   showIndexColumn: false,
   columns: [
     {
-      // title: '',
+      title: '鍟嗘満缂栧彿',
+      // defaultHidden: true,
+      dataIndex: 'id',
+      width: 70
+    },
+    {
+      title: '鍟嗘満鍚嶇О',
       // defaultHidden: true,
       dataIndex: 'cluesName',
       width: 200
     },
     {
-      // title: '',
-      dataIndex: 'archiveTime',
-      width: 200,
+      title: '褰撳墠闃舵',
+      dataIndex: 'status',
+      width: 120,
     },
+    {
+      title: '閿�鍞噾棰�',
+      dataIndex: 'formId',
+      width: 80,
+    },
+    {
+      title: '缁撴潫鏃ユ湡',
+      dataIndex: 'endTime',
+      width: 100,
+    },
+    {
+      title: '宸茬敓鏁堝洖娆鹃噾棰�',
+      dataIndex: 'formId',
+      width: 80,
+    },
+    {
+      title: '鏈洖娆鹃噾棰�',
+      dataIndex: 'formId',
+      width: 80,
+    },
+    {
+      title: '璐熻矗浜�',
+      dataIndex: 'name',
+      width: 80,
+    },
+
   ],
   // defSort: {
   //   pageNo: 1,
@@ -158,7 +240,6 @@
   // showIndexColumn: false, // 鏄惁鏄剧ず搴忓彿鍒�
   // useSearchForm: false, // 浣跨敤鎼滅储琛ㄥ崟
   // clickToRowSelect: false,
-  // formConfig: getFormConfig(), // 鎼滅储琛ㄥ崟閰嶇疆
   pagination: {
     // pageSize: 20,
     pageSizeOptions: ['10', '20', '50', '100'],
@@ -167,18 +248,27 @@
   },
 });
 
-
-
-function handleScheduleRowClick(e) {
-  Logger.log('handleScheduleRowClick', e);
-  openModal(true, {
-    // record,
-    // isUpdate: true,
-  });
+const prefixCls = 'customer-modal-business';
+</script>
+<style lang="less" scoped>
+.customer-modal-business{
+  .icon-color{
+    color: #1890ff;
+  }
+  :deep(&-btn) .ant-space{
+    display: none;
+  }
+  :deep(.ant-collapse-content-box), :deep(.onbus-basic-table){
+    padding: 0;
+  }
+  :deep(&-card) .ant-card-body{
+    padding: 10px;
+    background-color: #f9f9f9;
+  }
+  :deep(&-card-title) .onbus-basic-title{
+    padding: 0;
+  }
 }
 
-const prefixCls = 'account-center-project';
-</script>
-<style lang="less" >
 
 </style>
diff --git a/src/views/customer/components/drawer/Document.vue b/src/views/customer/components/drawer/Document.vue
index 6a3a75a..6a1aec6 100644
--- a/src/views/customer/components/drawer/Document.vue
+++ b/src/views/customer/components/drawer/Document.vue
@@ -1,21 +1,60 @@
 <template>
-  <a-collapse v-model:activeKey="activeKey" ghost>
+  <a-collapse class="customer-modal-document" v-model:activeKey="activeKey" ghost>
     <a-collapse-panel key="1" header="鏂囨。">
       <BasicTable
         @register="registerTable"
-        @row-click="handleScheduleRowClick"
       >
-        <template #bodyCell="{ column, record }">
+        <template #bodyCell="{ column, record, index }">
           <template v-if="column.key === 'cluesName'">
             <div>
-              <a-avatar :size="16" :style="'background-color:'+ record.color"></a-avatar>
-              <span class="ml-5px">
-            {{ record.cluesName }}
-          </span>
+              <FileImageFilled class="icon-color font-size-20px" />
+              <a class="ml-5px c-black" data-index="{{index}}" @click="setImgVisible(record.id)">
+                {{ record.cluesName }}
+              </a>
+              <a-image
+                :style="{ display: 'none' }"
+                :preview="{
+                  visible: index == curImgIndex,
+                  onVisibleChange: setImgVisible,
+                }"
+                :src="record.avatar"
+              />
             </div>
           </template>
+          <template v-else-if="column.key === 'action'">
+            <TableAction
+              stopButtonPropagation
+              :dropDownActions="[
+              {
+                label: '鍙戦�侀偖浠�',
+                onClick: handleWriteEmail.bind(null, record),
+              },
+              {
+                label: '涓嬭浇闄勪欢',
+                onClick: handleDownloadFiles.bind(null, record),
+              },
+              {
+                label: '鍒犻櫎鏂囦欢',
+                onClick: handleDeleteFiles.bind(null, record),
+              },
+            ]"
+            />
+          </template>
         </template>
+
       </BasicTable>
+      <template #extra >
+        <PlusCircleOutlined @click="addUploadFile" />
+        <BasicUpload
+          ref="uploadRef"
+          :maxSize="20"
+          :maxNumber="10"
+          @change="handleUploadFileChange"
+          :api="uploadApi"
+          class="customer-modal-document-btn"
+          :accept="['image/*']"
+        />
+      </template>
     </a-collapse-panel>
   </a-collapse>
 
@@ -24,7 +63,7 @@
 </template>
 <script lang="ts" setup>
 import {projectList} from './data';
-import {PlusSquareOutlined} from '@ant-design/icons-vue';
+import {PlusSquareOutlined,FileImageFilled,PlusCircleOutlined} from '@ant-design/icons-vue';
 import {BasicArrow} from "@/components/Basic";
 import {ref} from 'vue';
 import ScheduleDetailModal from './ScheduleDetail.vue';
@@ -34,6 +73,9 @@
 import {cluesListApi} from "@/api/clues/table";
 import {getEditCellColumns, getFormConfig} from "@/views/clues/components/tableData";
 import {useModal} from "@/components/Modal";
+import {uploadApi} from "@/api/sys/upload";
+import {BasicUpload} from "@/components/Upload";
+import {useMessage} from "@/hooks/web/useMessage";
 
 const [registerScheduleModal, {openModal, setModalProps}] = useModal();
 const openScheduleModal = () => {
@@ -44,23 +86,39 @@
   });
 };
 
+// 鑾峰彇瀛愮粍浠剁殑寮曠敤
+const uploadRef = ref();
+function addUploadFile(event) {
+    Logger.log('addUploadFile', event);
+    event.stopPropagation();
+    if (uploadRef.value) {
+      Logger.log('uploadRef', uploadRef.value);
+      uploadRef.value.openUploadModal();
+    }
+
+}
+// const addUploadFile = (event: MouseEvent) => {
+//   Logger.log('addUploadFile', event);
+//   // If you don't want click extra trigger collapse, you can prevent this:
+//   event.stopPropagation();
+//
+// };
+const { createMessage } = useMessage();
+function handleUploadFileChange(list: string[]) {
+  createMessage.success(`宸蹭笂浼犳枃浠�${JSON.stringify(list)}`);
+}
+
 const activeKey = ref(['1']);
 
-const pagination = {
-  onChange: (page: number) => {
-    console.log(page);
-  },
-  pageSize: 3,
-};
-
-const openChange = (status: boolean) => {
-  Logger.log('openChange', status);
-};
-const dropDownTitle = ref('鏈畬鎴�');
-const onMenuItemClick = (e: any) => {
-  let titles = ['鏈畬鎴�', '宸插畬鎴�'];
-  Logger.log('onMenuItemClick', e);
-  dropDownTitle.value = titles[e.key];
+const curImgIndex = ref<boolean>(-1);
+const setImgVisible = (value): void => {
+  Logger.log('setImgVisible', value);
+  if (value === false) {
+    curImgIndex.value = -1;
+  } else {
+    curImgIndex.value = value;
+  }
+  // imgVisible.value = value;
 };
 
 const [
@@ -90,16 +148,32 @@
   showIndexColumn: false,
   columns: [
     {
-      // title: '',
+      title: '鏂囦欢鍚嶇О',
       // defaultHidden: true,
       dataIndex: 'cluesName',
       width: 200
     },
     {
-      // title: '',
+      title: '鍏宠仈绫诲瀷',
+      dataIndex: 'statusId',
+      width: 200,
+    },
+    {
+      title: '鏂囦欢澶у皬',
+      dataIndex: 'formId',
+      width: 80,
+    },
+    {
+      title: '娣诲姞浜�',
+      dataIndex: 'name',
+      width: 80,
+    },
+    {
+      title: '涓婁紶鏃ユ湡',
       dataIndex: 'archiveTime',
       width: 200,
     },
+
   ],
   // defSort: {
   //   pageNo: 1,
@@ -112,27 +186,118 @@
   // showIndexColumn: false, // 鏄惁鏄剧ず搴忓彿鍒�
   // useSearchForm: false, // 浣跨敤鎼滅储琛ㄥ崟
   // clickToRowSelect: false,
-  // formConfig: getFormConfig(), // 鎼滅储琛ㄥ崟閰嶇疆
   pagination: {
     // pageSize: 20,
     pageSizeOptions: ['10', '20', '50', '100'],
     defaultPageSize: 20,
     // showSizeChanger: true,
   },
+  actionColumn: {
+    width: 50,
+    title: '鎿嶄綔',
+    dataIndex: 'action',
+    fixed: 'right',
+  },
+  useSearchForm: true, // 浣跨敤鎼滅储琛ㄥ崟
+  formConfig: {
+    // labelWidth: 100,
+    // layout: 'horizontal',
+    rowProps: {
+      // justify: 'start',
+      gutter: 12,
+    },
+    showActionButtonGroup: false,
+    // showResetButton: false,
+    // showSubmitButton: false,
+    schemas: [
+      {
+        field: `field1`,
+        label: ``,
+        component: 'Input',
+        componentProps: {
+          placeholder: '鎼滅储鏂囨。鍚嶇О',
+        },
+        colProps: {
+          span:8,
+        },
+      },
+      {
+        field: 'recurringDates',
+        label: '',
+        component: 'Select',
+        colProps: {
+          span:8,
+        },
+        componentProps: {
+          options: [
+            {
+              label: '鍏ㄩ儴绫诲瀷',
+              value: '1',
+            },
+            {
+              label: '閭欢闄勪欢',
+              value: '2',
+            },
+            {
+              label: '鎵嬪姩涓婁紶',
+              value: '3',
+            },
+            {
+              label: '閿�鍞鍗曞凡瀵煎崟鎹�',
+              value: '4',
+            },
+            {
+              label: '鎶ヤ环鍗曞凡瀵煎崟鎹�',
+              value: '5',
+            },
+          ],
+        },
+        defaultValue: '1'
+      },
+      {
+        field: '[startDate, endDate]',
+        label: '',
+        component: 'RangePicker',
+        componentProps: {
+          style: {width: '100%'},
+          format: 'YYYY-MM-DD',
+          placeholder: ['寮�濮嬫棩鏈熴�佹椂闂�', '缁撴潫鏃ユ湡銆佹椂闂�'],
+          // showTime: {format: 'HH:mm:ss'},
+        },
+        colProps: {
+          span:8,
+        },
+      },
+    ],
+  },
+
 });
 
 
 
-function handleScheduleRowClick(e) {
-  Logger.log('handleScheduleRowClick', e);
-  openModal(true, {
-    // record,
-    // isUpdate: true,
-  });
+function handleWriteEmail(record: Recordable) {
+  Logger.log('鐐瑰嚮浜嗗啓閭欢', record);
+}
+function handleDownloadFiles(record: Recordable) {
+  Logger.log('鐐瑰嚮浜嗕笅杞芥枃浠�', record);
+}
+function handleDeleteFiles(record: Recordable) {
+  Logger.log('鐐瑰嚮浜嗗垹闄ゆ枃浠�', record);
 }
 
-const prefixCls = 'account-center-project';
 </script>
-<style lang="less" >
+<style lang="less" scoped>
+.customer-modal-document{
+  .icon-color{
+    color: #1890ff;
+  }
+  :deep(&-btn) .ant-space{
+    display: none;
+  }
+  :deep(.ant-collapse-content-box), :deep(.onbus-basic-table) {
+    padding: 0;
+  }
+}
+
 
 </style>
diff --git a/src/views/customer/components/drawer/Dynamic.vue b/src/views/customer/components/drawer/Dynamic.vue
index bf131d2..1d81243 100644
--- a/src/views/customer/components/drawer/Dynamic.vue
+++ b/src/views/customer/components/drawer/Dynamic.vue
@@ -1,6 +1,60 @@
 <template>
   <div :class="prefixCls" >
     <div class="mb-20px">
+      <div class="mb-10px flex justify-between flex-items-center">
+        <div class="relative">
+          <a-dropdown :trigger="['click']">
+            <a-tooltip placement="top">
+              <template #title>
+                <span>鍒囨崲鍟嗘満</span>
+              </template>
+              <Icon
+                icon="iconamoon:swap"
+                class="cursor-pointer"
+                @click=""
+                :size="16"
+              />
+            </a-tooltip>
+            <template #overlay>
+              <a-menu
+                v-model:selectedKeys="selectedBusinessTitleKeys"
+                style="width: 220px"
+                @click="handleBusinessTitleClick"
+                :items="businessTitleArray"
+              >
+              </a-menu>
+            </template>
+          </a-dropdown>
+          <span class="font-bold ml-5px">{{ businessTitle }}</span>
+        </div>
+        <a-dropdown :trigger="['click']">
+          <MoreOutlined class="cursor-pointer mr-10px"/>
+          <template #overlay>
+            <a-menu>
+              <a-menu-item key="0" @click="editBusiness">
+                <span >缂栬緫鍟嗘満淇℃伅</span>
+              </a-menu-item>
+              <a-menu-item key="1" @click="addBusiness">
+                <span>鏂板缓鍟嗘満</span>
+              </a-menu-item>
+              <a-menu-item key="2" @click="removeBusiness">鍒犻櫎鍟嗘満</a-menu-item>
+            </a-menu>
+          </template>
+        </a-dropdown>
+      </div>
+      <a-row :gutter="12">
+        <a-col :span="10" class="font-size-13px">
+          閿�鍞噾棰� <span class="c-gray-4">CNY 0.00</span>
+        </a-col>
+        <a-col :span="10" class="font-size-13px">
+          缁撴潫鏃ユ湡 <span class="c-red-5">2024-10-30</span>
+        </a-col>
+        <a-col :span="4" class="font-size-13px">
+          澶囨敞 <span class="c-gray-4">--</span>
+        </a-col>
+      </a-row>
+    </div>
+    <div class="mb-20px">
       <a-button type="primary" shape="round" block @click="openFollowUpModal">
         <template #icon>
           <PlusCircleOutlined />
@@ -8,50 +62,86 @@
         娣诲姞璺熻繘
       </a-button>
     </div>
-    <div ref="wrapEl">
-      <div class="mb-20px flex justify-between flex-items-center">
-        <span class="font-bold">鍏� {{totalData}} 鏉�</span>
-        <TreeSelect
-          v-model:value="currentDynamicType"
-          :dropdownStyle="{color: 'red'}"
-          style="width: 120px"
-          placeholder="Please select"
-          :allow-clear="false"
-          :bordered="false"
-          tree-default-expand-all
-          :tree-data="dynamicTypeTree"
-          @change="handleDynamicTypeChange"
-        >
-        </TreeSelect>
+    <div class="mb-20px">
+      <ScheduleDetailModal @register="registerScheduleModal"></ScheduleDetailModal>
+      <div class="mb-10px flex justify-between flex-items-center">
+        <span class="font-bold">璁″垝鏃ョ▼</span>
+        <a-button shape="round" @click="openScheduleModal">娣诲姞鏃ョ▼</a-button>
       </div>
-      <Timeline >
-        <TimelineItem v-for="item in dynamicList" :key="item.id">
-          <Row>
-            <Col span="16" class="c-gray-4">
+      <div>
+        <template v-for="(item,index) in scheduleList" :key="item.id">
+          <a-row class="cursor-pointer mb-10px" :gutter="12" @click="handleScheduleRowClick" :data-index="index">
+            <a-col span="10" >
+              <a-avatar class="mb-3px" :size="10" :style="'background-color:'+ item.color" ></a-avatar>
+              <span class="ml-5px c-blue">{{ item.beginTime }}</span>
+            </a-col>
+            <a-col span="14">
+              <span>{{ item.cluesName }}</span>
+            </a-col>
+          </a-row>
+        </template>
+      </div>
+    </div>
+    <div ref="loadingEl">
+      <div class="mb-20px flex justify-between flex-items-center">
+        <span class="font-bold">鍘嗗彶鍔ㄦ��</span>
+
+<!--        <a-tree-select-->
+<!--          v-model:value="currentDynamicType"-->
+<!--          :dropdownStyle="{color: 'red'}"-->
+<!--          style="width: 120px"-->
+<!--          placeholder="Please select"-->
+<!--          :allow-clear="false"-->
+<!--          :bordered="false"-->
+<!--          tree-default-expand-all-->
+<!--          :tree-data="dynamicTypeTree"-->
+<!--          @change="handleDynamicTypeChange"-->
+<!--        >-->
+<!--        </a-tree-select>-->
+      </div>
+      <div class="mb-20px">
+        <a-radio-group size="default" v-model:value="currentDynamicType">
+          <a-radio-button value="0">鍏ㄩ儴({{totalData}})</a-radio-button>
+          <a-radio-button value="1">璺熻繘璁板綍({{totalData}})</a-radio-button>
+          <a-radio-button value="2">寰�鏉ラ偖浠�({{totalData}})</a-radio-button>
+          <a-radio-button value="3">鑱婂ぉ璁板綍({{totalData}})</a-radio-button>
+          <a-radio-button value="4">鍏朵粬({{totalData}})</a-radio-button>
+        </a-radio-group>
+<!--        <a-button type="primary">鍏ㄩ儴({{totalData}})</a-button>-->
+<!--        <a-button type="primary">璺熻繘璁板綍({{totalData}})</a-button>-->
+<!--        <a-button type="primary">寰�鏉ラ偖浠�({{totalData}})</a-button>-->
+<!--        <a-button type="primary">鑱婂ぉ璁板綍({{totalData}})</a-button>-->
+<!--        <a-button type="primary">鍏朵粬({{totalData}})</a-button>-->
+
+      </div>
+      <a-timeline >
+        <a-timeline-item v-for="item in dynamicList" :key="item.id">
+          <a-row>
+            <a-col span="16" class="c-gray-4">
               {{item.cluesName}}
-            </Col>
-            <Col :offset="2" span="6" class="c-gray-4">
+            </a-col>
+            <a-col :offset="2" span="6" class="c-gray-4">
               {{item.privateTime}}
-            </Col>
-          </Row>
+            </a-col>
+          </a-row>
           <div>
             {{item.failStatusName}}
           </div>
           <div>
-            <ImagePreviewGroup>
+            <a-image-preview-group>
               <template v-for="(img,index) in item.imageList" :key="index">
-                <Image :width="100" class="pr-10px" :src="img" />
+                <a-image :width="100" class="pr-10px" :src="img" />
               </template>
-            </ImagePreviewGroup>
+            </a-image-preview-group>
           </div>
-        </TimelineItem>
-      </Timeline>
+        </a-timeline-item>
+      </a-timeline>
     </div>
 
 <!--    show-size-changer-->
 <!--    show-quick-jumper-->
 <!--    :show-total="total => `鍏� ${total} 鏉℃暟鎹甡"-->
-    <Pagination
+    <a-pagination
       class="text-right"
       v-model:current="currentPage"
       v-model:page-size="pageSize"
@@ -64,24 +154,42 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { Timeline,Row,Col,ImagePreviewGroup,Image,Pagination,TreeSelect } from 'ant-design-vue';
+import {
+  Timeline,
+  Row,
+  Col,
+  ImagePreviewGroup,
+  Image,
+  Pagination,
+  TreeSelect,
+} from 'ant-design-vue';
   import Icon from '@/components/Icon/Icon.vue';
   import { applicationList } from './data';
   import {cluesDynamicApi} from "@/api/clues/dynamic";
   import {ref,unref,getCurrentInstance} from "vue";
   import {useLoading} from "@/components/Loading";
-  import {PlusCircleOutlined} from "@ant-design/icons-vue";
+  import {PlusCircleOutlined, PlusOutlined, SettingOutlined} from "@ant-design/icons-vue";
   import {treeOptionsListApi} from "@/api/demo/tree";
   import EventBus from "@/utils/eventBus";
-  const TimelineItem = Timeline.Item;
+  import {MoreOutlined} from "@ant-design/icons-vue";
+  import {BasicHelp} from "@/components/Basic";
+  import {log} from "vxe-table";
+  import {useModal} from "@/components/Modal";
+  import ScheduleDetailModal from "@/views/clues/components/drawer/ScheduleDetail.vue";
+  import {projectList} from "@/views/clues/components/drawer/data";
+  import {cluesListApi} from "@/api/clues/table";
+  // const TimelineItem = Timeline.Item;
 
-  const prefixCls = 'clues-tab-dynamic';
+  const prefixCls = 'customer-tab-dynamic';
 
+  let scheduleList = ref([] as any[]);
   let dynamicList = ref([] as any[]);
   let totalData = ref(0);
 
   let currentPage = ref(1);
   let pageSize = ref(10);
+
+
 
   const handlePageChange = (current: number, size: number) => {
     currentPage.value = current;
@@ -100,8 +208,75 @@
   };
   // let _this = getCurrentInstance();
 
+  let businessTitle = ref('鏂板晢鏈�');
+  let selectedBusinessTitleKeys = ref('1');
+  let businessTitleArray = ref([
+    {
+      key: '1',
+      label: '鏂板晢鏈�',
+      title: '鏂板晢鏈�',
+    },
+    {
+      key: '2',
+      label: '璁㈠崟纭',
+      title: '璁㈠崟纭',
+    },
+    {
+      key: '3',
+      label: '鏈夋剰鍚�',
+      title: '鏈夋剰鍚�',
+    },
+    {
+      key: '4',
+      label: '娴嬭瘯鏂扮殑鏈轰細',
+      title: '娴嬭瘯鏂扮殑鏈轰細',
+    },
+  ]);
+  function handleBusinessTitleClick(e){
+    Logger.log('handleBusinessTitleClick',e);
+    selectedBusinessTitleKeys.value = e?.key;
+    businessTitle.value = e?.item?.title;
+  }
+
+  // 鏃ョ▼鐩稿叧
+  const [registerScheduleModal, {openModal, setModalProps}] = useModal();
+  const openScheduleModal = () => {
+    Logger.log('鐐瑰嚮openScheduleModal');
+    EventBus.emit('openScheduleModal', {
+      title: '鏂板缓浠诲姟',
+      content: '鏂板缓浠诲姟鍐呭'
+    });
+  };
+  function handleScheduleRowClick(e) {
+    let index = e?.currentTarget?.dataset?.index;
+    Logger.log('handleScheduleRowClick', scheduleList.value[index]);
+    openModal(true, {
+      // record,
+      // isUpdate: true,
+    });
+  }
+  getCustomerScheduleList();
+  async function getCustomerScheduleList(){
+    let params = {
+      page: 1,
+      pageSize: 10,
+    };
+    try {
+      let res = await cluesListApi(params)
+      Logger.log('cluesListApi...',res);
+      // console.log(_this);
+      // _this.$set(dynamicList,res.items)
+      scheduleList.value = res.items;
+
+    } catch (e) {
+      Logger.error(e);
+    } finally {
+    }
+  }
+
+
   // 鍔ㄦ�佺被鍨媡reeData
-  let currentDynamicType = ref('0-0');
+  let currentDynamicType = ref('0');
   let dynamicTypeTree = ref([]);
   getTreeData();
   async function getTreeData() {
@@ -120,17 +295,19 @@
   }
 
   // 鍔ㄦ�佸垪琛ㄥ姞杞�
-  const wrapEl = ref<ElRef>(null);
+  const loadingEl = ref<ElRef>(null);
   const [openWrapLoading, closeWrapLoading] = useLoading({
-    target: wrapEl,
+    target: loadingEl,
     props: {
       tip: '鍔犺浇涓�...',
       absolute: true,
     },
   });
   // 鍔ㄦ�佸垪琛ㄦ暟鎹�
-  getCluesDynamicData();
-  async function getCluesDynamicData(){
+  setTimeout(()=>{
+    getCustomerDynamicList();
+  },50)
+  async function getCustomerDynamicList(){
     openWrapLoading();
     let params = {
       page: currentPage.value,
@@ -153,9 +330,11 @@
       closeWrapLoading();
     }
   }
+
+
 </script>
 <style lang="less">
-  .clues-tab-dynamic {
+  .customer-tab-dynamic {
     .ant-select-arrow{
       color: #000;
     }
diff --git a/src/views/customer/components/drawer/Tips.vue b/src/views/customer/components/drawer/Tips.vue
index a76795b..b652300 100644
--- a/src/views/customer/components/drawer/Tips.vue
+++ b/src/views/customer/components/drawer/Tips.vue
@@ -1,61 +1,29 @@
 <template>
-  <Row class="mb-10px">
-    <Col span="12">
-      <Dropdown :trigger="['click']" arrow @openChange="openChange">
-        <span class="cursor-pointer" @click.prevent>
-          {{ dropDownTitle }}
-          <BasicArrow :expand="false" down/>
-        </span>
-        <template #overlay>
-          <Menu @click="onMenuItemClick">
-            <MenuItem key="0">
-              <span>鏈畬鎴�</span>
-            </MenuItem>
-            <MenuItem key="1">
-              <span>宸插畬鎴�</span>
-            </MenuItem>
-          </Menu>
-        </template>
-      </Dropdown>
-    </Col>
-    <Col span="12" :style="'text-align:right'">
-      <Tooltip title="鏂板缓鏃ョ▼">
-        <PlusSquareOutlined class="cursor-pointer" style="fontSize:24px;color: #aaa"
-                            @click="openScheduleModal"/>
-      </Tooltip>
+  <div ref="loadingEl" class="bg-gray-50 p-10px">
+    <a-divider>
+      <span class="c-gray font-size-12px">浠ヤ笅鏄巻鍙茶褰�</span>
+    </a-divider>
+    <a-card class="mb-15px" style="width: auto" v-for="item in cardList" :key="item.id">
+      <p class="tips-title">
+        <AimOutlined class="c-amber-5" />
+        鍟嗘満"<a class="">{{item.cluesName}}</a>"宸茶繃浜嗙粨鍗曟棩鏈�
+      </p>
+      <p class="tips-content font-size-12px">
+        "<a class="">{{item.cluesName}}</a>"宸茶繃浜嗙粨鍗曟棩鏈燂紝浣嗕粛鏈粨鏉燂紙璧㈠崟/杈撳崟锛夛紝璇峰敖蹇窡杩�
+      </p>
+      <p class="tips-time">
 
-    </Col>
-  </Row>
-  <BasicTable
-    @register="registerTable"
-    @row-click="handleScheduleRowClick"
-  >
-    <template #bodyCell="{ column, record }">
-      <template v-if="column.key === 'cluesName'">
-        <div>
-          <Avatar :size="16" :style="'background-color:'+ record.color"></Avatar>
-          <span class="ml-5px">
-            {{ record.cluesName }}
-          </span>
-        </div>
-      </template>
-    </template>
-  </BasicTable>
-  <ScheduleDetailModal @register="registerScheduleModal"></ScheduleDetailModal>
-  <div>
-    <template v-for="item in projectList" :key="item.title">
-      <Row class="cursor-pointer" :gutter="[22,26]" align="middle">
-        <Col span="12">
-          <Avatar :size="16" :style="'background-color:'+ item.color"></Avatar>
-          <span class="ml-5px">{{ item.title }}</span>
-        </Col>
-        <Col span="12" :style="'text-align:right'">
-          <span>{{ item.content }}</span>
-        </Col>
-      </Row>
-    </template>
-
+      </p>
+      <a-flex justify="space-between">
+        <span class="c-gray font-size-12px">{{item.privateTime}}</span>
+        <a-button class="font-size-12px" type="link">缂栬緫鍟嗘満</a-button>
+      </a-flex>
+    </a-card>
+    <a-divider>
+      <span class="c-gray font-size-12px">宸叉樉绀哄叏閮ㄥ唴瀹�</span>
+    </a-divider>
   </div>
+
   <!--  <List :class="prefixCls" item-layout="horizontal" :data-source="projectList" :grid="{ column: 1, gutter: 12}" :pagination="pagination" >-->
   <!--    <template #renderItem="{ item }">-->
   <!--      <ListItem>-->
@@ -69,19 +37,18 @@
 <script lang="ts" setup>
 import {List, Avatar, Card, Row, Col, Dropdown, Menu, Tooltip, Tag} from 'ant-design-vue';
 import {projectList} from './data';
-import {PlusSquareOutlined} from '@ant-design/icons-vue';
+import {AimOutlined} from '@ant-design/icons-vue';
 import {BasicArrow} from "@/components/Basic";
-import {ref} from 'vue';
+import {onMounted, ref} from 'vue';
 import ScheduleDetailModal from './ScheduleDetail.vue';
 
-const ListItem = List.Item;
-const MenuItem = Menu.Item;
 
 import EventBus from '@/utils/eventBus';
 import {BasicTable, ColumnChangeParam, TableAction, useTable} from "@/components/Table";
-import {cluesListApi} from "@/api/clues/table";
+import {cluesDynamicApi} from "@/api/clues/dynamic";
 import {getEditCellColumns, getFormConfig} from "@/views/clues/components/tableData";
 import {useModal} from "@/components/Modal";
+import {useLoading} from "@/components/Loading";
 
 const [registerScheduleModal, {openModal, setModalProps}] = useModal();
 const openScheduleModal = () => {
@@ -92,93 +59,45 @@
   });
 };
 
-const pagination = {
-  onChange: (page: number) => {
-    console.log(page);
-  },
-  pageSize: 3,
-};
-
-const openChange = (status: boolean) => {
-  Logger.log('openChange', status);
-};
-const dropDownTitle = ref('鏈畬鎴�');
-const onMenuItemClick = (e: any) => {
-  let titles = ['鏈畬鎴�', '宸插畬鎴�'];
-  Logger.log('onMenuItemClick', e);
-  dropDownTitle.value = titles[e.key];
-};
-
-const [
-  registerTable,
-  {
-    // setLoading,
-    // setProps,
-    // getColumns,
-    // getDataSource,
-    // getRawDataSource,
-    // reload,
-    // getPaginationRef,
-    // setPagination,
-    // getSelectRows,
-    // getSelectRowKeys,
-    // setSelectedRowKeys,
-    // clearSelectedRowKeys,
-  },
-] = useTable({
-  canResize: true,
-  api: cluesListApi,
-  // beforeFetch: (params) => {
-  //   console.log('beforeFetch', params);
-  //   params.pageNo = params.page;
-  //   // return Promise.resolve(params);
-  // },
-  showIndexColumn: false,
-  columns: [
-    {
-      // title: '',
-      // defaultHidden: true,
-      dataIndex: 'cluesName',
-      width: 200
-    },
-    {
-      // title: '',
-      dataIndex: 'archiveTime',
-      width: 200,
-    },
-  ],
-  // defSort: {
-  //   pageNo: 1,
-  //   pageSize: 20,
-  //   field: 'name',
-  //   order: 'ascend',
-  // },
-  rowKey: 'id',
-  // showTableSetting: false,
-  // showIndexColumn: false, // 鏄惁鏄剧ず搴忓彿鍒�
-  // useSearchForm: false, // 浣跨敤鎼滅储琛ㄥ崟
-  // clickToRowSelect: false,
-  // formConfig: getFormConfig(), // 鎼滅储琛ㄥ崟閰嶇疆
-  pagination: {
-    // pageSize: 20,
-    pageSizeOptions: ['10', '20', '50', '100'],
-    defaultPageSize: 20,
-    // showSizeChanger: true,
+let cardList = ref([] as any[]);
+// tips Loading
+const loadingEl = ref<ElRef>(null);
+const [openWrapLoading, closeWrapLoading] = useLoading({
+  target: loadingEl,
+  props: {
+    tip: '鍔犺浇涓�...',
+    absolute: true,
   },
 });
+// tips鍒楄〃鏁版嵁
+// 鑾峰彇瀹㈡埛鍗$墖鏁版嵁
+setTimeout(() => {
+  getCustomerCardData();
+}, 50);
+async function getCustomerCardData(){
+  openWrapLoading();
+  let params = {
+    page: 1,
+    pageSize: 10,
+  };
+  try {
+    // cluesDynamicApi(params).then(res => {
+    //
+    // })
+    let res = await cluesDynamicApi(params)
+    Logger.log('cluesDynamicApi...',res);
+    // console.log(_this);
+    // _this.$set(dynamicList,res.items)
+    cardList.value = res.items;
 
-
-
-function handleScheduleRowClick(e) {
-  Logger.log('handleScheduleRowClick', e);
-  openModal(true, {
-    // record,
-    // isUpdate: true,
-  });
+  } catch (e) {
+    Logger.error(e);
+  } finally {
+    closeWrapLoading();
+  }
 }
 
-const prefixCls = 'account-center-project';
 </script>
-<style lang="less" >
+<style lang="less" scoped>
 
 </style>
diff --git a/src/views/customer/components/drawer/index.vue b/src/views/customer/components/drawer/index.vue
index a094217..a706754 100644
--- a/src/views/customer/components/drawer/index.vue
+++ b/src/views/customer/components/drawer/index.vue
@@ -154,7 +154,10 @@
       background-color: @component-background;
     }
     .scroll-wrap{
-      height: calc(100vh - 290px);
+      height: calc(100vh - 310px);
+    }
+    :deep(.scrollbar__wrap)   {
+      padding: 5px !important;
     }
   }
 </style>

--
Gitblit v1.8.0