Commit 6b0b50c3 by 王昆

gsb

parent 15dc7119
...@@ -186,6 +186,31 @@ class Dao{ ...@@ -186,6 +186,31 @@ class Dao{
} }
return this.db.query(sql,tmpParas); return this.db.query(sql,tmpParas);
} }
async customUpdate(sql, paras, t) {
var tmpParas = null;
if (t && t != 'undefined') {
if (paras == null || paras == 'undefined') {
tmpParas = {
type: this.db.QueryTypes.UPDATE
};
tmpParas.transaction = t;
} else {
tmpParas = {
replacements: paras,
type: this.db.QueryTypes.UPDATE
};
tmpParas.transaction = t;
}
} else {
tmpParas = paras == null || paras == 'undefined' ? {
type: this.db.QueryTypes.UPDATE
} : {
replacements: paras,
type: this.db.QueryTypes.UPDATE
};
}
return this.db.query(sql, tmpParas);
}
async findCount(whereObj=null){ async findCount(whereObj=null){
return this.model.count(whereObj, {logging : false}).then(c=>{ return this.model.count(whereObj, {logging : false}).then(c=>{
return c; return c;
......
...@@ -5,6 +5,12 @@ class LDUserDao extends Dao { ...@@ -5,6 +5,12 @@ class LDUserDao extends Dao {
constructor() { constructor() {
super(Dao.getModelName(LDUserDao)); super(Dao.getModelName(LDUserDao));
} }
async updateBalance(id, amt) {
let sql = `UPDATE ${this.model.tableName} SET p_user_balance = p_user_balance + :amt WHERE id = :id AND p_user_balance + :amt >= 0`;
let rs = await this.customUpdate(sql, {id: id, amt: amt});
return rs;
}
} }
module.exports = LDUserDao; module.exports = LDUserDao;
...@@ -5,6 +5,20 @@ class LDUserBankDao extends Dao { ...@@ -5,6 +5,20 @@ class LDUserBankDao extends Dao {
constructor() { constructor() {
super(Dao.getModelName(LDUserBankDao)); super(Dao.getModelName(LDUserBankDao));
} }
async listByCondition(params) {
let sql = [];
sql.push("SELECT");
sql.push(params.attrs || "*");
sql.push("FROM");
sql.push(this.model.tableName);
sql.push("WHERE 1 = 1");
if (params.user_id) {
sql.push("AND user_id = :user_id");
}
return await this.customQuery(sql.join(" "), params);
}
} }
module.exports = LDUserBankDao; module.exports = LDUserBankDao;
...@@ -10,12 +10,20 @@ class LDUserService extends ServiceBase { ...@@ -10,12 +10,20 @@ class LDUserService extends ServiceBase {
async loginH5(params) { async loginH5(params) {
let p_id = params.p_id; let p_id = params.p_id;
let p_user_id = params.p_user_id; let p_user_id = params.p_user_id;
let p_user_balance = system.y2f(params.p_user_balance);
let user = await this.dao.findOne({p_id: p_id, p_user_id: p_user_id}); let user = await this.dao.findOne({p_id: p_id, p_user_id: p_user_id});
if (!user) { if (!user) {
user = await this.dao.create(params); user = await this.dao.create(params);
} else {
user.p_user_balance = p_user_balance;
user.save();
} }
return user; return user;
} }
async updateBalance(id, balance) {
return await this.dao.updateBalance(id, balance);
}
} }
module.exports = LDUserService; module.exports = LDUserService;
\ No newline at end of file
...@@ -6,6 +6,12 @@ class LDUserBankService extends ServiceBase { ...@@ -6,6 +6,12 @@ class LDUserBankService extends ServiceBase {
constructor() { constructor() {
super(ServiceBase.getDaoName(LDUserBankService)); super(ServiceBase.getDaoName(LDUserBankService));
} }
async listByCondition(params) {
let rs = await this.dao.listByCondition(params);
return rs;
}
} }
module.exports = LDUserBankService; module.exports = LDUserBankService;
\ No newline at end of file
...@@ -4,6 +4,9 @@ const settings = require("../../../config/settings"); ...@@ -4,6 +4,9 @@ const settings = require("../../../config/settings");
const AppletBase = require("../applet.base"); const AppletBase = require("../applet.base");
const logCtl = system.getObject("web.oplogCtl"); const logCtl = system.getObject("web.oplogCtl");
const uuidv4 = require('uuid/v4'); const uuidv4 = require('uuid/v4');
const axios = require('axios');
const moment = require('moment');
const md5 = require('md5');
class LDApplet extends AppletBase { class LDApplet extends AppletBase {
constructor() { constructor() {
...@@ -13,18 +16,28 @@ class LDApplet extends AppletBase { ...@@ -13,18 +16,28 @@ class LDApplet extends AppletBase {
this.lduserbankSve = system.getObject("service.lduserbankSve"); this.lduserbankSve = system.getObject("service.lduserbankSve");
this.ldusertradeSve = system.getObject("service.ldusertradeSve"); this.ldusertradeSve = system.getObject("service.ldusertradeSve");
this.esettleSve = system.getObject("service.esettleSve"); this.esettleSve = system.getObject("service.esettleSve");
this.econtractSve = system.getObject("service.econtractSve");
this.userSve = system.getObject("service.userSve");
this.usereaccountSve = system.getObject("service.usereaccountSve");
this.ecompanySve = system.getObject("service.ecompanySve");
this.etemplateSve = system.getObject("service.etemplateSve");
this.utilesignbaoSve = system.getObject("service.utilesignbaoSve");
this.esealSve = system.getObject("service.esealSve");
this.redisClient = system.getObject("util.redisClient"); this.redisClient = system.getObject("util.redisClient");
} }
//************************************************************公共参数处理********************开始*************************************** //************************************************************公共参数处理********************开始***************************************
//验证公共参数信息 //验证公共参数信息
async getLoginUser(req) { async getLoginInfo(req) {
let sid = req.headers["ldh5sid"] || ""; let sid = req.headers["ldh5sid"] || "";
try { try {
let user = JSON.parse(await this.redisClient.get(sid + "_user")); let user = JSON.parse(await this.redisClient.get(sid + "_user"));
let mcht = JSON.parse(this.redisClient.get(sid + "_mcht")); let mcht = JSON.parse(await this.redisClient.get(sid + "_mcht"));
if (user && user.id) { if (!user || !mcht) {
return;
}
if (user.id) {
await this.addLoginCache("LD_H5_LOGIN_" + user.id, sid, user, mcht); await this.addLoginCache("LD_H5_LOGIN_" + user.id, sid, user, mcht);
} }
return {user: user, mcht: mcht}; return {user: user, mcht: mcht};
...@@ -39,7 +52,7 @@ class LDApplet extends AppletBase { ...@@ -39,7 +52,7 @@ class LDApplet extends AppletBase {
"partner": "1", "partner": "1",
"user_id": "1", "user_id": "1",
"mchtId": "1103817785420820481", "mchtId": "1103817785420820481",
"balance": "50" "balance": "5000"
}; };
let en = system.encryption(JSON.stringify(key)); let en = system.encryption(JSON.stringify(key));
...@@ -53,12 +66,22 @@ class LDApplet extends AppletBase { ...@@ -53,12 +66,22 @@ class LDApplet extends AppletBase {
await this.redisClient.delete(sid + "_mcht"); await this.redisClient.delete(sid + "_mcht");
} }
async addLoginCache(uk, sid, mcht, user) { async addLoginCache(uk, sid, user, mcht) {
await this.redisClient.setWithEx(uk, sid, 60 * 60); await this.redisClient.setWithEx(uk, sid, 60 * 60);
await this.redisClient.setWithEx(sid + "_user", JSON.stringify(user), 6 * 60 * 60); await this.redisClient.setWithEx(sid + "_user", JSON.stringify(user), 6 * 60 * 60);
await this.redisClient.setWithEx(sid + "_mcht", JSON.stringify(mcht), 6 * 60 * 60); await this.redisClient.setWithEx(sid + "_mcht", JSON.stringify(mcht), 6 * 60 * 60);
} }
async resetLoginCache(req) {
let sid = req.headers["ldh5sid"] || "";
let user = JSON.parse(await this.redisClient.get(sid + "_user"));
let mcht = JSON.parse(await this.redisClient.get(sid + "_mcht"));
user = await this.lduserSve.findById(user.id);
mcht = await this.esettleSve.findMchtApiInfo({mchtId: mcht.mchtId});
await this.redisClient.setWithEx(sid + "_user", JSON.stringify(user), 6 * 60 * 60);
await this.redisClient.setWithEx(sid + "_mcht", JSON.stringify(mcht), 6 * 60 * 60);
}
async setLogin(user, mcht) { async setLogin(user, mcht) {
let uk = "LD_H5_LOGIN_" + user.id; let uk = "LD_H5_LOGIN_" + user.id;
let sid = await this.redisClient.get(uk); let sid = await this.redisClient.get(uk);
...@@ -66,10 +89,12 @@ class LDApplet extends AppletBase { ...@@ -66,10 +89,12 @@ class LDApplet extends AppletBase {
await this.removeLoginCache(uk, sid); await this.removeLoginCache(uk, sid);
} }
sid = uuidv4(); sid = uuidv4();
await this.addLoginCache(uk, sid, mcht, user); sid = "8200962a-2e9a-4a82-a352-3f0813e8489e-" + user.id;
await this.addLoginCache(uk, sid, user, mcht);
return sid; return sid;
} }
async login(query, body, req) { async login(query, body, req) {
let data = body.data; let data = body.data;
if (!data) { if (!data) {
...@@ -105,9 +130,13 @@ class LDApplet extends AppletBase { ...@@ -105,9 +130,13 @@ class LDApplet extends AppletBase {
return system.getErrResult2(`登录失败,未开通合作`); return system.getErrResult2(`登录失败,未开通合作`);
} }
let user = await this.lduserSve.loginH5({p_id: partner.id, p_user_id: loginInfo.user_id}); let user = await this.lduserSve.loginH5({
p_id: partner.id,
p_user_id: loginInfo.user_id,
p_user_balance: Number(loginInfo.balance || 0)
});
let sid = await this.setLogin(user, partner, mcht); let sid = await this.setLogin(user, mcht);
return system.getResult2({ return system.getResult2({
sid: sid, sid: sid,
user: user user: user
...@@ -118,6 +147,419 @@ class LDApplet extends AppletBase { ...@@ -118,6 +147,419 @@ class LDApplet extends AppletBase {
} }
} }
async loginUser(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
loginInfo.user.p_user_balance = system.f2y(loginInfo.user.p_user_balance);
return system.getResult2(loginInfo.user);
}
async saveSignInfo(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
let p_user_name = this.trim(body.p_user_name);
let p_user_idno = this.trim(body.p_user_idno).toUpperCase();
let p_user_bank_name = this.trim(body.p_user_bank_name);
let p_user_bank_no = this.trim(body.p_user_bank_no);
let p_user_mobile = this.trim(body.p_user_mobile);
if (!p_user_name) {
return system.getErrResult2("请输入真实姓名");
}
if (!p_user_idno) {
return system.getErrResult2("请输入您的身份证号");
}
if (!p_user_bank_name) {
return system.getErrResult2("请输入开户行");
}
if (!p_user_bank_no) {
return system.getErrResult2("请输入您的银行卡号");
}
if (!p_user_mobile) {
return system.getErrResult2("请输入您的手机号码");
}
let lduser = await this.lduserSve.findById(loginInfo.user.id);
if (lduser.econtract_id) {
let ak47 = await this.econtractSve.findById(lduser.econtract_id);
return system.getResult2(ak47.esignUrl);
}
let bankParams = {
name: p_user_name,
idno: p_user_idno.toUpperCase(),
cardno: p_user_bank_no,
mobile: p_user_mobile,
};
let tt = await this.utilesignbaoSve.bankfour(bankParams, "ldApplet.saveSignInfo") || {};
console.log("threeResult-----------------------------", tt);
if (!tt || tt.code == -120) {
return system.getErrResult2("银行四要素(姓名、身份证、银行卡号、手机号)验证失败");
}
if (tt.code == -110) {
return system.getErrResult2("银行四要素验证失败");
}
lduser.p_user_name = p_user_name;
lduser.p_user_idno = p_user_idno;
lduser.p_user_bank_name = p_user_bank_name;
lduser.p_user_bank_no = p_user_bank_no;
lduser.p_user_mobile = p_user_mobile;
lduser = await lduser.save();
let signInfo = await this.genSignUrl(lduser);
lduser.econtract_id = signInfo.contract.id;
lduser.is_sign = true;
lduser = await lduser.save();
try {
await this.redisClient.setWithEx(req.headers["ldh5sid"] + "_user", JSON.stringify(lduser), 6 * 60 * 60);
let b = {
user_id: loginInfo.user.id,
bank_user_name: p_user_name,
bank_user_idno: p_user_idno,
bank_name: p_user_bank_name,
bank_no: p_user_bank_no,
}
let exist = await this.lduserbankSve.findOne(b);
if (!exist) {
await this.lduserbankSve.create(b);
}
} catch (e) {
console.log(e.stack);
}
return system.getResult2(signInfo.signUrl);
}
async contract(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
let u = await this.lduserSve.findById(loginInfo.user.id);
let contract = await this.econtractSve.findInfo({id: u.econtract_id});
return system.getResult2(contract);
}
async genSignUserInfo(lduser) {
let unionId = `LD_${lduser.p_id}_${lduser.id}`;
let user = await this.userSve.findOne({
unionId: unionId
});
if (!user) {
user = await this.userSve.create({
appkey: lduser.p_id,
unionId: unionId,
userId3rd: lduser.id,
userName: lduser.p_user_name,
mobile: lduser.p_user_mobile,
utype: 0,
});
}
let eaccount = await this.usereaccountSve.findOne({
user_id: user.id,
personsSign: lduser.p_user_idno
});
if (!eaccount) {
eaccount = {};
eaccount.user_id = user.id;
eaccount.userName = lduser.p_user_name;
eaccount.mobile = lduser.p_user_mobile;
eaccount.bankno = lduser.p_user_bank_no;
eaccount.personsSign = lduser.p_user_idno;
eaccount = await this.usereaccountSve.create(eaccount);
}
if (!eaccount.eaccountid) {
//创建e签宝account 5.2.1 , 创建后save()
var params = {
thirdId: `${unionId}_${eaccount.id}`,
name: eaccount.userName,
idNo: eaccount.personsSign,
idType: 19,
mobile: eaccount.mobile
};
let tt = await this.utilesignbaoSve.createAccountId(params, "userCtl");
console.log(tt, "----------------------------------------------------tt------------ ");
if (tt && tt.code == 1 && tt.data) {
console.log(tt.code, "----------------------------------------tt.code------------------------ ");
eaccount.eaccountid = tt.data.accountId;
await eaccount.save();
}
}
return {user: user, eaccount: eaccount};
}
async genSignUrl(lduser) {
let partner = await this.ldpartnerSve.findById(lduser.p_id);
let etemplateid = partner.ecid;
let etemplate = await this.etemplateSve.findById(etemplateid);
let company = await this.ecompanySve.findById(etemplate.ecompany_id);
let signUserInfo = await this.genSignUserInfo(lduser);
let user = signUserInfo.user;
let eaccount = signUserInfo.eaccount;
let contract = {
name: company.name,
etemplate_id: etemplateid,
user_id: user.id,
usereaccount_id: eaccount.id,
ecompany_id: etemplate.ecompany_id,
edocid: "",
eflowid: "",
esignUrl: "",
eflowstatus: "1",
isInsure: false,
};
contract = await this.econtractSve.create(contract);
let today = new Date().Format("yyyy-MM-dd");
let nameA = etemplate.nameA;
let eseal = await this.esealSve.findOne({
nameA: nameA
});
var sealId = "";
if (!eseal) {
let rs = await this.utilesignbaoSve.creatEntSignet(settings.apiconfig.companyAccountId(), nameA + "alias", nameA, "", "", "econtractCtl");
if (rs && rs.code == 1) {
sealId = rs.data.sealId;
await this.esealSve.create({
nameA: nameA,
sealId: sealId,
});
} else {
return system.getErrResult2("签约失败, 生成印章错误");
}
} else {
sealId = eseal.sealId;
}
let params = {
templateId: etemplate.templateid, //模板id,由创建模板接口调用返回的templateId 必填
name: company.name, //合同模板名称 必填
simpleFormFields: {
nameA: nameA, //甲方 必填
nameB: eaccount.userName, //乙方 必填
unit: company.name, //合作单位(国美) 必填---------------------------超出长度风险---目前不知多少长度
signDateA: today, //甲方签约日期 必填
signDateB: today //乙方签约日期 必填
}
};
let ebaoAccountId = eaccount.eaccountid; //签署人账户id-- 必填
let thirdOrderNo = contract.id; //第三方流水号,通知回调使用---选填
let eBaoRedirectBossUrl = "https://bpotrade.gongsibao.com";
console.log({
params: params,
ebaoAccountId: ebaoAccountId,
thirdOrderNo: thirdOrderNo
}, "-============= params ===========================");
let tt = await this.utilesignbaoSve.userSignContractNoTemplate(params, ebaoAccountId, thirdOrderNo, eBaoRedirectBossUrl, "ldApplet", sealId);
console.log(tt, "-============= result ===========================");
if (tt && tt.code == 1) {
contract.eflowid = tt.data.flowId;
contract.edocid = tt.data.docId;
contract.esignUrl = tt.data.signUrl;
contract.save();
return {
contract: contract,
signUrl: contract.esignUrl,
}
}
return null;
}
async saveBank(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
let bank_user_name = this.trim(body.bank_user_name);
let bank_user_idno = this.trim(body.bank_user_idno).toUpperCase();
let bank_name = this.trim(body.bank_name);
let bank_no = this.trim(body.bank_no);
if (!bank_user_name) {
return system.getErrResult2("请填写真实姓名");
}
if (!bank_user_idno) {
return system.getErrResult2("请填写身份证号码");
}
if (!bank_no) {
return system.getErrResult2("请填写银行卡号");
}
let bankParams = {
name: bank_user_name,
idno: bank_user_idno,
cardno: bank_no,
};
let bp = {
user_id: loginInfo.user.id,
bank_user_name: bank_user_name,
bank_user_idno: bank_user_idno,
bank_name: bank_name,
bank_no: bank_no,
}
let exists = await this.lduserbankSve.create(bp);
if (exists) {
return system.getResult2(exists);
}
let tt = await this.utilesignbaoSve.bankthree(bankParams, "ldApplet.saveSignInfo") || {};
console.log("threeResult-----------------------------", tt);
if (!tt || tt.code == -120) {
return system.getErrResult2("银行三要素(姓名、身份证、银行卡号)验证失败");
}
if (tt.code == -110) {
return system.getErrResult2("银行三要素验证失败");
}
let bank = await this.lduserbankSve.create({
user_id: loginInfo.user.id,
bank_user_name: bank_user_name,
bank_user_idno: bank_user_idno,
bank_name: bank_name,
bank_no: bank_no,
});
return system.getResult2(bank);
}
async bankList(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
let list = await this.lduserbankSve.listByCondition({user_id: loginInfo.user.id});
for (let b of list) {
b.bank_no = b.bank_no.replace(/^(\d{4})\d+(\d{4})$/, "*****$2");
}
return system.getResult2(list);
}
async cashOut(query, body, req) {
let loginInfo = await this.getLoginInfo(req);
if (!loginInfo) {
return system.getErrResult2("登录过期,请重新登录");
}
let amt = Number(system.y2f(this.trim(body.amt)));
let bank_id = Number(this.trim(body.bank_id));
if (amt == 0) {
return system.getErrResult2("请输入提现金额");
}
if (!bank_id) {
return system.getErrResult2("请选择提现银行卡");
}
let bank = await this.lduserbankSve.findById(bank_id);
if (!bank) {
return system.getErrResult2(`银行卡[${bank_id}]不存在`);
}
let lduser = await this.lduserSve.findById(loginInfo.user.id);
if (amt > lduser.p_user_balance) {
return system.getErrResult2("提现金额超出余额,请重新输入");
}
// 查mcht
let mcht = await this.esettleSve.findMchtApiInfo({mchtId: loginInfo.mcht.mchtId});
if (!mcht) {
return system.getErrResult2("用户商户错误,请重新登录");
}
try {
// 生成trade
let trade = await this.ldusertradeSve.create({
p_id: lduser.p_id,
user_id: lduser.id,
amt: amt,
trade_status: "01",
complete_time: new Date()
});
// 更新用户余额
let ubrs = await this.lduserSve.updateBalance(lduser.id, amt * -1);
console.log(ubrs);
lduser = await this.lduserSve.findById(lduser.id);
// 生成out_trade_no
trade.out_trade_no = `LD_H5APP_${trade.user_id}_${trade.id}`;
await trade.save();
// 发起交易
let bizContent = [];
bizContent.push({
"note": "提现",
"idType": "00",
"idName": bank.bank_user_name,
"seqNo": "1000",
"accNo": bank.bank_no,
"mobile": lduser.p_user_mobile,
"amt": Number(amt),
"accType": "00",
"idNo": bank.bank_user_idno
});
// mchtId, t1.`company_name` AS companyName, t2.`main_id` AS mainId, t3.id AS appId, t3.secret
// var now = moment().add(30, 'seconds').format('YYYYMMDDHHmmss');
let nonceStr = await this.getUidStr(20, 36);
let tradeTime = moment().format('YYYYMMDDHHmmss');
var param = {
"appId": mcht.appId,
"currency": "CNY",
"mchtId": mcht.mchtId,
"nonceStr": nonceStr,
"notityUrl": "https://bpohhr.gongsibao.com/api/econtractApi/transferNotify",
"outTradeNo": trade.out_trade_no,
"signType": "MD5",
"tradeTime": tradeTime,
"bizContent": bizContent,
}
// now
let signArr = [];
signArr.push("appId=" + param.appId);
signArr.push("currency=" + param.currency);
signArr.push("mchtId=" + param.mchtId);
signArr.push("nonceStr=" + param.nonceStr);
signArr.push("notityUrl=" + param.notityUrl);
signArr.push("outTradeNo=" + param.outTradeNo);
signArr.push("signType=" + param.signType);
signArr.push("tradeTime=" + param.tradeTime);
signArr.push("key=" + mcht.secret);
param.sign = md5(signArr.join("&")).toUpperCase();
console.log(JSON.stringify(param));
try {
let rs = await axios({
method: 'post',
url: "https://pay.gongsibao.com/merchant/order/transfer",
data: param,
});
if (rs.data.code === 0) {
trade.trade_status = "00";
await trade.save();
await this.redisClient.setWithEx(req.headers["ldh5sid"] + "_user", JSON.stringify(lduser), 6 * 60 * 60);
return system.getResult2("提现成功");
}
console.log(rs.data);
} catch (error) {
console.log(error);
// 发起失败,删除trade
}
} catch (e) {
console.log(e);
}
return system.getResult2("提现成功,稍后到账");
}
async tradeNotify() {
}
} }
module.exports = LDApplet; module.exports = LDApplet;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment