| | |
| | | ], |
| | | }, |
| | | { |
| | | root: 'subpackages/payrollManage', |
| | | pages: ['payrollManage/payrollManage', 'payrollManageDetail/payrollManageDetail'], |
| | | }, |
| | | { |
| | | root: 'subpackages/extraPage', |
| | | pages: ['extraPage/extraPage'], |
| | | }, |
| | |
| | | // cooperation = '/subpackages/setting/cooperation/cooperation', |
| | | // faq = '/subpackages/setting/faq/faq', |
| | | |
| | | payrollManage = '/subpackages/payrollManage/payrollManage/payrollManage', |
| | | payrollManageDetail = '/subpackages/payrollManage/payrollManageDetail/payrollManageDetail', |
| | | |
| | | authenticationHome = '/subpackages/authentication/authenticationHome/authenticationHome', |
| | | authenticationResult = '/subpackages/authentication/authenticationResult/authenticationResult', |
| | | authenticationFaRen = '/subpackages/authentication/authenticationFaRen/authenticationFaRen', |
| | |
| | | /> |
| | | </div> |
| | | </CellChunk> |
| | | <CellChunk title="发薪"> |
| | | <div class="workbenches-cell-list"> |
| | | <TaskDetailWelfareItem |
| | | :icon="IconPayrollManage" |
| | | text="发薪管理" |
| | | @click="goPage(RouterPath.payrollManage)" |
| | | /> |
| | | </div> |
| | | </CellChunk> |
| | | </Cell> |
| | | </ContentView> |
| | | </template> |
| | |
| | | import IconPersonManage from '@/assets/workbenches/icon-person-manage.png'; |
| | | import IconPublishTask from '@/assets/workbenches/icon-publish-task.png'; |
| | | import IconTaskManage from '@/assets/workbenches/icon-task-manage.png'; |
| | | import IconPayrollManage from '@/assets/workbenches/icon-payroll.png'; |
| | | import { useAccessLogin } from '@/hooks'; |
| | | |
| | | defineOptions({ |
New file |
| | |
| | | <template> |
| | | <div class="payroll-manage-detail-card-wrapper"> |
| | | <FlexJobTopView :avatar="avatar" :name="name" :gender="gender" :isReal="isReal"> |
| | | <template #detail> |
| | | <div class="payroll-manage-detail-card-container"> |
| | | <div class="payroll-manage-detail-card-item"> |
| | | <div class="payroll-manage-detail-card-item-label">工时:</div> |
| | | <div class="payroll-manage-detail-card-item-text">{{ contactPhoneNumber }}</div> |
| | | </div> |
| | | <div class="payroll-manage-detail-card-item"> |
| | | <div class="payroll-manage-detail-card-item-label">结算金额:</div> |
| | | <div class="payroll-manage-detail-card-item-text">{{ contactPhoneNumber }}</div> |
| | | </div> |
| | | <slot name="actions"></slot> |
| | | </div> |
| | | </template> |
| | | </FlexJobTopView> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { FlexJobTopView } from '@12333/components'; |
| | | import { EnumUserGender } from '@12333/constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'PayrollManageDetailCard', |
| | | }); |
| | | |
| | | type Props = { |
| | | avatar?: string; |
| | | name?: string; |
| | | gender?: EnumUserGender; |
| | | isReal?: boolean; |
| | | contactPhoneNumber?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .payroll-manage-detail-card-wrapper { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 40px; |
| | | padding-right: 26px; |
| | | margin-bottom: 24px; |
| | | |
| | | .payroll-manage-detail-card-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | margin-top: 14px; |
| | | |
| | | .payroll-manage-detail-card-item { |
| | | display: flex; |
| | | align-items: center; |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | line-height: 32px; |
| | | flex: 1; |
| | | min-width: 0; |
| | | |
| | | .payroll-manage-detail-card-item-label { |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | } |
| | | |
| | | .payroll-manage-detail-card-item-text { |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <ProTabs |
| | | v-model="queryMenuState.status" |
| | | name="task-tab" |
| | | :showPaneContent="false" |
| | | class="task-tabs" |
| | | isTransparent |
| | | title-gutter="8" |
| | | title-scroll |
| | | > |
| | | <ProTabPane :title="`待审核(${waitAssignCount})`" :pane-key="EnumTaskStatus.Wait"></ProTabPane> |
| | | <ProTabPane |
| | | :title="`已审核(${completedAssignCount})`" |
| | | :pane-key="EnumTaskStatus.Complete" |
| | | ></ProTabPane> |
| | | <ProTabPane |
| | | :title="`已发放(${completedAssignCount})`" |
| | | :pane-key="EnumTaskStatus.Complete" |
| | | ></ProTabPane> |
| | | </ProTabs> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="queryMenuState.status" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <IncomeDetailListItem |
| | | :title="item.name" |
| | | :funds="100" |
| | | :item="dayjs(item.createdTime).format('YYYY-MM-DD HH:mm:ss')" |
| | | :value="`钱包余额:${toThousand(item.serviceFee)}`" |
| | | @click="goPayrollManageDetail(item)" |
| | | > |
| | | </IncomeDetailListItem> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ProTabs, ProTabPane, IncomeDetailListItem } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | import dayjs from 'dayjs'; |
| | | import { toThousand } from '@12333/utils'; |
| | | import { EnumTaskStatus } from '@12333/constants'; |
| | | import { useTaskList } from '@12333/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const { queryMenuState, infiniteLoadingProps } = useTaskList({ |
| | | defaultQueryMenuState: { |
| | | status: EnumTaskStatus.Wait, |
| | | }, |
| | | }); |
| | | |
| | | const completedAssignCount = computed(() => { |
| | | return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.completedAssignCount ?? 0; |
| | | }); |
| | | const waitAssignCount = computed(() => { |
| | | return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.waitAssignCount ?? 0; |
| | | }); |
| | | |
| | | function goPayrollManageDetail(item: API.GetTaskInfosQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.payrollManageDetail}?id=${ |
| | | item.id |
| | | }&date=${'Fri Oct 17 2025 18:49:01 GMT+0800'}`, |
| | | }); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskManage-page-wrapper { |
| | | .dark-btn { |
| | | margin-left: 12px; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="payrollManage-page-wrapper" title="发薪管理"> |
| | | <InnerPage /> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'payrollManage', |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <LoadingLayout> |
| | | <ContentView> |
| | | <div class="payroll-manage-detail-top"> |
| | | <div class="payroll-manage-detail-top-title"></div> |
| | | <div class="payroll-manage-detail-top-content"> |
| | | <div class="payroll-manage-detail-top-content-item"></div> |
| | | </div> |
| | | </div> |
| | | <ChunkTitle title="人员列表" /> |
| | | </ContentView> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <PayrollManageDetailCard |
| | | :avatar="setOSSLink(item.avatar)" |
| | | :name="item.name" |
| | | :gender="item.gender" |
| | | :isReal="item.isReal" |
| | | :contactPhoneNumber="item.contactPhoneNumber" |
| | | :checkReceiveStatus="item.checkReceiveStatus" |
| | | /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import Taro from '@tarojs/taro'; |
| | | import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; |
| | | import { useCheckReceiveTaskUserSubmits, useInfiniteLoading } from '@12333/hooks'; |
| | | import PayrollManageDetailCard from '../components/PayrollManageDetailCard.vue'; |
| | | import { EnumTaskCheckReceiveStatus } from '@12333/constants'; |
| | | import { setOSSLink } from '@12333/utils'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const id = router.params?.id ?? ''; |
| | | const date = router.params?.date ?? ''; |
| | | const checkReceiveStatus = Number(router.params?.checkReceiveStatus); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.GetCheckReceiveTaskQuery = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | }, |
| | | taskInfoId: id, |
| | | date: dayjs(date).format('YYYY-MM-DD'), |
| | | checkReceiveStatus: 30, |
| | | }; |
| | | |
| | | return taskCheckReceiveServices.getCheckReceiveTask(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'], |
| | | } |
| | | ); |
| | | </script> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="payrollManageDetail-page-wrapper" title="发薪详情"> |
| | | <InnerPage /> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'payrollManageDetail', |
| | | }); |
| | | </script> |
| | |
| | | "description": "", |
| | | "setting": { |
| | | "urlCheck": false, |
| | | "es6": false, |
| | | "enhance": false, |
| | | "es6": true, |
| | | "enhance": true, |
| | | "postcss": false, |
| | | "preloadBackgroundData": false, |
| | | "minified": false, |
| | |
| | | { |
| | | "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", |
| | | "projectname": "cMiniApp", |
| | | "setting": { |
| | | "compileHotReLoad": true, |
| | | "bigPackageSizeSupport": true, |
| | | "urlCheck": false, |
| | | "coverView": true, |
| | | "lazyloadPlaceholderEnable": false, |
| | | "skylineRenderEnable": false, |
| | | "preloadBackgroundData": false, |
| | | "autoAudits": false, |
| | | "useApiHook": true, |
| | | "useApiHostProcess": true, |
| | | "showShadowRootInWxmlPanel": true, |
| | | "useStaticServer": false, |
| | | "useLanDebug": false, |
| | | "showES6CompileOption": false, |
| | | "checkInvalidKey": true, |
| | | "ignoreDevUnusedFiles": true, |
| | | "useIsolateContext": true |
| | | }, |
| | | "condition": {}, |
| | | "libVersion": "3.10.0" |
| | | "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", |
| | | "projectname": "cMiniApp", |
| | | "setting": { |
| | | "compileHotReLoad": true, |
| | | "bigPackageSizeSupport": true, |
| | | "urlCheck": false, |
| | | "coverView": true, |
| | | "lazyloadPlaceholderEnable": false, |
| | | "preloadBackgroundData": false, |
| | | "autoAudits": false, |
| | | "useApiHook": true, |
| | | "useApiHostProcess": true, |
| | | "showShadowRootInWxmlPanel": true, |
| | | "useStaticServer": false, |
| | | "useLanDebug": false, |
| | | "showES6CompileOption": false, |
| | | "checkInvalidKey": true, |
| | | "ignoreDevUnusedFiles": true, |
| | | "useIsolateContext": true |
| | | }, |
| | | "condition": {}, |
| | | "libVersion": "3.10.0" |
| | | } |