| | |
| | | <ProForm :model="form" ref="productFormRef" label-width="110px" :is-read="isDetail"> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 label="任务名称:" prop="name"> |
| | | <ProFormItemV2 |
| | | label="任务名称:" |
| | | prop="name" |
| | | :check-rules="[{ message: '请输入任务名称' }]" |
| | | > |
| | | <ProFormText v-model.trim="form.name" placeholder="请输入任务名称" /> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormItemV2 label="服务费:" prop="salaryType"> |
| | | <RadioWithExtra |
| | | v-model="form.salaryType" |
| | | :value-enum="[ |
| | | { label: '按月', value: 1 }, |
| | | { label: '按日', value: 2 }, |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="服务费:" |
| | | prop="billingMethod" |
| | | :check-rules="[ |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (!form.billingMethod) { |
| | | callback(new Error('请选择服务费类型')); |
| | | } |
| | | if (!form.serviceFee) { |
| | | callback(new Error('请输入服务费')); |
| | | } |
| | | callback(); |
| | | }, |
| | | }, |
| | | ]" |
| | | :showExtra="true" |
| | | > |
| | | <template #extra> |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | :min="0" |
| | | :max="999" |
| | | v-model="form.name" |
| | | placeholder="请输入" |
| | | :unit="form.salaryType === 1 ? '元/月' : '元/天'" |
| | | ></ProFormInputNumber> |
| | | </template> |
| | | </RadioWithExtra> |
| | | </ProFormItemV2> |
| | | <RadioWithExtra |
| | | v-model="form.billingMethod" |
| | | :value-enum="EnumBillingMethodText" |
| | | :showExtra="true" |
| | | :button-style="false" |
| | | > |
| | | <template #extra> |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | v-model="form.serviceFee" |
| | | placeholder="请输入" |
| | | :unit="EnumBillingMethodUnitText[form.billingMethod]" |
| | | ></ProFormInputNumber> |
| | | </template> |
| | | </RadioWithExtra> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 label="结算方式:" prop="salaryType"> |
| | | <ProFormItemV2 |
| | | label="结算方式:" |
| | | prop="settlementCycle" |
| | | :check-rules="[{ message: '请选择结算方式' }]" |
| | | > |
| | | <ProFormRadio |
| | | v-model="form.salaryType" |
| | | :value-enum="[{ label: '是', value: 1 }]" |
| | | v-model="form.settlementCycle" |
| | | :value-enum="EnumSettlementCycleText" |
| | | :button-style="false" |
| | | ></ProFormRadio> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 label="年龄要求:" prop="ageRange"> |
| | | <ProFormItemV2 label="福利:" prop="benefits"> |
| | | <el-checkbox |
| | | v-if="!isDetail" |
| | | v-model="state.checkBenefitsAll" |
| | | style="margin-right: 30px" |
| | | :indeterminate="state.isBenefitsIndeterminate" |
| | | @change="handleCheckBenefitsAllChange" |
| | | >全选</el-checkbox |
| | | > |
| | | <ProFormCheckbox |
| | | v-model="form.benefits" |
| | | :value-enum="welfareList" |
| | | @change="handleCheckedBenefitsServicesChange" |
| | | ></ProFormCheckbox> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="年龄范围:" |
| | | prop="ageRange" |
| | | class="form-age-range" |
| | | :check-rules="[ |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (!form.ageMinLimit) { |
| | | callback(new Error('请输入年龄要求')); |
| | | } |
| | | if (!form.ageMaxLimit) { |
| | | callback(new Error('请输入年龄要求')); |
| | | } |
| | | if (Number(form.ageMaxLimit) <= Number(form.ageMinLimit)) { |
| | | callback(new Error('最大年龄不能小于最小年龄')); |
| | | } |
| | | callback(); |
| | | }, |
| | | }, |
| | | ]" |
| | | > |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | :min="0" |
| | | v-model="form.ageStart" |
| | | :min="1" |
| | | v-model="form.ageMinLimit" |
| | | placeholder="请输入" |
| | | disabled |
| | | ></ProFormInputNumber> |
| | | <div class="form-input-separator">至</div> |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | :min="0" |
| | | v-model="form.ageEnd" |
| | | :min="1" |
| | | v-model="form.ageMaxLimit" |
| | | placeholder="请输入" |
| | | disabled |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 label="性别要求:" prop="sexRequirement" required> |
| | | <RadioWithExtra |
| | | v-model="form.sexRequirement" |
| | | :value-enum="[ |
| | | { |
| | | label: '不限', |
| | | value: 1, |
| | | }, |
| | | ]" |
| | | :showExtra="true" |
| | | <ProFormItemV2 |
| | | label="性别要求:" |
| | | prop="genderLimit" |
| | | :check-rules="[{ message: '请选择性别要求' }]" |
| | | > |
| | | <ProFormRadio |
| | | v-model="form.genderLimit" |
| | | :value-enum="EnumUserGenderTextForEdit" |
| | | show-all-btn |
| | | :all-btn-label="'不限'" |
| | | :allBtnValue="0" |
| | | ></ProFormRadio> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 label="资格证书:" prop="credentialLimits"> |
| | | <el-checkbox |
| | | v-if="!isDetail" |
| | | v-model="state.checkCertificatesAll" |
| | | style="margin-right: 30px" |
| | | :indeterminate="state.isCertificatesIndeterminate" |
| | | @change="handleCheckCertificatesAllChange" |
| | | >全选</el-checkbox |
| | | > |
| | | <template #extra> |
| | | <div class="form-input-separator">男性</div> |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | :min="0" |
| | | v-model="form.manNumber" |
| | | placeholder="请输入" |
| | | disabled |
| | | ></ProFormInputNumber> |
| | | <div class="form-input-separator">女性</div> |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | :min="0" |
| | | v-model="form.womanNumber" |
| | | placeholder="请输入" |
| | | disabled |
| | | ></ProFormInputNumber> |
| | | </template> |
| | | </RadioWithExtra> |
| | | <ProFormCheckbox |
| | | v-model="form.credentialLimits" |
| | | :value-enum="certificateTypeList" |
| | | @change="handleCheckedCertificatesServicesChange" |
| | | ></ProFormCheckbox> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="任务地点:" |
| | | prop="weMapInfo" |
| | | :check-rules="[ |
| | | { message: '请选择任务地点', validator: FormValidator.validatorWeMap }, |
| | | ]" |
| | | > |
| | | <WeMap v-if="!isDetail" v-model="form.weMapInfo" /> |
| | | <div v-else> |
| | | {{ |
| | | `${form.weMapInfo.provinceName ?? ''}${form.weMapInfo.cityName ?? ''}${ |
| | | form.weMapInfo.addressName ?? '' |
| | | }` |
| | | }} |
| | | </div> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="详细地址:" |
| | | prop="addressDetail" |
| | | :check-rules="[{ message: '请输入详细地址' }]" |
| | | > |
| | | <ProFormText v-model.trim="form.addressDetail" placeholder="请输入详细地址" /> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="任务时间:" |
| | | prop="time" |
| | | :check-rules="[{ message: '请选择任务时间', type: 'array' }]" |
| | | > |
| | | <ProFormDatePicker |
| | | v-model="form.time" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | ></ProFormDatePicker> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | |
| | | ProFormText, |
| | | ProFormInputNumber, |
| | | ProFormRadio, |
| | | ProFormDatePicker, |
| | | ProFormCheckbox, |
| | | } from '@bole-core/components'; |
| | | import { FormInstance } from 'element-plus'; |
| | | import { FormInstance, ModelValueType } from 'element-plus'; |
| | | import { Message } from '@bole-core/core'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import { useGlobalEventContext, useRouteView } from '@/hooks'; |
| | | import * as flexTaskServices from '@/services/api/FlexTask'; |
| | | import * as taskServices from '@/services/api/task'; |
| | | import { |
| | | EnumUserGenderTextForEdit, |
| | | EnumBillingMethodText, |
| | | EnumBillingMethodUnitText, |
| | | EnumSettlementCycleText, |
| | | } from '@/constants'; |
| | | import { format, FormValidator } from '@/utils'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'AddOrEditEmploymentView', |
| | |
| | | const eventContext = useGlobalEventContext(); |
| | | |
| | | const { closeViewPush } = useRouteView(); |
| | | const { dictionaryDataList: welfareList } = useDictionaryDataSelect({ |
| | | categoryCode: CategoryCode.Welfare, |
| | | }); |
| | | const { dictionaryDataList: certificateTypeList } = useDictionaryDataSelect({ |
| | | categoryCode: CategoryCode.CertificateType, |
| | | }); |
| | | |
| | | const state = reactive({ |
| | | checkBenefitsAll: false, |
| | | isBenefitsIndeterminate: false, |
| | | |
| | | checkCertificatesAll: false, |
| | | isCertificatesIndeterminate: false, |
| | | }); |
| | | |
| | | const form = reactive({ |
| | | name: '', |
| | | salaryType: 1, |
| | | ageStart: 0, |
| | | ageEnd: 0, |
| | | sexRequirement: 1, |
| | | manNumber: 0, |
| | | womanNumber: 0, |
| | | billingMethod: '' as any as EnumBillingMethod, |
| | | serviceFee: 0, |
| | | settlementCycle: '' as any as EnumSettlementCycle, |
| | | benefits: [] as string[], |
| | | ageMinLimit: 0, |
| | | ageMaxLimit: 0, |
| | | genderLimit: 0 as any as EnumUserGender, |
| | | credentialLimits: [] as string[], |
| | | time: [] as unknown as ModelValueType, |
| | | weMapInfo: {} as WeMapModel, |
| | | addressDetail: '', |
| | | }); |
| | | |
| | | const { isLoading } = useQuery({ |
| | | queryKey: ['flexTaskServices/getFlexTaskDetail', id], |
| | | queryKey: ['taskServices/getTaskInfo', id], |
| | | queryFn: async () => { |
| | | return await flexTaskServices.getFlexTaskDetail( |
| | | return await taskServices.getTaskInfo( |
| | | { id: id }, |
| | | { |
| | | showLoading: false, |
| | | } |
| | | ); |
| | | }, |
| | | placeholderData: () => ({} as API.GetTaskInfoQueryResult), |
| | | onSuccess(data) { |
| | | form.name = data.taskName; |
| | | form.name = data.name; |
| | | form.billingMethod = data.billingMethod; |
| | | form.serviceFee = data.serviceFee; |
| | | form.settlementCycle = data.settlementCycle; |
| | | form.benefits = data.benefits?.map((x) => x.benefitCode) ?? []; |
| | | form.ageMinLimit = data.ageMinLimit; |
| | | form.ageMaxLimit = data.ageMaxLimit; |
| | | form.genderLimit = data.genderLimit; |
| | | form.credentialLimits = data.credentialLimits?.map((x) => x.typeCode) ?? []; |
| | | form.time = [ |
| | | format(data.beginTime, 'YYYY-MM-DD 00:00:00'), |
| | | format(data.endTime, 'YYYY-MM-DD 23:59:59'), |
| | | ]; |
| | | form.weMapInfo = { |
| | | latitude: data.latitude, |
| | | longitude: data.longitude, |
| | | provinceName: data.provinceContent, |
| | | cityName: data.cityContent, |
| | | provinceCode: data.provinceCode, |
| | | cityCode: data.cityCode, |
| | | addressName: data.addressName, |
| | | }; |
| | | form.addressDetail = data.addressDetail; |
| | | }, |
| | | enabled: isEdit, |
| | | }); |
| | | |
| | | function handleBack() { |
| | | closeViewPush(route, { |
| | | name: 'EmploymentManageList', |
| | | name: 'TaskManageList', |
| | | }); |
| | | } |
| | | const productFormRef = ref<FormInstance>(); |
| | |
| | | } |
| | | async function submit() { |
| | | try { |
| | | let params = {}; |
| | | let res; |
| | | console.log('form.weMapInfo: ', form.weMapInfo); |
| | | let params: API.SaveTaskInfoCommand = { |
| | | name: form.name, |
| | | billingMethod: form.billingMethod, |
| | | serviceFee: form.serviceFee, |
| | | settlementCycle: form.settlementCycle, |
| | | 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.time[0]).format('YYYY-MM-DD 00:00:00'), |
| | | endTime: dayjs(form.time[1]).format('YYYY-MM-DD 23:59:59'), |
| | | }; |
| | | if (isEdit) { |
| | | params.id = id; |
| | | } |
| | | let res = await taskServices.saveTaskInfo(params); |
| | | if (res) { |
| | | Message.successMessage('操作成功'); |
| | | eventContext.emit(isEdit ? 'employment:edit' : 'employment:add'); |
| | | eventContext.emit(isEdit ? 'taskManage:edit' : 'taskManage:add'); |
| | | handleBack(); |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleCheckBenefitsAllChange(val: boolean) { |
| | | form.benefits = val |
| | | ? welfareList.value.map((item) => { |
| | | return item.value; |
| | | }) |
| | | : []; |
| | | state.isBenefitsIndeterminate = false; |
| | | } |
| | | |
| | | function handleCheckedBenefitsServicesChange(value: string[]) { |
| | | const checkedCount = value.length; |
| | | state.checkBenefitsAll = checkedCount === welfareList.value.length; |
| | | state.isBenefitsIndeterminate = checkedCount > 0 && checkedCount < welfareList.value.length; |
| | | } |
| | | |
| | | function handleCheckCertificatesAllChange(val: boolean) { |
| | | form.credentialLimits = val |
| | | ? certificateTypeList.value.map((item) => { |
| | | return item.value; |
| | | }) |
| | | : []; |
| | | state.isCertificatesIndeterminate = false; |
| | | } |
| | | |
| | | function handleCheckedCertificatesServicesChange(value: string[]) { |
| | | const checkedCount = value.length; |
| | | state.checkCertificatesAll = checkedCount === certificateTypeList.value.length; |
| | | state.isCertificatesIndeterminate = |
| | | checkedCount > 0 && checkedCount < certificateTypeList.value.length; |
| | | } |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | @use '@/style/common.scss' as *; |
| | | |
| | | :deep() { |
| | | .radio-with-input-extra-wrapper { |
| | | display: flex; |
| | | } |
| | | |
| | | .form-age-range { |
| | | .pro-from-item-read-content-wrapper { |
| | | width: auto; |
| | | } |
| | | } |
| | | } |
| | | </style> |