From 705139a4cb5a6e99377b31e056de61dc4bfecf2e Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期三, 03 十二月 2025 15:06:22 +0800
Subject: [PATCH] Merge branch 'dev-1.3.0.4' of http://120.26.58.240:8888/r/flexJobMiniApp into dev-1.3.0.4
---
packages/hooks/index.ts | 1
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue | 20 ++++
packages/hooks/dialog.ts | 84 +++++++++++++++++++++
packages/components/src/Task/TaskDetailView.vue | 7 +
apps/bMiniApp/src/styles/nut.scss | 21 +++++
apps/cMiniApp/project.private.config.json | 7 +
apps/bMiniApp/project.private.config.json | 7 +
apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue | 57 ++++++++++++++
8 files changed, 201 insertions(+), 3 deletions(-)
diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index 571984f..bf03b5e 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/apps/bMiniApp/project.private.config.json
@@ -23,6 +23,13 @@
"miniprogram": {
"list": [
{
+ "name": "鐏靛伐璇︽儏",
+ "pathName": "subpackages/flexJob/flexJobDetailFromTask/flexJobDetailFromTask",
+ "query": "enterpriseEmployeeId=304f7e38-b973-478c-88aa-08ddf02e3176&id=ddecb887-8273-449b-6bcd-08de20009bf4&taskInfoId=ec3f301e-fa95-47a1-b8ee-08de1da3c153",
+ "scene": null,
+ "launchMode": "default"
+ },
+ {
"name": "寰呴獙鏀�-楠屾敹璇︽儏",
"pathName": "subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail",
"query": "id=546401cc-c148-47d0-c647-08de1e75af01&date=2025-11-28&taskInfoId=5a22c18b-0b49-4540-6658-08de1da80d7c",
diff --git a/apps/bMiniApp/src/styles/nut.scss b/apps/bMiniApp/src/styles/nut.scss
index df1482f..3d3b4e1 100644
--- a/apps/bMiniApp/src/styles/nut.scss
+++ b/apps/bMiniApp/src/styles/nut.scss
@@ -195,4 +195,25 @@
object-fit: cover;
}
}
+
+ .dialog-form-wrapper {
+ width: 600px;
+
+ .dialog-form-footer {
+ padding: 10px 20px;
+ text-align: center;
+
+ .nut-button--plain {
+ border-width: 1px;
+ }
+
+ .nut-button {
+ min-width: 100px;
+ }
+
+ .nut-button + .nut-button {
+ margin-left: 20px;
+ }
+ }
+ }
}
diff --git a/apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue b/apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue
new file mode 100644
index 0000000..8cf6f9d
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue
@@ -0,0 +1,57 @@
+<template>
+ <nut-popup v-model:visible="visible">
+ <div class="dialog-form-wrapper">
+ <nut-form :model-value="form" ref="formRef" label-position="top">
+ <nut-form-item
+ label="璋㈢粷鍘熷洜:"
+ class="bole-form-item alignTop"
+ prop="remark"
+ label-width="90px"
+ >
+ <nut-textarea v-model="form.remark" rows="4" placeholder="璇疯緭鍏ヨ阿缁濆師鍥�"> </nut-textarea>
+ </nut-form-item>
+ </nut-form>
+ <div class="dialog-form-footer">
+ <nut-button @click="visible = false" plain>鍙栨秷</nut-button>
+ <nut-button type="primary" @click="handleConfirm">纭</nut-button>
+ </div>
+ </div>
+ </nut-popup>
+</template>
+
+<script setup lang="ts">
+defineOptions({
+ name: 'RefuseDialog',
+});
+
+type Form = {
+ remark: string;
+};
+
+const form = defineModel<Form>('form');
+
+const visible = defineModel<boolean>();
+
+const emit = defineEmits<{
+ (e: 'onConfirm'): void;
+}>();
+
+const formRef = ref<any>(null);
+
+function handleConfirm() {
+ if (!formRef.value) return;
+ formRef.value.validate().then(({ valid, errors }: any) => {
+ if (valid) {
+ emit('onConfirm');
+ }
+ });
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.payroll-form-wrapper {
+ width: 600px;
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
index 0f06f1f..c406a5f 100644
--- a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
@@ -29,7 +29,7 @@
<PageFooterBtn
type="primary"
plain
- @click="setTaskUserHire(EnumTaskUserHireStatus.Refuse)"
+ @click="handleAdd()"
v-if="taskUserHireStatusResult.hireStatus === EnumTaskUserHireStatus.Wait"
>璋㈢粷</PageFooterBtn
>
@@ -44,6 +44,7 @@
>
</template>
</JobDetailContent>
+ <RefuseDialog v-bind="dialogProps" />
</LoadingLayout>
</template>
@@ -52,8 +53,9 @@
import { useQuery } from '@tanstack/vue-query';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import { Message } from '@12333/utils';
-import { useUserResume } from '@12333/hooks';
+import { useUserResume, useFormDialog } from '@12333/hooks';
import { EnumTaskUserHireStatus } from '@12333/constants';
+import RefuseDialog from '../components/RefuseDialog.vue';
defineOptions({
name: 'InnerPage',
@@ -81,11 +83,23 @@
placeholderData: () => ({} as API.GetTaskUserHireStatusQueryResult),
});
-async function setTaskUserHire(hireStatus: EnumTaskUserHireStatus) {
+const { dialogProps, handleAdd, editForm } = useFormDialog({
+ onConfirm: handleRefuse,
+ defaultFormParams: {
+ remark: '',
+ },
+});
+
+async function handleRefuse() {
+ setTaskUserHire(EnumTaskUserHireStatus.Refuse, editForm.remark);
+}
+
+async function setTaskUserHire(hireStatus: EnumTaskUserHireStatus, remark?: string) {
try {
let params: API.SetTaskUserHireCommand = {
id: id,
hireStatus: hireStatus,
+ hireRemark: remark,
};
let res = await taskUserServices.setTaskUserHire(params);
if (res) {
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index 527d115..f5fcb61 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -23,6 +23,13 @@
"miniprogram": {
"list": [
{
+ "name": "浠诲姟璇︽儏-璋㈢粷",
+ "pathName": "subpackages/task/taskDetail/taskDetail",
+ "query": "id=bbc3f370-5c4f-417e-1999-08de316fce01&from=sign",
+ "scene": null,
+ "launchMode": "default"
+ },
+ {
"name": "鏀跺叆璇︽儏",
"pathName": "subpackages/wallet/incomeDetailInfo/incomeDetailInfo",
"query": "id=7899c603-f237-4505-949d-08de234155c4",
diff --git a/packages/components/src/Task/TaskDetailView.vue b/packages/components/src/Task/TaskDetailView.vue
index 1ab8f87..1300dd0 100644
--- a/packages/components/src/Task/TaskDetailView.vue
+++ b/packages/components/src/Task/TaskDetailView.vue
@@ -31,6 +31,12 @@
</div>
</div>
</Cell>
+ <Cell
+ title="璋㈢粷鍘熷洜"
+ v-if="detail?.hireRemark && detail.hireStatus === EnumTaskUserHireStatus.Refuse"
+ >
+ <div class="safe-cell-content">{{ detail?.hireRemark ?? '' }}</div>
+ </Cell>
<Cell :show-title="false">
<CellChunk title="绂忓埄淇℃伅">
<div class="taskDetail-welfare-list">
@@ -85,6 +91,7 @@
EnumSettlementCycleText,
EnumTaskReleaseStatus,
BillingMethodEnumUnit,
+ EnumTaskUserHireStatus,
} from '@12333/constants';
import { TaskUtils, toThousand, setOSSLink, Message } from '@12333/utils';
import Taro from '@tarojs/taro';
diff --git a/packages/hooks/dialog.ts b/packages/hooks/dialog.ts
new file mode 100644
index 0000000..51447c1
--- /dev/null
+++ b/packages/hooks/dialog.ts
@@ -0,0 +1,84 @@
+import { computed, reactive } from 'vue';
+import { cloneDeep } from 'lodash';
+
+type UseDialogOptions = {
+ onConfirm?: (...args: any) => Promise<any>;
+ closeAfterConfirm?: boolean;
+};
+
+export function useDialog(options: UseDialogOptions = {}) {
+ const { onConfirm, closeAfterConfirm = true } = options;
+
+ const dialogState = reactive({
+ dialogVisible: false,
+ });
+
+ function onUpdateModelValue(value: boolean) {
+ dialogState.dialogVisible = value;
+ }
+
+ async function handleConfirm(...args: any) {
+ await onConfirm?.(...args);
+ if (closeAfterConfirm) {
+ dialogState.dialogVisible = false;
+ }
+ }
+
+ const dialogProps = computed(() => ({
+ modelValue: dialogState.dialogVisible,
+ ['onUpdate:modelValue']: onUpdateModelValue,
+ onOnConfirm: handleConfirm,
+ }));
+
+ return {
+ dialogProps,
+ dialogState,
+ };
+}
+
+export type FormParams = {};
+
+type UseFormDialogOptions<TFormParams extends FormParams> = UseDialogOptions & {
+ defaultFormParams: TFormParams;
+};
+
+export function useFormDialog<TFormParams extends FormParams>(
+ options: UseFormDialogOptions<TFormParams>
+) {
+ const { onConfirm, closeAfterConfirm = true, defaultFormParams } = options;
+ const { dialogProps, dialogState } = useDialog({ onConfirm, closeAfterConfirm });
+
+ const editForm = reactive(cloneDeep(defaultFormParams));
+
+ function handleAdd(extraParams: Partial<TFormParams> = {}) {
+ Object.assign(editForm, cloneDeep(defaultFormParams), {
+ ...extraParams,
+ });
+ dialogState.dialogVisible = true;
+ }
+
+ function handleEdit(data: Omit<TFormParams, 'title'>) {
+ Object.assign(editForm, cloneDeep(defaultFormParams), {
+ ...data,
+ });
+ dialogState.dialogVisible = true;
+ }
+
+ function onUpdateForm(value: TFormParams) {
+ Object.assign(editForm, value);
+ }
+
+ const formDialogProps = computed(() => ({
+ ...dialogProps.value,
+ form: editForm,
+ ['onUpdate:form']: onUpdateForm,
+ }));
+
+ return {
+ dialogProps: formDialogProps,
+ dialogState,
+ editForm,
+ handleAdd,
+ handleEdit,
+ };
+}
diff --git a/packages/hooks/index.ts b/packages/hooks/index.ts
index d03ed55..942be90 100644
--- a/packages/hooks/index.ts
+++ b/packages/hooks/index.ts
@@ -9,3 +9,4 @@
export * from './taskUser';
export * from './user';
export * from './payrollChange';
+export * from './dialog';
--
Gitblit v1.9.1