20261008
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/add 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
const companyList = []
|
||||
let goods
|
||||
if (data.type === 0) {
|
||||
goods = await vk.baseDao.findById({
|
||||
dbName: "jjx-goods",
|
||||
id: data.goodsId
|
||||
})
|
||||
if (goods.companyId) companyList.push(goods.companyId)
|
||||
} else {
|
||||
goods = data.goods
|
||||
}
|
||||
|
||||
let amount
|
||||
if (goods.sku) {
|
||||
const sku = goods.sku.find(item => item._index === data.skuId)
|
||||
amount = sku.values * data.num
|
||||
}else {
|
||||
amount = goods.amount * data.num
|
||||
}
|
||||
|
||||
let ensureIndex = 0
|
||||
if (data.ensureIndex) ensureIndex = data.ensureIndex
|
||||
|
||||
let offAmount = amount
|
||||
let saveAmount = 0, offRate = 100
|
||||
if (userInfo.userLevel > 0) {
|
||||
const userLevel = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-user-level",
|
||||
whereJson: {
|
||||
level: userInfo.userLevel
|
||||
}
|
||||
})
|
||||
if (userLevel && ![2, 3].includes(data.type)) {
|
||||
offRate = parseInt(userLevel.valueAddRate)
|
||||
offAmount = (amount * (parseInt(userLevel.valueAddRate) / 100)).toFixed(2)
|
||||
saveAmount = (amount - offAmount).toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
// orderStatus 0待支付 1已支付待发货 2已发货待收货 3已收货待完成 4已完成 5退款审核中 6退款成功 7退款失败 10 待设置价格 11已派单待完成(平台服务)
|
||||
|
||||
// type 0: 商品
|
||||
// type 1: 自营
|
||||
// type 2: 保证金
|
||||
// type 3: 会员升级
|
||||
// type 4: 询价
|
||||
// type 5: 加工
|
||||
// type 6: 旧货
|
||||
// type 7: 询价次数
|
||||
// type 8: 现货广告
|
||||
// type 9: 旧货加急
|
||||
// type 10: 旧货次数
|
||||
// type 11: 下载次数
|
||||
// type 12: 合同下载
|
||||
// type 13: 签约宝次数
|
||||
// type 14: 签约宝
|
||||
// type 15: 自营询价
|
||||
|
||||
const defaultAddress = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-user-address",
|
||||
whereJson: {
|
||||
uid,
|
||||
isDefault: true
|
||||
}
|
||||
})
|
||||
let name = '', phone = '', addressRegion = null, addressDetail = ''
|
||||
if (defaultAddress) {
|
||||
name = defaultAddress.name
|
||||
phone = defaultAddress.phone
|
||||
addressRegion = defaultAddress.addressRegion
|
||||
addressDetail = defaultAddress.addressDetail
|
||||
}
|
||||
|
||||
const orderId = await vk.baseDao.add({
|
||||
dbName: "jjx-order",
|
||||
dataJson: {
|
||||
orderNo: vk.pubfn.createOrderNo("39XU", 24),
|
||||
// orderNo: vk.pubfn.createOrderNo("3199", 24),
|
||||
uid,
|
||||
orderStatus: 0,
|
||||
type: data.type,
|
||||
amount,
|
||||
offAmount,
|
||||
saveAmount,
|
||||
offRate,
|
||||
name,
|
||||
phone,
|
||||
addressRegion,
|
||||
addressDetail,
|
||||
companyList,
|
||||
ensureIndex,
|
||||
}
|
||||
})
|
||||
|
||||
await vk.baseDao.add({
|
||||
dbName: "jjx-order-goods",
|
||||
dataJson: {
|
||||
orderId,
|
||||
goodsId: data.goodsId,
|
||||
skuId: data.skuId,
|
||||
num: data.num,
|
||||
goodsName: goods.name,
|
||||
goodsPrice: goods.amount,
|
||||
goodsCover: goods.cover,
|
||||
companyId: goods.companyId,
|
||||
}
|
||||
})
|
||||
|
||||
res.data = orderId
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/addFromList 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
let amount = 0
|
||||
const cartList = await vk.baseDao.selects({
|
||||
dbName: "jjx-cart",
|
||||
whereJson: {
|
||||
uid,
|
||||
_id: _.in(data.ids)
|
||||
},
|
||||
foreignDB: [
|
||||
{
|
||||
dbName: "jjx-goods", // 副表名
|
||||
localKey: "goodsId", // 主表外键字段名
|
||||
foreignKey: "_id", // 副表外键字段名
|
||||
as: "goods",
|
||||
limit: 1,
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
if (cartList.total === 0) return {
|
||||
code: -1,
|
||||
msg: "购物车中没有此商品"
|
||||
}
|
||||
|
||||
for (const item of cartList.rows) {
|
||||
const sku = item.goods.sku.find(sku => sku._index === item.skuId)
|
||||
amount += item.num * parseFloat(sku.values)
|
||||
}
|
||||
|
||||
let offAmount = amount
|
||||
let saveAmount = 0, offRate = 100
|
||||
if (userInfo.userLevel > 0) {
|
||||
const userLevel = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-user-level",
|
||||
whereJson: {
|
||||
level: userInfo.userLevel
|
||||
}
|
||||
})
|
||||
if (userLevel) {
|
||||
offRate = parseInt(userLevel.valueAddRate)
|
||||
offAmount = amount * (parseInt(userLevel.valueAddRate) / 100)
|
||||
saveAmount = amount - offAmount
|
||||
}
|
||||
saveAmount = saveAmount.toFixed(2)
|
||||
}
|
||||
|
||||
const defaultAddress = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-user-address",
|
||||
whereJson: {
|
||||
uid,
|
||||
isDefault: true
|
||||
}
|
||||
})
|
||||
let name = '', phone = '', addressRegion = null, addressDetail = ''
|
||||
if (defaultAddress) {
|
||||
name = defaultAddress.name
|
||||
phone = defaultAddress.phone
|
||||
addressRegion = defaultAddress.addressRegion
|
||||
addressDetail = defaultAddress.addressDetail
|
||||
}
|
||||
const companyList = []
|
||||
for (const item of cartList.rows) {
|
||||
if (item.goods.companyId) companyList.push(item.goods.companyId)
|
||||
}
|
||||
const orderId = await vk.baseDao.add({
|
||||
dbName: "jjx-order",
|
||||
dataJson: {
|
||||
orderNo: vk.pubfn.createOrderNo("39XU", 20),
|
||||
orderStatus: 0,
|
||||
type: data.type,
|
||||
uid,
|
||||
amount,
|
||||
offAmount,
|
||||
saveAmount,
|
||||
offRate,
|
||||
name,
|
||||
phone,
|
||||
addressRegion,
|
||||
addressDetail,
|
||||
companyList,
|
||||
}
|
||||
})
|
||||
|
||||
const list = []
|
||||
for (const item of cartList.rows) {
|
||||
list.push({
|
||||
orderId: orderId,
|
||||
goodsId: item.goodsId,
|
||||
num: item.num,
|
||||
goodsName: item.goods.name,
|
||||
goodsPrice: parseFloat(item.goods.amount),
|
||||
goodsCover: item.goods.cover,
|
||||
skuId: item.skuId,
|
||||
companyId: item.goods.companyId,
|
||||
})
|
||||
}
|
||||
|
||||
await vk.baseDao.adds({
|
||||
dbName: "jjx-order-goods",
|
||||
dataJson: list
|
||||
})
|
||||
|
||||
await vk.baseDao.del({
|
||||
dbName: "jjx-cart",
|
||||
whereJson: {
|
||||
uid,
|
||||
_id: _.in(data.ids)
|
||||
}
|
||||
})
|
||||
|
||||
res.data = orderId
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
'use strict';
|
||||
const dayjs = require("dayjs");
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/changeOrderStatus 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
|
||||
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
|
||||
let { uid, orderStatus, sendMethod, resultFiles } = data;
|
||||
let res = { code: 0, msg: "" };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.id,
|
||||
dataJson: {
|
||||
orderStatus,
|
||||
sendMethod,
|
||||
resultFiles,
|
||||
expressTime: dayjs().valueOf(),
|
||||
}
|
||||
});
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* 查询当前买家 24 小时内即将自动划付的公证付款申请。
|
||||
*/
|
||||
main: async (event) => {
|
||||
const {data = {}, util} = event;
|
||||
const {uid} = data;
|
||||
const {vk, _} = util;
|
||||
const now = Date.now();
|
||||
const deadline = now + 24 * 60 * 60 * 1000;
|
||||
|
||||
const result = await vk.baseDao.select({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
whereJson: _.and([
|
||||
{
|
||||
buyerUid: uid,
|
||||
isNotaryPay: true,
|
||||
isNotaryApply: true,
|
||||
hasPaid: true,
|
||||
buyerRefuse: false,
|
||||
sellerConfirm: false,
|
||||
},
|
||||
{autoTransferTimestamp: _.gte(now)},
|
||||
{autoTransferTimestamp: _.lte(deadline)},
|
||||
]),
|
||||
sortArr: [{name: 'autoTransferTimestamp', type: 'asc'}],
|
||||
pageIndex: 1,
|
||||
pageSize: 20,
|
||||
});
|
||||
|
||||
return {
|
||||
code: 0,
|
||||
msg: '',
|
||||
data: {
|
||||
count: (result.rows || []).length,
|
||||
rows: (result.rows || []).map(item => ({
|
||||
orderId: item.orderId,
|
||||
type: item.type,
|
||||
amount: item.amount,
|
||||
autoTransferAt: item.autoTransferAt,
|
||||
autoTransferTimestamp: item.autoTransferTimestamp,
|
||||
})),
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,67 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/getInfo 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, resetOrderNo} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
res = await vk.baseDao.selects({
|
||||
dbName: "jjx-order",
|
||||
getOne: true,
|
||||
getMain: true,
|
||||
whereJson: {
|
||||
_id: data.id
|
||||
},
|
||||
foreignDB: [
|
||||
{
|
||||
dbName: "jjx-order-goods",
|
||||
localKey: "_id",
|
||||
foreignKey: "orderId",
|
||||
as: "goods",
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (vk.pubfn.isNotNull(resetOrderNo) && resetOrderNo && res) {
|
||||
const orderNo = vk.pubfn.createOrderNo("39XU", 24)
|
||||
// const orderNo = vk.pubfn.createOrderNo("3199", 24)
|
||||
await vk.baseDao.updateAndReturn({
|
||||
dbName: "jjx-order",
|
||||
whereJson: {
|
||||
_id: data.id
|
||||
},
|
||||
dataJson: {
|
||||
orderNo
|
||||
}
|
||||
});
|
||||
res.orderNo = orderNo
|
||||
}
|
||||
|
||||
if (res.type === 0) {
|
||||
for (const goodsItem of res.goods) {
|
||||
const goods = await vk.baseDao.findById({
|
||||
dbName: "jjx-goods",
|
||||
id: goodsItem.goodsId
|
||||
});
|
||||
goodsItem.sku = goods.sku.find(item => item._index === goodsItem.skuId)
|
||||
if (goods.companyId) {
|
||||
goodsItem.company = await vk.baseDao.findById({
|
||||
dbName: "uni-id-users",
|
||||
id: goods.companyId
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
'use strict';
|
||||
const dayjs = require("dayjs");
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/getList 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, type, pageIndex, pageSize, isSeller, signMethod, orderStatus, keyword} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const whereJsonArr = []
|
||||
if (!vk.pubfn.isNull(type)) {
|
||||
if (Array.isArray(type)) whereJsonArr.push({type: _.in(type)})
|
||||
else whereJsonArr.push({type})
|
||||
}
|
||||
|
||||
if (vk.pubfn.isNull(isSeller) || parseInt(isSeller) === 0) whereJsonArr.push({uid})
|
||||
else {
|
||||
whereJsonArr.push(_.or([
|
||||
{
|
||||
sellerUid: uid
|
||||
},
|
||||
{
|
||||
companyList: _.in([uid])
|
||||
}
|
||||
]))
|
||||
}
|
||||
|
||||
if (vk.pubfn.isNotNull(signMethod)) whereJsonArr.push({signMethod})
|
||||
else whereJsonArr.push({signMethod: _.neq(1)})
|
||||
|
||||
if (vk.pubfn.isNotNull(orderStatus)) whereJsonArr.push({orderStatus})
|
||||
else whereJsonArr.push({orderStatus: _.neq(-1)})
|
||||
|
||||
if (vk.pubfn.isNotNull(keyword)) whereJsonArr.push({orderNo: new RegExp(keyword)})
|
||||
|
||||
let whereJson = null
|
||||
if (whereJsonArr.length > 0) whereJson = _.and(whereJsonArr)
|
||||
console.log('whereJsonArr', whereJsonArr)
|
||||
res = await vk.baseDao.selects({
|
||||
dbName: "jjx-order",
|
||||
getCount: true,
|
||||
whereJson: whereJson,
|
||||
pageIndex,
|
||||
pageSize,
|
||||
sortArr: [{"name": "_add_time", "type": "desc"}],
|
||||
foreignDB: [
|
||||
{
|
||||
dbName: "jjx-order-goods",
|
||||
localKey: "_id",
|
||||
foreignKey: "orderId",
|
||||
as: "goods",
|
||||
limit: 500,
|
||||
foreignDB: [
|
||||
{
|
||||
dbName: "jjx-goods",
|
||||
localKey: "goodsId",
|
||||
foreignKey: "_id",
|
||||
as: "goods",
|
||||
limit: 1
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
dbName: "uni-id-users",
|
||||
localKey: "uid",
|
||||
foreignKey: "_id",
|
||||
as: "buyer",
|
||||
limit: 1
|
||||
},
|
||||
{
|
||||
dbName: "uni-id-users",
|
||||
localKey: "sellerUid",
|
||||
foreignKey: "_id",
|
||||
as: "seller",
|
||||
limit: 1
|
||||
},
|
||||
{
|
||||
dbName: "jjx-order-pay-list",
|
||||
localKey: "_id",
|
||||
foreignKey: "orderId",
|
||||
as: "payList",
|
||||
limit: 1,
|
||||
sortArr: [{"name": "_add_time", "type": "desc"}],
|
||||
},
|
||||
{
|
||||
dbName: "jjx-contract",
|
||||
localKey: "contractId",
|
||||
foreignKey: "_id",
|
||||
as: "contract",
|
||||
limit: 1,
|
||||
},
|
||||
|
||||
],
|
||||
})
|
||||
|
||||
for (let i in res.rows) {
|
||||
res.rows[i].isSeller = res.rows[i].uid !== uid
|
||||
res.rows[i].isBuyer = res.rows[i].uid === uid
|
||||
if (res.rows[i].type > 3 && res.rows[i].orderStatus > 0) {
|
||||
res.rows[i].hasPay = !!await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: res.rows[i]._id,
|
||||
buyerRefuse: false,
|
||||
hasPaid: true
|
||||
}
|
||||
})
|
||||
}
|
||||
if (res.rows[i].contract) {
|
||||
let sheet = null
|
||||
if (res.rows[i].contract.type === 'enquiry') {
|
||||
sheet = await vk.baseDao.findById({
|
||||
dbName: 'jjx-enquiry-sheet',
|
||||
id: res.rows[i].contract.sheetId
|
||||
})
|
||||
} else if (res.rows[i].contract.type === 'process') {
|
||||
sheet = await vk.baseDao.findById({
|
||||
dbName: 'jjx-process-sheet',
|
||||
id: res.rows[i].contract.sheetId
|
||||
})
|
||||
}
|
||||
res.rows[i].sheet = sheet
|
||||
}
|
||||
if (res.rows[i].type === 3) res.rows[i].upgradeExpiredAt = dayjs(userInfo.upgradeExpiredAt).format('YYYY-MM-DD HH:mm:ss')
|
||||
if (res.rows[i].type === 8) res.rows[i].spot = await vk.baseDao.findById({
|
||||
dbName: "jjx-spot-goods",
|
||||
id: res.rows[i].goods[0].pk
|
||||
})
|
||||
if (res.rows[i].type === 0) {
|
||||
for (const goodsItem of res.rows[i].goods) {
|
||||
const goods = await vk.baseDao.findById({
|
||||
dbName: "jjx-goods",
|
||||
id: goodsItem.goodsId
|
||||
});
|
||||
if (goods && goods.sku && goods.sku.length > 0) goodsItem.sku = goods.sku.find(item => item._index === goodsItem.skuId)
|
||||
}
|
||||
}
|
||||
if (res.rows[i].type === 1) {
|
||||
res.rows[i].selfProduct = await vk.baseDao.findByWhereJson({
|
||||
dbName: 'jjx-order-selfProduct',
|
||||
whereJson: {
|
||||
orderId: res.rows[i]._id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (res.rows[i].type === 12 && res.rows[i].goods[0].goodsId) {
|
||||
res.rows[i].certificate = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-certificate",
|
||||
whereJson: {
|
||||
contractId: res.rows[i].goods[0].goodsId
|
||||
}
|
||||
});
|
||||
console.log('res.rows[i].certificate', res.rows[i].certificate)
|
||||
}
|
||||
if (res.rows[i].type === 7) {
|
||||
for (let j in res.rows[i].goods) {
|
||||
if (res.rows[i].goods[j].isSingleQuote) {
|
||||
switch (res.rows[i].goods[j].type) {
|
||||
case 'enquiry' : {
|
||||
res.rows[i].goods[j].sheet = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-enquiry-sheet",
|
||||
whereJson: {
|
||||
_id: res.rows[i].goods[j].sheetId
|
||||
}
|
||||
})
|
||||
}
|
||||
break;
|
||||
case 'old' : {
|
||||
res.rows[i].goods[j].sheet = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-old",
|
||||
whereJson: {
|
||||
_id: res.rows[i].goods[j].sheetId
|
||||
}
|
||||
})
|
||||
}
|
||||
break;
|
||||
case 'process' : {
|
||||
res.rows[i].goods[j].sheet = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-process-sheet",
|
||||
whereJson: {
|
||||
_id: res.rows[i].goods[j].sheetId
|
||||
}
|
||||
})
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
'use strict';
|
||||
const notaryPay = require('./util/notaryPay');
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* 获取或创建公证全额支付单
|
||||
* @url client/order/kh/getOrCreateNotaryFullPay 前端调用的url参数地址
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, util} = event;
|
||||
let {vk} = util;
|
||||
let res = {code: 0, msg: ''};
|
||||
|
||||
const order = await vk.baseDao.findById({
|
||||
dbName: 'jjx-order',
|
||||
id: data.id
|
||||
});
|
||||
if (!order) return {code: -1, msg: '订单不存在'};
|
||||
if (!(Number(order.type) > 3 && Number(order.signMethod) === 0)) {
|
||||
return {code: -1, msg: '当前订单不是公证支付订单'};
|
||||
}
|
||||
if (Number(order.notaryPayStatus) === 1) {
|
||||
return {code: -1, msg: '订单已完成公证支付'};
|
||||
}
|
||||
|
||||
let payRecord = await notaryPay.findFullPayRecord(vk, order._id);
|
||||
if (payRecord && payRecord.hasPaid) {
|
||||
await vk.baseDao.updateById({
|
||||
dbName: 'jjx-order',
|
||||
id: order._id,
|
||||
dataJson: {
|
||||
notaryPayStatus: 1,
|
||||
notaryPayListId: payRecord._id,
|
||||
notaryPayOrderNo: payRecord.orderNo,
|
||||
payStatus: 2
|
||||
}
|
||||
});
|
||||
return {code: -1, msg: '订单已完成公证支付'};
|
||||
}
|
||||
if (!payRecord) {
|
||||
const now = vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
|
||||
const dataJson = {
|
||||
orderId: order._id,
|
||||
amount: order.offAmount || order.amount,
|
||||
type: '公证支付',
|
||||
remark: '买家全额支付到金久信公证平台',
|
||||
buyerRemark: '',
|
||||
photos: [],
|
||||
payerUid: null,
|
||||
hasPaid: false,
|
||||
paidVoucher: '',
|
||||
paidAt: '',
|
||||
confirmAt: '',
|
||||
buyerUid: order.uid,
|
||||
sellerUid: order.sellerUid,
|
||||
status: 0,
|
||||
buyerRefuse: false,
|
||||
refuseReason: null,
|
||||
buyerPhotos: [],
|
||||
expressPhoto: [],
|
||||
isExpress: false,
|
||||
expressName: null,
|
||||
expressNo: null,
|
||||
ext: [],
|
||||
isNotaryPay: true,
|
||||
isNotaryFullPay: true,
|
||||
transferStatus: 0,
|
||||
sellerConfirm: false,
|
||||
orderNo: vk.pubfn.createOrderNo("39XU", 24),
|
||||
applyAt: now,
|
||||
applyTimestamp: Date.now()
|
||||
};
|
||||
const id = await vk.baseDao.add({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
dataJson
|
||||
});
|
||||
payRecord = {
|
||||
...dataJson,
|
||||
_id: id
|
||||
};
|
||||
}
|
||||
|
||||
res.data = payRecord;
|
||||
return res;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,107 @@
|
||||
'use strict';
|
||||
const notaryPay = require('./util/notaryPay');
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/makePayList 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
// orderStatus 0待支付 1已支付待发货 2已发货待收货 3已收货待完成 4已完成
|
||||
const order = await vk.baseDao.findById({
|
||||
dbName: "jjx-order",
|
||||
id: data.payInfo.orderId
|
||||
})
|
||||
const isNotaryPay = !!order && Number(order.type) > 3 && Number(order.signMethod) === 0
|
||||
let fullPayRecord = null
|
||||
if (isNotaryPay) {
|
||||
if (Number(order.notaryPayStatus) !== 1) return {code: -1, msg: '买家尚未完成公证全额支付,暂不能申请付款'}
|
||||
fullPayRecord = await notaryPay.findFullPayRecord(vk, order._id)
|
||||
if (!fullPayRecord || !fullPayRecord.hasPaid || !fullPayRecord.orderNo) {
|
||||
return {code: -1, msg: '未找到已支付的公证全额支付单'}
|
||||
}
|
||||
const applyList = await vk.baseDao.select({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: order._id,
|
||||
isNotaryApply: true,
|
||||
buyerRefuse: false
|
||||
},
|
||||
pageIndex: 1,
|
||||
pageSize: -1
|
||||
})
|
||||
const appliedAmount = (applyList.rows || []).reduce((sum, item) => sum + Number(item.amount || 0), 0)
|
||||
const nextAmount = Number(data.payInfo.amount || 0)
|
||||
const fullAmount = Number(fullPayRecord.amount || 0)
|
||||
if (!Number.isFinite(nextAmount) || nextAmount <= 0) return {code: -1, msg: '申请金额不正确'}
|
||||
if (Number((appliedAmount + nextAmount).toFixed(2)) > fullAmount) {
|
||||
return {code: -1, msg: '累计申请金额不能超过买家公证支付总额'}
|
||||
}
|
||||
}
|
||||
const payApplyFields = await notaryPay.buildPayApplyFields(vk)
|
||||
const dataJson = {
|
||||
...data.payInfo,
|
||||
...payApplyFields,
|
||||
isNotaryPay,
|
||||
isNotaryApply: isNotaryPay,
|
||||
sourcePayListId: isNotaryPay ? fullPayRecord._id : '',
|
||||
sourcePayOrderNo: isNotaryPay ? fullPayRecord.orderNo : '',
|
||||
fullPayListId: isNotaryPay ? fullPayRecord._id : '',
|
||||
fullPayOrderNo: isNotaryPay ? fullPayRecord.orderNo : '',
|
||||
fullPayAmount: isNotaryPay ? fullPayRecord.amount : '',
|
||||
fullPayAt: isNotaryPay ? (fullPayRecord.paidAt || '') : '',
|
||||
hasPaid: isNotaryPay ? true : data.payInfo.hasPaid,
|
||||
paidAt: isNotaryPay ? (fullPayRecord.paidAt || '') : data.payInfo.paidAt,
|
||||
paidVoucher: isNotaryPay ? '' : data.payInfo.paidVoucher,
|
||||
buyerRemark: isNotaryPay ? '公证付款申请,待买家确认划付' : data.payInfo.buyerRemark
|
||||
}
|
||||
dataJson.orderNo = vk.pubfn.createOrderNo("39XU", 24)
|
||||
const payListId = await vk.baseDao.add({
|
||||
dbName: "jjx-order-pay-list",
|
||||
dataJson
|
||||
});
|
||||
dataJson._id = payListId
|
||||
|
||||
let orderStatus = data.payInfo.isExpress ? 2 : 1;
|
||||
|
||||
const hasExpress = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson:{
|
||||
orderId: data.payInfo.orderId,
|
||||
isExpress: true,
|
||||
buyerRefuse: false
|
||||
}
|
||||
});
|
||||
|
||||
if (hasExpress) orderStatus = 2
|
||||
|
||||
// payStatus(弃用) 0待创建 1待支付预付款 2已支付预付款,支付进度款中 3进度款已支付,尾款支付中 4完成
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.payInfo.orderId,
|
||||
dataJson: {
|
||||
orderStatus,
|
||||
payStatus: isNotaryPay ? 2 : 1
|
||||
}
|
||||
});
|
||||
|
||||
if (isNotaryPay) {
|
||||
await notaryPay.notifyPayApply({
|
||||
vk,
|
||||
payRecord: dataJson,
|
||||
order
|
||||
})
|
||||
}
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/orderPayList 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
|
||||
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
|
||||
let { uid } = data;
|
||||
let res = { code: 0, msg: "" };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
res = await vk.baseDao.select({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: data.id
|
||||
},
|
||||
sortArr: [{"name": "_add_time", "type": "asc"}],
|
||||
pageIndex: 1,
|
||||
pageSize: -1
|
||||
})
|
||||
|
||||
for (const item of res.rows) {
|
||||
item.isSeller = item.sellerUid === uid
|
||||
item.isBuyer = item.buyerUid === uid
|
||||
item.seller = await vk.baseDao.findById({
|
||||
dbName: "uni-id-users",
|
||||
id: item.sellerUid
|
||||
});
|
||||
}
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
'use strict';
|
||||
const notaryPay = require('./util/notaryPay');
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/paidConfirm 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const payRecord = await vk.baseDao.findById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: data.id
|
||||
})
|
||||
if (!payRecord) return {code: -1, msg: '支付单不存在'}
|
||||
|
||||
if (payRecord.isNotaryPay || payRecord.isNotaryApply) {
|
||||
res = await notaryPay.executeTransfer({
|
||||
vk,
|
||||
payRecord,
|
||||
operator: 'buyer'
|
||||
})
|
||||
if (res.code !== 0) return res
|
||||
return res
|
||||
}
|
||||
|
||||
const confirmAt = vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss")
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
sellerConfirm: true,
|
||||
confirmAt
|
||||
}
|
||||
})
|
||||
|
||||
if (['尾款', '货到付款', '全款'].includes(payRecord.type)) {
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
orderStatus: 4
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 添加余额、记录
|
||||
// const seller = await vk.baseDao.findById({
|
||||
// dbName: 'uni-id-users',
|
||||
// id: payRecord.sellerUid,
|
||||
// })
|
||||
// if (seller) {
|
||||
// if (!seller.balance) {
|
||||
// await vk.baseDao.updateById({
|
||||
// dbName: 'uni-id-users',
|
||||
// id: seller._id,
|
||||
// dataJson: {
|
||||
// balance: payRecord.price,
|
||||
// }
|
||||
// })
|
||||
// } else {
|
||||
// await vk.baseDao.updateById({
|
||||
// dbName: 'uni-id-users',
|
||||
// id: seller._id,
|
||||
// dataJson: {
|
||||
// balance: _.inc(payRecord.price),
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// await vk.baseDao.add({
|
||||
// dbName: "jjx-user-balance-log",
|
||||
// dataJson: {
|
||||
// uid: seller._id,
|
||||
// orderId: payRecord.orderId,
|
||||
// type: payRecord.type,
|
||||
// price: payRecord.price,
|
||||
// desc: "订单支付成功",
|
||||
// createTime: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
|
||||
// const order = await vk.baseDao.findById({
|
||||
// dbName: "jjx-order",
|
||||
// id: payRecord.orderId,
|
||||
// })
|
||||
//
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/payListChangeStatus 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
|
||||
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
|
||||
let { uid } = data;
|
||||
let res = { code: 0, msg: "" };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: data.id,
|
||||
dataJson: {
|
||||
status: data.status
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
'use strict';
|
||||
const dayjs = require("dayjs");
|
||||
const OpenSdk = require('../../../../util/base').default;
|
||||
const notaryPay = require('./util/notaryPay');
|
||||
|
||||
const sdk = new OpenSdk({
|
||||
appId: '8a81c1db8fc5238d01910b9e312d0692',
|
||||
appKey: 'a15ceac60f5b464eb758c4fe7800ee9f'
|
||||
});
|
||||
|
||||
const REFUND_MID = '898450100002303';
|
||||
const REFUND_TID = 'G5SBN2XJ';
|
||||
const REFUND_INST_MID = 'WGDEFAULT';
|
||||
const REFUND_SUB_MID = '898450100004218';
|
||||
const REFUND_SUB_MID_MAIN = '898450100004711';
|
||||
const PLATFORM_RATE_DICT_ID = 'd84694f2696818f20c28f55f36764783';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/payRefuse 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, refuseReason} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const payRecord = await vk.baseDao.updateAndReturn({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
_id: data.id,
|
||||
},
|
||||
dataJson: {
|
||||
buyerRefuse: true,
|
||||
refuseReason,
|
||||
transferStatus: 2,
|
||||
transferRefuseAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss")
|
||||
}
|
||||
})
|
||||
|
||||
const order = await vk.baseDao.findById({
|
||||
dbName: 'jjx-order',
|
||||
id: payRecord.orderId
|
||||
})
|
||||
|
||||
const isNotaryPay = !!order && Number(order.type) > 3 && Number(order.signMethod) === 0;
|
||||
|
||||
if (isNotaryPay && payRecord.isNotaryApply) {
|
||||
res.refund = {
|
||||
skipped: true,
|
||||
reason: '公证付款申请驳回不触发退款'
|
||||
};
|
||||
await notaryPay.addMessage(vk, {
|
||||
uid: payRecord.sellerUid,
|
||||
title: '付款单被驳回',
|
||||
content: `订单${order && order.orderNo ? order.orderNo : payRecord.orderId}的${payRecord.type || ''}付款单已被买家驳回,原因:${refuseReason || '未填写'}`,
|
||||
type: 'order-pay-refuse',
|
||||
pk: payRecord.orderId
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
if (['预付款', '货到付款'].includes(payRecord.type) && !isNotaryPay) {
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
payStatus: 0
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const hasPay = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: payRecord.orderId,
|
||||
buyerRefuse: false,
|
||||
sellerConfirm: true
|
||||
}
|
||||
})
|
||||
const hasExpress = await vk.baseDao.findByWhereJson({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: payRecord.orderId,
|
||||
isExpress: true,
|
||||
hasPaid: true,
|
||||
}
|
||||
})
|
||||
|
||||
// orderStatus 0待支付 1已支付待发货 2已发货待收货 3已收货待完成 4已完成
|
||||
// 发货单已支付的不能再次发货
|
||||
let orderStatus = 0
|
||||
// 未发货且没有支付单
|
||||
if (!hasExpress && !hasPay) orderStatus = 0
|
||||
// 未发货且有支付单
|
||||
if (!hasExpress && !!hasPay) orderStatus = 1
|
||||
// 已发货且已确认支付
|
||||
if (!!hasExpress) orderStatus = 2
|
||||
|
||||
res.hasExpress = hasExpress
|
||||
res.hasPay = hasPay
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
orderStatus
|
||||
}
|
||||
});
|
||||
|
||||
const hasManualVoucher = Array.isArray(payRecord.paidVoucher) ? payRecord.paidVoucher.length > 0 : !!payRecord.paidVoucher;
|
||||
const refundAmount = Math.round(Number(payRecord.amount || 0) * 100);
|
||||
const shouldCallRefund = !!payRecord.hasPaid && !hasManualVoucher && !!payRecord.orderNo && refundAmount > 0 && !isNotaryPay;
|
||||
|
||||
if (shouldCallRefund) {
|
||||
const refundOrderId = vk.pubfn.createOrderNo("39XU", 24);
|
||||
const refundData = {
|
||||
queryUrl: 'https://api-mop.chinaums.com/v1/netpay/refund',
|
||||
timestamp: dayjs().format('YYYYMMDDHHmmss'),
|
||||
nonce: `refund_${Date.now()}`,
|
||||
content: {
|
||||
requestTimestamp: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
||||
merOrderId: payRecord.orderNo,
|
||||
instMid: REFUND_INST_MID,
|
||||
mid: REFUND_MID,
|
||||
tid: REFUND_TID,
|
||||
refundAmount,
|
||||
refundOrderId,
|
||||
refundDesc: refuseReason || '买家驳回支付单退款'
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const platformRateData = await vk.baseDao.findById({
|
||||
dbName: 'jjx-dict',
|
||||
id: PLATFORM_RATE_DICT_ID
|
||||
});
|
||||
const platformRate = Number(platformRateData && platformRateData.content);
|
||||
if (!Number.isNaN(platformRate) && platformRate >= 0 && platformRate <= 100) {
|
||||
const subAmount = parseInt(refundAmount * ((100 - platformRate) / 100), 10);
|
||||
const subAmountMain = refundAmount - subAmount;
|
||||
refundData.content.platformAmount = 0;
|
||||
refundData.content.subOrders = [
|
||||
{
|
||||
mid: REFUND_SUB_MID,
|
||||
totalAmount: String(subAmount),
|
||||
},
|
||||
{
|
||||
mid: REFUND_SUB_MID_MAIN,
|
||||
totalAmount: String(subAmountMain),
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
const refundRawResult = await sdk.exec(refundData);
|
||||
const refundResult = typeof refundRawResult === "string" ? JSON.parse(refundRawResult) : refundRawResult;
|
||||
const refundSuccess = refundResult && refundResult.errCode === 'SUCCESS';
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundApplyAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundApplyPayload: refundData.content,
|
||||
refundApplyResult: refundResult,
|
||||
refundApplySuccess: refundSuccess
|
||||
}
|
||||
});
|
||||
|
||||
res.refund = {
|
||||
success: refundSuccess,
|
||||
result: refundResult
|
||||
};
|
||||
} catch (err) {
|
||||
const errMsg = err && err.message ? err.message : JSON.stringify(err);
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundApplyAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundApplyPayload: refundData.content,
|
||||
refundApplySuccess: false,
|
||||
refundApplyError: errMsg
|
||||
}
|
||||
});
|
||||
|
||||
res.refund = {
|
||||
success: false,
|
||||
error: errMsg
|
||||
};
|
||||
}
|
||||
} else {
|
||||
res.refund = {
|
||||
skipped: true,
|
||||
reason: '当前支付单未命中线上退款条件'
|
||||
};
|
||||
}
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/refund 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, refundReason, refundPhotos} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const order = await vk.baseDao.findById({
|
||||
dbName: "jjx-order",
|
||||
id: data.id
|
||||
});
|
||||
if ([4, 5, 6].includes(order.type)) {
|
||||
const payList = await vk.baseDao.select({
|
||||
dbName: "jjx-order-pay-list",
|
||||
whereJson: {
|
||||
orderId: data.id,
|
||||
buyerRefuse: false
|
||||
}
|
||||
});
|
||||
let paidConfirmNum = 0
|
||||
for (let i = 0; i < payList.rows.length; i++) {
|
||||
if ( payList.rows[i].sellerConfirm) paidConfirmNum++
|
||||
}
|
||||
if (paidConfirmNum === payList.rows.length) {
|
||||
res.code = 1;
|
||||
res.msg = "订单已确认收款,无法申请退款";
|
||||
} else {
|
||||
res.code = 0;
|
||||
res.msg = "平台将在2个工作日内审核,请您耐心等待";
|
||||
}
|
||||
}
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.id,
|
||||
dataJson: {
|
||||
refundReason,
|
||||
refundPhotos,
|
||||
orderStatus: 5,
|
||||
refundRequestAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss")
|
||||
}
|
||||
})
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
'use strict';
|
||||
const dayjs = require("dayjs");
|
||||
const OpenSdk = require('../../../../util/base').default;
|
||||
|
||||
const sdk = new OpenSdk({
|
||||
appId: '8a81c1db8fc5238d01910b9e312d0692',
|
||||
appKey: 'a15ceac60f5b464eb758c4fe7800ee9f'
|
||||
});
|
||||
|
||||
const REFUND_MID = '898450100002303';
|
||||
const REFUND_TID = 'G5SBN2XJ';
|
||||
const REFUND_INST_MID = 'WGDEFAULT';
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* 退款查询
|
||||
* @url client/order/kh/refundQuery 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, util} = event;
|
||||
let {vk} = util;
|
||||
let res = {code: 0, msg: ""};
|
||||
|
||||
const payRecord = await vk.baseDao.findById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: data.id
|
||||
});
|
||||
|
||||
if (!payRecord) {
|
||||
return {
|
||||
code: -1,
|
||||
msg: "支付单不存在"
|
||||
};
|
||||
}
|
||||
|
||||
const refundOrderId = data.refundOrderId
|
||||
|| (payRecord.refundApplyPayload && payRecord.refundApplyPayload.refundOrderId)
|
||||
|| (payRecord.refundApplyResult && payRecord.refundApplyResult.refundOrderId);
|
||||
|
||||
if (!refundOrderId) {
|
||||
return {
|
||||
code: -1,
|
||||
msg: "未找到退款单号,请先发起退款"
|
||||
};
|
||||
}
|
||||
|
||||
const queryData = {
|
||||
queryUrl: 'https://api-mop.chinaums.com/v1/netpay/refund-query',
|
||||
timestamp: dayjs().format('YYYYMMDDHHmmss'),
|
||||
nonce: `refund_query_${Date.now()}`,
|
||||
content: {
|
||||
requestTimestamp: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
||||
merOrderId: refundOrderId,
|
||||
instMid: REFUND_INST_MID,
|
||||
mid: REFUND_MID,
|
||||
tid: REFUND_TID
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const queryRawResult = await sdk.exec(queryData);
|
||||
const queryResult = typeof queryRawResult === "string" ? JSON.parse(queryRawResult) : queryRawResult;
|
||||
const querySuccess = queryResult && queryResult.errCode === 'SUCCESS';
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundQueryAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundQueryPayload: queryData.content,
|
||||
refundQueryResult: queryResult,
|
||||
refundQuerySuccess: querySuccess
|
||||
}
|
||||
});
|
||||
|
||||
res.data = queryResult;
|
||||
res.querySuccess = querySuccess;
|
||||
res.msg = querySuccess ? "查询成功" : (queryResult.errMsg || "查询失败");
|
||||
return res;
|
||||
} catch (err) {
|
||||
const errMsg = err && err.message ? err.message : JSON.stringify(err);
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
refundQueryAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
refundQueryPayload: queryData.content,
|
||||
refundQuerySuccess: false,
|
||||
refundQueryError: errMsg
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
code: -1,
|
||||
msg: errMsg
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/resetOrderNo 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
|
||||
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
|
||||
let { uid } = data;
|
||||
let res = { code: 0, msg: "" };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.id,
|
||||
dataJson: {
|
||||
orderNo: vk.pubfn.createOrderNo("39XU", 20),
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/setExpress 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, id, expressName, expressNo, remark, expressPhoto,} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id,
|
||||
dataJson: {
|
||||
expressName,
|
||||
expressNo,
|
||||
remark,
|
||||
expressPhoto,
|
||||
orderStatus: 2,
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/makePayList 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
// status 0待支付 1已支付待发货 2已发货待收货 3已收货待完成 4已完成
|
||||
|
||||
await vk.baseDao.adds({
|
||||
dbName: "jjx-order-pay-list",
|
||||
dataJson: data.payList
|
||||
});
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.payList[0].orderId,
|
||||
dataJson: {
|
||||
orderStatus: 1
|
||||
}
|
||||
});
|
||||
|
||||
console.log('orderId', data.payList[0].orderId)
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/updateAddress 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
|
||||
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
|
||||
let { uid } = data;
|
||||
let res = { code: 0, msg: "" };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order",
|
||||
id: data.id,
|
||||
dataJson: {
|
||||
address: data.address,
|
||||
addressDetail: data.addressDetail,
|
||||
phone: data.phone,
|
||||
name: data.name,
|
||||
remark: data.remark,
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* XXXnameXXX
|
||||
* @url client/order/kh/uploadPayVoucher 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @param {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let {data = {}, userInfo, util, filterResponse, originalParam} = event;
|
||||
let {customUtil, uniID, config, pubFun, vk, db, _} = util;
|
||||
let {uid, buyerPhotos, paidVoucher, buyerRemark} = data;
|
||||
let res = {code: 0, msg: ""};
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
|
||||
const payRecord = await vk.baseDao.findById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: data._id
|
||||
})
|
||||
if (payRecord && payRecord.isNotaryApply) {
|
||||
return {code: -1, msg: '公证付款申请无需买家再次支付'}
|
||||
}
|
||||
|
||||
await vk.baseDao.updateById({
|
||||
dbName: "jjx-order-pay-list",
|
||||
id: data._id,
|
||||
dataJson: {
|
||||
hasPaid: true,
|
||||
paidVoucher,
|
||||
paidAt: vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss"),
|
||||
buyerPhotos,
|
||||
buyerRemark
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
'use strict';
|
||||
|
||||
const AUTO_TRANSFER_DAYS_DICT_ID = '238cef266a67e89a006025974a41dbd7';
|
||||
const DEFAULT_AUTO_TRANSFER_DAYS = 3;
|
||||
|
||||
function nowText(vk) {
|
||||
return vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
|
||||
}
|
||||
|
||||
async function getAutoTransferDays(vk) {
|
||||
try {
|
||||
const config = await vk.baseDao.findById({
|
||||
dbName: 'jjx-dict',
|
||||
id: AUTO_TRANSFER_DAYS_DICT_ID
|
||||
});
|
||||
const days = parseInt(config && config.content, 10);
|
||||
if (Number.isFinite(days) && days > 0) return days;
|
||||
} catch (err) {
|
||||
console.error('getAutoTransferDays error:', err);
|
||||
}
|
||||
return DEFAULT_AUTO_TRANSFER_DAYS;
|
||||
}
|
||||
|
||||
async function buildPayApplyFields(vk) {
|
||||
const applyTimestamp = Date.now();
|
||||
const autoTransferDays = await getAutoTransferDays(vk);
|
||||
const autoTransferTimestamp = applyTimestamp + autoTransferDays * 24 * 60 * 60 * 1000;
|
||||
return {
|
||||
transferStatus: 0,
|
||||
applyAt: nowText(vk),
|
||||
applyTimestamp,
|
||||
autoTransferDays,
|
||||
autoTransferAt: vk.pubfn.timeFormat(new Date(autoTransferTimestamp), "yyyy-MM-dd hh:mm:ss"),
|
||||
autoTransferTimestamp
|
||||
};
|
||||
}
|
||||
|
||||
async function findFullPayRecord(vk, orderId) {
|
||||
const res = await vk.baseDao.select({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
whereJson: {
|
||||
orderId,
|
||||
isNotaryFullPay: true,
|
||||
buyerRefuse: false
|
||||
},
|
||||
sortArr: [{name: '_add_time', type: 'desc'}],
|
||||
pageIndex: 1,
|
||||
pageSize: 1
|
||||
});
|
||||
return res && res.rows && res.rows[0] ? res.rows[0] : null;
|
||||
}
|
||||
|
||||
async function resolveTransferSourcePayRecord(vk, payRecord) {
|
||||
if (!payRecord) return null;
|
||||
if (payRecord.isNotaryFullPay) return payRecord;
|
||||
if (payRecord.fullPayListId) {
|
||||
const fullPayRecord = await vk.baseDao.findById({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
id: payRecord.fullPayListId
|
||||
});
|
||||
if (fullPayRecord) return fullPayRecord;
|
||||
}
|
||||
if (payRecord.sourcePayListId) {
|
||||
const fullPayRecord = await vk.baseDao.findById({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
id: payRecord.sourcePayListId
|
||||
});
|
||||
if (fullPayRecord) return fullPayRecord;
|
||||
}
|
||||
if (payRecord.orderId) {
|
||||
return await findFullPayRecord(vk, payRecord.orderId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取卖家用于银联划付的企业用户号。
|
||||
* 企业用户号属于卖家用户资料,不能使用客户端传入值或固定商户号。
|
||||
*/
|
||||
async function resolveSellerMerNo(vk, payRecord) {
|
||||
const sellerUid = payRecord && payRecord.sellerUid;
|
||||
if (!sellerUid) return '';
|
||||
try {
|
||||
const seller = await vk.baseDao.findById({
|
||||
dbName: 'uni-id-users',
|
||||
id: sellerUid
|
||||
});
|
||||
return String((seller && seller.merNo) || '').trim();
|
||||
} catch (err) {
|
||||
console.error('resolveSellerMerNo error:', err);
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
async function addMessage(vk, dataJson) {
|
||||
if (!dataJson || !dataJson.uid) return;
|
||||
await vk.baseDao.add({
|
||||
dbName: 'jjx-message',
|
||||
dataJson: {
|
||||
...dataJson,
|
||||
hasRead: false
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function notifyPaySuccess({ vk, payRecord, order }) {
|
||||
await addMessage(vk, {
|
||||
uid: payRecord.sellerUid,
|
||||
title: '买家已完成公证支付',
|
||||
content: `订单${order && order.orderNo ? order.orderNo : payRecord.orderId}买家已支付货款到金久信公证平台,请按约定发起付款单申请划付。`,
|
||||
type: 'order-pay',
|
||||
pk: payRecord.orderId
|
||||
});
|
||||
}
|
||||
|
||||
async function notifyPayApply({ vk, payRecord, order }) {
|
||||
await addMessage(vk, {
|
||||
uid: payRecord.buyerUid,
|
||||
title: '卖家已发起付款单',
|
||||
content: `订单${order && order.orderNo ? order.orderNo : payRecord.orderId}卖家已发起${payRecord.type || ''}付款单,金额${payRecord.amount}元,请及时通过申请或驳回。`,
|
||||
type: 'order-pay',
|
||||
pk: payRecord.orderId
|
||||
});
|
||||
}
|
||||
|
||||
async function executeTransfer({ vk, payRecord, operator = 'buyer' }) {
|
||||
if (!payRecord) return { code: -1, msg: '支付单不存在' };
|
||||
if (!payRecord.isNotaryApply) return { code: -1, msg: '当前支付单不是公证划付申请单' };
|
||||
if (payRecord.buyerRefuse) return { code: -1, msg: '支付单已被买家驳回' };
|
||||
if (!payRecord.hasPaid) return { code: -1, msg: '公证托管资金尚未支付' };
|
||||
if (payRecord.sellerConfirm) return { code: 0, msg: '已划付', data: payRecord.transferResult || null };
|
||||
|
||||
const fullPayRecord = await resolveTransferSourcePayRecord(vk, payRecord);
|
||||
const sourcePayOrderNo = fullPayRecord && fullPayRecord.orderNo ? fullPayRecord.orderNo : (payRecord.fullPayOrderNo || payRecord.sourcePayOrderNo || '');
|
||||
const sourcePayListId = fullPayRecord && fullPayRecord._id ? fullPayRecord._id : (payRecord.fullPayListId || payRecord.sourcePayListId || '');
|
||||
const sourcePayAmount = fullPayRecord && Number(fullPayRecord.amount || 0) > 0 ? Number(fullPayRecord.amount) : Number(payRecord.fullPayAmount || 0);
|
||||
if (!sourcePayOrderNo) return { code: -1, msg: '未找到全额支付单单号,无法划付' };
|
||||
if (fullPayRecord && !fullPayRecord.hasPaid) return { code: -1, msg: '全额支付单尚未支付,无法划付' };
|
||||
|
||||
// const buyer = await vk.baseDao.findById({
|
||||
// dbName: 'uni-id-users',
|
||||
// id: payRecord.buyerUid,
|
||||
// });
|
||||
// if (!buyer || !buyer.mid) {
|
||||
// return { code: -1, msg: '买家商户号不存在' };
|
||||
// }
|
||||
|
||||
const payAmt = Number(payRecord.amount || payRecord.price || 0);
|
||||
if (!Number.isFinite(payAmt) || payAmt <= 0) {
|
||||
return { code: -1, msg: '付款单金额不正确' };
|
||||
}
|
||||
const accNo = await resolveSellerMerNo(vk, payRecord);
|
||||
if (!accNo) {
|
||||
return { code: -1, msg: '卖家未配置企业用户号,无法划付' };
|
||||
}
|
||||
const transferResult = await vk.request({
|
||||
url: 'http://jjx-union-pay.gxwebsoft.com/api/union-pay-jjx/transByOrder',
|
||||
method: 'POST',
|
||||
dataType: 'json',
|
||||
header: {
|
||||
'content-type': 'application/json; charset=utf-8'
|
||||
},
|
||||
data: {
|
||||
accNo,
|
||||
merOrderNo: sourcePayOrderNo,
|
||||
payAmt,
|
||||
amount: payAmt,
|
||||
},
|
||||
timeout: 60000
|
||||
});
|
||||
|
||||
const transferAt = nowText(vk);
|
||||
await vk.baseDao.updateById({
|
||||
dbName: 'jjx-order-pay-list',
|
||||
id: payRecord._id,
|
||||
dataJson: {
|
||||
sellerConfirm: true,
|
||||
confirmAt: transferAt,
|
||||
transferStatus: 1,
|
||||
transferAt,
|
||||
transferOperator: operator,
|
||||
transferResult,
|
||||
transferSourcePayListId: sourcePayListId,
|
||||
transferSourceOrderNo: sourcePayOrderNo,
|
||||
transferSourceAmount: sourcePayAmount
|
||||
}
|
||||
});
|
||||
|
||||
if (['尾款', '货到付款', '全款'].includes(payRecord.type)) {
|
||||
await vk.baseDao.updateById({
|
||||
dbName: 'jjx-order',
|
||||
id: payRecord.orderId,
|
||||
dataJson: {
|
||||
orderStatus: 4,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
await addMessage(vk, {
|
||||
uid: payRecord.sellerUid,
|
||||
title: '付款单已划付',
|
||||
content: `付款单${payRecord.type || ''}已${operator === 'auto' ? '自动' : '由买家确认'}划付,金额${payRecord.amount}元,来源单号:${sourcePayOrderNo}。`,
|
||||
type: 'order-pay-transfer',
|
||||
pk: payRecord.orderId
|
||||
});
|
||||
|
||||
return {
|
||||
code: 0,
|
||||
msg: '划付成功',
|
||||
data: {
|
||||
transferResult,
|
||||
sourcePayOrderNo,
|
||||
sourcePayListId,
|
||||
sourcePayAmount
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
AUTO_TRANSFER_DAYS_DICT_ID,
|
||||
DEFAULT_AUTO_TRANSFER_DAYS,
|
||||
getAutoTransferDays,
|
||||
buildPayApplyFields,
|
||||
findFullPayRecord,
|
||||
resolveTransferSourcePayRecord,
|
||||
addMessage,
|
||||
notifyPaySuccess,
|
||||
notifyPayApply,
|
||||
resolveSellerMerNo,
|
||||
executeTransfer
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
'use strict';
|
||||
module.exports = {
|
||||
/**
|
||||
* 此函数名称
|
||||
* @url client/order/pub/test 前端调用的url参数地址
|
||||
* data 请求参数
|
||||
* @params {String} params1 参数1
|
||||
*/
|
||||
main: async (event) => {
|
||||
let { data = {}, userInfo, util, originalParam } = event;
|
||||
let { customUtil, config, pubFun, vk, db, _ } = util;
|
||||
let { uid } = data;
|
||||
let res = { code : 0, msg : '' };
|
||||
// 业务逻辑开始-----------------------------------------------------------
|
||||
// 可写与数据库的交互逻辑等等
|
||||
|
||||
|
||||
|
||||
|
||||
// 业务逻辑结束-----------------------------------------------------------
|
||||
return res;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user