Commit 36106559 by 宋毅

tj

parent e47c3eb3
...@@ -4,7 +4,6 @@ var settings = require("../../../../config/settings"); ...@@ -4,7 +4,6 @@ var settings = require("../../../../config/settings");
class OrderAPI extends APIBase { class OrderAPI extends APIBase {
constructor() { constructor() {
super(); super();
this.utilsProductSve = system.getObject("service.utilsSve.utilsProductSve");
} }
/** /**
* 接口跳转-POST请求 * 接口跳转-POST请求
...@@ -24,9 +23,9 @@ class OrderAPI extends APIBase { ...@@ -24,9 +23,9 @@ class OrderAPI extends APIBase {
} }
async opActionProcess(pobj, action_type, req) { async opActionProcess(pobj, action_type, req) {
var opResult = null; var opResult = null;
switch (action_type) { switch (action_type) {
case "addOrder"://创建订单 case "addOrder"://创建订单
opResult = await this.utilsProductSve.findByTypeCode(pobj, pobj.actionBody); opResult = await this.addOrder(pobj, pobj.actionBody);
break; break;
default: default:
opResult = system.getResult(null, "action_type参数错误"); opResult = system.getResult(null, "action_type参数错误");
...@@ -34,6 +33,36 @@ class OrderAPI extends APIBase { ...@@ -34,6 +33,36 @@ class OrderAPI extends APIBase {
} }
return opResult; return opResult;
} }
async addOrder(pobj, actionBody) {
if (!actionBody.product_info) {
return system.getResult(null, "产品信息有误,20010");
}
var interface_info = actionBody.product_info.interface_info;
if (!interface_info) {
return system.getResult(null, "产品接口信息有误,20030");
}
if (!interface_info.interface_type) {
return system.getResult(null, "产品接口类型信息有误,20050");
}
if (!interface_info.interface_url) {
return system.getResult(null, "产品接口地址信息有误,20080");
}
var opResult = null;
if (interface_info.interface_type == "bd") {
if (!interface_info.params) {
return system.getResult(null, "产品接口参数信息有误,20110");
}//操作的方法名称
var invokeObj = system.getObject(interface_info.interface_url);
if (!invokeObj[interface_info.params]) {
return system.getResult(null, "产品接口参数方法信息有误,20130");
}
opResult = await invokeObj[interface_info.params].apply(invokeObj, pobj);
}
else if (interface_info.interface_type == "yc") {
}
return opResult;
}
} }
module.exports = OrderAPI; module.exports = OrderAPI;
\ No newline at end of file
...@@ -28,7 +28,7 @@ module.exports = { ...@@ -28,7 +28,7 @@ module.exports = {
//订单类型 //订单类型
"order_type": { "zzdd": "自主订单", "dkxd": "代客下单" }, "order_type": { "zzdd": "自主订单", "dkxd": "代客下单" },
//订单付款状态 //订单付款状态
"order_pay_status": { 1: "待付款", 2: "已付款", 4: "待服务", 8: "已完成" }, "order_status": { 1: "待付款", 2: "已付款", 4: "待服务", 8: "已完成" },
//帐户类型( 支付类型) //帐户类型( 支付类型)
"pay_account_type": { "cash": "现金", "bank": "银行", "wx": "微信", "alipay": "支付宝", "other": "其它" }, "pay_account_type": { "cash": "现金", "bank": "银行", "wx": "微信", "alipay": "支付宝", "other": "其它" },
//订单服务付款状态 //订单服务付款状态
......
...@@ -14,14 +14,14 @@ module.exports = (db, DataTypes) => { ...@@ -14,14 +14,14 @@ module.exports = (db, DataTypes) => {
payTime :DataTypes.DATE,// 渠道有支付时间则用渠道的支付时间 payTime :DataTypes.DATE,// 渠道有支付时间则用渠道的支付时间
quantity :DataTypes.INTEGER,// 订单数量(即产品的倍数,默认值为1) quantity :DataTypes.INTEGER,// 订单数量(即产品的倍数,默认值为1)
serviceQuantity :DataTypes.INTEGER,// 订单服务数量(即与订单数量相对应) serviceQuantity :DataTypes.INTEGER,// 订单服务数量(即与订单数量相对应)
orderPayStatusName :DataTypes.STRING(50),// orderStatusName :DataTypes.STRING(50),//
orderPayStatus :{ orderStatus :{
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
set: function (val) { set: function (val) {
this.setDataValue("orderPayStatus", val); this.setDataValue("orderStatus", val);
this.setDataValue("orderPayStatusName", uiconfig.config.pdict.order_pay_status[val]); this.setDataValue("orderStatusName", uiconfig.config.pdict.order_status[val]);
} }
},// 订单付款状态dfk: 待付款, zfpz: 已上传支付凭证, yfk: 已付款, bfyfk: 部分已付款, ddqx: 订单取消, tkclz: 退款处理中, bfytk: 部分已退款, ytk: 已退款,zfshbtg:支付审核不通过 },// 订单状态dfk: 1: 待付款, 2: 已付款, 4: 待服务, 8: 已完成
totalSum :DataTypes.DECIMAL(12, 2),// 订单总额(产品价格×优惠费率×订单件数) totalSum :DataTypes.DECIMAL(12, 2),// 订单总额(产品价格×优惠费率×订单件数)
payTotalSum :DataTypes.DECIMAL(12, 2),// 订单付款总额 payTotalSum :DataTypes.DECIMAL(12, 2),// 订单付款总额
refundSum :DataTypes.DECIMAL(12, 2),// 退款金额 refundSum :DataTypes.DECIMAL(12, 2),// 退款金额
......
...@@ -6,7 +6,7 @@ module.exports = (db, DataTypes) => { ...@@ -6,7 +6,7 @@ module.exports = (db, DataTypes) => {
uapp_id: DataTypes.INTEGER,// uapp_id: DataTypes.INTEGER,//
sourceOrderNo :DataTypes.STRING(64),//来源单号 sourceOrderNo :DataTypes.STRING(64),//来源单号
productType_id :DataTypes.INTEGER,//产品类型Id productType_id :DataTypes.INTEGER,//产品类型Id
productOneType_id :DataTypes.INTEGER,//产品大类Id pathCode :DataTypes.STRING(512), //产品类型编码路径,如:1/2
itemCode :DataTypes.STRING(64),//产品编码 itemCode :DataTypes.STRING(64),//产品编码
itemName :DataTypes.STRING(100),//产品名称 itemName :DataTypes.STRING(100),//产品名称
channelItemCode :DataTypes.STRING(100),// 渠道产品编码 channelItemCode :DataTypes.STRING(100),// 渠道产品编码
......
...@@ -5,8 +5,6 @@ const uuidv4 = require('uuid/v4'); ...@@ -5,8 +5,6 @@ const uuidv4 = require('uuid/v4');
class OrderInfoService extends ServiceBase { class OrderInfoService extends ServiceBase {
constructor() { constructor() {
super("dbcorder", ServiceBase.getDaoName(OrderInfoService)); super("dbcorder", ServiceBase.getDaoName(OrderInfoService));
this.appproductDao = system.getObject("db.dbapp.appproductDao");
this.orderProductDao = system.getObject("db.dbcorder.orderproductDao");
this.orderReceiptVoucherDao = system.getObject("db.dbcpay.orderreceiptvoucherDao"); this.orderReceiptVoucherDao = system.getObject("db.dbcpay.orderreceiptvoucherDao");
this.orderRefundVoucherDao = system.getObject("db.dbcpay.orderrefundvoucherDao"); this.orderRefundVoucherDao = system.getObject("db.dbcpay.orderrefundvoucherDao");
this.moneyJourneyDao = system.getObject("db.dbcpay.moneyjourneyDao"); this.moneyJourneyDao = system.getObject("db.dbcpay.moneyjourneyDao");
...@@ -20,163 +18,358 @@ class OrderInfoService extends ServiceBase { ...@@ -20,163 +18,358 @@ class OrderInfoService extends ServiceBase {
/* /*
* 订单验证 * 订单验证
*/ */
async isOrderVerify(serviceitem,buyProductCount,buyPrice) { async isOrderVerify(pobj) {
var sveItemRateConfig = serviceitem.rateConfig ? Number(serviceitem.rateConfig) : 0;//产品费率 var actionBody = pobj.actionBody;
var fwf = serviceitem.serviceCharge ? Number(serviceitem.serviceCharge) : 0;//服务费 var price_list = actionBody.product_info.price_list;
var yhfl = serviceitem.discountsRateConfig ? Number(serviceitem.discountsRateConfig) : 0;//最大优惠费率 if (!price_list) {
var gf = serviceitem.publicExpense ? Number(serviceitem.publicExpense) : 0;//产品官费 return system.getResult(null, "产品价格列表信息有误,20150");
var productCount = 1;//产品数量
var gfze = 0;//官费总额
var qdfcbl = serviceitem.channelProfitRate?Number(serviceitem.channelProfitRate) : 0;//渠道利润分成比率
productCount = Number(buyProductCount);//购买产品数量
buyPrice = Number(buyPrice);//购买价格
gfze = gf * Number(productCount);
var fwfze = Number(fwf) * Number(productCount);//服务费总额
var sfze = Number(buyPrice) / (sveItemRateConfig + 100) * sveItemRateConfig; //totalTaxes 税费总额
sfze = sfze.toFixed(2);
sfze = Number(sfze);
var zdyhe = (gfze + fwfze) * yhfl / 100;//最大优惠额
zdyhe = zdyhe.toFixed(2);
zdyhe = Number(zdyhe);
//毛利总额=应付总额-官费总额
var mlze = Number(buyPrice) - gfze;//totalProfitSum 毛利总额
mlze = mlze.toFixed(2);
mlze = Number(mlze);
//优惠金额=服务费+官费总额-应付总额(服务费、官费之和小于等于应付总额时,优惠金额为零)
var yhje = fwfze + gfze - Number(buyPrice);
if (yhje < 0) {
yhje = 0;
} }
yhje = yhje.toFixed(2); var product_price = price_list.filter(f => f.id == actionBody.id);
yhje = Number(yhje); if (!product_price || product_price.length == 0) {
if (yhje > zdyhe) { return system.getResult(null, "产品价格信息有误,20180");
return { code: -205, msg: "优惠总额有误" };
} }
var fcmlze_channel = mlze*qdfcbl ;//订单渠道分成毛利润总额 var totalSum = Number(product_price[0].price) * Number(actionBody.quantity);
var fcmlze_platform = mlze-fcmlze_channel ;//订单平台毛利润总额 if (Number(actionBody.totalSum) < totalSum) {
return {code:1,data:{ return system.getResult(null, "订单金额有误,20210");
totalServiceCharge :fwfze,// 服务费总额(产品配置的服务费*订单件数)
totalPublicExpense :gfze,// 官费总额(产品配置的官费*订单件数)
totalTaxes :sfze,// 税费总额(订单总额-(订单总额/(1+产品费率)))
totalSum :buyPrice,// 订单总额(产品价格×优惠费率×订单件数)
totalProfitSum :mlze,// 订单毛利润总额(订单总额-官费总额)
totalDiscounts :yhje,// 优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度)
pfProfitSum :fcmlze_platform,// 订单平台毛利润总额(订单毛利润总额-订单渠道分成毛利润总额)
channelProfitSum :fcmlze_channel,// 订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率)
}};
}
/**
* 创建订单
*/
async createOrder(obj,req){
var self = this;
var app = req.app;
var user = req.user;
if(!app || !app.uAppId){
return system.getResult(null, "渠道信息有误");
} }
if(!user){ pobj.actionBody.product_info.price_item = product_price[0];
return system.getResult(null, "用户信息有误"); return system.getResultSuccess();
} }
var channelItemCode = obj.itemCode; async createOrder(pobj, orderNo, t) {
if(!channelItemCode){ var actionBody = pobj.actionBody;
return system.getResult(null, "未知的产品码"); var channelOrder = actionBody.channelOrder;
var price_item = actionBody.product_info.price_item;
var totalServiceCharge = Number(price_item.service_charge || 0) * Number(actionBody.quantity);
var totalPublicExpense = Number(price_item.public_expense || 0) * Number(actionBody.quantity);
var totalProfitSum = Number(actionBody.totalSum) - (Number(price_item.supply_price || 0) * Number(actionBody.quantity));
var pfProfitSum = (100 - Number(price_item.channel_profit_rate)) / 100 * totalProfitSum;
if (pfProfitSum < 0) {
pfProfitSum = 0;
} }
var productItem = await this.appproductDao.findOneByChannelItemCode(channelItemCode, app.id);//通过ChannelItemCode获取产品 var channelProfitSum = Number(totalProfitSum) - Number(pfProfitSum);
// if (!productItem) { var params = {
// return system.getResult(null, "未知的产品"); uapp_id: pobj.appInfo.uapp_id,//int(11) //
// } orderNo: orderNo,//varchar(64) //订单号
var verifyResult=null; channelServiceNo: channelOrder.channelServiceNo || "",//varchar(64) //渠道服务单号
if (productItem) { channelOrderNo: channelOrder.channelOrderNo || "",//varchar(1024) //渠道订单号列表,多个以,隔开
if(productItem.status != 1){ channelUserId: pobj.userInfo.channel_userId,//varchar(64) //
return system.getResult(null, "产品已禁用"); ownerUserId: pobj.userInfo.channel_userId,//varchar(20) //
needNo: channelOrder.needNo || "",//varchar(64) //需求单号
needNoOrderNo: channelOrder.needNoOrderNo || "",//varchar(64) //需求订单号
payTime: channelOrder.orderStatus && channelOrder.orderStatus == 1 ? new Date() : null,//datetime //
quantity: actionBody.quantity,//int(11) //项目订单数量(即服务项目的倍数,默认值为1)
serviceQuantity: 0,//int(11) //项目订单交付数量(即与项目订单数量相对应)
orderStatus: channelOrder.orderStatus || 1,//int //订单状态: 1: 待付款, 2: 已付款, 4: 待服务, 8: 已完成
totalSum: actionBody.totalSum,//decimal(12,2) //订单总额(产品价格×优惠费率×订单件数)
payTotalSum: actionBody.payTotalSum,//decimal(12,2) //
refundSum: 0,//decimal(12,2) //退款总额
totalServiceCharge: totalServiceCharge,//decimal(12,2) //服务费总额(产品配置的服务费*订单件数)
totalPublicExpense: totalPublicExpense,//decimal(12,2) //官费总额(产品配置的官费*订单件数)
totalProfitSum: totalProfitSum,//decimal(12,2) //订单毛利润总额(产品价格-供货价格))
pfProfitSum: pfProfitSum,//decimal(12,2) //订单平台毛利润总额((100-渠道利润分成比例)/100 * 订单毛利润总额)
channelProfitSum: channelProfitSum,//decimal(12,2) //订单渠道分成毛利润总额(订单毛利润总额-平台毛利润总额)
totalDiscounts: 0,//decimal(12,2) //优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度)暂时没有用到
pfSettleProfit: 0,//int(11) //平台结算渠道利润,0否,1是
invoiceApplyStatus: "00",//varchar(10) //发票状态:00: 未申请, 10: 已申请,20:已开票
notes: ,//varchar(255) //
opNotes: ,//varchar(255) //操作备注
};
var order = await this.dao.create(params, t);//创建订单
var orderProductObj = {
uapp_id: pobj.appInfo.uapp_id,
sourceOrderNo: orderNo, // 来源单号
productType_id: price_item.productType_id,//产品类型Id
pathCode: price_item.path_code,//产品路径
itemCode: price_item.item_code,//产品编码
itemName: price_item.item_name,//产品名称
channelItemCode: price_item.channel_item_code,// 渠道产品编码
channelItemName: price_item.channel_item_name,// 渠道产品名称
serviceItemCode: price_item.service_item_code,// 服务商产品编码
picUrl: price_item.pic_url,// 产品图片地址
proPrice: actionBody.totalSum, // 产品总价格
quantity: actionBody.quantity,// 订单数量(即产品的倍数,默认值为1)
opPayType: "00",// 操作付款类型:00: 创建订单, 10: 补单
serviceItemSnapshot: JSON.stringify(actionBody.product_info), //产品快照
};
var orderProduct = await self.orderProductDao.create(orderProductObj, t);//订单产品
if (channelOrder.orderStatus == 2) {
var moneyObj = {
uapp_id: pobj.appInfo.uapp_id,
sourceOrderNo: orderNo, // 来源单号
channelUserId: pobj.userInfo.channel_userId,
ownerUserId: pobj.userInfo.channel_userId,
accountType: "other",//帐户类型( 支付类型):"cash": "现金", "bank": "银行" ,"wx":"微信","alipay":"支付宝","other":"其它"
directionType: "sr",//凭单类型,"sr": "收","zc": "支"
voucherDate: channelOrder.payTime,//凭单时间
recvAmount: channelOrder.totalSum,//收总额
sourceType: "orderinfo",//来源类型 "orderinfo": "订单","expensevoucher": "费用单"
auditStatus: "tg",//审核状态"dsh": "待审核", "btg": "不通过", "tg": "通过"
};
var moneyJourney = await self.moneyJourneyDao.create(moneyObj, t);
var orderReceiptVoucherObj = {
uapp_id: pobj.appInfo.uapp_id,
sourceOrderNo: orderNo, // 来源单号
accountType: "other",
payDate: channelOrder.payTime,//支付时间
totalSum: channelOrder.totalSum,//订单总额
auditStatus: "tg"
// payOrderNo: DataTypes.STRING, //支付凭证流水单号,如:微信支付凭证单号
// buyerOpenId: DataTypes.STRING,//用户在支付商户appid下的唯一标识或买家在支付宝的用户id
// passTradeNo: DataTypes.STRING,//通道的统一订单号
// buyerAliLogonId: DataTypes.STRING,//买家支付宝账号
// certifyFileUrl: order.orderNo, //支付证明文件Url
// wxPayOrderCode: order.orderNo,//业务微信支付订单号
// aliPayOrderCode: order.orderNo,//业务支付宝支付订单号
// busPayOrderCode: order.orderNo,//业务支付订单号
};
if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
orderReceiptVoucherObj.auditStatus = "tg";
} }
var orderReceiptVoucher = await self.orderReceiptVoucherDao.create(orderReceiptVoucherObj, t);
} }
var channelUser = obj.channelUser; }
if(!channelUser || !channelUser.channelUserId){ /**
return system.getResult(null, "渠道用户信息有误"); * 创建商标订单
} * @param {*} pobj
var channelOrder = obj.channelOrder; * {
if(!channelOrder || !channelOrder.channelServiceNo){ "actionType": "addOrder",
return system.getResult(null, "渠道订单信息有误"); "actionBody": {
} "channelItemCode":"zzsbzc",
if(!channelOrder.quantity){ "id":1,
return system.getResult(null, "渠道订单产品数量不能为空"); "quantity":1,
} "totalSum":300,
if(!channelOrder.totalSum){ "channelOrder":null,
return system.getResult(null, "渠道订单支付金额不能为空"); "deliveryData":null
} }
if (productItem) {
verifyResult = await self.isOrderVerify(productItem,channelOrder.quantity,channelOrder.totalSum);
if (verifyResult && verifyResult.code!=1) {
return system.getResult(null, verifyResult.msg);
} }
*/
async createTmOrder(pobj) {
var verifyResult = await this.isOrderVerify(pobj);
if (verifyResult.status != 0) {
return verifyResult;
} }
var beforeOrder = await this.dao.model.findOne({ var orderNo = await self.getBusUid("tm" + pobj.appInfo.uapp_id);
where:{channelServiceNo:channelOrder.channelServiceNo,uapp_id:app.uAppId},
raw:true
return await self.db.transaction(async function (t) {
var orderNo = await self.getBusUid("o");
//创建订单
var orderObj = {
uapp_id: app.uAppId, orderNo: orderNo, channelServiceNo: channelOrder.channelServiceNo,
channelUserId: channelUser.channelUserId, channelOrderNo: channelOrder.channelOrderNo,
ownerUserId: channelUser.channelUserId,
quantity: channelOrder.quantity,
needNo: channelOrder.needNo, payTime: channelOrder.payTime, orderPayStatus: channelOrder.payStatus,
totalSum: channelOrder.totalSum,
payTotalSum: channelOrder.payTotalSum,
totalServiceCharge: 0,// 服务费总额(产品配置的服务费*订单件数)
totalPublicExpense: 0,// 官费总额(产品配置的官费*订单件数)
totalTaxes: 0,// 税费总额(订单总额-(订单总额/(1+产品费率)))
totalProfitSum: 0,// 订单毛利润总额(订单总额-官费总额)
totalDiscounts: 0,// 优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度)
pfProfitSum: 0,// 订单平台毛利润总额(订单毛利润总额-订单渠道分成毛利润总额)
channelProfitSum: 0,// 订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率)
// pfSettleProfit :DataTypes.INTEGER,// 平台结算渠道利润,0否,1是
invoiceApplyStatus: "00",// 发票状态:00: 未申请, 10: 已申请,20:已开票
};
if (verifyResult && verifyResult.code == 1 && verifyResult.data) {
var orderCostObj = verifyResult.data;
orderObj.totalServiceCharge = orderCostObj.totalServiceCharge || 0;
orderObj.totalPublicExpense = orderCostObj.totalPublicExpense || 0;
orderObj.totalTaxes = orderCostObj.totalTaxes || 0;
orderObj.totalProfitSum = orderCostObj.totalProfitSum || 0;
orderObj.totalDiscounts = orderCostObj.totalDiscounts || 0;
orderObj.pfProfitSum = orderCostObj.pfProfitSum || 0;
orderObj.channelProfitSum = orderCostObj.channelProfitSum || 0;
}
var order = await self.dao.create(orderObj, t);//创建订单
//var orderProductNo = await self.getBusUid("op");
if (productItem) {
var orderProductObj = {
uapp_id: app.uAppId,
sourceOrderNo: order.orderNo, // 来源单号
productType_id: productItem.productType_id,//产品类型Id
productOneType_id: productItem.productOneType_id,//产品大类Id
itemCode: productItem.itemCode,//产品编码
itemName: productItem.itemName,//产品名称
channelItemCode: productItem.channelItemCode,// 渠道产品编码
channelItemName: productItem.channelItemName,// 渠道产品名称
serviceItemCode: productItem.serviceItemCode,// 服务商产品编码
picUrl: productItem.picUrl,// 产品图片地址
proPrice: productItem.proPrice, // 产品价格
quantity: channelOrder.quantity,// 订单数量(即产品的倍数,默认值为1)
opPayType: "00",// 操作付款类型:00: 创建订单, 10: 补单
serviceItemSnapshot: JSON.stringify(productItem), //产品快照
};
var orderProduct = await self.orderProductDao.create(orderProductObj, t);//订单产品
}
if (order.totalSum > 0) {//支付成功
var moneyObj = {
uapp_id: app.uAppId,
sourceOrderNo: order.orderNo, // 来源单号
channelUserId: channelUser.channelUserId,
ownerUserId: channelUser.channelUserId,
accountType: "other",//帐户类型( 支付类型):"cash": "现金", "bank": "银行" ,"wx":"微信","alipay":"支付宝","other":"其它"
directionType: "sr",//凭单类型,"sr": "收","zc": "支"
voucherDate: channelOrder.payTime,//凭单时间
recvAmount: channelOrder.totalSum,//收总额
sourceType: "orderinfo",//来源类型 "orderinfo": "订单","expensevoucher": "费用单"
auditStatus: "dsh",//审核状态"dsh": "待审核", "btg": "不通过", "tg": "通过"
};
if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
moneyObj.auditStatus = "tg";
}
var moneyJourney = await self.moneyJourneyDao.create(moneyObj, t);
var orderReceiptVoucherObj = {
uapp_id: app.uAppId,
sourceOrderNo: order.orderNo, // 来源单号
accountType: "other",
payDate: channelOrder.payTime,//支付时间
totalSum: channelOrder.totalSum,//订单总额
// payOrderNo: DataTypes.STRING, //支付凭证流水单号,如:微信支付凭证单号
// buyerOpenId: DataTypes.STRING,//用户在支付商户appid下的唯一标识或买家在支付宝的用户id
// passTradeNo: DataTypes.STRING,//通道的统一订单号
// buyerAliLogonId: DataTypes.STRING,//买家支付宝账号
// certifyFileUrl: order.orderNo, //支付证明文件Url
wxPayOrderCode: order.orderNo,//业务微信支付订单号
aliPayOrderCode: order.orderNo,//业务支付宝支付订单号
busPayOrderCode: order.orderNo,//业务支付订单号
auditStatus: "dsh"
};
if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
orderReceiptVoucherObj.auditStatus = "tg";
}
var orderReceiptVoucher = await self.orderReceiptVoucherDao.create(orderReceiptVoucherObj, t);
}
var requestid = self.getUUID();
if (productItem && productItem.deliveryUrl) {
obj["orderNo"] = order.orderNo;
self.pushData(requestid, obj, productItem.deliveryUrl, req);
}
return system.getResultSuccess({
orderNo: order.orderNo,
channelServiceNo: order.channelServiceNo,
channelParams: obj.channelParams,
requestid: requestid
});
}); });
if(beforeOrder){//订单已存在
return system.getResultFail(2, "订单已存在",beforeOrder.orderNo); }
/**
* 创建其他订单
* @param {*} pobj
*/
async createOtherOrder(pobj) {
var verifyResult = await this.isOrderVerify(pobj);
if (verifyResult.status != 0) {
return verifyResult;
} }
var orderNo = await self.getBusUid("o" + pobj.appInfo.uapp_id);
var params = {
uapp_id: pobj.appInfo.uapp_id,//int(11) //
orderNo: ,//varchar(64) //订单号
channelServiceNo: ,//varchar(64) //渠道服务单号
channelOrderNo: ,//varchar(1024) //渠道订单号列表,多个以,隔开
channelUserId: ,//varchar(64) //
ownerUserId: ,//varchar(20) //
needNo: ,//varchar(64) //需求单号
needNoOrderNo: ,//varchar(64) //需求订单号
payTime: ,//datetime //
quantity: ,//int(11) //项目订单数量(即服务项目的倍数,默认值为1)
serviceQuantity: ,//int(11) //项目订单交付数量(即与项目订单数量相对应)
orderPayStatusName: ,//varchar(50) //
orderPayStatus: ,//enum //订单付款状态dfk: 待付款, zfpz: 已上传支付凭证, yfk: 已付款, ddqx: 订单取消, tkclz: 退款处理中, bfytk: 部分已退款, ytk: 已退款,zfshbtg:支付审核不通过
totalSum: ,//decimal(12,2) //订单总额(产品价格×优惠费率×订单件数)
payTotalSum: ,//decimal(12,2) //
refundSum: ,//decimal(12,2) //订单总额(产品价格×优惠费率×订单件数)
totalServiceCharge: ,//decimal(12,2) //服务费总额(产品配置的服务费*订单件数)
totalPublicExpense: ,//decimal(12,2) //官费总额(产品配置的官费*订单件数)
totalProfitSum: ,//decimal(12,2) //订单毛利润总额(订单总额-官费总额)
totalDiscounts: ,//decimal(12,2) //优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度)暂时没有用到
pfProfitSum: ,//decimal(12,2) //订单平台毛利润总额(订单毛利润总额-订单渠道分成毛利润总额)
channelProfitSum: ,//decimal(12,2) //订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率)
pfSettleProfit: ,//int(11) //平台结算渠道利润,0否,1是
invoiceApplyStatus: ,//varchar(10) //发票状态:00: 未申请, 10: 已申请,20:已开票
notes: ,//varchar(255) //
opNotes: ,//varchar(255) //操作备注
created_at: ,//datetime //
updated_at: ,//datetime //
deleted_at: ,//datetime //
version: ,//int(11) //
};
return await self.db.transaction(async function (t) { return await self.db.transaction(async function (t) {
var orderNo = await self.getBusUid("o"); var orderNo = await self.getBusUid("o");
//创建订单 //创建订单
var orderObj={ var orderObj = {
uapp_id:app.uAppId,orderNo:orderNo,channelServiceNo:channelOrder.channelServiceNo, uapp_id: app.uAppId, orderNo: orderNo, channelServiceNo: channelOrder.channelServiceNo,
channelUserId:channelUser.channelUserId,channelOrderNo:channelOrder.channelOrderNo, channelUserId: channelUser.channelUserId, channelOrderNo: channelOrder.channelOrderNo,
ownerUserId:channelUser.channelUserId, ownerUserId: channelUser.channelUserId,
quantity:channelOrder.quantity, quantity: channelOrder.quantity,
needNo:channelOrder.needNo,payTime:channelOrder.payTime,orderPayStatus:channelOrder.payStatus, needNo: channelOrder.needNo, payTime: channelOrder.payTime, orderPayStatus: channelOrder.payStatus,
totalSum:channelOrder.totalSum, totalSum: channelOrder.totalSum,
payTotalSum:channelOrder.payTotalSum, payTotalSum: channelOrder.payTotalSum,
totalServiceCharge :0,// 服务费总额(产品配置的服务费*订单件数) totalServiceCharge: 0,// 服务费总额(产品配置的服务费*订单件数)
totalPublicExpense :0,// 官费总额(产品配置的官费*订单件数) totalPublicExpense: 0,// 官费总额(产品配置的官费*订单件数)
totalTaxes :0,// 税费总额(订单总额-(订单总额/(1+产品费率))) totalTaxes: 0,// 税费总额(订单总额-(订单总额/(1+产品费率)))
totalProfitSum :0,// 订单毛利润总额(订单总额-官费总额) totalProfitSum: 0,// 订单毛利润总额(订单总额-官费总额)
totalDiscounts :0,// 优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度) totalDiscounts: 0,// 优惠总额((服务费总额+官费总额)-订单总额(产品价格×优惠费率×订单件数)>0则有优惠额度)
pfProfitSum :0,// 订单平台毛利润总额(订单毛利润总额-订单渠道分成毛利润总额) pfProfitSum: 0,// 订单平台毛利润总额(订单毛利润总额-订单渠道分成毛利润总额)
channelProfitSum :0,// 订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率) channelProfitSum: 0,// 订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率)
// pfSettleProfit :DataTypes.INTEGER,// 平台结算渠道利润,0否,1是 // pfSettleProfit :DataTypes.INTEGER,// 平台结算渠道利润,0否,1是
invoiceApplyStatus :"00",// 发票状态:00: 未申请, 10: 已申请,20:已开票 invoiceApplyStatus: "00",// 发票状态:00: 未申请, 10: 已申请,20:已开票
}; };
if(verifyResult && verifyResult.code==1 && verifyResult.data){ if (verifyResult && verifyResult.code == 1 && verifyResult.data) {
var orderCostObj=verifyResult.data; var orderCostObj = verifyResult.data;
orderObj.totalServiceCharge=orderCostObj.totalServiceCharge || 0; orderObj.totalServiceCharge = orderCostObj.totalServiceCharge || 0;
orderObj.totalPublicExpense=orderCostObj.totalPublicExpense || 0; orderObj.totalPublicExpense = orderCostObj.totalPublicExpense || 0;
orderObj.totalTaxes=orderCostObj.totalTaxes || 0; orderObj.totalTaxes = orderCostObj.totalTaxes || 0;
orderObj.totalProfitSum=orderCostObj.totalProfitSum || 0; orderObj.totalProfitSum = orderCostObj.totalProfitSum || 0;
orderObj.totalDiscounts=orderCostObj.totalDiscounts || 0; orderObj.totalDiscounts = orderCostObj.totalDiscounts || 0;
orderObj.pfProfitSum=orderCostObj.pfProfitSum || 0; orderObj.pfProfitSum = orderCostObj.pfProfitSum || 0;
orderObj.channelProfitSum=orderCostObj.channelProfitSum || 0; orderObj.channelProfitSum = orderCostObj.channelProfitSum || 0;
} }
var order = await self.dao.create(orderObj,t);//创建订单 var order = await self.dao.create(orderObj, t);//创建订单
//var orderProductNo = await self.getBusUid("op"); //var orderProductNo = await self.getBusUid("op");
if(productItem){ if (productItem) {
var orderProductObj = { var orderProductObj = {
uapp_id:app.uAppId, uapp_id: app.uAppId,
sourceOrderNo:order.orderNo, // 来源单号 sourceOrderNo: order.orderNo, // 来源单号
productType_id :productItem.productType_id,//产品类型Id productType_id: productItem.productType_id,//产品类型Id
productOneType_id :productItem.productOneType_id,//产品大类Id productOneType_id: productItem.productOneType_id,//产品大类Id
itemCode :productItem.itemCode,//产品编码 itemCode: productItem.itemCode,//产品编码
itemName :productItem.itemName,//产品名称 itemName: productItem.itemName,//产品名称
channelItemCode :productItem.channelItemCode,// 渠道产品编码 channelItemCode: productItem.channelItemCode,// 渠道产品编码
channelItemName :productItem.channelItemName,// 渠道产品名称 channelItemName: productItem.channelItemName,// 渠道产品名称
serviceItemCode :productItem.serviceItemCode,// 服务商产品编码 serviceItemCode: productItem.serviceItemCode,// 服务商产品编码
picUrl :productItem.picUrl,// 产品图片地址 picUrl: productItem.picUrl,// 产品图片地址
proPrice :productItem.proPrice, // 产品价格 proPrice: productItem.proPrice, // 产品价格
quantity :channelOrder.quantity,// 订单数量(即产品的倍数,默认值为1) quantity: channelOrder.quantity,// 订单数量(即产品的倍数,默认值为1)
opPayType :"00",// 操作付款类型:00: 创建订单, 10: 补单 opPayType: "00",// 操作付款类型:00: 创建订单, 10: 补单
serviceItemSnapshot :JSON.stringify(productItem), //产品快照 serviceItemSnapshot: JSON.stringify(productItem), //产品快照
}; };
var orderProduct = await self.orderProductDao.create(orderProductObj,t);//订单产品 var orderProduct = await self.orderProductDao.create(orderProductObj, t);//订单产品
} }
if(order.totalSum>0){//支付成功 if (order.totalSum > 0) {//支付成功
var moneyObj={ var moneyObj = {
uapp_id:app.uAppId, uapp_id: app.uAppId,
sourceOrderNo:order.orderNo, // 来源单号 sourceOrderNo: order.orderNo, // 来源单号
channelUserId:channelUser.channelUserId, channelUserId: channelUser.channelUserId,
ownerUserId:channelUser.channelUserId, ownerUserId: channelUser.channelUserId,
accountType: "other",//帐户类型( 支付类型):"cash": "现金", "bank": "银行" ,"wx":"微信","alipay":"支付宝","other":"其它" accountType: "other",//帐户类型( 支付类型):"cash": "现金", "bank": "银行" ,"wx":"微信","alipay":"支付宝","other":"其它"
directionType: "sr",//凭单类型,"sr": "收","zc": "支" directionType: "sr",//凭单类型,"sr": "收","zc": "支"
voucherDate: channelOrder.payTime,//凭单时间 voucherDate: channelOrder.payTime,//凭单时间
...@@ -184,13 +377,13 @@ class OrderInfoService extends ServiceBase { ...@@ -184,13 +377,13 @@ class OrderInfoService extends ServiceBase {
sourceType: "orderinfo",//来源类型 "orderinfo": "订单","expensevoucher": "费用单" sourceType: "orderinfo",//来源类型 "orderinfo": "订单","expensevoucher": "费用单"
auditStatus: "dsh",//审核状态"dsh": "待审核", "btg": "不通过", "tg": "通过" auditStatus: "dsh",//审核状态"dsh": "待审核", "btg": "不通过", "tg": "通过"
}; };
if(channelOrder.payStatus=='yfk' || channelOrder.payStatus=='bfyfk'){ if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
moneyObj.auditStatus="tg"; moneyObj.auditStatus = "tg";
} }
var moneyJourney = await self.moneyJourneyDao.create(moneyObj,t); var moneyJourney = await self.moneyJourneyDao.create(moneyObj, t);
var orderReceiptVoucherObj={ var orderReceiptVoucherObj = {
uapp_id:app.uAppId, uapp_id: app.uAppId,
sourceOrderNo:order.orderNo, // 来源单号 sourceOrderNo: order.orderNo, // 来源单号
accountType: "other", accountType: "other",
payDate: channelOrder.payTime,//支付时间 payDate: channelOrder.payTime,//支付时间
totalSum: channelOrder.totalSum,//订单总额 totalSum: channelOrder.totalSum,//订单总额
...@@ -198,130 +391,141 @@ class OrderInfoService extends ServiceBase { ...@@ -198,130 +391,141 @@ class OrderInfoService extends ServiceBase {
// buyerOpenId: DataTypes.STRING,//用户在支付商户appid下的唯一标识或买家在支付宝的用户id // buyerOpenId: DataTypes.STRING,//用户在支付商户appid下的唯一标识或买家在支付宝的用户id
// passTradeNo: DataTypes.STRING,//通道的统一订单号 // passTradeNo: DataTypes.STRING,//通道的统一订单号
// buyerAliLogonId: DataTypes.STRING,//买家支付宝账号 // buyerAliLogonId: DataTypes.STRING,//买家支付宝账号
// certifyFileUrl: order.orderNo, //支付证明文件Url // certifyFileUrl: order.orderNo, //支付证明文件Url
wxPayOrderCode: order.orderNo,//业务微信支付订单号 wxPayOrderCode: order.orderNo,//业务微信支付订单号
aliPayOrderCode:order.orderNo,//业务支付宝支付订单号 aliPayOrderCode: order.orderNo,//业务支付宝支付订单号
busPayOrderCode: order.orderNo,//业务支付订单号 busPayOrderCode: order.orderNo,//业务支付订单号
auditStatus:"dsh" auditStatus: "dsh"
}; };
if(channelOrder.payStatus=='yfk' || channelOrder.payStatus=='bfyfk'){ if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
orderReceiptVoucherObj.auditStatus="tg"; orderReceiptVoucherObj.auditStatus = "tg";
} }
var orderReceiptVoucher = await self.orderReceiptVoucherDao.create(orderReceiptVoucherObj,t); var orderReceiptVoucher = await self.orderReceiptVoucherDao.create(orderReceiptVoucherObj, t);
} }
var requestid=self.getUUID(); var requestid = self.getUUID();
if(productItem && productItem.deliveryUrl){ if (productItem && productItem.deliveryUrl) {
obj["orderNo"]=order.orderNo; obj["orderNo"] = order.orderNo;
self.pushData(requestid,obj,productItem.deliveryUrl,req); self.pushData(requestid, obj, productItem.deliveryUrl, req);
} }
return system.getResultSuccess({ return system.getResultSuccess({
orderNo:order.orderNo, orderNo: order.orderNo,
channelServiceNo:order.channelServiceNo, channelServiceNo: order.channelServiceNo,
channelParams:obj.channelParams, channelParams: obj.channelParams,
requestid:requestid requestid: requestid
}); });
}); });
}
async createChannelSource(pobj) {//创建渠道来源订单
var orderNo = await self.getBusUid("oc" + pobj.appInfo.uapp_id);
// var beforeOrder = await this.dao.model.findOne({
// where: { channelServiceNo: channelOrder.channelServiceNo, uapp_id: app.uAppId },
// raw: true
// });
// if (beforeOrder) {//订单已存在
// return system.getResultFail(2, "订单已存在", beforeOrder.orderNo);
// }
} }
/** /**
* 数据推送 * 数据推送
*/ */
async pushData(requestid,params,url,req){ async pushData(requestid, params, url, req) {
var rc = system.getObject("util.execClient"); var rc = system.getObject("util.execClient");
var obj = params; var obj = params;
var rtn = null; var rtn = null;
try { try {
rtn = await rc.execPushDataPost(obj, url, req.headers["token"], req.headers["request-id"]); rtn = await rc.execPushDataPost(obj, url, req.headers["token"], req.headers["request-id"]);
var returnType = "0"; var returnType = "0";
if (rtn.stdout) { if (rtn.stdout) {
var j = JSON.parse(rtn.stdout); var j = JSON.parse(rtn.stdout);
if (j && j.status == 0) { if (j && j.status == 0) {
returnType = "1"; returnType = "1";
}
} }
this.pushlogSve.createDb({ }
appid: req.app.id, this.pushlogSve.createDb({
requestId: requestid, appid: req.app.id,
op: url, requestId: requestid,
content: JSON.stringify(obj), op: url,
resultInfo: JSON.stringify(rtn), content: JSON.stringify(obj),
clientIp: req.clientIp, resultInfo: JSON.stringify(rtn),
returnType: returnType, clientIp: req.clientIp,
agent: req.uagent, returnType: returnType,
opTitle: "数据推送-创建订单", agent: req.uagent,
}); opTitle: "数据推送-创建订单",
});
} catch (e) { } catch (e) {
this.pushlogSve.createDb({ this.pushlogSve.createDb({
appid: req.app.id, appid: req.app.id,
requestId: requestid, requestId: requestid,
op: url, op: url,
content: JSON.stringify(obj), content: JSON.stringify(obj),
resultInfo: JSON.stringify(e.stack), resultInfo: JSON.stringify(e.stack),
clientIp: req.clientIp, clientIp: req.clientIp,
returnType: '0', returnType: '0',
agent: req.uagent, agent: req.uagent,
opTitle: "数据推送-创建订单", opTitle: "数据推送-创建订单",
}); });
} }
} }
async findAndCountAll(obj,req) { async findAndCountAll(obj, req) {
var app = req.app; var app = req.app;
if(!app || !app.uAppId){ if (!app || !app.uAppId) {
return system.getResult(null, "渠道信息有误"); return system.getResult(null, "渠道信息有误");
} }
obj["search"]["uapp_id"]=app.uAppId; obj["search"]["uapp_id"] = app.uAppId;
const result = await this.dao.findAndCountAll(obj); const result = await this.dao.findAndCountAll(obj);
return system.getResultSuccess(result); return system.getResultSuccess(result);
} }
async getOrderDetailByOrderNo(obj,req){ async getOrderDetailByOrderNo(obj, req) {
var orderNo = obj.orderNo; var orderNo = obj.orderNo;
if(!orderNo){ if (!orderNo) {
return system.getResult(null, "订单编号不能为空"); return system.getResult(null, "订单编号不能为空");
} }
var app = req.app; var app = req.app;
if(!app || !app.uAppId){ if (!app || !app.uAppId) {
return system.getResult(null, "渠道信息有误"); return system.getResult(null, "渠道信息有误");
} }
var order = await this.dao.model.findOne({ var order = await this.dao.model.findOne({
where:{orderNo:orderNo,uapp_id:app.uAppId}, where: { orderNo: orderNo, uapp_id: app.uAppId },
attributes:["orderNo","channelServiceNo","channelOrderNo","channelUserId","ownerUserId","needNo", attributes: ["orderNo", "channelServiceNo", "channelOrderNo", "channelUserId", "ownerUserId", "needNo",
"payTime","quantity","serviceQuantity","orderPayStatus","orderPayStatusName","totalSum","payTotalSum", "payTime", "quantity", "serviceQuantity", "orderPayStatus", "orderPayStatusName", "totalSum", "payTotalSum",
"refundSum","created_at","opNotes","notes" "refundSum", "created_at", "opNotes", "notes"
], ],
raw:true raw: true
}); });
if(order && order.orderNo){ if (order && order.orderNo) {
var orderproducts = await this.orderProductDao.model.findAll({ var orderproducts = await this.orderProductDao.model.findAll({
where:{sourceOrderNo:order.orderNo}, where: { sourceOrderNo: order.orderNo },
attributes:["sourceOrderNo","itemCode","itemName","channelItemCode","channelItemName", attributes: ["sourceOrderNo", "itemCode", "itemName", "channelItemCode", "channelItemName",
"serviceItemCode","picUrl","proPrice","quantity","opPayType","serviceItemSnapshot", "serviceItemCode", "picUrl", "proPrice", "quantity", "opPayType", "serviceItemSnapshot",
"created_at" "created_at"
], ],
raw:true raw: true
}); });
order["orderproducts"]=orderproducts; order["orderproducts"] = orderproducts;
var receptvouchers = await this.orderReceiptVoucherDao.model.findAll({ var receptvouchers = await this.orderReceiptVoucherDao.model.findAll({
where:{sourceOrderNo:order.orderNo}, where: { sourceOrderNo: order.orderNo },
attributes:[ attributes: [
"sourceOrderNo","accountType","accountTypeName","payDate","totalSum","payOrderNo","buyerOpenId", "sourceOrderNo", "accountType", "accountTypeName", "payDate", "totalSum", "payOrderNo", "buyerOpenId",
"passTradeNo","buyerAliLogonId","certifyFileUrl","wxPayOrderCode","aliPayOrderCode","busPayOrderCode", "passTradeNo", "buyerAliLogonId", "certifyFileUrl", "wxPayOrderCode", "aliPayOrderCode", "busPayOrderCode",
"auditStatusName","auditStatus" "auditStatusName", "auditStatus"
], ],
raw:true raw: true
}); });
order["receptvouchers"]=receptvouchers; order["receptvouchers"] = receptvouchers;
var refundvouchers = await this.orderRefundVoucherDao.model.findAll({ var refundvouchers = await this.orderRefundVoucherDao.model.findAll({
where:{sourceOrderNo:order.orderNo}, where: { sourceOrderNo: order.orderNo },
attributes:[ attributes: [
"busPayOrderCode", "busPayOrderCode",
"sourceOrderNo","accountType","accountTypeName","payDate","totalSum","payOrderNo","buyerOpenId", "sourceOrderNo", "accountType", "accountTypeName", "payDate", "totalSum", "payOrderNo", "buyerOpenId",
"passTradeNo","certifyFileUrl","auditStatusName","auditStatus" "passTradeNo", "certifyFileUrl", "auditStatusName", "auditStatus"
], ],
raw:true raw: true
}); });
order["refundvouchers"]=refundvouchers; order["refundvouchers"] = refundvouchers;
} }
return system.getResultSuccess(order); return system.getResultSuccess(order);
} }
......
...@@ -3,7 +3,7 @@ var settings={ ...@@ -3,7 +3,7 @@ var settings={
host: "43.247.184.32", host: "43.247.184.32",
port: 8967, port: 8967,
password: "Gongsibao2018", password: "Gongsibao2018",
db:8, db:9,
}, },
database:{ database:{
dbname : "center_order", dbname : "center_order",
......
...@@ -4,11 +4,11 @@ var ENVINPUT = { ...@@ -4,11 +4,11 @@ var ENVINPUT = {
DB_PORT: process.env.DB_PORT, DB_PORT: process.env.DB_PORT,
DB_USER: process.env.DB_USER, DB_USER: process.env.DB_USER,
DB_PWD: process.env.DB_PWD, DB_PWD: process.env.DB_PWD,
DB_NAME: process.env.CENTER_CHANNEL_DB_NAME, DB_NAME: process.env.CENTER_ORDER_DB_NAME,
REDIS_HOST: process.env.REDIS_HOST, REDIS_HOST: process.env.REDIS_HOST,
REDIS_PORT: process.env.REDIS_PORT, REDIS_PORT: process.env.REDIS_PORT,
REDIS_PWD: process.env.REDIS_PWD, REDIS_PWD: process.env.REDIS_PWD,
REDIS_DB: process.env.CENTER_CHANNEL_REDIS_DB, REDIS_DB: process.env.CENTER_ORDER_REDIS_DB,
APP_ENV: process.env.APP_ENV ? process.env.APP_ENV : "dev" APP_ENV: process.env.APP_ENV ? process.env.APP_ENV : "dev"
}; };
var settings = { var settings = {
...@@ -16,7 +16,7 @@ var settings = { ...@@ -16,7 +16,7 @@ var settings = {
appKey: "201911061250", appKey: "201911061250",
secret: "f99d413b767f09b5dff0b3610366cc46", secret: "f99d413b767f09b5dff0b3610366cc46",
salt: "%iatpD1gcxz7iF#B", salt: "%iatpD1gcxz7iF#B",
cacheprefix: "centerChannel", cacheprefix: "centerOrder",
usertimeout: 3600,//单位秒 usertimeout: 3600,//单位秒
basepath: path.normalize(path.join(__dirname, '../..')), basepath: path.normalize(path.join(__dirname, '../..')),
port: process.env.NODE_PORT || 4011, port: process.env.NODE_PORT || 4011,
......
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