From 7ab49073679e738a11c33d0b094fe7308e83fd51 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 17 二月 2025 10:50:05 +0800
Subject: [PATCH] feat: 签约

---
 apps/bMiniApp/src/app.config.ts                                               |    6 +
 packages/components/src/index.ts                                              |    1 
 apps/bMiniApp/src/constants/router.ts                                         |    1 
 apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue       |    8 +
 apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.vue       |   17 ++++
 packages/components/src/Card/SignCard.vue                                     |   75 ++++++++++++++++++
 apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.config.ts |    3 
 apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue         |   97 ++++++++++++++++++++++++
 apps/bMiniApp/project.private.config.json                                     |    2 
 9 files changed, 206 insertions(+), 4 deletions(-)

diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index ccb2035..d0bebf8 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/apps/bMiniApp/project.private.config.json
@@ -80,7 +80,7 @@
                 },
                 {
                     "name": "",
-                    "pathName": "subpackages/flexJobManage/flexJobManage/flexJobManage",
+                    "pathName": "subpackages/flexJobManage/flexJobSign/flexJobSign",
                     "query": "",
                     "launchMode": "default",
                     "scene": null
diff --git a/apps/bMiniApp/src/app.config.ts b/apps/bMiniApp/src/app.config.ts
index 54ee05b..65805de 100644
--- a/apps/bMiniApp/src/app.config.ts
+++ b/apps/bMiniApp/src/app.config.ts
@@ -102,7 +102,11 @@
     },
     {
       root: 'subpackages/flexJobManage',
-      pages: ['flexJobManage/flexJobManage', 'flexJobDetailFromManage/flexJobDetailFromManage'],
+      pages: [
+        'flexJobManage/flexJobManage',
+        'flexJobDetailFromManage/flexJobDetailFromManage',
+        'flexJobSign/flexJobSign',
+      ],
     },
   ],
   // preloadRule: {
diff --git a/apps/bMiniApp/src/constants/router.ts b/apps/bMiniApp/src/constants/router.ts
index 1d664e3..51db33e 100644
--- a/apps/bMiniApp/src/constants/router.ts
+++ b/apps/bMiniApp/src/constants/router.ts
@@ -15,6 +15,7 @@
 
   flexJobManage = '/subpackages/flexJobManage/flexJobManage/flexJobManage',
   flexJobDetailFromManage = '/subpackages/flexJobManage/flexJobDetailFromManage/flexJobDetailFromManage',
+  flexJobSign = '/subpackages/flexJobManage/flexJobSign/flexJobSign',
 
   // userInfo = '/subpackages/setting/userInfo/userInfo',
   // setting = '/subpackages/setting/setting/setting',
diff --git a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
index 34e4490..6bc6b6b 100644
--- a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -29,7 +29,7 @@
             >
             <nut-button type="primary" @click.stop="checkContract">鏌ョ湅鍚堢害</nut-button>
           </template>
-          <nut-button v-else type="primary" @click.stop="goSignContract">绛剧害</nut-button>
+          <nut-button v-else type="primary" @click.stop="goSignContract(item)">绛剧害</nut-button>
         </template>
       </FlexJobCard>
     </template>
@@ -80,7 +80,11 @@
 
 function checkContract() {}
 function handleUnContract() {}
-function goSignContract() {}
+function goSignContract(item: API.FrontOrderList) {
+  Taro.navigateTo({
+    url: `${RouterPath.flexJobSign}`,
+  });
+}
 </script>
 
 <style lang="scss">
diff --git a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue
new file mode 100644
index 0000000..a61173f
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue
@@ -0,0 +1,97 @@
+<template>
+  <ContentScrollView style="background-color: transparent">
+    <div class="flexJobSign-page-wrapper">
+      <div class="searchbar-container">
+        <BlSearchbar
+          v-model.trim="searchValue"
+          placeholder="鎼滅储鍚堝悓鍚�/缂栧彿"
+          @search="handleSearch"
+          @change="handleSearch"
+        ></BlSearchbar>
+        <ChunkTitle title="鍚堝悓鍒楄〃" />
+      </div>
+
+      <InfiniteLoading
+        scrollViewClassName="common-infinite-scroll-list home-list"
+        v-bind="infiniteLoadingProps"
+      >
+        <template #renderItem="{ item }">
+          <SignCard
+            @click="handleCheck(item)"
+            v-model:checked-id="checkedId"
+            :id="item.id"
+          ></SignCard>
+        </template>
+      </InfiniteLoading>
+    </div>
+  </ContentScrollView>
+
+  <PageFooter>
+    <PageFooterBtn type="primary">閭�璇风绾�</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { useInfiniteLoading } from '@12333/hooks';
+import { OrderInputType } from '@12333/constants';
+import * as orderServices from '@12333/services/api/Order';
+import _ from 'lodash';
+import { trim } from '@12333/utils';
+import { SignCard } from '@12333/components';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const searchValue = ref('');
+const queryState = reactive({
+  searchValueTrim: '',
+});
+
+const checkedId = ref('');
+
+const handleSearch = _.debounce(function () {
+  queryState.searchValueTrim = trim(searchValue.value);
+}, 300);
+
+const { infiniteLoadingProps } = useInfiniteLoading(
+  ({ pageParam }) => {
+    let params: API.FrontOrderListInput = {
+      pageModel: {
+        rows: 20,
+        page: pageParam,
+        orderInput: [{ property: 'isRecommend', order: OrderInputType.Desc }],
+      },
+    };
+
+    return orderServices.getFrontOrderList(params, {
+      showLoading: false,
+    });
+  },
+  {
+    queryKey: ['orderServices/getFrontOrderList'],
+  }
+);
+
+function handleCheck(item: API.OrderInfoDto) {
+  checkedId.value = item.id;
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.flexJobSign-page-wrapper {
+  .searchbar-container {
+    padding: 30px;
+  }
+
+  .chunk-title-wrapper {
+    padding: 30px 0 0;
+  }
+
+  .home-list {
+    background-color: #ffffff;
+  }
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.config.ts b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.vue b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.vue
new file mode 100644
index 0000000..20644f2
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/flexJobSign.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayoutWithBg class="flexJobSign-page-wrapper" :title="'绛剧害'" :need-auth="false">
+    <InnerPage></InnerPage>
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'flexJobSign',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/packages/components/src/Card/SignCard.vue b/packages/components/src/Card/SignCard.vue
new file mode 100644
index 0000000..a0e38fb
--- /dev/null
+++ b/packages/components/src/Card/SignCard.vue
@@ -0,0 +1,75 @@
+<template>
+  <div class="sign-card-wrapper">
+    <div class="sign-card-title">{{ '鍚堝悓缂栧彿锛�0293848340' }}</div>
+    <div class="sign-card-content">
+      <div class="sign-card-content-name">{{ 'xxxx鍔冲姟鍏徃鍚堝悓' }}</div>
+      <div class="sign-card-content-icon">
+        <IconFont v-if="selected" name="check-checked" color="#3A71FF" size="16"></IconFont>
+        <IconFont v-else name="check-normal" size="16"></IconFont>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { IconFont } from '@nutui/icons-vue-taro';
+import { computed } from 'vue';
+
+defineOptions({
+  name: 'SignCard',
+});
+
+type Props = {
+  checkedId?: string;
+  id: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const emit = defineEmits<{
+  (e: 'update:checkedId', value: string): void;
+}>();
+
+const innerCheckedId = computed({
+  get() {
+    return props.checkedId;
+  },
+  set(val) {
+    emit('update:checkedId', val);
+  },
+});
+
+const selected = computed(() => innerCheckedId.value === props.id);
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.sign-card-wrapper {
+  padding: 24px 24px 20px 10px;
+  border-bottom: 2px solid #f6f6f6;
+
+  .sign-card-title {
+    font-size: 20px;
+    color: boleGetCssVar('text-color', 'secondary');
+    margin-bottom: 14px;
+  }
+
+  .sign-card-content {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+
+    .sign-card-content-name {
+      font-size: 24px;
+      line-height: 32px;
+      color: boleGetCssVar('text-color', 'primary');
+    }
+
+    .sign-card-content-icon {
+      width: 32px;
+      height: 32px;
+    }
+  }
+}
+</style>
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index 2e4af05..eff99ae 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -23,6 +23,7 @@
 export { default as MineAgreementSignCard } from './Card/MineAgreementSignCard.vue';
 export { default as JobApplicationCard } from './Card/JobApplicationCard.vue';
 export { default as MyTaskCard } from './Card/MyTaskCard.vue';
+export { default as SignCard } from './Card/SignCard.vue';
 export { default as FlexJobCard } from './Card/FlexJobCard.vue';
 export { default as TaskPrice } from './Card/TaskPrice.vue';
 export { default as TaskDetailWelfareItem } from './Card/TaskDetailWelfareItem.vue';

--
Gitblit v1.9.1