34个文件已修改
2个文件已添加
920 ■■■■ 已修改文件
apps/bMiniApp/.eslintrc-auto-import.json 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/auto-imports.d.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/constants/app.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/hooks/user.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/stores/modules/user.ts 1 ●●●● 补丁 | 查看 | 原始文档 | 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/bMiniApp/src/subpackages/login/authorization/authorization.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/login/loginByForm/accountLoginForm.vue 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/mine/setting/setting.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/batchTaskList/InnerPage.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/mine/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineHire/InnerPage.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineHired/InnerPage.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineSign/InnerPage.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/constants/app.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/hooks/user.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/stores/modules/user.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/login/authorization/authorization.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/login/loginByForm/accountLoginForm.vue 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/mine/setting/setting.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/TaskCard.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Task/TaskDetailView.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/dialog.ts 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/task.ts 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/auth.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/syncDatabase.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/task.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/.eslintrc-auto-import.json
@@ -125,6 +125,8 @@
    "DirectiveBinding": true,
    "MaybeRef": true,
    "MaybeRefOrGetter": true,
    "TabBarPageRouterList": true
    "TabBarPageRouterList": true,
    "APP_ENV": true,
    "NODE_ENV": true
  }
}
apps/bMiniApp/auto-imports.d.ts
@@ -5,6 +5,7 @@
// Generated by unplugin-auto-import
export {}
declare global {
  const APP_ENV: typeof import('./src/constants/app')['APP_ENV']
  const AppLocalConfig: typeof import('./src/constants/app')['AppLocalConfig']
  const BackType: typeof import('./src/constants/enum')['BackType']
  const EffectScope: typeof import('vue')['EffectScope']
@@ -29,6 +30,7 @@
  const EnumUserStatus: typeof import('./src/constants/apiEnum')['EnumUserStatus']
  const EnumUserType: typeof import('./src/constants/apiEnum')['EnumUserType']
  const HomeOrderType: typeof import('./src/hooks/task')['HomeOrderType']
  const NODE_ENV: typeof import('./src/constants/app')['NODE_ENV']
  const OssAssets: typeof import('./src/constants/img')['OssAssets']
  const RouterPath: typeof import('./src/constants/router')['RouterPath']
  const TabBarPageRouter: typeof import('./src/constants/tabBar')['TabBarPageRouter']
@@ -134,9 +136,11 @@
import { UnwrapRef } from 'vue'
declare module 'vue' {
  interface ComponentCustomProperties {
    readonly APP_ENV: UnwrapRef<typeof import('./src/constants/app')['APP_ENV']>
    readonly AppLocalConfig: UnwrapRef<typeof import('./src/constants/app')['AppLocalConfig']>
    readonly BackType: UnwrapRef<typeof import('./src/constants/enum')['BackType']>
    readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
    readonly NODE_ENV: UnwrapRef<typeof import('./src/constants/app')['NODE_ENV']>
    readonly OssAssets: UnwrapRef<typeof import('./src/constants/img')['OssAssets']>
    readonly RouterPath: UnwrapRef<typeof import('./src/constants/router')['RouterPath']>
    readonly TabBarPageRouter: UnwrapRef<typeof import('./src/constants/tabBar')['TabBarPageRouter']>
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",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "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/constants/app.ts
@@ -5,3 +5,6 @@
  clientType: EnumClientType.Wxmp,
  enterpriseType: EnumEnterpriseType.PartyA,
};
export const APP_ENV = process.env.APP_ENV;
export const NODE_ENV = process.env.NODE_ENV;
apps/bMiniApp/src/hooks/user.ts
@@ -19,12 +19,17 @@
    return userDetail.value?.enterpriseIsReal;
  });
  const isBindWechat = computed(() => {
    return userDetail.value?.bindWxmpId;
  });
  return {
    user: userInfo,
    userDetail: userDetail,
    updateUserInfo,
    isCertified,
    locationCity,
    isBindWechat,
  };
}
apps/bMiniApp/src/stores/modules/user.ts
@@ -139,6 +139,7 @@
    async loginByPassword(params: API.PasswordLoginCommand) {
      let res = await authServices.passwordLogin(
        {
          code: params.code,
          userName: params.userName,
          password: params.password,
          // password: md5Encrypt(params.password),
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/bMiniApp/src/subpackages/login/authorization/authorization.vue
@@ -60,7 +60,6 @@
import IconCaptcha from '@/assets/login/icon-btn-captcha.png';
import IconPassword from '@/assets/login/icon-btn-password.png';
import { LoginFormTabs } from '../constants';
import { subscribeMessageTemplateIdsForB } from '@12333/constants';
import * as authServices from '@12333/services/apiV2/auth';
defineOptions({
@@ -167,34 +166,12 @@
  } catch (error) {}
}
async function handleLoginSuccess() {
  try {
    if (!Taro.requestSubscribeMessage) {
      await Message.confirm({ message: '你的微信版本过低,不支持订阅消息,是否继续报名' });
    }
    const res = await Taro.getSetting({
      withSubscriptions: true,
    });
    let setting: boolean[] = [];
    if (res.subscriptionsSetting && res.subscriptionsSetting.itemSettings) {
      setting = subscribeMessageTemplateIdsForB
        .map((id) => res.subscriptionsSetting.itemSettings[id] !== 'accept')
        .filter(Boolean);
    }
    if (setting.length > 0) {
      Taro.requestSubscribeMessage({
        tmplIds: subscribeMessageTemplateIdsForB,
        success: function (res) {
          console.log('res: ', res);
        },
      });
    }
    Message.success('授权登录成功', {
      onClosed: () => {
        jump();
      },
    });
  } catch (error) {}
function handleLoginSuccess() {
  Message.success('授权登录成功', {
    onClosed: () => {
      jump();
    },
  });
}
function goLoginByForm(tab = LoginFormTabs.VerificationCodeLogin) {
apps/bMiniApp/src/subpackages/login/loginByForm/accountLoginForm.vue
@@ -1,32 +1,58 @@
<template>
  <div class="verification-code-login-form-wrapper">
    <nut-form class="verification-code-login-form" ref="formRef" :model-value="form" :rules="rules">
      <nut-form-item label="" class="bole-form-item" prop="userName" required>
        <nut-input
          v-model.trim="form.userName"
          class="bole-input-text"
          placeholder="请输入账号/手机号/邮箱"
          type="text"
        />
      </nut-form-item>
      <nut-form-item label="" class="bole-form-item" prop="userPassword" required>
        <nut-input
          v-model.trim="form.userPassword"
          class="bole-input-text"
          placeholder="请输入密码"
          :type="isShowPassword ? 'text' : 'password'"
          :key="isShowPassword ? 'text' : 'password'"
        >
          <template #right>
            <div class="password-icon-wrapper" @click="isShowPassword = !isShowPassword">
              <Eye v-if="isShowPassword"></Eye>
              <Marshalling v-else></Marshalling>
            </div>
          </template>
        </nut-input>
      </nut-form-item>
    </nut-form>
    <LargeButton class="login-btn" @click="handleLogin" :loading="form.loading">登录</LargeButton>
    <nut-button
      v-if="isAccount"
      type="primary"
      class="authorization-page-wechat-wrapper"
      @click="handleLoginByHasAccount"
    >
      <div class="authorization-page-wechat">手机号快速登录</div></nut-button
    >
    <template v-else>
      <nut-form
        class="verification-code-login-form"
        ref="formRef"
        :model-value="form"
        :rules="rules"
      >
        <nut-form-item label="" class="bole-form-item" prop="userName" required>
          <nut-input
            v-model.trim="form.userName"
            class="bole-input-text"
            placeholder="请输入账号/手机号/邮箱"
            type="text"
          />
        </nut-form-item>
        <nut-form-item label="" class="bole-form-item" prop="userPassword" required>
          <nut-input
            v-model.trim="form.userPassword"
            class="bole-input-text"
            placeholder="请输入密码"
            :type="isShowPassword ? 'text' : 'password'"
            :key="isShowPassword ? 'text' : 'password'"
          >
            <template #right>
              <div class="password-icon-wrapper" @click="isShowPassword = !isShowPassword">
                <Eye v-if="isShowPassword"></Eye>
                <Marshalling v-else></Marshalling>
              </div>
            </template>
          </nut-input>
        </nut-form-item>
      </nut-form>
      <LargeButton class="login-btn" @click="handleLogin" :loading="form.loading">登录</LargeButton>
    </template>
    <!-- <AccessOpenTypeButton
      type="primary"
      class="authorization-page-wechat-wrapper"
      open-type="getPhoneNumber"
      :access="policyChecked"
      @noAccess="noAccess"
      @getphonenumber="handleLogin"
    >
      <div class="authorization-page-wechat">登录</div>
    </AccessOpenTypeButton> -->
    <!-- <div class="go-register-btn" @click="goRegister">立即注册</div> -->
  </div>
</template>
@@ -39,6 +65,7 @@
import { useUserStore } from '@/stores/modules/user';
import { Eye, Marshalling } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import * as authServices from '@12333/services/apiV2/auth';
defineOptions({
  name: 'AccountLoginForm',
@@ -57,6 +84,8 @@
const isShowPassword = ref(false);
const formRef = ref(null);
const isAccount = ref(false);
const wxMiniAppUserLoginRes = ref<API.LoginCommandCallback>();
const form = reactive({
  loading: false,
@@ -69,8 +98,24 @@
  userPassword: [{ required: true, message: '请输入密码' }],
});
async function handleLoginByHasAccount() {
  try {
    if (props.policyChecked) {
      userStore.loginSuccess(wxMiniAppUserLoginRes.value);
      Message.success('登录成功', {
        onClosed: () => {
          jump();
        },
      });
    } else {
      noAccess();
    }
  } catch (error) {}
}
async function handleLogin() {
  try {
    let loginRes = await Taro.login();
    if (props.policyChecked) {
      const { valid } = await formRef.value.validate();
      if (valid) {
@@ -78,6 +123,7 @@
        await userStore.loginByPassword({
          userName: form.userName,
          password: form.userPassword,
          code: loginRes.code,
        });
        jump();
      }
@@ -100,6 +146,27 @@
    url: RouterPath.registerForm,
  });
}
onMounted(async () => {
  try {
    let loginRes = await Taro.login();
    const params: API.WxmpLoginCommand = {
      code: loginRes.code,
      type: AppLocalConfig.userType,
      enterpriseType: AppLocalConfig.enterpriseType,
    };
    wxMiniAppUserLoginRes.value = await authServices.wxmpLogin(params, {
      skipErrorHandler: true,
    });
    if (wxMiniAppUserLoginRes.value?.isBindPhoneNumber) {
      isAccount.value = true;
    }
  } catch (error) {
    if (error?.info?.errorCode == 's401') {
      isAccount.value = false;
    }
  }
});
</script>
<style lang="scss">
@@ -114,5 +181,26 @@
      font-size: 28px;
    }
  }
  .authorization-page-wechat-wrapper {
    width: 100%;
    height: 88px;
  }
  .authorization-page-wechat {
    display: flex;
    justify-content: center;
    align-items: center;
    font-weight: 400;
    font-size: 32px;
    color: #ffffff;
    line-height: 44px;
    .authorization-page-wechat-icon {
      width: 44px;
      height: 36px;
      margin-right: 10px;
    }
  }
}
</style>
apps/bMiniApp/src/subpackages/mine/setting/setting.vue
@@ -10,6 +10,7 @@
      </ListItem> -->
      <ListItem title="用户协议" @click="goMineUserPolicy"></ListItem>
      <ListItem title="隐私政策" @click="goPrivacyPolicy"></ListItem>
      <ListItem title="微信解绑" @click="handleUnbindWechat"></ListItem>
      <ListItem title="退出登录" @click="handleLoginout"></ListItem>
    </List>
  </PageLayout>
@@ -22,16 +23,18 @@
import { useUserStore } from '@/stores/modules/user';
import { useQueryClient } from '@tanstack/vue-query';
import Taro from '@tarojs/taro';
import * as authServices from '@12333/services/apiV2/auth';
defineOptions({
  name: 'setting',
});
const userStore = useUserStore();
const { isBindWechat, updateUserInfo } = useUser();
const queryClient = useQueryClient();
const userAccount = computed(() => {
  return addStarForString(userStore?.userDetail?.userName, 4, 8);
  return addStarForString(userStore?.userDetail?.name, 4, 8);
});
function goMineUserPolicy() {
@@ -54,6 +57,22 @@
    queryClient.removeQueries();
  } catch (error) {}
}
async function handleUnbindWechat() {
  try {
    if (!isBindWechat) {
      Message.error('您还没有绑定微信');
      return;
    }
    await Message.confirm({ message: '确定要解绑微信吗?' });
    let params: API.UnBindUserWxmpIdCommand = {};
    let res = await authServices.unBindUserWxmpId(params);
    if (res) {
      Message.success('解绑成功');
      updateUserInfo();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/task/batchTaskList/InnerPage.vue
@@ -23,9 +23,11 @@
        :showFooterLeft="false"
      >
        <template #footerRight>
          <nut-button v-if="showQueryState" type="primary" @click.stop="handleArrange(item)"
            >安排</nut-button
          >
          <template v-if="showQueryState">
            <nut-button type="primary" @click.stop="handleArrange(item)">安排</nut-button>
            <nut-button type="primary" @click.stop="setTaskUserHire(item)">取消录用</nut-button>
          </template>
          <div v-else class="batch-task-card-status">已安排</div>
        </template>
      </FlexJobCard>
@@ -40,6 +42,7 @@
  EnumTaskUserArrangeStatus,
  EnumPagedListOrder,
  EnumGetArrangeTaskUsersQueryApplyStatus,
  EnumTaskUserHireStatus,
} from '@12333/constants';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import _ from 'lodash';
@@ -103,6 +106,20 @@
    }
  } catch (error) {}
}
async function setTaskUserHire(row: API.GetArrangeTaskUsersQueryResultItem) {
  try {
    let params: API.SetTaskUserHireCommand = {
      id: row.id,
      hireStatus: EnumTaskUserHireStatus.Cancel,
    };
    let res = await taskUserServices.setTaskUserHire(params);
    if (res) {
      Message.success('已取消录用');
      invalidateQueries();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -40,6 +40,14 @@
              >人员安排</nut-button
            >
            <nut-button
              v-if="item.status === EnumTaskStatus.Wait"
              type="primary"
              class="dark-btn"
              :color="Colors.Info"
              @click.stop="goBatchTaskList(item, EnumTaskUserArrangeStatus.Wait)"
              >取消录用</nut-button
            >
            <nut-button
              v-if="item.status === EnumTaskStatus.Complete"
              type="primary"
              :color="Colors.Info"
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",
apps/cMiniApp/src/pages/mine/index.vue
@@ -91,7 +91,7 @@
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="userDetail?.taskCount ?? 0"
            :dot="userDetail?.taskCount > 0"
            @click="goMineSign"
          >
            <img :src="IconOrderSign" class="mine-order-list-icon" />
@@ -100,7 +100,7 @@
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="userDetail?.hirePassTaskCount ?? 0"
            :dot="userDetail?.hirePassTaskCount > 0"
            @click="goMineHired"
          >
            <img :src="IconOrderHire" class="mine-order-list-icon" />
@@ -109,7 +109,7 @@
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="userDetail?.arrangeCompleteTaskCount ?? 0"
            :dot="userDetail?.arrangeCompleteTaskCount > 0"
            @click="goMineHire"
          >
            <img :src="IconOrderHire" class="mine-order-list-icon" />
apps/cMiniApp/src/subpackages/mine/mineHire/InnerPage.vue
@@ -34,6 +34,7 @@
        :service-fee="item.serviceFee"
        :settlement-cycle="item.settlementCycle"
        :address-name="item.addressName"
        :unRead="item.unRead"
        @click="goTaskDetail(item)"
      >
        <template #actions>
@@ -58,6 +59,7 @@
  GetPersonalHireTaskInfosQueryStatusText,
  GetPersonalHireTaskInfosQueryStatusColor,
  EnumTaskUserArrangeStatus,
  EnumReadScene,
} from '@12333/constants';
import * as taskServices from '@12333/services/apiV2/task';
import Taro from '@tarojs/taro';
@@ -95,7 +97,7 @@
function goTaskDetail(item: API.GetPersonalHireTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskDetail}?id=${item.id}&from=hire`,
    url: `${RouterPath.taskDetail}?id=${item.id}&from=hire&readScene=${EnumReadScene.TaskUserArrangePassForPersonal}`,
  });
}
</script>
apps/cMiniApp/src/subpackages/mine/mineHired/InnerPage.vue
@@ -34,6 +34,7 @@
        :service-fee="item.serviceFee"
        :settlement-cycle="item.settlementCycle"
        :address-name="item.addressName"
        :unRead="item.unRead"
        @click="goTaskDetail(item)"
      >
        <template #actions>
@@ -58,6 +59,7 @@
  GetPersonalHireTaskInfosQueryStatusText,
  GetPersonalHireTaskInfosQueryStatusColor,
  EnumTaskUserHireStatus,
  EnumReadScene,
} from '@12333/constants';
import * as taskServices from '@12333/services/apiV2/task';
import Taro from '@tarojs/taro';
@@ -94,7 +96,7 @@
function goTaskDetail(item: API.GetPersonalHireTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskDetail}?id=${item.id}`,
    url: `${RouterPath.taskDetail}?id=${item.id}&readScene=${EnumReadScene.TaskUserHirePassForPersonal}`,
  });
}
</script>
apps/cMiniApp/src/subpackages/mine/mineSign/InnerPage.vue
@@ -37,7 +37,7 @@
        :service-fee="item.serviceFee"
        :settlement-cycle="item.settlementCycle"
        :address-name="item.addressName"
        :isRead="false"
        :unRead="item.unRead"
        @click="goTaskDetail(item)"
      >
        <template #actions>
@@ -62,6 +62,7 @@
  GetPersonalApplyTaskInfosQueryStatus,
  GetPersonalApplyTaskInfosQueryStatusText,
  GetPersonalApplyTaskInfosQueryStatusColor,
  EnumReadScene,
} from '@12333/constants';
import * as taskServices from '@12333/services/apiV2/task';
import Taro from '@tarojs/taro';
@@ -99,7 +100,7 @@
function goTaskDetail(item: API.GetPersonalApplyTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskDetail}?id=${item.id}&from=sign`,
    url: `${RouterPath.taskDetail}?id=${item.id}&from=sign&readScene=${EnumReadScene.TaskUserApplyForPersonal}`,
  });
}
</script>
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
@@ -126,6 +126,7 @@
  GetTaskInfoQueryResultHireButton,
  GetTaskInfoQueryResultApplyButton,
  EnumTaskCheckReceiveMethod,
  EnumReadScene,
} from '@12333/constants';
import { useAccessLogin } from '@/hooks';
import { useTaskInfo } from '@12333/hooks';
@@ -142,8 +143,12 @@
const router = Taro.useRouter();
const id = router.params?.id ?? '';
const from = router.params?.from ?? '';
const readScene = router.params?.readScene ?? '';
const { isLoading, isError, detail, refetch, isContainCheckIn } = useTaskInfo({ id });
const { isLoading, isError, detail, refetch, isContainCheckIn } = useTaskInfo({
  id,
  readScene: readScene,
});
const { isCollapse, setTrue } = useToggle();
apps/underTakeMiniApp/src/constants/app.ts
@@ -5,3 +5,6 @@
  clientType: EnumClientType.Wxmp,
  enterpriseType: EnumEnterpriseType.Supplier,
};
export const APP_ENV = process.env.APP_ENV;
export const NODE_ENV = process.env.NODE_ENV;
apps/underTakeMiniApp/src/hooks/user.ts
@@ -19,12 +19,17 @@
    return userDetail.value?.enterpriseIsReal;
  });
  const isBindWechat = computed(() => {
    return userDetail.value?.bindWxmpId;
  });
  return {
    user: userInfo,
    userDetail: userDetail,
    updateUserInfo,
    isCertified,
    locationCity,
    isBindWechat,
  };
}
apps/underTakeMiniApp/src/stores/modules/user.ts
@@ -141,6 +141,7 @@
        {
          userName: params.userName,
          password: params.password,
          code: params.code,
          // password: md5Encrypt(params.password),
          type: AppLocalConfig.userType,
          clientType: AppLocalConfig.clientType,
apps/underTakeMiniApp/src/subpackages/login/authorization/authorization.vue
@@ -167,34 +167,12 @@
  } catch (error) {}
}
async function handleLoginSuccess() {
  try {
    if (!Taro.requestSubscribeMessage) {
      await Message.confirm({ message: '你的微信版本过低,不支持订阅消息,是否继续报名' });
    }
    const res = await Taro.getSetting({
      withSubscriptions: true,
    });
    let setting: boolean[] = [];
    if (res.subscriptionsSetting && res.subscriptionsSetting.itemSettings) {
      setting = subscribeMessageTemplateIdsForU
        .map((id) => res.subscriptionsSetting.itemSettings[id] !== 'accept')
        .filter(Boolean);
    }
    if (setting.length > 0) {
      Taro.requestSubscribeMessage({
        tmplIds: subscribeMessageTemplateIdsForU,
        success: function (res) {
          console.log('res: ', res);
        },
      });
    }
    Message.success('授权登录成功', {
      onClosed: () => {
        jump();
      },
    });
  } catch (error) {}
function handleLoginSuccess() {
  Message.success('授权登录成功', {
    onClosed: () => {
      jump();
    },
  });
}
function goLoginByForm(tab = LoginFormTabs.VerificationCodeLogin) {
apps/underTakeMiniApp/src/subpackages/login/loginByForm/accountLoginForm.vue
@@ -1,32 +1,47 @@
<template>
  <div class="verification-code-login-form-wrapper">
    <nut-form class="verification-code-login-form" ref="formRef" :model-value="form" :rules="rules">
      <nut-form-item label="" class="bole-form-item" prop="userName" required>
        <nut-input
          v-model.trim="form.userName"
          class="bole-input-text"
          placeholder="请输入账号/手机号/邮箱"
          type="text"
        />
      </nut-form-item>
      <nut-form-item label="" class="bole-form-item" prop="userPassword" required>
        <nut-input
          v-model.trim="form.userPassword"
          class="bole-input-text"
          placeholder="请输入密码"
          :type="isShowPassword ? 'text' : 'password'"
          :key="isShowPassword ? 'text' : 'password'"
        >
          <template #right>
            <div class="password-icon-wrapper" @click="isShowPassword = !isShowPassword">
              <Eye v-if="isShowPassword"></Eye>
              <Marshalling v-else></Marshalling>
            </div>
          </template>
        </nut-input>
      </nut-form-item>
    </nut-form>
    <LargeButton class="login-btn" @click="handleLogin" :loading="form.loading">登录</LargeButton>
    <nut-button
      v-if="isAccount"
      type="primary"
      class="authorization-page-wechat-wrapper"
      @click="handleLoginByHasAccount"
    >
      <div class="authorization-page-wechat">手机号快速登录</div></nut-button
    >
    <template v-else>
      <nut-form
        class="verification-code-login-form"
        ref="formRef"
        :model-value="form"
        :rules="rules"
      >
        <nut-form-item label="" class="bole-form-item" prop="userName" required>
          <nut-input
            v-model.trim="form.userName"
            class="bole-input-text"
            placeholder="请输入账号/手机号/邮箱"
            type="text"
          />
        </nut-form-item>
        <nut-form-item label="" class="bole-form-item" prop="userPassword" required>
          <nut-input
            v-model.trim="form.userPassword"
            class="bole-input-text"
            placeholder="请输入密码"
            :type="isShowPassword ? 'text' : 'password'"
            :key="isShowPassword ? 'text' : 'password'"
          >
            <template #right>
              <div class="password-icon-wrapper" @click="isShowPassword = !isShowPassword">
                <Eye v-if="isShowPassword"></Eye>
                <Marshalling v-else></Marshalling>
              </div>
            </template>
          </nut-input>
        </nut-form-item>
      </nut-form>
      <LargeButton class="login-btn" @click="handleLogin" :loading="form.loading">登录</LargeButton>
    </template>
    <!-- <div class="go-register-btn" @click="goRegister">立即注册</div> -->
  </div>
</template>
@@ -39,6 +54,7 @@
import { useUserStore } from '@/stores/modules/user';
import { Eye, Marshalling } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import * as authServices from '@12333/services/apiV2/auth';
defineOptions({
  name: 'AccountLoginForm',
@@ -57,6 +73,8 @@
const isShowPassword = ref(false);
const formRef = ref(null);
const isAccount = ref(false);
const wxMiniAppUserLoginRes = ref<API.LoginCommandCallback>();
const form = reactive({
  loading: false,
@@ -69,8 +87,24 @@
  userPassword: [{ required: true, message: '请输入密码' }],
});
async function handleLoginByHasAccount() {
  try {
    if (props.policyChecked) {
      userStore.loginSuccess(wxMiniAppUserLoginRes.value);
      Message.success('登录成功', {
        onClosed: () => {
          jump();
        },
      });
    } else {
      noAccess();
    }
  } catch (error) {}
}
async function handleLogin() {
  try {
    let loginRes = await Taro.login();
    if (props.policyChecked) {
      const { valid } = await formRef.value.validate();
      if (valid) {
@@ -78,6 +112,7 @@
        await userStore.loginByPassword({
          userName: form.userName,
          password: form.userPassword,
          code: loginRes.code,
        });
        jump();
      }
@@ -100,6 +135,27 @@
    url: RouterPath.registerForm,
  });
}
onMounted(async () => {
  try {
    let loginRes = await Taro.login();
    const params: API.WxmpLoginCommand = {
      code: loginRes.code,
      type: AppLocalConfig.userType,
      enterpriseType: AppLocalConfig.enterpriseType,
    };
    wxMiniAppUserLoginRes.value = await authServices.wxmpLogin(params, {
      skipErrorHandler: true,
    });
    if (wxMiniAppUserLoginRes.value?.isBindPhoneNumber) {
      isAccount.value = true;
    }
  } catch (error) {
    if (error?.info?.errorCode == 's401') {
      isAccount.value = false;
    }
  }
});
</script>
<style lang="scss">
apps/underTakeMiniApp/src/subpackages/mine/setting/setting.vue
@@ -10,6 +10,7 @@
      </ListItem> -->
      <ListItem title="用户协议" @click="goMineUserPolicy"></ListItem>
      <ListItem title="隐私政策" @click="goPrivacyPolicy"></ListItem>
      <ListItem title="微信解绑" @click="handleUnbindWechat"></ListItem>
      <ListItem title="退出登录" @click="handleLoginout"></ListItem>
    </List>
  </PageLayout>
@@ -22,16 +23,18 @@
import { useUserStore } from '@/stores/modules/user';
import { useQueryClient } from '@tanstack/vue-query';
import Taro from '@tarojs/taro';
import * as authServices from '@12333/services/apiV2/auth';
defineOptions({
  name: 'setting',
});
const userStore = useUserStore();
const { isBindWechat, updateUserInfo } = useUser();
const queryClient = useQueryClient();
const userAccount = computed(() => {
  return addStarForString(userStore?.userDetail?.userName, 4, 8);
  return addStarForString(userStore?.userDetail?.name, 4, 8);
});
function goMineUserPolicy() {
@@ -54,6 +57,22 @@
    queryClient.removeQueries();
  } catch (error) {}
}
async function handleUnbindWechat() {
  try {
    if (!isBindWechat) {
      Message.error('您还没有绑定微信');
      return;
    }
    await Message.confirm({ message: '确定要解绑微信吗?' });
    let params: API.UnBindUserWxmpIdCommand = {};
    let res = await authServices.unBindUserWxmpId(params);
    if (res) {
      Message.success('解绑成功');
      updateUserInfo();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
packages/components/src/Card/TaskCard.vue
@@ -1,5 +1,5 @@
<template>
  <div class="task-card-wrapper" :class="{ 'un-read': !isRead }">
  <div class="task-card-wrapper" :class="{ 'un-read': unRead }">
    <div class="task-card-title-wrapper">
      <div class="task-card-title">{{ name }}</div>
      <slot name="title-right">
@@ -123,13 +123,13 @@
  createdTime?: string;
  hireStatus?: EnumTaskUserHireStatus;
  isRead?: boolean;
  unRead?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
  showActions: true,
  isRead: true,
  unRead: false,
});
const emit = defineEmits<{
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
@@ -395,6 +395,16 @@
  Real = 100,
}
/** 已读场景 */
export enum EnumReadScene {
  /**C端人员 */
  TaskUserApplyForPersonal = 0,
  /**C端人员 */
  TaskUserHirePassForPersonal = 1,
  /**C端人员 */
  TaskUserArrangePassForPersonal = 2,
}
/** 实名通道 */
export enum EnumRealAccess {
  /**上上签 */
@@ -429,36 +439,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 +651,8 @@
  Pass = 20,
  /**已谢绝 */
  Refuse = 30,
  /**已取消 */
  Cancel = 40,
}
/** 任务用户签约状态 */
@@ -895,22 +909,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/hooks/task.ts
@@ -10,6 +10,7 @@
  EnumTaskStatus,
  EnumUserGender,
  EnumTaskUserApplyStatus,
  EnumReadScene,
} from '@12333/constants';
import _ from 'lodash';
import { OrderUtils, trim } from '@12333/utils';
@@ -228,24 +229,28 @@
type UseTaskInfoOptions = {
  id: MaybeRef<string>;
  readScene?: string | EnumReadScene;
  onSuccess?: (data: API.GetTaskInfoQueryResult) => any;
};
export function useTaskInfo({ id, onSuccess }: UseTaskInfoOptions) {
export function useTaskInfo({ id, readScene, onSuccess }: UseTaskInfoOptions) {
  const {
    isLoading,
    isError,
    data: detail,
    refetch,
  } = useQuery({
    queryKey: ['taskServices/getTaskInfo', id],
    queryKey: ['taskServices/getTaskInfo', id, readScene],
    queryFn: async () => {
      return await taskServices.getTaskInfo(
        { id: unref(id) },
        {
          showLoading: false,
        }
      );
      const params: API.APIgetTaskInfoParams = {
        id: unref(id),
      };
      if (!!readScene) {
        params.readScene = Number(readScene);
      }
      return await taskServices.getTaskInfo(params, {
        showLoading: false,
      });
    },
    placeholderData: () => ({} as API.GetTaskInfoQueryResult),
    onSuccess(data) {
packages/services/apiV2/auth.ts
@@ -169,6 +169,21 @@
  });
}
/** 解绑微信小程序快捷登录 POST /api/user/auth/unBindUserWxmpId */
export async function unBindUserWxmpId(
  body: API.UnBindUserWxmpIdCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/auth/unBindUserWxmpId', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 发送更换手机号短信 POST /api/user/auth/updatePhoneNumberVerifyCode */
export async function updatePhoneNumberVerifyCode(
  body: API.UpdatePhoneNumberVerifyCodeCommand,
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/task.ts
@@ -281,6 +281,24 @@
  });
}
/** 查询发放明细报表分页列表数据 POST /api/flexjob/task/getTaskSettlementReleaseReports */
export async function getTaskSettlementReleaseReports(
  body: API.GetTaskSettlementReleaseReportsQuery,
  options?: API.RequestConfig
) {
  return request<API.GetTaskSettlementReleaseReportsQueryResult>(
    '/api/flexjob/task/getTaskSettlementReleaseReports',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json-patch+json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 导入结算名单 POST /api/flexjob/task/importTaskSettlementOrderRosters */
export async function importTaskSettlementOrderRosters(
  body: API.ImportTaskSettlementOrderRostersCommand,
packages/services/apiV2/typings.d.ts
@@ -317,6 +317,8 @@
  interface APIgetTaskInfoParams {
    /** Id */
    id?: string;
    /** 场景 */
    readScene?: EnumReadScene;
  }
  interface APIgetTaskSelectParams {
@@ -1140,6 +1142,15 @@
    Real = 100,
  }
  enum EnumReadScene {
    /**C端人员 */
    TaskUserApplyForPersonal = 0,
    /**C端人员 */
    TaskUserHirePassForPersonal = 1,
    /**C端人员 */
    TaskUserArrangePassForPersonal = 2,
  }
  enum EnumRealAccess {
    /**上上签 */
    BestSign = 10,
@@ -1172,36 +1183,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 +1377,8 @@
    Pass = 20,
    /**已谢绝 */
    Refuse = 30,
    /**已取消 */
    Cancel = 40,
  }
  enum EnumTaskUserSignContractStatus {
@@ -1599,21 +1614,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 {
@@ -2944,6 +2944,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetTaskSettlementReleaseReportsQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetTaskSettlementReleaseReportsQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetTaskUserHireStatusQueryResult {
    /** 跟踪Id */
    traceId?: string;
@@ -4183,6 +4201,8 @@
    /** 最近验收时间 */
    lastCheckReceiveTime?: string;
    checkedStatus?: EnumGetCheckReceiveTasksQueryResultItemCheckStatus;
    /** 人员数量 */
    arrangeUserCount?: number;
  }
  interface GetCheckReceiveTaskUserSubmitCheckHistoriesQuery {
@@ -5028,6 +5048,8 @@
    collectedUserCount?: number;
    /** 联系记录 */
    contactedRecordCount?: number;
    /** 绑定微信快捷登录 */
    bindWxmpId?: boolean;
  }
  interface GetEnterpriseQueryResult {
@@ -5881,6 +5903,8 @@
    /** 任务地点名称 */
    addressName?: string;
    status?: GetPersonalApplyTaskInfosQueryStatus;
    /** 未读 */
    unRead?: boolean;
  }
  enum GetPersonalApplyTaskInfosQueryStatus {
@@ -5992,6 +6016,8 @@
    /** 任务地点名称 */
    addressName?: string;
    status?: GetPersonalHireTaskInfosQueryStatus;
    /** 未读 */
    unRead?: boolean;
  }
  enum GetPersonalHireTaskInfosQueryStatus {
@@ -6244,8 +6270,6 @@
    code?: string;
    /** 任务名称 */
    taskName?: string;
    /** 任务单号 */
    taskCode?: string;
    /** 企业名称 */
    enterpriseName?: string;
    /** 结算日期 */
@@ -7060,6 +7084,8 @@
    status?: EnumTaskStatus;
    releaseStatus?: EnumTaskReleaseStatus;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用备注 */
    hireRemark?: string;
    /** 灵工Id */
    enterpriseEmployeeId?: string;
    applyButton?: GetTaskInfoQueryResultApplyButton;
@@ -7233,6 +7259,33 @@
    code?: string;
    /** 任务名称 */
    name?: string;
  }
  interface GetTaskSettlementReleaseReportsQuery {
    /** 开始日期 */
    startMonth?: string;
    /** 结束日期 */
    endMonth?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetTaskSettlementReleaseReportsQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** 数据 */
    data?: GetTaskSettlementReleaseReportsQueryResultItem[];
  }
  interface GetTaskSettlementReleaseReportsQueryResultItem {
    /** 日期 */
    month?: string;
    /** 发放金额 */
    amount?: number;
    /** 发放人数 */
    peopleCount?: number;
    /** 生成日期 */
    createdTime?: string;
    /** 汇总表格 */
    url?: string;
  }
  interface GetTaskUserHireStatusQueryResult {
@@ -7955,6 +8008,8 @@
  }
  interface PasswordLoginCommand {
    /** 用户登录凭证 */
    code?: string;
    /** 账号 */
    userName: string;
    /** 密码 */
@@ -8747,18 +8802,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 +8878,8 @@
    /** 任务人员Id */
    id?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用备注 */
    hireRemark?: string;
  }
  enum SettlementReceiveStatus {
@@ -9080,6 +9125,8 @@
  type TestEventCommand = Record<string, any>;
  type UnBindUserWxmpIdCommand = Record<string, any>;
  interface UpdateEnterpriseWeChatPayWalletBankAccountInfoCommand {
    /** 企业Id */
    enterpriseId?: string;