Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
| | |
| | | "description": "", |
| | | "setting": { |
| | | "urlCheck": false, |
| | | "es6": false, |
| | | "enhance": false, |
| | | "es6": true, |
| | | "enhance": true, |
| | | "postcss": false, |
| | | "preloadBackgroundData": false, |
| | | "minified": false, |
| | |
| | | }, |
| | | { |
| | | root: 'subpackages/payrollManage', |
| | | pages: ['payrollManage/payrollManage', 'payrollManageDetail/payrollManageDetail'], |
| | | pages: [ |
| | | 'payrollManage/payrollManage', |
| | | 'payrollManageDetail/payrollManageDetail', |
| | | 'payrollChange/payrollChange', |
| | | ], |
| | | }, |
| | | { |
| | | root: 'subpackages/extraPage', |
| | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .page-footer-btn { |
| | | .page-footer-btn.h5-button { |
| | | flex: 1; |
| | | min-width: 0; |
| | | height: 88px; |
| | |
| | | |
| | | payrollManage = '/subpackages/payrollManage/payrollManage/payrollManage', |
| | | payrollManageDetail = '/subpackages/payrollManage/payrollManageDetail/payrollManageDetail', |
| | | payrollChange = '/subpackages/payrollManage/payrollChange/payrollChange', |
| | | |
| | | authenticationHome = '/subpackages/authentication/authenticationHome/authenticationHome', |
| | | authenticationResult = '/subpackages/authentication/authenticationResult/authenticationResult', |
| | |
| | | {{ `¥${toThousand(settlementAmount)}` }} |
| | | </div> |
| | | </div> |
| | | <slot name="actions"></slot> |
| | | </div> |
| | | </template> |
| | | </FlexJobTopView> |
| | | <slot name="actions"></slot> |
| | | </div> |
| | | </template> |
| | | |
| New file |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false"> |
| | | <nut-form :model-value="form" ref="formRef" :rules="rules"> |
| | | <nut-form-item label="服务费:" class="bole-form-item" prop="serviceFee" label-width="90px"> |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.serviceFee" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请输入服务费" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | /> |
| | | <div class="form-input-unit">元</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item label="超时:" class="bole-form-item" prop="serviceFee" label-width="90px"> |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.serviceFee" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请输入超时时长" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | /> |
| | | <div class="form-input-unit">小时</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item label="超时费用:" class="bole-form-item" prop="serviceFee" label-width="90px"> |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.serviceFee" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请输入超时费用" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | /> |
| | | <div class="form-input-unit">元</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item label="其他费用:" class="bole-form-item" prop="serviceFee" label-width="90px"> |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.serviceFee" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请输入其他费用" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | /> |
| | | <div class="form-input-unit">元</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item label="开户行:" class="bole-form-item" prop="bank" label-width="90px"> |
| | | {{ `结算费用${0}元` }} |
| | | </nut-form-item> |
| | | <nut-form-item label="备注:" class="bole-form-item" prop="remark" label-width="90px"> |
| | | <nut-textarea v-model="form.remark" rows="4" placeholder="请输入备注"> </nut-textarea> |
| | | </nut-form-item> |
| | | </nut-form> |
| | | </ContentScrollView> |
| | | <PageFooter> |
| | | <PageFooterBtn type="primary" @click="handleConfirm">确认修改</PageFooterBtn> |
| | | </PageFooter> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; |
| | | import { NumberInput } from '@12333/components'; |
| | | import { FormValidator, Message } from '@12333/utils'; |
| | | import * as userServices from '@12333/services/apiV2/user'; |
| | | import { EnumUserBankCardAccess } from '@12333/constants'; |
| | | import { goBack } from '@/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | const { userDetail, updateUserInfo } = useUser(); |
| | | |
| | | const form = reactive({ |
| | | serviceFee: '' as any as number, |
| | | remark: '', |
| | | }); |
| | | |
| | | 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: '请输入验证码' }], |
| | | }); |
| | | |
| | | const formRef = ref<any>(null); |
| | | function handleConfirm() { |
| | | if (!formRef.value) return; |
| | | formRef.value.validate().then(({ valid, errors }: any) => { |
| | | if (valid) { |
| | | confirm(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | async function confirm() { |
| | | try { |
| | | let params: API.SavePersonalUserBankCardCommand = {}; |
| | | let res = await userServices.savePersonalUserBankCard(params); |
| | | if (res) { |
| | | Message.success('修改成功', { |
| | | onClosed() { |
| | | goBack(); |
| | | }, |
| | | }); |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .payrollChange-page-wrapper { |
| | | .bole-form-input-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .form-input-unit { |
| | | margin-left: 10px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | flex-shrink: 0; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
| New file |
| | |
| | | <template> |
| | | <PageLayout class="payrollChange-page-wrapper" title="修改" has-border> |
| | | <InnerPage></InnerPage> |
| | | </PageLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'payrollChange', |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | </style> |
| | |
| | | :isReal="item.isReal" |
| | | :totalWorkHours="item.totalWorkHours" |
| | | :settlementAmount="item.settlementAmount" |
| | | /> |
| | | > |
| | | <template #actions> |
| | | <div class="payroll-manage-detail-card-actions"> |
| | | <nut-button type="primary" plain @click="goPayrollChange(item)">修改</nut-button> |
| | | </div> |
| | | </template> |
| | | </PayrollManageDetailCard> |
| | | </template> |
| | | </InfiniteLoading> |
| | | <PageFooter v-if="form.auditStatus === EnumTaskSettlementAuditStatus.Wait"> |
| | |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function goPayrollChange(item: API.GetSettlementTaskUsersQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.payrollChange}?id=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .payroll-manage-detail-card-actions { |
| | | --nut-button-default-height: 24px; |
| | | |
| | | text-align: right; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | > |
| | | <template #actions> |
| | | <template v-if="checkReceiveMethod === EnumTaskCheckReceiveMethod.CheckIn"> |
| | | <nut-button |
| | | <!-- <nut-button |
| | | v-if="!checkInTime" |
| | | type="primary" |
| | | class="task-check-card-phone-btn" |
| | |
| | | > |
| | | <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }"> |
| | | {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }} |
| | | </div> |
| | | </div> --> |
| | | <nut-button type="primary" class="task-check-card-phone-btn" @click.stop="handleMore" |
| | | >操作</nut-button |
| | | > |
| | | </template> |
| | | <template v-else> |
| | | <nut-button |
| | |
| | | EnumTaskCheckReceiveMethod, |
| | | } from '@12333/constants'; |
| | | import { CheckInOrOutEventEnum } from '../constants'; |
| | | import { Portal } from 'senin-mini/components'; |
| | | import { ActionSheet } from '@nutui/nutui-taro'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckCard', |
| | | }); |
| | | |
| | | enum ManageActions { |
| | | CheckIn = 1, |
| | | CheckOut, |
| | | OutWork, |
| | | } |
| | | |
| | | type Props = { |
| | | avatar?: string; |
| | |
| | | (e: 'checkReceive'): void; |
| | | (e: 'checkInOrOut', ev: CheckInOrOutEventEnum): void; |
| | | }>(); |
| | | |
| | | const menuList = computed(() => { |
| | | let _menuList = []; |
| | | if (props.checkReceiveMethod === EnumTaskCheckReceiveMethod.CheckIn) { |
| | | _menuList.push( |
| | | { |
| | | name: '签到', |
| | | value: ManageActions.CheckIn, |
| | | }, |
| | | { |
| | | name: '签出', |
| | | value: ManageActions.CheckOut, |
| | | }, |
| | | { |
| | | name: '未到岗', |
| | | value: ManageActions.OutWork, |
| | | } |
| | | ); |
| | | } |
| | | |
| | | return _menuList; |
| | | }); |
| | | |
| | | function handleMore() { |
| | | Portal.add((key) => { |
| | | return h( |
| | | Portal.Container, |
| | | { keyNumber: key, delayOpen: true }, |
| | | { |
| | | default: ({ open, onClose }) => |
| | | // @ts-ignore |
| | | h(ActionSheet, { |
| | | visible: open.value, |
| | | 'onUpdate:visible': () => onClose(), |
| | | menuItems: menuList.value, |
| | | onChoose: (item) => { |
| | | handleEmit(item); |
| | | onClose(); |
| | | }, |
| | | }), |
| | | } |
| | | ); |
| | | }); |
| | | } |
| | | |
| | | function handleEmit(action: { name: string; value: number }) { |
| | | switch (action.value) { |
| | | case ManageActions.CheckIn: |
| | | emit('checkInOrOut', CheckInOrOutEventEnum.CheckIn); |
| | | break; |
| | | case ManageActions.CheckOut: |
| | | emit('checkInOrOut', CheckInOrOutEventEnum.CheckOut); |
| | | break; |
| | | case ManageActions.OutWork: |
| | | emit('checkInOrOut', CheckInOrOutEventEnum.CheckOut); |
| | | break; |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | |
| | | <template> |
| | | <Calendar v-model="queryState.date"></Calendar> |
| | | <Calendar key="calendar" v-model="queryState.date"></Calendar> |
| | | <ProTabs |
| | | v-model="queryState.checkReceiveStatus" |
| | | name="task-tab" |
| | |
| | | ></ProTabPane> |
| | | <ProTabPane :title="`已验收`" :pane-key="EnumTaskCheckReceiveStatus.Completed"></ProTabPane> |
| | | </ProTabs> |
| | | <div class="task-list-container"> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | |
| | | /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskCheck-page-wrapper { |
| | | .task-list-container { |
| | | flex: 1; |
| | | min-height: 0; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <ListItem title="用户协议" @click="goMineUserPolicy"></ListItem> |
| | | <ListItem title="隐私政策" @click="goPrivacyPolicy"></ListItem> |
| | | <ListItem title="退出登录" @click="handleLoginout"></ListItem> |
| | | <!-- <ListItem title="人工客服" @click="goMineService"></ListItem> --> |
| | | <nut-button :open-type="'contact'" class="setting-page-service">人工客服</nut-button> |
| | | </List> |
| | | </PageLayout> |
| | |
| | | } |
| | | |
| | | function goMineService() { |
| | | const encodedUrl = encodeURIComponent('https://work.weixin.qq.com/kfid/kfcd24e0c60fd91099'); |
| | | // const encodedUrl = encodeURIComponent('https://work.weixin.qq.com/kfid/kfcd24e0c60fd91099'); |
| | | Taro.openCustomerServiceChat({ |
| | | extInfo: { |
| | | // url: 'https://work.weixin.qq.com/kfid/kfcd24e0c60fd91099', |
| | | url: `${RouterPath.extraPage}?url=${encodedUrl}`, |
| | | url: `${RouterPath.setting}`, |
| | | }, |
| | | corpId: 'wwc84cb8e0525c772f', |
| | | // corpId: 'kfc2335f41fb4f0c0bc', |
| | | fail: (res) => { |
| | | Taro.showToast({ |
| | | title: res.errMsg, |
| | |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | width: 100%; |
| | | |
| | | &::before { |
| | | display: none; |
| | | } |
| | | |
| | | &::after { |
| | | display: none; |
| | | } |
| | | |
| | | .nut-button__wrap { |
| | | justify-content: flex-start; |
| | | } |