wupengfei
8 天以前 876a44a82852df5845bf9105e80c98a051f863ff
feat: 1.3.0.2
14个文件已修改
1个文件已删除
1 文件已重命名
11个文件已添加
1271 ■■■■ 已修改文件
apps/bMiniApp/src/subpackages/payrollManage/payrollManageDetail/InnerPage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/app.config.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/assets/workbenches/icon-settle.png 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/constants/router.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/pages/workbenches/InnerPage.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/payrollManage/components/PayrollManageDetailCard.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/payrollManage/payrollManageDetail/InnerPage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/InnerPage.vue 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/settleChange.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/settleChange.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/InnerPage.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/settleManage.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/settleManage.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/InnerPage.vue 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/settleManageDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/settleManageDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/task/components/TaskCheckCard.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/underTakeMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/PayrollManageDetailCard.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/enterpriseEmployee.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/eventUtils.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/user.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/payrollManage/payrollManageDetail/InnerPage.vue
@@ -98,12 +98,11 @@
  EnumTaskSettlementStatus,
  BillingMethodEnumUnit,
} from '@12333/constants';
import PayrollManageDetailCard from '../components/PayrollManageDetailCard.vue';
import { Message, paginateList, setOSSLink, toThousand, OrderUtils } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
import dayjs from 'dayjs';
import { goBack } from '@/utils';
import { ChunkTitle } from '@12333/components';
import { ChunkTitle, PayrollManageDetailCard } from '@12333/components';
defineOptions({
  name: 'InnerPage',
apps/underTakeMiniApp/src/app.config.ts
@@ -117,6 +117,14 @@
      ],
    },
    {
      root: 'subpackages/settleManage',
      pages: [
        'settleManage/settleManage',
        'settleManageDetail/settleManageDetail',
        'settleChange/settleChange',
      ],
    },
    {
      root: 'subpackages/payrollManage',
      pages: [
        'payrollManage/payrollManage',
apps/underTakeMiniApp/src/assets/workbenches/icon-settle.png
apps/underTakeMiniApp/src/constants/router.ts
@@ -24,6 +24,10 @@
  // cooperation = '/subpackages/setting/cooperation/cooperation',
  // faq = '/subpackages/setting/faq/faq',
  settleManage = '/subpackages/settleManage/settleManage/settleManage',
  settleManageDetail = '/subpackages/settleManage/settleManageDetail/settleManageDetail',
  settleChange = '/subpackages/settleManage/settleChange/settleChange',
  payrollManage = '/subpackages/payrollManage/payrollManage/payrollManage',
  payrollManageDetail = '/subpackages/payrollManage/payrollManageDetail/payrollManageDetail',
  payrollChange = '/subpackages/payrollManage/payrollChange/payrollChange',
apps/underTakeMiniApp/src/pages/workbenches/InnerPage.vue
@@ -23,6 +23,11 @@
      <CellChunk title="发薪">
        <div class="workbenches-cell-list">
          <TaskDetailWelfareItem
            :icon="IconSettleManage"
            text="结算管理"
            @click="goPage(RouterPath.settleManage)"
          />
          <TaskDetailWelfareItem
            :icon="IconPayrollManage"
            text="发薪管理"
            @click="goPage(RouterPath.payrollManage)"
@@ -43,6 +48,7 @@
import IconPublishTask from '@/assets/workbenches/icon-publish-task.png';
import IconTaskManage from '@/assets/workbenches/icon-task-manage.png';
import IconPayrollManage from '@/assets/workbenches/icon-payroll.png';
import IconSettleManage from '@/assets/workbenches/icon-settle.png';
import { useAccessLogin } from '@/hooks';
defineOptions({
apps/underTakeMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -48,7 +48,12 @@
            <nut-button type="primary" @click.stop="checkContract(item)">查看合约</nut-button>
          </template> -->
          <nut-button
            v-if="item.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Wait"
            v-if="
              (item.userSignContractStatus === EnumTaskUserSignContractStatus.Wait ||
                item.userSignContractStatus === EnumTaskUserSignContractStatus.Stop ||
                !item.userSignContractStatus) &&
              item.source === EnumEnterpriseEmployeeSource.Internal
            "
            type="primary"
            @click.stop="goEnterpriseSign(item)"
            >签约</nut-button
@@ -73,6 +78,7 @@
  EnumTaskUserHireStatus,
  EnumTaskUserSignContractStatus,
  EnumPagedListOrder,
  EnumEnterpriseEmployeeSource,
} from '@12333/constants';
import * as enterpriseEmployeeServices from '@12333/services/apiV2/enterpriseEmployee';
import Taro from '@tarojs/taro';
apps/underTakeMiniApp/src/subpackages/payrollManage/components/PayrollManageDetailCard.vue
File was deleted
apps/underTakeMiniApp/src/subpackages/payrollManage/payrollManageDetail/InnerPage.vue
@@ -99,12 +99,11 @@
  EnumTaskSettlementStatus,
  BillingMethodEnumUnit,
} from '@12333/constants';
import PayrollManageDetailCard from '../components/PayrollManageDetailCard.vue';
import { Message, paginateList, setOSSLink, toThousand, OrderUtils } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
import dayjs from 'dayjs';
import { goBack } from '@/utils';
import { ChunkTitle } from '@12333/components';
import { ChunkTitle, PayrollManageDetailCard } from '@12333/components';
defineOptions({
  name: 'InnerPage',
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/InnerPage.vue
New file
@@ -0,0 +1,264 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="服务费:" class="bole-form-item" prop="serviceFee" label-width="90px">
        <div class="bole-form-input-wrapper">
          <NumberInput
            v-model.trim="form.serviceFee"
            class="nut-input-text bole-input-text"
            placeholder="请输入服务费"
            :min="0"
            :max="999999999999"
            :precision="2"
            type="text"
            disabled
          />
          <div class="form-input-unit">元</div>
        </div>
      </nut-form-item>
      <nut-form-item label="超时:" class="bole-form-item" prop="timeoutHours" label-width="90px">
        <div class="bole-form-input-wrapper">
          <NumberInput
            v-model.trim="form.timeoutHours"
            class="nut-input-text bole-input-text"
            placeholder="请输入超时时长"
            :min="0"
            :max="999999999999"
            :precision="2"
            type="text"
            @change="onTimeoutHoursChange"
          />
          <div class="form-input-unit">小时</div>
        </div>
      </nut-form-item>
      <nut-form-item label="超时费用:" class="bole-form-item" prop="timeoutFee" label-width="90px">
        <div class="bole-form-input-wrapper">
          <NumberInput
            v-model.trim="form.timeoutFee"
            class="nut-input-text bole-input-text"
            placeholder="请输入超时费用"
            :min="0"
            :max="999999999999"
            :precision="2"
            type="text"
            @change="onActualSettlementAmountChange"
          />
          <div class="form-input-unit">元</div>
        </div>
      </nut-form-item>
      <nut-form-item label="其他费用:" class="bole-form-item" prop="otherFee" label-width="90px">
        <div class="bole-form-input-wrapper">
          <NumberInput
            v-model.trim="form.otherFee"
            class="nut-input-text bole-input-text"
            placeholder="请输入其他费用"
            :max="999999999999"
            :precision="2"
            type="text"
            @change="onActualSettlementAmountChange"
          />
          <div class="form-input-unit">元</div>
        </div>
      </nut-form-item>
      <nut-form-item
        label="结算金额:"
        class="bole-form-item"
        prop="settlementAmount"
        label-width="90px"
      >
        {{ `${settlementAmount}元` }}
      </nut-form-item>
      <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>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleConfirm">确认修改</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { NumberInput } from '@12333/components';
import { FormValidator, Message, toRound } from '@12333/utils';
import * as userServices from '@12333/services/apiV2/user';
import { EnumEnterpriseWalletAccess, EnumUserBankCardAccess } from '@12333/constants';
import { goBack } from '@/utils';
import Taro from '@tarojs/taro';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import { useQuery } from '@tanstack/vue-query';
import * as taskServices from '@12333/services/apiV2/task';
import { useEventChannel } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
//结算单id
const settleId = router.params?.settleId ?? '';
//人员id
const orderRosterId = router.params?.orderRosterId ?? '';
const operatorToken = router.params?.operatorToken ?? '';
const { isLoading, refetch } = useQuery({
  queryKey: ['taskUserServices/getSettlementTaskUsers', settleId, operatorToken],
  queryFn: async () => {
    let params: API.APIgetSettlementTaskUsersParams = {
      id: settleId,
      operatorToken: operatorToken,
    };
    return await taskUserServices.getSettlementTaskUsers(params, {
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.GetSettlementTaskUsersQueryResult),
  onSuccess(res) {
    const settlementTaskUser = res.data.find((x) => x.id === orderRosterId);
    if (res?.detail) {
      form.serviceFee = settlementTaskUser?.serviceFee ?? 0;
      form.actualSettlementAmount = settlementTaskUser?.actualSettlementAmount ?? 0;
      form.settlementAmount = settlementTaskUser?.settlementAmount ?? 0;
      form.receiveAccount = settlementTaskUser?.receiveAccount ?? '';
      form.bank = settlementTaskUser?.bank ?? '';
      form.settlementAccess = res?.detail?.settlementAccess;
      form.timeoutServiceFee = res?.detail?.timeoutServiceFee ?? 0;
      form.timeoutHours = settlementTaskUser?.timeoutHours ?? ('' as any as number);
      form.timeoutFee = settlementTaskUser?.timeoutFee ?? ('' as any as number);
      form.otherFee = settlementTaskUser?.otherFee ?? ('' as any as number);
      form.remark = settlementTaskUser?.remark ?? '';
      // form.settlementOrderName = setOssFileName(res?.detail?.settlementOrderName);
      // form.settlementOrderTime = res?.detail?.settlementOrderTime ?? '';
    }
  },
});
const form = reactive({
  settlementAmount: '' as any as number,
  serviceFee: '' as any as number,
  actualSettlementAmount: '' as any as number,
  receiveAccount: '',
  bank: '',
  settlementAccess: EnumEnterpriseWalletAccess.PingAnPay,
  timeoutServiceFee: 0,
  timeoutHours: '' as any as number,
  timeoutFee: '' as any as number,
  otherFee: '' as any as number,
  remark: '',
});
const settlementAmount = computed(() => sumSettlementAmount());
function sumSettlementAmount() {
  return toRound(
    getFeeValue(Number(form.timeoutFee ?? 0)) +
      getFeeValue(Number(form.serviceFee ?? 0)) +
      getFeeValue(Number(form.otherFee ?? 0))
  );
}
function getFeeValue(val: number) {
  return val || 0;
}
const rules = reactive<FormRules>({
  code: [
    { required: true, message: '请输入银行卡号' },
    { message: '请输入正确的银行卡号', validator: FormValidator.validatorBankCard },
  ],
  bank: [{ required: true, message: '请输入开户行' }],
  phoneNumber: [
    { required: true, message: '请填写手机号码' },
    { message: '请输入正确的手机号码', validator: FormValidator.validatorPhoneNumber },
  ],
  verifyCode: [{ required: true, message: '请输入验证码' }],
});
function onTimeoutHoursChange(event: any) {
  form.timeoutFee = Number(form.timeoutServiceFee)
    ? form.timeoutServiceFee * event.detail.value
    : 0;
  onActualSettlementAmountChange();
}
function onActualSettlementAmountChange() {
  //暂时注掉
  // form.actualSettlementAmount = sumSettlementAmount();
}
const formRef = ref<any>(null);
function handleConfirm() {
  if (!formRef.value) return;
  formRef.value.validate().then(({ valid, errors }: any) => {
    if (valid) {
      confirm();
    }
  });
}
const eventChannel = useEventChannel();
async function confirm() {
  let params: API.EditTaskSettlementOrderRosterCommand = {
    id: orderRosterId,
    settlementAmount: settlementAmount.value,
    actualSettlementAmount: settlementAmount.value,
    receiveAccount: form.receiveAccount,
    bank: form.bank,
    // totalWorkHours: editForm.totalWorkHours,
    // bankBranch: editForm.bankBranch,
    serviceFee: Number(form.serviceFee),
    timeoutHours: Number(form.timeoutHours),
    timeoutFee: Number(form.timeoutFee),
    otherFee: Number(form.otherFee),
    remark: form.remark,
  };
  // try {
  //   let params: API.EditTaskSettlementOrderRosterCommand = {
  //     id: orderRosterId,
  //     settlementAmount: settlementAmount.value,
  //     actualSettlementAmount: form.actualSettlementAmount,
  //     receiveAccount: form.receiveAccount,
  //     bank: form.bank,
  //     // totalWorkHours: editForm.totalWorkHours,
  //     // bankBranch: editForm.bankBranch,
  //     serviceFee: form.serviceFee,
  //     timeoutHours: form.timeoutHours,
  //     timeoutFee: form.timeoutFee,
  //     otherFee: form.otherFee,
  //     remark: form.remark,
  //   };
  //   let res = await taskServices.editTaskSettlementOrderRoster(params);
  //   if (res) {
  //     Message.success('修改成功', {
  //       onClosed() {
  //         goBack();
  //       },
  //     });
  //     eventChannel.emit('update');
  //   }
  // } catch (error) {}
  eventChannel.emit('update', params);
  goBack();
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.settleChange-page-wrapper {
  .bole-form-input-wrapper {
    display: flex;
    align-items: center;
  }
  .form-input-unit {
    margin-left: 10px;
    color: boleGetCssVar('text-color', 'primary');
    flex-shrink: 0;
  }
}
</style>
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/settleChange.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/underTakeMiniApp/src/subpackages/settleManage/settleChange/settleChange.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="settleChange-page-wrapper" title="修改" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'settleChange',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/InnerPage.vue
New file
@@ -0,0 +1,162 @@
<template>
  <ProTabs
    v-model="queryState.paymentStatus"
    name="task-tab"
    :showPaneContent="false"
    class="task-tabs"
    isTransparent
    title-gutter="8"
    title-scroll
  >
    <ProTabPane
      :title="`待审核(${waitAuditCount})`"
      :pane-key="GetSettlementTasksQueryPaymentStatus.WaitAudit"
    ></ProTabPane>
    <ProTabPane
      :title="`已审核(${completedAuditCount})`"
      :pane-key="GetSettlementTasksQueryPaymentStatus.CompletedAudit"
    ></ProTabPane>
    <ProTabPane
      :title="`已发放(${completedReleaseCount})`"
      :pane-key="GetSettlementTasksQueryPaymentStatus.CompletedRelease"
    ></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list settle-manage-list"
    v-bind="infiniteLoadingProps"
    :key="queryState.paymentStatus"
  >
    <template #renderItem="{ item }">
      <IncomeDetailListItem
        :title="item.code"
        :funds="item.settlementAmount"
        :item="item.settlementTime ? dayjs(item.settlementTime).format('YYYY-MM-DD HH:mm:ss') : ''"
        @click="openPassword(item)"
      >
      </IncomeDetailListItem>
    </template>
  </InfiniteLoading>
  <nut-short-password
    v-model="form.password"
    v-model:visible="form.passwordVisible"
    @focus="form.showKeyboard = true"
    @close="form.showKeyboard = false"
    tips="请输入6位操作密码"
    desc="明细需输入操作密码才能查看"
    :length="6"
    @complete="complete"
  >
  </nut-short-password>
  <nut-number-keyboard
    v-model="form.password"
    v-model:visible="form.showKeyboard"
    @blur="form.showKeyboard = false"
    :custom-key="['']"
  >
  </nut-number-keyboard>
</template>
<script setup lang="ts">
import { ProTabs, ProTabPane, IncomeDetailListItem } from '@12333/components';
import Taro from '@tarojs/taro';
import dayjs from 'dayjs';
import { GetSettlementTasksQueryPaymentStatus, EnumPagedListOrder } from '@12333/constants';
import * as taskServices from '@12333/services/apiV2/task';
import * as userServices from '@12333/services/apiV2/user';
import { useInfiniteLoading } from '@12333/hooks';
defineOptions({
  name: 'InnerPage',
});
const form = reactive({
  password: '',
  passwordVisible: false,
  showKeyboard: false,
  id: '',
});
const queryState = reactive({
  paymentStatus: GetSettlementTasksQueryPaymentStatus.WaitAudit,
});
const { infiniteLoadingProps, invalidateQueries } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetSettlementTasksQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
      },
      paymentStatus: queryState.paymentStatus,
    };
    return taskServices.getSettlementTasks(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['taskServices/getSettlementTasks', queryState],
  }
);
const completedAuditCount = computed(() => {
  return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.completedAuditCount ?? 0;
});
const waitAuditCount = computed(() => {
  return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.waitAuditCount ?? 0;
});
const completedReleaseCount = computed(() => {
  return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.completedReleaseCount ?? 0;
});
function openPassword(item: API.GetSettlementTasksQueryResultItem) {
  form.passwordVisible = true;
  form.showKeyboard = true;
  form.id = item.id;
}
function complete(value: string) {
  form.passwordVisible = false;
  buildOperatorToken(value);
}
async function buildOperatorToken(value: string) {
  try {
    let params: API.BuildOperatorTokenCommand = {
      password: value,
    };
    let res = await userServices.buildOperatorToken(params);
    if (res) {
      goSettleManageDetail(form.id, res.operatorToken);
    }
  } catch (error) {
    form.showKeyboard = false;
  } finally {
    form.password = '';
    form.showKeyboard = false;
  }
}
async function goSettleManageDetail(id: string, operatorToken: string) {
  Taro.navigateTo({
    url: `${RouterPath.settleManageDetail}?id=${id}&operatorToken=${operatorToken}`,
  });
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.settleManage-page-wrapper {
  .settle-manage-list {
    .income-detail-list-item-inner {
      display: flex;
      flex-direction: column;
      background: #ffffff;
      border-radius: 12px;
      padding: 40px;
      margin-bottom: 24px;
    }
  }
}
</style>
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/settleManage.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/underTakeMiniApp/src/subpackages/settleManage/settleManage/settleManage.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="settleManage-page-wrapper" title="结算管理">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'settleManage',
});
</script>
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/InnerPage.vue
New file
@@ -0,0 +1,289 @@
<template>
  <LoadingLayout>
    <ContentView>
      <div class="settle-manage-detail-top">
        <div class="settle-manage-detail-top-title">任务信息</div>
        <div class="settle-manage-detail-top-content">
          <div class="settle-manage-detail-top-content-item">
            <div class="settle-manage-detail-top-content-item-label">任务名称:</div>
            <div class="settle-manage-detail-top-content-item-text">{{ form.name }}</div>
          </div>
          <div class="settle-manage-detail-top-content-item">
            <div class="settle-manage-detail-top-content-item-label">服务费金额:</div>
            <div class="settle-manage-detail-top-content-item-text">
              {{ OrderUtils.getServiceFeeText(form.serviceFee, form.billingMethod) }}
            </div>
          </div>
          <div class="settle-manage-detail-top-content-item">
            <div class="settle-manage-detail-top-content-item-label">结算人数:</div>
            <div class="settle-manage-detail-top-content-item-text">
              {{ `${form.settlementCount ?? 0}人` }}
            </div>
          </div>
          <div class="settle-manage-detail-top-content-item">
            <div class="settle-manage-detail-top-content-item-label">结算金额:</div>
            <div class="settle-manage-detail-top-content-item-text">
              {{ `${toThousand(form.settlementAmount ?? 0)}元` }}
            </div>
          </div>
          <div
            class="settle-manage-detail-top-content-item"
            v-if="form.auditStatus !== EnumTaskSettlementAuditStatus.Wait"
          >
            <div class="settle-manage-detail-top-content-item-label">审核时间:</div>
            <div class="settle-manage-detail-top-content-item-text">
              {{ form.auditTime ? dayjs(form.auditTime).format('YYYY-MM-DD') : '' }}
            </div>
          </div>
          <div
            class="settle-manage-detail-top-content-item"
            v-if="form.settlementStatus === EnumTaskSettlementStatus.Completed"
          >
            <div class="settle-manage-detail-top-content-item-label">结算时间:</div>
            <div class="settle-manage-detail-top-content-item-text">
              {{ dayjs(form.settlementTime).format('YYYY-MM-DD') }}
            </div>
          </div>
        </div>
      </div>
      <ChunkTitle title="人员列表" />
    </ContentView>
    <InfiniteLoading
      scrollViewClassName="common-infinite-scroll-list"
      v-bind="infiniteLoadingProps"
    >
      <template #renderItem="{ item }">
        <PayrollManageDetailCard
          :avatar="setOSSLink(item.avatar)"
          :name="item.name"
          :gender="item.gender"
          :isReal="item.isReal"
          :totalWorkHours="item.timeoutHours"
          :settlementAmount="item.settlementAmount"
        >
          <template #actions v-if="form.auditStatus === EnumTaskSettlementAuditStatus.Wait">
            <div class="settle-manage-detail-card-actions">
              <nut-button type="primary" plain @click="goSettleChange(item)">修改</nut-button>
            </div>
          </template>
        </PayrollManageDetailCard>
      </template>
    </InfiniteLoading>
    <PageFooter v-if="form.auditStatus === EnumTaskSettlementAuditStatus.Wait">
      <!-- <PageFooterBtn type="primary" @click="auditTaskSettlement(EnumTaskSettlementAuditStatus.Pass)"
        >审核通过</PageFooterBtn
      >
      <PageFooterBtn
        type="primary"
        plain
        @click="auditTaskSettlement(EnumTaskSettlementAuditStatus.Fail)"
        >驳回</PageFooterBtn
      > -->
      <PageFooterBtn type="primary" @click="auditTaskSettlement(EnumTaskSettlementAuditStatus.Pass)"
        >确认</PageFooterBtn
      >
      <PageFooterBtn type="primary" plain @click="goBack">取消</PageFooterBtn>
    </PageFooter>
  </LoadingLayout>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import * as taskServices from '@12333/services/apiV2/task';
import { useInfiniteLoading } from '@12333/hooks';
import {
  EnumBillingMethodText,
  EnumTaskSettlementAuditStatus,
  EnumTaskSettlementStatus,
  BillingMethodEnumUnit,
} from '@12333/constants';
import { Message, paginateList, setOSSLink, toThousand, OrderUtils } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
import dayjs from 'dayjs';
import { goBack } from '@/utils';
import { ChunkTitle, PayrollManageDetailCard } from '@12333/components';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const id = router.params?.id ?? '';
const operatorToken = router.params?.operatorToken ?? '';
const form = reactive({
  name: '',
  serviceFee: 0,
  settlementCount: 0,
  settlementAmount: 0,
  settlementTime: '',
  auditTime: '',
  auditStatus: 0,
  billingMethod: 0,
  settlementStatus: 0,
  settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[],
});
const state = reactive({
  isLoaded: false,
});
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['taskUserServices/getSettlementTaskUsers', id, operatorToken],
  queryFn: async () => {
    let res = await taskUserServices.getSettlementTaskUsers(
      { id: id, operatorToken: operatorToken },
      {
        showLoading: false,
      }
    );
    if (res) {
      form.name = res.detail?.name;
      form.serviceFee = res.detail?.serviceFee;
      form.settlementCount = res.data?.length;
      form.settlementAmount = res.detail?.settlementAmount;
      form.settlementTime = res.detail?.settlementTime;
      form.auditTime = res.detail?.auditTime;
      form.auditStatus = res.detail?.auditStatus;
      form.settlementStatus = res.detail?.settlementStatus;
      form.billingMethod = res.detail?.billingMethod;
    }
    return res;
  },
  placeholderData: () => ({} as API.GetSettlementTaskUsersQueryResult),
  onSuccess(res) {
    if (!state.isLoaded) {
      form.settlementTaskUsers = res?.data ?? [];
      state.isLoaded = true;
    }
  },
});
const { infiniteLoadingProps, invalidateQueries } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetCheckReceiveTaskQuery = {
      pageModel: {
        rows: 20,
        page: pageParam,
      },
    };
    return Promise.resolve({
      pageModel: {
        rows: 20,
        page: pageParam,
        totalCount: form.settlementTaskUsers.length,
      },
      data: paginateList(form.settlementTaskUsers, pageParam, 20),
    });
  },
  {
    enabled: computed(() => form.settlementTaskUsers?.length > 0),
  }
);
async function auditTaskSettlement(auditStatus: EnumTaskSettlementAuditStatus) {
  try {
    let params: API.AuditTaskSettlementCommand = {
      id: id,
      operatorToken: operatorToken,
      auditStatus: auditStatus,
      rosters: form.settlementTaskUsers.map((item) => ({
        id: item.id,
        serviceFee: item.serviceFee,
        timeoutHours: item.timeoutHours,
        timeoutFee: item.timeoutFee,
        otherFee: item.otherFee,
        remark: item.remark,
        settlementAmount: item.settlementAmount,
      })),
    };
    // if(auditStatus===EnumTaskSettlementAuditStatus.Pass){
    //   params.rosters
    // }
    let res = await taskServices.auditTaskSettlement(params);
    if (res) {
      Message.success('操作成功', {
        onClosed() {
          goBack();
        },
      });
    }
  } catch (error) {}
}
function goSettleChange(item: API.GetSettlementTaskUsersQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.settleChange}?orderRosterId=${item.id}&settleId=${id}&operatorToken=${operatorToken}`,
    events: {
      update: function (params: API.EditTaskSettlementOrderRosterCommand) {
        // refetch();
        form.settlementTaskUsers = form.settlementTaskUsers.map((item) => {
          if (item.id == params.id) {
            item.settlementAmount = params.settlementAmount;
            item.actualSettlementAmount = params.actualSettlementAmount;
            item.receiveAccount = params.receiveAccount;
            item.bank = params.bank;
            item.serviceFee = params.serviceFee;
            item.timeoutHours = params.timeoutHours;
            item.timeoutFee = params.timeoutFee;
            item.otherFee = params.otherFee;
            item.remark = params.remark;
            return item;
          }
          return item;
        });
      },
    },
  });
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.settleManageDetail-page-wrapper {
  .settle-manage-detail-top {
    padding: 24px 32px;
    margin-bottom: 24px;
    background-color: #fff;
    border-radius: 12px;
    .settle-manage-detail-top-title {
      font-size: 32px;
      font-weight: bold;
      margin-bottom: 14px;
    }
    .settle-manage-detail-top-content {
      .settle-manage-detail-top-content-item {
        font-size: 24px;
        line-height: 40px;
        .settle-manage-detail-top-content-item-label {
          display: inline-flex;
          color: boleGetCssVar('text-color', 'primary');
        }
        .settle-manage-detail-top-content-item-text {
          display: inline-flex;
          color: boleGetCssVar('text-color', 'regular');
        }
      }
    }
  }
  .settle-manage-detail-card-actions {
    --nut-button-default-height: 24px;
    text-align: right;
  }
}
</style>
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/settleManageDetail.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/underTakeMiniApp/src/subpackages/settleManage/settleManageDetail/settleManageDetail.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="settleManageDetail-page-wrapper" title="结算详情">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'settleManageDetail',
});
</script>
apps/underTakeMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -1,5 +1,5 @@
<template>
  <div class="task-check-card-wrapper" @click.stop="emit('checkReceive')">
  <div class="task-check-card-wrapper">
    <TaskCheckPersonalView
      class="task-check-card-view"
      :avatar="avatar"
@@ -9,12 +9,47 @@
      :contactPhoneNumber="contactPhoneNumber"
    >
      <template #actions>
        <template
          v-if="
            (checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive ||
              checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit) &&
            isInternal
          "
        >
          <template v-if="OrderUtils.isContainCheckIn(checkReceiveMethods)">
            <nut-button
              v-if="
                !checkHistoryType || checkHistoryType === EnumTaskUserSubmitCheckHistoryType.CheckIn
              "
              type="primary"
              class="task-check-card-phone-btn"
              @click.stop="handleMore"
              >操作</nut-button
            >
            <nut-button
              v-else
              type="primary"
              class="task-check-card-phone-btn"
              @click.stop="emit('checkReceive')"
              >验收</nut-button
            >
          </template>
          <nut-button
            v-else
            type="primary"
            class="task-check-card-phone-btn"
            @click.stop="emit('checkReceive')"
            >验收</nut-button
          >
        </template>
        <template v-else>
        <div
          class="task-check-card-phone-status"
          :style="{ color: EnumTaskCheckReceiveStatusColor[checkReceiveStatus] }"
        >
          {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }}
        </div>
        </template>
      </template>
    </TaskCheckPersonalView>
  </div>
@@ -29,6 +64,7 @@
  EnumTaskCheckReceiveMethod,
  EnumGetCheckReceiveTasksQueryResultItemCheckStatus,
  EnumTaskUserSubmitCheckReceiveStatus,
  EnumTaskUserSubmitCheckHistoryType,
  EnumTaskCheckReceiveStatusColor,
} from '@12333/constants';
import { TaskCheckPersonalView } from '@12333/components';
@@ -61,22 +97,22 @@
  checkReceiveMethods?: EnumTaskCheckReceiveMethod[];
  submitCheckReceiveStatus?: EnumTaskUserSubmitCheckReceiveStatus;
  checkHistoryType?: EnumTaskUserSubmitCheckHistoryType;
  isInternal?: boolean;
};
const props = withDefaults(defineProps<Props>(), {});
const emit = defineEmits<{
  (e: 'checkReceive'): void;
  (e: 'checkInOrOut', ev: EnumTaskUserSubmitCheckReceiveStatus): void;
  (e: 'checkInOrOut', ev: EnumTaskUserSubmitCheckHistoryType): void;
}>();
const menuList = computed(() => {
  let _menuList = [];
  // if (props.checkReceiveMethod === EnumTaskCheckReceiveMethod.CheckIn) {
  _menuList.push({
    name: '未到岗',
    value: ManageActions.OutWork,
  });
  if (OrderUtils.isContainCheckIn(props.checkReceiveMethods)) {
  if (!props.checkInTime) {
    _menuList.push({
      name: '签到',
@@ -88,7 +124,11 @@
      value: ManageActions.CheckOut,
    });
  }
  // }
    _menuList.push({
      name: '未到岗',
      value: ManageActions.OutWork,
    });
  }
  return _menuList;
});
@@ -118,13 +158,13 @@
function handleEmit(action: { name: string; value: number }) {
  switch (action.value) {
    case ManageActions.CheckIn:
      emit('checkInOrOut', EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive);
      emit('checkInOrOut', EnumTaskUserSubmitCheckHistoryType.CheckIn);
      break;
    case ManageActions.CheckOut:
      emit('checkInOrOut', EnumTaskUserSubmitCheckReceiveStatus.Success);
      emit('checkInOrOut', EnumTaskUserSubmitCheckHistoryType.CheckOut);
      break;
    case ManageActions.OutWork:
      emit('checkInOrOut', EnumTaskUserSubmitCheckReceiveStatus.Fail);
      emit('checkInOrOut', EnumTaskUserSubmitCheckHistoryType.UnCheckIn);
      break;
  }
}
apps/underTakeMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -16,7 +16,7 @@
      <template #renderItem="{ item }">
        <TaskCheckCard
          :avatar="setOSSLink(item.avatar)"
          :name="item.name"
          :name="item.name ?? ''"
          :gender="item.gender"
          :isReal="item.isReal"
          :checkInTime="item.checkInTime"
@@ -25,6 +25,10 @@
          :checkReceiveStatus="item.checkReceiveStatus"
          :checkReceiveMethods="detail?.checkReceiveMethods"
          :submitCheckReceiveStatus="item.submitCheckReceiveStatus"
          :checkHistoryType="item.checkHistoryType"
          :isInternal="detail?.isInternal"
          @checkReceive="goTaskDetail(item)"
          @checkInOrOut="(ev) => checkReceiveTask(ev, item)"
        />
      </template>
    </InfiniteLoading>
@@ -40,6 +44,7 @@
import {
  EnumTaskCheckReceiveMethod,
  EnumTaskCheckReceiveStatus,
  EnumTaskUserSubmitCheckHistoryType,
  EnumTaskUserSubmitCheckReceiveStatus,
} from '@12333/constants';
import { Message, setOSSLink, toRound } from '@12333/utils';
@@ -54,7 +59,7 @@
const date = router.params?.date ?? '';
const checkReceiveStatus = Number(router.params?.checkReceiveStatus);
const detail = ref<API.GetCheckReceiveTasksQueryResultItem>();
const detail = ref<API.GetCheckReceiveTaskQueryResultObjectData>();
const { infiniteLoadingProps } = useInfiniteLoading(
  async ({ pageParam }) => {
@@ -78,6 +83,30 @@
    queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'],
  }
);
function goTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}&taskInfoId=${id}`,
  });
}
async function checkReceiveTask(
  ev: EnumTaskUserSubmitCheckHistoryType,
  item: API.GetCheckReceiveTaskQueryResultItem
) {
  try {
    let params: API.CheckReceiveTaskCommand = {
      taskInfoUserId: item.id,
      date: dayjs(date).format('YYYY-MM-DD'),
      checkHistoryType: ev,
    };
    let res = await taskCheckReceiveServices.checkReceiveTask(params);
    if (res) {
      Message.success('提交成功');
      infiniteLoadingProps.value?.refetch?.();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
packages/components/src/Card/PayrollManageDetailCard.vue
File was renamed from apps/bMiniApp/src/subpackages/payrollManage/components/PayrollManageDetailCard.vue
@@ -21,7 +21,7 @@
</template>
<script setup lang="ts">
import { FlexJobTopView } from '@12333/components';
import FlexJobTopView from './FlexJobTopView.vue';
import { EnumUserGender } from '@12333/constants';
import { toThousand } from '@12333/utils';
packages/components/src/index.ts
@@ -36,6 +36,7 @@
export { default as TaskCheckPersonalView } from './Card/TaskCheckPersonalView.vue';
export { default as TaskCheckHistoryCard } from './Card/TaskCheckHistoryCard.vue';
export { default as FlexJobTopView } from './Card/FlexJobTopView.vue';
export { default as PayrollManageDetailCard } from './Card/PayrollManageDetailCard.vue';
export { default as QueryMenuView } from './Menu/QueryMenuView.vue';
export { default as QueryMenuItem } from './Menu/QueryMenuItem.vue';
export { default as ProRadio } from './Form/ProRadio.vue';
packages/constants/apiEnum.ts
@@ -143,6 +143,14 @@
  ElectronSign = 20,
}
/** 灵工来源 */
export enum EnumEnterpriseEmployeeSource {
  /**内部 */
  Internal = 10,
  /**外部 */
  External = 20,
}
/** 企业实名方式 */
export enum EnumEnterpriseRealMethod {
  /**企业三要素 */
@@ -401,44 +409,46 @@
  CommonServerCodeUrls = 4,
  /**文件 */
  CommonServerFileUtils = 5,
  /**事件 */
  CommonServerEventUtils = 6,
  /**文字识别 */
  CommonServerOcrUtils = 6,
  CommonServerOcrUtils = 7,
  /**日志记录 */
  CommonServerLogRecords = 7,
  CommonServerLogRecords = 8,
  /**同步数据库 */
  CommonServerSyncDatabase = 8,
  CommonServerSyncDatabase = 9,
  /**短信工具 */
  CommonServerSmsUtils = 9,
  CommonServerSmsUtils = 10,
  /**配置 */
  CommonServerSettings = 10,
  CommonServerSettings = 11,
  /**用户认证 */
  UserServerAuth = 11,
  UserServerAuth = 12,
  /**用户菜单 */
  UserServerMenu = 12,
  UserServerMenu = 13,
  /**用户资源 */
  UserServerResource = 13,
  UserServerResource = 14,
  /**用户角色 */
  UserServerRole = 14,
  UserServerRole = 15,
  /**用户信息 */
  UserServerUser = 15,
  UserServerUser = 16,
  /**用户钱包 */
  UserServerUserWallet = 16,
  UserServerUserWallet = 17,
  /**电子签 */
  UserServerElectronSign = 17,
  UserServerElectronSign = 18,
  /**用户简历 */
  UserServerUserResume = 18,
  UserServerUserResume = 19,
  /**企业信息 */
  UserServerEnterprise = 19,
  UserServerEnterprise = 20,
  /**企业钱包 */
  UserServerEnterpriseWallet = 20,
  UserServerEnterpriseWallet = 21,
  /**企业合作钱包 */
  UserServerEnterpriseCooperationWallet = 21,
  UserServerEnterpriseCooperationWallet = 22,
  /**灵工信息 */
  UserServerEnterpriseEmployee = 22,
  UserServerEnterpriseEmployee = 23,
  /**电子签 */
  ElectronSignServerElectronSign = 23,
  ElectronSignServerElectronSign = 24,
  /**电子签 */
  ToolServerSms = 24,
  ToolServerSms = 25,
}
/** 资源请求方式 */
packages/services/apiV2/enterpriseEmployee.ts
@@ -2,6 +2,21 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 添加灵工信息 POST /api/user/enterpriseEmployee/addEnterpriseEmployee */
export async function addEnterpriseEmployee(
  body: API.AddEnterpriseEmployeeCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/enterpriseEmployee/addEnterpriseEmployee', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 企业批量签约合同 POST /api/user/enterpriseEmployee/batchEnterpriseSignContract */
export async function batchEnterpriseSignContract(
  body: API.BatchEnterpriseSignContractCommand,
@@ -176,6 +191,21 @@
  );
}
/** 修复1.3.0.2版本灵工数据 POST /api/user/enterpriseEmployee/repairEnterpriseEmployee_1_3_0_2 */
export async function repairEnterpriseEmployee1302(
  body: API.RepairEnterpriseEmployee1302Command,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/enterpriseEmployee/repairEnterpriseEmployee_1_3_0_2', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 发送邀请签约短信 POST /api/user/enterpriseEmployee/sendInviteElectronSignSms */
export async function sendInviteElectronSignSms(
  body: API.SendInviteElectronSignSmsCommand,
packages/services/apiV2/eventUtils.ts
New file
@@ -0,0 +1,15 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 测试事件 POST /api/common/eventUtils/testEvent */
export async function testEvent(body: API.TestEventCommand, options?: API.RequestConfig) {
  return request<boolean>('/api/common/eventUtils/testEvent', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/apiV2/index.ts
@@ -9,15 +9,16 @@
import * as task from './task';
import * as enterpriseWallet from './enterpriseWallet';
import * as ocrUtils from './ocrUtils';
import * as electronSign from './electronSign';
import * as resource from './resource';
import * as enterpriseCooperationWallet from './enterpriseCooperationWallet';
import * as logRecords from './logRecords';
import * as dictionary from './dictionary';
import * as taskCheckReceive from './taskCheckReceive';
import * as electronSign from './electronSign';
import * as userResume from './userResume';
import * as auth from './auth';
import * as taskUser from './taskUser';
import * as eventUtils from './eventUtils';
import * as enterpriseCooperationWallet from './enterpriseCooperationWallet';
import * as codeUrl from './codeUrl';
import * as syncDatabase from './syncDatabase';
import * as menu from './menu';
@@ -33,15 +34,16 @@
  task,
  enterpriseWallet,
  ocrUtils,
  electronSign,
  resource,
  enterpriseCooperationWallet,
  logRecords,
  dictionary,
  taskCheckReceive,
  electronSign,
  userResume,
  auth,
  taskUser,
  eventUtils,
  enterpriseCooperationWallet,
  codeUrl,
  syncDatabase,
  menu,
packages/services/apiV2/typings.d.ts
@@ -3,6 +3,28 @@
    [key: string]: any;
  }
  interface AddEnterpriseEmployeeCommand {
    /** 姓名 */
    name: string;
    /** 身份证号 */
    identity: string;
    /** 手机号 */
    contactPhoneNumber: string;
    gender?: EnumUserGender;
    /** 年龄 */
    age?: number;
    /** 身份证人像面 */
    identityImg?: string;
    /** 身份证国徽面 */
    identityBackImg?: string;
    /** 电子合同 */
    contractUrl?: string;
    /** 协议起始时间 */
    contractBegin?: string;
    /** 协议终止时间 */
    contractEnd?: string;
  }
  interface AgainSureTaskSettlementOrderRosterCommand {
    /** 名单Id */
    id?: string;
@@ -200,6 +222,8 @@
  interface APIgetMenusParams {
    /** 用户类型 */
    userType?: EnumUserType;
    /** 企业类型 */
    enterpriseType?: EnumEnterpriseType;
    /** 客户端类型 */
    clientType?: EnumClientType;
    /** 角色Id */
@@ -646,6 +670,8 @@
  }
  interface EditEnterpriseEmployeeCommand {
    /** Id */
    id?: string;
    /** 姓名 */
    name: string;
    /** 身份证号 */
@@ -659,8 +685,12 @@
    identityImg?: string;
    /** 身份证国徽面 */
    identityBackImg?: string;
    /** Id */
    id?: string;
    /** 电子合同 */
    contractUrl?: string;
    /** 协议起始时间 */
    contractBegin?: string;
    /** 协议终止时间 */
    contractEnd?: string;
  }
  interface EditTaskSettlementOrderRosterCommand {
@@ -880,6 +910,13 @@
    SMS = 10,
    /**电子签 */
    ElectronSign = 20,
  }
  enum EnumEnterpriseEmployeeSource {
    /**内部 */
    Internal = 10,
    /**外部 */
    External = 20,
  }
  enum EnumEnterpriseRealMethod {
@@ -1116,44 +1153,46 @@
    CommonServerCodeUrls = 4,
    /**文件 */
    CommonServerFileUtils = 5,
    /**事件 */
    CommonServerEventUtils = 6,
    /**文字识别 */
    CommonServerOcrUtils = 6,
    CommonServerOcrUtils = 7,
    /**日志记录 */
    CommonServerLogRecords = 7,
    CommonServerLogRecords = 8,
    /**同步数据库 */
    CommonServerSyncDatabase = 8,
    CommonServerSyncDatabase = 9,
    /**短信工具 */
    CommonServerSmsUtils = 9,
    CommonServerSmsUtils = 10,
    /**配置 */
    CommonServerSettings = 10,
    CommonServerSettings = 11,
    /**用户认证 */
    UserServerAuth = 11,
    UserServerAuth = 12,
    /**用户菜单 */
    UserServerMenu = 12,
    UserServerMenu = 13,
    /**用户资源 */
    UserServerResource = 13,
    UserServerResource = 14,
    /**用户角色 */
    UserServerRole = 14,
    UserServerRole = 15,
    /**用户信息 */
    UserServerUser = 15,
    UserServerUser = 16,
    /**用户钱包 */
    UserServerUserWallet = 16,
    UserServerUserWallet = 17,
    /**电子签 */
    UserServerElectronSign = 17,
    UserServerElectronSign = 18,
    /**用户简历 */
    UserServerUserResume = 18,
    UserServerUserResume = 19,
    /**企业信息 */
    UserServerEnterprise = 19,
    UserServerEnterprise = 20,
    /**企业钱包 */
    UserServerEnterpriseWallet = 20,
    UserServerEnterpriseWallet = 21,
    /**企业合作钱包 */
    UserServerEnterpriseCooperationWallet = 21,
    UserServerEnterpriseCooperationWallet = 22,
    /**灵工信息 */
    UserServerEnterpriseEmployee = 22,
    UserServerEnterpriseEmployee = 23,
    /**电子签 */
    ElectronSignServerElectronSign = 23,
    ElectronSignServerElectronSign = 24,
    /**电子签 */
    ToolServerSms = 24,
    ToolServerSms = 25,
  }
  enum EnumResourceMethod {
@@ -1562,6 +1601,20 @@
    createdTimeEnd?: string;
  }
  interface ExportPersonalUserTransactionEreceiptsCommand {
    /** 关键字 */
    keywords?: string;
    transactionStatus?: EnumWalletTransactionStatus;
    /** 创建时间-起始 */
    createdTimeStart?: string;
    /** 创建时间-截止 */
    createdTimeEnd?: string;
    /** 用户Id */
    userId?: string;
    /** 企业钱包Id */
    enterpriseWalletId?: string;
  }
  interface ExportTaskCheckReceiveTaskUsersCommand {
    /** 任务Id */
    id?: string;
@@ -1686,6 +1739,25 @@
    /** 错误码 */
    errorCode?: string;
    data?: EnterpriseUserElectronSignCommandResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultFileContentResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    /** 数据 */
    data?: string;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -3959,11 +4031,15 @@
    /** 用户签出时间 */
    userCheckOutTime?: string;
    userCheckHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 用户操作人 */
    userOperator?: string;
    /** 人工签到时间 */
    checkInTime?: string;
    /** 人工签出时间 */
    checkOutTime?: string;
    checkHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 操作人 */
    checkOperator?: string;
    /** 操作人 */
    operator?: string;
    /** 最近提交时间 */
@@ -3977,6 +4053,8 @@
  interface GetCheckReceiveTaskQueryResultObjectData {
    /** 供应商Id */
    supplierEnterpriseId?: string;
    /** 是否内部订单 */
    isInternal?: boolean;
    /** 需求人数 */
    needPeopleNumber?: number;
    /** 任务名称 */
@@ -4120,6 +4198,8 @@
  interface GetCheckReceiveTaskUserSubmitQueryResult {
    /** 提交Id */
    id?: string;
    /** 任务人员Id */
    taskInfoUserId?: string;
    enterpriseEmployeeUser?: GetCheckReceiveTaskUserSubmitsQueryResultObjectDataEnterpriseEmployeeUser;
    /** 验收时间 */
    date?: string;
@@ -4131,17 +4211,35 @@
    /** 用户签出时间 */
    userCheckOutTime?: string;
    userCheckHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 用户操作人 */
    userOperator?: string;
    /** 人工签到时间 */
    checkInTime?: string;
    /** 人工签出时间 */
    checkOutTime?: string;
    checkHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 操作人 */
    checkOperator?: string;
    /** 操作人 */
    operator?: string;
    /** 验收照片 */
    files?: string[];
    /** 验收方式 */
    checkReceiveMethods?: EnumTaskCheckReceiveMethod[];
    /** 超时服务费 */
    /** 任务超时服务费单价 */
    timeoutServiceFee?: number;
    /** 服务费(元) */
    serviceFee?: number;
    /** 超时(小时) */
    timeoutHours?: number;
    /** 超时费用(元) */
    timeoutFee?: number;
    /** 其他费用(元) */
    otherFee?: number;
    /** 备注 */
    remark?: string;
    /** 结算金额 */
    settlementAmount?: number;
  }
  interface GetCheckReceiveTaskUserSubmitsQuery {
@@ -4169,11 +4267,15 @@
    /** 用户签出时间 */
    userCheckOutTime?: string;
    userCheckHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 用户操作人 */
    userOperator?: string;
    /** 人工签到时间 */
    checkInTime?: string;
    /** 人工签出时间 */
    checkOutTime?: string;
    checkHistoryType?: EnumTaskUserSubmitCheckHistoryType;
    /** 操作人 */
    checkOperator?: string;
    /** 操作人 */
    operator?: string;
    /** 提交时间 */
@@ -4784,8 +4886,13 @@
    /** 签约时间-最晚时间 */
    signContractTimeEnd?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 实名时间-最早时间 */
    userRealTimeStart?: string;
    /** 实名时间-最晚时间 */
    userRealTimeEnd?: string;
    /** 是否实名 */
    isReal?: boolean;
    source?: EnumEnterpriseEmployeeSource;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    signContractStatus?: EnumGetEnterpriseEmployeesQuerySignContractStatus;
@@ -4844,6 +4951,14 @@
    enterpriseSignContractTime?: string;
    /** 电子合同 */
    contractUrl?: string;
    /** 协议起始时间 */
    contractBegin?: string;
    /** 协议终止时间 */
    contractEnd?: string;
    source?: EnumEnterpriseEmployeeSource;
    /** 来源名称 */
    sourceName?: string;
    /** 创建时间 */
    createdTime?: string;
  }
@@ -5401,6 +5516,7 @@
    /** 是否选择(用户角色授权) */
    isChecked?: boolean;
    userType?: EnumUserType;
    enterpriseType?: EnumEnterpriseType;
    clientType?: EnumClientType;
    /** 上级Id */
    parentId?: string;
@@ -6162,6 +6278,9 @@
    settlementReceiveStatus?: SettlementReceiveStatus;
    /** 结算时间 */
    settlementTime?: string;
    settlementAuditStatus?: EnumTaskSettlementAuditStatus;
    /** 审核时间 */
    settlementAuditTime?: string;
    /** 付款人账户 */
    payerAccount?: string;
    /** 付款人名称 */
@@ -6357,6 +6476,8 @@
    dataPower?: EnumRoleWebApiDataPower;
    /** 备注 */
    remark?: string;
    /** 用户数 */
    userCount?: number;
    /** 菜单Id */
    menuIds?: string[];
    /** 资源 */
@@ -6807,6 +6928,8 @@
    billingMethod?: EnumBillingMethod;
    /** 服务费 */
    serviceFee?: number;
    /** 预计服务费 */
    estimatedServiceFee?: number;
    /** 核定工时 */
    verifyWorkHours?: number;
    /** 超时服务费 */
@@ -7503,6 +7626,10 @@
    contactPhoneNumber?: string;
    /** 身份证号 */
    identity?: string;
    /** 协议起始时间 */
    contractBegin?: string;
    /** 协议终止时间 */
    contractEnd?: string;
  }
  interface ImportTaskSettlementOrderRostersCommand {
@@ -7854,6 +7981,8 @@
  type RepairContractTemplateValuePointBy1202Command = Record<string, any>;
  type RepairEnterpriseEmployee1302Command = Record<string, any>;
  type RepairTaskEstimatedServiceFee1301Command = Record<string, any>;
  interface ResendResourceCommand {
@@ -8087,6 +8216,7 @@
  interface SaveMenuCommand {
    userType?: EnumUserType;
    enterpriseType?: EnumEnterpriseType;
    clientType?: EnumClientType;
    /** 上级Id */
    parentId?: string;
@@ -8300,6 +8430,8 @@
    billingMethod: EnumBillingMethod;
    /** 服务费 */
    serviceFee?: number;
    /** 预计服务费 */
    estimatedServiceFee?: number;
    /** 核定工时 */
    verifyWorkHours?: number;
    /** 超时服务费 */
@@ -8842,6 +8974,8 @@
    remark?: string;
  }
  type TestEventCommand = Record<string, any>;
  interface UpdateEnterpriseWeChatPayWalletBankAccountInfoCommand {
    /** 企业Id */
    enterpriseId?: string;
packages/services/apiV2/user.ts
@@ -47,6 +47,21 @@
  });
}
/** 导出个人用户收支明细电子回单 POST /api/user/user/exportPersonalUserTransactionEreceipts */
export async function exportPersonalUserTransactionEreceipts(
  body: API.ExportPersonalUserTransactionEreceiptsCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/user/exportPersonalUserTransactionEreceipts', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 查询个人用户银行卡信息 GET /api/user/user/getPersonalUserBankCard */
export async function getPersonalUserBankCard(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)