zhengyiming
2025-12-02 04a8dacfa291441b55df5ff5ee14c4ba6ec8191d
fix: 谢绝
9个文件已修改
2个文件已添加
342 ■■■■ 已修改文件
apps/bMiniApp/project.private.config.json 11 ●●●● 补丁 | 查看 | 原始文档 | 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/constants/apiEnum.ts 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/dialog.ts 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/syncDatabase.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/project.private.config.json
@@ -23,11 +23,18 @@
        "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",
                    "scene": null,
                    "launchMode": "default"
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "报名列表",
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/constants/apiEnum.ts
@@ -429,36 +429,38 @@
  CommonServerSmsUtils = 10,
  /**配置 */
  CommonServerSettings = 11,
  /**已读 */
  CommonServerReadRecord = 12,
  /**用户认证 */
  UserServerAuth = 12,
  UserServerAuth = 13,
  /**用户菜单 */
  UserServerMenu = 13,
  UserServerMenu = 14,
  /**用户资源 */
  UserServerResource = 14,
  UserServerResource = 15,
  /**用户角色 */
  UserServerRole = 15,
  UserServerRole = 16,
  /**用户信息 */
  UserServerUser = 16,
  UserServerUser = 17,
  /**用户钱包 */
  UserServerUserWallet = 17,
  UserServerUserWallet = 18,
  /**电子签 */
  UserServerElectronSign = 18,
  UserServerElectronSign = 19,
  /**用户简历 */
  UserServerUserResume = 19,
  UserServerUserResume = 20,
  /**企业信息 */
  UserServerEnterprise = 20,
  UserServerEnterprise = 21,
  /**企业钱包 */
  UserServerEnterpriseWallet = 21,
  UserServerEnterpriseWallet = 22,
  /**企业合作钱包 */
  UserServerEnterpriseCooperationWallet = 22,
  UserServerEnterpriseCooperationWallet = 23,
  /**灵工信息 */
  UserServerEnterpriseEmployee = 23,
  UserServerEnterpriseEmployee = 24,
  /**电子签 */
  ElectronSignServerElectronSign = 24,
  ElectronSignServerElectronSign = 25,
  /**短信 */
  ToolServerSms = 25,
  ToolServerSms = 26,
  /**小程序 */
  ToolServerWxmp = 26,
  ToolServerWxmp = 27,
}
/** 资源请求方式 */
@@ -639,6 +641,8 @@
  Pass = 20,
  /**已谢绝 */
  Refuse = 30,
  /**已取消 */
  Cancel = 40,
}
/** 任务用户签约状态 */
@@ -895,22 +899,6 @@
  VERIFY_FAIL = 1,
  /**验证中,商户可发起提现尝试 */
  VERIFYING = 2,
}
/** 微信小程序订阅消息模板 */
export enum EnumWxmpSubscribMessageTemplate {
  /**支付成功提醒  结算完成后向承揽端管理员推送 */
  SettlementCompletedToSupplier = 0,
  /**报酬结算审核结果通知  甲方结算确认后向承揽端管理员推送 */
  SettlementAuditCompletedToSupplier = 1,
  /**工资发放通知  结算完成后向C端人员通知 */
  SettlementReceiveCompletedToUser = 2,
  /**报名录用结果通知  被录用后向C端人员通知 */
  HireCompletedToUser = 3,
  /**排班成功通知  排班后向C端人员通知 */
  ArrangeCompletedToUser = 4,
  /**测试 */
  Test = 5,
}
/** 我的报名分页列表-状态 */
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';
packages/services/apiV2/syncDatabase.ts
@@ -2,21 +2,6 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 同步数据库 POST /api/common/syncDatabase/sendWxmpSubscribMessage */
export async function sendWxmpSubscribMessage(
  body: API.SendWxmpSubscribMessageCommand,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/common/syncDatabase/sendWxmpSubscribMessage', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 同步数据库 POST /api/common/syncDatabase/syncDatabase */
export async function syncDatabase(body: API.SyncDatabaseCommand, options?: API.RequestConfig) {
  return request<number>('/api/common/syncDatabase/syncDatabase', {
packages/services/apiV2/typings.d.ts
@@ -1172,36 +1172,38 @@
    CommonServerSmsUtils = 10,
    /**配置 */
    CommonServerSettings = 11,
    /**已读 */
    CommonServerReadRecord = 12,
    /**用户认证 */
    UserServerAuth = 12,
    UserServerAuth = 13,
    /**用户菜单 */
    UserServerMenu = 13,
    UserServerMenu = 14,
    /**用户资源 */
    UserServerResource = 14,
    UserServerResource = 15,
    /**用户角色 */
    UserServerRole = 15,
    UserServerRole = 16,
    /**用户信息 */
    UserServerUser = 16,
    UserServerUser = 17,
    /**用户钱包 */
    UserServerUserWallet = 17,
    UserServerUserWallet = 18,
    /**电子签 */
    UserServerElectronSign = 18,
    UserServerElectronSign = 19,
    /**用户简历 */
    UserServerUserResume = 19,
    UserServerUserResume = 20,
    /**企业信息 */
    UserServerEnterprise = 20,
    UserServerEnterprise = 21,
    /**企业钱包 */
    UserServerEnterpriseWallet = 21,
    UserServerEnterpriseWallet = 22,
    /**企业合作钱包 */
    UserServerEnterpriseCooperationWallet = 22,
    UserServerEnterpriseCooperationWallet = 23,
    /**灵工信息 */
    UserServerEnterpriseEmployee = 23,
    UserServerEnterpriseEmployee = 24,
    /**电子签 */
    ElectronSignServerElectronSign = 24,
    ElectronSignServerElectronSign = 25,
    /**短信 */
    ToolServerSms = 25,
    ToolServerSms = 26,
    /**小程序 */
    ToolServerWxmp = 26,
    ToolServerWxmp = 27,
  }
  enum EnumResourceMethod {
@@ -1364,6 +1366,8 @@
    Pass = 20,
    /**已谢绝 */
    Refuse = 30,
    /**已取消 */
    Cancel = 40,
  }
  enum EnumTaskUserSignContractStatus {
@@ -1599,21 +1603,6 @@
    VERIFY_FAIL = 1,
    /**验证中,商户可发起提现尝试 */
    VERIFYING = 2,
  }
  enum EnumWxmpSubscribMessageTemplate {
    /**支付成功提醒  结算完成后向承揽端管理员推送 */
    SettlementCompletedToSupplier = 0,
    /**报酬结算审核结果通知  甲方结算确认后向承揽端管理员推送 */
    SettlementAuditCompletedToSupplier = 1,
    /**工资发放通知  结算完成后向C端人员通知 */
    SettlementReceiveCompletedToUser = 2,
    /**报名录用结果通知  被录用后向C端人员通知 */
    HireCompletedToUser = 3,
    /**排班成功通知  排班后向C端人员通知 */
    ArrangeCompletedToUser = 4,
    /**测试 */
    Test = 5,
  }
  interface ExportEnterpriseBalanceDetailsCommand {
@@ -4183,6 +4172,8 @@
    /** 最近验收时间 */
    lastCheckReceiveTime?: string;
    checkedStatus?: EnumGetCheckReceiveTasksQueryResultItemCheckStatus;
    /** 人员数量 */
    arrangeUserCount?: number;
  }
  interface GetCheckReceiveTaskUserSubmitCheckHistoriesQuery {
@@ -6244,8 +6235,6 @@
    code?: string;
    /** 任务名称 */
    taskName?: string;
    /** 任务单号 */
    taskCode?: string;
    /** 企业名称 */
    enterpriseName?: string;
    /** 结算日期 */
@@ -7060,6 +7049,8 @@
    status?: EnumTaskStatus;
    releaseStatus?: EnumTaskReleaseStatus;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用备注 */
    hireRemark?: string;
    /** 灵工Id */
    enterpriseEmployeeId?: string;
    applyButton?: GetTaskInfoQueryResultApplyButton;
@@ -8747,18 +8738,6 @@
    phoneNumber: string;
  }
  interface SendWxmpSubscribMessageCommand {
    /** 小程序编号 */
    wxmpCode: string;
    template: EnumWxmpSubscribMessageTemplate;
    /** 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转 */
    page?: string;
    /** 接收者(用户)的 openid */
    touser: string;
    /** 模板内容,格式形如{ "phrase3": { "value": "审核通过" }, "name1": { "value": "订阅" }, "date2": { "value": "2019-12-25 09:42" } } */
    data: any;
  }
  interface SetDictionaryDataIsDisabledCommand {
    ids?: string[];
    /** 是否已禁用 */
@@ -8835,6 +8814,8 @@
    /** 任务人员Id */
    id?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用备注 */
    hireRemark?: string;
  }
  enum SettlementReceiveStatus {