feat: 补齐客户端/管理端服务模块与数据库 schema,完善登录短信、法大大签署及公共函数

This commit is contained in:
2026-10-14 21:55:08 +08:00
parent 3481fda7a0
commit 55bcf96889
545 changed files with 28151 additions and 415 deletions
@@ -0,0 +1,31 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, permissionArea} = data
await vk.baseDao.updateAndReturn({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
dataJson: {
permissionArea,
}
})
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,55 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeCardStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, status, refuseReason} = data
const user = await vk.baseDao.updateAndReturn({
dbName: 'uni-id-users',
whereJson:{
_id: id
},
dataJson: {
'businessCard.status': status,
'businessCard.refuseReason': refuseReason,
}
})
if (status === 1) {
const card = await vk.baseDao.findByWhereJson({
dbName: 'jjx-business-card',
whereJson:{
uid: id
}
})
await vk.baseDao.updateById({
dbName: 'uni-id-users',
id,
dataJson: {
businessCard: {
...card.businessCard,
status: 1
}
}
})
await vk.baseDao.del({
dbName: 'jjx-business-card',
whereJson:{
uid: id
}
})
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,32 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url admin/system/user/sys/changeCoop 前端调用的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: "" };
// 业务逻辑开始-----------------------------------------------------------
const company = await vk.baseDao.findById({
dbName: "uni-id-users",
id: data.id
});
const isCoop = (!company.isCoop || company.isCoop === 0) ? 1 : 0
await vk.baseDao.updateById({
dbName: "uni-id-users",
id: data.id,
dataJson: {
isCoop
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,29 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, field, value} = data
let dataJson = {}
dataJson[field] = value
await vk.baseDao.updateAndReturn({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
dataJson
})
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,60 @@
'use strict';
const PROFILE_KEY = 'notaryUnionPayProfile';
module.exports = {
/**
* 审核金久信公正银联资料
* @url admin/system/user/sys/changeNotaryUnionPayProfileStatus 前端调用的url参数地址
*/
main: async (event) => {
const {data = {}, util} = event;
const {vk} = util;
const {id, status, refuseReason = null} = data;
const user = await vk.baseDao.findByWhereJson({
dbName: 'uni-id-users',
whereJson: {_id: id}
});
if (!user || !user[PROFILE_KEY]) {
return {
code: -1,
msg: '未找到银联资料'
};
}
const profile = {
...user[PROFILE_KEY],
status,
refuseReason: status === 2 ? refuseReason : null,
reviewTime: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
reviewTimestamp: Date.now(),
};
await vk.baseDao.updateById({
dbName: 'uni-id-users',
id,
dataJson: {
[PROFILE_KEY]: profile,
isNotaryBusiness: status === 1 ? 1 : 0
}
});
await vk.baseDao.add({
dbName: "jjx-message",
dataJson: {
uid: id,
title: '银联资料审核结果',
content: `尊敬的用户,您的金久信公正银联资料已${status === 1 ? '审核通过' : '审核拒绝'}。${status === 2 && refuseReason ? `拒绝原因:${refuseReason}` : ''}`,
type: 'notary-union-pay-profile',
hasRead: false
}
});
return {
code: 0,
msg: '操作成功'
};
}
}
@@ -0,0 +1,32 @@
'use strict';
module.exports = {
/**
* XXXnameXXX
* @url admin/system/user/sys/changeCoop 前端调用的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: "" };
// 业务逻辑开始-----------------------------------------------------------
const company = await vk.baseDao.findById({
dbName: "uni-id-users",
id: data.id
});
const showInYellow = (!company.showInYellow || company.showInYellow === 0) ? 1 : 0
await vk.baseDao.updateById({
dbName: "uni-id-users",
id: data.id,
dataJson: {
showInYellow
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,52 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, authStatus, refuseReason} = data
let userLevel = authStatus === 1 ? 0 : -1
const user = await vk.baseDao.findByWhereJson({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
})
if (user.userLevel > 0) userLevel = user.userLevel
await vk.baseDao.updateAndReturn({
dbName: 'uni-id-users',
whereJson: {
_id: id
},
dataJson: {
authStatus,
// fadadaConfirm,
refuseReason,
userLevel,
authTime: Date.now()
}
})
await vk.baseDao.add({
dbName: "jjx-message",
dataJson: {
uid: res.uid,
title: '认证结果',
content: `尊敬的用户,您的认证已${authStatus === 1 ? '通过' : '拒绝'}。`,
type: 'auth',
hasRead: false
}
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,33 @@
module.exports = {
/**
* 查询用户列表(可登录后台的)
* @url admin/system/user/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
let {uid, userId} = data;
let res = {code: 0, msg: ''};
// 业务逻辑开始-----------------------------------------------------------
res = await vk.baseDao.select({
dbName: 'uni-id-users',
whereJson: {
inviter_uid: _.in([userId])
},
})
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -1,54 +1,226 @@
module.exports = {
/**
* 查询用户列表(可登录后台的)
* @url admin/system/user/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
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 { dcloud_appid, appids } = data.formData || {};
let whereJson = {};
if (dcloud_appid) {
if (dcloud_appid === "___empty-array___") {
whereJson["dcloud_appid"] = [];
} else if (dcloud_appid === "___error___") {
whereJson["dcloud_appid"] = _.and(_.exists(true), _.nin(appids));
} else if (dcloud_appid === "___non-existent___") {
whereJson["dcloud_appid"] = _.exists(false);
} else {
whereJson["dcloud_appid"] = _.or(_.eq(dcloud_appid), _.exists(false));
}
}
let dbName = "uni-id-users";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson,
sortArr: [{ "name": "register_date", "type": "desc" }],
// 副表列表
foreignDB: [{
dbName: "opendb-app-list",
localKey: "dcloud_appid",
foreignKey: "appid",
localKeyType: "array",
as: "appList",
limit: 500
}],
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
/**
* 查询用户列表(可登录后台的)
* @url admin/system/user/sys/getList 前端调用的url参数地址
* data 请求参数 说明
* @param {Number} pageIndex 当前页码
* @param {Number} pageSize 每页显示数量
* @param {Array<Object>} sortRule 排序规则
* @param {object} formData 查询条件数据源
* @param {Array<Object>} columns 查询条件规则
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
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 {dcloud_appid, appids, type} = data.formData || {};
let whereJson = {};
if (dcloud_appid) {
if (dcloud_appid === "___empty-array___") {
whereJson["dcloud_appid"] = [];
} else if (dcloud_appid === "___error___") {
whereJson["dcloud_appid"] = _.and(_.exists(true), _.nin(appids));
} else if (dcloud_appid === "___non-existent___") {
whereJson["dcloud_appid"] = _.exists(false);
} else {
whereJson["dcloud_appid"] = _.or(_.eq(dcloud_appid), _.exists(false));
}
}
if (type) {
whereJson["accountType"] = type;
}
if (data.type) {
whereJson["accountType"] = data.type;
}
if (data.isCompanyQuote) {
whereJson["isCompanyQuote"] = 1;
}
if (data.isProductQuote) {
whereJson["isProductQuote"] = 1;
}
if (data.isCostQuote) {
whereJson["isCostQuote"] = 1;
}
if (data.formData) {
if (data.formData.address && data.formData.address.province) {
whereJson["company.addressRegion.province.code"] = data.formData.address.province.code
}
if (data.formData.type) whereJson["accountType"] = data.formData.type;
if (data.formData.isSignOnly) whereJson["isSignOnly"] = true;
if (data.formData.onlyNotaryUnionPayProfile) {
whereJson["notaryUnionPayProfile.status"] = _.in([0, 1, 2]);
}
if (data.formData.hasOwnProperty('profileStatus') && data.formData.profileStatus !== '' && data.formData.profileStatus !== null && data.formData.profileStatus !== undefined) {
if (parseInt(data.formData.profileStatus) === -1) {
whereJson["notaryUnionPayProfile.status"] = _.exists(false);
} else {
whereJson["notaryUnionPayProfile.status"] = parseInt(data.formData.profileStatus);
}
}
}
console.log('whereJson', whereJson)
let dbName = "uni-id-users";
res = await vk.baseDao.getTableData({
dbName,
data,
whereJson,
sortArr: [{"name": "register_date", "type": "desc"}],
// 副表列表
foreignDB: [
{
dbName: "opendb-app-list",
localKey: "dcloud_appid",
foreignKey: "appid",
localKeyType: "array",
as: "appList",
limit: 500
},
{
dbName: "uni-id-users",
localKey: "inviter_uid",
foreignKey: "_id",
localKeyType: "array",
as: "parent",
limit: 1
}
],
});
const toNum = (value, defaultValue = 0) => {
const num = Number(value);
return Number.isNaN(num) ? defaultValue : num;
};
if (data.formData && data.formData.isSignOnly && res.rows && res.rows.length > 0) {
const userIds = res.rows.map(item => item._id).filter(Boolean);
const qybStatMap = {};
userIds.forEach(userId => {
qybStatMap[userId] = {
qybBuyNum: 0,
qybUsedNum: 0,
qybGiftNum: 0,
qybTotalGetNum: 0
};
});
if (userIds.length > 0) {
const payRes = await vk.baseDao.select({
dbName: "jjx-sign-pay_list",
pageSize: 5000,
whereJson: {
userId: _.in(userIds)
}
});
(payRes.rows || []).forEach(item => {
if (item.userId && qybStatMap[item.userId]) qybStatMap[item.userId].qybUsedNum += 1;
});
const orderRes = await vk.baseDao.select({
dbName: "jjx-order",
pageSize: 5000,
whereJson: {
uid: _.in(userIds),
type: 13,
orderStatus: 4
}
});
const orderUserMap = {};
const orderIds = [];
(orderRes.rows || []).forEach(item => {
if (item._id && item.uid && qybStatMap[item.uid]) {
orderUserMap[item._id] = item.uid;
orderIds.push(item._id);
}
});
if (orderIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-order-goods",
pageSize: 5000,
whereJson: {
orderId: _.in(orderIds)
}
});
const goodsRows = goodsRes.rows || [];
const qybIds = [...new Set(goodsRows.map(item => item.goodsId).filter(Boolean))];
const qybMap = {};
if (qybIds.length > 0) {
const qybRes = await vk.baseDao.select({
dbName: "jjx-qyb",
pageSize: 5000,
whereJson: {
_id: _.in(qybIds)
}
});
(qybRes.rows || []).forEach(item => {
qybMap[item._id] = item;
});
}
goodsRows.forEach(item => {
const userId = orderUserMap[item.orderId];
if (userId && qybStatMap[userId]) {
const buyNum = Math.max(toNum(item.num, 1), 1);
const qyb = qybMap[item.goodsId];
const getNum = qyb ? toNum(qyb.getNum, 1) : 1;
qybStatMap[userId].qybBuyNum += buyNum;
qybStatMap[userId].qybTotalGetNum += getNum * buyNum;
}
});
}
Object.keys(qybStatMap).forEach(userId => {
qybStatMap[userId].qybGiftNum = Math.max(qybStatMap[userId].qybTotalGetNum - qybStatMap[userId].qybBuyNum, 0);
});
res.rows.forEach(item => {
const qybStat = qybStatMap[item._id] || {};
item.qybBuyNum = qybStat.qybBuyNum || 0;
item.qybUsedNum = qybStat.qybUsedNum || 0;
item.qybNum = toNum(item.qybNum, 0);
item.qybGiftNum = qybStat.qybGiftNum || 0;
});
}
}
for (let i = 0; i < res.rows.length; i++) {
if (res.rows[i].isNotaryBusiness === undefined || res.rows[i].isNotaryBusiness === null) {
res.rows[i].isNotaryBusiness = res.rows[i].notaryUnionPayProfile && res.rows[i].notaryUnionPayProfile.status === 1 ? 1 : 0
}
res.rows[i].profileStatus = res.rows[i].notaryUnionPayProfile ? res.rows[i].notaryUnionPayProfile.status : -1
if (res.rows[i].accountType === 1) {
if (res.rows[i].person && res.rows[i].person.mainSpotCategoryIds && res.rows[i].person.mainSpotCategoryIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-spot-category",
whereJson: {
_id: _.in(res.rows[i].person.mainSpotCategoryIds)
}
});
console.log('goodsRes', goodsRes)
if (goodsRes.rows && goodsRes.rows.length > 0) {
res.rows[i].person.mainSpotCategoryNames = goodsRes.rows.map(item => item.name).join(",");
}
}
}
if (res.rows[i].accountType === 2) {
if (res.rows[i].company && res.rows[i].company.mainSpotCategoryIds && res.rows[i].company.mainSpotCategoryIds.length > 0) {
const goodsRes = await vk.baseDao.select({
dbName: "jjx-spot-category",
whereJson: {
_id: _.in(res.rows[i].company.mainSpotCategoryIds)
}
});
console.log('goodsRes', goodsRes)
if (goodsRes.rows && goodsRes.rows.length > 0) {
res.rows[i].company.mainSpotCategoryNames = goodsRes.rows.map(item => item.name).join(",");
}
}
}
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,29 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, } = data
res = await vk.baseDao.select({
dbName: 'jjx-company-manage-change-log',
whereJson: {
uid: data.userId,
},
sortArr: [{"name": "_add_time", "type": "desc"}],
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -0,0 +1,32 @@
'use strict';
module.exports = {
/**
* 认证审核
* @url admin/system/user/sys/changeStatus 前端调用的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: ""};
// 业务逻辑开始-----------------------------------------------------------
const {id, field, value} = data
for (let i = 0; i < data.list.length; i++) {
await vk.baseDao.update({
dbName: 'uni-id-users',
whereJson: {
_id: data.list[i]
},
dataJson: {
remainQuoteNum: _.inc(data.sendNum)
}
})
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
@@ -30,7 +30,9 @@ module.exports = {
comment,
allow_login_background,
dcloud_appid = [],
login_appid_type
login_appid_type,
isService,
allowArea,
} = data;
let mobile_confirmed;
let email_confirmed;
@@ -75,7 +77,9 @@ module.exports = {
email,
email_confirmed,
comment,
allow_login_background
allow_login_background,
isService,
allowArea
};
// 设置允许登录的应用列表
if (login_appid_type && typeof uniID.setAuthorizedAppLogin === "function") {