wupengfei
4 天以前 cfa7283b1d47334b648493270c88d609b956ee11
feat: 签约
3个文件已添加
15个文件已修改
260 ■■■■■ 已修改文件
apps/bMiniApp/src/app.config.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/constants/router.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobDetailFromManage/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManageExtraPage/flexJobManageExtraPage.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManageExtraPage/flexJobManageExtraPage.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/InnerPage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineAgreementSignDetail/InnerPage.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/enterpriseEmployee.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/enterpriseEmployee.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/enterpriseWallet.ts 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/utils/common.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/utils/message.tsx 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/app.config.ts
@@ -117,6 +117,7 @@
        'flexJobManage/flexJobManage',
        'flexJobDetailFromManage/flexJobDetailFromManage',
        'flexJobSign/flexJobSign',
        'flexJobManageExtraPage/flexJobManageExtraPage',
      ],
    },
  ],
apps/bMiniApp/src/constants/router.ts
@@ -17,6 +17,7 @@
  flexJobManage = '/subpackages/flexJobManage/flexJobManage/flexJobManage',
  flexJobDetailFromManage = '/subpackages/flexJobManage/flexJobDetailFromManage/flexJobDetailFromManage',
  flexJobSign = '/subpackages/flexJobManage/flexJobSign/flexJobSign',
  flexJobManageExtraPage = '/subpackages/flexJobManage/flexJobManageExtraPage/flexJobManageExtraPage',
  // userInfo = '/subpackages/setting/userInfo/userInfo',
  // setting = '/subpackages/setting/setting/setting',
apps/bMiniApp/src/subpackages/flexJobManage/flexJobDetailFromManage/InnerPage.vue
@@ -80,7 +80,7 @@
  try {
    await Message.confirm({ message: '确定要解约吗?' });
    let params: API.StopElectronSignCommand = {
      id: enterpriseEmployeeInfo.value?.id,
      ids: [enterpriseEmployeeInfo.value?.id],
    };
    let res = await enterpriseEmployeeServices.stopElectronSign(params);
    if (res) {
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -44,7 +44,7 @@
              @click.stop="handleUnsign(item)"
              >解约</nut-button
            >
            <nut-button type="primary" @click.stop="checkContract">查看合约</nut-button>
            <nut-button type="primary" @click.stop="checkContract(item)">查看合约</nut-button>
          </template>
          <nut-button
            v-else-if="
@@ -72,7 +72,7 @@
} from '@12333/constants';
import * as enterpriseEmployeeServices from '@12333/services/apiV2/enterpriseEmployee';
import Taro from '@tarojs/taro';
import { Message } from '@12333/utils';
import { Message, setOSSLink } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
@@ -103,7 +103,12 @@
  }
);
function checkContract() {}
function checkContract(item: API.GetEnterpriseEmployeesQueryResultItem) {
  const encodedUrl = encodeURIComponent(setOSSLink(item.contractUrl));
  Taro.navigateTo({
    url: `${RouterPath.flexJobManageExtraPage}?url=${encodedUrl}`,
  });
}
function goDetail(item: API.GetEnterpriseEmployeesQueryResultItem) {
  Taro.navigateTo({
@@ -115,7 +120,7 @@
  try {
    await Message.confirm({ message: '确定要解约吗?' });
    let params: API.StopElectronSignCommand = {
      id: item.id,
      ids: [item.id],
    };
    let res = await enterpriseEmployeeServices.stopElectronSign(params);
    if (res) {
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManageExtraPage/flexJobManageExtraPage.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManageExtraPage/flexJobManageExtraPage.vue
New file
@@ -0,0 +1,17 @@
<template>
  <web-view :src="urlLink" />
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
defineOptions({
  name: 'flexJobManageExtraPage',
});
const router = Taro.useRouter();
const url = (router.params.url as string) ?? '';
const urlLink = computed(() => decodeURIComponent(url));
</script>
apps/bMiniApp/src/subpackages/flexJobManage/flexJobSign/InnerPage.vue
@@ -85,7 +85,7 @@
async function handleInvite() {
  try {
    let params: API.InviteElectronSignCommand = {
      id: enterpriseEmployeeId,
      ids: [enterpriseEmployeeId],
      contractTemplateId: checkedId.value,
    };
    let res = await enterpriseEmployeeServices.inviteElectronSign(params);
apps/cMiniApp/project.private.config.json
@@ -85,6 +85,13 @@
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/mine/mineAgreementSign/mineAgreementSign",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                }
            ]
        }
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/InnerPage.vue
@@ -107,6 +107,7 @@
  name: 'InnerPage',
});
const { userDetail } = useUser();
const router = Taro.useRouter();
const type = router.params?.type ?? '';
@@ -115,7 +116,7 @@
  identityBackImg: [] as FileItem[],
  name: '',
  identity: '',
  phoneNumber: '',
  phoneNumber: userDetail.value?.contactPhoneNumber,
  verifyCode: '',
});
apps/cMiniApp/src/subpackages/mine/mineAgreementSignDetail/InnerPage.vue
@@ -73,10 +73,11 @@
import MineAgreementSignDetailItem from './MineAgreementSignDetailItem.vue';
import * as enterpriseEmployeeServices from '@12333/services/apiV2/enterpriseEmployee';
import {
  EnumElectronSignAccess,
  EnumTaskUserSignContractStatus,
  EnumTaskUserSignContractStatusText,
} from '@12333/constants';
import { format, Message } from '@12333/utils';
import { format, hiddenPhone, Message, setOSSLink } from '@12333/utils';
import Taro from '@tarojs/taro';
defineOptions({
@@ -112,16 +113,21 @@
function checkAgreement() {
  if (detail?.value?.userSignContractStatus === EnumTaskUserSignContractStatus.Wait) {
    goToSign();
  } else {
    const encodedUrl = encodeURIComponent(detail?.value?.contractUrl);
  }
  if (
    detail?.value?.userSignContractStatus === EnumTaskUserSignContractStatus.Stop ||
    detail?.value?.userSignContractStatus === EnumTaskUserSignContractStatus.Pass
  ) {
    const encodedUrl = encodeURIComponent(setOSSLink(detail?.value?.contractUrl));
    Taro.navigateTo({
      url: `${RouterPath.mineAgreementSignDetail}?url=${encodedUrl}`,
      url: `${RouterPath.mineAgreementSignExtraPage}?url=${encodedUrl}`,
    });
  }
}
const goToSign = useAccessReal(async () => {
  try {
    // if (detail.value?.contractTemplateAccess === EnumElectronSignAccess.BestSign) {
    let params: API.PersonalUserElectronSignCommand = {
      id: id,
    };
@@ -130,6 +136,15 @@
      const encodedUrl = encodeURIComponent(res.signContractLongUrl);
      Taro.navigateTo({ url: `${RouterPath.mineAgreementSignExtraPage}?url=${encodedUrl}` });
    }
    // }
    // if (detail.value?.contractTemplateAccess === EnumElectronSignAccess.AlipaySign) {
    //   Message.confirm({
    //     message: `签约短信已发送至您${hiddenPhone(
    //       detail.value?.contactPhoneNumber
    //     )}的手机,请及时查看并签约`,
    //     showCancelBtn: false,
    //   });
    // }
  } catch (error) {}
});
Taro.useDidShow(() => {
packages/constants/apiEnum.ts
@@ -227,10 +227,12 @@
  UserServerUserResume = 13,
  /**企业信息 */
  UserServerEnterprise = 14,
  /**企业钱包 */
  UserServerEnterpriseWallet = 15,
  /**灵工信息 */
  UserServerEnterpriseEmployee = 15,
  UserServerEnterpriseEmployee = 16,
  /**电子签 */
  ElectronSignServerElectronSign = 16,
  ElectronSignServerElectronSign = 17,
}
/** 资源请求方式 */
packages/constants/enterpriseEmployee.ts
@@ -1,4 +1,8 @@
import { EnumTaskUserHireStatus, EnumTaskUserSignContractStatus } from './apiEnum';
import {
  EnumElectronSignAccess,
  EnumTaskUserHireStatus,
  EnumTaskUserSignContractStatus,
} from './apiEnum';
import { Colors } from './enum';
export const EnumTaskUserHireStatusText = {
@@ -25,3 +29,8 @@
  [EnumTaskUserSignContractStatus.Refuse]: '已拒签',
  [EnumTaskUserSignContractStatus.Stop]: '已解约',
};
export const EnumElectronSignAccessText = {
  [EnumElectronSignAccess.BestSign]: '上上签',
  [EnumElectronSignAccess.AlipaySign]: '支付宝信任签',
};
packages/services/apiV2/enterpriseEmployee.ts
@@ -130,7 +130,7 @@
  body: API.InviteElectronSignCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/enterpriseEmployee/inviteElectronSign', {
  return request<number>('/api/user/enterpriseEmployee/inviteElectronSign', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
@@ -163,7 +163,7 @@
  body: API.StopElectronSignCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/enterpriseEmployee/stopElectronSign', {
  return request<number>('/api/user/enterpriseEmployee/stopElectronSign', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
packages/services/apiV2/enterpriseWallet.ts
New file
@@ -0,0 +1,48 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 支付宝资金二级商户KYB代进件 POST /api/user/enterpriseWallet/alipayFundExpandindirectCreate */
export async function alipayFundExpandindirectCreate(
  body: API.AlipayFundExpandindirectCreateCommand,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/enterpriseWallet/alipayFundExpandindirectCreate', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 资金二级商户KYB代进件状态通知接口 POST /api/user/enterpriseWallet/alipayFundExpandindirectCreateNotify */
export async function alipayFundExpandindirectCreateNotify(
  body: API.AlipayFundExpandindirectCreateNotifyCommand,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/enterpriseWallet/alipayFundExpandindirectCreateNotify', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 支付宝用户授权协议签约通知 POST /api/user/enterpriseWallet/alipayUserAgreementPageSignNotify */
export async function alipayUserAgreementPageSignNotify(
  body: API.AlipayUserAgreementPageSignNotifyQuery,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/enterpriseWallet/alipayUserAgreementPageSignNotify', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/apiV2/index.ts
@@ -11,6 +11,7 @@
import * as task from './task';
import * as dictionary from './dictionary';
import * as electronSign from './electronSign';
import * as enterpriseWallet from './enterpriseWallet';
import * as userResume from './userResume';
import * as auth from './auth';
import * as taskCheckReceive from './taskCheckReceive';
@@ -28,6 +29,7 @@
  task,
  dictionary,
  electronSign,
  enterpriseWallet,
  userResume,
  auth,
  taskCheckReceive,
packages/services/apiV2/typings.d.ts
@@ -3,6 +3,92 @@
    [key: string]: any;
  }
  interface AlipayFundExpandindirectCreateCommand {
    /** 产品码 */
    productCode?: string;
    /** 场景码 */
    bizScene?: string;
    /** 外部单号 */
    outBizNo?: string;
    /** 二级商户信息-标识 */
    identity?: string;
    /** 二级商户信息-标识类型 */
    identityType?: string;
    /** 二级商户信息-姓名 */
    name?: string;
    /** 业务类型 */
    bizType?: string;
    /** 原进件单id */
    originalOrderId?: string;
    /** 资金记账本的业务场景 */
    sceneCode?: string;
    /** 转账场景说明 */
    sceneDirections?: string;
    /** 转账场景截图 */
    sceneImage?: string;
    /** 商户行业资质图片或协议文本 */
    sceneQualificationImage?: string;
    sitesInfo?: AlipayFundExpandindirectCreateCommandSites;
  }
  interface AlipayFundExpandindirectCreateCommandSites {
    website?: string;
    app?: string;
    gongzh?: string;
    qita?: string;
    xchengxU_ZHI?: string;
  }
  interface AlipayFundExpandindirectCreateNotifyCommand {
    /** 通知ID */
    notify_id?: string;
    /** 消息发送时的服务端时间 */
    utc_timestamp?: string;
    /** 消息接口名称 */
    msg_method?: string;
    /** 消息接受方的应用id */
    app_id?: string;
    /** 版本号(1.1版本为标准消息) */
    version?: string;
    /** 消息报文 */
    biz_content?: string;
    /** 签名 */
    sign?: string;
    /** 签名类型 */
    sign_type?: string;
    /** 编码集,该字符集为验签和解密所需要的字符集 */
    charset?: string;
  }
  interface AlipayUserAgreementPageSignNotifyQuery {
    /** 协议产品码,商户和支付宝签约时确定,不同业务场景对应不同的签约产品码。 */
    personal_product_code?: string;
    /** 当前签约的协议场景。 */
    sign_scene?: string;
    /** NORMAL    协议当前状态 1. TEMP:暂存,协议未生效过; 2. NORMAL:正常; 3. STOP:暂停 */
    status?: string;
    /** 用户签约的支付宝账号对应的支付宝唯一用户号。 以2088开头的16位纯数字组成。 */
    alipay_user_id?: string;
    /** 支付宝系统中用以唯一标识用户签约记录的编号。 */
    agreement_no?: string;
    /** 支付宝代扣协议的实际签约时间,格式为yyyy-MM-dd HH:mm:ss。 */
    sign_time?: string;
    /** 用户在商户网站的登录账号,如果商户接口中未传,则不会返回 */
    external_logon_id?: string;
    /** 支付宝分配给开发者的应用Id */
    app_id?: string;
    /** 支付宝分配给商户的应用Id */
    auth_app_id?: string;
    /** 代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)。 */
    external_agreement_no?: string;
    /** 用户代扣协议的实际生效时间,格式为yyyy-MM-dd HH:mm:ss。 */
    valid_time?: string;
    /** 返回脱敏的支付宝账号。 */
    alipay_logon_id?: string;
    /** 用户签约成功通知类型 */
    notify_type?: string;
  }
  interface APIcheckHealthParams {
    /** 健康校验 */
    request?: CheckHealthQuery;
@@ -605,10 +691,12 @@
    UserServerUserResume = 13,
    /**企业信息 */
    UserServerEnterprise = 14,
    /**企业钱包 */
    UserServerEnterpriseWallet = 15,
    /**灵工信息 */
    UserServerEnterpriseEmployee = 15,
    UserServerEnterpriseEmployee = 16,
    /**电子签 */
    ElectronSignServerElectronSign = 16,
    ElectronSignServerElectronSign = 17,
  }
  enum EnumResourceMethod {
@@ -2727,6 +2815,8 @@
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 企业签约时间 */
    enterpriseSignContractTime?: string;
    /** 电子合同 */
    contractUrl?: string;
  }
  type GetEnterpriseLoginInfoQuery = Record<string, any>;
@@ -3215,6 +3305,8 @@
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 手机号 */
    contactPhoneNumber?: string;
    /** 是否实名 */
    isReal?: boolean;
    realMethod?: EnumUserRealMethod;
@@ -3229,6 +3321,7 @@
  interface GetPersonalUserElectronSignQueryResult {
    /** 合同编号 */
    contractCode?: string;
    contractTemplateAccess?: EnumElectronSignAccess;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 签约方信息-员工-姓名 */
    name?: string;
@@ -3236,6 +3329,8 @@
    identityType?: string;
    /** 签约方信息-员工-证件号码 */
    identity?: string;
    /** 签约方信息-员工-手机号 */
    contactPhoneNumber?: string;
    /** 签约方信息-员工-签约时间 */
    userSignContractTime?: string;
    /** 签约方信息-公司主体-主体类型 */
@@ -4128,7 +4223,7 @@
  interface InviteElectronSignCommand {
    /** 灵工Id */
    id?: string;
    ids?: string[];
    /** 合同模板Id */
    contractTemplateId?: string;
  }
@@ -4764,7 +4859,7 @@
  interface StopElectronSignCommand {
    /** 灵工Id */
    id?: string;
    ids?: string[];
  }
  interface SubmitCheckReceiveTaskCommand {
packages/utils/common.ts
@@ -135,3 +135,8 @@
  if (!realIDNumber) return '';
  return realIDNumber.replace(/^(\d+)(.{6})$/, '$1******');
};
export const hiddenPhone = (phone: string) => {
  if (!phone) return '';
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
};
packages/utils/message.tsx
@@ -25,11 +25,17 @@
  title?: string;
  message?: string | VNode;
  confirmText?: string;
  showCancelBtn?: boolean;
};
export class Message {
  static confirm(options: ConfirmOptions = {}) {
    const { title = '提示', message = '确定要删除该数据吗?', confirmText = '确认' } = options;
    const {
      title = '提示',
      message = '确定要删除该数据吗?',
      confirmText = '确认',
      showCancelBtn = true,
    } = options;
    return new Promise((resolve, reject) => {
      Portal.add((key) => {
        return (
@@ -42,6 +48,7 @@
                  title={title}
                  visible={open.value}
                  content={message}
                  showCancelBtn={showCancelBtn}
                  onCancel={() => {
                    onClose();
                    reject();