智能办公如何创建e10流程

智能办公如何创建e10流程

配置e10流程前,您要做的事情:

  • 1、进入e10管理后台,创建应用,开放接口权限;
  • 2、进入e10管理后台,配置千里聆套件,配置同步人员;
  • 3、进入千里聆系统,进行“外联系统认证配置”;
  • 4、进入e10系统,找到对应的表单信息;
  • 5、进入千里聆系统,AI办公管理->文本结构化处理引擎,创建“必填字段表单”,创建表单字段关联的“词典”;
  • 6、然后,进入意图智能化处理引擎,创建意图,并且关联上步中的表单;
  • 7、最后,把创建的意图(编辑菜单时可以看到“权限”入口),赋权,所有人使用。

当然第4、5、6步骤可以省略,在“添加意图”中找到“意图云市场”,点击进入后,搜索“请假”,找到含有标签"e10"的意图执行安装,
然后编辑意图和表单。

参考接口文档地址:https://weapp.eteams.cn/sp/opendoc/freepass/10.0.2506.01/zh_cn/949862795428020225

1、流程梳理

1.1、 e10表单引擎字段管理

在这里插入图片描述
在这里插入图片描述

  • 找到字段名称字段类型创建表单
  • 记录数据key用于创建意图
  • 找到下拉浏览类型数据,创建词典

2、创建词典

小e词典对应了oa系统中表单字段类型有下拉选项、浏览框、自定义多选(单选)等。

  • 根据下拉选项值,配置小e词典,参考下图:在这里插入图片描述

2.1、 人员词典

  • 请求地址: /api/hrm/restful/queryEmployee
  • 请求方式: POST
  • 请求类型: application/json
参数名称类型必填描述
access_tokenString必填调用接口凭证
currentInteger必填分页-当前页
pageSizeInteger必填分页-页大小(最大1000)
nameLikeListArryay非必填名称模糊查询
containEmployeeExtendBoolean非必填加载基本信息自定义
containUserInfoExtendBoolean非必填加载个人信息自定义(这个参数为true;必然提供个人信息内容)
containUserInfoBoolean非必填加载个人信息

参数示例

{
    "access_token": "9b981cc58b484212a9923c768acaee75",
    "current": 1,
    "pageSize": 20,
    "nameLikeList": ["zhang"],
    "containEmployeeExtend":true,
    "containUserInfoExtend":true,
    "containUserInfo":true

}

返回结果

直接复制到词典配置结果中!

{
    "message": {
        "errcode": "0",
        "errmsg": "success"
    },
    "data": {
        "current": 1,
        "total": 1,
        "data": [
            {
                "employeeExtend": {
                    "802830263522590723": {
                        "title": "单行文本",
                        "value": "aassff"
                    }
                },
                "education": {
                    "id": "767257884333465620",
                    "name": "高中及以下"
                },
                "accumfundaccount": "sss",
                "nation": {
                    "id": "767257884333465630",
                    "name": "汉族"
                },
                "residence_place": "1122",
                "modifier": "2226184113539534645",
                "active_date": "2022-12-12",
                "type": "inside",
                "bankid": "798795283734192129",
                "id_no": "342401198802051876",
                "bank_accountname": "aass",
                "id": "805851627118034951",
                "bank_account": "aaas",
                "created": "2022-12-12",
                "degree": {
                    "id": "767257884333465627",
                    "name": "博士"
                },
                "first_work_date": "2022-12-17",
                "work_year": 0,
                "formdata": "807746708413734913",
                "login_status": "invited",
                "native_place": "安徽省",
                "last_update_time": "2022-12-17",
                "pinyin": "anbang,anbeng",
                "user_id": "2227082695389976109",
                "child_status": "ffss",
                "birthday": "1988-02-05",
                "tenant_key": "t7emfkqmmm",
                "family_contact": "3344",
                "sec_level": 0,
                "update_time": "2022-12-17",
                "job_num": "RYGH5612",
                "department": "2226184113543634646",
                "logogram": "ab",
                "personnel_status": "5",
                "im_uid": "805851627118034951",
                "household_type": {
                    "id": "767257884333465611",
                    "name": "本市城镇"
                },
                "graduate_school": "aaass",
                "marital_status": "married",
                "politics_status": {
                    "id": "767257884333465615",
                    "name": "党员(含预备党员)"
                },
                "age": 34,
                "username": "安蚌"
            }
        ],
        "pageSize": 100
    }
}

下面时图片示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、 智能推荐会议室

  • 请求地址: /api/meeting/meetingOpenApi/getRecommendRoomEvents
  • 请求方式: POST
  • 请求类型: application/json
参数名称类型必填描述
access_tokenString必填调用接口凭证
useridLong必填用户ID
totalMemberInteger非必填参会人数
sizeInteger必填推荐的数据个数(最多只能返回10个)
startString非必填开始时间,格式为(yy-MM-dd HH:mm:ss)
endString非必填结束时间,格式为(yy-MM-dd HH:mm:ss)
keyWordsList非必填模糊查询得关键词数组[“泛微”,“的”,“茶室”]

参数示例

{
    "access_token": "b9758709a445ad918c1ff362ab236c28",
    "userid": "5115992169571507219",
    "totalMember": 5,
    "start": "2023-08-10 11:30:00",
    "end": "2023-08-23 11:30:00",
     "size": 2,
     "keyWords": ["测试"]
}

返回结果

直接复制到词典配置结果中!

{
    "code": 0,
    "msg": "success",
    "status": true,
    "data": [
        {
            "start": "2023-09-10 08:30:00",
            "end": "2023-09-10 23:30:00",
            "permission": 0,
            "room": {
                "id": "761695987479191552",
                "name": "测试会议室",
                "roomDesc": "",
                "status": 1,
                "equipments": ""
            }
        }
    ],
    "fail": false
}

下面时图片示例:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

注意
参数totalNumberstartend这3个参数还没有使用!!!
当这个词典被表单的字段使用后,在使用这3个参数!

  • 首先,表单关联会议室词典
    在这里插入图片描述

  • 然后,找到会议室词典
    在这里插入图片描述

  • 其次,添加剩余参数totalNumberstartend
    +

    • totalMember 参数
      在这里插入图片描述
      function run(object) {
         var total = "";
         var tmp = object.field_1791414335218679810;
         if(tmp != null && tmp.value != null && tmp.value.length > 0){
             total = tmp.value[0];
         }
         if(startTime.length == 0){
             total = "2";
         }
          return total; 
      }
      
    • start 参数
      在这里插入图片描述
      function run(object) {
          var startTime = "";
          var tmp = object.field_1791414335214485505;
          if(tmp != null && tmp.value != null && tmp.value.length > 0){
              startTime = tmp.value[0];
          }
          if(startTime.length == 0){
              startTime = "";
          }
           return startTime; 
      }
      
    • end 参数
      在这里插入图片描述
      function run(object) {
          var end = "";
          var tmp = object.field_1791414335214485506;
          if(tmp != null && tmp.value != null && tmp.value.length > 0){
              end = tmp.value[0];
          }
          if(startTime.length == 0){
              end = "";
          }
           return end; 
      }
      

3、创建表单

在这里插入图片描述

3.1、 表单字段

3.1.1、 附件上传

在这里插入图片描述

  • 请求地址: /api/file/v2/common/upload
  • 请求方式: POST
  • 请求类型: multipart/form-data
参数名称类型必填描述
access_tokenString必填调用接口凭证
fileFile必填上传文件
nameString必填文件名称
useridLong必填用户ID

返回结果

直接复制到配置结果中!

{
	"message": {
		"errcode": "0",
		"errmsg": "success"
	},
	"data": {
		"fileid": "744652681173368833",
		"name": "test.jpeg",
		"size": 69500,
		"sizeUnit": "B",
		"extName": "jpeg",
		"type": "image/jpeg",
		"img": true,
		"uploadUser": "5111916321074015321",
		"uploadUserName": "代娟娟",
		"uploadTime": 1656577963664,
		"ban": false,
		"docId": "8515657796377515961"
	}
}

下面是图片示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、创建流程

4.1、 参考创建流程文档

在这里插入图片描述

如上图,我们可以得到相关信息:

  • 请求地址: /api/workflow/core/paService/v1/doCreateRequest
  • 请求方式: POST
  • 请求类型: application/json
参数名称类型必填描述
access_tokenString必填调用接口凭证
useridLong必填用户ID
requestNameString必填流程标题
workflowIdString必填流程id
otherParamsJson非必填扩展参数,通过脚本配置,参数格式示例:{“isnextflow”:1}
isnextflow是否进行流转,0-否,1-是
formDataJson必填表单字段参数,通过脚本配置

参数示例

{
    "access_token": "9b981cc58b484212a9923c768acaee75",
    "userid": "8614739288664195939",
    "workflowId": "100003460000001155",
    "otherParams": {
        "isnextflow": 1
    }, 
    "formData":{}
}

返回结果

直接复制到意图配置结果中!

{
    "message": {
        "errcode": "0", 
        "errmsg": "success", 
        "requestId": "746802982236315648"
    }
}

4.2、配置意图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
按照上图配置相关请求信息即可!

4.3 、配置意图参数说明

参数 access_token

参数选择access_token,下拉选择全局变量, 下拉选择accessToken

参数 userid

参数选择userid,下拉选择系统值, 下拉选择当前用户id

参数 workflowId

参数选择workflowId,下拉选择固定值, 输入e10流程id

参数 requestName

在参数配置中,有两种实现方式,任意选择一个:

  • 参数选择requestName,下拉选择固定值, 输入框填写 .
  • 参数选择requestName, 下拉选择脚本,脚本配置为:
    在这里插入图片描述

requestName脚本示例:

function run(object) {
    // 当前日期
    var time= $_CURRENT_DATE_$;
    // 当前用户名称
    var userName = $_CURRENT_USER_NAME_$;
    // 格式:请假_2025-01-01-张三
    return "请假_" + time + "_" + userName;
}
参数 otherParams

otherParams.isnextflow值的表示状态:

说明
0不流转节点
1创建流程是否自动流转下一个节点

在参数配置中,有两种实现方式,任意选择一个:

  • 参数选择otherParams, 下拉选择脚本,脚本配置为:
    function run(object){
       // return {"isnextflow":0};
    	return {"isnextflow":1};
    }
    
  • 参数选择otherParams.isnextflow,下拉选择固定值, 输入框填写 1 .
参数 formData

在这里插入图片描述
表数据示例格式:

function run(object) {

    // 默认系统值,用于表单中的人员和部门信息
    var userId = $_CURRENT_USER_ID_$;
    var userName = $_CURRENT_USER_NAME_$;
    var deptId = $_CURRENT_DEPT_ID_$;
    var deptName = $_CURRENT_DEPT_NAME_$;
    
    var formData = {
        "dataDetails": [],
        // "formId": "100003669000000968",  // e10 或者 eteams 表单id
        "module": "workflow"
    };
    
	// 一、主表字段
	
	// 1、普通字段: 日期、原因, 数字,字符串格式数据
	// object.field_1863792674960646145,这里是智能小e自己创建的主表中的一个字段
	// 天数(ts) eteams 表单字段名称
    formData.dataDetails.push(getSimpleWithKey(object.field_1863792674960646145, "ts"));
       
    // 2、下拉词典类型: 请假类型字段,人员
    // object.field_1869557469645627300,这里是智能小e自己创建的主表中的一个字段,例如 请假类型
 	formData.dataDetails.push(getFormOptionWithKey(object.field_1869557469645627300, "sqr" ));
     
    // 3、附件: 结婚证明、出生证明
    // object.field_1863793461187125250,这里是智能小e自己创建的主表中的一个字段,例如 结婚证明
    formData.dataDetails.push(getFormFileWithKey(object.field_1863793461187125250, "fj"));
    
    // 4、默认字段: 申请人、申请部门
    formData.dataDetails.push({
        "content": userId ,  "dataKey": "sqr" // e10 或者 eteams 表单字段名称
    });
    formData.dataDetails.push({
        "content": deptId ,  "dataKey": "sqbm" // e10 或者 eteams 表单字段名称
    });
   
	// 二、下面是明细表
	var arrs = [];
	// 第一个明细表
	var subFormId1 ="100003690000000829"; // 明细表id
	// 第一个明细表普通字段:补打卡理由
    arrs = getDetailSimpleLineWithKey(
    				object.sc_1826901249786830850.field_1826901347786743810, 	
    				subFormId1, "reason" // eteams数据库字段名称
    			);
	for(var i = 0; i < arrs.length; i++){
		formData.dataDetails.push(arrs[i]);	
	}
    
	// 第一个明细表下拉词典类型: 请假类型字段,人员
	arrs = getDetailOptionLineWithKey(
    				object.sc_1826901249786830850.field_1826901347786743811, 	
    				subFormId1, "person" // eteams数据库字段名称
    			);
    for(var i = 0; i < arrs.length; i++){
		formData.dataDetails.push(arrs[i]);	
	}
	// 第一个明细表附件: 结婚证明、出生证明
	arrs = getDetailFileLineWithKey(
    				object.sc_1826901249786830850.field_1826901347786743812, 	
    				subFormId1, "jhzm" // jhzm数据库字段名称
    			);
    for(var i = 0; i < arrs.length; i++){
		formData.dataDetails.push(arrs[i]);	
	}
    
    // todo 第二个明细表
    var subFormId2 ="100003690000000830"; // 明细表id
    // 第一个明细表普通字段:时间
    arrs = getDetailSimpleLineWithKey(
    				object.sc_1826901249786830850.field_1826901347786743810, 	
    				subFormId2, "reason" // eteams数据库字段名称
    			);
	for(var i = 0; i < arrs.length; i++){
		formData.dataDetails.push(arrs[i]);	
	}
    // ... ...
    
    return formData; 
}

function getFormValue(tmp){
	if(null != tmp && null!=tmp.value && tmp.value.length > 0){
        return tmp.value[0];
    }
	return "";
}
function getSimpleWithKey(tmp, dataKey){
    return {
        "content": getFormValue(tmp),
        "dataKey": dataKey // e10 或者 eteams 表单字段名称
    };
}

function getFormOptionWithKey(tmp, dataKey){
	var demo={
        "dataOptions": [],
        "dataKey": dataKey // e10 或者 eteams 表单字段key
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
	        demo.dataOptions.push({
	            "optionId": op_id,          
	            "content": tmp.option[op_id] 
	        });
        }
    }
    return demo;
}

function getFormFileWithKey(tmp, dataKey){
	var demo={
        "dataOptions": [],
        "dataKey": dataKey // e10 或者 eteams 表单字段key
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
        	var item = tmp.option[op_id]; 
	        demo.dataOptions.push({
	             "optionId": op_id , 
                 "content": item.optionName,
                 "type": "file"
	        });
        }
    }
    return demo;
}

function getDetailSimpleLineWithKey(tmp, subFormId, dataKey){
	var arr = [];
    if(null != tmp){
        for(var i = 0; i < tmp.length; i ++){
            var demo = {
                "content": "",
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = tmp[i];
            if(null != r && null != r.value && r.value.length > 0){
                demo.content = r.value[0];
            }
            arr.push(demo);
        } 
    }
    return arr;
}
function getDetailOptionLineWithKey(ttf , subFormId, dataKey){
	var arr = [];
    if(null != ttf && null!=ttf&& ttf.length > 0){
        for(var i = 0; i < ttf.length; i ++){
            var demo = {
                "dataOptions": [],
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = ttf[i];
            if(null != r && null != r.value && r.value.length > 0){
				for(var j = 0; j < r.value.length; j++){
					var op_id = r.value[j];
					var opObj = {
						"optionId": op_id,          
						"content": r.option[op_id]
					};
					demo.dataOptions.push(opObj);
				}
            }
            arr.push(demo);
        } 
    }
    return arr;
}
function getDetailFileLineWithKey(ttf , subFormId, dataKey){
	var arr = [];
    if(null != ttf && null!=ttf&& ttf.length > 0){
        for(var i = 0; i < ttf.length; i ++){
            var demo = {
                "dataOptions": [],
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = ttf[i];
            if(null != r && null != r.value && r.value.length > 0){
				for(var j = 0; j < r.value.length; j++){
					var op_id = r.value[j];
					var opObj = {
						"optionId": op_id,          
						"content": r.option[op_id],
						"type": "file"
					};
					demo.dataOptions.push(opObj);
				}
            }
            arr.push(demo);
        } 
    }
    return arr;
}

4.4、脚本函数

提供两个风格函数,两者选一种使用:

  • 1、“数据库名称”
  • 2、表单字段id

4.4.1 “数据库名称”

提供两个风格函数,两者选一种使用:


// 获取小e表单填写的数据
function getFormValue(tmp){
	if(null != tmp && null!=tmp.value && tmp.value.length > 0){
        return tmp.value[0];
    }
	return "";
}
// 1.1 构造 普通字段: 日期、原因, 数字,字符串格式数据
function getSimpleWithKey(tmp, dataKey){
    return {
        "content": getFormValue(tmp),
        "dataKey": dataKey // e10 或者 eteams 表单字段名称
    };
}
// 2.1 构造 浏览类型数据
function getFormOptionWithKey(tmp, dataKey){
	var demo={
        "dataOptions": [],
        "dataKey": dataKey // e10 或者 eteams 表单字段key
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
	        demo.dataOptions.push({
	            "optionId": op_id,          
	            "content": tmp.option[op_id] 
	        });
        }
    }
    return demo;
}
// 3.1 构造 附件字段类型数据
function getFormFileWithKey(tmp, dataKey){
	var demo={
        "dataOptions": [],
        "dataKey": dataKey // e10 或者 eteams 表单字段key
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
        	var item = tmp.option[optionId]; 
	        demo.dataOptions.push({
	             "optionId": op_id , 
                 "content": item.optionName,
                 "type": "file"
	        });
        }
    }
    return demo;
}
// 明细表,获取基础字段所有行 数据
function getDetailSimpleLineWithKey(tmp, subFormId, dataKey){
	var arr = [];
    if(null != tmp){
        for(var i = 0; i < tmp.length; i ++){
            var demo = {
                "content": "",
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = tmp[i];
            if(null != r && null != r.value && r.value.length > 0){
                demo.content = r.value[0];
            }
            arr.push(demo);
        } 
    }
    return arr;
}
// 明细表,获取浏览字段所有行 数据
function getDetailOptionLineWithKey(ttf , subFormId, dataKey){
	var arr = [];
    if(null != ttf && null!=ttf&& ttf.length > 0){
        for(var i = 0; i < ttf.length; i ++){
            var demo = {
                "dataOptions": [],
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = ttf[i];
            if(null != r && null != r.value && r.value.length > 0){
				for(var j = 0; j < r.value.length; j++){
					var op_id = r.value[j];
					var opObj = {
						"optionId": op_id,          
						"content": r.option[op_id]
					};
					demo.dataOptions.push(opObj);
				}
            }
            arr.push(demo);
        } 
    }
    return arr;
}
// 明细表,获取上传附件所有行 数据
function getDetailFileLineWithKey(ttf , subFormId, dataKey){
	var arr = [];
    if(null != ttf && null!=ttf&& ttf.length > 0){
        for(var i = 0; i < ttf.length; i ++){
            var demo = {
                "dataOptions": [],
                "dataIndex": i + 1, // 表示明细表的行
                "subFormId": subFormId, // e10明细表的表单id
                "dataKey": dataKey  // 明细表的字段id
            };
			var r = ttf[i];
            if(null != r && null != r.value && r.value.length > 0){
				for(var j = 0; j < r.value.length; j++){
					var op_id = r.value[j];
					var opObj = {
						"optionId": op_id,          
						"content": r.option[op_id],
						"type": "file"
					};
					demo.dataOptions.push(opObj);
				}
            }
            arr.push(demo);
        } 
    }
    return arr;
}

4.4.2 “表单字段id”


// 获取小e表单填写的数据
function getFormValue(tmp){
	if(null != tmp && null!=tmp.value && tmp.value.length > 0){
        return tmp.value[0];
    }
	return "";
}
// 1.1 构造 普通字段: 日期、原因, 数字,字符串格式数据
function getSimpleWithId(tmp, id){
    return {
        "content": getFormValue(tmp),
        "fieldId": id// e10 或者 eteams 表单字段id
    };
}

// 2.1 构造 浏览类型数据
function getFormOptionWithId(tmp, fieldId){
	var demo={
        "dataOptions": [],
        "fieldId": fieldId  // e10 或者 eteams 表单字段id
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
	        demo.dataOptions.push({
	            "optionId": op_id,          
	            "content": tmp.option[op_id] 
	        });
        }
    }
    return demo;
}
// 3.1 构造 附件字段类型数据
function getFormFileWithId(tmp, fieldId){
	var demo={
        "dataOptions": [],
        "fieldId": fieldId  // e10 或者 eteams 表单字段id
    }
    if(null != tmp && null != tmp.value && tmp.value.length > 0) {
        for(var i = 0; i < tmp.value.length; i ++){
        	var op_id = tmp.value[i];
        	var item = tmp.option[optionId]; 
	        demo.dataOptions.push({
	             "optionId": op_id , 
                 "content": item.optionName,
                 "type": "file"
	        });
        }
    }
    return demo;
}

5、流程案例

5.1、在智能小e中完成表单填写,不执行提交,在oa中可以直接查看表单内容,手动提交

通过配置,2个步骤即可实现:

  • 修改参数配置:找到otherParams,编辑 {“isnextflow”:1} 为 {“isnextflow”:0} ,从流转到不流转。
  • 修改返回结果,
    • 修改无字段匹配配置变成有字段匹配配置
      在这里插入图片描述
    • 开启去设置,编辑脚本
      在这里插入图片描述
      示例脚本
    function run(object, index) {
      // 获取流程id
      var reqId = object.message.requestId;
      
      // 获取pc系统域名,$_CURRENT_WEB_DOMAIN_$是外联系统的访问地址,这里注意不一样要修改
      // var pcdomain = "https://cloud.qianliling.com";
      var pcdomain = $_CURRENT_WEB_DOMAIN_$;
      
      // 获取移动端系统域名,$_CURRENT_WEB_DOMAIN_$是外联系统的访问地址,这里注意不一样要修改
      var appdomain = $_CURRENT_WEB_DOMAIN_$;
      
      // 是PC端跳转地址
      var link = pcdomain + "/sp/workflow/flowpage/view/" + reqId;
    
      // 移动端跳转地址,
      var mobileLink = appdomain + "/mobile/workflow/flowpage/view/"+ reqId;
      
       // 提示标签,content-表示显示内容,color-表示颜色:purple、warning、error
      var tag = {"content": "", "color": ""};
    
      return { "link": link, "mobileLink": mobileLink, "tag": tag, "fieldValue":"点击查看" };
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值