From ba48054b6f2680cfa1a0b3b912880925a8b5861b Mon Sep 17 00:00:00 2001 From: zhengyiming <540361168@qq.com> Date: 星期三, 13 八月 2025 15:33:47 +0800 Subject: [PATCH] fix: 验收管理 --- apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue | 304 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 246 insertions(+), 58 deletions(-) diff --git a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue index e30e4ca..6019fdc 100644 --- a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue +++ b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue @@ -6,99 +6,134 @@ </nut-form-item> <nut-form-item label="鏈嶅姟璐�:" - class="bole-form-item" - prop="salaryTimeType" + class="bole-form-item alignTop" + prop="billingMethod" required label-width="90px" + label-position="top" > - <nut-radio-group v-model="form.salaryTimeType" direction="horizontal"> - <BlRadio :label="Number(key)" v-for="(val, key) in SalaryTimeTypeEnumText" :key="key">{{ + <nut-radio-group v-model="form.billingMethod" direction="horizontal"> + <BlRadio :label="Number(key)" v-for="(val, key) in EnumBillingMethodText" :key="key">{{ val }}</BlRadio> </nut-radio-group> </nut-form-item> - <nut-form-item label=" " class="bole-form-item" prop="welfare" label-width="90px"> + <nut-form-item label=" " class="bole-form-item" prop="serviceFee" label-width="0"> <div class="bole-form-input-wrapper"> - <nut-input - v-model.trim="form.welfare" + <NumberInput + v-model.trim="form.serviceFee" class="nut-input-text bole-input-text" placeholder="璇疯緭鍏ユ湇鍔¤垂" - type="text" + :min="0" /> - <div class="form-input-unit">{{ SalaryTimeTypeEnumUnit[form.salaryTimeType] }}</div> + <div class="form-input-unit">{{ BillingMethodEnumUnit[form.billingMethod] }}</div> </div> </nut-form-item> <nut-form-item label="缁撶畻鏂瑰紡:" class="bole-form-item" - prop="salaryType" + prop="settleType" required label-width="90px" > - <nut-radio-group v-model="form.salaryType" direction="horizontal"> - <BlRadio :label="Number(key)" v-for="(val, key) in SalaryTypeText">{{ val }}</BlRadio> + <nut-radio-group v-model="form.settlementCycle" direction="horizontal"> + <BlRadio :label="Number(key)" v-for="(val, key) in EnumSettlementCycleText" :key="key">{{ + val + }}</BlRadio> </nut-radio-group> </nut-form-item> - <nut-form-item label="绂忓埄:" class="bole-form-item" prop="welfare" label-width="90px"> - <ChooseInputWithPicker - v-model="form.welfare" + <nut-form-item label="绂忓埄:" class="bole-form-item" prop="benefits" label-width="90px"> + <ChooseInputWithCheckbox + v-model="form.benefits" + title="璇烽�夋嫨绂忓埄" + :columns="WelfareTypeList" placeholder="璇烽�夋嫨绂忓埄" - :value-enum="TaskStatusText" /> </nut-form-item> <nut-form-item label="骞撮緞鑼冨洿:" class="bole-form-item" - prop="ageStart" + prop="ageMinLimit" required label-width="90px" > <div class="bole-form-input-wrapper"> <NumberInput - v-model.trim="form.ageStart" + v-model.trim="form.ageMinLimit" class="nut-input-text bole-input-text" placeholder="璇烽�夋嫨骞撮緞鑼冨洿" :min="1" /> <div class="form-input-separator">鑷�</div> <NumberInput - v-model.trim="form.ageEnd" + v-model.trim="form.ageMaxLimit" class="nut-input-text bole-input-text" placeholder="璇烽�夋嫨骞撮緞鑼冨洿" :min="1" /> </div> </nut-form-item> - <nut-form-item label="鎬у埆:" class="bole-form-item" prop="welfare" label-width="90px"> + <nut-form-item + label="鎬у埆瑕佹眰:" + class="bole-form-item" + prop="genderLimit" + label-width="90px" + required + > <ChooseInputWithPicker - v-model="form.welfare" + v-model="form.genderLimit" placeholder="璇烽�夋嫨鎬у埆瑕佹眰" - :value-enum="TaskStatusText" + :value-enum="EnumUserGenderTextOptions" /> </nut-form-item> - <nut-form-item label="璧勬牸璇佷功:" class="bole-form-item" prop="welfare" label-width="90px"> - <ChooseInputWithPicker - v-model="form.welfare" - placeholder="璇烽�夋嫨瑕佹眰鐨勮祫鏍艰瘉涔�" - :value-enum="TaskStatusText" + <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="浠诲姟鍦扮偣" class="bole-form-item" prop="weMapInfo" required> - <ChooseLocationInput placeholder="璇烽�夋嫨浠诲姟鎵�鍦ㄥ湴" v-model="form.weMapInfo" /> + <ChooseLocationInput placeholder="璇烽�夋嫨浠诲姟鍦扮偣" v-model="form.weMapInfo" /> + <!-- <ChooseInputWithAreaPicker + :columns="areaTreeList" + v-model="form.areaList" + placeholder="璇烽�夋嫨鎵�鍦ㄥ湴鍖�" + ></ChooseInputWithAreaPicker> --> </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 + label="璇︾粏鍦板潃:" + class="bole-form-item" + prop="addressDetail" + label-width="90px" + required + > + <nut-input v-model="form.addressDetail" placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"> </nut-input> </nut-form-item> <nut-form-item label="浠诲姟寮�濮嬫棩鏈�:" class="bole-form-item" - prop="startDate" + prop="beginTime" label-width="90px" > - <ChooseInputWithDatePicker v-model="form.startDate"></ChooseInputWithDatePicker> + <ChooseInputWithDatePicker + v-model="form.beginTime" + :minDate="nowDate" + placeholder="璇烽�夋嫨浠诲姟寮�濮嬫棩鏈�" + ></ChooseInputWithDatePicker> </nut-form-item> - <nut-form-item label="浠诲姟缁撴潫鏃ユ湡:" class="bole-form-item" prop="endDate" label-width="90px"> - <ChooseInputWithDatePicker v-model="form.endDate"></ChooseInputWithDatePicker> + <nut-form-item label="浠诲姟缁撴潫鏃ユ湡:" class="bole-form-item" prop="endTime" label-width="90px"> + <ChooseInputWithDatePicker + v-model="form.endTime" + :minDate="nowDate" + placeholder="璇烽�夋嫨浠诲姟缁撴潫鏃ユ湡" + ></ChooseInputWithDatePicker> </nut-form-item> </nut-form> </ContentScrollView> @@ -109,71 +144,184 @@ </template> <script setup lang="ts"> -import { - TaskStatus, - TaskStatusText, - SalaryTypeText, - SalaryType, - SalaryTimeTypeEnum, - SalaryTimeTypeEnumText, - SalaryTimeTypeEnumUnit, -} from '@/constants/task'; import { useUser } from '@/hooks'; +import { + CategoryCode, + EnumBillingMethod, + EnumSettlementCycle, + EnumUserGender, + EnumBillingMethodText, + EnumUserGenderText, + EnumSettlementCycleText, + BillingMethodEnumUnit, + EnumUserGenderTextOptions, +} from '@12333/constants'; import { ChooseInputWithPicker, ChooseInputWithDatePicker, NumberInput, ChooseLocationInput, Radio as BlRadio, + ChooseInputWithAreaPicker, + ChooseInputWithCheckbox, } from '@12333/components'; -import { FormValidator } from '@12333/utils'; +import { FormValidator, Message } from '@12333/utils'; +import * as flexWorkerServices from '@12333/services/api/FlexWorker'; +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 } from '@12333/hooks'; +import { useQuery } from '@tanstack/vue-query'; +import dayjs from 'dayjs'; defineOptions({ name: 'InnerPage', }); const { userDetail } = useUser(); +const { findAreaNameFromCode } = useAllAreaList(); +const router = Taro.useRouter(); +const taskId = router.params?.taskId ?? ''; +const isEdit = !!taskId; +const isCopy = router.params?.isCopy === 'true'; +console.log('isCopy: ', router.params?.isCopy); + +const nowDate = dayjs().toDate(); + +const { dictionaryDataList: WelfareTypeList } = useDictionaryDataSelect({ + categoryCode: CategoryCode.Welfare, +}); +const { dictionaryDataList: CertificateTypeList } = useDictionaryDataSelect({ + categoryCode: CategoryCode.CertificateType, +}); const form = reactive({ name: '', - welfare: TaskStatus.All, - salaryTimeType: SalaryTimeTypeEnum.Month, - salaryType: SalaryType.month, - startDate: '', - endDate: '', - ageStart: '', - ageEnd: '', + billingMethod: EnumBillingMethod.Month, + serviceFee: '' as any as number, + settlementCycle: EnumSettlementCycle.Month, + benefits: [] as string[], + ageMinLimit: '' as any as number, + ageMaxLimit: '' as any as number, + genderLimit: 0 as any as EnumUserGender, + credentialLimits: [] as string[], + // address: '', + beginTime: '', + endTime: '', + // areaList: [] as number[], + weMapInfo: {} as WeMapModel, + addressDetail: '', }); const rules = reactive<FormRules>({ name: [{ required: true, message: '璇疯緭鍏ヤ换鍔″悕绉�' }], - + genderLimit: [{ required: true, message: '璇烽�夋嫨鎬у埆瑕佹眰' }], + addressDetail: [{ required: true, message: '璇疯緭鍏ヨ缁嗗湴鍧�' }], + billingMethod: [ + { + required: true, + message: '璇烽�夋嫨鏀惰垂鏂瑰紡', + validator: () => { + if (!form.billingMethod) { + return Promise.reject('璇烽�夋嫨鏈嶅姟璐圭被鍨�'); + } + if (!form.serviceFee) { + return Promise.reject('璇疯緭鍏ユ湇鍔¤垂'); + } + return Promise.resolve(true); + }, + }, + ], weMapInfo: [ { required: true, message: '璇疯缃伐浣滃湴鐐�', validator: FormValidator.validatorWeMap }, ], + // areaList: [ + // { required: true, message: '璇锋坊鍔犲伐浣滃湴鐐�', validator: FormValidator.validatorArray }, + // ], - ageStart: [ + ageMinLimit: [ { required: true, message: '璇疯緭鍏ュ勾榫勮姹�', validator: () => { - if (!form.ageStart) { + if (!form.ageMinLimit && form.ageMinLimit > 0) { return Promise.reject('璇疯緭鍏ュ勾榫勮姹�'); } - if (!form.ageEnd) { + if (!form.ageMaxLimit && form.ageMaxLimit > 0) { return Promise.reject('璇疯緭鍏ュ勾榫勮姹�'); } - if (Number(form.ageEnd) <= Number(form.ageStart)) { + 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 (!dayjs(value).isAfter(dayjs(form.beginTime))) + return Promise.reject('缁撴潫鏃ユ湡闇�澶т簬寮�濮嬫棩鏈�'); + return Promise.resolve(true); + }, + }, + ], }); + +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.name = data.name; + form.billingMethod = data.billingMethod; + form.serviceFee = data.serviceFee; + form.settlementCycle = data.settlementCycle; + 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, + }; + }, +}); + const formRef = ref<any>(null); function handleConfirm() { if (!formRef.value) return; @@ -184,10 +332,46 @@ }); } -function confirm() {} +async function confirm() { + try { + 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.beginTime).format('YYYY-MM-DD 00:00:00'), + endTime: dayjs(form.endTime).format('YYYY-MM-DD 23:59:59'), + }; + if (isEdit) { + params.id = taskId; + } + if (isCopy) { + params.id = ''; + } + let res = await taskServices.saveTaskInfo(params); + if (res) { + Message.success(isEdit ? '缂栬緫鎴愬姛' : '鍙戝竷鎴愬姛', { + onClosed() { + goBack(); + }, + }); + } + } catch (error) {} +} function handleCancel() { - Taro.navigateBack(); + goBack(); } </script> @@ -205,5 +389,9 @@ color: boleGetCssVar('text-color', 'primary'); flex-shrink: 0; } + + .form-input-separator { + margin-right: 10px; + } } </style> -- Gitblit v1.9.1