Commit 36106559 by 宋毅

tj

parent e47c3eb3
......@@ -4,7 +4,6 @@ var settings = require("../../../../config/settings");
class OrderAPI extends APIBase {
constructor() {
super();
this.utilsProductSve = system.getObject("service.utilsSve.utilsProductSve");
}
/**
* 接口跳转-POST请求
......@@ -24,9 +23,9 @@ class OrderAPI extends APIBase {
}
async opActionProcess(pobj, action_type, req) {
var opResult = null;
switch (action_type) {
switch (action_type) {
case "addOrder"://创建订单
opResult = await this.utilsProductSve.findByTypeCode(pobj, pobj.actionBody);
opResult = await this.addOrder(pobj, pobj.actionBody);
break;
default:
opResult = system.getResult(null, "action_type参数错误");
......@@ -34,6 +33,36 @@ class OrderAPI extends APIBase {
}
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;
\ No newline at end of file
......@@ -28,7 +28,7 @@ module.exports = {
//订单类型
"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": "其它" },
//订单服务付款状态
......
......@@ -14,14 +14,14 @@ module.exports = (db, DataTypes) => {
payTime :DataTypes.DATE,// 渠道有支付时间则用渠道的支付时间
quantity :DataTypes.INTEGER,// 订单数量(即产品的倍数,默认值为1)
serviceQuantity :DataTypes.INTEGER,// 订单服务数量(即与订单数量相对应)
orderPayStatusName :DataTypes.STRING(50),//
orderPayStatus :{
orderStatusName :DataTypes.STRING(50),//
orderStatus :{
type: DataTypes.INTEGER,
set: function (val) {
this.setDataValue("orderPayStatus", val);
this.setDataValue("orderPayStatusName", uiconfig.config.pdict.order_pay_status[val]);
this.setDataValue("orderStatus", 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),// 订单总额(产品价格×优惠费率×订单件数)
payTotalSum :DataTypes.DECIMAL(12, 2),// 订单付款总额
refundSum :DataTypes.DECIMAL(12, 2),// 退款金额
......
......@@ -6,7 +6,7 @@ module.exports = (db, DataTypes) => {
uapp_id: DataTypes.INTEGER,//
sourceOrderNo :DataTypes.STRING(64),//来源单号
productType_id :DataTypes.INTEGER,//产品类型Id
productOneType_id :DataTypes.INTEGER,//产品大类Id
pathCode :DataTypes.STRING(512), //产品类型编码路径,如:1/2
itemCode :DataTypes.STRING(64),//产品编码
itemName :DataTypes.STRING(100),//产品名称
channelItemCode :DataTypes.STRING(100),// 渠道产品编码
......
......@@ -5,8 +5,6 @@ const uuidv4 = require('uuid/v4');
class OrderInfoService extends ServiceBase {
constructor() {
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.orderRefundVoucherDao = system.getObject("db.dbcpay.orderrefundvoucherDao");
this.moneyJourneyDao = system.getObject("db.dbcpay.moneyjourneyDao");
......@@ -20,163 +18,358 @@ class OrderInfoService extends ServiceBase {
/*
* 订单验证
*/
async isOrderVerify(serviceitem,buyProductCount,buyPrice) {
var sveItemRateConfig = serviceitem.rateConfig ? Number(serviceitem.rateConfig) : 0;//产品费率
var fwf = serviceitem.serviceCharge ? Number(serviceitem.serviceCharge) : 0;//服务费
var yhfl = serviceitem.discountsRateConfig ? Number(serviceitem.discountsRateConfig) : 0;//最大优惠费率
var gf = serviceitem.publicExpense ? Number(serviceitem.publicExpense) : 0;//产品官费
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;
async isOrderVerify(pobj) {
var actionBody = pobj.actionBody;
var price_list = actionBody.product_info.price_list;
if (!price_list) {
return system.getResult(null, "产品价格列表信息有误,20150");
}
yhje = yhje.toFixed(2);
yhje = Number(yhje);
if (yhje > zdyhe) {
return { code: -205, msg: "优惠总额有误" };
var product_price = price_list.filter(f => f.id == actionBody.id);
if (!product_price || product_price.length == 0) {
return system.getResult(null, "产品价格信息有误,20180");
}
var fcmlze_channel = mlze*qdfcbl ;//订单渠道分成毛利润总额
var fcmlze_platform = mlze-fcmlze_channel ;//订单平台毛利润总额
return {code:1,data:{
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, "渠道信息有误");
var totalSum = Number(product_price[0].price) * Number(actionBody.quantity);
if (Number(actionBody.totalSum) < totalSum) {
return system.getResult(null, "订单金额有误,20210");
}
if(!user){
return system.getResult(null, "用户信息有误");
}
var channelItemCode = obj.itemCode;
if(!channelItemCode){
return system.getResult(null, "未知的产品码");
pobj.actionBody.product_info.price_item = product_price[0];
return system.getResultSuccess();
}
async createOrder(pobj, orderNo, t) {
var actionBody = pobj.actionBody;
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获取产品
// if (!productItem) {
// return system.getResult(null, "未知的产品");
// }
var verifyResult=null;
if (productItem) {
if(productItem.status != 1){
return system.getResult(null, "产品已禁用");
var channelProfitSum = Number(totalProfitSum) - Number(pfProfitSum);
var params = {
uapp_id: pobj.appInfo.uapp_id,//int(11) //
orderNo: orderNo,//varchar(64) //订单号
channelServiceNo: channelOrder.channelServiceNo || "",//varchar(64) //渠道服务单号
channelOrderNo: channelOrder.channelOrderNo || "",//varchar(1024) //渠道订单号列表,多个以,隔开
channelUserId: pobj.userInfo.channel_userId,//varchar(64) //
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, "渠道用户信息有误");
}
var channelOrder = obj.channelOrder;
if(!channelOrder || !channelOrder.channelServiceNo){
return system.getResult(null, "渠道订单信息有误");
}
if(!channelOrder.quantity){
return system.getResult(null, "渠道订单产品数量不能为空");
}
if(!channelOrder.totalSum){
return system.getResult(null, "渠道订单支付金额不能为空");
}
if (productItem) {
verifyResult = await self.isOrderVerify(productItem,channelOrder.quantity,channelOrder.totalSum);
if (verifyResult && verifyResult.code!=1) {
return system.getResult(null, verifyResult.msg);
}
/**
* 创建商标订单
* @param {*} pobj
* {
"actionType": "addOrder",
"actionBody": {
"channelItemCode":"zzsbzc",
"id":1,
"quantity":1,
"totalSum":300,
"channelOrder":null,
"deliveryData":null
}
}
*/
async createTmOrder(pobj) {
var verifyResult = await this.isOrderVerify(pobj);
if (verifyResult.status != 0) {
return verifyResult;
}
var beforeOrder = await this.dao.model.findOne({
where:{channelServiceNo:channelOrder.channelServiceNo,uapp_id:app.uAppId},
raw:true
var orderNo = await self.getBusUid("tm" + pobj.appInfo.uapp_id);
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) {
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,// 订单渠道分成毛利润总额((订单总额-官费总额)*渠道利润分成比率)
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:已开票
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;
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 order = await self.dao.create(orderObj, t);//创建订单
//var orderProductNo = await self.getBusUid("op");
if(productItem){
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), //产品快照
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);//订单产品
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,
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,//凭单时间
......@@ -184,13 +377,13 @@ class OrderInfoService extends ServiceBase {
sourceType: "orderinfo",//来源类型 "orderinfo": "订单","expensevoucher": "费用单"
auditStatus: "dsh",//审核状态"dsh": "待审核", "btg": "不通过", "tg": "通过"
};
if(channelOrder.payStatus=='yfk' || channelOrder.payStatus=='bfyfk'){
moneyObj.auditStatus="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, // 来源单号
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,//订单总额
......@@ -198,130 +391,141 @@ class OrderInfoService extends ServiceBase {
// buyerOpenId: DataTypes.STRING,//用户在支付商户appid下的唯一标识或买家在支付宝的用户id
// passTradeNo: DataTypes.STRING,//通道的统一订单号
// buyerAliLogonId: DataTypes.STRING,//买家支付宝账号
// certifyFileUrl: order.orderNo, //支付证明文件Url
wxPayOrderCode: order.orderNo,//业务微信支付订单号
aliPayOrderCode:order.orderNo,//业务支付宝支付订单号
aliPayOrderCode: order.orderNo,//业务支付宝支付订单号
busPayOrderCode: order.orderNo,//业务支付订单号
auditStatus:"dsh"
auditStatus: "dsh"
};
if(channelOrder.payStatus=='yfk' || channelOrder.payStatus=='bfyfk'){
orderReceiptVoucherObj.auditStatus="tg";
if (channelOrder.payStatus == 'yfk' || channelOrder.payStatus == 'bfyfk') {
orderReceiptVoucherObj.auditStatus = "tg";
}
var orderReceiptVoucher = await self.orderReceiptVoucherDao.create(orderReceiptVoucherObj,t);
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);
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
orderNo: order.orderNo,
channelServiceNo: order.channelServiceNo,
channelParams: obj.channelParams,
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 obj = params;
var rtn = null;
try {
rtn = await rc.execPushDataPost(obj, url, req.headers["token"], req.headers["request-id"]);
var returnType = "0";
if (rtn.stdout) {
var j = JSON.parse(rtn.stdout);
if (j && j.status == 0) {
returnType = "1";
}
rtn = await rc.execPushDataPost(obj, url, req.headers["token"], req.headers["request-id"]);
var returnType = "0";
if (rtn.stdout) {
var j = JSON.parse(rtn.stdout);
if (j && j.status == 0) {
returnType = "1";
}
this.pushlogSve.createDb({
appid: req.app.id,
requestId: requestid,
op: url,
content: JSON.stringify(obj),
resultInfo: JSON.stringify(rtn),
clientIp: req.clientIp,
returnType: returnType,
agent: req.uagent,
opTitle: "数据推送-创建订单",
});
}
this.pushlogSve.createDb({
appid: req.app.id,
requestId: requestid,
op: url,
content: JSON.stringify(obj),
resultInfo: JSON.stringify(rtn),
clientIp: req.clientIp,
returnType: returnType,
agent: req.uagent,
opTitle: "数据推送-创建订单",
});
} catch (e) {
this.pushlogSve.createDb({
appid: req.app.id,
requestId: requestid,
op: url,
content: JSON.stringify(obj),
resultInfo: JSON.stringify(e.stack),
clientIp: req.clientIp,
returnType: '0',
agent: req.uagent,
opTitle: "数据推送-创建订单",
});
this.pushlogSve.createDb({
appid: req.app.id,
requestId: requestid,
op: url,
content: JSON.stringify(obj),
resultInfo: JSON.stringify(e.stack),
clientIp: req.clientIp,
returnType: '0',
agent: req.uagent,
opTitle: "数据推送-创建订单",
});
}
}
async findAndCountAll(obj,req) {
async findAndCountAll(obj, req) {
var app = req.app;
if(!app || !app.uAppId){
if (!app || !app.uAppId) {
return system.getResult(null, "渠道信息有误");
}
obj["search"]["uapp_id"]=app.uAppId;
obj["search"]["uapp_id"] = app.uAppId;
const result = await this.dao.findAndCountAll(obj);
return system.getResultSuccess(result);
}
async getOrderDetailByOrderNo(obj,req){
async getOrderDetailByOrderNo(obj, req) {
var orderNo = obj.orderNo;
if(!orderNo){
if (!orderNo) {
return system.getResult(null, "订单编号不能为空");
}
var app = req.app;
if(!app || !app.uAppId){
if (!app || !app.uAppId) {
return system.getResult(null, "渠道信息有误");
}
var order = await this.dao.model.findOne({
where:{orderNo:orderNo,uapp_id:app.uAppId},
attributes:["orderNo","channelServiceNo","channelOrderNo","channelUserId","ownerUserId","needNo",
"payTime","quantity","serviceQuantity","orderPayStatus","orderPayStatusName","totalSum","payTotalSum",
"refundSum","created_at","opNotes","notes"
where: { orderNo: orderNo, uapp_id: app.uAppId },
attributes: ["orderNo", "channelServiceNo", "channelOrderNo", "channelUserId", "ownerUserId", "needNo",
"payTime", "quantity", "serviceQuantity", "orderPayStatus", "orderPayStatusName", "totalSum", "payTotalSum",
"refundSum", "created_at", "opNotes", "notes"
],
raw:true
raw: true
});
if(order && order.orderNo){
if (order && order.orderNo) {
var orderproducts = await this.orderProductDao.model.findAll({
where:{sourceOrderNo:order.orderNo},
attributes:["sourceOrderNo","itemCode","itemName","channelItemCode","channelItemName",
"serviceItemCode","picUrl","proPrice","quantity","opPayType","serviceItemSnapshot",
where: { sourceOrderNo: order.orderNo },
attributes: ["sourceOrderNo", "itemCode", "itemName", "channelItemCode", "channelItemName",
"serviceItemCode", "picUrl", "proPrice", "quantity", "opPayType", "serviceItemSnapshot",
"created_at"
],
raw:true
raw: true
});
order["orderproducts"]=orderproducts;
order["orderproducts"] = orderproducts;
var receptvouchers = await this.orderReceiptVoucherDao.model.findAll({
where:{sourceOrderNo:order.orderNo},
attributes:[
"sourceOrderNo","accountType","accountTypeName","payDate","totalSum","payOrderNo","buyerOpenId",
"passTradeNo","buyerAliLogonId","certifyFileUrl","wxPayOrderCode","aliPayOrderCode","busPayOrderCode",
"auditStatusName","auditStatus"
where: { sourceOrderNo: order.orderNo },
attributes: [
"sourceOrderNo", "accountType", "accountTypeName", "payDate", "totalSum", "payOrderNo", "buyerOpenId",
"passTradeNo", "buyerAliLogonId", "certifyFileUrl", "wxPayOrderCode", "aliPayOrderCode", "busPayOrderCode",
"auditStatusName", "auditStatus"
],
raw:true
raw: true
});
order["receptvouchers"]=receptvouchers;
order["receptvouchers"] = receptvouchers;
var refundvouchers = await this.orderRefundVoucherDao.model.findAll({
where:{sourceOrderNo:order.orderNo},
attributes:[
where: { sourceOrderNo: order.orderNo },
attributes: [
"busPayOrderCode",
"sourceOrderNo","accountType","accountTypeName","payDate","totalSum","payOrderNo","buyerOpenId",
"passTradeNo","certifyFileUrl","auditStatusName","auditStatus"
"sourceOrderNo", "accountType", "accountTypeName", "payDate", "totalSum", "payOrderNo", "buyerOpenId",
"passTradeNo", "certifyFileUrl", "auditStatusName", "auditStatus"
],
raw:true
raw: true
});
order["refundvouchers"]=refundvouchers;
order["refundvouchers"] = refundvouchers;
}
return system.getResultSuccess(order);
}
......
......@@ -3,7 +3,7 @@ var settings={
host: "43.247.184.32",
port: 8967,
password: "Gongsibao2018",
db:8,
db:9,
},
database:{
dbname : "center_order",
......
......@@ -4,11 +4,11 @@ var ENVINPUT = {
DB_PORT: process.env.DB_PORT,
DB_USER: process.env.DB_USER,
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_PORT: process.env.REDIS_PORT,
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"
};
var settings = {
......@@ -16,7 +16,7 @@ var settings = {
appKey: "201911061250",
secret: "f99d413b767f09b5dff0b3610366cc46",
salt: "%iatpD1gcxz7iF#B",
cacheprefix: "centerChannel",
cacheprefix: "centerOrder",
usertimeout: 3600,//单位秒
basepath: path.normalize(path.join(__dirname, '../..')),
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