Commit 023fd55b by 赵庆

gsb

parent a5e4def7
......@@ -4,6 +4,7 @@ class EntcontractApi {
constructor() {
this.entcontractSve = system.getObject("service.entcontractSve");
this.ecompanybusiSve = system.getObject("service.ecompanybusiSve");
this.idcardClient = system.getObject("util.idcardClient");
}
async autoSign(pobj) {
......@@ -68,7 +69,6 @@ class EntcontractApi {
if (param.sign != sign) {
return this.returnjson(1001001, "签名错误");
}
try {
var result = await this.entcontractSve.autoSign(param);
return result;
......@@ -77,76 +77,75 @@ class EntcontractApi {
}
}
async sinedUsers3rd(obj, req) {
// 验证合法性
var appId = obj.appId;
var nonceStr = obj.nonceStr;
var idNo = obj.idNo;
var startId = obj.startId || 0;
var userId = obj.userId || "";
var pageSize = 20;
async autoSignToPer(pobj) {
// 处理参数
var param = {
ecid: this.trim(pobj.ecid),
appId: this.trim(pobj.appId),
userId: this.trim(pobj.userId),
idName: this.trim(pobj.idName),
mobile: this.trim(pobj.mobile),
idNo: this.trim(pobj.idNo),
nonceStr: this.trim(pobj.nonceStr),
sign: this.trim(pobj.sign)
};
if (!param.ecid) {
return this.returnjson(-1, "请传入薪必果提供的ecid")
}
if (!param.appId) {
return this.returnjson(-1, "请传入薪必果提供的appId")
}
if (!param.userId) {
return this.returnjson(-1, "请提供该用户的userId")
}
if (!param.idName) {
return this.returnjson(-1, "请提供该用户姓名")
}
if (!param.idNo) {
return this.returnjson(-1, "请提供该用户身份证号")
}else {
if(!await this.idcardClient.checkIDCard(param.idNo)){
return this.returnjson(-1, "身份证格式不正确");
}
}
if (!param.nonceStr) {
return this.returnjson(-1, "请提供随机码")
}
// 查appId关联key
var busi = await this.ecompanybusiSve.findOne({
appId: appId
appId: param.appId
});
if (!busi) {
return {
code: 1001003,
msg: "配置信息错误,请联系薪必果人员进行配置"
};
if (!busi || !busi.key) {
return this.returnjson(1001003, "配置信息错误,请联系薪必果人员进行配置");
}
// 签名
var signArr = [];
signArr.push("appId=" + appId);
signArr.push("idNo=" + idNo);
signArr.push("nonceStr=" + nonceStr);
signArr.push("startId=" + startId);
signArr.push("userId=" + userId);
signArr.push("key=" + busi.key);
var sign = md5(signArr.join("&")).toUpperCase();
if (sign != obj.sign) {
return {
code: 1001001,
msg: "签名失败"
};
}
var params = {
ecompanyId: busi.ecompany_id,
startId: startId,
idNo: idNo,
pageSize: pageSize,
userId3rd: userId,
};
var keys = Object.keys(param).sort();
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
var v = param[k];
if (!k || !v || k == 'sign') {
continue;
}
signArr.push(k + "=" + v);
}
var signStr = signArr.join("&") + "&key=" + busi.key;
var sign = md5(signStr).toUpperCase();
if (param.sign != sign) {
return this.returnjson(1001001, "签名错误");
}
try {
var userList = await this.entcontractSve.findSignedUses4Push(params);
var result = {
code: 0,
msg: "success",
};
result.data = userList;
return result;
} catch (e) {
var result = {
code: 500,
msg: "接口异常"
};
console.log(e.stack);
//日志记录
logCtl.error({
optitle: "校验是否签约error",
op: "api/econtractApi/validContract",
content: e.stack,
clientIp: req.clientIp
});
var result = await this.entcontractSve.autoSignToPer(param);
return result;
} catch (error) {
console.log(error);
}
}
trim(o) {
if (!o) {
return "";
......@@ -154,7 +153,6 @@ class EntcontractApi {
return o.toString().trim();
}
returnjson(code, msg, data) {
return {
code: code,
......
const system = require("../../system");
const Dao = require("../dao.base");
class YzmerchantsignedDao extends Dao {
constructor() {
super(Dao.getModelName(YzmerchantsignedDao));
}
async getById(id) {
return await this.model.findOne({where: {id: id}, raw: true});
}
}
module.exports = YzmerchantsignedDao;
const system = require("../../system");
const settings = require("../../../config/settings");
const uiconfig = system.getUiConfig2(settings.wxconfig.appId);
module.exports = (db, DataTypes) => {
return db.define("yzmerchantsigned", {
companyName: DataTypes.STRING,
appId: DataTypes.STRING,
mchtId: DataTypes.STRING,
mainId: DataTypes.STRING,
secret: DataTypes.STRING,
}, {
paranoid: true, //假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'c_yzmerchant_signed',
validate: {
},
indexes: [
// Create a unique index on email
// {
// unique: true,
// fields: ['email']
// },
//
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// fields: ['data'],
// using: 'gin',
// operator: 'jsonb_path_ops'
// },
//
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// {
// name: 'public_by_author',
// fields: ['author', 'status'],
// where: {
// status: 'public'
// }
// },
//
// // A BTREE index with a ordered field
// {
// name: 'title_index',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
]
});
}
\ No newline at end of file
const ServiceBase = require("../sve.base");
const moment = require('moment');
const system = require("../../system");
const md5 = require("MD5");
class EntcontractService extends ServiceBase {
constructor() {
......@@ -13,11 +15,11 @@ class EntcontractService extends ServiceBase {
this.esealSve = system.getObject("service.esealSve");
this.ejobapplySve = system.getObject("service.ejobapplySve");
this.restClient = system.getObject("util.restClient");
this.yzmerchantsignedDao = system.getObject("db.yzmerchantsignedDao")
}
async autoSign(params) {
var ecid = params.ecid;
var unionId = params.appId + "_" + ecid;
// enttemplate 模板查询
var etemplate = await this.enttemplateSve.findById(ecid);
......@@ -133,12 +135,9 @@ class EntcontractService extends ServiceBase {
// end_at: end,
};
econtract = await this.create(econtract);
// 创建印章id
var sealId = ecompany.sealId;
let today = new Date().Format("yyyy") + "年" + new Date().Format("MM") + "月" + new Date().Format("dd") + "日";
var signParams = {
templateId: etemplate.templateid, //模板id,由创建模板接口调用返回的templateId 必填
name: etemplate.name, //合同模板名称 必填
......@@ -167,7 +166,7 @@ class EntcontractService extends ServiceBase {
var ebaoAccountId = eaccount.eaccountid; //签署人账户id-- 必填
var thirdOrderNo = econtract.id; //第三方流水号,通知回调使用---选填
var eBaoRedirectBossUrl = "";
//
var tt = await this.utilesignbaoSve.userAutoSignContractNoTemplate(signParams, ebaoAccountId, thirdOrderNo, eBaoRedirectBossUrl, "econtractSve", sealId);
if (tt && tt.data && tt.code == 1) {
econtract.eflowid = tt.data.flowId;
......@@ -184,9 +183,10 @@ class EntcontractService extends ServiceBase {
await econtract.save();
this.syncSign(econtract.id);
return this.returnjson(0, "success", {
contractId: econtract.id
});
return await this.createMerchant(params);
// return this.returnjson(0, "success", {
// contractId: econtract.id
// });
}
return this.returnjson(-1, tt.message || "签约失败", tt.code);
}
......@@ -304,6 +304,7 @@ class EntcontractService extends ServiceBase {
sql.push("AND t3.`branchCode3rd` = :branchCode3rd");
}
sql.push("ORDER BY t1.id ASC LIMIT :pageSize ");
var list = await this.dao.customQuery(sql.join(" "), params);
for (var item of list) {
......@@ -342,6 +343,263 @@ class EntcontractService extends ServiceBase {
data: data || null
}
}
async createMerchant(params) {
var reqUrl = "http://39.106.185.66:8000/merchant/busi/reg";
var data = {
appId: "1202849621743763458",
mchtId: "1202848945651318786",
type: "0",// 类型 0 一般纳税人 1 小规模纳税人
companyName: params.name,//商户名称
mobile: params.contactMobile,//手机号
mainId: "67731504",//代征主体 67731101
signedName: params.name, //合同名称 使用商户名称
beginTime: moment().format("YYYY-MM-DD"), //当前时间, // 签约开始时间
invalidTime: moment().add(2, 'y').format("YYYY-MM-DD"), // 签约失效时间
completeTime: moment().format("YYYY-MM-DD"), // 签约完成时间 取当前时间
incomeCompany: "0", // 个税来源 0 个税向个人收 1 个税向企业收
addedCollectType: "0", // 服务费PLUS收取类型, 0 个人收 1 企业收
addedValueRate: 6.5, // 服务费PLUS费率(%)
serviceCollectType: "0", // 服务费收取类型, 0 个人收 1 企业收
serviceRate: '0.0', //服务费率(%)
operatingCost: '0.0', // 核定成本费用率(%)
taxChargeMode: "0", // 个税计费模式 0 按月,1 按年
signType: 'MD5',
nonceStr: "1398243242129742"
};
var signArr = [];
var keys = Object.keys(data).sort();
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
var v = data[k];
signArr.push(k + "=" + v);
}
var signStr = signArr.join("&") + "&key=4a112ce87c38464d8d454caf23b7b31f";
data.sign = md5(signStr).toUpperCase();
data.bizContent = [
{
"quickDeductionFactor": 0,
"minValue": 0,
"rate": 0,
"maxValue": 3000000
},
{
"quickDeductionFactor": 0,
"minValue": 3000001,
"rate": 1.5,
"maxValue": 10000000
},
{
"quickDeductionFactor": 0,
"minValue": 10000001,
"rate": 4.86,
"maxValue": 214748364700
}
];
var rtn = null;
try {
rtn = await this.restClient.execPost(data, reqUrl);
if (rtn.stdout == null || rtn.stdout == "" || rtn.stdout == "undefined") {
result.errCode = -100;
result.code = -100;
result.message = "请求结果返回为空";
return result;
}
var erchants = await this.yzmerchantsignedDao.findOne({
companyName: params.name,
});
var reso = JSON.parse(rtn.stdout);
if (!erchants) {
await this.yzmerchantsignedDao.create({
companyName: params.name,
appId: reso.data.appId,
mchtId: reso.data.mchtId,
mainId: reso.data.mainId,
secret: reso.data.secret,
});
}
return reso;
} catch (e) {
console.log(e.stack);
result.errCode = -200;
result.code = -200;
result.message = "操作异常";
return result;
}
}
async autoSignToPer(params) {
var ecid = params.ecid;
var unionId = params.appId + "_" + params.userId + params.userCode + params.branchCode;
// ecid etemplate
var etemplate = await this.etemplateSve.findById(ecid);
// ecompany
var ecompany = await this.ecompanyDao.findById(etemplate.ecompany_id);
// p_user
var user = await this.userDao.findOne({
unionId: unionId,
});
if (!user) {
user = await this.userDao.create({
appkey: params.appId,
unionId: unionId,
userId3rd: params.userId,
userName: params.idName,
mobile: params.mobile,
utype: 0,
});
}
// p_user_eaccount
var eaccount = await this.usereaccountDao.findOne({
user_id: user.id,
personsSign: params.idNo,
}) || {};
var isNeedCreate = !eaccount.eaccountid || eaccount.userName != params.idName || eaccount.mobile != params.mobile;
eaccount.user_id = user.id;
eaccount.userName = params.idName;
eaccount.mobile = params.mobile;
eaccount.personsSign = params.idNo;
if (eaccount.id) {
await eaccount.save();
} else {
eaccount = await this.usereaccountDao.create(eaccount);
}
// c_econtract
var econtract = await this.dao.findOne({
eflowstatus: '2',
usereaccount_id: eaccount.id,
etemplate_id: ecid,
});
if (econtract) {
return this.returnjson(0, "用户已经签约", {
contractId: econtract.id
});
}
// e签宝流程
if (isNeedCreate) {
var uidStr = await this.getUidStr(8, 36);
var thirdId = etemplate.id + "_" + eaccount.id + uidStr;
//2.创建e签宝account 5.2.1 , 创建后save()
var params = {
thirdId: thirdId,
name: eaccount.userName,
idNo: eaccount.personsSign,
idType: 19,
mobile: eaccount.mobile
};
var getAccount = await this.utilesignbaoSve.createAccountId(params, "econtractSve");
if (getAccount && getAccount.code == 1 && getAccount.data) {
eaccount.eaccountid = getAccount.data.accountId;
await eaccount.save();
} else {
return this.returnjson(-1, "账户创建失败");
}
}
// 3.设置静默签署授权 5.2.5
if (!eaccount.isGrantAuto) {
var paramsGrant = {
grantAccountId: eaccount.eaccountid
};
var grantAuto = await this.utilesignbaoSve.grantAuthorization(paramsGrant, "econtractSve");
if (grantAuto.code != 1) {
return this.returnjson(-1, "静默签署设置失败");
}
eaccount.isGrantAuto = true;
await eaccount.save();
}
// 创建合同 fileurl、esignUrl 怎么赋值????????????
econtract = {
name: ecompany.name,
eflowstatusname: "签约中",
eflowstatus: "1",
// begin_at: now,
// completed_at: now,
user_id: eaccount.user_id,
usereaccount_id: eaccount.id,
etemplate_id: etemplate.id,
ecompany_id: ecompany.id,
// end_at: end,
};
econtract = await this.create(econtract);
// 创建印章id
var sealId = "";
var eseal = await this.esealSve.findOne({
nameA: etemplate.nameA
});
// 生产环境需要打开
if (!eseal) {
// var accountId = ""; // 测试
var rs = await this.utilesignbaoSve.creatEntSignet(settings.apiconfig.companyAccountId(), etemplate.nameA + "alias", etemplate.nameA, "", "", "econtractSve");
// var rs = await this.utilesignbaoSve.creatEntSignet("740b19e0799a4d7abacfa1a31fb72b1e", etemplate.nameA + "alias", etemplate.nameA, "", "", "econtractSve");
if (rs && rs.code == 1) {
sealId = rs.data.sealId;
await this.esealSve.create({
nameA: etemplate.nameA,
sealId: sealId,
});
} else {
return this.returnjson(-1, "生成印章错误");
}
} else {
sealId = eseal.sealId;
}
let today = new Date().Format("yyyy-MM-dd");
var signParams = {
templateId: etemplate.templateid, //模板id,由创建模板接口调用返回的templateId 必填
name: ecompany.name, //合同模板名称 必填
simpleFormFields: {
nameA: etemplate.nameA, //甲方 必填
nameB: eaccount.userName, //乙方 必填
unit: ecompany.name, //合作单位(国美) 必填---------------------------超出长度风险---目前不知多少长度
signDateA: today, //甲方签约日期 必填
signDateB: today //乙方签约日期 必填
}
};
var ebaoAccountId = eaccount.eaccountid; //签署人账户id-- 必填
var thirdOrderNo = econtract.id; //第三方流水号,通知回调使用---选填
var eBaoRedirectBossUrl = "";
var tt = await this.utilesignbaoSve.userAutoSignContractNoTemplate(signParams, ebaoAccountId, thirdOrderNo, eBaoRedirectBossUrl, "econtractSve", sealId);
if (tt && tt.data && tt.code == 1) {
econtract.eflowid = tt.data.flowId;
econtract.edocid = tt.data.docId;
econtract.eflowstatus = '2';
econtract.eflowstatusname = "已完成";
var signTime = new Date();
econtract.completed_at = signTime;
econtract.begin_at = signTime;
var end_at = new Date();
end_at.setFullYear(end_at.getFullYear() + 1);
econtract.end_at = end_at;
await econtract.save();
this.syncSign(econtract.id);
return this.returnjson(0, "success", {
contractId: econtract.id
});
}
return this.returnjson(-1, tt.message || "签约失败", tt.code);
}
}
module.exports = EntcontractService;
\ No newline at end of file
const system = require("../../system");
const ServiceBase = require("../sve.base")
class YzmerchantsignedService extends ServiceBase {
constructor() {
super(ServiceBase.getDaoName(YzmerchantsignedService));
}
}
module.exports = YzmerchantsignedService;
......@@ -859,11 +859,6 @@
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
},
"crypto-js": {
"version": "3.1.9-1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
......
......@@ -19,7 +19,6 @@
"connect-redis": "^3.3.3",
"continuation-local-storage": "^3.2.1",
"cookie-parser": "^1.4.3",
"crypto": "^1.0.1",
"crypto-js": "^3.1.9-1",
"debug": "2.6.9",
"easyimage": "^3.1.0",
......
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