wupengfei
2025-12-03 705139a4cb5a6e99377b31e056de61dc4bfecf2e
Merge branch 'dev-1.3.0.4' of http://120.26.58.240:8888/r/flexJobMiniApp into dev-1.3.0.4
6个文件已修改
2个文件已添加
204 ■■■■■ 已修改文件
apps/bMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/styles/nut.scss 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Task/TaskDetailView.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/dialog.ts 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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;
      }
    }
  }
}
apps/bMiniApp/src/subpackages/flexJob/components/RefuseDialog.vue
New file
@@ -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>
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) {
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",
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';
packages/hooks/dialog.ts
New file
@@ -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,
  };
}
packages/hooks/index.ts
@@ -9,3 +9,4 @@
export * from './taskUser';
export * from './user';
export * from './payrollChange';
export * from './dialog';