Browse Source

Merge branch 'main' of https://github.com/omnia96/designer-hub

Jake 4 months ago
parent
commit
24a83a8da2
68 changed files with 1861 additions and 805 deletions
  1. 8 0
      packages/app/src/components/card.vue
  2. 8 0
      packages/app/src/components/hot-activity-item.vue
  3. 1 1
      packages/app/src/components/hot-activity.vue
  4. 161 1
      packages/app/src/core/libs/models.ts
  5. 21 9
      packages/app/src/core/utils/canvas.ts
  6. 1 1
      packages/app/src/core/utils/page-spy.ts
  7. 2 2
      packages/app/src/core/utils/router.ts
  8. 1 1
      packages/app/src/main.ts
  9. 1 1
      packages/app/src/pages-sub/material/calculator/index.vue
  10. 23 29
      packages/app/src/pages/home/activity/detail/index.vue
  11. 19 5
      packages/app/src/pages/home/components/activity-as-of.vue
  12. 1 1
      packages/app/src/pages/home/components/activity-count-down.vue
  13. 3 1
      packages/app/src/pages/home/components/register-card.vue
  14. 13 8
      packages/app/src/pages/home/components/schedule-card.vue
  15. 2 2
      packages/app/src/pages/home/index.vue
  16. 1 1
      packages/app/src/pages/home/mall/components/product.vue
  17. 1 1
      packages/app/src/pages/home/mall/confirm-order/index.vue
  18. 12 13
      packages/app/src/pages/home/mall/detail/index.vue
  19. 5 1
      packages/app/src/pages/home/mall/purchased/success/index.vue
  20. 1 1
      packages/app/src/pages/home/mall/shopping-cart/index.vue
  21. 1 1
      packages/app/src/pages/home/offline-activity/list/index.vue
  22. 20 18
      packages/app/src/pages/home/schedule/index.vue
  23. 1 1
      packages/app/src/pages/home/spread/case-shooting/index.vue
  24. 1 1
      packages/app/src/pages/home/spread/case-shooting/photographer/index.vue
  25. 3 1
      packages/app/src/pages/home/spread/index.vue
  26. 3 3
      packages/app/src/pages/home/spread/product-detail/index.vue
  27. 1 1
      packages/app/src/pages/home/spread/wx-agent-operation/index.vue
  28. 3 1
      packages/app/src/pages/home/study-tour/components/register-card.vue
  29. 1 1
      packages/app/src/pages/home/study-tour/detail.vue
  30. 1 2
      packages/app/src/pages/home/study-tour/index.vue
  31. 11 3
      packages/app/src/pages/messages/components/message-card.vue
  32. 2 2
      packages/app/src/pages/messages/index.vue
  33. 1 0
      packages/app/src/pages/mine/homepage/index.vue
  34. 1 1
      packages/app/src/pages/mine/index.vue
  35. 1 1
      packages/app/src/style/fonts.css
  36. 3 0
      packages/assets/src/assets/arc-bottom-blue.svg
  37. 5 0
      packages/assets/src/assets/link.svg
  38. 2 0
      packages/assets/src/libs/assets/arcBottomBlue.ts
  39. 2 0
      packages/assets/src/libs/assets/link.ts
  40. 4 4
      packages/merchant/env/.env.development
  41. 1 1
      packages/merchant/src/components/data-form.ts
  42. 6 1
      packages/merchant/src/components/data-form.vue
  43. 3 3
      packages/merchant/src/components/data-render.vue
  44. 27 9
      packages/merchant/src/components/list-helper-evo.vue
  45. 8 0
      packages/merchant/src/components/page-helper-evo.vue
  46. 4 2
      packages/merchant/src/composables/task.ts
  47. 8 5
      packages/merchant/src/core/libs/actions.ts
  48. 195 3
      packages/merchant/src/core/libs/agent-requests.ts
  49. 16 0
      packages/merchant/src/core/libs/messages.ts
  50. 1 1
      packages/merchant/src/core/libs/requests.ts
  51. 1 1
      packages/merchant/src/layouts/default.vue
  52. 26 1
      packages/merchant/src/pages.json
  53. 99 123
      packages/merchant/src/pages/agent/components/task-card.vue
  54. 186 0
      packages/merchant/src/pages/agent/designer/archives/activity/others/index.vue
  55. 20 0
      packages/merchant/src/pages/agent/designer/archives/award/photos/index.vue
  56. 82 52
      packages/merchant/src/pages/agent/designer/archives/index.vue
  57. 50 57
      packages/merchant/src/pages/agent/designer/archives/sale-info/index.vue
  58. 197 0
      packages/merchant/src/pages/agent/designer/archives/sale-info/others/index.vue
  59. 126 69
      packages/merchant/src/pages/agent/designer/detail.vue
  60. 23 10
      packages/merchant/src/pages/agent/designer/index.vue
  61. 98 68
      packages/merchant/src/pages/agent/tasks/detail/index.vue
  62. 27 113
      packages/merchant/src/pages/agent/tasks/index.vue
  63. 6 3
      packages/merchant/src/pages/agent/todo/index.vue
  64. 17 11
      packages/merchant/src/pages/home/index.vue
  65. 111 88
      packages/merchant/src/pages/mine/agent/invite/index.vue
  66. 127 33
      packages/merchant/src/pages/mine/components/agent-mine.vue
  67. 40 30
      packages/merchant/src/pages/mine/index.vue
  68. 4 1
      packages/merchant/src/types/uni-pages.d.ts

+ 8 - 0
packages/app/src/components/card.vue

@@ -10,6 +10,14 @@ defineProps({
   },
 })
 </script>
+<script lang="ts">
+export default {
+  options: {
+    virtualHost: true,
+    styleIsolation: 'shared',
+  },
+}
+</script>
 <template>
   <view
     class="rounded-2xl bg-white shadow-[0_16rpx_20rpx_-10rpx_rgba(0,0,0,0.05)] p-3.5 overflow-hidden box-border"

+ 8 - 0
packages/app/src/components/hot-activity-item.vue

@@ -6,6 +6,7 @@ import ButtonEvo from './button-evo.vue'
 import { useRouter } from '../core/utils/router'
 import { useActivity } from '../composables/activity'
 import { omit } from 'radash'
+import {getActivityStatusText} from "@/core/utils/common";
 
 const props = withDefaults(
   defineProps<{ options?: StudyTour | Activity; type?: 'studyTour' | 'activity' }>(),
@@ -39,6 +40,13 @@ const { listItemButtonText, statusText, status, difference, startAt, endAt, refr
           mode="scaleToFill"
         />
         <div
+          class="w-9 h-4 bg-black/60 rounded-[20px] backdrop-blur-[15px] absolute top-2.5 left-[7px] flex items-center justify-center"
+        >
+          <div class="text-white text-[9px] font-normal font-['PingFang_SC']">
+            {{ getActivityStatusText(options?.applyStartTime, options?.applyEndTime) }}
+          </div>
+        </div>
+        <div
           class="w-[202px] left-[119px] top-0 absolute text-black text-base font-normal font-['PingFang_SC'] leading-relaxed"
         >
           <!-- 活动预告 | 日本研学·东京艺术大学设计游学 -->

+ 1 - 1
packages/app/src/components/hot-activity.vue

@@ -26,7 +26,7 @@ onMounted(() => {
     </view>
     <div class="absolute left-0 right-0 top-1 bottom-6 z-1 py-3.5">
       <div class="h-full w-full relative">
-        <swiper class="" autoplay @change="(e) => (current = e.detail.current)">
+        <swiper class="" :autoplay="true" @change="(e) => (current = e.detail.current)">
           <template v-for="it of items" :key="it.id">
             <swiper-item class="">
               <HotActivityItem ref="item" :options="it.data" :type="it.type"></HotActivityItem>

+ 161 - 1
packages/app/src/core/libs/models.ts

@@ -323,6 +323,11 @@ export interface Activity {
    * 类型补充字段
    */
   studyTravelList?: Schedule[]
+  surplus?: number
+  studyAllowType?: string
+  studyAllowCount?: number
+  planStudyEndTime?: string
+  planStudyStartTime?: string
 }
 export interface StudyTour {
   id: number
@@ -377,6 +382,8 @@ export interface StudyTour {
   activityStartTime?: any
   activityEndTime?: any
   activityAddr?: any
+  activityAllowType?: string
+  activityAllowCount?: number
 }
 /**
  * 游学/活动的报名信息
@@ -405,6 +412,7 @@ export interface ActivitySignUp {
    * 活动ID
    */
   activityId?: number
+  avatar?: string
 }
 export interface MyStudyTour {
   id: number
@@ -742,6 +750,10 @@ export interface Designer {
   expendPoints60Days: boolean
   focus: boolean
   brokerId: number
+  /**
+   * 0 弱绑定 1 强绑定
+   */
+  retryStatus?: 0 | 1
 }
 export interface DesignerBasicInfo {
   id: number
@@ -822,7 +834,72 @@ export interface DesignerAward {
 }
 export interface DesignerEvent {
   name: string
-  applyTime: string
+  applyTime?: string
+  userId?: number
+  participationDate: string
+  id?: number
+}
+export interface DesignerPointsStatistics {
+  /**
+   * 剩余积分
+   */
+  points: number
+  /**
+   * 积分变动时间
+   */
+  pointsTime: string
+  /**
+   * 累计获得积分
+   */
+  gainPoints: number
+  /**
+   * 今年获得积分
+   */
+  gainPointsYear: number
+  /**
+   * 今年消耗积分
+   */
+  usePoints: number
+  /**
+   * 消耗积分
+   */
+  usePointsYear: number
+  /**
+   * 累计跟进次数
+   */
+  followUpCount: number
+  /**
+   * 今年跟进次数
+   */
+  followUpYearCount: number
+  /**
+   * 消耗次数
+   */
+  usageCount: number
+  /**
+   * 今年消耗次数
+   */
+  usageYearCount: number
+  /**
+   * 累计获得次数
+   */
+  obtainedCount: number
+  /**
+   * 今年获得次数
+   */
+  obtainedYearCount: number
+}
+export interface DesignerOrderSaleOther {
+  id: number
+  supplierName: string
+  brandName: string
+  saleTime: string
+  projectName: string
+  customerName: string
+  customerPhone: string
+  orderAmount: number
+  createTime: string
+  userId: number
 }
 export interface Broker {
   createTime: string
@@ -942,6 +1019,89 @@ export interface AgentPoint {
   remark: string
   createTime: string
 }
+export interface BrowseRecord {
+  /* */
+  createTime: Record<string, unknown>
+
+  /* */
+  updateTime: Record<string, unknown>
+
+  /* */
+  creator: string
+
+  /* */
+  updater: string
+
+  /* */
+  deleted: boolean
+
+  /* id */
+  id: number
+
+  /* 设计师id */
+  stylistId: number
+
+  /* 设计师名称 */
+  stylistName: string
+
+  /* 业务id */
+  bizId: string
+
+  /* 业务类型:分享-1,获客-2,浏览-3等具体查看BrowseTypeEnum类,可用值:1,2,3,4,5 */
+  bizType: string
+
+  /* 分享类型,可用值:1,2 */
+  shareType: string
+
+  /* 时长:单位-秒 */
+  duration: string
+
+  /* 创建人 */
+  creatorName: string
+
+  /* 备注 */
+  remark: string
+}
+/**
+ * 设计师动态统计
+ */
+export interface BrowseRecordCountRes {
+  /* 打开次数 */
+  openNumber: number
+
+  /* 最近打开时间 */
+  openTime: string
+
+  /* 浏览时间 */
+  duration: number
+
+  /* 本年浏览时间 */
+  durationYear: number
+
+  /* 发圈次数 */
+  circleNumber: number
+
+  /* 本年发圈次数 */
+  circleNumberYear: number
+
+  /* 主页分享 */
+  homeShareNumber: number
+
+  /* 本年分享 */
+  homeShareNumberYear: number
+
+  /* 分享浏览数 */
+  shareViewNumber: number
+
+  /* 本年分享浏览数 */
+  shareViewNumberYear: number
+
+  /* 分享获客数 */
+  customersAcquired: number
+
+  /* 本年分享获客数 */
+  customersAcquiredYear: number
+}
 
 export enum DictType {
   /**

+ 21 - 9
packages/app/src/core/utils/canvas.ts

@@ -131,15 +131,27 @@ export class Canvas {
   }
 
   /**
-   * 绘制水平的多个不同样式的文本 例如:'文本1: 123, 文本2: 456'
+   * 绘制水平居中一行多个不同样式的文本 例如:'文本1: 123, 文本2: 456'
    */
-  FillTexts(texts, colors, fontSizes, designX, designY, designSpacing) {
-    let x = designX
-    for (let i = 0; i < texts.length; i++) {
-      this.context.setFillStyle(colors[i])
-      this.context.setFontSize(this.px(fontSizes[i]))
-      this.context.fillText(texts[i], this.px(x), this.px(designY))
-      x += designSpacing[i]
-    }
+  FillTexts(textSegments: { text: string; font: string; color: string }[], designY): void {
+    // Calculate total text width
+    let totalWidth = 0
+    textSegments.forEach((segment) => {
+      this.context.font = segment.font
+      totalWidth += this.context.measureText(segment.text).width
+    })
+
+    // Starting x position for centered text
+    let startX = (this.size.width - totalWidth) / 2
+    const y = this.px(designY) // Fixed vertical position
+
+    // Draw each text segment
+    textSegments.forEach((segment) => {
+      this.context.font = segment.font
+      this.context.fillStyle = segment.color
+
+      this.context.fillText(segment.text, startX, y)
+      startX += this.context.measureText(segment.text).width // Move x position for next segment
+    })
   }
 }

+ 1 - 1
packages/app/src/core/utils/page-spy.ts

@@ -1,5 +1,5 @@
 import PageSpy from '@huolala-tech/page-spy-uniapp'
 export const pageSpy = new PageSpy({
-  api: 'page-spy.sxwobo.cn',
+  api: 'page-spy.sxwbny.com',
   title: '',
 })

+ 2 - 2
packages/app/src/core/utils/router.ts

@@ -29,8 +29,8 @@ export const useRouter = () => {
   const replace = async (path: string) => {
     uni.redirectTo({ url: path })
   }
-  const back = () => {
-    uni.navigateBack()
+  const back = (delta = 1) => {
+    uni.navigateBack({ delta }).then()
   }
   return { push, replace, back }
 }

+ 1 - 1
packages/app/src/main.ts

@@ -14,7 +14,7 @@ export function createApp() {
   app.use(routeInterceptor)
   app.use(requestInterceptor)
   app.use(prototypeInterceptor)
-  pageSpy.init()
+  pageSpy.init().then()
   return {
     app,
   }

+ 1 - 1
packages/app/src/pages-sub/material/calculator/index.vue

@@ -28,7 +28,7 @@ import calculatorBg from '@designer-hub/assets/src/libs/assets/calculatorBg'
     </div>
     <Card>
       <div
-        class="text-center text-[#ef4343] text-[40px] font-normal font-['D-DIN Exp'] leading-normal"
+        class="text-center text-[#ef4343] text-[40px] font-normal font-['D-DIN_Exp'] leading-normal"
       >
         16000
       </div>

+ 23 - 29
packages/app/src/pages/home/activity/detail/index.vue

@@ -32,7 +32,7 @@ import signupListDialogBg from '@designer-hub/assets/src/libs/assets/signupListD
 import { getActivityStatusText, getCountsArr } from '../../../../core/utils/common'
 import { extractColorsFromImageData } from 'extract-colors/lib/extract-colors.mjs'
 import { group, mapEntries, sort } from 'radash'
-import { Activity, StudyTour } from '../../../../core/libs/models'
+import { Activity, ActivitySignUp, ResPageData, StudyTour } from '../../../../core/libs/models'
 import mapLocation from '@designer-hub/assets/src/libs/assets/mapLocation'
 import cameraWhite from '@designer-hub/assets/src/libs/assets/cameraWhite'
 import ButtonEvo from '@/components/button-evo.vue'
@@ -56,10 +56,10 @@ const activityTypes = ref({ activity: '活动', studyTour: '游学' })
 const tab = ref(0)
 const request = ref<() => Promise<IResData<Partial<StudyTour> | Partial<Activity>>>>()
 const { data, run: setData } = useRequest(() => request.value(), { initialData: {} })
-const { data: signups, run: setSignups } = useRequest(
-  () => getActivitySignups({ activityId: id.value }),
-  { initialData: { list: [], total: 0 } },
-)
+const signUpsReq = ref<() => Promise<IResData<ResPageData<ActivitySignUp>>>>()
+const { data: signups, run: setSignups } = useRequest(() => signUpsReq.value(), {
+  initialData: { list: [], total: 0 },
+})
 const { data: levels, run: setLevels } = useRequest(() => getAppMemberLevelConfigs(), {
   initialData: [],
 })
@@ -67,7 +67,7 @@ const { data: photos, run: setPhotos } = useRequest(
   () =>
     getPhotoList({
       bizId: id.value,
-      bizType: { studyTour: '2', activity: '1' }[type.value],
+      bizType: { studyTour: '2', activity: '1' }[type.value] as '1' | '2',
       pageSize: -1,
     }),
   { initialData: { list: [], total: 0 } },
@@ -78,12 +78,6 @@ const listShow = ref(false)
 const dominantColor = ref()
 const isActivity = computed(() => type.value === 'activity')
 const isStudyTour = computed(() => type.value === 'studyTour')
-const levelsById = computed(() =>
-  levels.value.reduce((acc, item) => {
-    acc[item.id] = item
-    return acc
-  }, {}),
-)
 const levelsByMemberLevel = computed(() =>
   levels.value.reduce((acc, item) => {
     acc[item.memberLevel] = item
@@ -142,9 +136,7 @@ const infos = computed(() => [
     icon: user,
     title: `${activityTypes.value[type.value]}名额`,
     content: [
-      places.value === '不限制'
-        ? `不限制`
-        : `${data.value.signUpNumber}人/剩余${data.value.surplus}人`,
+      places.value === '不限制' ? `不限制` : `${places.value}人/剩余${data.value.surplus}人`,
     ],
     visable: true,
   },
@@ -183,9 +175,11 @@ onLoad(async (query: { id: string; type: 'activity' | 'studyTour' }) => {
   type.value = query.type
   if (type.value === 'activity') {
     request.value = () => getActivity(id.value)
+    signUpsReq.value = () => getActivitySignups({ activityId: id.value })
   }
   if (type.value === 'studyTour') {
     request.value = () => getStudyTour(id.value)
+    signUpsReq.value = () => getStudyTourSignups({ studyId: id.value })
   }
   await setData()
   const { path } = await uni.getImageInfo({ src: data.value.backgroundUrl })
@@ -245,20 +239,20 @@ onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailU
       ></canvas>
       <ImageEvo :src="data?.backgroundUrl"></ImageEvo>
       <!-- <wd-img width="100%" height="100%" :src="data?.backgroundUrl"></wd-img> -->
-      <div class="absolute left-3.5 bottom-3" @click="listShow = true">
-        <div
-          v-if="isStudyTour"
-          class="bg-white/20 rounded-[20px] backdrop-blur-[6px] px-3.5 py-1 flex gap-2.5"
-        >
-          <wd-img width="20" height="20" :src="bell"></wd-img>
-          <div class="text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal">
-            白金会员王凯峰已报名
-          </div>
-          <div class="w-6 bg-black aspect-square rounded-full flex items-center justify-center">
-            <wd-img width="18" height="18" :src="rightFill"></wd-img>
-          </div>
-        </div>
-        <div v-if="isActivity" class="flex items-center gap-1.25">
+      <div class="absolute left-3.5 bottom-3" @click="isActivity && (listShow = true)">
+        <!--        <div-->
+        <!--          v-if="isStudyTour"-->
+        <!--          class="bg-white/20 rounded-[20px] backdrop-blur-[6px] px-3.5 py-1 flex gap-2.5"-->
+        <!--        >-->
+        <!--          <wd-img width="20" height="20" :src="bell"></wd-img>-->
+        <!--          <div class="text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal">-->
+        <!--            白金会员王凯峰已报名-->
+        <!--          </div>-->
+        <!--          <div class="w-6 bg-black aspect-square rounded-full flex items-center justify-center">-->
+        <!--            <wd-img width="18" height="18" :src="rightFill"></wd-img>-->
+        <!--          </div>-->
+        <!--        </div>-->
+        <div class="flex items-center gap-1.25">
           <AvatarGroupCasual
             :urls="signups.list.map((it) => it.headImgUrl || NetImages.DefaultAvatar)"
             :width="40"

+ 19 - 5
packages/app/src/pages/home/components/activity-as-of.vue

@@ -3,12 +3,15 @@ import dayjs from 'dayjs'
 
 const props = defineProps<{ startAt?: string | number; endAt?: string | number }>()
 const emits = defineEmits<{ end: [] }>()
+const currentDate = ref(new Date())
+const interval = ref()
 const status = computed(() => {
-  // 如果当前时间小于开始时间返回等待中,如果当前时间大于等于开始时间小于等于结束时间返回进行中,当前时间大于结束时间返回已结束
-  const now = new Date()
-  if (dayjs(now).isBefore(dayjs(props.startAt))) {
+  if (dayjs(currentDate.value).isBefore(dayjs(props.startAt))) {
     return 'waiting'
-  } else if (dayjs(now).isAfter(dayjs(props.startAt)) && dayjs(now).isBefore(dayjs(props.endAt))) {
+  } else if (
+    dayjs(currentDate.value).isAfter(dayjs(props.startAt)) &&
+    dayjs(currentDate.value).isBefore(dayjs(props.endAt))
+  ) {
     return 'running'
   } else {
     return 'overdue'
@@ -20,6 +23,14 @@ const time = computed(() =>
     'millisecond',
   ),
 )
+onMounted(() => {
+  interval.value = setInterval(() => {
+    currentDate.value = new Date()
+  }, 1000)
+})
+onUnmounted(() => {
+  clearInterval(interval.value)
+})
 </script>
 <template>
   <div>
@@ -49,7 +60,10 @@ const time = computed(() =>
           <span v-if="current.seconds && !current.minutes && !current.hours && !current.days">
           </span>
-          <span>后 报名{{ { waiting: '开始', running: '截止' }[status] }}</span>
+          <span v-if="current.days || current.hours || current.minutes || current.seconds">
+            后 报名{{ { waiting: '开始', running: '截止' }[status] }}
+          </span>
+          <span v-else>加载中...</span>
         </div>
       </template>
     </wd-count-down>

+ 1 - 1
packages/app/src/pages/home/components/activity-count-down.vue

@@ -26,7 +26,7 @@ const time = ref(
     <wd-count-down :time="time" @finish="emits('end')">
       <template #default="{ current }">
         <div v-if="time" class="flex items-center gap-1.25 text-black/40 text-sm">
-          <div>距{{ { waiting: '报名开始', running: '报名结束' }[status] }}还</div>
+          <div>距{{ { waiting: '报名开始', running: '报名结束' }[status] }}还</div>
           <div
             v-if="current.days"
             class="w-4 h-4 bg-black/90 rounded text-white text-2.5 flex items-center justify-center"

+ 3 - 1
packages/app/src/pages/home/components/register-card.vue

@@ -7,6 +7,7 @@ import { getActivitySignups } from '../../../core/libs/requests'
 import { NetImages } from '../../../core/libs/net-images'
 import { useRouter } from '../../../core/utils/router'
 import { getActivityStatusButtonText, getActivityStatusText } from '../../../core/utils/common'
+import AvatarGroupCasual from '@/components/avatar-group-casual/avatar-group-casual.vue'
 
 const props = defineProps<{
   customClass?: string
@@ -51,7 +52,8 @@ onMounted(async () => {
             {{ signups.total }}人已报名
           </div>
         </view>
-        <div class="bg-[#27130d]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
+        <div class="w-full h-[46px] absolute top-0 bg-gradient-to-t from-black to-black/00"></div>
+        <div class="bg-[#010102]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
           <div
             class="w-[293px] text-white text-xl font-normal font-['PingFang_SC'] leading-relaxed"
           >

+ 13 - 8
packages/app/src/pages/home/components/schedule-card.vue

@@ -54,13 +54,15 @@ onMounted(() => {
 </script>
 <template>
   <view class="flex flex-col items-center aspect-[1.28/1]" :class="[customClass]">
-    <SectionHeading title="我的游学日程" custom-class="w-full"></SectionHeading>
-    <div
-      class="w-full my-3.5 text-[#acacac] text-sm font-normal font-['PingFang_SC'] leading-normal"
-    >
-      <!-- 6月26日 第二天 -->
-      {{ dayjs().format('M月D日') }}
-      第{{ Object.keys(schedules).findIndex((it) => it === dayjs().format('YYYY-MM-DD')) + 1 }}天
+    <div class="px-3.5 w-full box-border">
+      <SectionHeading title="我的游学日程" custom-class="w-full"></SectionHeading>
+      <div
+        class="w-full my-3.5 text-[#acacac] text-sm font-normal font-['PingFang_SC'] leading-normal"
+      >
+        <!-- 6月26日 第二天 -->
+        {{ dayjs().format('M月D日') }}
+        第{{ Object.keys(schedules).findIndex((it) => it === dayjs().format('YYYY-MM-DD')) + 1 }}天
+      </div>
     </div>
     <div
       class="w-80 bg-gradient-to-r from-[#141414] to-[#4b4949] rounded-tl-2xl rounded-tr-2xl p-6 box-border"
@@ -81,7 +83,10 @@ onMounted(() => {
               {{ it?.title }}
             </div>
           </view>
-          <div class="ml-6.5 text-white/40 text-sm font-normal font-['PingFang_SC'] leading-normal">
+          <div
+            v-if="!(data?.length === 2 && index === data?.length - 1)"
+            class="ml-6.5 text-white/40 text-sm font-normal font-['PingFang_SC'] leading-normal line-clamp-2 text-ellipsis overflow-hidden"
+          >
             <!-- 学习灯光设计师课程 -->
             {{ it?.travelDesc }}
           </div>

+ 2 - 2
packages/app/src/pages/home/index.vue

@@ -84,7 +84,7 @@ const handleLike = async (options) => {
     userId: userInfo.value.userId,
     userName: userInfo.value.nickname,
   })
-  pageHelperRef.value?.refresh()
+  await pageHelperRef.value?.refresh()
 }
 const setHotActivities = async () => {
   const res = await Promise.all([
@@ -104,7 +104,7 @@ const handlePlay = async (id) => {
   await updateSetIndexConfig(body)
 }
 onShow(async () => {
-  pageHelperRef.value?.reload()
+  await pageHelperRef.value?.reload()
   const reqs = [setHotActivities()]
   if (isLogined.value) {
     reqs.push(setStudyTours())

+ 1 - 1
packages/app/src/pages/home/mall/components/product.vue

@@ -65,7 +65,7 @@ const handleAddToCart = async () => {
     </div>
     <div class="flex items-center mb-6">
       <div class="flex items-end gap-1">
-        <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-5.5">
+        <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-5.5">
           <!-- 1000 -->
           {{ options.points }}
         </div>

+ 1 - 1
packages/app/src/pages/home/mall/confirm-order/index.vue

@@ -64,7 +64,7 @@ const handlePay = async () => {
 
   const couponList =
     selectedCoupons.value?.map((it) => ({
-      couponId: it.id,
+      couponId: it.couponId,
       projectIds: it.productIds,
       buinessId: it.buinessId,
     })) || []

+ 12 - 13
packages/app/src/pages/home/mall/detail/index.vue

@@ -88,7 +88,7 @@ onLoad(async (query: { id: string }) => {
     </div>
     <div class="relative flex-1 bg-white p-4 flex flex-col gap-4 rounded-tl-2xl rounded-tr-2xl">
       <div class="flex items-center gap-1">
-        <div class="text-[#ef4343] text-[26px] font-normal font-['D-DIN Exp'] leading-normal">
+        <div class="text-[#ef4343] text-[26px] font-normal font-['D-DIN_Exp'] leading-normal">
           <!-- 1000 -->
           {{ data?.points }}
         </div>
@@ -107,7 +107,7 @@ onLoad(async (query: { id: string }) => {
           已售{{ data?.exchangeCount || 0 }}件
         </div>
       </div>
-      <div class="h-4 text-black text-xl font-normal font-['PingFang_SC'] leading-[10.18px]">
+      <div class="text-black text-xl font-normal font-['PingFang_SC']">
         <!-- 阿芙佳朵 -->
         {{ data?.prodcutName }}
       </div>
@@ -115,16 +115,15 @@ onLoad(async (query: { id: string }) => {
       <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-normal">
         积分兑换说明:
       </div>
-      <div
-        class="w-[346px] h-[95px] text-black/40 text-xs font-normal font-['PingFang_SC'] leading-[23px]"
-      >
-        · 不限制兑换个数
-        <br />
-        · 兑换后不支持退换货,如有问题可联系官方客户
-        <br />
-        · 规格:件
-        <br />
-        · 配送方式:到店自取
+      <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-[23px]">
+        {{ data?.exchangeDesc }}
+        <!--        · 不限制兑换个数-->
+        <!--        <br />-->
+        <!--        · 兑换后不支持退换货,如有问题可联系官方客户-->
+        <!--        <br />-->
+        <!--        · 规格:件-->
+        <!--        <br />-->
+        <!--        · 配送方式:到店自取-->
       </div>
       <div class="mx--4 h-2.5 bg-neutral-100"></div>
       <wd-divider>
@@ -191,7 +190,7 @@ onLoad(async (query: { id: string }) => {
               {{ data?.prodcutName }}
             </div>
             <div class="flex items-center">
-              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal">
+              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal">
                 {{ data?.points }}
               </div>
               <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">

+ 5 - 1
packages/app/src/pages/home/mall/purchased/success/index.vue

@@ -17,8 +17,12 @@ const handle2Orders = () => {
   router.replace('/pages/mine/orders/index')
 }
 const handle2Mall = () => {
-  router.replace('/pages/home/mall/index')
+  // router.replace('/pages/home/mall/index')
+  router.back(2)
 }
+onLoad(() => {
+  console.log(getCurrentPages())
+})
 </script>
 <template>
   <div class="flex-grow flex flex-col px-3.5 justify-center items-center gap-7 bg-white">

+ 1 - 1
packages/app/src/pages/home/mall/shopping-cart/index.vue

@@ -171,7 +171,7 @@ const handlePlaceOrder = async () => {
                   </div>
                   <div class="flex items-center gap-1.25">
                     <div
-                      class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal"
+                      class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal"
                     >
                       {{ it.points }}
                     </div>

+ 1 - 1
packages/app/src/pages/home/offline-activity/list/index.vue

@@ -79,7 +79,7 @@ onMounted(async () => {
                           兑换积分:
                         </div>
                         <div
-                          class="text-[#ef4343] text-xl font-normal font-['D-DIN Exp'] leading-[34px]"
+                          class="text-[#ef4343] text-xl font-normal font-['D-DIN_Exp'] leading-[34px]"
                         >
                           {{ it.needPointsCount }}
                         </div>

+ 20 - 18
packages/app/src/pages/home/schedule/index.vue

@@ -110,26 +110,28 @@ onMounted(async () => {
                   {{ item.travelDesc }}
                 </span>
               </div>
-              <view class="flex items-center my-4">
-                <wd-img width="16" height="16" :src="camera"></wd-img>
+              <template v-if="item.clockExplainUrl">
+                <view class="flex items-center my-4">
+                  <wd-img width="16" height="16" :src="camera"></wd-img>
+                  <div
+                    class="ml-1 text-black/90 text-xs font-normal font-['PingFang_SC'] leading-normal"
+                  >
+                    打卡示例
+                  </div>
+                </view>
+                <div class="w-[285px]">
+                  <img
+                    v-if="item.clockExplainUrl"
+                    class="w-[285px] h-[157px] rounded-lg"
+                    :src="item.clockExplainUrl"
+                  />
+                </div>
                 <div
-                  class="ml-1 text-black/90 text-xs font-normal font-['PingFang_SC'] leading-normal"
+                  class="mt-2.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal"
                 >
-                  打卡示例
+                  {{ item.clockExplainDesc }}
                 </div>
-              </view>
-              <div class="w-[285px]">
-                <img
-                  v-if="item.clockExplainUrl"
-                  class="w-[285px] h-[157px] rounded-lg"
-                  :src="item.clockExplainUrl"
-                />
-              </div>
-              <div
-                class="mt-2.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal"
-              >
-                {{ item.clockExplainDesc }}
-              </div>
+              </template>
             </view>
           </view>
         </template>
@@ -142,7 +144,7 @@ onMounted(async () => {
         <!-- <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
           发布圈子可得
         </div>
-        <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal">
+        <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal">
           16000
         </div>
         <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">

+ 1 - 1
packages/app/src/pages/home/spread/case-shooting/index.vue

@@ -45,7 +45,7 @@ const router = useRouter()
               </div>
               <div class="flex items-center">
                 <div
-                  class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal"
+                  class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal"
                 >
                   <!-- 1600 -->
                   {{ it.points }}

+ 1 - 1
packages/app/src/pages/home/spread/case-shooting/photographer/index.vue

@@ -34,7 +34,7 @@ const data = ref([{}, {}, {}, {}, {}])
     <div
       class="bg-white/90 backdrop-blur-[20px] flex px-10 py-2.5 border-t-1 border-t-solid border-t-[#ececec]"
     >
-      <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">0</div>
+      <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-normal">0</div>
       <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
         积分
       </div>

+ 3 - 1
packages/app/src/pages/home/spread/index.vue

@@ -19,6 +19,8 @@ const { data, run: setData } = useRequest(
   () =>
     getContents({
       contentType: '3',
+      contentCategory: '301',
+      pageSize: '3',
     }),
   {
     initialData: { list: [] },
@@ -87,7 +89,7 @@ onMounted(async () => {
 "
     ></info-card>
     <section-heading title="最新资讯"></section-heading>
-    <div class="my-6">
+    <div class="my-6 flex flex-col gap-6">
       <template v-for="(it, i) in data.list" :key="i">
         <ElegantInfoCard :options="it"></ElegantInfoCard>
       </template>

+ 3 - 3
packages/app/src/pages/home/spread/product-detail/index.vue

@@ -74,7 +74,7 @@ onLoad(async (query: { id: string; title: string; item: string }) => {
     </div>
     <div class="relative flex-1 bg-white p-4 flex flex-col gap-4 rounded-tl-2xl rounded-tr-2xl">
       <div class="flex items-center gap-1">
-        <div class="text-[#ef4343] text-[26px] font-normal font-['D-DIN Exp'] leading-normal">
+        <div class="text-[#ef4343] text-[26px] font-normal font-['D-DIN_Exp'] leading-normal">
           {{ data?.points }}
         </div>
         <div class="text-black/60 text-base font-normal font-['PingFang_SC'] leading-[34px]">
@@ -145,7 +145,7 @@ onLoad(async (query: { id: string; title: string; item: string }) => {
       <div
         class="bg-white/90 backdrop-blur-[20px] flex px-10 py-2.5 border-t-1 border-t-solid border-t-[#ececec]"
       >
-        <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">
+        <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-normal">
           {{ data?.points }}
         </div>
         <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
@@ -175,7 +175,7 @@ onLoad(async (query: { id: string; title: string; item: string }) => {
               {{ data?.prodcutName }}
             </div>
             <div class="flex items-center">
-              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal">
+              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal">
                 {{ data?.points }}
               </div>
               <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">

+ 1 - 1
packages/app/src/pages/home/spread/wx-agent-operation/index.vue

@@ -43,7 +43,7 @@ const router = useRouter()
               </div>
             </div>
             <div class="flex items-center">
-              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN Exp'] leading-normal">
+              <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal">
                 <!-- 1600 -->
                 {{ it.points }}
               </div>

+ 3 - 1
packages/app/src/pages/home/study-tour/components/register-card.vue

@@ -7,6 +7,7 @@ import { getActivitySignups, getStudyTourSignups } from '../../../../core/libs/r
 import { NetImages } from '../../../../core/libs/net-images'
 import { useRouter } from '../../../../core/utils/router'
 import { getActivityStatusButtonText, getActivityStatusText } from '../../../../core/utils/common'
+import AvatarGroupCasual from '@/components/avatar-group-casual/avatar-group-casual.vue'
 
 const props = defineProps<{
   customClass?: string
@@ -51,7 +52,8 @@ onMounted(async () => {
             {{ signups.total }}人已报名
           </div>
         </view>
-        <div class="bg-[#27130d]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
+        <div class="w-full h-[46px] absolute top-0 bg-gradient-to-t from-black to-black/00"></div>
+        <div class="bg-[#010102]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
           <div
             class="w-[293px] text-white text-xl font-normal font-['PingFang_SC'] leading-relaxed"
           >

+ 1 - 1
packages/app/src/pages/home/study-tour/detail.vue

@@ -108,7 +108,7 @@ onLoad(async (query: { id: string }) => {
     <div
       class="fixed bottom-4 w-[347px] h-[63px] bg-white/90 rounded-2xl backdrop-blur-[20px] flex items-center px-4 box-border"
     >
-      <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN Exp'] leading-normal">16000</div>
+      <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-normal">16000</div>
       <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
         积分
       </div>

+ 1 - 2
packages/app/src/pages/home/study-tour/index.vue

@@ -11,7 +11,6 @@ import Card from '@/components/card.vue'
 import MomentItem from '@/components/moment-item.vue'
 import SectionHeading from '@/components/section-heading.vue'
 import ClassItem from '../components/class-item.vue'
-import TimeLine from './components/time-line.vue'
 import {
   getAppMemberLevelConfigs,
   getBanners,
@@ -128,7 +127,7 @@ onMounted(async () => {
         </div>
         <view class="flex items-center justify-between">
           <view class="flex items-end">
-            <div class="text-white text-3xl font-bold font-['D-DIN Exp'] leading-normal">16000</div>
+            <div class="text-white text-3xl font-bold font-['D-DIN_Exp'] leading-normal">16000</div>
             <div class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
               积分
             </div>

+ 11 - 3
packages/app/src/pages/messages/components/message-card.vue

@@ -27,7 +27,7 @@ const { data: coupons, run: setCoupons } = useRequest(
     }),
   { initialData: [] },
 )
-onMounted(async () => {
+const init = async () => {
   if (
     props.options.messageType === MessageType.Integral &&
     props.options.messageSubType === 31 &&
@@ -36,6 +36,15 @@ onMounted(async () => {
     await setCoupons()
     // console.log(coupons.value)
   }
+}
+watch(
+  () => props.options,
+  async () => {
+    await init()
+  },
+)
+onMounted(async () => {
+  // await init()
 })
 </script>
 <template>
@@ -72,10 +81,9 @@ onMounted(async () => {
         <div class="my-3 text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[25px]">
           <!-- {{ options.detailBody }} -->
           <div
-            v-if="options.messageType === MessageType.Integral"
+            v-if="[MessageType.Integral, MessageType.System].includes(options.messageType)"
             v-html="options.detailBody"
           ></div>
-          <div v-html="options.detailBody"></div>
           <div class="grid grid-cols-[auto_1fr] gap-x-5 gap-y-4.5">
             <template v-if="options.messageSubType === 31 && options.isRead !== '1'">
               <div

+ 2 - 2
packages/app/src/pages/messages/index.vue

@@ -55,7 +55,7 @@ const handleCancel = async (message: Message) => {
     beforeConfirm: async ({ resolve }) => {
       if (!cancelReason.value) {
         resolve(false)
-        uni.showToast({ title: '请输入驳回原因', icon: 'none' })
+        await uni.showToast({title: '请输入驳回原因', icon: 'none'})
         return
       }
       await requestToast(
@@ -97,7 +97,7 @@ const handleQ = async (msg, res) => {
   show.value = true
 }
 onShow(async () => {
-  nextTick(() => {
+  await nextTick(() => {
     pageHelperRef.value?.reload()
   })
 })

+ 1 - 0
packages/app/src/pages/mine/homepage/index.vue

@@ -131,6 +131,7 @@ const handleUnbundle = async () => {
   })
 }
 onLoad(async (query: { id: string; isShared?: string }) => {
+  console.log(query)
   if (query.id) {
     id.value = query.id
   } else {

+ 1 - 1
packages/app/src/pages/mine/index.vue

@@ -394,7 +394,7 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
           </div>
           <div class="flex items-end mt-10">
             <div>
-              <span class="text-4xl font-normal font-['D-DIN Exp'] mr-1">
+              <span class="text-4xl font-normal font-['D-DIN_Exp'] mr-1">
                 {{ userInfo.level?.point }}
               </span>
               <span class="text-center text-xs font-normal font-['PingFang_SC']">积分</span>

+ 1 - 1
packages/app/src/style/fonts.css

@@ -8,7 +8,7 @@
   font-display: swap;
 }
 @font-face {
-  font-family: 'D-DIN Exp';
+  font-family: 'D-DIN_Exp';
   font-style: normal;
   font-weight: normal;
   src:

+ 3 - 0
packages/assets/src/assets/arc-bottom-blue.svg

@@ -0,0 +1,3 @@
+<svg width="17" height="6" viewBox="0 0 17 6" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.8449 0.390247C13.176 2.15093 10.9238 3.12167 8.50003 3.12167C6.07669 3.12167 3.82377 2.15087 2.15515 0.390247C1.6808 -0.111353 0.890391 -0.131751 0.390316 0.34262C-0.110686 0.815756 -0.132203 1.60618 0.342091 2.10668C2.48682 4.37124 5.38445 5.61796 8.49996 5.61796C11.6161 5.61796 14.5131 4.37117 16.6578 2.10668C17.1322 1.60614 17.1106 0.815679 16.6102 0.34262C16.1097 -0.131731 15.3199 -0.110157 14.8449 0.390247Z" fill="#2357E9"/>
+</svg>

+ 5 - 0
packages/assets/src/assets/link.svg

@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <circle cx="8" cy="8" r="7.25" fill="#FFF0F0" stroke="white" stroke-width="0.5"/>
+    <path d="M9.13659 7.03065C9.07294 6.95733 9.00429 6.89044 8.93311 6.82789L8.93297 6.828C8.8608 6.74805 8.75891 6.69474 8.64299 6.68654C8.40508 6.66971 8.19858 6.84892 8.18175 7.08682C8.1743 7.19209 8.20529 7.29118 8.26273 7.37045C8.26274 7.37046 8.26275 7.37048 8.26277 7.3705C8.29036 7.40857 8.32402 7.4421 8.36254 7.46948C8.40079 7.50584 8.43832 7.54165 8.47297 7.58157L8.50596 7.6196C8.92086 8.09709 8.73322 8.85588 8.25518 9.27075L6.21533 11.0405C5.73734 11.4548 5.01153 11.4034 4.59662 10.9259L4.56336 10.8876C4.14848 10.4096 4.19987 9.68322 4.67786 9.26945L5.57905 8.48764C5.6931 8.40956 5.77178 8.28218 5.7823 8.13362C5.80058 7.87522 5.60593 7.65093 5.34754 7.63265C5.25003 7.62575 5.15741 7.6492 5.07885 7.69492C5.07864 7.69441 5.07843 7.69391 5.07821 7.69338L5.06865 7.70114C5.03383 7.72262 5.0019 7.74843 4.9738 7.77809L4.04123 8.53465C3.16083 9.29922 3.06562 10.6448 3.82967 11.5246L3.86267 11.5626C4.62671 12.4424 5.97174 12.5376 6.85206 11.7741L8.89139 10.0038C9.77061 9.23977 9.93199 7.94778 9.16909 7.06807L9.13659 7.03065Z" fill="#FF2E2E"/>
+    <path d="M12.0797 4.43098L12.0467 4.39295C11.2827 3.5126 9.93763 3.41742 9.05728 4.18143L7.01795 5.95175C6.13759 6.71576 6.00831 7.89983 6.77227 8.78072L6.80478 8.8176C6.83948 8.85757 6.87575 8.89551 6.91292 8.93206C6.9393 8.96607 6.971 8.99583 7.00686 9.02013C7.00713 9.02038 7.00741 9.02063 7.00768 9.02088L7.00781 9.02078C7.06499 9.05927 7.13265 9.08387 7.20635 9.08908C7.43095 9.10498 7.6259 8.93577 7.64179 8.7112C7.64628 8.64781 7.636 8.58678 7.61391 8.53146C7.56869 8.40694 7.47325 8.32633 7.40857 8.25179L7.37604 8.21493C6.96119 7.7369 7.17662 7.1003 7.65464 6.68545L9.69506 4.91575C10.172 4.5008 10.898 4.55217 11.3129 5.03022L11.346 5.06768C11.7608 5.54575 11.7094 6.27237 11.2314 6.68667L10.3331 7.46678C10.213 7.54326 10.1294 7.67365 10.1186 7.82658C10.1005 8.08288 10.2935 8.30537 10.5498 8.3235C10.639 8.32982 10.7241 8.31048 10.7979 8.27187C10.7984 8.27281 10.7988 8.27369 10.7993 8.27464L10.8132 8.26355C10.8552 8.23955 10.8931 8.20912 10.9257 8.17357L11.8675 7.42033C12.7485 6.65638 12.8437 5.31132 12.0797 4.43098Z" fill="#FF2E2E"/>
+</svg>

+ 2 - 0
packages/assets/src/libs/assets/arcBottomBlue.ts

@@ -0,0 +1,2 @@
+import arcBottomBlue from '../../assets/arc-bottom-blue.svg' 
+ export default arcBottomBlue

+ 2 - 0
packages/assets/src/libs/assets/link.ts

@@ -0,0 +1,2 @@
+import link from '../../assets/link.svg' 
+ export default link

+ 4 - 4
packages/merchant/env/.env.development

@@ -1,10 +1,10 @@
 # 变量必须以 VITE_ 为前缀才能暴露给外部读取
-NODE_ENV = 'development'
+NODE_ENV='development'
 # 是否去除console 和 debugger
-VITE_DELETE_CONSOLE = false
+VITE_DELETE_CONSOLE=false
 # 是否开启sourcemap
-VITE_SHOW_SOURCEMAP = true
+VITE_SHOW_SOURCEMAP=true
 
 VITE_SERVER_BASEURL='https://www.zhuchaohui.com'
 # VITE_SERVER_BASEURL = 'http://39.106.91.179:48080'
-# VITE_SERVER_BASEURL = 'http://192.168.2.58:48080'
+# VITE_SERVER_BASEURL='http://192.168.2.58:48080'

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

@@ -1,5 +1,5 @@
 export interface DataFormProps {
-  defaultValue?: Date
+  defaultValue?: Date | string | number
   placeholder?: string
   columns?: { label: string; value: string | number }[]
   disabled?: boolean

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

@@ -46,9 +46,13 @@ const verticalDefaultProps = {
   TextField: {
     noBorder: true,
     style: {},
-    customClass: 'rounded border border-[#e1e1e1] border-solid p-1',
+    // customClass: 'rounded border border-[#e1e1e1] border-solid p-1',
+    customClass: 'text-red! bg-[#f5f7f9]! py-2 px-4 rounded-lg',
     placeholder: ' ',
   },
+  Textarea: {
+    customClass: 'bg-[#f5f7f9]! rounded-lg',
+  },
   Submit: {
     customClass: 'w-full! rounded-lg! my-4!',
     block: true,
@@ -82,6 +86,7 @@ const themeVars: ConfigProviderThemeVars = {
   radioButtonBg: 'transparent',
   checkboxButtonRadius: '8rpx',
   checkboxButtonBg: 'transparent',
+  textareaBg: 'transparent',
 }
 const submit = () => {
   emits('submit', modelValue)

+ 3 - 3
packages/merchant/src/components/data-render.vue

@@ -4,7 +4,7 @@ import dayjs from 'dayjs'
 withDefaults(
   defineProps<{
     type: 'Original' | 'Date' | 'Avatar' | 'Select'
-    value: number | string | Date
+    value?: number | string | Date
     customClass?: string
     options?: { label: string; value: string | number }[]
   }>(),
@@ -14,8 +14,8 @@ withDefaults(
 <template>
   <div>
     <span v-if="type === 'Original'">{{ value }}</span>
-    <span v-if="type === 'Date'">{{ dayjs(value).format('YYYY-MM-DD') }}</span>
-    <img v-if="type === 'Avatar'" :src="value" class="w-10 h-10 rounded-full" />
+    <span v-if="type === 'Date'">{{ value && dayjs(value).format('YYYY-MM-DD') }}</span>
+    <wd-img v-if="type === 'Avatar'" width="40" height="40" round :src="String(value)" class="" />
     <span v-if="type === 'Select'">{{ options?.find((it) => it.value === value)?.label }}</span>
   </div>
 </template>

+ 27 - 9
packages/merchant/src/components/list-helper-evo.vue

@@ -8,10 +8,13 @@ const props = withDefaults(
     query?: Partial<T>
     automatic?: boolean
     mockList?: Partial<T>[]
+    contentClass?: string
+    customClass?: string
   }>(),
   {
     automatic: true,
     query: () => ({}),
+    contentClass: 'flex flex-col',
   },
 )
 const slot = defineSlots<{
@@ -54,13 +57,28 @@ defineExpose({
   },
 })
 </script>
+<script lang="ts">
+export default {
+  options: {
+    virtualHost: true,
+    styleIsolation: 'shared',
+  },
+}
+</script>
 
 <template>
-  <div class="flex-grow flex flex-col relative">
-    <template v-for="(it, index) in data" :key="index">
-      <slot :item="it as UnwrapRef<T>" :index="index" :isLast="index == data.length - 1"></slot>
-    </template>
+  <div class="flex-grow relative flex flex-col" :class="customClass">
+    <div :class="contentClass">
+      <template v-for="(it, index) in data" :key="index">
+        <slot
+          :item="it as UnwrapRef<T>"
+          :index="index"
+          :isLast="index == (data?.length ?? 0) - 1"
+        ></slot>
+      </template>
+    </div>
     <div
+      v-if="mockList"
       class="construction-dashed absolute top-0 right-0 left-0 bottom-0 bg-red/20 flex items-center justify-center pointer-events-none"
     >
       <div class="text-16 text-black/30">Debug</div>
@@ -69,12 +87,12 @@ defineExpose({
 </template>
 
 <style scoped lang="scss">
-@layer utilities {
-  .construction-dashed {
-    @apply relative border-4 border-black/50 border-dashed; /* 基础虚线样式 */
-    animation: dashed-move 2s linear infinite; /* 虚线移动动画 */
-  }
+//@layer utilities {
+.construction-dashed {
+  @apply border-4 border-black/50 border-dashed; /* 基础虚线样式 */
+  animation: dashed-move 2s linear infinite; /* 虚线移动动画 */
 }
+//}
 @keyframes dashed-move {
   from {
     border-spacing: 0;

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

@@ -92,6 +92,14 @@ defineExpose({
   },
 })
 </script>
+<script lang="ts">
+export default {
+  options: {
+    virtualHost: true,
+    styleIsolation: 'shared',
+  },
+}
+</script>
 <template>
   <div
     class="flex-grow flex flex-col"

+ 4 - 2
packages/merchant/src/composables/task.ts

@@ -23,10 +23,12 @@ export const useTask = () => {
       color: '#f89a2e',
     },
   })
-  const getBgClass = (type: 1 | 2 | 3) => types.value[type].bgClass
+  const getBgClass = (type: number) => types.value[type].bgClass
   return {
     types,
     getBgClass,
-    getColor: (type: 1 | 2 | 3) => types.value[type].color,
+    getColor: (type: number) => types.value[type]?.color,
+    getTypeTitle: (type: number) => types.value[type]?.title,
+    getBgStyle: (type: number) => types.value[type]?.bgStyle,
   }
 }

+ 8 - 5
packages/merchant/src/core/libs/actions.ts

@@ -27,9 +27,12 @@ export const handleUpvoteClick = async (
 }
 
 export const toHomePage = (id: string) => {
-  uni.navigateToMiniProgram({
-    appId: 'wx4d95c9addba81089',
-    envVersion: 'trial',
-    path: '/pages/mine/homepage/index' + '?id=' + id,
-  })
+  console.log(id)
+  uni
+    .navigateToMiniProgram({
+      appId: 'wx4d95c9addba81089',
+      envVersion: 'trial',
+      path: '/pages/mine/homepage/index' + '?id=' + id,
+    })
+    .then()
 }

+ 195 - 3
packages/merchant/src/core/libs/agent-requests.ts

@@ -10,7 +10,13 @@ import {
   DesignerFamilyInfo,
   AgentPoint,
   DesignerAward,
+  DesignerPointsStatistics,
+  PointsOrder,
+  DesignerOrderSaleOther,
+  BrowseRecordCountRes,
+  BrowseRecord,
 } from '@designer-hub/app/src/core/libs/models'
+import dayjs from 'dayjs'
 /**
  * 通过ID获取用户信息
  */
@@ -76,12 +82,12 @@ export const getDesignerExtraEvents = (query = {}) =>
 /**
  * /app-api/member/stylist-extra-events/getStudyAndActivity 获取设计师学习和活动
  */
-export const getDesignerActivityEvents = (userId: number) =>
+export const getDesignerActivity = (query = {}) =>
   httpGet<{
     [key in 'study' | 'activity' | 'extraEventsQuantity']:
       | { type: number; quantity: number }[]
       | number
-  }>('/app-api/member/stylist-extra-events/getStudyAndActivity', { userId })
+  }>('/app-api/member/stylist-extra-events/getStudyAndActivity', query)
 /**
  * 设计师列表
  */
@@ -112,7 +118,7 @@ export const createFollowUp = (data: Partial<FollowUp>) =>
  */
 export const getFollowUpPage = (query = {}) =>
   httpGet<ResPageData<FollowUp & { followTypeName: string; brokerName: string }>>(
-    '/app-api/member/stylist-follow-up/page',
+    '/app-api/member/app-broker/pageFollowUp',
     query,
   )
 /**
@@ -193,5 +199,191 @@ export const getSalesOrders = (query = {}) =>
       customerName: string
       customerPhone: string
       orderMoney: number
+      createTime: number
     }>
   >('/app-api/member/stylist-other-sales/pageByDate', query)
+/**
+ * 获取设计师积分统计
+ */
+export const getPointsCount = (query = {}) =>
+  httpGet<DesignerPointsStatistics>('/app-api/member/points-details/getPointsCount', query)
+/**
+ * 设计师积分订单
+ */
+export const getPointsOrders = (query = {}) =>
+  httpGet<ResPageData<PointsOrder>>('/app-api/member/points-order/pageDitch', query)
+/**
+ * 获取设计师销售订单统计
+ */
+export const getSalesOrdersCount = (query = {}) =>
+  httpGet<{
+    /**
+     * 今年订单成交数量
+     */
+    orderCountYear: number
+    /**
+     * 今年成交金额
+     */
+    salesAmountYtd: number
+    /**
+     * 类型订单成交数量
+     */
+    orderCount: number
+    /**
+     * 累计成交金额
+     */
+    salesAmount: number
+    /**
+     * 其他订单数量
+     */
+    otherSale: number
+  }>('/app-api/member/stylist-other-sales/get', query)
+/**
+ * 其他销售列表
+ */
+export const getOtherSalesPage = (query = {}) =>
+  httpGet<ResPageData<DesignerOrderSaleOther>>(
+    '/app-api/member/stylist-other-sales/OtherSalesPage',
+    query,
+  )
+/**
+ * /app-api/member/stylist-other-sales/save 创建其他销售
+ */
+export const saveOtherSales = (data: Partial<DesignerOrderSaleOther>) =>
+  httpPost('/app-api/member/stylist-other-sales/save', data)
+/**
+ * 删除其他销售
+ */
+export const deleteOtherSales = (id: number) =>
+  httpDelete('/app-api/member/stylist-other-sales/delete', { id })
+/**
+ * 更新其他销售
+ */
+export const updateOtherSales = (data: Partial<DesignerOrderSaleOther>) =>
+  httpPost('/app-api/member/stylist-other-sales/update', data)
+/**
+ * 创建设计师活动
+ */
+export const createDesignerEvent = (query: Partial<DesignerEvent>) =>
+  httpPost('/app-api/member/stylist-extra-events/create', query)
+/**
+ * 删除设计师活动
+ */
+export const deleteDesignerEvent = (id: number) =>
+  httpDelete('/app-api/member/stylist-extra-events/delete', { id })
+/**
+ * 获取设计师活动
+ */
+export const getDesignerEvents = (query = {}) =>
+  httpGet<ResPageData<DesignerEvent>>('/app-api/member/stylist-extra-events/pageInfo', query)
+/**
+ * 更新设计师活动
+ */
+export const updateDesignerEvent = (query: Partial<DesignerEvent>) =>
+  httpPost('/app-api/member/stylist-extra-events/update', query)
+/**
+ * 获取设计师浏览记录统计
+ */
+export const getBrowseRecordCount = (stylistId: number) =>
+  httpGet<BrowseRecordCountRes>(
+    `/app-api/member/browse-record/browseRecordCount?stylistId=${stylistId}`,
+  )
+/**
+ * /app-api/member/browse-record/page 浏览记录
+ * @param query
+ */
+export const getBrowseRecords = (query = {}) =>
+  httpGet<ResPageData<BrowseRecord>>('/app-api/member/browse-record/page', query)
+/**
+ * 浏览记录备注
+ * @param query
+ */
+export const getBrowseRecordRemarks = (query = {}) =>
+  httpGet<{ id: number; remark: string }[]>('/app-api/member/browse-record/listRemark', query)
+export const getSalesOrdersCounts = (query = {}) =>
+  getSalesOrdersCount(query).then((res) => ({
+    ...res,
+    data: [
+      { label: '今年成交订单数', value: res.data.orderCountYear ?? 0, userId: '' },
+      { label: '今年成交金额', value: res.data.salesAmountYtd ?? 0 },
+      { label: '累计成交订单数', value: res.data.orderCount ?? 0 },
+      { label: '累计成交金额', value: res.data.salesAmount ?? 0 },
+      { label: '其他销售信息', value: `${res.data.otherSale ?? 0}条` },
+    ],
+  }))
+/**
+ * 获取设计师积分统计数组
+ */
+export const getPointsCounts = (query = {}) =>
+  getPointsCount(query).then((res) => ({
+    ...res,
+    data: [
+      {
+        userId: '',
+        title: '当前剩余积分',
+        value: res.data.points ?? 0,
+        subTitle: '最近',
+        subValue: dayjs(res.data.pointsTime).format('YY/MM/DD'),
+      },
+      {
+        userId: '',
+        title: '累计获得积分',
+        value: res.data.gainPoints ?? 0,
+        subTitle: '本年',
+        subValue: res.data.gainPointsYear ?? 0,
+      },
+      {
+        userId: '',
+        title: '累计消耗积分',
+        value: res.data.usePoints ?? 0,
+        subTitle: '本年',
+        subValue: res.data.usePointsYear ?? 0,
+      },
+      {
+        userId: '',
+        title: '累计跟进次数',
+        value: res.data.followUpCount ?? 0,
+        subTitle: '本年',
+        subValue: res.data.followUpYearCount ?? 0,
+      },
+      {
+        userId: '',
+        title: '累计消耗次数',
+        value: res.data.usageCount ?? 0,
+        subTitle: '本年',
+        subValue: res.data.usageYearCount ?? 0,
+      },
+      {
+        userId: '',
+        title: '累计获得次数',
+        value: res.data.obtainedCount ?? 0,
+        subTitle: '本年',
+        subValue: res.data.obtainedYearCount ?? 0,
+      },
+    ],
+  }))
+export const getDesignerActivities = (query = {}) =>
+  getDesignerActivity(query).then((res) => ({
+    ...res,
+    data: [
+      ...(res.data.study as any[]).map((it) => ({
+        type: '',
+        label: it.type,
+        value: it.quantity + '次',
+        path: '',
+      })),
+      { type: 'line', label: '', value: '' },
+      ...(res.data.study as any[]).map((it) => ({
+        type: '',
+        label: it.type,
+        value: it.quantity + '次',
+        path: '',
+      })),
+      {
+        type: '',
+        label: '其他活动',
+        value: res.data.extraEventsQuantity + '次',
+        path: '/pages/agent/designer/archives/index',
+      },
+    ],
+  }))

+ 16 - 0
packages/merchant/src/core/libs/messages.ts

@@ -69,5 +69,21 @@ export const messages = {
       awardsFileUrl: '附件',
       createTime: '创建时间',
     },
+    designerOrderSaleOther: {
+      id: 'ID',
+      supplierName: '材料商名称',
+      brandName: '品牌名称',
+      saleTime: '销售时间',
+      projectName: '项目名称',
+      customerName: '客户名称',
+      customerPhone: '客户电话',
+      orderAmount: '订单金额',
+      createTime: '创建时间',
+      userId: '用户ID',
+    },
+    designerEvent: {
+      name: '活动名称',
+      applyTime: '活动时间',
+    },
   },
 }

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

@@ -236,7 +236,7 @@ export const getTaskList = (query) => httpGet<any>('/app-api/member/task/task-li
 export const getTaskDetail = (query) =>
   httpGet<AgentTask>('/app-api/member/task/task-detail', query)
 // 领取任务
-export const taskReceive = (data) => httpPost<any>('/app-api/member/task/task-receive', data)
+export const taskReceive = (data: any) => httpPost<any>('/app-api/member/task/task-receive', data)
 // 任务上报
 export const appTaskReport = (data) => httpPost<any>('/app-api/member/app-task-report/create', data)
 

+ 1 - 1
packages/merchant/src/layouts/default.vue

@@ -4,7 +4,7 @@ import { defaultThemeVars } from '../core/themes/default'
 <template>
   <wd-config-provider
     class="flex-grow flex flex-col"
-    custom-class="flex-grow "
+    custom-class="flex-grow flex flex-col"
     :themeVars="defaultThemeVars"
   >
     <view class="bg-[#f6f6f6] flex-grow flex flex-col">

+ 26 - 1
packages/merchant/src/pages.json

@@ -194,7 +194,8 @@
       "type": "page",
       "style": {
         "navigationBarTitleText": "邀请好友",
-        "navigationBarBackgroundColor": "#ffffff"
+        "navigationBarBackgroundColor": "#ffffff",
+        "navigationStyle": "custom"
       }
     },
     {
@@ -228,6 +229,30 @@
         "navigationBarTitleText": "订单详情",
         "navigationBarBackgroundColor": "#fff"
       }
+    },
+    {
+      "path": "pages/agent/designer/archives/activity/others/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "其他活动信息",
+        "navigationBarBackgroundColor": "#fff"
+      }
+    },
+    {
+      "path": "pages/agent/designer/archives/award/photos/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "获奖照片",
+        "navigationBarBackgroundColor": "#fff"
+      }
+    },
+    {
+      "path": "pages/agent/designer/archives/sale-info/others/index",
+      "type": "page",
+      "style": {
+        "navigationBarTitleText": "其他销售信息",
+        "navigationBarBackgroundColor": "#fff"
+      }
     }
   ],
   "subPackages": []

+ 99 - 123
packages/merchant/src/pages/agent/components/task-card.vue

@@ -10,6 +10,7 @@ const props = withDefaults(defineProps<{ options: any }>(), { options: () => ({}
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 
+const emits = defineEmits<{ change: [] }>()
 const { types } = useTask()
 const status = ref<{ [key: number]: { title: string; bg: string; bgClass: string } }>({
   1: {
@@ -24,143 +25,118 @@ const status = ref<{ [key: number]: { title: string; bg: string; bgClass: string
   6: { title: '待确认', bg: '', bgClass: 'bg-[#f04c47]' },
 })
 const acceptingOrders = async (item: AgentTask) => {
-  uni.showModal({
-    title: '',
-    content: '是否确认接受该任务?',
-    showCancel: true,
-    cancelText: '取消',
-    confirmText: '确认',
-    success: async function (res) {
-      if (res.confirm) {
-        uni.showLoading()
-        const res = await taskReceive({
-          brokerId: userInfo.value.userId,
-          taskId: item.id,
-          orders: true,
-        })
-        uni.hideLoading()
-      } else if (res.cancel) {
-        /* empty */
-      }
-    },
+  await uni.showLoading()
+  const res = await taskReceive({
+    brokerId: userInfo.value.userId,
+    taskId: item.id,
+    isOrders: true,
   })
-
-  //   initData()
+  uni.hideLoading()
+  emits('change')
 }
 const acceptingNoOrders = async (item: AgentTask) => {
-  uni.showModal({
-    title: '',
-    content: '是否确认不接该任务?',
-    showCancel: true,
-    cancelText: '取消',
-    confirmText: '确认',
-    success: async function (res) {
-      if (res.confirm) {
-        uni.showLoading()
-        const res = await taskReceive({
-          brokerId: userInfo.value.userId,
-          taskId: item.id,
-          orders: false,
-        })
-        uni.hideLoading()
-      } else if (res.cancel) {
-        /* empty */
-      }
-    },
+  await uni.showLoading()
+  const res = await taskReceive({
+    brokerId: userInfo.value.userId,
+    taskId: item.id,
+    isOrders: false,
   })
+  uni.hideLoading()
+  emits('change')
 }
 const toDetail = () =>
   uni.navigateTo({ url: `/pages/agent/tasks/detail/index?taskId=${props.options.id}` })
 </script>
 <template>
-  <Card
-    :custom-class="`p-0 bg-gradient-to-r`"
-    style="padding: 0"
-    :custom-style="types[options.taskType as 1 | 2 | 3].bgStyle"
-    @click="toDetail"
-  >
-    <div class="flex p-4 items-center">
-      <div
-        :class="`${status[options.status]?.bgClass} w-[47px] h-[23px] px-1 rounded border justify-center items-center gap-2.5 inline-flex`"
-      >
-        <div class="text-right text-white text-xs font-normal font-['PingFang_SC'] leading-tight">
-          {{ status[options.status as 1 | 2 | 3].title }}
+  <div @click="toDetail">
+    <Card
+      :custom-class="`p-0 bg-gradient-to-r`"
+      style="padding: 0"
+      :custom-style="types[options.taskType as 1 | 2 | 3].bgStyle"
+    >
+      <div class="flex p-4 items-center">
+        <div
+          :class="`${status[options.status]?.bgClass} w-[47px] h-[23px] px-1 rounded border justify-center items-center gap-2.5 inline-flex`"
+        >
+          <div class="text-right text-white text-xs font-normal font-['PingFang_SC'] leading-tight">
+            {{ status[options.status as 1 | 2 | 3].title }}
+          </div>
+        </div>
+        <div class="mx-2.5 text-black/90 text-lg font-normal font-['PingFang_SC'] leading-none">
+          {{ types[options.taskType].title }}
+        </div>
+        <div class="flex-1"></div>
+        <div class="mx-1.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
+          奖励积分
+        </div>
+        <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
+          {{ options.pointsReward }}
         </div>
       </div>
-      <div class="mx-2.5 text-black/90 text-lg font-normal font-['PingFang_SC'] leading-none">
-        {{ types[options.taskType].title }}
-      </div>
-      <div class="flex-1"></div>
-      <div class="mx-1.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
-        奖励积分
-      </div>
-      <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
-        {{ options.pointsReward }}
-      </div>
-    </div>
-    <div class="flex flex-col gap-4 bg-white p-5 rounded-2xl">
-      <div>
-        <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-          任务名称:
-        </span>
-        <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-          {{ options.name }}
-        </span>
-      </div>
-      <div>
-        <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-          发起方:
-        </span>
-        <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-          {{ options.bearerName }}
-        </span>
-      </div>
+      <div class="flex flex-col gap-4 bg-white p-5 rounded-2xl">
+        <div>
+          <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
+            任务名称:
+          </span>
+          <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
+            {{ options.name }}
+          </span>
+        </div>
+        <div>
+          <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
+            发起方:
+          </span>
+          <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
+            {{ options.bearerName }}
+          </span>
+        </div>
 
-      <div>
-        <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-          任务时间:
-        </span>
-        <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-          {{ dayjs(options.startTime).format('YYYY/MM/DD') }}-{{
-            dayjs(options.endTime).format('YYYY/MM/DD')
-          }}
-        </span>
-      </div>
-      <div class="flex items-center border-t border-t-solid border-t-[#efefef] pt-1.5">
-        <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-          目标 {{ options.storeQuantity }}
+        <div>
+          <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
+            任务时间:
+          </span>
+          <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
+            {{ dayjs(options.startTime).format('YYYY/MM/DD') }}-{{
+              dayjs(options.endTime).format('YYYY/MM/DD')
+            }}
+          </span>
         </div>
-        <template v-if="!options.receive">
-          <div class="flex-1"></div>
+        <div class="flex items-center border-t border-t-solid border-t-[#efefef] pt-2.5">
           <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-            个人完成
-            <span style="color: #2357e9">{{ options.personalCompletedNum }}</span>
+            目标 {{ options.storeQuantity }}
           </div>
-          <div class="flex-1"></div>
-          <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-            累计完成
-            <span style="color: #f1981b">{{ options.completedNum }}</span>
-          </div>
-        </template>
-        <template v-else>
-          <div class="flex-1"></div>
-          <div
-            v-if="options.receive"
-            class="mr-[16px] w-[68px] h-7 px-2.5 py-[3px] rounded-[30px] border border-[#fe5053] justify-center items-center gap-2.5 inline-flex"
-            style="border: 1px solid #fe5053"
-            @click.stop="acceptingNoOrders(options)"
-          >
-            <div class="w-9 text-[#ff2d2d] text-xs font-normal font-['PingFang_SC']">不接单</div>
-          </div>
-          <div
-            v-if="options.receive"
-            @click.stop="acceptingOrders(options)"
-            class="w-[68px] h-7 px-2.5 py-[3px] bg-[#2357e9] rounded-[30px] justify-center items-center gap-2.5 inline-flex"
-          >
-            <div class="text-white text-xs font-normal font-['PingFang_SC']">接单</div>
-          </div>
-        </template>
+          <template v-if="!options.receive">
+            <div class="flex-1"></div>
+            <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
+              个人完成
+              <span style="color: #2357e9">{{ options.personalCompletedNum }}</span>
+            </div>
+            <div class="flex-1"></div>
+            <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
+              累计完成
+              <span style="color: #f1981b">{{ options.completedNum }}</span>
+            </div>
+          </template>
+          <template v-else>
+            <div class="flex-1"></div>
+            <div
+              v-if="options.receive"
+              class="mr-[16px] w-[68px] h-7 px-2.5 py-[3px] box-border rounded-[30px] border border-[#fe5053] justify-center items-center gap-2.5 inline-flex"
+              style="border: 1px solid #fe5053"
+              @click.stop="acceptingNoOrders(options)"
+            >
+              <div class="w-9 text-[#ff2d2d] text-xs font-normal font-['PingFang_SC']">不接单</div>
+            </div>
+            <div
+              v-if="options.receive"
+              @click.stop="acceptingOrders(options)"
+              class="w-[68px] h-7 px-2.5 py-[3px] box-border bg-[#2357e9] rounded-[30px] justify-center items-center gap-2.5 inline-flex"
+            >
+              <div class="text-white text-xs font-normal font-['PingFang_SC']">接单</div>
+            </div>
+          </template>
+        </div>
       </div>
-    </div>
-  </Card>
+    </Card>
+  </div>
 </template>

+ 186 - 0
packages/merchant/src/pages/agent/designer/archives/activity/others/index.vue

@@ -0,0 +1,186 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "其他活动信息", "navigationBarBackgroundColor": "#fff" } }
+</route>
+<script setup lang="ts">
+import {
+  deleteOtherSales,
+  deleteDesignerEvent,
+  getDesignerEvents,
+  createDesignerEvent,
+  updateDesignerEvent,
+} from '@/core/libs/agent-requests'
+import Card from '@/components/card.vue'
+import PageHelperEvo from '@/components/page-helper-evo.vue'
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import DataForm from '@/components/data-form.vue'
+import { DataFormSchema } from '@/components/data-form'
+import { DesignerEvent, DesignerOrderSaleOther } from '@designer-hub/app/src/core/libs/models'
+import { ComponentExposed } from 'vue-component-type-helpers'
+import { requestToast } from '@designer-hub/app/src/core/utils/common'
+import { messages } from '@/core/libs/messages'
+import dayjs from 'dayjs'
+
+const id = ref()
+const actionSheetStatus = ref(false)
+const formData = ref({})
+const schema = ref<DataFormSchema<Omit<DesignerEvent, 'id' | 'createTime' | 'userId'>>>({
+  participationDate: {
+    type: 'TimePick',
+    label: messages.objects.designerEvent.applyTime,
+    required: true,
+    props: {
+      defaultValue: new Date(),
+    },
+  },
+  name: {
+    type: 'TextField',
+    label: messages.objects.designerEvent.name,
+    required: true,
+  },
+})
+const rules = ref({
+  participationDate: [
+    {
+      type: 'date',
+      message: '请选择活动时间',
+    },
+  ],
+  name: [{ required: true, message: '请输入活动名称' }],
+})
+const formRef = ref<ComponentExposed<typeof DataForm>>()
+const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
+const query = computed(() => ({ userId: id.value, type: 3 }))
+const handleSubmit = async () => {
+  const { valid } = await formRef.value!.validate()
+  if (!valid) return
+  if (Object.keys(formData.value).includes('id')) {
+    await requestToast(() => updateDesignerEvent(formData.value), {
+      success: true,
+      successTitle: '保存成功',
+    })
+  } else {
+    await requestToast(
+      () =>
+        createDesignerEvent({
+          ...formData.value,
+          userId: Number(id.value),
+        }),
+      { success: true, successTitle: '保存成功' },
+    )
+  }
+  actionSheetStatus.value = false
+  formData.value = {}
+  await pageHelperRef.value?.reload()
+}
+const handleEdit = (item: DesignerEvent) => {
+  formData.value = item
+  actionSheetStatus.value = true
+}
+const handleDelete = async (item: DesignerEvent) => {
+  await requestToast(() => deleteDesignerEvent(item.id), {
+    success: true,
+    successTitle: '删除成功',
+  })
+  await pageHelperRef.value?.reload()
+}
+onLoad((query?: Record<string | 'id', string>) => {
+  id.value = query?.id
+})
+</script>
+
+<template>
+  <div class="flex-grow flex flex-col">
+    <div class="mt-4 bg-white flex-grow">
+      <PageHelperEvo
+        ref="pageHelperRef"
+        :request="getDesignerEvents"
+        :query="query"
+        class="flex-grow"
+      >
+        <template #default="{ source }">
+          <div class="flex flex-col gap-4 p-8.75">
+            <template v-for="(it, index) in source?.list" :key="index">
+              <div>
+                <div
+                  class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed"
+                >
+                  {{ it.name }}
+                </div>
+                <div class="flex items-center justify-between">
+                  <div
+                    class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
+                  >
+                    参加日期:
+                    {{ dayjs(it.applyTime).format('YYYY/MM/DD') }}
+                  </div>
+                  <div class="flex gap-6">
+                    <wd-button type="text" :round="false" size="small" @click="handleEdit(it)">
+                      编辑
+                    </wd-button>
+                    <wd-button type="text" :round="false" size="small" @click="handleDelete(it)">
+                      删除
+                    </wd-button>
+                  </div>
+                </div>
+              </div>
+              <!--              <div class="grid grid-cols-[90px_1fr] gap-2.5">-->
+              <!--                <template-->
+              <!--                  v-for="(item, i) in [-->
+              <!--                    { label: '材料商', value: it.supplierName },-->
+              <!--                    { label: '品牌', value: it.brandName },-->
+              <!--                    { label: '项目名称', value: it.projectName },-->
+              <!--                    { label: '客户姓名', value: it.customerName },-->
+              <!--                    { label: '客户电话', value: it.customerPhone },-->
+              <!--                    { label: '订单金额', value: it.orderAmount + '元' },-->
+              <!--                  ]"-->
+              <!--                  :key="i"-->
+              <!--                >-->
+              <!--                  <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">-->
+              <!--                    {{ item.label }}-->
+              <!--                  </div>-->
+              <!--                  <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">-->
+              <!--                    {{ item.value }}-->
+              <!--                  </div>-->
+              <!--                </template>-->
+              <!--              </div>-->
+              <!--              <div class="bg-[#f4f4f4] h-.25 my-4"></div>-->
+              <!--              <div class="flex justify-between">-->
+              <!--                <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal">-->
+              <!--                  {{ dayjs(it.createTime).format('YYYY-MM-DD HH:mm') }}-->
+              <!--                </div>-->
+              <!--              </div>-->
+            </template>
+          </div>
+        </template>
+      </PageHelperEvo>
+    </div>
+    <div class="py-2 bg-[#f0f4ff]">
+      <div
+        class="text-center text-[#2357e9] text-xs font-normal font-['PingFang_SC'] leading-normal"
+      >
+        其他活动不参与线上活动统计
+      </div>
+    </div>
+    <BottomAppBar fixed placeholder>
+      <div class="w-full">
+        <wd-button block :round="false" @click="((actionSheetStatus = true), (formData = {}))">
+          添加
+        </wd-button>
+      </div>
+    </BottomAppBar>
+    <wd-action-sheet v-model="actionSheetStatus">
+      <div class="p-4">
+        <DataForm
+          ref="formRef"
+          :rules="rules"
+          :schema="schema"
+          :direction="'horizontal'"
+          v-model="formData"
+        ></DataForm>
+        <wd-button :round="false" block @click="handleSubmit">保存</wd-button>
+      </div>
+    </wd-action-sheet>
+  </div>
+</template>
+
+<style scoped lang="scss"></style>

+ 20 - 0
packages/merchant/src/pages/agent/designer/archives/award/photos/index.vue

@@ -0,0 +1,20 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "获奖照片", "navigationBarBackgroundColor": "#fff" } }
+</route>
+<script setup lang="ts">
+const urlsStr = ref()
+const urls = computed(() => urlsStr.value?.split(','))
+onLoad((query?: Record<string | 'id', string>) => {
+  urlsStr.value = query?.urls
+})
+</script>
+
+<template>
+  <div class="flex-grow bg-white grid grid-cols-2 gap-4 p-4">
+    <template v-for="(it, index) in urls" :key="index">
+      <div><wd-img width="100%" mode="widthFix" :src="it"></wd-img></div>
+    </template>
+  </div>
+</template>
+
+<style scoped lang="scss"></style>

+ 82 - 52
packages/merchant/src/pages/agent/designer/archives/index.vue

@@ -11,9 +11,11 @@ import {
   createAward,
   deleteAward,
   getAwards,
+  getDesignerActivities,
   getDesignerBasicInfo,
   getDesignerExtraEvents,
   getDesignerFamilyInfo,
+  getSalesOrdersCounts,
   saveDesignerFamilyInfo,
 } from '../../../../core/libs/agent-requests'
 import { messages } from '../../../../core/libs/messages'
@@ -31,7 +33,7 @@ import ListHelperEvo from '@/components/list-helper-evo.vue'
 import SectionHeading from '@designer-hub/app/src/components/section-heading.vue'
 import dayjs from 'dayjs'
 
-const tab = ref('sale')
+const tab = ref('basic')
 // 基础信息 家庭信息 奖项信息 销售信息 游学/活动信息
 const tabs = [
   { label: '基础信息', value: 'basic' },
@@ -39,7 +41,7 @@ const tabs = [
   { label: '奖项信息', value: 'award' },
   { label: '销售信息', value: 'sale' },
   { label: '游学/活动信息', value: 'activity' },
-  { label: '其他活动信息', value: 'events' },
+  // { label: '其他活动信息', value: 'events' },
 ]
 const id = ref()
 const { data: basicData, run: setBasicData } = useRequest(() => getDesignerBasicInfo(id.value))
@@ -113,6 +115,7 @@ const handleAddAward = async () => {
       type: 'TimePick',
       label: messages.objects.designerAward.awardsTime,
       props: {
+        defaultValue: dayjs().toDate(),
         placeholder: messages.objects.designerAward.awardsTimePlaceHolder,
       },
     },
@@ -150,6 +153,7 @@ const handleSubmit = async () => {
         )
         if (code === 0) {
           actionSheetStatus.value = false
+          formData.value = {}
           awardsListRef.value?.reload()
         }
       }
@@ -179,28 +183,30 @@ onLoad(async (query?: Record<string | 'id', any>) => {
     </wd-tabs>
     <div class="flex flex-col flex-grow gap-5">
       <template v-if="tab === 'basic'">
-        <template
-          v-for="([key, value], index) in Object.entries(omit(basicData, ['id', 'userId']))"
-          :key="index"
-        >
-          <div class="flex items-center justify-between">
-            <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-none">
-              {{ messages.objects.designerBasiceInfo[key] }}
+        <div class="bg-white mt-4 flex flex-col gap-5 p-4">
+          <template
+            v-for="([key, value], index) in Object.entries(omit(basicData, ['id', 'userId']))"
+            :key="index"
+          >
+            <div class="flex items-center justify-between">
+              <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-none">
+                {{ (messages.objects.designerBasiceInfo as any)[key] }}
+              </div>
+              <DataRender v-bind="(renders.designerBasiceInfo as any)[key](value)"></DataRender>
             </div>
-            <DataRender v-bind="renders.designerBasiceInfo[key](value)"></DataRender>
-          </div>
-          <!-- <SectionHeading size="base" :title="messages.objects.designerBasiceInfo[key]">
+            <!-- <SectionHeading size="base" :title="messages.objects.designerBasiceInfo[key]">
           <template #append>
             <DataRender v-bind="renders.designerBasiceInfo[key](value)"></DataRender>
           </template>
         </SectionHeading> -->
-          <div class="w-full h-.25 bg-[#f4f4f4]"></div>
-        </template>
+            <div class="w-full h-.25 bg-[#f4f4f4]"></div>
+          </template>
+        </div>
       </template>
       <template v-if="tab === 'family'">
         <PageHelperEvo ref="familyPageRef" :request="getDesignerFamilyInfo" :query="query">
           <template #default="{ source }">
-            <template v-for="(it, index) in source.list" :key="index">
+            <template v-for="(it, index) in source?.list" :key="index">
               <div>{{ it }}</div>
             </template>
           </template>
@@ -216,17 +222,13 @@ onLoad(async (query?: Record<string | 'id', any>) => {
               </wd-button>
             </div>
           </div>
-          <ListHelperEvo
-            ref="awardsListRef"
-            :request="getAwards"
-            :query="{ userId: id }"
-            :mock-list="[
-              { awardsName: '123', awardsRank: '123' },
-              {
-                awardsName: '筑巢奖',
-              },
-            ]"
-          >
+          <!--          :mock-list="[-->
+          <!--          { awardsName: '123', awardsRank: '123' },-->
+          <!--          {-->
+          <!--          awardsName: '筑巢奖',-->
+          <!--          },-->
+          <!--          ]"-->
+          <ListHelperEvo ref="awardsListRef" :request="getAwards" :query="{ userId: id }">
             <template #default="{ item, isLast }">
               <div class="flex flex-col gap-4 py-4">
                 <SectionHeading
@@ -236,10 +238,14 @@ onLoad(async (query?: Record<string | 'id', any>) => {
                 ></SectionHeading>
                 <SectionHeading
                   title="奖项日期"
-                  :end-text="dayjs(item.awardsTime).format('YYYY-MM-DD')"
+                  :end-text="item.awardsTime && dayjs(item.awardsTime).format('YYYY-MM-DD')"
                 ></SectionHeading>
                 <SectionHeading title="奖项名次" :end-text="item.awardsRank"></SectionHeading>
-                <SectionHeading title="奖项照片" end-arrow></SectionHeading>
+                <SectionHeading
+                  title="奖项照片"
+                  end-arrow
+                  :path="`/pages/agent/designer/archives/award/photos/index?urls=${item.awardsFileUrl ?? ''}`"
+                ></SectionHeading>
                 <wd-button type="text" @click="handleDeleteAward(item)">删除</wd-button>
                 <div v-if="!isLast" class="w-full h-1 bg-[#dadada]"></div>
               </div>
@@ -272,21 +278,7 @@ onLoad(async (query?: Record<string | 'id', any>) => {
             <!--              </wd-button>-->
             <!--            </div>-->
           </div>
-          <ListHelperEvo
-            ref="saleListRef"
-            :items="[
-              { label: '', value: 0, userId: '' },
-              { label: '', value: '' },
-            ]"
-            :query="{ userId: id }"
-            :mock-list="[
-              { label: '今年成交订单数', value: 6 },
-              { label: '今年成交金额', value: 100000 },
-              { label: '累计成交订单数', value: 6 },
-              { label: '累计成交金额', value: 100000 },
-              { label: '其他销售信息', value: '2条' },
-            ]"
-          >
+          <ListHelperEvo ref="saleListRef" :request="getSalesOrdersCounts" :query="{ userId: id }">
             <template #default="{ item, isLast }">
               <div class="flex flex-col gap-4 py-4">
                 <div v-if="isLast" class="w-full h-1 bg-[#dadada]"></div>
@@ -295,15 +287,12 @@ onLoad(async (query?: Record<string | 'id', any>) => {
                   size="base"
                   :end-text="String(item.value)"
                   end-arrow
-                  path="/pages/agent/designer/archives/sale-info/index"
+                  :path="
+                    !isLast
+                      ? `/pages/agent/designer/archives/sale-info/index?id=${id}`
+                      : `/pages/agent/designer/archives/sale-info/others/index?id=${id}`
+                  "
                 ></SectionHeading>
-                <!--                <SectionHeading-->
-                <!--                  title="奖项日期"-->
-                <!--                  :end-text="dayjs(item.awardsTime).format('YYYY-MM-DD')"-->
-                <!--                ></SectionHeading>-->
-                <!--                <SectionHeading title="奖项名次" :end-text="item.awardsRank"></SectionHeading>-->
-                <!--                <SectionHeading title="奖项照片" end-arrow></SectionHeading>-->
-                <!--                <wd-button type="text" @click="handleDeleteAward(item)">删除</wd-button>-->
               </div>
             </template>
           </ListHelperEvo>
@@ -323,10 +312,51 @@ onLoad(async (query?: Record<string | 'id', any>) => {
           <!--          </PageHelperEvo>-->
         </div>
       </template>
+      <template v-if="tab === 'activity'">
+        <div class="bg-white p-4 mt-4 flex-grow flex flex-col">
+          <SectionHeading title="游学/活动信息"></SectionHeading>
+          <ListHelperEvo :request="getDesignerActivities" :query="{ userId: id }">
+            <template #default="{ item, isLast }">
+              <div class="">
+                <template v-if="item.type === 'line'">
+                  <div class="w-full h-1 bg-[#dadada]"></div>
+                </template>
+                <template v-else>
+                  <div class="py-4">
+                    <SectionHeading
+                      :title="item.label"
+                      :end-text="item.value"
+                      :path="
+                        isLast
+                          ? `/pages/agent/designer/archives/activity/others/index?id=${id}`
+                          : ''
+                      "
+                    ></SectionHeading>
+                  </div>
+                </template>
+                <div v-if="!isLast" class="w-full h-.25 bg-[#f4f4f4]"></div>
+                <!--                </template>-->
+
+                <!--                <SectionHeading-->
+                <!--                  :title="item.label"-->
+                <!--                  size="base"-->
+                <!--                  :end-text="String(item.value)"-->
+                <!--                  end-arrow-->
+                <!--                  :path="-->
+                <!--                    !isLast-->
+                <!--                      ? `/pages/agent/designer/archives/sale-info/index?id=${id}`-->
+                <!--                      : `/pages/agent/designer/archives/sale-info/others/index?id=${id}`-->
+                <!--                  "-->
+                <!--                ></SectionHeading>-->
+              </div>
+            </template>
+          </ListHelperEvo>
+        </div>
+      </template>
       <template v-if="tab === 'events'">
         <PageHelperEvo :request="getDesignerExtraEvents" :query="eventsQuery">
           <template #default="{ source }">
-            <template v-for="(it, index) in source.list" :key="index">
+            <template v-for="(it, index) in source?.list" :key="index">
               <div>{{ it }}</div>
             </template>
           </template>

+ 50 - 57
packages/merchant/src/pages/agent/designer/archives/sale-info/index.vue

@@ -15,65 +15,31 @@ import PageHelper from '@/components/page-helper.vue'
 import dayjs from 'dayjs'
 import PageHelperEvo from '@/components/page-helper-evo.vue'
 import { useUserStore } from '@/store'
-import { getSalesOrders } from '@/core/libs/agent-requests'
+import { getSalesOrders, getSalesOrdersCount } from '@/core/libs/agent-requests'
 
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
+const id = ref()
 const current = ref('累计')
-const request =
-  ref<
-    () => Promise<IResData<{ shareCount: number; viewCount: number; winCustomerCount: number }>>
-  >()
-const data = ref()
 const info = computed(() => [
-  { label: '订单数', value: data.value?.shareCount || 0, unit: '' },
-  { label: '订单金额', value: data.value?.viewCount || 0, unit: '¥' },
+  {
+    label: '订单数',
+    value:
+      current.value === '累计' ? (data.value?.orderCount ?? 0) : (data.value?.orderCountYear ?? 0),
+    unit: '',
+  },
+  {
+    label: '订单金额',
+    value:
+      current.value === '累计' ? (data.value?.salesAmount ?? 0) : (data.value?.salesAmountYtd ?? 0),
+    unit: '¥',
+  },
 ])
-const tab = ref('分享')
-const tabs = ref([
-  { label: '分享明细', value: '分享' },
-  { label: '浏览明细', value: '浏览' },
-  { label: '获客明细', value: '获客' },
-])
-const query = computed(() => ({}))
-const setData = async ({ value }) => {
-  console.log(1111)
-  console.log(value)
-
-  // request.value = {
-  //   累计: () =>
-  //     getDesignerInfo(userInfo.value.userId).then((res) => ({
-  //       code: res.code,
-  //       msg: res.msg,
-  //       data: {
-  //         shareCount: res.data.shareCount,
-  //         viewCount: res.data.viewCount,
-  //         winCustomerCount: res.data.winCustomerCount,
-  //       },
-  //     })),
-  //   本年: () =>
-  //     countThisYear({ userId: userInfo.value.userId, year: new Date().getFullYear() }).then(
-  //       (res) => ({
-  //         code: res.code,
-  //         msg: res.msg,
-  //         data: {
-  //           shareCount: res.data.find((it) => it.bizType === '1')?.quantity || 0,
-  //           viewCount: res.data.find((it) => it.bizType === '2')?.quantity || 0,
-  //           winCustomerCount: res.data.find((it) => it.bizType === '3')?.quantity || 0,
-  //         },
-  //       }),
-  //     ),
-  // }[value]
-  // const { data: resData } = await request.value()
-  // data.value = resData
-  // console.log(data.value)
-}
-onMounted(async () => {
-  console.log(1111)
-
-  await setData({ value: current.value })
-  console.log(data.value)
-  // await countThisYear({ userId: userInfo.value.userId, year: new Date().getFullYear() })
+const query = computed(() => ({ isYear: current.value === '本年', userId: id.value }))
+const { data, run: setData } = useRequest(() => getSalesOrdersCount({ userId: id.value }))
+onLoad(async (query?: Record<string | 'id', string>) => {
+  id.value = query?.id
+  await setData()
 })
 </script>
 <template>
@@ -108,11 +74,38 @@ onMounted(async () => {
         </template>
       </div>
     </Card>
-    <PageHelperEvo :request="getSalesOrders">
+    <PageHelperEvo :request="getSalesOrders" :query="query">
       <template #default="{ source }">
-        <template v-for="(it, index) in source?.list" :key="index">
-          <Card>{{ it }}</Card>
-        </template>
+        <div class="flex flex-col gap-4">
+          <template v-for="(it, index) in source?.list" :key="index">
+            <Card>
+              <div class="grid grid-cols-[90px_1fr] gap-2.5">
+                <template
+                  v-for="(item, i) in [
+                    { label: '材料商', value: it.materials },
+                    { label: '品牌', value: it.materialsBrand },
+                    { label: '项目名称', value: it.projectName },
+                    { label: '客户姓名', value: it.customerName },
+                    { label: '客户电话', value: it.customerPhone },
+                    { label: '订单金额', value: it.orderMoney + '元' },
+                  ]"
+                  :key="i"
+                >
+                  <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
+                    {{ item.label }}
+                  </div>
+                  <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
+                    {{ item.value }}
+                  </div>
+                </template>
+              </div>
+              <div class="bg-[#f4f4f4] h-.25 my-4"></div>
+              <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal">
+                {{ dayjs(it.createTime).format('YYYY-MM-DD HH:mm') }}
+              </div>
+            </Card>
+          </template>
+        </div>
       </template>
     </PageHelperEvo>
   </div>

+ 197 - 0
packages/merchant/src/pages/agent/designer/archives/sale-info/others/index.vue

@@ -0,0 +1,197 @@
+<route lang="json">
+{ "style": { "navigationBarTitleText": "其他销售信息", "navigationBarBackgroundColor": "#fff" } }
+</route>
+<script setup lang="ts">
+import {
+  getOtherSalesPage,
+  saveOtherSales,
+  deleteOtherSales,
+  updateOtherSales,
+} from '@/core/libs/agent-requests'
+import dayjs from 'dayjs'
+import Card from '@/components/card.vue'
+import PageHelperEvo from '@/components/page-helper-evo.vue'
+import BottomAppBar from '@/components/bottom-app-bar.vue'
+import DataForm from '@/components/data-form.vue'
+import { DataFormSchema } from '@/components/data-form'
+import { DesignerOrderSaleOther } from '@designer-hub/app/src/core/libs/models'
+import { ComponentExposed } from 'vue-component-type-helpers'
+import { requestToast } from '@designer-hub/app/src/core/utils/common'
+import { messages } from '@/core/libs/messages'
+
+const id = ref()
+const actionSheetStatus = ref(false)
+const formData = ref({})
+const schema = ref<DataFormSchema<Omit<DesignerOrderSaleOther, 'id' | 'createTime' | 'userId'>>>({
+  saleTime: {
+    type: 'TimePick',
+    label: messages.objects.designerOrderSaleOther.saleTime,
+    required: true,
+    props: {
+      defaultValue: new Date(),
+    },
+  },
+  supplierName: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.supplierName,
+    required: true,
+  },
+  brandName: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.brandName,
+    required: true,
+  },
+  projectName: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.projectName,
+    required: true,
+  },
+  customerName: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.customerName,
+    required: true,
+  },
+  customerPhone: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.customerPhone,
+  },
+  orderAmount: {
+    type: 'TextField',
+    label: messages.objects.designerOrderSaleOther.orderAmount,
+    required: true,
+  },
+})
+const rules = ref({
+  supplierName: [{ required: true, message: '请输入材料商' }],
+  brandName: [{ required: true, message: '请输入品牌' }],
+  projectName: [{ required: true, message: '请输入项目名称' }],
+  customerName: [{ required: true, message: '请输入客户姓名' }],
+  // customerPhone: [{ required: true, message: '请输入客户电话' }],
+  orderAmount: [{ required: true, message: '请输入订单金额' }],
+  saleTime: [{ required: true, message: '请输入销售时间' }],
+})
+const formRef = ref<ComponentExposed<typeof DataForm>>()
+const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
+const query = computed(() => ({ userId: id.value }))
+const handleSubmit = async () => {
+  const { valid } = await formRef.value!.validate()
+  if (!valid) return
+  if (Object.keys(formData.value).includes('id')) {
+    await requestToast(() => updateOtherSales(formData.value), {
+      success: true,
+      successTitle: '保存成功',
+    })
+  } else {
+    await requestToast(
+      () =>
+        saveOtherSales({
+          ...formData.value,
+          userId: Number(id.value),
+        }),
+      { success: true, successTitle: '保存成功' },
+    )
+  }
+  actionSheetStatus.value = false
+  formData.value = {}
+  await pageHelperRef.value?.reload()
+}
+const handleEdit = (item: DesignerOrderSaleOther) => {
+  formData.value = item
+  actionSheetStatus.value = true
+}
+const handleDelete = async (item: DesignerOrderSaleOther) => {
+  await requestToast(() => deleteOtherSales(item.id), { success: true, successTitle: '删除成功' })
+  await pageHelperRef.value?.reload()
+}
+onLoad((query?: Record<string | 'id', string>) => {
+  id.value = query?.id
+})
+</script>
+
+<template>
+  <div class="flex-grow flex flex-col">
+    <PageHelperEvo
+      ref="pageHelperRef"
+      :request="getOtherSalesPage"
+      :query="query"
+      class="flex-grow"
+    >
+      <template #default="{ source }">
+        <div class="flex flex-col gap-4 p-4">
+          <template v-for="(it, index) in source?.list" :key="index">
+            <Card>
+              <div class="grid grid-cols-[90px_1fr] gap-2.5">
+                <template
+                  v-for="(item, i) in [
+                    { label: '材料商', value: it.supplierName },
+                    { label: '品牌', value: it.brandName },
+                    { label: '项目名称', value: it.projectName },
+                    { label: '客户姓名', value: it.customerName },
+                    { label: '客户电话', value: it.customerPhone },
+                    { label: '订单金额', value: it.orderAmount + '元' },
+                  ]"
+                  :key="i"
+                >
+                  <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
+                    {{ item.label }}
+                  </div>
+                  <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
+                    {{ item.value }}
+                  </div>
+                </template>
+              </div>
+              <div class="bg-[#f4f4f4] h-.25 my-4"></div>
+              <div class="flex justify-between">
+                <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal">
+                  {{ dayjs(it.createTime).format('YYYY-MM-DD HH:mm') }}
+                </div>
+                <div class="flex gap-4">
+                  <wd-button plain :round="false" size="small" @click="handleEdit(it)">
+                    修改
+                  </wd-button>
+                  <wd-button
+                    type="error"
+                    plain
+                    :round="false"
+                    size="small"
+                    @click="handleDelete(it)"
+                  >
+                    删除
+                  </wd-button>
+                </div>
+              </div>
+            </Card>
+          </template>
+        </div>
+      </template>
+    </PageHelperEvo>
+    <div class="py-2 bg-[#f0f4ff]">
+      <div
+        class="text-center text-[#2357e9] text-xs font-normal font-['PingFang_SC'] leading-normal"
+      >
+        其他销售信息不参与线上销售统计
+      </div>
+    </div>
+    <BottomAppBar fixed placeholder>
+      <div class="w-full">
+        <wd-button block :round="false" @click="((actionSheetStatus = true), (formData = {}))">
+          添加
+        </wd-button>
+      </div>
+    </BottomAppBar>
+    <wd-action-sheet v-model="actionSheetStatus">
+      <div class="p-4">
+        <DataForm
+          ref="formRef"
+          :rules="rules"
+          :schema="schema"
+          :direction="'horizontal'"
+          v-model="formData"
+        ></DataForm>
+        <wd-button :round="false" block @click="handleSubmit">保存</wd-button>
+      </div>
+    </wd-action-sheet>
+  </div>
+</template>
+
+<style scoped lang="scss"></style>

+ 126 - 69
packages/merchant/src/pages/agent/designer/detail.vue

@@ -7,7 +7,15 @@ style:
 
 <script setup lang="ts">
 import NavbarEvo from '@/components/navbar-evo.vue'
-import { getFollowUpPage, getUserInfoById } from '../../../core/libs/agent-requests'
+import {
+  getFollowUpPage,
+  getPointsCounts,
+  getUserInfoById,
+  getPointsOrders,
+  getBrowseRecordCount,
+  getBrowseRecords,
+  getBrowseRecordRemarks,
+} from '@/core/libs/agent-requests'
 import {
   desinTopBg,
   rightArrowIcon,
@@ -21,13 +29,13 @@ import {
 import PageHelperEvo from '@/components/page-helper-evo.vue'
 import { dayjs } from 'wot-design-uni'
 import { toHomePage } from '@/core/libs/actions'
-import arcBottom from '@designer-hub/assets/src/libs/assets/arcBottom'
+import arcBottomBlue from '@designer-hub/assets/src/libs/assets/arcBottomBlue'
 import { useMemberLevelsStore } from '@/store/member-levles'
-import TaskCard from '@/pages/agent/components/task-card.vue'
-import {getDesignerPointsActivities, getPointsOrders} from '@/core/libs/requests'
+import { getDesignerPointsActivities } from '@/core/libs/requests'
 import { useUserStore } from '@/store'
 import { storeToRefs } from 'pinia'
 import Card from '@designer-hub/app/src/components/card.vue'
+import ListHelperEvo from '@/components/list-helper-evo.vue'
 
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
@@ -44,7 +52,56 @@ const tabs = ref([
 ])
 const status = ref({ '0': '已报名', '1': '已完成', '2': '未核销', '3': '已取消', '4': '待交付' })
 const followUpQuery = ref({})
-const pointsActivitiesQuery = computed(() => ({ brokerId: userInfo.value.userId }))
+const { data: browseRecordCount, run: setBrowseRecordCount } = useRequest(() =>
+  getBrowseRecordCount(id.value),
+)
+const browseRecordCountItems = computed(() => [
+  {
+    title: '打开次数',
+    subTitle: '最近',
+    value: browseRecordCount.value?.openNumber ?? 0,
+    subValue: browseRecordCount.value?.openTime
+      ? dayjs(browseRecordCount.value.openTime).format('YY/MM/DD')
+      : '暂无',
+  },
+  {
+    title: '浏览时长',
+    subTitle: '本年',
+    value: browseRecordCount.value?.duration ?? 0,
+    subValue: browseRecordCount.value?.durationYear ?? 0,
+  },
+  {
+    title: '发圈次数',
+    subTitle: '本年',
+    value: browseRecordCount.value?.circleNumber ?? 0,
+    subValue: browseRecordCount.value?.circleNumberYear ?? 0,
+  },
+  {
+    title: '主页分享数',
+    subTitle: '本年',
+    value: browseRecordCount.value?.homeShareNumber ?? 0,
+    subValue: browseRecordCount.value?.homeShareNumberYear ?? 0,
+  },
+  {
+    title: '分享浏览数',
+    subTitle: '本年',
+    value: browseRecordCount.value?.shareViewNumber ?? 0,
+    subValue: browseRecordCount.value?.shareViewNumberYear ?? 0,
+  },
+  {
+    title: '分享获客数',
+    subTitle: '本年',
+    value: browseRecordCount.value?.customersAcquired ?? 0,
+    subValue: browseRecordCount.value?.customersAcquiredYear ?? 0,
+  },
+])
+const recentActivities = computed(() => [
+  { label: '最近浏览品牌', value: '' },
+  { label: '最近到店品牌', value: '' },
+  { label: '最近浏览游学', value: '' },
+  { label: '最近浏览活动', value: '' },
+])
+const pointsActivitiesQuery = computed(() => ({ stylistId: id.value }))
 const toPointsDetails = () => {
   uni.navigateTo({ url: `/pages/agent/designer/points/index?id=${id.value}` })
 }
@@ -54,9 +111,10 @@ const toOrderDetails = (it: any) => {
 const toArchives = () => {
   uni.navigateTo({ url: '/pages/agent/designer/archives/index?id=' + id.value })
 }
-onLoad((query) => {
+onLoad(async (query) => {
   id.value = query?.id
-  setData()
+  await setData()
+  await Promise.all([setBrowseRecordCount()])
 })
 </script>
 
@@ -83,15 +141,15 @@ onLoad((query) => {
                 </div>
 
                 <wd-img
-                  v-if="data.levelId"
+                  v-if="data?.levelId"
                   width="63"
                   height="18.6"
-                  :src="getMemberLevelLogo(data.levelId)"
+                  :src="getMemberLevelLogo(data?.levelId)"
                 ></wd-img>
               </div>
               <div
                 class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-snug flex items-center"
-                @click="toHomePage(id.value)"
+                @click="toHomePage(id)"
               >
                 <div>个人主页</div>
                 <wd-img width="13" height="13" :src="rightArrowIcon"></wd-img>
@@ -113,7 +171,7 @@ onLoad((query) => {
       <div>
         <div class="flex items-center justify-around">
           <template v-for="(it, i) in tabs" :key="i">
-            <div class="flex flex-col items-center gap-1" @click="active = it.value">
+            <div class="flex flex-col items-center gap-0" @click="active = it.value">
               <div
                 class="text-center font-normal font-['PingFang_SC'] visible"
                 :class="`${it.value === active ? 'text-black text-lg leading-relaxed ' : 'text-black/60 text-base leading-normal'}`"
@@ -124,7 +182,7 @@ onLoad((query) => {
                 :style="{ visibility: it.value === active ? 'visible' : 'hidden' }"
                 width="17"
                 height="5.6"
-                :src="arcBottom"
+                :src="arcBottomBlue"
               ></wd-img>
             </div>
           </template>
@@ -144,38 +202,33 @@ onLoad((query) => {
                 <wd-icon size="12" name="arrow-right" color="rgba(0,0,0,.3)"></wd-icon>
               </div>
             </div>
-            <div class="mt-3 grid grid-cols-3 gap-2.5">
-              <template
-                v-for="{ name, value } of [
-                  { name: '当前剩余积分', des: '最近', value: 220 },
-                  { name: '累计获得积分', des: '本年', value: 220 },
-                  { name: '累计消耗积分', des: '本年', value: 220 },
-                  { name: '累计跟进次数', des: '本年', value: 220 },
-                  { name: '累计消耗次数', des: '本年', value: 220 },
-                  { name: '累计获得次数', des: '本年', value: 220 },
-                ]"
-                :key="name"
-              >
-                <div class="rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
+            <div class="mt-2 w-full h-.25 bg-[#f9f9f9]"></div>
+            <ListHelperEvo
+              :request="getPointsCounts"
+              :query="{ userId: id }"
+              content-class="grid grid-cols-3 gap-7 py-4"
+            >
+              <template #default="{ item }">
+                <div class="rounded-lg aspect-[1/1] flex flex-col justify-around">
                   <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
-                    {{ name }}
+                    {{ item.title }}
                   </div>
-                  <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
-                    {{ value }}
+                  <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
+                    {{ item.value }}
                   </div>
                   <div class="flex items-center gap-1">
                     <div
                       class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
                     >
-                      年新增
+                      {{ item.subTitle }}
                     </div>
-                    <div class="text-black/90 text-xs font-normal font-['D-DIN Exp'] leading-norma">
-                      20
+                    <div class="text-black/90 text-xs font-normal font-['D-DIN_Exp'] leading-norma">
+                      {{ item.subValue }}
                     </div>
                   </div>
                 </div>
               </template>
-            </div>
+            </ListHelperEvo>
           </Card>
 
           <Card custom-class="my-4">
@@ -184,37 +237,37 @@ onLoad((query) => {
                 使用动态
               </div>
             </div>
-            <div class="mt-3 grid grid-cols-3 gap-2.5">
-              <template
-                v-for="{ name, value } of [
-                  { name: '打开次数', des: '最近', value: 220 },
-                  { name: '浏览时长', des: '本年', value: 220 },
-                  { name: '发圈次数', des: '本年', value: 220 },
-                  { name: '主页分享数', des: '本年', value: 220 },
-                  { name: '分享浏览数', des: '本年', value: 220 },
-                  { name: '分享获客数', des: '本年', value: 220 },
-                ]"
-                :key="name"
+            <div class="mt-3">
+              <ListHelperEvo
+                :content-class="`grid grid-cols-3 gap-2.5`"
+                :items="browseRecordCountItems"
+                custom-class="grid grid-cols-3 gap-2.5"
               >
-                <div class="rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
-                  <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
-                    {{ name }}
-                  </div>
-                  <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
-                    {{ value }}
-                  </div>
-                  <div class="flex items-center gap-1">
+                <template #default="{ item }">
+                  <div class="rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
                     <div
-                      class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
+                      class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none"
                     >
-                      年新增
+                      {{ item.title }}
                     </div>
-                    <div class="text-black/90 text-xs font-normal font-['D-DIN Exp'] leading-norma">
-                      20
+                    <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
+                      {{ item.value }}
+                    </div>
+                    <div class="flex items-center gap-1">
+                      <div
+                        class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
+                      >
+                        {{ item.subTitle }}
+                      </div>
+                      <div
+                        class="text-black/90 text-xs font-normal font-['D-DIN_Exp'] leading-norma"
+                      >
+                        {{ item.subValue }}
+                      </div>
                     </div>
                   </div>
-                </div>
-              </template>
+                </template>
+              </ListHelperEvo>
             </div>
           </Card>
 
@@ -228,18 +281,22 @@ onLoad((query) => {
                 </div>
               </div>
               <div class="w-full h-.25 bg-[#f9f9f9]"></div>
-              <div class="flex flex-col gap-6 py-5">
-                <template v-for="(it, index) in [1, 2, 3]" :key="index">
-                  <div class="h-4 relative">
+              <ListHelperEvo
+                :request="getBrowseRecordRemarks"
+                :query="{ userId: id }"
+                custom-class="flex flex-col gap-6"
+              >
+                <template #default="{ item }">
+                  <div class="mx-2 flex items-center gap-1 my-6">
+                    <div class="w-1 h-1 bg-[#2357e9] rounded-full"></div>
                     <div
-                      class="left-[11px] top-0 absolute text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none"
+                      class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none"
                     >
-                      最近浏览品牌:Imola
+                      {{ item }}
                     </div>
-                    <div class="w-1 h-1 left-0 top-[6px] absolute bg-[#2357e9] rounded-full"></div>
                   </div>
                 </template>
-              </div>
+              </ListHelperEvo>
             </Card>
           </div>
 
@@ -382,19 +439,19 @@ onLoad((query) => {
             <div class="flex items-center justify-between mt-[19px]">
               <div class="flex items-center gap-[8px]">
                 <wd-img width="17" height="17" :src="shareIcon"></wd-img>
-                <div class="text-black/90 text-sm font-normal font-['D-DIN Exp'] leading-snug">
+                <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
                   232
                 </div>
               </div>
               <div class="flex items-center gap-[8px]">
                 <wd-img width="17" height="17" :src="messageIcon"></wd-img>
-                <div class="text-black/90 text-sm font-normal font-['D-DIN Exp'] leading-snug">
+                <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
                   232
                 </div>
               </div>
               <div class="flex items-center gap-[8px]">
                 <wd-img width="17" height="17" :src="praiseIcon"></wd-img>
-                <div class="text-black/90 text-sm font-normal font-['D-DIN Exp'] leading-snug">
+                <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
                   232
                 </div>
               </div>
@@ -403,11 +460,11 @@ onLoad((query) => {
         </view>
 
         <view class="content mt-[20px]" v-if="active === 'product'">
-          <div class="flex-grow flex flex-col gap-4 px-3.5 py-5">
+          <div class="flex-grow flex flex-col gap-4">
             <PageHelperEvo
               ref="pageHelperRef"
               :request="getPointsOrders"
-              :query="{}"
+              :query="{ orderType: 2 }"
               class="flex-grow flex flex-col"
             >
               <template #default="{ source }">

+ 23 - 10
packages/merchant/src/pages/agent/designer/index.vue

@@ -22,6 +22,7 @@ import SectionHeading from '@designer-hub/app/src/components/section-heading.vue
 import { useMemberLevelsStore } from '../../../store/member-levles'
 import { storeToRefs } from 'pinia'
 import { useUserStore } from '../../../store'
+import link from '@designer-hub/assets/src/libs/assets/link'
 
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
@@ -36,12 +37,14 @@ const { getMemberLevelLogo } = memberLevelsStore
 const filterQuery = ref<{
   tags: any[]
   levels: any[]
+  retryStatus: any[]
   minPoints?: string
   maxPoints?: string
   brokerId?: string
 }>({
   tags: [],
   levels: [],
+  retryStatus: [],
   brokerId: String(userInfo.value.userId),
 })
 const query = ref({})
@@ -92,6 +95,7 @@ const handleSubmit = () => {
     ...filterQuery.value,
     tags: filterQuery.value.tags.join(','),
     levels: filterQuery.value.levels.join(','),
+    retryStatus: filterQuery.value.retryStatus.join(','),
   }
   filterState.value = false
 }
@@ -144,9 +148,12 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
                 <div class="">
                   <div class="flex items-center">
                     <div
-                      class="w-[55px] h-[55px] bg-neutral-100 rounded-full mr-2 flex items-center justify-center"
+                      class="w-[55px] h-[55px] bg-neutral-100 rounded-full mr-2 flex items-center justify-center relative"
                     >
                       <wd-img width="100%" height="100%" round :src="it.avatar"></wd-img>
+                      <div v-if="it.retryStatus" class="absolute right-0 bottom--1">
+                        <wd-img width="14" height="14" :src="link"></wd-img>
+                      </div>
                     </div>
                     <div class="flex flex-col flex-1">
                       <div class="flex-row flex items-center justify-between w-full">
@@ -317,15 +324,6 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
           <wd-checkbox custom-class="w-50%!" :model-value="tag.value">{{ tag.label }}</wd-checkbox>
         </template>
       </wd-checkbox-group>
-      <!-- <div class="flex items-center justify-between py-4">
-        <template>
-          <div class="w-[168px] h-10 bg-[#f5f7f9] rounded-lg flex items-center justify-center">
-            <div class="w-7 text-black/90 text-sm font-normal font-['PingFang_SC'] leading-none">
-              全部
-            </div>
-          </div>
-        </template>
-      </div> -->
 
       <SectionHeading title="积分区间"></SectionHeading>
       <div class="flex items-center justify-between py-4">
@@ -341,6 +339,21 @@ onLoad(async (params: { title?: string; filter?: string; tags?: string }) => {
           no-border
         ></wd-input>
       </div>
+      <SectionHeading title="绑定关系"></SectionHeading>
+      <wd-checkbox-group shape="button" v-model="filterQuery.retryStatus">
+        <template
+          v-for="(tag, index) in [
+            // { label: '全部', value: '' },
+            { label: '弱绑定', value: '0' },
+            { label: '强绑定', value: '1' },
+          ]"
+          :key="index"
+        >
+          <wd-checkbox custom-class="w-50%!" :model-value="tag.value">
+            {{ tag.label }}
+          </wd-checkbox>
+        </template>
+      </wd-checkbox-group>
       <div class="flex gap-4">
         <div class="flex-1">
           <wd-button block :round="false" @click="handleReset">重置</wd-button>

+ 98 - 68
packages/merchant/src/pages/agent/tasks/detail/index.vue

@@ -15,14 +15,10 @@ import dayjs from 'dayjs'
 import { DataFormSchema } from '../../../../components/data-form'
 import { ComponentExposed } from 'vue-component-type-helpers'
 import { useTask } from '../../../../composables/task'
+import { requestToast } from '@designer-hub/app/src/core/utils/common'
 
-const { getBgClass, getColor } = useTask()
+const { getBgClass, getColor, getTypeTitle, getBgStyle } = useTask()
 const taskId = ref()
-const types = ref({
-  1: { title: '到店', bg: '', bgClass: 'bg-gradient-to-r from-[#cfe0ff] to-[#e1ecff]' },
-  2: { title: '订单', bg: '', bgClass: 'bg-gradient-to-r from-[#ffe8cf] to-[#fff3e1]' },
-})
-const type = ref(1)
 const publishState = ref(false)
 const formData = ref<any>({})
 const userStore = useUserStore()
@@ -56,53 +52,61 @@ const customerRules = ref({
 const initData = async () => {
   await setTaskDetails()
 }
-const submitTask = async (data) => {
-  uni.showLoading()
-  const { valid } = await dataFormRef.value.validate()
+const submitTask = async () => {
+  await uni.showLoading()
+  const { valid } = await dataFormRef.value!.validate()
   if (!valid) {
     uni.hideLoading()
     return
   }
   console.log(formData.value)
-  const res = await appTaskReport({
-    brokerId: userInfo.value.userId,
-    taskId: taskId.value,
-    ...formData.value,
-  })
+  await requestToast(
+    () =>
+      appTaskReport({
+        brokerId: userInfo.value.userId,
+        taskId: taskId.value,
+        ...formData.value,
+      }),
+    { success: true, successTitle: '上报成功' },
+  )
   uni.hideLoading()
+  await setTaskDetails()
   publishState.value = false
 }
 const acceptingOrders = async () => {
-  uni.showLoading()
+  await uni.showLoading()
   const res = await taskReceive({
     brokerId: userInfo.value.userId,
     taskId: taskDetails.value.id,
     orders: true,
   })
   uni.hideLoading()
-  initData()
+  await initData()
 }
 const acceptingNoOrders = async () => {
-  uni.showLoading()
+  await uni.showLoading()
   const res = await taskReceive({
     brokerId: userInfo.value.userId,
     taskId: taskDetails.value.id,
     orders: false,
   })
   uni.hideLoading()
-  initData()
+  await initData()
 }
-onLoad(async (query: { taskId: string }) => {
-  taskId.value = query.taskId
+onLoad(async (query?: Record<string | 'taskId', string>) => {
+  taskId.value = query?.taskId
   await initData()
 })
 </script>
 <template>
   <view class="flex-grow flex flex-col p-4 gap-4" style="position: relative">
-    <Card :custom-class="`${getBgClass(Number(taskDetails?.taskType))} px-0 py-0`">
+    <Card
+      :custom-class="`px-0 py-0`"
+      :custom-style="`${taskDetails && getBgStyle(Number(taskDetails.taskType))}`"
+    >
       <div class="flex items-center py-[20px] px-[15px]">
         <div class="text-black/90 text-lg font-normal font-['PingFang_SC'] leading-none">
-          {{ taskDetails?.name }}
+          {{ taskDetails && getTypeTitle(Number(taskDetails.taskType)) }}
         </div>
         <div class="flex-1"></div>
         <div
@@ -114,18 +118,22 @@ onLoad(async (query: { taskId: string }) => {
           </div>
         </div>
       </div>
-      <div class="bg-[#f6f7ff]" style="border-top-left-radius: 8px; border-top-right-radius: 8px">
-        <div class="flex flex-row items-center justify-start p-[15px] gap-2">
+      <div class="bg-[#f6f7ff] rounded-t-2 p-5 flex flex-col gap-4">
+        <div class="flex flex-row items-center justify-start gap-2">
           <div style="width: 50px; height: 50px">
             <wd-circle
-              :model-value="(taskDetails.completedNum / taskDetails.storeQuantity) * 100"
+              :model-value="
+                ((taskDetails?.completedNum ?? 0) / (taskDetails?.storeQuantity ?? 0)) * 100
+              "
               :size="50"
               :color="getColor(Number(taskDetails?.taskType))"
               :clockwise="false"
             >
               <div class="flex flex-col items-center">
                 <div class="w-[29.20px] h-[18.39px] text-black text-sm font-medium font-['DIN']">
-                  {{ (taskDetails.completedNum / taskDetails.storeQuantity) * 100 }}%
+                  {{
+                    ((taskDetails?.completedNum ?? 0) / (taskDetails?.storeQuantity ?? 0)) * 100
+                  }}%
                 </div>
                 <div
                   class="w-[22.71px] h-[10.82px] text-black/60 text-[7px] font-normal font-['PingFang_SC']"
@@ -145,25 +153,25 @@ onLoad(async (query: { taskId: string }) => {
             </div>
           </div>
         </div>
-        <div class="flex flex-row items-center justify-between gap-2 p-[20px]">
+        <div class="flex flex-row items-center justify-between gap-2">
           <div class="flex items-center justify-center flex-col">
             <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">目标</div>
-            <div class="w-5 text-black/90 text-lg font-medium font-['DIN'] leading-normal">
+            <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
               {{ taskDetails?.storeQuantity }}
             </div>
           </div>
           <div style="width: 1px; height: 10px; background: #e8e8e8"></div>
           <div class="flex items-center justify-center flex-col">
             <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">个人完成</div>
-            <div class="w-5 text-black/90 text-lg font-medium font-['DIN'] leading-normal">
+            <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
               {{ taskDetails?.personalCompletedNum }}
             </div>
           </div>
           <div style="width: 1px; height: 5px; background: #e8e8e8"></div>
           <div class="flex items-center justify-center flex-col">
             <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">累计完成</div>
-            <div class="w-5 text-black/90 text-lg font-medium font-['DIN'] leading-normal">
-              {{ taskDetails?.completedNum }}
+            <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
+              {{ taskDetails?.completedNum ?? 0 }}
             </div>
           </div>
           <!--            </div>-->
@@ -249,26 +257,28 @@ onLoad(async (query: { taskId: string }) => {
         <div class="mr-2.5 w-1 h-4 rotate-180 bg-[#2357e9] rounded-[20px]"></div>
         <SectionHeading title="数据明细" size="base"></SectionHeading>
       </div>
+      <!-- 到店打卡-->
       <div v-if="taskDetails?.finalType == '1'" class="flex flex-col gap-4 mt-5">
-        <template v-for="item in taskDetails?.brokerList" :key="item.id">
-          <div class="flex gap-2.5 p-3.5 bg-[#f7fbff] items-center rounded-[10px]">
-            <img class="w-11 h-11 rounded-full" :src="item.headImgUrl" />
-            <div class="flex-1 flex flex-col gap-2">
-              <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal">
-                {{ item.brokerName }}
-              </div>
-              <div class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-none">
-                {{ item.finalTypeName }}{{ item.shopNames }}
-              </div>
-            </div>
-            <div class="h-full flex items-start">
-              <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal">
-                {{ dayjs(item.createTime).format('YYYY/MM/DD HH:mm') }}
-              </div>
-            </div>
-          </div>
-        </template>
+        <!--        <template v-for="item in taskDetails?.brokerList" :key="item.id">-->
+        <!--          <div class="flex gap-2.5 p-3.5 bg-[#f7fbff] items-center rounded-[10px]">-->
+        <!--            <wd-img width="44" height="44" round :src="item.headImgUrl" />-->
+        <!--            <div class="flex-1 flex flex-col gap-2">-->
+        <!--              <div class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal">-->
+        <!--                {{ item.brokerName }}-->
+        <!--              </div>-->
+        <!--              <div class="text-black/30 text-sm font-normal font-['PingFang_SC'] leading-none">-->
+        <!--                {{ item.finalTypeName }}{{ item.shopNames }}-->
+        <!--              </div>-->
+        <!--            </div>-->
+        <!--            <div class="h-full flex items-start">-->
+        <!--              <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal">-->
+        <!--                {{ dayjs(item.createTime).format('YYYY/MM/DD HH:mm') }}-->
+        <!--              </div>-->
+        <!--            </div>-->
+        <!--          </div>-->
+        <!--        </template>-->
       </div>
+      <!-- 上报-->
       <div v-else>
         <template v-for="(item, i) in taskDetails?.reportList" :key="i">
           <div class="bg-[#f7fbff] rounded-[10px] py-[22px] px-[16px] mt-[20px]">
@@ -276,8 +286,21 @@ onLoad(async (query: { taskId: string }) => {
               <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal">
                 {{ dayjs(item.createTime).format('YYYY/MM/DD HH:mm') }}
               </div>
-              <div class="text-[#2357e9] text-xs font-normal font-['PingFang_SC'] leading-normal">
-                {{ item.status == '0' ? '审核通过' : item.status == '1' ? '审核中' : '驳回' }}
+              <div
+                class="text-xs font-normal font-['PingFang_SC'] leading-normal"
+                :class="
+                  { '0': 'text-[#16b032]', '1': 'text-[#2357e9]', '2': 'text-#ff2d2d' }[
+                    String(item.status)
+                  ]
+                "
+              >
+                {{
+                  String(item.status) === '0'
+                    ? '审核通过'
+                    : String(item.status) === '1'
+                      ? '审核中'
+                      : '驳回'
+                }}
               </div>
             </div>
             <div class="mt-[7px]">
@@ -299,12 +322,19 @@ onLoad(async (query: { taskId: string }) => {
                 {{ item.remark }}
               </span>
             </div>
+            <template v-if="String(item.status) === '2'">
+              <div class="bg-[#e6e8f1] my-4 border-[0.5px] border-solid border-[#e6e8f1]"></div>
+              <div class="text-[#ff2d2d] text-xs font-normal font-['PingFang_SC'] leading-none">
+                原因:{{ item.reason }}
+              </div>
+            </template>
           </div>
         </template>
       </div>
     </Card>
-    <BottomAppBar fixed placeholder>
-      <template v-if="taskDetails?.finalType == 1 && taskDetails?.receive">
+
+    <template v-if="taskDetails?.receive">
+      <BottomAppBar fixed placeholder>
         <div class="flex items-center justify-between gap-3">
           <div
             @click="acceptingNoOrders"
@@ -327,29 +357,29 @@ onLoad(async (query: { taskId: string }) => {
             </div>
           </div>
         </div>
-      </template>
-      <template v-else>
-        <template v-if="!taskDetails?.receive && taskDetails?.finalType == '2'">
-          <div class="px-5 py-3 bg-[#2357e9] rounded-md justify-center items-center gap-1">
-            <div
-              @click="publishState = true"
-              class="text-center text-white text-base font-normal font-['PingFang_SC'] leading-normal"
-            >
-              上报
-            </div>
+      </BottomAppBar>
+    </template>
+    <template v-if="!taskDetails?.receive && String(taskDetails?.finalType) === '2'">
+      <BottomAppBar fixed placeholder>
+        <div class="px-5 py-3 bg-[#2357e9] rounded-md justify-center items-center gap-1">
+          <div
+            @click="publishState = true"
+            class="text-center text-white text-base font-normal font-['PingFang_SC'] leading-normal"
+          >
+            上报
           </div>
-        </template>
-      </template>
-    </BottomAppBar>
+        </div>
+      </BottomAppBar>
+    </template>
 
     <wd-action-sheet v-model="publishState" title="" @close="publishState = false">
       <view class="flex flex-col p-4 mt-4">
-        <data-form
+        <DataForm
           ref="dataFormRef"
           :schema="customerSchema"
           :rules="customerRules"
           v-model="formData"
-        ></data-form>
+        ></DataForm>
         <div><wd-button block :round="false" @click="submitTask">提交</wd-button></div>
       </view>
     </wd-action-sheet>

+ 27 - 113
packages/merchant/src/pages/agent/tasks/index.vue

@@ -8,7 +8,7 @@
 </route>
 <script setup lang="ts">
 import Card from '@designer-hub/app/src/components/card.vue'
-import { getBroker, getTaskList, taskReceive } from '../../../core/libs/requests'
+import { getBroker, taskReceive } from '../../../core/libs/requests'
 import { useUserStore } from '../../../store'
 import { storeToRefs } from 'pinia'
 import dayjs from 'dayjs'
@@ -17,6 +17,8 @@ import { getTasks } from '../../../core/libs/agent-requests'
 import { useTask } from '../../../composables/task'
 import { AgentTask } from '@designer-hub/app/src/core/libs/models'
 import { ComponentExposed } from 'vue-component-type-helpers'
+import TaskCard from '../../agent/components/task-card.vue'
+
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const { types } = useTask()
@@ -63,118 +65,30 @@ onMounted(async () => {
 })
 </script>
 <template>
-  <div class="bg-white rounded-lg shadow flex m-[18px] p-[11px]" @click="toPoints">
-    <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed">
-      任务积分
-    </div>
-    <div class="flex-1"></div>
-    <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
-      {{ data.points }}
+  <div class="py-4 flex-grow flex flex-col">
+    <div @click="toPoints">
+      <Card custom-class="mx-4">
+        <div class="w-full flex items-center">
+          <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed">
+            任务积分
+          </div>
+          <div class="flex-1"></div>
+          <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
+            {{ data?.points ?? 0 }}
+          </div>
+          <wd-icon name="arrow-right" size="22" color="rgba(0,0,0,.75)"></wd-icon>
+        </div>
+      </Card>
     </div>
-    <div class="w-6 h-6 relative"></div>
-  </div>
-
-  <PageHelperEvo ref="pageHelperRef" :request="getTasks" :query="query">
-    <template #default="{ source }">
-      <div class="flex-grow flex flex-col gap-4 p-4">
-        <template v-for="item in source?.list" :key="item.id">
-          <div @click="toDetail(item)">
-            <Card :custom-class="`${types[item.taskType].bgClass} p-0`" style="padding: 0">
-              <div class="flex p-4 items-center">
-                <div
-                  :class="`${status[item.status].bgClass} w-[47px] h-[23px] px-1 rounded border justify-center items-center gap-2.5 inline-flex`"
-                >
-                  <div
-                    class="text-right text-white text-xs font-normal font-['PingFang_SC'] leading-tight"
-                  >
-                    {{ status[item.status].title }}
-                  </div>
-                </div>
-                <div
-                  class="mx-2.5 text-black/90 text-lg font-normal font-['PingFang_SC'] leading-none"
-                >
-                  {{ types[item.taskType].title }}
-                </div>
-                <div class="flex-1"></div>
-                <div
-                  class="mx-1.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
-                >
-                  奖励积分
-                </div>
-                <div class="text-[#ff2e2e] text-[22px] font-medium font-['DIN'] leading-none">
-                  {{ item.pointsReward }}
-                </div>
-              </div>
-              <div class="flex flex-col gap-4 bg-white p-5 rounded-2xl">
-                <div>
-                  <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    任务名称:
-                  </span>
-                  <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    {{ item.name }}
-                  </span>
-                </div>
-                <div>
-                  <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    发起方:
-                  </span>
-                  <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    {{ item.bearerName }}
-                  </span>
-                </div>
 
-                <div>
-                  <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    任务时间:
-                  </span>
-                  <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none">
-                    {{ dayjs(item.startTime).format('YYYY/MM/DD') }}-{{
-                      dayjs(item.endTime).format('YYYY/MM/DD')
-                    }}
-                  </span>
-                </div>
-                <div class="flex items-center border-t border-t-solid border-t-[#efefef] pt-1.5">
-                  <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-                    目标 {{ item.storeQuantity }}
-                  </div>
-                  <template v-if="!item.receive">
-                    <div class="flex-1"></div>
-                    <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-                      个人完成
-                      <span style="color: #2357e9">{{ item.personalCompletedNum }}</span>
-                    </div>
-                    <div class="flex-1"></div>
-                    <div class="text-black/90 text-sm font-normal font-['PingFang_SC']">
-                      累计完成
-                      <span style="color: #f1981b">{{ item.completedNum }}</span>
-                    </div>
-                  </template>
-                  <template v-else>
-                    <div class="flex-1"></div>
-                    <div
-                      v-if="item.receive"
-                      class="mr-[16px] w-[68px] h-7 px-2.5 py-[3px] rounded-[30px] border border-[#fe5053] justify-center items-center gap-2.5 inline-flex"
-                      style="border: 1px solid #fe5053"
-                      @click.stop="acceptingNoOrders(item)"
-                    >
-                      <div class="w-9 text-[#ff2d2d] text-xs font-normal font-['PingFang_SC']">
-                        不接单
-                      </div>
-                    </div>
-                    <div
-                      v-if="item.receive"
-                      @click.stop="acceptingOrders(item)"
-                      class="w-[68px] h-7 px-2.5 py-[3px] bg-[#2357e9] rounded-[30px] justify-center items-center gap-2.5 inline-flex"
-                    >
-                      <div class="text-white text-xs font-normal font-['PingFang_SC']">接单</div>
-                    </div>
-                  </template>
-                </div>
-              </div>
-            </Card>
-          </div>
-        </template>
-      </div>
-    </template>
-  </PageHelperEvo>
+    <PageHelperEvo ref="pageHelperRef" :request="getTasks" :query="query">
+      <template #default="{ source }">
+        <div class="flex-grow flex flex-col gap-4 p-4">
+          <template v-for="item in source?.list" :key="item.id">
+            <TaskCard :options="item"></TaskCard>
+          </template>
+        </div>
+      </template>
+    </PageHelperEvo>
+  </div>
 </template>

+ 6 - 3
packages/merchant/src/pages/agent/todo/index.vue

@@ -36,11 +36,14 @@ const schema = ref<DataFormSchema>({
   executionTime: {
     type: 'TimePick',
     label: '时间:',
-    props: { defaultValue: dayjs().toDate(), labelWidth: 44 },
+    labelWidth: 44,
+    props: { defaultValue: dayjs().toDate().getTime() },
   },
-  content: { type: 'Textarea', label: '备注:', props: { labelWidth: 44 } },
+  content: { type: 'Textarea', label: '备注:', labelWidth: 44, props: {} },
+})
+const formData = ref({
+  // executionTime: '',
 })
-const formData = ref({})
 const handleAddTodo = () => {
   addSheetVisible.value = true
 }

+ 17 - 11
packages/merchant/src/pages/home/index.vue

@@ -29,6 +29,7 @@ import { useRouter } from '../../composables/router'
 import PageHelperEvo from '@/components/page-helper-evo.vue'
 import TaskCard from '../agent/components/task-card.vue'
 import { getTasks } from '../../core/libs/agent-requests'
+import { ComponentExposed } from 'vue-component-type-helpers'
 
 defineOptions({
   name: 'Home',
@@ -37,6 +38,7 @@ const router = useRouter()
 const userStore = useUserStore()
 const { isLogined, userInfo, isAgent, isMerchant } = storeToRefs(userStore)
 const orderAmount = ref()
+const todoPageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
 const pointsAmount = computed(() => orderAmount.value * 10)
 const todosQuery = computed(() => ({
   brokerId: String(userInfo.value.userId),
@@ -82,7 +84,9 @@ const toAddReporting = () => {
   uni.navigateTo({ url: '/pages/home/merchant/add-reporting-information' })
 }
 onShow(async () => {
-  isAgent.value && (await Promise.all([setTasks()]))
+  if (isAgent.value) {
+    await Promise.all([setTasks(), todoPageHelperRef.value?.refresh()])
+  }
 })
 onLoad(() => {
   console.log(isLogined.value)
@@ -107,7 +111,6 @@ onShareAppMessage(() => ({}))
       <wd-navbar custom-class="bg-transparent!" safe-area-inset-top :bordered="false">
         <template #left>
           <div
-            @click="toAddReporting"
             class="ml-1 text-center text-white text-lg font-normal font-['PingFang_SC'] leading-relaxed"
           >
             今日待办
@@ -121,12 +124,12 @@ onShareAppMessage(() => ({}))
           </div>
           <Card>
             <div>
-              <PageHelperEvo :request="getTodoPage" :query="todosQuery">
+              <PageHelperEvo ref="todoPageHelperRef" :request="getTodoPage" :query="todosQuery">
                 <template #default="{ source }">
                   <div class="flex flex-col py-6">
                     <template v-for="(it, index) in source?.list" :key="index">
                       <div>
-                        <div class="flex items-center gap-4">
+                        <div class="grid grid-cols-[56px_12px_1fr] items-center gap-4">
                           <div
                             class="w-14 text-end text-black text-base font-normal font-['PingFang_SC'] leading-none"
                           >
@@ -142,14 +145,15 @@ onShareAppMessage(() => ({}))
                               :class="`${it.status === 1 ? 'bg-[#517df8]' : 'bg-[#a8a8a8]'}`"
                             ></div>
                           </div>
-                          <div
-                            class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none"
-                          >
+                          <div class="text-black/60 text-sm font-normal font-['PingFang_SC']">
                             {{ it.content }}
                           </div>
                         </div>
-                        <div v-if="index < (source?.list?.length ?? 0) - 1" class="flex gap-4">
-                          <div class="w-14"></div>
+                        <div
+                          v-if="index < (source?.list?.length ?? 0) - 1"
+                          class="grid grid-cols-[56px_12px_1fr] gap-4"
+                        >
+                          <div class=""></div>
                           <div class="w-3 flex justify-center">
                             <div class="w-.25 h-10 bg-[#EDEDED]"></div>
                           </div>
@@ -180,13 +184,15 @@ onShareAppMessage(() => ({}))
             custom-class="mb-5"
           ></SectionHeading>
           <div class="flex overflow-x-auto whitespace-nowrap mx--4 px-4 gap-4 box-border">
-            <Card v-if="!tasks.list.length">
+            <Card custom-class="w-full" v-if="!tasks.list.length">
               <wd-status-tip image="search" tip="当前暂无未开始/进行中的任务" />
             </Card>
 
             <template v-for="(it, i) in tasks.list" :key="i">
               <div class="inline-block">
-                <div class="w-[calc(75vw)]"><TaskCard :options="it"></TaskCard></div>
+                <div class="w-[calc(75vw)]">
+                  <TaskCard :options="it" @change="setTasks()"></TaskCard>
+                </div>
               </div>
             </template>
           </div>

+ 111 - 88
packages/merchant/src/pages/mine/agent/invite/index.vue

@@ -2,7 +2,8 @@
 {
   "style": {
     "navigationBarTitleText": "邀请好友",
-    "navigationBarBackgroundColor": "#ffffff"
+    "navigationBarBackgroundColor": "#ffffff",
+    "navigationStyle": "custom"
   }
 }
 </route>
@@ -11,6 +12,7 @@ import { getBroker } from '../../../../core/libs/requests'
 import { useUserStore } from '../../../../store/index'
 import { Canvas } from '@designer-hub/app/src/core/utils/canvas'
 import { storeToRefs } from 'pinia'
+import NavbarEvo from '@/components/navbar-evo.vue'
 
 const currentInstance = getCurrentInstance()
 const userStore = useUserStore()
@@ -21,95 +23,116 @@ const { data, run: setData } = useRequest(() =>
 
 onLoad(async () => {
   await setData()
-  const [bg, title, contentBg, icon1, icon2, icon3, icon4, icon5, avatar] = await Promise.all(
-    [
-      'https://image.zhuchaohui.com/zhucaohui/9352daa033edc343fd6cc983978857dd77386b573380871a4b7f9e9f3617f183.png',
-      'https://image.zhuchaohui.com/zhucaohui/f1f13041769ecdf462aa2ccc246fb7566bea6fe83aaf73717ee959629cfe0f8f.svg',
-
-      'https://image.zhuchaohui.com/zhucaohui/08abd942d9f5635aa3cfd60376706bc948cdaf556417fb3396204f7cdec42e30.png',
-
-      'https://image.zhuchaohui.com/zhucaohui/fc22d1bee4e1737dc0d592a065f277bec4a790496faa292c869f781e9c67a700.svg',
-      'https://image.zhuchaohui.com/zhucaohui/85594fe5a8b12dc815b3ea062e826de086ed204f840931980cd1bf5417d8b814.svg',
-      'https://image.zhuchaohui.com/zhucaohui/7c3e518ff2dcd2d4d39001e3970c492195d518c7f0015c86c00b9ac5e788e4f4.svg',
-      'https://image.zhuchaohui.com/zhucaohui/11b8448cc06352f796a49fbbc67e1eacfa7f382cb2507d066cd32b6f88f164fe.svg',
-      'https://image.zhuchaohui.com/zhucaohui/d9dc32881076a752a7ab72701321538ff0e10fbc0482a3b4f9e95c1b8a132aec.svg',
-      data.value.headImgUrl || '',
-    ].map((it) => uni.getImageInfo({ src: it }).then(({ path }) => path)),
-  )
-
-  const ctx = uni.createCanvasContext('qrcode', currentInstance)
-  const { width, height } = await new Promise<any>((resolve) => {
-    uni
-      .createSelectorQuery()
-      .in(currentInstance)
-      .select('#qrcode')
-      .fields({ node: true, size: true }, (res) => {
-        resolve(res)
-      })
-      .exec()
-  })
-  const canvas = new Canvas(ctx, { width, height }, { width: 351 })
-  canvas.FillImage(bg)
-  canvas.RoundRect('#5379EC', 0, 0, 352, 607, 16)
-  canvas.Image(title, 27, 31, 297, 22.3)
-
-  canvas.Image(icon1, 28, 69, 15, 15)
-  canvas.Image(icon2, 143, 69, 13, 13)
-  canvas.Image(icon3, 248, 69, 13, 13)
-  canvas.Image(icon4, 30, 100, 12, 12)
-  canvas.Image(icon5, 141, 96, 16, 16)
-
-  canvas.FillText('国内外设计游学', '#ffffff', 10, 46, 80)
-  canvas.FillText('线上获客工具', '#ffffff', 10, 159, 80)
-  canvas.FillText('设计赋能项目', '#ffffff', 10, 262, 80)
-  canvas.FillText('丰富线下活动', '#ffffff', 10, 46, 109)
-  canvas.FillText('周边商品好礼', '#ffffff', 10, 159, 109)
-
-  // canvas.Circle('#D9D9D9', 136, 129, 41)
-
-  canvas.Image(contentBg, 17, 128, 319, 461)
-  canvas.CircleImage(avatar, 140, 133, 37)
-
-  canvas.FillText(data.value.brokerName, '#000000D9', 18, 149, 228, 'center')
-
-  canvas.FillTexts(
-    ['邀请码:', data.value.inviteCode],
-    ['14px PingFang_SC', '18px PingFang_SC'],
-    ['rgba(0,0,0,0.65)', 'rgba(0,0,0,0.85)'],
-    0,
-    0,
-    '',
-  )
-  // const textSegments = [
-  //   { text: '邀请码:', font: '14px PingFang_SC', color: 'rgba(0,0,0,0.65)' },
-  //   { text: data.value.inviteCode || '', font: '18px PingFang_SC', color: 'rgba(0,0,0,0.85)' },
-  // ]
-
-  // // Calculate total text width
-  // let totalWidth = 0
-  // textSegments.forEach((segment) => {
-  //   ctx.font = segment.font
-  //   totalWidth += ctx.measureText(segment.text).width
-  // })
-
-  // // Starting x position for centered text
-  // let startX = (width - totalWidth) / 2
-  // const y = 246 // Fixed vertical position
-
-  // // Draw each text segment
-  // textSegments.forEach((segment) => {
-  //   ctx.font = segment.font
-  //   ctx.fillStyle = segment.color
-
-  //   ctx.fillText(segment.text, startX, y)
-  //   startX += ctx.measureText(segment.text).width // Move x position for next segment
-  // })
-
-  ctx.draw && ctx.draw()
+  try {
+    const [bg, title, contentBg, icon1, icon2, icon3, icon4, icon5, avatar] = await Promise.all(
+      [
+        'https://image.zhuchaohui.com/zhucaohui/9352daa033edc343fd6cc983978857dd77386b573380871a4b7f9e9f3617f183.png',
+        'https://image.zhuchaohui.com/zhucaohui/f1f13041769ecdf462aa2ccc246fb7566bea6fe83aaf73717ee959629cfe0f8f.svg',
+
+        'https://image.zhuchaohui.com/zhucaohui/08abd942d9f5635aa3cfd60376706bc948cdaf556417fb3396204f7cdec42e30.png',
+
+        'https://image.zhuchaohui.com/zhucaohui/fc22d1bee4e1737dc0d592a065f277bec4a790496faa292c869f781e9c67a700.svg',
+        'https://image.zhuchaohui.com/zhucaohui/85594fe5a8b12dc815b3ea062e826de086ed204f840931980cd1bf5417d8b814.svg',
+        'https://image.zhuchaohui.com/zhucaohui/7c3e518ff2dcd2d4d39001e3970c492195d518c7f0015c86c00b9ac5e788e4f4.svg',
+        'https://image.zhuchaohui.com/zhucaohui/11b8448cc06352f796a49fbbc67e1eacfa7f382cb2507d066cd32b6f88f164fe.svg',
+        'https://image.zhuchaohui.com/zhucaohui/d9dc32881076a752a7ab72701321538ff0e10fbc0482a3b4f9e95c1b8a132aec.svg',
+        data.value.headImgUrl || '',
+      ].map((it) =>
+        uni
+          .getImageInfo({ src: it })
+          .then(({ path }) => path)
+          .catch(() =>
+            uni
+              .getImageInfo({
+                src: 'https://image.zhuchaohui.com/zhucaohui/6f858f282ce597abd2dd2717264b0cdde1566c4f8d5f3baa20fb7cf4c2e11a2f.png',
+              })
+              .then(({ path }) => path),
+          ),
+      ),
+    )
+    const ctx = uni.createCanvasContext('qrcode', currentInstance)
+    const { width, height } = await new Promise<any>((resolve) => {
+      uni
+        .createSelectorQuery()
+        .in(currentInstance)
+        .select('#qrcode')
+        .fields({ node: true, size: true }, (res) => {
+          resolve(res)
+        })
+        .exec()
+    })
+    const canvas = new Canvas(ctx, { width, height }, { width: 351 })
+    canvas.FillImage(bg)
+    canvas.RoundRect('#5379EC', 0, 0, 352, 607, 16)
+    canvas.Image(title, 27, 31, 297, 22.3)
+
+    canvas.Image(icon1, 28, 69, 15, 15)
+    canvas.Image(icon2, 143, 69, 13, 13)
+    canvas.Image(icon3, 248, 69, 13, 13)
+    canvas.Image(icon4, 30, 100, 12, 12)
+    canvas.Image(icon5, 141, 96, 16, 16)
+
+    canvas.FillText('国内外设计游学', '#ffffff', 10, 46, 80)
+    canvas.FillText('线上获客工具', '#ffffff', 10, 159, 80)
+    canvas.FillText('设计赋能项目', '#ffffff', 10, 262, 80)
+    canvas.FillText('丰富线下活动', '#ffffff', 10, 46, 109)
+    canvas.FillText('周边商品好礼', '#ffffff', 10, 159, 109)
+
+    // canvas.Circle('#D9D9D9', 136, 129, 41)
+
+    canvas.Image(contentBg, 17, 128, 319, 461)
+    canvas.CircleImage(avatar, 140, 133, 37)
+
+    // canvas.FillText(data.value.brokerName, '#000000D9', 18, 149, 228, 'center')
+    canvas.FillTexts(
+      [{ text: data.value?.brokerName ?? '', font: '18px PingFang_SC', color: '#000000D9' }],
+      228,
+    )
+
+    const textSegments = [
+      { text: '邀请码:', font: '14px PingFang_SC', color: 'rgba(0,0,0,0.65)' },
+      { text: data.value.inviteCode || '', font: '18px PingFang_SC', color: 'rgba(0,0,0,0.85)' },
+    ]
+    canvas.FillTexts(textSegments, 240)
+
+    // // Calculate total text width
+    // let totalWidth = 0
+    // textSegments.forEach((segment) => {
+    //   ctx.font = segment.font
+    //   totalWidth += ctx.measureText(segment.text).width
+    // })
+
+    // // Starting x position for centered text
+    // let startX = (width - totalWidth) / 2
+    // const y = 246 // Fixed vertical position
+
+    // // Draw each text segment
+    // textSegments.forEach((segment) => {
+    //   ctx.font = segment.font
+    //   ctx.fillStyle = segment.color
+
+    //   ctx.fillText(segment.text, startX, y)
+    //   startX += ctx.measureText(segment.text).width // Move x position for next segment
+    // })
+
+    ctx.draw && ctx.draw()
+  } catch (e) {
+    console.log(e)
+  }
 })
 </script>
 <template>
-  <div class="aspect-[0.58/1]">
-    <canvas class="w-full h-full" id="qrcode" canvas-id="qrcode"></canvas>
+  <!--  bg-[url(https://image.zhuchaohui.com/zhucaohui/a7694a131a9119b055cff320aa9c363ad2012e77229038a011110e64d1cf4da8.png)-->
+  <div class="flex-grow bg-[length:100%_100%] bg-[#5379ec]! ]">
+    <NavbarEvo transparent dark placeholder></NavbarEvo>
+    <div class="aspect-[0.58/1]">
+      <canvas class="w-full h-full" id="qrcode" canvas-id="qrcode"></canvas>
+    </div>
+    <div class="px-6 flex justify-between">
+      <div class="flex-1">
+        <wd-button plain custom-class="bg-[#4B6DEA]! border-white! text-white!">保存图片</wd-button>
+      </div>
+      <!--     <div> <wd-button custom-class="bg-white!"></wd-button></div>-->
+    </div>
   </div>
 </template>

+ 127 - 33
packages/merchant/src/pages/mine/components/agent-mine.vue

@@ -6,19 +6,44 @@ import {
   getYearTarget,
 } from '../../../core/libs/requests'
 import { NetImages } from '../../../core/libs/net-images'
-import store, { useUserStore } from '../../../store'
+import { useUserStore } from '../../../store'
 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 { 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 userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const { data: agent, run: setAgent } = useRequest(() =>
-  getBroker({ brokerId: userInfo.value.userId.toString() }),
+  getBroker({ brokerId: String(userInfo.value.userId) }),
 )
 const { data: yearTarget, run: setYearTarget } = useRequest(() => getYearTarget())
-const { data: designerData, run: setdesignerData } = useRequest(() => getDesignerStatistics())
+const { data: designerData, run: setDesignerData } = useRequest(() => getDesignerStatistics())
 const { data: followData, run: setFollowData } = useRequest(() => getFollowStatistics())
+const designerDataList = computed(() =>
+  designerData.value
+    ?.filter((it: any) => it.type !== 2)
+    .map((it: any, index: number) => ({
+      title: it.typeName,
+      value: it.quantity ?? 0,
+      subTitle: index === 0 ? designerData.value[1].typeName : '占比',
+      subValue:
+        index === designerData.value[1].quantity
+          ? 0
+          : `${((it.quantity / designerData.value[0].quantity) * 100).toFixed(0)}%`,
+    })),
+)
+const bgClass = [
+  'bg-gradient-to-r from-[#fef3ee] to-[#f0f4f9]',
+  'bg-gradient-to-r from-[#fef8ee] to-[#f0f4f9]',
+  'bg-gradient-to-r from-[#eef4fe] to-[#f0f4f9]',
+  'bg-gradient-to-r from-[#faf2ff] to-[#f0f4f9]',
+]
 const toSettings = () => {
   uni.navigateTo({ url: '/pages/mine/agent/settings/index' })
 }
@@ -27,7 +52,7 @@ const toInvite = () => {
 }
 onMounted(async () => {
   await setAgent()
-  await Promise.all([setYearTarget(), setdesignerData(), setFollowData()])
+  await Promise.all([setYearTarget(), setDesignerData(), setFollowData()])
 })
 </script>
 <template>
@@ -55,14 +80,14 @@ onMounted(async () => {
           width="56"
           height="56"
           custom-class="border border-solid border-white"
-          :src="agent.headImgUrl"
+          :src="agent?.headImgUrl"
         />
         <div class="mx-4 flex-1">
           <div class="text-white text-lg font-normal font-['PingFang_SC'] leading-normal">
-            {{ agent.brokerName }}
+            {{ agent?.brokerName }}
           </div>
           <div class="text-white text-xs font-normal font-['PingFang_SC'] leading-relaxed">
-            ID:{{ agent.inviteCode }}
+            ID:{{ agent?.inviteCode }}
           </div>
         </div>
         <div class="flex flex-col items-center" @click.stop="toInvite">
@@ -78,9 +103,7 @@ onMounted(async () => {
         <SectionHeading title="本年目标" size="base"></SectionHeading>
         <div class="flex flex-col gap-2.5 mt-3">
           <template v-for="(it, i) in yearTarget" :key="i">
-            <div
-              class="bg-gradient-to-r from-[#fef3ee] to-[#f0f4f9] rounded-lg flex items-center p-4 gap-6"
-            >
+            <div class="rounded-lg flex items-center p-4 gap-6" :class="bgClass[i]">
               <div>
                 <div class="w-[45px] h-[45px] rounded-full border-4 border-[#ffe2d0]">
                   <div style="width: 50px; height: 50px">
@@ -129,7 +152,7 @@ onMounted(async () => {
                   <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">差值</div>
                   <div class="text-[#ff2d2d] text-xs font-medium font-['DIN'] leading-normal">
                     <!-- 3000 -->
-                    {{ (it.target - it.thisYearComplete) / 10000 }}
+                    {{ (it.target - (it.thisYearComplete ?? 0)) / 10000 }}
                   </div>
                   <div class="text-[#ff2d2d] text-[10px] font-medium font-['DIN'] leading-normal">
@@ -141,7 +164,7 @@ onMounted(async () => {
                 <div class="flex items-center gap-1">
                   <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
                     <!-- 6000 -->
-                    {{ it.thisYearComplete / 10000 }}
+                    {{ (it.thisYearComplete ?? 0) / 10000 }}
                   </div>
                   <div class="text-black text-xs font-normal font-['PingFang_SC']">万</div>
                 </div>
@@ -149,7 +172,7 @@ onMounted(async () => {
                   <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">本月</div>
                   <div class="text-[#0FC187] text-xs font-medium font-['DIN'] leading-normal">
                     <!-- 3000 -->
-                    {{ it.thisMonthComplete / 10000 }}
+                    {{ (it.thisMonthComplete ?? 0) / 10000 }}
                   </div>
                   <div class="text-[#0FC187] text-[10px] font-medium font-['DIN'] leading-normal">
@@ -162,25 +185,32 @@ onMounted(async () => {
       </Card>
       <Card>
         <SectionHeading title="设计师数据" size="base"></SectionHeading>
-        <div class="mt-3 grid grid-cols-3 gap-2.5">
-          <template v-for="(it, i) in designerData" :key="i">
-            <div class="bg-[#f6f7ff] rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
-              <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
-                {{ it.typeName }}
-              </div>
-              <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
-                {{ it.quantity }}
-              </div>
-              <div class="flex items-center gap-1">
-                <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
-                  年新增
+        <div class="mt-3">
+          <ListHelperEvo
+            v-if="designerDataList?.length"
+            :items="designerDataList"
+            content-class="grid grid-cols-3 gap-2.5"
+          >
+            <template #default="{ item }">
+              <div class="bg-[#f6f7ff] rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
+                <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
+                  {{ item.title }}
+                </div>
+                <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
+                  {{ item.value }}
                 </div>
-                <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN Exp'] leading-normal">
-                  20
+                <div class="flex items-center gap-1">
+                  <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
+                    {{ item.subTitle }}
+                  </div>
+                  <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN_Exp'] leading-normal">
+                    {{ item.subValue }}
+                  </div>
                 </div>
               </div>
-            </div>
-          </template>
+            </template>
+          </ListHelperEvo>
+          <!--          <template v-for="(it, i) in designerData" :key="i"></template>-->
         </div>
       </Card>
       <Card>
@@ -191,21 +221,85 @@ onMounted(async () => {
               <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
                 {{ it.typeName }}
               </div>
-              <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
-                {{ it.quantity }}
+              <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
+                {{ it.quantity ?? 0 }}
               </div>
               <div class="flex items-center gap-1">
                 <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
                   年新增
                 </div>
-                <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN Exp'] leading-normal">
-                  20
+                <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN_Exp'] leading-normal">
+                  {{ it.thisYearQuantity ?? 0 }}
                 </div>
               </div>
             </div>
           </template>
         </div>
       </Card>
+      <PageHelperEvo :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">
+              <div class="bg-white rounded-2xl shadow pl-[15px] py-[15px] flex-col gap-2 flex">
+                <div class="flex items-center justify-between">
+                  <div
+                    class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed"
+                  >
+                    {{ dayjs(it.followTime).format('YYYY-MM-DD HH:mm') }}
+                  </div>
+                  <div
+                    class="text-white text-xs font-normal font-['PingFang_SC'] leading-none pa-[8px]"
+                    :class="`${{ 1: 'bg-[#2357E9]', 2: 'bg-[#f8b344]' }[it.followType]}`"
+                    style="border-top-left-radius: 15px; border-bottom-left-radius: 5px"
+                  >
+                    <div class="flex items-center gap-1">
+                      <div class="w-1 h-1 bg-white rounded-full border"></div>
+                      <!-- 线下拜访 -->
+                      {{ it.followTypeName }}
+                    </div>
+                  </div>
+                </div>
+                <div
+                  class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal mr-[15px] mt-[29px]"
+                >
+                  <!-- 和周老师在工作碰了环球项目,选了瓷砖款式,后天客户交定金,订单金额初步为
+                  304958 -->
+                  {{ it.remark }}
+                </div>
+                <div class="mt-[15px] flex gap-2.5">
+                  <template v-for="(src, index) in it?.imgUrl?.split(',')" :key="index">
+                    <wd-img
+                      custom-class="rounded-lg overflow-hidden"
+                      width="70"
+                      height="70"
+                      :src="src"
+                    />
+                  </template>
+                </div>
+                <div class="flex items-center justify-between mt-[19px]">
+                  <div
+                    class="h-[25px] px-1.5 bg-[#f4f4f4] rounded-md justify-center items-center gap-1 inline-flex"
+                  >
+                    <wd-img width="15px" height="15px" :src="locationIcon"></wd-img>
+
+                    <div
+                      class="text-black/40 text-[10px] font-normal font-['PingFang_SC'] leading-[25px]"
+                    >
+                      <!-- 一间空间设计工作室 -->
+                      {{ it?.address.address }}
+                    </div>
+                  </div>
+                  <div
+                    class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-relaxed mr-[15px]"
+                  >
+                    渠道:{{ it?.brokerName }}
+                  </div>
+                </div>
+              </div>
+            </template>
+          </div>
+        </template>
+      </PageHelperEvo>
     </div>
   </div>
 </template>

+ 40 - 30
packages/merchant/src/pages/mine/index.vue

@@ -20,31 +20,34 @@ import { desinTopBg } from '@designer-hub/assets/src/svgs'
 import NavBarEvo from '@designer-hub/app/src/components/navbar-evo.vue'
 import dayjs from 'dayjs'
 import PageHelper from '../../components/page-helper.vue'
-import { useUserStore } from '../../store'
+import { useUserStore } from '@/store'
 import AgentMine from './components/agent-mine.vue'
+import PageHelperEvo from '@/components/page-helper-evo.vue'
 
 const userStore = useUserStore()
 const { isLogined, userInfo, isMerchant, isAgent } = storeToRefs(userStore)
-const avatar = computed(() =>
-  !isEmpty(userInfo.value.avatar) ? userInfo.value.avatar : 'https://via.placeholder.com/72x72',
-)
 const { data, run: setData } = useRequest(() => getVendorAppInfo())
 const { data: orders, run: setOrders } = useRequest(() => getOrders())
 const { data: yearTarget, run: setYearTarget } = useRequest(() => getYearTarget())
 const { data: designerData, run: setdesignerData } = useRequest(() => getDesignerStatistics())
 const { data: followData, run: setFollowData } = useRequest(() => getFollowStatistics())
 const { data: agent, run: setAgent } = useRequest(() =>
-  getBroker({ brokerId: userInfo.value.userId.toString() }),
+  getBroker({ brokerId: String(userInfo.value.userId) }),
 )
-const nickNameClickHandle = async () => {
-  if (isLogined.value) return
-
-  uni.navigateTo({ url: '/pages/login/index' })
-}
 
+const status = ref<any>({
+  '0': '已报名',
+  '1': '已完成',
+  '2': '未核销',
+  '3': '已取消',
+  '4': '待交付',
+})
 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}` })
+}
 onShow(async () => {
   if (isLogined.value && isMerchant?.value) {
     await setData()
@@ -52,16 +55,11 @@ onShow(async () => {
   }
 
   if (isLogined.value && isAgent?.value) {
-    // await setData()
     await setAgent()
     await Promise.all([setYearTarget(), setdesignerData(), setFollowData()])
   }
 })
-onMounted(async () => {
-  // await run()
-  // console.log(data.value)
-  // await getTaskData()
-})
+onMounted(async () => {})
 const navBarProps = ref({ customClass: 'bg-transparent!' })
 onPageScroll(({ scrollTop }: { scrollTop: number }) => {
   console.log(scrollTop)
@@ -107,27 +105,39 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
           </div>
         </div>
         <div class="mt-[16px]">
-          <PageHelper :request="getOrders" :query="{}">
+          <PageHelperEvo :request="getOrders" :query="{}">
             <template #default="{ source }">
               <div class="flex flex-col gap-4">
-                <template v-for="(it, i) in source.list" :key="i">
+                <template v-for="(it, i) in source?.list" :key="i">
                   <Card custom-class="py-4">
-                    <div
-                      class="bg-white rounded-2xl flex flex-col"
-                      @click="router.push(`/pages/mine/merchant/orders/detail/index?id=${it.id}`)"
-                    >
-                      <div
-                        class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-normal"
-                      >
-                        完成时间:
-                        {{ dayjs(it.completeTime).format('YYYY-MM-DD hh:mm') }}
+                    <div class="bg-white rounded-2xl flex flex-col" @click="toOrder(it)">
+                      <div class="flex items-center justify-between">
+                        <div
+                          class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-normal"
+                        >
+                          支付时间:
+                          {{ dayjs(it.completeTime).format('YYYY-MM-DD hh:mm') }}
+                        </div>
+                        <div
+                          class="text-xs font-normal font-['PingFang_SC'] leading-normal"
+                          :class="
+                            ['2', '4'].includes(it.orderStatus) ? 'text-[#ff2d2d]' : 'text-black/30'
+                          "
+                        >
+                          {{ status[it.orderStatus] }}
+                        </div>
                       </div>
 
                       <div class="flex mt-[19px] items-center">
                         <div class="w-[86px] h-[86px] bg-[#f6f6f6] rounded-[10px] overflow-hidden">
-                          <wd-img width="100%" height="100%" :src="it.orderImgUrl"></wd-img>
+                          <wd-img
+                            width="86"
+                            height="86"
+                            custom-class="vertical-bottom bg-[#f6f6f6]"
+                            :src="it.orderImgUrl"
+                          ></wd-img>
                         </div>
-                        <div class="ml-[16px]">
+                        <div class="ml-[16px] flex-1">
                           <div
                             class="text-black text-base font-normal font-['PingFang_SC'] leading-normal"
                           >
@@ -150,7 +160,7 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
                 </template>
               </div>
             </template>
-          </PageHelper>
+          </PageHelperEvo>
         </div>
       </view>
     </template>

+ 4 - 1
packages/merchant/src/types/uni-pages.d.ts

@@ -25,7 +25,10 @@ interface NavigateToOptions {
        "/pages/mine/agent/settings/index" |
        "/pages/agent/designer/archives/basic-info/index" |
        "/pages/agent/designer/archives/sale-info/index" |
-       "/pages/mine/merchant/orders/detail/index";
+       "/pages/mine/merchant/orders/detail/index" |
+       "/pages/agent/designer/archives/activity/others/index" |
+       "/pages/agent/designer/archives/award/photos/index" |
+       "/pages/agent/designer/archives/sale-info/others/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}