wupengfei
2 天以前 18f571786729ff46a667760a569436593c59f899
feat: 接口对接
4个文件已添加
19个文件已修改
784 ■■■■■ 已修改文件
apps/bMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/app.config.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/constants/router.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/InnerPage.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/taskCheckedDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/taskCheckedDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.config.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/task/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/taskSubmitCheck/InnerPage.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/TaskCheckFileCard.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/task.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/task.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/auth.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/userResume.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/project.private.config.json
@@ -98,13 +98,6 @@
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/jobApplicationManage/jobApplicationDetail/jobApplicationDetail",
                    "query": "id=04c75425-e783-4dbf-0f16-08ddd626b756",
                    "launchMode": "default",
                    "scene": null
                }
            ]
        }
apps/bMiniApp/src/app.config.ts
@@ -90,6 +90,7 @@
        'publishTask/publishTask',
        'taskCheck/taskCheck',
        'taskCheckDetail/taskCheckDetail',
        'taskCheckedDetail/taskCheckedDetail',
        'taskHandleCheckDetail/taskHandleCheckDetail',
        'taskManage/taskManage',
        'batchTaskList/batchTaskList',
apps/bMiniApp/src/constants/router.ts
@@ -43,6 +43,7 @@
  publishTask = '/subpackages/task/publishTask/publishTask',
  taskCheck = '/subpackages/task/taskCheck/taskCheck',
  taskCheckDetail = '/subpackages/task/taskCheckDetail/taskCheckDetail',
  taskCheckedDetail = '/subpackages/task/taskCheckedDetail/taskCheckedDetail',
  taskHandleCheckDetail = '/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail',
  taskManage = '/subpackages/task/taskManage/taskManage',
  batchTaskList = '/subpackages/task/batchTaskList/batchTaskList',
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -1,22 +1,23 @@
<template>
  <div class="task-check-card-wrapper">
  <div class="task-check-card-wrapper" @click.stop="emit('taskChecked')">
    <TaskCheckPersonalView
      class="task-check-card-view"
      :avatarUrl="avatarUrl"
      :avatar="avatar"
      :name="name"
      :genderType="genderType"
      :isRealName="isRealName"
      :contactPhone="contactPhone"
      :gender="gender"
      :isReal="isReal"
      :contactPhoneNumber="contactPhoneNumber"
    >
      <template #actions>
        <nut-button
          v-if="checkAcceptStatus === EnumTaskCheckReceiveStatus.Wait"
          v-if="checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive"
          type="primary"
          class="task-check-card-phone-btn"
          @click.stop="emit('checkReceive')"
          >验收</nut-button
        >
        <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }">
          {{ EnumTaskCheckReceiveStatusText[checkAcceptStatus] }}
          {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }}
        </div>
      </template>
    </TaskCheckPersonalView>
@@ -37,15 +38,20 @@
});
type Props = {
  avatarUrl?: string;
  avatar?: string;
  name?: string;
  genderType?: EnumUserGender;
  isRealName?: boolean;
  contactPhone?: string;
  checkAcceptStatus?: EnumTaskCheckReceiveStatus;
  gender?: EnumUserGender;
  isReal?: boolean;
  contactPhoneNumber?: string;
  checkReceiveStatus?: EnumTaskCheckReceiveStatus;
};
const props = withDefaults(defineProps<Props>(), {});
const emit = defineEmits<{
  (e: 'checkReceive'): void;
  (e: 'taskChecked'): void;
}>();
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
@@ -1,15 +1,10 @@
<template>
  <FlexJobTopView
    :avatarUrl="avatarUrl"
    :name="name"
    :genderType="genderType"
    :isRealName="isRealName"
  >
  <FlexJobTopView :avatar="avatar" :name="name" :gender="gender" :isReal="isReal">
    <template #detail>
      <div class="task-check-card-phone-container">
        <div class="task-check-card-phone-wrapper">
          <div class="task-check-card-phone-label">手机号:</div>
          <div class="task-check-card-phone">{{ contactPhone }}</div>
          <div class="task-check-card-phone">{{ contactPhoneNumber }}</div>
        </div>
        <slot name="actions"></slot>
      </div>
@@ -26,11 +21,11 @@
});
type Props = {
  avatarUrl?: string;
  avatar?: string;
  name?: string;
  genderType?: EnumUserGender;
  isRealName?: boolean;
  contactPhone?: string;
  gender?: EnumUserGender;
  isReal?: boolean;
  contactPhoneNumber?: string;
};
const props = withDefaults(defineProps<Props>(), {});
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
@@ -37,42 +37,17 @@
import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components';
import Taro from '@tarojs/taro';
import { EnumTaskCheckReceiveStatus } from '@12333/constants';
import { useInfiniteLoading, useTaskList } from '@12333/hooks';
import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
import dayjs from 'dayjs';
import { useCheckReceiveTasks } from '@12333/hooks';
defineOptions({
  name: 'InnerPage',
});
const queryState = reactive({
  date: dayjs().toDate(),
  checkReceiveStatus: EnumTaskCheckReceiveStatus.WaitSubmit,
});
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetCheckReceiveTasksQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
      },
      date: dayjs(queryState.date).format('YYYY-MM-DD'),
      checkReceiveStatus: queryState.checkReceiveStatus,
    };
    return taskCheckReceiveServices.getCheckReceiveTasks(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskCheckReceiveServices/getCheckReceiveTasks', queryState],
  }
);
const { queryState, infiniteLoadingProps } = useCheckReceiveTasks();
function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskCheckDetail}?taskId=${item.id}`,
    url: `${RouterPath.taskCheckDetail}?id=${item.id}&date=${queryState.date}&checkReceiveStatus=${queryState.checkReceiveStatus}`,
  });
}
</script>
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -1,9 +1,9 @@
<template>
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
  <LoadingLayout>
    <ContentView>
      <MyTaskCard
        :namee="detail.name"
        :addressName="detail.addressName"
        :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.name"
        :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.addressName"
        :showMyTaskArrow="false"
        :showTime="false"
      ></MyTaskCard>
@@ -12,17 +12,17 @@
    <InfiniteLoading
      scrollViewClassName="common-infinite-scroll-list"
      v-bind="infiniteLoadingProps"
      :key="queryState.status"
    >
      <template #renderItem="{ item }">
        <TaskCheckCard
          :avatarUrl="setOSSLink(item.avatarUrl)"
          :avatar="setOSSLink(item.avatar)"
          :name="item.name"
          :genderType="item.genderType"
          :isRealName="item.isRealName"
          :contactPhone="item.contactPhone"
          :checkAcceptStatus="item.checkAcceptStatus"
          @click="goHandleTaskDetail(item)"
          :gender="item.gender"
          :isReal="item.isReal"
          :contactPhoneNumber="item.contactPhoneNumber"
          :checkReceiveStatus="item.checkReceiveStatus"
          @checkReceive="goHandleTaskDetail(item)"
          @taskChecked="goTaskCheckedDetail(item)"
        />
      </template>
    </InfiniteLoading>
@@ -31,65 +31,52 @@
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import * as taskServices from '@12333/services/apiV2/task';
import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import TaskCheckCard from '../components/TaskCheckCard.vue';
import { MyTaskCard } from '@12333/components';
import { setOSSLink } from '@12333/utils';
import dayjs from 'dayjs';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const taskId = router.params?.taskId ?? '';
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['taskServices/getTaskInfo', taskId],
  queryFn: async () => {
    return await taskServices.getTaskInfo(
      { id: taskId },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
});
const queryState = reactive({
  status: 10,
});
const id = router.params?.id ?? '';
const date = router.params?.date ?? '';
const checkReceiveStatus = Number(router.params?.checkReceiveStatus);
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskWorkerCheckListInput = {
    let params: API.GetCheckReceiveTaskQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }],
      },
      taskInfoId: id,
      date: dayjs(date).format('YYYY-MM-DD'),
      checkReceiveStatus: checkReceiveStatus,
    };
    return flexWorkerServices.getFlexTaskWorkerCheckList(params, {
    return taskCheckReceiveServices.getCheckReceiveTask(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskWorkerCheckList', queryState],
    queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'],
  }
);
function goHandleTaskDetail(item: API.GetNewestWorkerListOutput) {
function goHandleTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskHandleCheckDetail}?userId=${item.userId}&taskId=${taskId}`,
    url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}`,
  });
}
function goTaskCheckedDetail(item: API.GetCheckReceiveTaskQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskCheckedDetail}?id=${item.id}`,
  });
}
</script>
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/InnerPage.vue
New file
@@ -0,0 +1,102 @@
<template>
  <LoadingLayout>
    <ContentView>
      <MyTaskCard
        :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.taskInfo?.name"
        :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.taskInfo?.addressName"
        :showMyTaskArrow="false"
        :showTime="false"
      ></MyTaskCard>
      <ChunkTitle title="验收列表" />
      <TaskCheckCard
        :avatar="
          setOSSLink(
            infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.avatar
          )
        "
        :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.name"
        :gender="
          infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.gender
        "
        :isReal="
          infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.isReal
        "
        :contactPhoneNumber="
          infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser
            ?.contactPhoneNumber
        "
        :checkReceiveStatus="
          infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser
            ?.checkReceiveStatus
        "
      />
      <div class="taskCheckFileCard-status-title">验收照片</div>
    </ContentView>
    <InfiniteLoading
      scrollViewClassName="common-infinite-scroll-list"
      v-bind="infiniteLoadingProps"
      :key="date"
    >
      <template #renderItem="{ item }">
        <TaskCheckFileCard
          :created-time="item?.createdTime"
          :checkReceiveStatus="item?.checkReceiveStatus"
          :files="item?.files"
        />
      </template>
    </InfiniteLoading>
  </LoadingLayout>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
import { useInfiniteLoading } from '@12333/hooks';
import TaskCheckCard from '../components/TaskCheckCard.vue';
import { MyTaskCard, TaskCheckFileCard } from '@12333/components';
import { setOSSLink } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const id = router.params?.id ?? '';
const date = router.params?.date ?? '';
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetCheckReceiveTaskUserSubmitsQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
      },
      id: id,
    };
    return taskCheckReceiveServices.getCheckReceiveTaskUserSubmits(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits'],
  }
);
</script>
<style lang="scss">
@import '@/styles/common.scss';
.taskCheckedDetail-page-wrapper {
  .taskCheckFileCard-status-title {
    font-weight: 600;
    font-size: 28px;
    line-height: 32px;
    margin-bottom: 16px;
    color: boleGetCssVar('text-color', 'primary');
  }
  .task-check-card-wrapper {
    margin-bottom: 24px;
  }
}
</style>
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/taskCheckedDetail.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/task/taskCheckedDetail/taskCheckedDetail.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="taskCheckedDetail-page-wrapper" title="验收详情">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'taskCheckedDetail',
});
</script>
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
@@ -3,40 +3,31 @@
    <ContentScrollView style="background-color: #fff">
      <div class="personal-info-wrapper">
        <TaskCheckPersonalView
          :avatarUrl="setOSSLink(detail.avatarUrl)"
          :name="detail.name"
          :isRealName="detail.isRealName"
          :contactPhone="detail.contactPhone"
          :avatarUrl="setOSSLink(detail?.enterpriseEmployeeUser?.avatar)"
          :name="detail?.enterpriseEmployeeUser?.name"
          :isReal="detail?.enterpriseEmployeeUser?.isReal"
          :contactPhoneNumber="detail?.enterpriseEmployeeUser?.contactPhoneNumber"
        />
      </div>
      <div class="taskCheckDetail-status-wrapper">
        <div class="taskCheckDetail-status-title">验收照片</div>
      </div>
      <div class="taskCheckDetail-time">
        {{ dayjs(detail.appleCheckTime).format('YYYY.MM.DD HH:mm:ss') }}
      </div>
      <nut-grid
        square
        :column-num="3"
        :border="false"
        :gutter="20"
        v-if="list.length > 0"
        class="pro-img-grid"
      >
        <nut-grid-item
          v-for="(item, index) in detail.checkImageUrl"
          :key="index"
          class="pro-img-grid-item"
        >
          <div class="pro-img-grid-img-item">
            <PreviewImage :src="item" class="pro-img-grid-img" :urls="list" />
          </div>
        </nut-grid-item>
      </nut-grid>
      <div class="taskCheckFileCard-status-title">验收照片</div>
      <TaskCheckFileCard
        :created-time="detail?.createdTime"
        :files="detail?.files"
      ></TaskCheckFileCard>
    </ContentScrollView>
    <PageFooter>
      <PageFooterBtn type="primary" :color="Colors.Info" class="dark-btn">验收未通过</PageFooterBtn>
      <PageFooterBtn type="primary">验收通过</PageFooterBtn>
      <PageFooterBtn
        type="primary"
        :color="Colors.Info"
        class="dark-btn"
        @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Fail)"
        >验收未通过</PageFooterBtn
      >
      <PageFooterBtn
        type="primary"
        @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Success)"
        >验收通过</PageFooterBtn
      >
    </PageFooter>
  </LoadingLayout>
</template>
@@ -44,20 +35,21 @@
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
import TaskCheckPersonalView from '../components/TaskCheckPersonalView.vue';
import { PreviewImage } from '@12333/components';
import { Colors } from '@12333/constants';
import { setOSSLink } from '@12333/utils';
import { TaskCheckFileCard } from '@12333/components';
import { Colors, EnumTaskUserSubmitCheckReceiveStatus } from '@12333/constants';
import { Message, setOSSLink } from '@12333/utils';
import dayjs from 'dayjs';
import { goBack } from '@/utils';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const taskId = router.params?.taskId ?? '';
const userId = router.params?.userId ?? '';
const id = router.params?.id ?? '';
const date = router.params?.date ?? '';
const {
  isLoading,
@@ -65,57 +57,52 @@
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['flexWorkerServices/getOrdeForDetail', taskId],
  queryKey: ['flexWorkerServices/getOrdeForDetail', id, date],
  queryFn: async () => {
    return await flexWorkerServices.getFlexTaskWorkerCheckContentDto(
      { flexTaskId: taskId, flexWorkerId: userId },
    return await taskCheckReceiveServices.getCheckReceiveTaskUserSubmit(
      { taskInfoUserId: id, date: dayjs(date).format('YYYY-MM-DD') },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.GetTaskWorkerCheckContentOutput),
  placeholderData: () => ({} as API.GetCheckReceiveTaskUserSubmitQueryResult),
});
const list = ref([
  'https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg',
  'https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg',
  'https://storage.360buyimg.com/jdc-article/welcomenutui.jpg',
  'https://storage.360buyimg.com/jdc-article/fristfabu.jpg',
]);
async function checkReceiveTask(checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus) {
  try {
    let params: API.CheckReceiveTaskCommand = {
      id: detail.value?.id,
      checkReceiveStatus: checkReceiveStatus,
    };
    let res = await taskCheckReceiveServices.checkReceiveTask(params);
    if (res) {
      Message.success('提交成功', {
        onClosed() {
          goBack();
        },
      });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.taskHandleCheckDetail-page-wrapper {
  .personal-info-wrapper {
    padding-top: 52px;
    padding-bottom: 36px;
    border-bottom: 1px solid #d9d9d9;
    margin-bottom: 22px;
  }
  .taskCheckDetail-status-wrapper {
    display: flex;
    align-items: center;
  .taskCheckFileCard-status-title {
    font-weight: 600;
    font-size: 28px;
    line-height: 32px;
    margin-bottom: 16px;
    .taskCheckDetail-status-title {
      color: boleGetCssVar('text-color', 'primary');
      flex: 1;
      min-width: 0;
    }
    color: boleGetCssVar('text-color', 'primary');
  }
  .taskCheckDetail-time {
    font-weight: 400;
    font-size: 24px;
    color: boleGetCssVar('text-color', 'regular');
    line-height: 36px;
  .personal-info-wrapper {
    padding-top: 52px;
    padding-bottom: 36px;
    border-bottom: 1px solid #d9d9d9;
    margin-bottom: 22px;
  }
}
apps/cMiniApp/project.config.json
@@ -51,5 +51,5 @@
        "ignore": [],
        "include": []
    },
    "appid": "wxb9e0baf4f87aa0de"
    "appid": "wx88251c84f5cd886b"
}
apps/cMiniApp/src/pages/task/InnerPage.vue
@@ -46,12 +46,12 @@
const { queryState, infiniteLoadingProps } = useCheckReceiveTasks();
function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) {
  if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit) {
  if (Number(queryState.checkReceiveStatus) === EnumTaskCheckReceiveStatus.WaitSubmit) {
    Taro.navigateTo({
      url: `${RouterPath.taskSubmitCheck}?id=${item.id}`,
    });
  }
  if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed) {
  if (Number(queryState.checkReceiveStatus) === EnumTaskCheckReceiveStatus.Completed) {
    Taro.navigateTo({
      url: `${RouterPath.taskCheckDetail}?id=${item.id}`,
    });
apps/cMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -1,45 +1,16 @@
<template>
  <ContentScrollView style="background-color: transparent">
    <MyTaskCard :showMyTaskArrow="false"></MyTaskCard>
    <div class="taskCheckFileCard-status-title">验收照片</div>
    <InfiniteLoading
      scrollViewClassName="common-infinite-scroll-list task-list"
      v-bind="infiniteLoadingProps"
    >
      <template #renderItem="{ item }">
        <div class="taskCheckDetail-status-wrapper">
          <div class="taskCheckDetail-status-title">验收照片</div>
          <div
            class="taskCheckDetail-status"
            :style="{
              color: Colors.Warning,
            }"
          >
            待验收
          </div>
        </div>
        <div class="taskCheckDetail-time">2024.11.14 9:28:39</div>
        <nut-grid
          square
          :column-num="3"
          :border="false"
          :gutter="20"
          v-if="item?.files?.length > 0"
          class="taskCheckDetail-img-grid"
        >
          <nut-grid-item
            v-for="(itema, index) in item.files"
            :key="index"
            class="publish-circle-friend-file-grid-item"
          >
            <div class="taskCheckDetail-img-grid-item">
              <PreviewImage
                :src="setOSSLink(itema)"
                class="taskCheckDetail-img"
                :urls="item.files"
              />
            </div>
          </nut-grid-item>
        </nut-grid>
        <TaskCheckFileCard
          :created-time="item?.createdTime"
          :files="item?.files"
        ></TaskCheckFileCard>
      </template>
    </InfiniteLoading>
  </ContentScrollView>
@@ -50,11 +21,9 @@
</template>
<script setup lang="ts">
import { MyTaskCard, PreviewImage } from '@12333/components';
import { Colors } from '@12333/constants';
import { MyTaskCard, TaskCheckFileCard } from '@12333/components';
import Taro from '@tarojs/taro';
import { useCheckReceiveTaskUserSubmits } from '@12333/hooks';
import { setOSSLink } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
@@ -70,73 +39,12 @@
@import '@/styles/common.scss';
.taskCheckDetail-page-wrapper {
  .taskCheckDetail-status-wrapper {
    display: flex;
    align-items: center;
  .taskCheckFileCard-status-title {
    font-weight: 600;
    font-size: 28px;
    line-height: 32px;
    margin-bottom: 16px;
    .taskCheckDetail-status-title {
      color: boleGetCssVar('text-color', 'primary');
      flex: 1;
      min-width: 0;
    }
  }
  .taskCheckDetail-time {
    font-weight: 400;
    font-size: 24px;
    color: boleGetCssVar('text-color', 'regular');
    line-height: 36px;
    margin-bottom: 22px;
  }
  .taskCheckDetail-img-grid {
    padding: 0 !important;
    .publish-circle-friend-file-grid-item {
      .nut-grid-item__content--square {
        padding: 0;
        border: none;
        display: block;
        background-color: transparent;
      }
    }
    .taskCheckDetail-img-grid-item {
      width: 100%;
      height: 100%;
      box-sizing: border-box;
      position: relative;
      padding: 20px;
    }
    .taskCheckDetail-img {
      border-radius: 8px;
      width: 100% !important;
      height: 100%;
      object-fit: cover;
    }
  }
  .taskCheckDetail-tips-wrapper {
    display: flex;
    flex-direction: column;
    align-items: center;
    font-weight: 400;
    font-size: 24px;
    line-height: 32px;
    padding: 20px 0;
    .taskCheckDetail-tips-text {
      color: boleGetCssVar('text-color', 'secondary');
    }
    .taskCheckDetail-tips-btn {
      color: boleGetCssVar('color', 'primary');
    }
    color: boleGetCssVar('text-color', 'primary');
  }
}
</style>
apps/cMiniApp/src/subpackages/task/taskSubmitCheck/InnerPage.vue
@@ -24,6 +24,7 @@
import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
import Taro from '@tarojs/taro';
import { goBack } from '@/utils';
import { useQueryClient } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
@@ -31,6 +32,7 @@
const route = Taro.useRouter();
const id = route.params?.id as string;
const queryClient = useQueryClient();
const form = reactive({
  files: [] as FileItem[],
@@ -62,6 +64,7 @@
      Message.success('提交成功', {
        onClosed() {
          goBack();
          queryClient.invalidateQueries(['taskServices/getTaskInfo', id]);
        },
      });
    }
packages/components/src/Card/TaskCheckFileCard.vue
New file
@@ -0,0 +1,132 @@
<template>
  <div class="taskCheckFileCard-wrapper">
    <div class="taskCheckFileCard-status-wrapper">
      <div class="taskCheckFileCard-time">
        {{ dayjs(props.createdTime).format('YYYY-MM-DD HH:mm:ss') }}
      </div>
      <div
        class="taskCheckFileCard-status"
        :style="{
          color: Colors.Warning,
        }"
      >
        {{ EnumTaskCheckReceiveStatusText[props.checkReceiveStatus] }}
      </div>
    </div>
    <nut-grid
      square
      :column-num="3"
      :border="false"
      :gutter="20"
      v-if="props?.files?.length > 0"
      class="taskCheckFileCard-img-grid"
    >
      <nut-grid-item
        v-for="(itema, index) in props.files"
        :key="index"
        class="publish-circle-friend-file-grid-item"
      >
        <div class="taskCheckFileCard-img-grid-item">
          <PreviewImage
            :src="setOSSLink(itema)"
            class="taskCheckFileCard-img"
            :urls="props.files"
          />
        </div>
      </nut-grid-item>
    </nut-grid>
  </div>
</template>
<script setup lang="ts">
import { PreviewImage } from '@12333/components';
import {
  Colors,
  EnumTaskUserSubmitCheckReceiveStatus,
  EnumTaskCheckReceiveStatusText,
} from '@12333/constants';
import { setOSSLink } from '@12333/utils';
import dayjs from 'dayjs';
defineOptions({
  name: 'TaskCheckFileCard',
});
type Props = {
  createdTime?: string;
  checkReceiveStatus?: EnumTaskUserSubmitCheckReceiveStatus;
  files?: string[];
  showCheckReceiveStatus?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
  showCheckReceiveStatus: false,
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
.taskCheckFileCard-wrapper {
  .taskCheckFileCard-status-wrapper {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
  .taskCheckFileCard-time {
    font-weight: 400;
    font-size: 24px;
    color: boleGetCssVar('text-color', 'regular');
    line-height: 32px;
  }
  .taskCheckFileCard-img-grid {
    padding: 0 !important;
    .publish-circle-friend-file-grid-item {
      .nut-grid-item__content--square {
        padding: 0;
        border: none;
        display: block;
        background-color: transparent;
      }
      .taskCheckFileCard-img-grid-item {
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        position: relative;
        padding: 20px;
      }
    }
    .taskCheckFileCard-img {
      border-radius: 8px;
      width: 100% !important;
      height: 100%;
      object-fit: cover;
    }
  }
  .taskCheckFileCard-tips-wrapper {
    display: flex;
    flex-direction: column;
    align-items: center;
    font-weight: 400;
    font-size: 24px;
    line-height: 32px;
    padding: 20px 0;
    .taskCheckFileCard-tips-text {
      color: boleGetCssVar('text-color', 'secondary');
    }
    .taskCheckFileCard-tips-btn {
      color: boleGetCssVar('color', 'primary');
    }
  }
}
</style>
packages/components/src/index.ts
@@ -22,6 +22,7 @@
export { default as AreaTreeSelect } from './AreaTreeSelect/AreaTreeSelect.vue';
export { default as Elevator } from './Elevator/Elevator.vue';
export { default as TaskCard } from './Card/TaskCard.vue';
export { default as TaskCheckFileCard } from './Card/TaskCheckFileCard.vue';
export { default as MineAgreementSignCard } from './Card/MineAgreementSignCard.vue';
export { default as JobApplicationCard } from './Card/JobApplicationCard.vue';
export { default as MyTaskCard } from './Card/MyTaskCard.vue';
packages/constants/task.ts
@@ -51,7 +51,8 @@
};
export const EnumTaskCheckReceiveStatusText = {
  [EnumTaskCheckReceiveStatus.WaitSubmit]: '待验收',
  [EnumTaskCheckReceiveStatus.WaitSubmit]: '待提交',
  [EnumTaskCheckReceiveStatus.WaitCheckReceive]: '待验收',
  [EnumTaskCheckReceiveStatus.Completed]: '已验收',
};
packages/hooks/task.ts
@@ -169,7 +169,7 @@
      });
    },
    {
      queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits', id],
      queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits'],
    }
  );
packages/services/apiV2/auth.ts
@@ -81,6 +81,23 @@
  });
}
/** 查询企业用户登录信息 GET /api/user/auth/getEnterpriseLoginInfo */
export async function getEnterpriseLoginInfo(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetEnterpriseLoginInfoParams,
  options?: API.RequestConfig
) {
  return request<API.GetEnterpriseLoginInfoQueryResult>('/api/user/auth/getEnterpriseLoginInfo', {
    method: 'GET',
    params: {
      ...params,
      request: undefined,
      ...params['request'],
    },
    ...(options || {}),
  });
}
/** 查询个人用户登录信息 GET /api/user/auth/getPersonalLoginInfo */
export async function getPersonalLoginInfo(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
packages/services/apiV2/index.ts
@@ -10,9 +10,9 @@
import * as user from './user';
import * as userResume from './userResume';
import * as auth from './auth';
import * as taskCheckReceive from './taskCheckReceive';
import * as resource from './resource';
import * as taskUser from './taskUser';
import * as taskCheckReceive from './taskCheckReceive';
import * as menu from './menu';
export default {
  enterpriseEmployee,
@@ -23,8 +23,8 @@
  user,
  userResume,
  auth,
  taskCheckReceive,
  resource,
  taskUser,
  taskCheckReceive,
  menu,
};
packages/services/apiV2/typings.d.ts
@@ -14,8 +14,14 @@
  }
  interface APIgetCheckReceiveTaskUserSubmitParams {
    /** 提交Id */
    id?: string;
    /** 提交Id(用于B端客户端) */
    submitId?: string;
    /** 任务Id(用于C端小程序编辑提交 和日期一起传) */
    taskInfoId?: string;
    /** 任务人员Id(用于B端小程序验收 和日期一起传) */
    taskInfoUserId?: string;
    /** 日期(用于两个小程序 跟某一个Id一起传) */
    date?: string;
  }
  interface APIgetCurrentLogierMenuParams {
@@ -60,6 +66,11 @@
    id?: string;
    /** 任务Id */
    taskInfoId?: string;
  }
  interface APIgetEnterpriseLoginInfoParams {
    /** 查询企业用户登录信息 */
    request?: GetEnterpriseLoginInfoQuery;
  }
  interface APIgetEnterpriseParams {
@@ -198,6 +209,18 @@
    ids?: string[];
    /** 是否收藏 */
    isCollect?: boolean;
  }
  interface CollectUserResumeCommand {
    /** 用户Id */
    id?: string;
    /** 是否已收藏 */
    isCollected?: boolean;
  }
  interface ContactUserResumeCommand {
    /** 用户Id */
    id?: string;
  }
  interface DeleteDictionaryCategoryCommand {
@@ -639,6 +662,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseEmployeesQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetEnterpriseLoginInfoQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseLoginInfoQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -1371,6 +1412,9 @@
  interface GetCheckReceiveTaskQuery {
    /** 任务Id */
    taskInfoId?: string;
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    /** 日期(B端小程序专用) */
    date?: string;
    pageModel?: PagedListQueryPageModel;
  }
@@ -1427,6 +1471,8 @@
  interface GetCheckReceiveTasksQuery {
    /** 日期(小程序-验收管理专用) */
    date?: string;
    /** 关键字(姓名/手机/身份证号) */
    keywords?: string;
    /** 验收日期-最早时间(B端客户端-验收管理专用) */
    checkReceiveTimeBegin?: string;
    /** 验收日期-最晚时间(B端客户端-验收管理专用) */
@@ -1452,6 +1498,8 @@
    /** 服务费 */
    serviceFee?: number;
    settlementCycle?: EnumSettlementCycle;
    /** 发布时间 */
    createdTime?: string;
    /** 任务开始时间 */
    beginTime?: string;
    /** 任务结束时间 */
@@ -1504,6 +1552,8 @@
  }
  interface GetCheckReceiveTaskUserSubmitsQueryResultObjectDataEnterpriseEmployeeUser {
    /** 用户Id */
    id?: string;
    /** 头像 */
    avatar?: string;
    /** 姓名 */
@@ -1518,6 +1568,8 @@
    /** 是否实名 */
    isReal?: boolean;
    realMethod?: EnumUserRealMethod;
    /** 是否绑定银行卡 */
    isBindBankCard?: boolean;
  }
  interface GetCheckReceiveTaskUserSubmitsQueryResultObjectDataTaskInfo {
@@ -1748,6 +1800,27 @@
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 企业签约时间 */
    enterpriseSignContractTime?: string;
  }
  type GetEnterpriseLoginInfoQuery = Record<string, any>;
  interface GetEnterpriseLoginInfoQueryResult {
    /** Id */
    id?: string;
    /** 头像 */
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 企业全称 */
    enterpriseName?: string;
    /** 角色 */
    roles?: string[];
    /** 是否实名 */
    isReal?: boolean;
    /** 我的收藏 */
    collectUsers?: number;
    /** 联系记录 */
    contactRecords?: number;
  }
  interface GetEnterpriseQueryResult {
@@ -2226,6 +2299,8 @@
    applyCount?: number;
    /** 任务名称 */
    name?: string;
    /** 任务单号 */
    code?: string;
    billingMethod?: EnumBillingMethod;
    /** 服务费 */
    serviceFee?: number;
@@ -2374,7 +2449,7 @@
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    settlementStatus?: EnumTaskSettlementStatus;
    recommendStatus?: EnumTaskRecommendStatus;
    /** 创建时间 */
    /** 发布时间 */
    createdTime?: string;
  }
packages/services/apiV2/userResume.ts
@@ -2,6 +2,36 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 收藏灵工 POST /api/user/userResume/collectUserResume */
export async function collectUserResume(
  body: API.CollectUserResumeCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/userResume/collectUserResume', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 联系灵工 POST /api/user/userResume/contactUserResume */
export async function contactUserResume(
  body: API.ContactUserResumeCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/userResume/contactUserResume', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 删除用户简历-资格证书 DELETE /api/user/userResume/deleteUserResumeCredential */
export async function deleteUserResumeCredential(
  body: API.DeleteUserResumeCredentialCommand,