| | |
| | | ></ProTabPane> |
| | | </ProTabs> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | scrollViewClassName="common-infinite-scroll-list payroll-manage-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="queryState.paymentStatus" |
| | | > |
| | |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .payrollManage-page-wrapper { |
| | | .payroll-manage-list { |
| | | .income-detail-list-item-inner { |
| | | display: flex; |
| | | flex-direction: column; |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 40px; |
| | | margin-bottom: 24px; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | mineWallet = '/subpackages/wallet/mineWallet/mineWallet', |
| | | unboundBankCard = '/subpackages/wallet/unboundBankCard/unboundBankCard', |
| | | unboundAlipay = '/subpackages/wallet/unboundBankCard/unboundAlipay', |
| | | unboundAlipay = '/subpackages/wallet/unboundAlipay/unboundAlipay', |
| | | bindBankCard = '/subpackages/wallet/bindBankCard/bindBankCard', |
| | | incomeDetail = '/subpackages/wallet/incomeDetail/incomeDetail', |
| | | incomeDetailInfo = '/subpackages/wallet/incomeDetailInfo/incomeDetailInfo', |
| | |
| | | return userDetail.value?.bankCardAAccesses?.includes(EnumUserBankCardAccess.Bank); |
| | | }); |
| | | |
| | | const isBindAlipay = computed(() => { |
| | | return userDetail.value?.bankCardAAccesses?.includes(EnumUserBankCardAccess.AliPay); |
| | | }); |
| | | |
| | | const isBindWechat = computed(() => { |
| | | return userDetail.value?.bankCardAAccesses?.includes(EnumUserBankCardAccess.WeChatPay); |
| | | }); |
| | | |
| | | return { |
| | | user: userInfo, |
| | | userDetail: userDetail, |
| | |
| | | locationCity, |
| | | userId, |
| | | isBindBank, |
| | | isBindAlipay, |
| | | isBindWechat, |
| | | }; |
| | | } |
| | | |
| | |
| | | </div> |
| | | </div> |
| | | <div class="mine-balance-content-item"> |
| | | <div class="mine-balance-content-item-title">可提现</div> |
| | | <div class="mine-balance-content-item-title">已发放</div> |
| | | <div class="mine-balance-content-item-money withdraw"> |
| | | ¥{{ toThousand(userDetail?.balance ?? 0) }} |
| | | </div> |
| | |
| | | </div> |
| | | </template> |
| | | </ListItem> |
| | | <ListItem title="支付宝" @click="goBankAlipay"> |
| | | <template #extra> |
| | | <div class="bind-bank-card"> |
| | | {{ isBindAlipay ? '已绑定' : '未绑定、立即绑定' }} |
| | | </div> |
| | | </template> |
| | | </ListItem> |
| | | <ListItem title="微信"> |
| | | <template #extra> |
| | | <div class="bind-bank-card"> |
| | | {{ '已绑定' }} |
| | | </div> |
| | | </template> |
| | | </ListItem> |
| | | </List> |
| | | </template> |
| | | |
| | |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const { userDetail, isBindBank } = useUser(); |
| | | const { userDetail, isBindBank, isBindAlipay, isBindWechat } = useUser(); |
| | | |
| | | function goIncomeDetail() { |
| | | Taro.navigateTo({ |
| | |
| | | }, |
| | | { message: '完成实名认证后才可进行银行卡绑定' } |
| | | ); |
| | | |
| | | const goBankAlipay = useAccessReal( |
| | | () => { |
| | | Taro.navigateTo({ |
| | | url: `${isBindAlipay.value ? RouterPath.bindBankCard : RouterPath.unboundAlipay}`, |
| | | }); |
| | | }, |
| | | { message: '完成实名认证后才可进行支付宝绑定' } |
| | | ); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; |
| | | import { ProFormCaptcha } from 'senin-mini/components'; |
| | | import { FormValidator, Message } from '@12333/utils'; |
| | | import { Message } from '@12333/utils'; |
| | | import * as userServices from '@12333/services/apiV2/user'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { useQueryClient } from '@tanstack/vue-query'; |
| | | import { EnumUserBankCardAccess } from '@12333/constants'; |
| | | |
| | | const { userDetail } = useUser(); |
| | |
| | | |
| | | const form = reactive({ |
| | | name: userDetail.value?.name ?? '', |
| | | identity: userDetail.value?.identity ?? '', |
| | | phoneNumber: '', |
| | | code: '', |
| | | bank: '', |
| | | bankBranch: '', |
| | | verifyCode: '', |
| | | }); |
| | | |
| | | const rules = reactive<FormRules>({ |
| | | code: [ |
| | | { required: true, message: '请输入银行卡号' }, |
| | | { message: '请输入正确的银行卡号', validator: FormValidator.validatorBankCard }, |
| | | ], |
| | | bank: [{ required: true, message: '请输入开户行' }], |
| | | phoneNumber: [ |
| | | { required: true, message: '请填写手机号码' }, |
| | | { message: '请输入正确的手机号码', validator: FormValidator.validatorPhoneNumber }, |
| | | ], |
| | | verifyCode: [{ required: true, message: '请输入验证码' }], |
| | | code: [{ required: true, message: '请输入支付宝账号' }], |
| | | }); |
| | | |
| | | async function onGetCaptcha(phoneNumber: string) { |
| | | await userServices.sendSavePersonalUserBankCardVerifyCode( |
| | | { |
| | | phoneNumber: form.phoneNumber, |
| | | }, |
| | | { showLoading: false } |
| | | ); |
| | | } |
| | | |
| | | const formRef = ref<any>(null); |
| | | function handleConfirm() { |
| | |
| | | try { |
| | | let params: API.SavePersonalUserBankCardCommand = { |
| | | code: form.code, |
| | | bank: form.bank, |
| | | phoneNumber: form.phoneNumber, |
| | | verifyCode: form.verifyCode, |
| | | access: EnumUserBankCardAccess.Bank, |
| | | access: EnumUserBankCardAccess.AliPay, |
| | | }; |
| | | let res = await userServices.savePersonalUserBankCard(params); |
| | | if (res) { |
| | |
| | | padding: 0 boleGetCssVar('size', 'body-padding-h'); |
| | | |
| | | .income-detail-list-item-inner { |
| | | padding: 24px 0 18px; |
| | | border-bottom: 1px solid #f6f6f6; |
| | | display: flex; |
| | | flex-direction: column; |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 40px; |
| | | margin-bottom: 24px; |
| | | |
| | | &.border-none { |
| | | border-bottom: none; |
| | |
| | | // @ts-ignore |
| | | import { request } from '@/utils/request'; |
| | | |
| | | /** 企业批量签约合同 POST /api/user/enterpriseEmployee/batchEnterpriseSignContract */ |
| | | export async function batchEnterpriseSignContract( |
| | | body: API.BatchEnterpriseSignContractCommand, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<API.BatchEnterpriseSignContractCommandResult>( |
| | | '/api/user/enterpriseEmployee/batchEnterpriseSignContract', |
| | | { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json-patch+json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | } |
| | | ); |
| | | } |
| | | |
| | | /** 编辑灵工信息 POST /api/user/enterpriseEmployee/editEnterpriseEmployee */ |
| | | export async function editEnterpriseEmployee( |
| | | body: API.EditEnterpriseEmployeeCommand, |
| | |
| | | address?: string; |
| | | } |
| | | |
| | | interface BatchEnterpriseSignContractCommand { |
| | | /** 灵工Id */ |
| | | ids?: string[]; |
| | | } |
| | | |
| | | interface BatchEnterpriseSignContractCommandResult { |
| | | /** 签约成功灵工Id */ |
| | | successIds?: string[]; |
| | | /** 签约失败的灵工信息 */ |
| | | errors?: BatchEnterpriseSignContractCommandResultError[]; |
| | | } |
| | | |
| | | interface BatchEnterpriseSignContractCommandResultError { |
| | | /** 姓名 */ |
| | | name?: string; |
| | | /** 手机号 */ |
| | | contactPhoneNumber?: string; |
| | | /** 身份证号 */ |
| | | identity?: string; |
| | | /** 错误消息 */ |
| | | errorMessages?: string; |
| | | } |
| | | |
| | | interface BindWxmpUserInfoCommand { |
| | | /** 访问令牌 */ |
| | | accessToken: string; |
| | |
| | | interface ExportTaskSettlementOrderRostersCommand { |
| | | /** 结算订单Id */ |
| | | id?: string; |
| | | } |
| | | |
| | | interface FriendlyResultBatchEnterpriseSignContractCommandResult { |
| | | /** 跟踪Id */ |
| | | traceId?: string; |
| | | /** 状态码 */ |
| | | code?: number; |
| | | /** 错误码 */ |
| | | errorCode?: string; |
| | | data?: BatchEnterpriseSignContractCommandResult; |
| | | /** 执行成功 */ |
| | | success?: boolean; |
| | | /** 错误信息 */ |
| | | msg?: any; |
| | | /** 附加数据 */ |
| | | extras?: any; |
| | | /** 时间戳 */ |
| | | timestamp?: number; |
| | | } |
| | | |
| | | interface FriendlyResultBoolean { |
| | |
| | | bindProperty?: string; |
| | | /** 是否必填 */ |
| | | required?: boolean; |
| | | /** 坐标X */ |
| | | x?: number; |
| | | /** 坐标Y */ |
| | | y?: number; |
| | | /** 页码 */ |
| | | page?: number; |
| | | } |
| | | |
| | | type GetCurrentLogierMenusQuery = Record<string, any>; |
| | |
| | | bindProperty?: string; |
| | | /** 是否必填 */ |
| | | required?: boolean; |
| | | /** 坐标X */ |
| | | x?: number; |
| | | /** 坐标Y */ |
| | | y?: number; |
| | | /** 页码 */ |
| | | page?: number; |
| | | } |
| | | |
| | | interface SaveDictionaryCategoryCommand { |