任重 2 meses atrás
pai
commit
786f12ae85

+ 1 - 1
packages/app/src/interceptors/route.ts

@@ -23,7 +23,7 @@ const navigateToInterceptor = {
   invoke({ url }: { url: string }) {
     // console.log(url) // /pages/route-interceptor/index?name=feige&age=30
     const path = url.split('?')[0]
-    let needLoginPages: string[] = []
+    let needLoginPages: string[] = ['pages/home/index']
     // 为了防止开发时出现BUG,这里每次都获取一下。生产环境可以移到函数外,性能更好
     if (isDev) {
       needLoginPages = getNeedLoginPages()

+ 1 - 0
packages/merchant/src/components/data-form.ts

@@ -22,6 +22,7 @@ export type DataFormSchema<T = any> = {
     hiddenLabel?: boolean
     existing?: boolean
     required?: boolean
+    maxlength?: number
     props?: DataFormProps
   }
 }

+ 5 - 1
packages/merchant/src/components/data-form.vue

@@ -118,7 +118,8 @@ defineExpose({
       <!-- <wd-cell-group border> -->
       <template
         v-for="(
-          [prop, { type, label, labelWidth, hiddenLabel, existing, required, props }], index
+          [prop, { type, label, labelWidth, hiddenLabel, existing, required, props, maxlength }],
+          index
         ) in Object.entries(schema)"
         :key="index"
       >
@@ -174,6 +175,9 @@ defineExpose({
           <wd-textarea
             v-if="type === 'Textarea'"
             v-model="modelValue[prop]"
+            class="h-[20px]"
+            :maxlength="maxlength"
+            show-word-limit
             v-bind="{
               ...(direction === 'vertical'
                 ? verticalDefaultProps[type]

+ 2 - 2
packages/merchant/src/components/page-helper-evo.vue

@@ -124,9 +124,9 @@ export default {
       <div v-if="items.length" class="flex-grow flex flex-col">
         <slot :source="{ list: items }"></slot>
       </div>
-      <template v-if="nomore">
+      <!-- <template v-if="nomore">
         <div class="my-4"><wd-divider>没有更多了</wd-divider></div>
-      </template>
+      </template> -->
     </div>
   </div>
 </template>

+ 2 - 1
packages/merchant/src/composables/followUp.ts

@@ -32,9 +32,10 @@ export const useFollowUp = () => {
     },
     remark: {
       required: true,
-      type: 'TextField',
+      type: 'Textarea',
       label: '备注',
       labelWidth: 64,
+      maxlength: 100,
     },
   })
   const schemaTypeOffline = ref<DataFormSchema>({

+ 5 - 0
packages/merchant/src/core/libs/agent-requests.ts

@@ -123,6 +123,11 @@ export const getFollowUpPage = (query = {}) =>
     query,
   )
 /**
+ * 删除设计师跟进
+ * */
+export const deleteFollowItem = (id: number) =>
+  httpDelete(`/app-api/member/stylist-follow-up/delete`, { id })
+/**
  * 更新设计师跟进
  */
 export const updateFollowUp = (data: Partial<FollowUp>) =>

+ 2 - 2
packages/merchant/src/core/libs/requests.ts

@@ -79,7 +79,7 @@ export const getVendorAppInfo = () =>
 /**
  * 商家端-获取商家订单
  */
-export const getOrders = () =>
+export const getOrders = (query: {}) =>
   httpPost<
     ResPageData<{
       id: number
@@ -110,7 +110,7 @@ export const getOrders = () =>
       payType?: number
       payPoints?: number
     }>
-  >('/app-api/member/vendorApp/getPointsOrderByVendorPage')
+  >('/app-api/member/vendorApp/getPointsOrderByVendorPage', query)
 /**
  * 商家端-获取订单详情
  */

+ 142 - 32
packages/merchant/src/layouts/tabbar.vue

@@ -17,22 +17,46 @@ import {
 import { ComponentExposed } from 'vue-component-type-helpers'
 import { getDesignerList } from '../core/libs/requests'
 import { requestToast } from '@designer-hub/app/src/core/utils/common'
-import { createFollowUp } from '../core/libs/agent-requests'
+import { createFollowUp, getDesigners } from '../core/libs/agent-requests'
 import { useFollowUp } from '../composables/followUp'
-import { success } from '@/core/libs/svgs'
+import AMapWX from '@/pages/common/amap-wx.130'
 
+const action = ref(`${import.meta.env.VITE_SERVER_BASEURL}/app-api/infra/file/upload`)
+const fileList = ref<string[]>([])
 const userStore = useUserStore()
 const { userInfo, isAgent, isMerchant } = storeToRefs(userStore)
-const { schema, rules, schemaTypeOnline, schemaTypeOffline } = useFollowUp()
+const { schema, rules, schemaTypeOnline } = useFollowUp()
 const publishState = ref(false)
 const designerList = ref<any[]>([])
 const dataForm = ref({
   stylistId: '',
   followType: '1',
+  followTime: new Date().getTime(),
+  address: {
+    latitude: 0,
+    longitude: 0,
+    address: '',
+  },
+  imgUrl: '',
 })
+const currentAddress = ref<any>([])
 const dataFormRef = ref<ComponentExposed<typeof DataForm>>()
-const schemaTypeOfflineRef = ref<ComponentExposed<typeof DataForm>>()
 const schemaTypeOnlineRef = ref<ComponentExposed<typeof DataForm>>()
+// 地图实例化
+const AmapFun = new AMapWX.AMapWX({ key: 'efde483f8801a09d3c5db032556e6593' })
+const wxGetAddress = (longitude: number, latitude: number) => {
+  return new Promise((resolve, reject) => {
+    AmapFun.getRegeo({
+      location: `${longitude},${latitude}`,
+      success: (res: any) => {
+        resolve(res)
+      },
+      fail: (err: any) => {
+        reject(err)
+      },
+    })
+  })
+}
 const items = computed(() => {
   if (isAgent.value) {
     return [
@@ -80,6 +104,10 @@ const handleTabbarItemClick = (path: string) => {
       const { value } = designerList.value[0]
       dataForm.value.stylistId = value
     }
+    dataForm.value.address.address = ''
+    dataForm.value.address.latitude = 0
+    dataForm.value.address.longitude = 0
+    dataForm.value.imgUrl = ''
     publishState.value = true
     return
   }
@@ -94,34 +122,97 @@ const handleSubmit = async () => {
   if (!valid) {
     return
   }
+  if (fileList.value.length) {
+    const temp: string[] = []
+    fileList.value.forEach((each: any) => {
+      temp.push(JSON.parse(each.response).data)
+    })
+    dataForm.value.imgUrl = temp.join(',')
+  }
   console.log(dataForm.value)
-  const { code } = await requestToast(
-    () =>
-      createFollowUp({ ...dataForm.value, address: { address: '', latitude: '', longitude: '' } }),
-    {
-      success: true,
-      successTitle: '跟进成功',
-    },
-  )
+  if (!dataForm.value.imgUrl) {
+    uni.showToast({ icon: 'none', title: '请上传图片' })
+    return false
+  }
+  if (!dataForm.value.address && dataForm.value.followType === '1') {
+    uni.showToast({ icon: 'none', title: '请刷新定位' })
+    return false
+  }
+  const { code } = await requestToast(() => createFollowUp(dataForm.value), {
+    success: true,
+    successTitle: '跟进成功',
+  })
   if (code === 0) {
     publishState.value = false
   }
 }
+const handleChange = ({ fileList: files }) => {
+  fileList.value = files
+  console.log(fileList.value)
+}
 const getCurrentLocation = () => {
   console.log('点击地址')
-  uni.chooseAddress({
-    success: (success) => {
-      console.log('地理位置 成功', success)
+  uni.getLocation({
+    type: 'gcj02',
+    success: async (success: any) => {
+      currentAddress.value = await wxGetAddress(success?.longitude, success?.latitude)
+      const { name, latitude, longitude } = currentAddress.value[0]
+      dataForm.value.address.address = name
+      dataForm.value.address.latitude = latitude
+      dataForm.value.address.longitude = longitude
+      console.log('提交信息:::', dataForm.value)
     },
-    fail: (fail) => {
-      console.log('获取地址失败', fail)
+    fail: (err) => {
+      console.log('获取地址失败', err)
+      if (err.errCode === 1005 || err.errCode === 10001) {
+        console.log('位置权限未授权')
+        uni.authorize({
+          scope: 'scope.userLocation',
+          success: () => {
+            uni.getLocation({
+              type: 'gcj02',
+              success: async (success) => {
+                console.log('授权后,获取地址', success)
+                currentAddress.value = await wxGetAddress(success?.longitude, success?.latitude)
+                const { name, latitude, longitude } = currentAddress.value[0]
+                dataForm.value.address.address = name
+                dataForm.value.address.latitude = latitude
+                dataForm.value.address.longitude = longitude
+                console.log('提交信息:::', dataForm.value)
+              },
+              fail: function (err) {
+                console.log('获取位置失败:', err)
+              },
+            })
+          },
+          fail: function () {
+            console.log('用户拒绝授权,不再提示')
+            // 用户拒绝授权,可以选择记录下来,不再提示
+            uni.showToast({
+              title: '您拒绝了位置授权',
+              icon: 'none',
+              duration: 2000,
+            })
+            // 可以引导用户去设置中授权
+            uni.showModal({
+              title: '提示',
+              content: '请在系统设置中打开定位服务权限',
+              success: function (modalRes) {
+                if (modalRes.confirm) {
+                  uni.openSetting()
+                }
+              },
+            })
+          },
+        })
+      }
     },
   })
 }
 onMounted(async () => {
   const {
     data: { list },
-  } = await getDesignerList({
+  } = await getDesigners({
     brokerId: userInfo.value?.userId.toString(),
     pageNo: 1,
     pageSize: -1,
@@ -149,7 +240,7 @@ onMounted(async () => {
       @click="handleTabbarItemClick"
     />
     <wd-action-sheet v-model="publishState" title="创建跟进" @close="publishState = false">
-      <view class="flex flex-col p-4">
+      <view class="flex flex-col p-4 h-[calc(75vh)] overflow-y-auto">
         <div>
           <DataForm
             ref="dataFormRef"
@@ -167,24 +258,43 @@ onMounted(async () => {
               <label
                 class="text-sm font-normal leading-relaxed text-black/60 h-10 flex items-center"
               >
+                <span
+                  class="text-[#ef4343] text-base font-normal font-['PingFang_SC'] leading-normal visible"
+                >
+                  *
+                </span>
                 地址
               </label>
-              <div
-                class="wd-input h-[40px] lh-[40px] flex justify-between px-[20px]"
-                @click="getCurrentLocation"
-              >
-                <div>点击获取当前位置</div>
-                <wd-icon name="refresh" size="14px"></wd-icon>
+              <div class="wd-input h-[40px] lh-[40px] flex justify-between px-[20px]">
+                <div>
+                  {{ !dataForm.address.address ? '点击获取当前位置' : dataForm.address.address }}
+                </div>
+                <wd-icon name="refresh" size="14px" @click="getCurrentLocation"></wd-icon>
               </div>
             </div>
           </template>
-          <DataForm
-            ref="schemaTypeOnlineRef"
-            :schema="schemaTypeOnline"
-            :rules="rules"
-            direction="horizontal"
-            v-model="dataForm"
-          ></DataForm>
+          <div
+            class="grid mb-4 items-start"
+            :style="{ 'grid-template-columns': `${addUnit(64)} auto` }"
+          >
+            <label class="text-sm font-normal leading-relaxed text-black/60 h-10 flex items-center">
+              <span
+                class="text-[#ef4343] text-base font-normal font-['PingFang_SC'] leading-normal visible"
+              >
+                *
+              </span>
+              图片
+            </label>
+            <wd-upload
+              :file-list="fileList"
+              image-mode="aspectFill"
+              accept="media"
+              :action="action"
+              :multiple="true"
+              :limit="9"
+              @change="handleChange"
+            ></wd-upload>
+          </div>
         </div>
         <div><wd-button block :round="false" @click="handleSubmit">提交</wd-button></div>
       </view>

+ 2 - 1
packages/merchant/src/pages/agent/designer/detail.vue

@@ -148,7 +148,7 @@ onLoad(async (query) => {
       <div class="bg-white rounded-2xl shadow flex items-center p-4">
         <div class="relative">
           <wd-img width="64" height="64" round :src="data?.avatar"></wd-img>
-          <div v-if="data?.retryStatus" class="absolute right-0 bottom-1">
+          <div v-if="data?.retryStatus === 1" class="absolute right-0 bottom-1">
             <wd-img width="14" height="14" :src="link" round></wd-img>
           </div>
         </div>
@@ -385,6 +385,7 @@ onLoad(async (query) => {
                           width="70"
                           height="70"
                           :src="src"
+                          :enable-preview="true"
                         />
                       </template>
                     </div>

+ 200 - 28
packages/merchant/src/pages/agent/designer/index.vue

@@ -24,20 +24,109 @@ import { useUserStore } from '../../../store'
 import link from '@designer-hub/assets/src/libs/assets/link'
 import { beforeNow } from '@/utils/date-util'
 import { NetImages } from '@/core/libs/enums'
+import AMapWX from '@/pages/common/amap-wx.130'
+import { addUnit } from 'wot-design-uni/components/common/util'
 
+const action = ref(`${import.meta.env.VITE_SERVER_BASEURL}/app-api/infra/file/upload`)
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const searchText = ref('')
 const publishState = ref(false)
 const filterState = ref(false)
+const fileList = ref<string[]>([])
 const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
-const { schema, rules } = useFollowUp()
+const schemaTypeOnlineRef = ref<ComponentExposed<typeof DataForm>>()
+const { schema, rules, schemaTypeOnline } = useFollowUp()
 const memberLevelsStore = useMemberLevelsStore()
 const { memberLevels } = storeToRefs(memberLevelsStore)
 const { getMemberLevelLogo } = memberLevelsStore
-const followUpForm = ref({})
+const followUpForm = ref({
+  stylistId: '',
+  followType: '1',
+  followTime: new Date().getTime(),
+  address: {
+    latitude: 0,
+    longitude: 0,
+    address: '',
+  },
+  imgUrl: '',
+})
 const followUpFormRef = ref({})
-
+const currentAddress = ref<any>([])
+// 地图实例化
+const AmapFun = new AMapWX.AMapWX({ key: 'efde483f8801a09d3c5db032556e6593' })
+const wxGetAddress = (longitude: number, latitude: number) => {
+  return new Promise((resolve, reject) => {
+    AmapFun.getRegeo({
+      location: `${longitude},${latitude}`,
+      success: (res: any) => {
+        resolve(res)
+      },
+      fail: (err: any) => {
+        reject(err)
+      },
+    })
+  })
+}
+const getCurrentLocation = () => {
+  console.log('点击地址')
+  uni.getLocation({
+    type: 'gcj02',
+    success: async (success: any) => {
+      currentAddress.value = await wxGetAddress(success?.longitude, success?.latitude)
+      const { name, latitude, longitude } = currentAddress.value[0]
+      followUpForm.value.address.address = name
+      followUpForm.value.address.latitude = latitude
+      followUpForm.value.address.longitude = longitude
+      console.log('提交信息:::', followUpForm.value)
+    },
+    fail: (err) => {
+      console.log('获取地址失败', err)
+      if (err.errCode === 1005 || err.errCode === 10001) {
+        console.log('位置权限未授权')
+        uni.authorize({
+          scope: 'scope.userLocation',
+          success: () => {
+            uni.getLocation({
+              type: 'gcj02',
+              success: async (success) => {
+                console.log('授权后,获取地址', success)
+                currentAddress.value = await wxGetAddress(success?.longitude, success?.latitude)
+                const { name, latitude, longitude } = currentAddress.value[0]
+                followUpForm.value.address.address = name
+                followUpForm.value.address.latitude = latitude
+                followUpForm.value.address.longitude = longitude
+                console.log('提交信息:::', followUpForm.value)
+              },
+              fail: function (err) {
+                console.log('获取位置失败:', err)
+              },
+            })
+          },
+          fail: function () {
+            console.log('用户拒绝授权,不再提示')
+            // 用户拒绝授权,可以选择记录下来,不再提示
+            uni.showToast({
+              title: '您拒绝了位置授权',
+              icon: 'none',
+              duration: 2000,
+            })
+            // 可以引导用户去设置中授权
+            uni.showModal({
+              title: '提示',
+              content: '请在系统设置中打开定位服务权限',
+              success: function (modalRes) {
+                if (modalRes.confirm) {
+                  uni.openSetting()
+                }
+              },
+            })
+          },
+        })
+      }
+    },
+  })
+}
 const filterQuery = ref<{
   tags: any[]
   levels: any[]
@@ -46,6 +135,7 @@ const filterQuery = ref<{
   maxPoints?: string
   brokerId?: string
   recommend?: boolean
+  name?: string
 }>({
   tags: [],
   levels: [],
@@ -53,14 +143,26 @@ const filterQuery = ref<{
   brokerId: String(userInfo.value.userId),
 })
 const query = ref({})
-const searchFocus = () => {
+const searchFocus = async () => {
   console.log('focus')
 }
-const searchBlur = () => {
-  console.log('focus')
+const searchBlur = async () => {
+  console.log('Blur')
+  query.value = {
+    ...filterQuery.value,
+    tags: filterQuery.value.tags.join(','),
+    levels: filterQuery.value.levels.join(','),
+  }
+  await pageHelperRef.value?.refresh()
 }
-const search = () => {
+const search = async () => {
   console.log('search')
+  query.value = {
+    ...filterQuery.value,
+    tags: filterQuery.value.tags.join(','),
+    levels: filterQuery.value.levels.join(','),
+  }
+  await pageHelperRef.value?.refresh()
 }
 const cancelSearch = () => {
   console.log('cancel')
@@ -99,6 +201,10 @@ const saveFollowUp = (item: any) => {
   console.log(item)
   schema.value.stylistId.props.columns = [{ value: item.id, label: item.name }]
   followUpForm.value.stylistId = item.id
+  followUpForm.value.address.address = ''
+  followUpForm.value.address.latitude = 0
+  followUpForm.value.address.longitude = 0
+  followUpForm.value.imgUrl = ''
   publishState.value = true
 }
 const createFollowUpSubmit = async () => {
@@ -106,22 +212,33 @@ const createFollowUpSubmit = async () => {
   if (!valid) {
     return
   }
-  console.log(followUpForm.value)
-  const { code } = await requestToast(
-    () =>
-      createFollowUp({
-        ...followUpForm.value,
-        address: { address: '', latitude: '', longitude: '' },
-      }),
-    {
-      success: true,
-      successTitle: '跟进成功',
-    },
-  )
+  if (fileList.value.length) {
+    const temp: string[] = []
+    fileList.value.forEach((each: any) => {
+      temp.push(JSON.parse(each.response).data)
+    })
+    followUpForm.value.imgUrl = temp.join(',')
+  }
+  if (!followUpForm.value.imgUrl) {
+    uni.showToast({ icon: 'none', title: '请上传图片' })
+    return false
+  }
+  if (!followUpForm.value.address && followUpForm.value.followType === '1') {
+    uni.showToast({ icon: 'none', title: '请刷新定位' })
+    return false
+  }
+  const { code } = await requestToast(() => createFollowUp(followUpForm.value), {
+    success: true,
+    successTitle: '跟进成功',
+  })
   if (code === 0) {
     publishState.value = false
   }
 }
+const handleChange = ({ fileList: files }) => {
+  fileList.value = files
+  console.log(fileList.value)
+}
 const handleSubmit = () => {
   query.value = {
     ...filterQuery.value,
@@ -160,7 +277,7 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
         <div class="flex items-center justify-between bg-white pr-3.5">
           <div class="flex-1">
             <wd-search
-              v-model="searchText"
+              v-model="filterQuery.name"
               placeholder="输入设计师姓名模糊搜索"
               @focus="searchFocus"
               @blur="searchBlur"
@@ -189,7 +306,7 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                         round
                         :src="it.avatar || NetImages.DefaultAvatar"
                       ></wd-img>
-                      <div v-if="it.retryStatus" class="absolute right-0 bottom--1">
+                      <div v-if="it.retryStatus === 1" class="absolute right-0 bottom--1">
                         <wd-img width="14" height="14" :src="link"></wd-img>
                       </div>
                     </div>
@@ -205,7 +322,7 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                             class="h-4 rounded-[20px] justify-start items-center inline-flex flex-row ml-[9px]"
                           >
                             <div
-                              v-if="!it.recommend"
+                              v-if="it.recommend"
                               class="text-[10px] bg-[#fff3e4] px-[4px] py-[4px] c-[#f2a64f] rounded-[3px]"
                             >
                               推荐设计师
@@ -245,8 +362,11 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                 </div>
 
                 <div class="row-start-2 col-start-2 col-end-4">
-                  <div class="flex items-center justify-between w-full mt-[20px]">
-                    <div v-if="!it.followUp30Days" class="flex items-center">
+                  <div
+                    class="flex items-center w-full mt-[20px]"
+                    style="justify-content: flex-start"
+                  >
+                    <div v-if="!it.followUp30Days" class="flex items-center justify-center w-[30%]">
                       <div class="w-2 h-2 bg-[#89f4e2] rounded-full mr-[7px]"></div>
                       <div
                         class="text-black/90 text-xs font-normal font-['PingFang_SC'] leading-snug"
@@ -254,7 +374,10 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                         30天未跟进
                       </div>
                     </div>
-                    <div class="flex items-center" v-if="!it.generatePoints60Days">
+                    <div
+                      class="flex items-center justify-center w-[35%]"
+                      v-if="!it.generatePoints60Days"
+                    >
                       <div class="w-2 h-2 bg-[#ffb96a] rounded-full mr-[7px]"></div>
                       <div
                         class="text-black/90 text-xs font-normal font-['PingFang_SC'] leading-snug"
@@ -262,7 +385,10 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                         60天未产生积分
                       </div>
                     </div>
-                    <div class="flex items-center" v-if="!it.expendPoints60Days">
+                    <div
+                      class="flex items-center justify-center w-[35%]"
+                      v-if="!it.expendPoints60Days"
+                    >
                       <div class="w-2 h-2 bg-[#c493ff] rounded-full mr-[7px]"></div>
                       <div
                         class="text-black/90 text-xs font-normal font-['PingFang_SC'] leading-snug"
@@ -330,7 +456,7 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
     </PageHelperEvo>
   </view>
   <wd-action-sheet v-model="publishState" title="创建跟进" @close="publishState = false">
-    <view class="flex flex-col p-4">
+    <view class="flex flex-col p-4 overflow-y-auto h-[calc(75vh)]">
       <div>
         <DataForm
           ref="followUpFormRef"
@@ -339,13 +465,59 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
           :rules="rules"
           direction="horizontal"
         ></DataForm>
+        <!-- 根据 followType 值 区分 线下 线上 -->
+        <template v-if="followUpForm.followType === '1'">
+          <div
+            class="grid mb-4 items-start"
+            :style="{ 'grid-template-columns': `${addUnit(64)} auto` }"
+          >
+            <label class="text-sm font-normal leading-relaxed text-black/60 h-10 flex items-center">
+              <span
+                class="text-[#ef4343] text-base font-normal font-['PingFang_SC'] leading-normal visible"
+              >
+                *
+              </span>
+              地址
+            </label>
+            <div class="wd-input h-[40px] lh-[40px] flex justify-between px-[20px]">
+              <div>
+                {{
+                  !followUpForm.address.address ? '点击获取当前位置' : followUpForm.address.address
+                }}
+              </div>
+              <wd-icon name="refresh" size="14px" @click="getCurrentLocation"></wd-icon>
+            </div>
+          </div>
+        </template>
+        <div
+          class="grid mb-4 items-start"
+          :style="{ 'grid-template-columns': `${addUnit(64)} auto` }"
+        >
+          <label class="text-sm font-normal leading-relaxed text-black/60 h-10 flex items-center">
+            <span
+              class="text-[#ef4343] text-base font-normal font-['PingFang_SC'] leading-normal visible"
+            >
+              *
+            </span>
+            图片
+          </label>
+          <wd-upload
+            :file-list="fileList"
+            image-mode="aspectFill"
+            accept="media"
+            :action="action"
+            :multiple="true"
+            :limit="9"
+            @change="handleChange"
+          ></wd-upload>
+        </div>
       </div>
       <div><wd-button block :round="false" @click="createFollowUpSubmit">提交</wd-button></div>
     </view>
   </wd-action-sheet>
   <!-- 筛选action-sheet -->
   <wd-action-sheet v-model="filterState" title="筛选" @close="filterState = false">
-    <view class="flex flex-col p-4">
+    <view class="flex flex-col p-4 overflow-y-auto h-[calc(75vh)]">
       <SectionHeading title="标签"></SectionHeading>
       <wd-checkbox-group shape="button" v-model="filterQuery.tags">
         <template

+ 526 - 0
packages/merchant/src/pages/common/amap-wx.130.js

@@ -0,0 +1,526 @@
+function AMapWX(a) {
+  this.key = a.key
+  this.requestConfig = {
+    key: a.key,
+    s: 'rsx',
+    platform: 'WXJS',
+    appname: a.key,
+    sdkversion: '1.2.0',
+    logversion: '2.0',
+  }
+  this.MeRequestConfig = { key: a.key, serviceName: 'https://restapi.amap.com/rest/me' }
+}
+AMapWX.prototype.getWxLocation = function (a, b) {
+  wx.getLocation({
+    type: 'gcj02',
+    success: function (c) {
+      c = c.longitude + ',' + c.latitude
+      wx.setStorage({ key: 'userLocation', data: c })
+      b(c)
+    },
+    fail: function (c) {
+      wx.getStorage({
+        key: 'userLocation',
+        success: function (d) {
+          d.data && b(d.data)
+        },
+      })
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getMEKeywordsSearch = function (a) {
+  if (!a.options) return a.fail({ errCode: '0', errMsg: '\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570' })
+  const b = a.options
+  const c = this.MeRequestConfig
+  const d = {
+    key: c.key,
+    s: 'rsx',
+    platform: 'WXJS',
+    appname: a.key,
+    sdkversion: '1.2.0',
+    logversion: '2.0',
+  }
+  b.layerId && (d.layerId = b.layerId)
+  b.keywords && (d.keywords = b.keywords)
+  b.city && (d.city = b.city)
+  b.filter && (d.filter = b.filter)
+  b.sortrule && (d.sortrule = b.sortrule)
+  b.pageNum && (d.pageNum = b.pageNum)
+  b.pageSize && (d.pageSize = b.pageSize)
+  b.sig && (d.sig = b.sig)
+  wx.request({
+    url: c.serviceName + '/cpoint/datasearch/local',
+    data: d,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (e) {
+      ;(e = e.data) && e.status && e.status === '1' && e.code === 0
+        ? a.success(e.data)
+        : a.fail({ errCode: '0', errMsg: e })
+    },
+    fail: function (e) {
+      a.fail({ errCode: '0', errMsg: e.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getMEIdSearch = function (a) {
+  if (!a.options) return a.fail({ errCode: '0', errMsg: '\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570' })
+  const b = a.options
+  const c = this.MeRequestConfig
+  const d = {
+    key: c.key,
+    s: 'rsx',
+    platform: 'WXJS',
+    appname: a.key,
+    sdkversion: '1.2.0',
+    logversion: '2.0',
+  }
+  b.layerId && (d.layerId = b.layerId)
+  b.id && (d.id = b.id)
+  b.sig && (d.sig = b.sig)
+  wx.request({
+    url: c.serviceName + '/cpoint/datasearch/id',
+    data: d,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (e) {
+      ;(e = e.data) && e.status && e.status === '1' && e.code === 0
+        ? a.success(e.data)
+        : a.fail({ errCode: '0', errMsg: e })
+    },
+    fail: function (e) {
+      a.fail({ errCode: '0', errMsg: e.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getMEPolygonSearch = function (a) {
+  if (!a.options) return a.fail({ errCode: '0', errMsg: '\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570' })
+  const b = a.options
+  const c = this.MeRequestConfig
+  const d = {
+    key: c.key,
+    s: 'rsx',
+    platform: 'WXJS',
+    appname: a.key,
+    sdkversion: '1.2.0',
+    logversion: '2.0',
+  }
+  b.layerId && (d.layerId = b.layerId)
+  b.keywords && (d.keywords = b.keywords)
+  b.polygon && (d.polygon = b.polygon)
+  b.filter && (d.filter = b.filter)
+  b.sortrule && (d.sortrule = b.sortrule)
+  b.pageNum && (d.pageNum = b.pageNum)
+  b.pageSize && (d.pageSize = b.pageSize)
+  b.sig && (d.sig = b.sig)
+  wx.request({
+    url: c.serviceName + '/cpoint/datasearch/polygon',
+    data: d,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (e) {
+      ;(e = e.data) && e.status && e.status === '1' && e.code === 0
+        ? a.success(e.data)
+        : a.fail({ errCode: '0', errMsg: e })
+    },
+    fail: function (e) {
+      a.fail({ errCode: '0', errMsg: e.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getMEaroundSearch = function (a) {
+  if (!a.options) return a.fail({ errCode: '0', errMsg: '\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570' })
+  const b = a.options
+  const c = this.MeRequestConfig
+  const d = {
+    key: c.key,
+    s: 'rsx',
+    platform: 'WXJS',
+    appname: a.key,
+    sdkversion: '1.2.0',
+    logversion: '2.0',
+  }
+  b.layerId && (d.layerId = b.layerId)
+  b.keywords && (d.keywords = b.keywords)
+  b.center && (d.center = b.center)
+  b.radius && (d.radius = b.radius)
+  b.filter && (d.filter = b.filter)
+  b.sortrule && (d.sortrule = b.sortrule)
+  b.pageNum && (d.pageNum = b.pageNum)
+  b.pageSize && (d.pageSize = b.pageSize)
+  b.sig && (d.sig = b.sig)
+  wx.request({
+    url: c.serviceName + '/cpoint/datasearch/around',
+    data: d,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (e) {
+      ;(e = e.data) && e.status && e.status === '1' && e.code === 0
+        ? a.success(e.data)
+        : a.fail({ errCode: '0', errMsg: e })
+    },
+    fail: function (e) {
+      a.fail({ errCode: '0', errMsg: e.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getGeo = function (a) {
+  let b = this.requestConfig
+  const c = a.options
+  b = {
+    key: this.key,
+    extensions: 'all',
+    s: b.s,
+    platform: b.platform,
+    appname: this.key,
+    sdkversion: b.sdkversion,
+    logversion: b.logversion,
+  }
+  c.address && (b.address = c.address)
+  c.city && (b.city = c.city)
+  c.batch && (b.batch = c.batch)
+  c.sig && (b.sig = c.sig)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/geocode/geo',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (d) {
+      ;(d = d.data) && d.status && d.status === '1'
+        ? a.success(d)
+        : a.fail({ errCode: '0', errMsg: d })
+    },
+    fail: function (d) {
+      a.fail({ errCode: '0', errMsg: d.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getRegeo = function (a) {
+  function b(d) {
+    const e = c.requestConfig
+    wx.request({
+      url: 'https://restapi.amap.com/v3/geocode/regeo',
+      data: {
+        key: c.key,
+        location: d,
+        extensions: 'all',
+        s: e.s,
+        platform: e.platform,
+        appname: c.key,
+        sdkversion: e.sdkversion,
+        logversion: e.logversion,
+      },
+      method: 'GET',
+      header: { 'content-type': 'application/json' },
+      success: function (g) {
+        if (g.data.status && g.data.status == '1') {
+          g = g.data.regeocode
+          const h = g.addressComponent
+          let f = []
+          let k = g.roads[0].name + '\u9644\u8fd1'
+          let m = d.split(',')[0]
+          let n = d.split(',')[1]
+          if (g.pois && g.pois[0]) {
+            k = g.pois[0].name + '\u9644\u8fd1'
+            const l = g.pois[0].location
+            l && ((m = parseFloat(l.split(',')[0])), (n = parseFloat(l.split(',')[1])))
+          }
+          h.provice && f.push(h.provice)
+          h.city && f.push(h.city)
+          h.district && f.push(h.district)
+          h.streetNumber && h.streetNumber.street && h.streetNumber.number
+            ? (f.push(h.streetNumber.street), f.push(h.streetNumber.number))
+            : f.push(g.roads[0].name)
+          f = f.join('')
+          a.success([
+            {
+              iconPath: a.iconPath,
+              width: a.iconWidth,
+              height: a.iconHeight,
+              name: f,
+              desc: k,
+              longitude: m,
+              latitude: n,
+              id: 0,
+              regeocodeData: g,
+            },
+          ])
+        } else a.fail({ errCode: g.data.infocode, errMsg: g.data.info })
+      },
+      fail: function (g) {
+        a.fail({ errCode: '0', errMsg: g.errMsg || '' })
+      },
+    })
+  }
+  var c = this
+  a.location
+    ? b(a.location)
+    : c.getWxLocation(a, function (d) {
+        b(d)
+      })
+}
+AMapWX.prototype.getWeather = function (a) {
+  function b(g) {
+    let h = 'base'
+    a.type && a.type == 'forecast' && (h = 'all')
+    wx.request({
+      url: 'https://restapi.amap.com/v3/weather/weatherInfo',
+      data: {
+        key: d.key,
+        city: g,
+        extensions: h,
+        s: e.s,
+        platform: e.platform,
+        appname: d.key,
+        sdkversion: e.sdkversion,
+        logversion: e.logversion,
+      },
+      method: 'GET',
+      header: { 'content-type': 'application/json' },
+      success: function (f) {
+        if (f.data.status && f.data.status == '1')
+          if (f.data.lives) {
+            if ((f = f.data.lives) && f.length > 0) {
+              f = f[0]
+              const k = {
+                city: { text: '\u57ce\u5e02', data: f.city },
+                weather: { text: '\u5929\u6c14', data: f.weather },
+                temperature: { text: '\u6e29\u5ea6', data: f.temperature },
+                winddirection: { text: '\u98ce\u5411', data: f.winddirection + '\u98ce' },
+                windpower: { text: '\u98ce\u529b', data: f.windpower + '\u7ea7' },
+                humidity: { text: '\u6e7f\u5ea6', data: f.humidity + '%' },
+              }
+              k.liveData = f
+              a.success(k)
+            }
+          } else
+            f.data.forecasts && f.data.forecasts[0] && a.success({ forecast: f.data.forecasts[0] })
+        else a.fail({ errCode: f.data.infocode, errMsg: f.data.info })
+      },
+      fail: function (f) {
+        a.fail({ errCode: '0', errMsg: f.errMsg || '' })
+      },
+    })
+  }
+  function c(g) {
+    wx.request({
+      url: 'https://restapi.amap.com/v3/geocode/regeo',
+      data: {
+        key: d.key,
+        location: g,
+        extensions: 'all',
+        s: e.s,
+        platform: e.platform,
+        appname: d.key,
+        sdkversion: e.sdkversion,
+        logversion: e.logversion,
+      },
+      method: 'GET',
+      header: { 'content-type': 'application/json' },
+      success: function (h) {
+        if (h.data.status && h.data.status == '1') {
+          h = h.data.regeocode
+          if (h.addressComponent) var f = h.addressComponent.adcode
+          else h.aois && h.aois.length > 0 && (f = h.aois[0].adcode)
+          b(f)
+        } else a.fail({ errCode: h.data.infocode, errMsg: h.data.info })
+      },
+      fail: function (h) {
+        a.fail({ errCode: '0', errMsg: h.errMsg || '' })
+      },
+    })
+  }
+  var d = this
+  var e = d.requestConfig
+  a.city
+    ? b(a.city)
+    : d.getWxLocation(a, function (g) {
+        c(g)
+      })
+}
+AMapWX.prototype.getPoiAround = function (a) {
+  function b(e) {
+    e = {
+      key: c.key,
+      location: e,
+      s: d.s,
+      platform: d.platform,
+      appname: c.key,
+      sdkversion: d.sdkversion,
+      logversion: d.logversion,
+    }
+    a.querytypes && (e.types = a.querytypes)
+    a.querykeywords && (e.keywords = a.querykeywords)
+    wx.request({
+      url: 'https://restapi.amap.com/v3/place/around',
+      data: e,
+      method: 'GET',
+      header: { 'content-type': 'application/json' },
+      success: function (g) {
+        if (g.data.status && g.data.status == '1') {
+          if ((g = g.data) && g.pois) {
+            for (var h = [], f = 0; f < g.pois.length; f++) {
+              const k = f == 0 ? a.iconPathSelected : a.iconPath
+              h.push({
+                latitude: parseFloat(g.pois[f].location.split(',')[1]),
+                longitude: parseFloat(g.pois[f].location.split(',')[0]),
+                iconPath: k,
+                width: 22,
+                height: 32,
+                id: f,
+                name: g.pois[f].name,
+                address: g.pois[f].address,
+              })
+            }
+            a.success({ markers: h, poisData: g.pois })
+          }
+        } else a.fail({ errCode: g.data.infocode, errMsg: g.data.info })
+      },
+      fail: function (g) {
+        a.fail({ errCode: '0', errMsg: g.errMsg || '' })
+      },
+    })
+  }
+  var c = this
+  var d = c.requestConfig
+  a.location
+    ? b(a.location)
+    : c.getWxLocation(a, function (e) {
+        b(e)
+      })
+}
+AMapWX.prototype.getStaticmap = function (a) {
+  function b(e) {
+    c.push('location=' + e)
+    a.zoom && c.push('zoom=' + a.zoom)
+    a.size && c.push('size=' + a.size)
+    a.scale && c.push('scale=' + a.scale)
+    a.markers && c.push('markers=' + a.markers)
+    a.labels && c.push('labels=' + a.labels)
+    a.paths && c.push('paths=' + a.paths)
+    a.traffic && c.push('traffic=' + a.traffic)
+    e = 'https://restapi.amap.com/v3/staticmap?' + c.join('&')
+    a.success({ url: e })
+  }
+  var c = []
+  c.push('key=' + this.key)
+  const d = this.requestConfig
+  c.push('s=' + d.s)
+  c.push('platform=' + d.platform)
+  c.push('appname=' + d.appname)
+  c.push('sdkversion=' + d.sdkversion)
+  c.push('logversion=' + d.logversion)
+  a.location
+    ? b(a.location)
+    : this.getWxLocation(a, function (e) {
+        b(e)
+      })
+}
+AMapWX.prototype.getInputtips = function (a) {
+  const b = Object.assign({}, this.requestConfig)
+  a.location && (b.location = a.location)
+  a.keywords && (b.keywords = a.keywords)
+  a.type && (b.type = a.type)
+  a.city && (b.city = a.city)
+  a.citylimit && (b.citylimit = a.citylimit)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/assistant/inputtips',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (c) {
+      c && c.data && c.data.tips && a.success({ tips: c.data.tips })
+    },
+    fail: function (c) {
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getDrivingRoute = function (a) {
+  const b = Object.assign({}, this.requestConfig)
+  a.origin && (b.origin = a.origin)
+  a.destination && (b.destination = a.destination)
+  a.strategy && (b.strategy = a.strategy)
+  a.waypoints && (b.waypoints = a.waypoints)
+  a.avoidpolygons && (b.avoidpolygons = a.avoidpolygons)
+  a.avoidroad && (b.avoidroad = a.avoidroad)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/direction/driving',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (c) {
+      c &&
+        c.data &&
+        c.data.route &&
+        a.success({ paths: c.data.route.paths, taxi_cost: c.data.route.taxi_cost || '' })
+    },
+    fail: function (c) {
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getWalkingRoute = function (a) {
+  const b = Object.assign({}, this.requestConfig)
+  a.origin && (b.origin = a.origin)
+  a.destination && (b.destination = a.destination)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/direction/walking',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (c) {
+      c && c.data && c.data.route && a.success({ paths: c.data.route.paths })
+    },
+    fail: function (c) {
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getTransitRoute = function (a) {
+  const b = Object.assign({}, this.requestConfig)
+  a.origin && (b.origin = a.origin)
+  a.destination && (b.destination = a.destination)
+  a.strategy && (b.strategy = a.strategy)
+  a.city && (b.city = a.city)
+  a.cityd && (b.cityd = a.cityd)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/direction/transit/integrated',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (c) {
+      c &&
+        c.data &&
+        c.data.route &&
+        ((c = c.data.route),
+        a.success({
+          distance: c.distance || '',
+          taxi_cost: c.taxi_cost || '',
+          transits: c.transits,
+        }))
+    },
+    fail: function (c) {
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+AMapWX.prototype.getRidingRoute = function (a) {
+  const b = Object.assign({}, this.requestConfig)
+  a.origin && (b.origin = a.origin)
+  a.destination && (b.destination = a.destination)
+  wx.request({
+    url: 'https://restapi.amap.com/v3/direction/riding',
+    data: b,
+    method: 'GET',
+    header: { 'content-type': 'application/json' },
+    success: function (c) {
+      c && c.data && c.data.route && a.success({ paths: c.data.route.paths })
+    },
+    fail: function (c) {
+      a.fail({ errCode: '0', errMsg: c.errMsg || '' })
+    },
+  })
+}
+export default { AMapWX }

+ 26 - 3
packages/merchant/src/pages/mine/components/agent-mine.vue

@@ -11,12 +11,13 @@ import { storeToRefs } from 'pinia'
 import qrCode from '@designer-hub/assets/src/libs/assets/qrCode'
 import Card from '@designer-hub/app/src/components/card.vue'
 import SectionHeading from '@designer-hub/app/src/components/section-heading.vue'
-import { getFollowUpPage } from '@/core/libs/agent-requests'
+import { getFollowUpPage, deleteFollowItem } from '@/core/libs/agent-requests'
 import { locationIcon } from '@designer-hub/assets/src/svgs'
 import { dayjs } from 'wot-design-uni'
 import PageHelperEvo from '@/components/page-helper-evo.vue'
 import ListHelperEvo from '@/components/list-helper-evo.vue'
 
+const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const { data: agent, run: setAgent } = useRequest(() =>
@@ -63,6 +64,21 @@ const toSettings = () => {
 const toInvite = () => {
   uni.navigateTo({ url: '/pages/mine/agent/invite/index' })
 }
+const confirmDelete = (id: number) => {
+  uni.showModal({
+    title: '提示',
+    content: '是否确认删除该条跟进记录',
+    success: async (success: any) => {
+      if (!success.cancel) {
+        const { code, msg, data } = await deleteFollowItem(id)
+        console.log('点击了 确认删除', code, msg, data)
+        if (code === 0) {
+          await pageHelperRef.value?.refresh()
+        }
+      }
+    },
+  })
+}
 onMounted(async () => {
   await setAgent()
   await Promise.all([setYearTarget(), setDesignerData(), setFollowData()])
@@ -261,7 +277,11 @@ onMounted(async () => {
           </template>
         </div>
       </Card>
-      <PageHelperEvo :request="getFollowUpPage" :query="{ brokerId: userInfo.userId }">
+      <PageHelperEvo
+        ref="pageHelperRef"
+        :request="getFollowUpPage"
+        :query="{ brokerId: userInfo.userId }"
+      >
         <template #default="{ source }">
           <div class="flex flex-col gap-4">
             <template v-for="(it, index) in source?.list" :key="index">
@@ -298,6 +318,7 @@ onMounted(async () => {
                       width="70"
                       height="70"
                       :src="src"
+                      :enable-preview="true"
                     />
                   </template>
                 </div>
@@ -316,8 +337,10 @@ onMounted(async () => {
                   </div>
                   <div
                     class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-relaxed mr-[15px]"
+                    @click="confirmDelete(it.id)"
                   >
-                    渠道:{{ it?.brokerName }}
+                    删除
+                    <wd-icon name="close" size="14px"></wd-icon>
                   </div>
                 </div>
               </div>

+ 108 - 12
packages/merchant/src/pages/mine/index.vue

@@ -14,7 +14,7 @@ import {
 } from '../../core/libs/requests'
 
 import { storeToRefs } from 'pinia'
-import { isEmpty } from 'radash'
+import SectionHeading from '@designer-hub/app/src/components/section-heading.vue'
 import Card from '@designer-hub/app/src/components/card.vue'
 import { desinTopBg } from '@designer-hub/assets/src/svgs'
 import NavBarEvo from '@designer-hub/app/src/components/navbar-evo.vue'
@@ -23,8 +23,11 @@ import PageHelper from '../../components/page-helper.vue'
 import { useUserStore } from '@/store'
 import AgentMine from './components/agent-mine.vue'
 import PageHelperEvo from '@/components/page-helper-evo.vue'
+import { ComponentExposed } from 'vue-component-type-helpers'
 
+const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
 const userStore = useUserStore()
+const publishState = ref(false)
 const { isLogined, userInfo, isMerchant, isAgent } = storeToRefs(userStore)
 const { data, run: setData } = useRequest(() => getVendorAppInfo())
 const { data: orders, run: setOrders } = useRequest(() => getOrders())
@@ -42,12 +45,46 @@ const status = ref<any>({
   '3': '已取消',
   '4': '待交付',
 })
+const verifyTime = ref<Date[]>([])
+const filterQuery = ref<{
+  orderStatus?: number | null
+  dateTimeType?: number
+  verifyTime?: string
+}>({
+  orderStatus: null,
+  dateTimeType: 1,
+  verifyTime: '',
+})
+const query = ref({})
 const toInfoSeting = () => {
   uni.navigateTo({ url: '/pages/mine/merchant/merchant_settings' })
 }
 const toOrder = (order: any) => {
   uni.navigateTo({ url: `/pages/mine/merchant/orders/detail/index?id=${order.id}` })
 }
+const handleSubmit = async () => {
+  console.log('时间 查询')
+  query.value = { ...filterQuery.value, pageNo: 1, pageSize: -1 }
+  await pageHelperRef.value?.refresh()
+  publishState.value = false
+}
+const transformState = () => {
+  publishState.value = true
+}
+const radioChange = (value: number) => {
+  if (value !== 4) {
+    filterQuery.value.verifyTime = ''
+    verifyTime.value = []
+  }
+}
+function handleConfirm(time: any) {
+  console.log(time)
+  if (time.length) {
+    filterQuery.value.verifyTime = `${dayjs(time[0].format('YYYY-MM-DD hh:mm:ss'))},${dayjs(time[0].format('YYYY-MM-DD hh:mm:ss'))}`
+  } else {
+    filterQuery.value.verifyTime = ''
+  }
+}
 onShow(async () => {
   if (isLogined.value && isMerchant?.value) {
     await setData()
@@ -86,26 +123,37 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
             <wd-img width="64" height="64" round :src="data?.avatar" />
           </div>
           <div class="ml-[10px]">
-            <div class="text-black/90 text-lg font-normal font-['PingFang_SC'] leading-[10.18px] "  style="margin-top: -5px;">
+            <div
+              class="text-black/90 text-lg font-normal font-['PingFang_SC'] leading-[10.18px]"
+              style="margin-top: -5px"
+            >
               商家:{{ data?.vendorName }}
             </div>
-<!--            <div-->
-<!--              class="h-6 px-1.5 py-1 bg-[#f5f6fa] rounded justify-center items-center gap-2.5 inline-flex mt-[17px]"-->
-<!--            >-->
-<!--              <div class="text-[#8b8b8b] text-xs font-normal font-['PingFang_SC'] leading-none">-->
-<!--                {{ data?.id }}-->
-<!--              </div>-->
-<!--            </div>-->
+            <!--            <div-->
+            <!--              class="h-6 px-1.5 py-1 bg-[#f5f6fa] rounded justify-center items-center gap-2.5 inline-flex mt-[17px]"-->
+            <!--            >-->
+            <!--              <div class="text-[#8b8b8b] text-xs font-normal font-['PingFang_SC'] leading-none">-->
+            <!--                {{ data?.id }}-->
+            <!--              </div>-->
+            <!--            </div>-->
           </div>
         </div>
         <div class="flex items-center mt-[20px]">
           <div class="w-1 h-[19px] bg-[#2357e9] rounded-md"></div>
-          <div class="text-black text-lg font-normal font-['PingFang_SC'] leading-normal ml-[8px]">
-            记录
+          <div
+            class="text-black w-[100%] flex justify-between text-lg font-normal font-['PingFang_SC'] leading-normal ml-[8px]"
+          >
+            <div>记录</div>
+            <div class="flex justify-end items-center font-['PingFang_SC']" @click="transformState">
+              <div class="text-sm font-normal">
+                {{ dayjs().format('YYYY-MM-DD') }}
+              </div>
+              <wd-icon name="fill-arrow-down" size="22px"></wd-icon>
+            </div>
           </div>
         </div>
         <div class="mt-[16px]">
-          <PageHelperEvo :request="getOrders" :query="{}">
+          <PageHelperEvo ref="pageHelperRef" :request="getOrders" :query="query">
             <template #default="{ source }">
               <div class="flex flex-col gap-4">
                 <template v-for="(it, i) in source?.list" :key="i">
@@ -163,6 +211,54 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
           </PageHelperEvo>
         </div>
       </view>
+      <wd-action-sheet v-model="publishState" @close="publishState = false">
+        <view class="flex flex-col p-4 overflow-y-auto">
+          <SectionHeading custom-class="mb-[10px]" title="交易时间"></SectionHeading>
+          <wd-radio-group shape="button" v-model="filterQuery.dateTimeType" @change="radioChange">
+            <template
+              v-for="(tag, index) in [
+                { label: '本月', value: 1 },
+                { label: '上月', value: 2 },
+                { label: '近三月', value: 3 },
+                { label: '自定义', value: 4 },
+              ]"
+              :key="index"
+            >
+              <wd-radio :value="tag.value">
+                {{ tag.label }}
+              </wd-radio>
+            </template>
+          </wd-radio-group>
+          <SectionHeading custom-class="my-[10px]" title="自定义"></SectionHeading>
+          <wd-datetime-picker
+            :disabled="filterQuery.dateTimeType !== 4"
+            v-model="verifyTime"
+            type="date"
+            @confirm="handleConfirm"
+          ></wd-datetime-picker>
+          <SectionHeading custom-class="my-[10px]" title="订单状态"></SectionHeading>
+          <wd-radio-group shape="button" v-model="filterQuery.orderStatus">
+            <template
+              v-for="(tag, index) in [
+                { label: '已报名', value: 0 },
+                { label: '已完成', value: 1 },
+                { label: '未核销', value: 2 },
+                { label: '已取消', value: 3 },
+                { label: '待交付', value: 4 },
+              ]"
+              :key="index"
+            >
+              <wd-radio :value="tag.value">
+                {{ tag.label }}
+              </wd-radio>
+            </template>
+          </wd-radio-group>
+          <SectionHeading></SectionHeading>
+          <div class="mt-[20px]">
+            <wd-button block :round="false" @click="handleSubmit">确 认</wd-button>
+          </div>
+        </view>
+      </wd-action-sheet>
     </template>
   </view>
 </template>