| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <ContentScrollView :paddingH="false"> |
| | | <nut-form :model-value="form" ref="formRef" :rules="rules"> |
| | | <nut-form-item |
| | | label="ä¾åºå:" |
| | | class="bole-form-item" |
| | | prop="supplierEnterpriseId" |
| | | label-width="90px" |
| | | required |
| | | > |
| | | <ChooseInputWithPicker |
| | | v-model="form.supplierEnterpriseId" |
| | | placeholder="è¯·éæ©ä¾åºå" |
| | | :value-enum="supplierEnterpriseSelect" |
| | | :disabled="isEdit" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item label="ä»»å¡åç§°:" class="bole-form-item" prop="name" label-width="90px"> |
| | | <nut-input v-model="form.name" placeholder="请è¾å
¥ä»»å¡åç§°"> </nut-input> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="éæ±äººæ°:" |
| | | class="bole-form-item" |
| | | prop="needPeopleNumber" |
| | | label-width="90px" |
| | | > |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.needPeopleNumber" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请è¾å
¥éæ±äººæ°" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="0" |
| | | @change="calcTaskTotalServiceFee" |
| | | /> |
| | | <div class="form-input-unit">人</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="æå¡è´¹:" |
| | | class="bole-form-item alignTop" |
| | | prop="billingMethod" |
| | | required |
| | | label-width="90px" |
| | | label-position="top" |
| | | > |
| | | <nut-radio-group |
| | | v-model="form.billingMethod" |
| | | direction="horizontal" |
| | | @change="calcTaskTotalServiceFee" |
| | | > |
| | | <BlRadio |
| | | :label="Number(key)" |
| | | v-for="(val, key) in EnumBillingMethodText" |
| | | :key="key" |
| | | :disabled="feeCannotEdit" |
| | | >{{ val }}</BlRadio |
| | | > |
| | | </nut-radio-group> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label=" " |
| | | class="bole-form-item" |
| | | prop="serviceFee" |
| | | label-width="0" |
| | | v-if="form.billingMethod !== EnumBillingMethod.Face" |
| | | > |
| | | <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" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | /> |
| | | <div class="form-input-unit">{{ BillingMethodEnumUnit[form.billingMethod] }}</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <template v-if="form.billingMethod === EnumBillingMethod.Hour"> |
| | | <nut-form-item |
| | | label="æ ¸å®å·¥æ¶:" |
| | | class="bole-form-item" |
| | | prop="verifyWorkHours" |
| | | label-width="90" |
| | | > |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.verifyWorkHours" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请è¾å
¥æ ¸å®å·¥æ¶" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | /> |
| | | <div class="form-input-unit">{{ 'å°æ¶/天' }}</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="è¶
æ¶æå¡è´¹:" |
| | | class="bole-form-item" |
| | | prop="timeoutServiceFee" |
| | | label-width="90" |
| | | > |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.timeoutServiceFee" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请è¾å
¥è¶
æ¶æå¡è´¹" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | :disabled="feeCannotEdit" |
| | | /> |
| | | <div class="form-input-unit">{{ 'å
/å°æ¶' }}</div> |
| | | </div> |
| | | </nut-form-item> |
| | | </template> |
| | | <nut-form-item |
| | | v-if="form.billingMethod === EnumBillingMethod.Piece" |
| | | label="æ»ä»¶æ°:" |
| | | class="bole-form-item" |
| | | prop="totalPieceQuantity" |
| | | label-width="90" |
| | | > |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.totalPieceQuantity" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="请è¾å
¥ä»»å¡æ»ä»¶æ°" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="2" |
| | | type="text" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | /> |
| | | <div class="form-input-unit">{{ 'ä»¶' }}</div> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="ç»ç®æ¹å¼:" |
| | | class="bole-form-item" |
| | | prop="settleType" |
| | | required |
| | | label-width="90px" |
| | | > |
| | | <nut-radio-group |
| | | v-model="form.settlementCycle" |
| | | direction="horizontal" |
| | | @change="settleTypeChange" |
| | | > |
| | | <BlRadio |
| | | :label="Number(key)" |
| | | v-for="(val, key) in EnumSettlementCycleText" |
| | | :key="key" |
| | | :disabled="feeCannotEdit" |
| | | >{{ val }}</BlRadio |
| | | > |
| | | </nut-radio-group> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="ç»ç®æ¥æ:" |
| | | class="bole-form-item" |
| | | prop="settlementDate" |
| | | label-width="90px" |
| | | required |
| | | v-if="form.settlementCycle !== EnumSettlementCycle.Day" |
| | | > |
| | | <ChooseInputWithPicker |
| | | v-model="form.settlementDate" |
| | | placeholder="请设置ç»ç®æ¥æ" |
| | | :value-enum="settlementDateList" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item label="ç¦å©:" class="bole-form-item" prop="benefits" label-width="90px"> |
| | | <ChooseInputWithCheckbox |
| | | v-model="form.benefits" |
| | | title="è¯·éæ©ç¦å©" |
| | | :columns="WelfareTypeList" |
| | | placeholder="è¯·éæ©ç¦å©" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="å¹´é¾èå´:" |
| | | class="bole-form-item" |
| | | prop="ageMinLimit" |
| | | required |
| | | label-width="90px" |
| | | > |
| | | <div class="bole-form-input-wrapper"> |
| | | <NumberInput |
| | | v-model.trim="form.ageMinLimit" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="è¯·éæ©å¹´é¾èå´" |
| | | :min="16" |
| | | /> |
| | | <div class="form-input-separator">è³</div> |
| | | <NumberInput |
| | | v-model.trim="form.ageMaxLimit" |
| | | class="nut-input-text bole-input-text" |
| | | placeholder="è¯·éæ©å¹´é¾èå´" |
| | | :min="16" |
| | | /> |
| | | </div> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="æ§å«è¦æ±:" |
| | | class="bole-form-item" |
| | | prop="genderLimit" |
| | | label-width="90px" |
| | | required |
| | | > |
| | | <ChooseInputWithPicker |
| | | v-model="form.genderLimit" |
| | | placeholder="è¯·éæ©æ§å«è¦æ±" |
| | | :value-enum="EnumUserGenderTextOptions" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="èµæ ¼è¯ä¹¦:" |
| | | class="bole-form-item" |
| | | prop="credentialLimits" |
| | | label-width="90px" |
| | | > |
| | | <ChooseInputWithCheckbox |
| | | v-model="form.credentialLimits" |
| | | title="è¯·éæ©èµæ ¼è¯ä¹¦" |
| | | :columns="CertificateTypeList" |
| | | placeholder="è¯·éæ©èµæ ¼è¯ä¹¦" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="ä»»å¡å°ç¹" |
| | | label-width="90px" |
| | | class="bole-form-item" |
| | | prop="weMapInfo" |
| | | required |
| | | > |
| | | <ChooseLocationInput |
| | | inputAlign="left" |
| | | placeholder="è¯·éæ©ä»»å¡å°ç¹" |
| | | v-model="form.weMapInfo" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="å°ç¹è¯´æ:" |
| | | class="bole-form-item" |
| | | prop="addressDetail" |
| | | label-width="90px" |
| | | > |
| | | <nut-input v-model="form.addressDetail" placeholder="请è¾å
¥å°ç¹è¯´æ"> </nut-input> |
| | | </nut-form-item> |
| | | <nut-form-item label="ä»»å¡è¯´æ:" class="bole-form-item" prop="description" label-width="90px"> |
| | | <nut-textarea v-model="form.description" placeholder="请è¾å
¥ä»»å¡è¯´æ"> </nut-textarea> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="ä»»å¡å¼å§æ¥æ:" |
| | | class="bole-form-item" |
| | | prop="beginTime" |
| | | label-width="90px" |
| | | > |
| | | <ChooseInputWithDatePicker |
| | | v-model="form.beginTime" |
| | | :minDate="nowDate" |
| | | placeholder="è¯·éæ©ä»»å¡å¼å§æ¥æ" |
| | | @change="timeChange" |
| | | ></ChooseInputWithDatePicker> |
| | | </nut-form-item> |
| | | <nut-form-item label="ä»»å¡ç»ææ¥æ:" class="bole-form-item" prop="endTime" label-width="90px"> |
| | | <ChooseInputWithDatePicker |
| | | v-model="form.endTime" |
| | | :minDate="nowDate" |
| | | placeholder="è¯·éæ©ä»»å¡ç»ææ¥æ" |
| | | @change="calcTaskTotalServiceFee()" |
| | | ></ChooseInputWithDatePicker> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="æ¥åå¼å§æ¥æ:" |
| | | class="bole-form-item" |
| | | prop="applyBeginTime" |
| | | label-width="90px" |
| | | > |
| | | <ChooseInputWithDatePicker |
| | | v-model="form.applyBeginTime" |
| | | :minDate="nowDate" |
| | | placeholder="è¯·éæ©æ¥åå¼å§æ¥æ" |
| | | ></ChooseInputWithDatePicker> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="æ¥åç»ææ¥æ:" |
| | | class="bole-form-item" |
| | | prop="applyEndTime" |
| | | label-width="90px" |
| | | > |
| | | <ChooseInputWithDatePicker |
| | | v-model="form.applyEndTime" |
| | | :minDate="form.applyBeginTime ? dayjs(form.applyBeginTime).toDate() : nowDate" |
| | | placeholder="è¯·éæ©æ¥åç»ææ¥æ" |
| | | ></ChooseInputWithDatePicker> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="éªæ¶æ¹å¼:" |
| | | class="bole-form-item" |
| | | prop="checkReceiveMethods" |
| | | label-width="90px" |
| | | > |
| | | <!-- <nut-radio-group v-model="form.checkReceiveMethod" direction="horizontal"> |
| | | <BlRadio |
| | | :label="Number(key)" |
| | | v-for="(val, key) in EnumTaskCheckReceiveMethodText" |
| | | :key="key" |
| | | >{{ val }}</BlRadio |
| | | > |
| | | </nut-radio-group> --> |
| | | <nut-checkbox-group v-model="form.checkReceiveMethods"> |
| | | <nut-checkbox |
| | | :disabled="isEdit" |
| | | v-for="(val, key) in EnumTaskCheckReceiveMethodText" |
| | | :key="key" |
| | | :label="Number(key) as any" |
| | | > |
| | | {{ val }} |
| | | </nut-checkbox> |
| | | </nut-checkbox-group> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="ç»ç®æ¹å¼:" |
| | | class="bole-form-item" |
| | | prop="settlementAccess" |
| | | label-width="90px" |
| | | required |
| | | > |
| | | <ChooseInputWithPicker |
| | | v-model="form.settlementAccess" |
| | | placeholder="è¯·éæ©ç»ç®æ¹å¼" |
| | | :value-enum="settlementAccessList" |
| | | :disabled="isEdit" |
| | | /> |
| | | </nut-form-item> |
| | | <nut-form-item |
| | | label="é¢è®¡æå¡è´¹æ»é¢:" |
| | | class="bole-form-item" |
| | | prop="totalServiceFee" |
| | | label-width="110px" |
| | | > |
| | | {{ `${toThousand(totalServiceFee)}å
` }} |
| | | </nut-form-item> |
| | | </nut-form> |
| | | </ContentScrollView> |
| | | <PageFooter> |
| | | <PageFooterBtn type="primary" plain @click="handleCancel">åæ¶</PageFooterBtn> |
| | | <PageFooterBtn type="primary" @click="handleConfirm">åå¸</PageFooterBtn> |
| | | </PageFooter> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { useUser } from '@/hooks'; |
| | | import { |
| | | CategoryCode, |
| | | EnumBillingMethod, |
| | | EnumSettlementCycle, |
| | | EnumUserGender, |
| | | EnumBillingMethodText, |
| | | EnumUserGenderText, |
| | | EnumSettlementCycleText, |
| | | BillingMethodEnumUnit, |
| | | EnumUserGenderTextOptions, |
| | | EnumSettlementCycleDateWeekArray, |
| | | EnumSettlementCycleDateMonthArray, |
| | | EnumTaskCheckReceiveMethod, |
| | | EnumTaskCheckReceiveMethodText, |
| | | EnumEnterpriseWalletAccess, |
| | | EnumEnterpriseWalletAccessText, |
| | | } from '@12333/constants'; |
| | | import { |
| | | ChooseInputWithPicker, |
| | | ChooseInputWithDatePicker, |
| | | NumberInput, |
| | | ChooseLocationInput, |
| | | Radio as BlRadio, |
| | | ChooseInputWithAreaPicker, |
| | | ChooseInputWithCheckbox, |
| | | } from '@12333/components'; |
| | | import { FormValidator, Message, toThousand } from '@12333/utils'; |
| | | import * as taskServices from '@12333/services/apiV2/task'; |
| | | import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { goBack } from '@/utils'; |
| | | import { |
| | | useAllAreaList, |
| | | useDictionaryDataSelect, |
| | | useEnterpriseWalletAccessSelect, |
| | | useGetSupplierEnterpriseSelect, |
| | | } from '@12333/hooks'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const { userDetail } = useUser(); |
| | | const { findAreaNameFromCode } = useAllAreaList(); |
| | | |
| | | const { supplierEnterpriseSelect } = useGetSupplierEnterpriseSelect(); |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.id ?? ''; |
| | | const isEdit = !!taskId; |
| | | const isCopy = router.params?.isCopy === 'true'; |
| | | |
| | | const nowDate = dayjs().toDate(); |
| | | const applyBeginTimeMinDate = computed(() => { |
| | | return form.applyBeginTime |
| | | ? dayjs(form.applyBeginTime).toDate() |
| | | : form.beginTime |
| | | ? dayjs(form.beginTime).toDate() |
| | | : nowDate; |
| | | }); |
| | | |
| | | const feeCannotEdit = computed(() => { |
| | | return dayjs().isAfter(form.beginTime, 'second') && isEdit; |
| | | }); |
| | | |
| | | const { dictionaryDataList: WelfareTypeList } = useDictionaryDataSelect({ |
| | | categoryCode: CategoryCode.Welfare, |
| | | }); |
| | | const { dictionaryDataList: CertificateTypeList } = useDictionaryDataSelect({ |
| | | categoryCode: CategoryCode.CertificateType, |
| | | }); |
| | | |
| | | const settlementDateList = computed(() => { |
| | | if (form.settlementCycle === EnumSettlementCycle.Month) { |
| | | return EnumSettlementCycleDateMonthArray; |
| | | } |
| | | if (form.settlementCycle === EnumSettlementCycle.Week) { |
| | | return EnumSettlementCycleDateWeekArray; |
| | | } |
| | | return []; |
| | | }); |
| | | |
| | | const form = reactive({ |
| | | supplierEnterpriseId: '', |
| | | name: '', |
| | | needPeopleNumber: '' as any as number, |
| | | billingMethod: EnumBillingMethod.Day, |
| | | serviceFee: '' as any as number, |
| | | settlementCycle: EnumSettlementCycle.Day, |
| | | benefits: [] as string[], |
| | | ageMinLimit: '' as any as number, |
| | | ageMaxLimit: '' as any as number, |
| | | genderLimit: 0 as any as EnumUserGender, |
| | | credentialLimits: [] as string[], |
| | | beginTime: '', |
| | | endTime: '', |
| | | settlementDate: null as number, |
| | | |
| | | weMapInfo: {} as WeMapModel, |
| | | addressDetail: '', |
| | | |
| | | verifyWorkHours: null as number, |
| | | timeoutServiceFee: null as number, |
| | | description: '', |
| | | checkReceiveMethods: [] as EnumTaskCheckReceiveMethod[], |
| | | applyBeginTime: '', |
| | | applyEndTime: '', |
| | | settlementAccess: '' as any as EnumEnterpriseWalletAccess, |
| | | totalPieceQuantity: '' as any as number, |
| | | |
| | | totalServiceFee: null as number, |
| | | }); |
| | | |
| | | const rules = reactive<FormRules>({ |
| | | supplierEnterpriseId: [{ required: true, message: 'è¯·éæ©ä¾åºå' }], |
| | | name: [{ required: true, message: '请è¾å
¥ä»»å¡åç§°' }], |
| | | needPeopleNumber: [{ required: true, message: '请è¾å
¥éæ±äººæ°' }], |
| | | totalPieceQuantity: [{ required: true, message: '请è¾å
¥ä»»å¡æ»ä»¶æ°' }], |
| | | verifyWorkHours: [{ required: true, message: '请è¾å
¥æ ¸å®å·¥æ¶' }], |
| | | timeoutServiceFee: [{ required: true, message: '请è¾å
¥è¶
æ¶æå¡è´¹' }], |
| | | genderLimit: [{ required: true, message: 'è¯·éæ©æ§å«è¦æ±' }], |
| | | settlementCycleDate: [{ required: true, message: '请设置ç»ç®æ¥æ' }], |
| | | settlementAccess: [{ required: true, message: 'è¯·éæ©ç»ç®æ¹å¼' }], |
| | | // addressDetail: [{ required: true, message: '请è¾å
¥è¯¦ç»å°å' }], |
| | | billingMethod: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©æ¶è´¹æ¹å¼', |
| | | validator: () => { |
| | | if (!form.billingMethod) { |
| | | return Promise.reject('è¯·éæ©æå¡è´¹ç±»å'); |
| | | } |
| | | if (!form.serviceFee && form.billingMethod !== EnumBillingMethod.Face) { |
| | | return Promise.reject('请è¾å
¥æå¡è´¹'); |
| | | } |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | weMapInfo: [ |
| | | { required: true, message: '请设置工ä½å°ç¹', validator: FormValidator.validatorWeMap }, |
| | | ], |
| | | |
| | | ageMinLimit: [ |
| | | { |
| | | required: true, |
| | | message: '请è¾å
¥å¹´é¾è¦æ±', |
| | | validator: () => { |
| | | if (!form.ageMinLimit && form.ageMinLimit > 0) { |
| | | return Promise.reject('请è¾å
¥å¹´é¾è¦æ±'); |
| | | } |
| | | if (!form.ageMaxLimit && form.ageMaxLimit > 0) { |
| | | return Promise.reject('请è¾å
¥å¹´é¾è¦æ±'); |
| | | } |
| | | if (Number(form.ageMaxLimit) <= Number(form.ageMinLimit)) { |
| | | return Promise.reject('æå¤§å¹´é¾ä¸è½å°äºæå°å¹´é¾'); |
| | | } |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | |
| | | beginTime: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©å¼å§æ¥æ', |
| | | }, |
| | | ], |
| | | endTime: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©ç»ææ¥æ', |
| | | validator(value) { |
| | | if (!value) return Promise.reject('è¯·éæ©ç»ææ¥æ'); |
| | | if (form.billingMethod === EnumBillingMethod.Month) { |
| | | if (dayjs(form.endTime).isBefore(dayjs(form.beginTime).add(1, 'month'))) { |
| | | return Promise.reject('æææå¡è´¹ï¼ä»»å¡æ¶é¿é大äºä¸ä¸ªæ'); |
| | | } |
| | | return Promise.resolve(true); |
| | | } |
| | | if (dayjs(value).isBefore(dayjs(form.beginTime))) |
| | | return Promise.reject('ç»ææ¥æé大äºå¼å§æ¥æ'); |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | applyBeginTime: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©æ¥åå¼å§æ¥æ', |
| | | validator(value) { |
| | | if (!value) return Promise.reject('è¯·éæ©æ¥åå¼å§æ¥æ'); |
| | | if (dayjs(value).isAfter(dayjs(form.endTime))) |
| | | return Promise.reject('æ¥åå¼å§æ¥æéå°äºä»»å¡ç»ææ¥æ'); |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | applyEndTime: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©æ¥åç»ææ¥æ', |
| | | validator(value) { |
| | | if (!value) return Promise.reject('è¯·éæ©æ¥åç»ææ¥æ'); |
| | | if (dayjs(value).isBefore(dayjs(form.applyBeginTime))) |
| | | return Promise.reject('æ¥åç»ææ¥æéå¤§äºæ¥åå¼å§æ¥æ'); |
| | | if (dayjs(value).isAfter(dayjs(form.endTime))) |
| | | return Promise.reject('æ¥åç»ææ¥æéå°äºä»»å¡ç»ææ¥æ'); |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | checkReceiveMethods: [ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©éªæ¶æ¹å¼', |
| | | validator(value) { |
| | | if (!value?.length) return Promise.reject('è¯·éæ©éªæ¶æ¹å¼'); |
| | | return Promise.resolve(true); |
| | | }, |
| | | }, |
| | | ], |
| | | }); |
| | | |
| | | const { settlementAccessList } = useEnterpriseWalletAccessSelect({ |
| | | supplierEnterpriseId: computed(() => form.supplierEnterpriseId), |
| | | }); |
| | | |
| | | 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), |
| | | enabled: isEdit, |
| | | onSuccess(data) { |
| | | form.supplierEnterpriseId = data.supplierEnterpriseId; |
| | | form.name = data.name; |
| | | form.needPeopleNumber = data.needPeopleNumber; |
| | | form.billingMethod = data.billingMethod; |
| | | form.serviceFee = data.serviceFee; |
| | | form.totalPieceQuantity = data.totalPieceQuantity; |
| | | form.settlementCycle = data.settlementCycle; |
| | | form.settlementDate = data.settlementDate; |
| | | form.benefits = (data.benefits ?? []).map((item) => item.benefitCode); |
| | | form.ageMinLimit = data.ageMinLimit; |
| | | form.ageMaxLimit = data.ageMaxLimit; |
| | | form.genderLimit = data.genderLimit; |
| | | form.credentialLimits = (data.credentialLimits ?? []).map((item) => item.typeCode); |
| | | form.beginTime = dayjs(data.beginTime).format('YYYY-MM-DD'); |
| | | form.endTime = dayjs(data.endTime).format('YYYY-MM-DD'); |
| | | form.addressDetail = data.addressDetail; |
| | | form.weMapInfo = { |
| | | provinceName: data.provinceContent, |
| | | cityName: data.cityContent, |
| | | provinceCode: data.provinceCode, |
| | | cityCode: data.cityCode, |
| | | latitude: data.latitude, |
| | | longitude: data.longitude, |
| | | addressName: data.addressName, |
| | | address: data.addressName, |
| | | }; |
| | | form.description = data.description; |
| | | form.verifyWorkHours = data.verifyWorkHours; |
| | | form.timeoutServiceFee = data.timeoutServiceFee; |
| | | form.checkReceiveMethods = data.checkReceiveMethods; |
| | | form.applyBeginTime = dayjs(data.applyBeginTime).format('YYYY-MM-DD'); |
| | | form.applyEndTime = dayjs(data.applyEndTime).format('YYYY-MM-DD'); |
| | | form.settlementAccess = data.settlementAccess; |
| | | |
| | | if (!!data.timeoutServiceFee) { |
| | | calcTaskTotalServiceFee(); |
| | | } |
| | | }, |
| | | }); |
| | | |
| | | async function calcTaskTotalServiceFee() { |
| | | try { |
| | | if (!form.beginTime || !form.endTime) { |
| | | return; |
| | | } |
| | | if (form.billingMethod !== EnumBillingMethod.Piece && !form.needPeopleNumber) { |
| | | return; |
| | | } |
| | | let params: API.CalcTaskTotalServiceFeeCommand = { |
| | | billingMethod: form.billingMethod, |
| | | serviceFee: form.serviceFee, |
| | | verifyWorkHours: form.verifyWorkHours, |
| | | totalPieceQuantity: form.totalPieceQuantity, |
| | | needPeopleNumber: form.needPeopleNumber, |
| | | beginTime: dayjs(form.beginTime).format('YYYY-MM-DD 00:00:00'), |
| | | endTime: dayjs(form.endTime).format('YYYY-MM-DD 23:59:59'), |
| | | }; |
| | | let res = await taskServices.calcTaskTotalServiceFee(params, { showLoading: false }); |
| | | if (res) { |
| | | form.totalServiceFee = res.totalServiceFee; |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | const totalServiceFee = computed(() => { |
| | | if (!form.beginTime || !form.endTime) { |
| | | return 0; |
| | | } |
| | | var days = dayjs(form.endTime).diff(dayjs(form.beginTime), 'day') + 1; |
| | | const serviceFee = form.serviceFee || 0; |
| | | const needPeopleNumber = form.needPeopleNumber || 0; |
| | | switch (form.billingMethod) { |
| | | case EnumBillingMethod.Month: |
| | | return serviceFee * Math.round(days / 30) * needPeopleNumber; |
| | | case EnumBillingMethod.Day: |
| | | return serviceFee * days * needPeopleNumber; |
| | | case EnumBillingMethod.Hour: |
| | | return serviceFee * (form.verifyWorkHours || 0) * days * needPeopleNumber; |
| | | case EnumBillingMethod.Piece: |
| | | return serviceFee * (form.totalPieceQuantity || 0); |
| | | default: |
| | | return 0; |
| | | } |
| | | }); |
| | | |
| | | 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 { |
| | | await calcTaskTotalServiceFee(); |
| | | |
| | | let params: API.SaveTaskInfoCommand = { |
| | | supplierEnterpriseId: form.supplierEnterpriseId, |
| | | name: form.name, |
| | | needPeopleNumber: form.needPeopleNumber, |
| | | billingMethod: form.billingMethod, |
| | | serviceFee: form.serviceFee, |
| | | totalPieceQuantity: form.totalPieceQuantity, |
| | | settlementCycle: form.settlementCycle, |
| | | settlementDate: form.settlementDate ? form.settlementDate : 0, |
| | | benefits: form.benefits, |
| | | ageMinLimit: form.ageMinLimit, |
| | | ageMaxLimit: form.ageMaxLimit, |
| | | genderLimit: form.genderLimit, |
| | | credentialLimits: form.credentialLimits, |
| | | provinceCode: form.weMapInfo.provinceCode, |
| | | cityCode: form.weMapInfo.cityCode, |
| | | addressName: form.weMapInfo.addressName, |
| | | addressDetail: form.addressDetail, |
| | | longitude: form.weMapInfo.longitude, |
| | | latitude: form.weMapInfo.latitude, |
| | | beginTime: dayjs(form.beginTime).format('YYYY-MM-DD 00:00:00'), |
| | | endTime: dayjs(form.endTime).format('YYYY-MM-DD 23:59:59'), |
| | | description: form.description, |
| | | verifyWorkHours: form.verifyWorkHours, |
| | | timeoutServiceFee: form.timeoutServiceFee, |
| | | checkReceiveMethods: form.checkReceiveMethods, |
| | | applyBeginTime: dayjs(form.applyBeginTime).format('YYYY-MM-DD 00:00:00'), |
| | | applyEndTime: dayjs(form.applyEndTime).format('YYYY-MM-DD 23:59:59'), |
| | | settlementAccess: form.settlementAccess, |
| | | }; |
| | | if (isEdit) { |
| | | params.id = taskId; |
| | | } |
| | | if (isCopy) { |
| | | params.id = ''; |
| | | } |
| | | let res = await taskServices.saveTaskInfo(params, { skipErrorHandler: true }); |
| | | if (res) { |
| | | Message.success(isEdit && !isCopy ? 'ç¼è¾æå' : 'å叿å', { |
| | | onClosed() { |
| | | goBack(); |
| | | }, |
| | | }); |
| | | } |
| | | } catch (error) { |
| | | if (error?.info?.errorCode == 'BalanceNotEnough') { |
| | | await Message.confirm({ |
| | | message: `æ¨å½åè´¦æ·ä½é¢ä¸è¶³ï¼ææ¶æ æ³åå¸ä»»å¡ï¼è¯·ç»å½å®¢æ·ç«¯åå°å
å¼åæä½`, |
| | | showCancelBtn: false, |
| | | }); |
| | | } else { |
| | | Message.error(error); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function timeChange() { |
| | | form.applyBeginTime = ''; |
| | | form.applyEndTime = ''; |
| | | calcTaskTotalServiceFee(); |
| | | } |
| | | |
| | | function applyTimeChange() { |
| | | form.applyEndTime = ''; |
| | | } |
| | | |
| | | function settleTypeChange() { |
| | | form.settlementDate = null as number; |
| | | } |
| | | |
| | | function handleCancel() { |
| | | goBack(); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .publish-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; |
| | | } |
| | | |
| | | .form-input-separator { |
| | | margin-right: 10px; |
| | | } |
| | | } |
| | | </style> |