fix: AI客服+合同审查回复格式化;review.js修复;积分充值流程完善

This commit is contained in:
2026-10-12 17:13:32 +08:00
parent edd53d5d2b
commit 904fd1f8f1
1732 changed files with 340840 additions and 1210 deletions
@@ -1,19 +1,20 @@
module.exports = {
/**
* 添加单条数据
* @url template/db_api/pub/add 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
/**
* 添加单条数据
* @url template/db_api/pub/add 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk , db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
// 随机定位开始-----------------------------------------------------------
// 业务逻辑开始-----------------------------------------------------------
let startTime = Date.now();
// 为了方便测试,这里固定在杭州市西湖区附近
let longitude = 120.12792 + Math.floor(Math.random() * 500) / 10000;
let latitude = 30.228932 + Math.floor(Math.random() * 500) / 10000;
@@ -30,7 +31,10 @@ module.exports = {
},
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
let endTime = Date.now();
res.runTime = (endTime - startTime);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -14,9 +14,9 @@ module.exports = {
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let dbName = "vk-test";
let runTime1 = new Date().getTime();
let startTime = Date.now();
let addNum = 10;
console.log(new Date(runTime1),"开始运行,添加"+addNum+"条数据");
console.log("开始运行,添加"+addNum+"条数据");
// 承载所有读操作的 promise 的数组
let dataArr = [];
@@ -41,10 +41,9 @@ module.exports = {
dataJson:dataArr
});
let runTime2 = new Date().getTime();
let runTime = ((runTime2 - runTime1) / 1000 + "秒");
console.log(new Date(runTime2),"运行结束,耗时:"+runTime);
res.runTime = runTime;
let endTime = Date.now();
res.runTime = endTime - startTime;
console.log("运行结束,耗时:"+res.runTime/1000 + "秒");
// 业务逻辑结束-----------------------------------------------------------
return res;
}
@@ -13,12 +13,17 @@ module.exports = {
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let startTime = Date.now();
res.num = await vk.baseDao.count({
dbName:"vk-test",
whereJson:{
}
});
let endTime = Date.now();
res.runTime = (endTime - startTime);
// 对应的sql:
// count * from vk-test
// 业务逻辑结束-----------------------------------------------------------
@@ -13,7 +13,7 @@ module.exports = {
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let startTime = new Date().getTime();
let startTime = Date.now();
res.item = await vk.baseDao.findById({
dbName:"vk-test",
id:data._id,
@@ -21,7 +21,7 @@ module.exports = {
}
});
let endTime = new Date().getTime();
let endTime = Date.now();
res.runTime = (endTime - startTime);
// 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段
// 对应的sql:
@@ -13,6 +13,8 @@ module.exports = {
let { uid } = data;
let res = { code : 0, msg : 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let startTime = Date.now();
res.item = await vk.baseDao.findByWhereJson({
dbName:"vk-test",
fieldJson:{
@@ -22,6 +24,10 @@ module.exports = {
_id:data._id,
}
});
let endTime = Date.now();
res.runTime = (endTime - startTime);
// 上面的 fieldJson 可以设置 显示什么字段或设置不显示什么字段 如 money:false 代表不显示money字段
// 对应的sql:
// select * from vk-test where _id = "5f3a125b3d11c6000106d338"
@@ -21,7 +21,9 @@ module.exports = {
location: _.geoNear({
geometry: new db.Geo.Point(120.12792, 30.228932), // 点的地理位置,为了方便测试,这里固定在杭州市西湖区
maxDistance: 4000, // 选填,最大距离,米为单位
minDistance: 0 // 选填,最小距离,米为单位
minDistance: 0 ,// 选填,最小距离,米为单位
distanceMultiplier:1, // 返回时在距离上乘以该数字 1代表米 100 代表厘米 0.001 代表千米
distanceField:"distance", // 输出的每个记录中 distance 即是与给定点的距离
})
},
});
@@ -26,7 +26,7 @@ module.exports = {
// 主表字段显示规则
fieldJson:{ token:false, password:false },
// 主表排序规则
sortArr:[{ "name":"_id", "type":"desc" }],
sortArr: [{"name": "_add_time", "type":"desc" }],
// 副表列表
foreignDB:[
{
@@ -0,0 +1,45 @@
module.exports = {
/**
* 多表查询
* @url template/db_api/pub/selects_inviter_uid 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, pubFun, vk, db, _, $ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
/**
* 此为演示 使用数组下标对应的值进行连表,如用户表根据inviter_uid的第一个值进行连表查出第一个上级的用户信息
*/
res = await vk.baseDao.selects({
dbName: "uni-id-users",
getCount: false,
pageIndex: 1,
pageSize: 5,
fieldJson: {
token: false,
password: false
},
// 副表列表
foreignDB: [{
dbName: "uni-id-users",
localKey: $.arrayElemAt(['$inviter_uid', 0]),
foreignKey: "_id",
as: "inviterUserInfo",
limit: 1,
fieldJson: {
token: false,
password: false
},
}]
});
console.log(11, res.rows);
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,36 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url template/db_api/pub/tree 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
res = await vk.baseDao.getTableData({
dbName: "opendb-admin-menus",
whereJson:{
enable: true,
parent_id: null
},
// 树状结构参数
treeProps: {
id: "menu_id", // 唯一标识字段,默认为 _id
parent_id: "parent_id", // 父级标识字段,默认为 parent_id
children: "children", // 自定义返回的下级字段名,默认为 children
level: 3, // 查询返回的树的最大层级。超过设定层级的节点不会返回。默认10级,最大15,最小1
limit: 500, // 每一级最大返回的数据。
whereJson: {
enable: true
}
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,30 @@
'use strict';
module.exports = {
/**
* code2Session
* @url template/openapi/alipay/pub/code2Session 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
code,
} = data;
let code2SessionRes = await vk.openapi.alipay.auth.code2Session({
code,
needKey: true
});
if (code2SessionRes.code !== 0) {
return code2SessionRes;
}
console.log('code2SessionRes: ', code2SessionRes);
res.openid = code2SessionRes.openid;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,24 @@
'use strict';
module.exports = {
/**
* 获取支付宝小程序码
* @url template/openapi/alipay/pub/getMiniCode 前端调用的url参数地址
* data 请求参数
* @param {String} path 小程序页面路径
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
page,
scene
} = data;
res = await vk.openapi.alipay.acode.getMiniCode(data);
res.base64 = res.qr_code_url_circle_white; // 兼容其他小程序的返回字段
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,34 @@
'use strict';
module.exports = {
/**
* code2Session
* @url template/openapi/douyin/pub/code2Session 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
code,
anonymousCode
} = data;
let code2SessionRes = await vk.openapi.douyin.auth.code2Session({
code,
anonymousCode,
needKey: true
});
if (code2SessionRes.code !== 0) {
return code2SessionRes;
}
console.log('code2SessionRes: ', code2SessionRes);
res.openid = code2SessionRes.openid;
res.anonymousOpenid = code2SessionRes.anonymousOpenid;
res.unionid = code2SessionRes.unionid;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,46 @@
'use strict';
module.exports = {
/**
* 获取抖音小程序码
* @url template/openapi/douyin/pub/getMiniCode 前端调用的url参数地址
* data 请求参数
* @param {String} path 小程序页面路径
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
path
} = data;
res = await vk.openapi.douyin.acode.getMiniCode({
path
});
if (typeof res === "object" && res.code) {
return res;
}
try {
// 二进制转base64
let base64 = Buffer.from(res, 'binary').toString('base64');
return {
code: 0,
base64: `data:image/png;base64,${base64}`
};
} catch (err) {
// 转base64失败
return {
code: -1,
msg: "生成小程序码失败",
err: {
message: err.message,
stack: err.stack
}
};
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,38 @@
'use strict';
module.exports = {
/**
* 图片违规检测示例
* @url template/openapi/douyin/pub/imgSecCheck 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { config, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let { base64 } = data;
/**
* 实际开发中,图片可能是多张图,比如多达9张图
* 如果在一个请求中循环检测,可能会超时。
* 方案1:前端选择完图片就自动一张一张检测和上传(即9张图会有9个请求)
* 方案2:使用Promise.all
*/
let imgSecCheckRes = await vk.openapi.douyin.security.imgSecCheck({
base64
});
if (imgSecCheckRes.code !== 0) {
// 未通过检测
return imgSecCheckRes;
}
// 若通过检测,则继续执行自己的业务
// ...
// ...
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,36 @@
'use strict';
module.exports = {
/**
* 文本违规检测示例
* @url template/openapi/douyin/pub/msgSecCheck 前端调用的url参数地址
* data 请求参数 说明
* res 返回参数说明
* @params {Number} code 错误码,0表示成功
* @params {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { config, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: 'ok' };
// 业务逻辑开始-----------------------------------------------------------
let {
content,
} = data;
// 实际业务中,content可能是评论的内容等
let msgSecCheckRes = await vk.openapi.douyin.security.msgSecCheck({
content,
});
if (msgSecCheckRes.code !== 0) {
// 未通过检测
return msgSecCheckRes;
}
res.result = msgSecCheckRes;
// 若通过检测,则继续执行自己的业务
// ...
// ...
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,32 @@
'use strict';
module.exports = {
/**
* code2Session
* @url template/openapi/qq/pub/code2Session 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let {
code,
anonymousCode
} = data;
let code2SessionRes = await vk.openapi.qq.auth.code2Session({
code,
needKey: true
});
if (code2SessionRes.code !== 0) {
return code2SessionRes;
}
console.log('code2SessionRes: ', code2SessionRes);
res.openid = code2SessionRes.openid;
res.unionid = code2SessionRes.unionid;
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}