Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Z
zhichan
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
蒋勇
zhichan
Commits
846ee4e8
Commit
846ee4e8
authored
May 19, 2022
by
宋毅
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新接口
parent
ab84846f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
434 additions
and
297 deletions
+434
-297
center-channel/app/base/api/api.base.js
+0
-1
center-channel/app/base/api/impl/icp/consultation.js
+0
-0
center-channel/app/base/api/impl/icp/order.js
+46
-178
center-channel/app/base/db/metadata/apps/platform.js
+5
-6
center-channel/app/base/db/models/common/gatewaypushlog.js
+53
-53
center-channel/app/base/service/impl/receiveSve/icpNeedSve.js
+97
-0
center-channel/app/base/service/impl/receiveSve/icpOrderSve.js
+186
-0
center-channel/app/base/system.js
+7
-0
center-channel/app/config/routes/api.js
+40
-59
center-channel/app/config/settings.js
+0
-0
No files found.
center-channel/app/base/api/api.base.js
View file @
846ee4e8
...
@@ -24,7 +24,6 @@ class APIBase {
...
@@ -24,7 +24,6 @@ class APIBase {
//-----------------------新的模式------------------开始
//-----------------------新的模式------------------开始
async
doexecMethod
(
gname
,
methodname
,
pobj
,
query
,
req
)
{
async
doexecMethod
(
gname
,
methodname
,
pobj
,
query
,
req
)
{
req
.
requestId
=
this
.
getUUID
();
req
.
requestId
=
this
.
getUUID
();
try
{
try
{
var
shaStr
=
await
sha256
(
JSON
.
stringify
(
pobj
));
var
shaStr
=
await
sha256
(
JSON
.
stringify
(
pobj
));
...
...
center-channel/app/base/api/impl/icp/consultation.js
View file @
846ee4e8
This diff is collapsed.
Click to expand it.
center-channel/app/base/api/impl/icp/order.js
View file @
846ee4e8
var
APIBase
=
require
(
"../../api.base"
);
let
APIBase
=
require
(
"../../api.base"
);
var
system
=
require
(
"../../../system"
);
let
system
=
require
(
"../../../system"
);
var
settings
=
require
(
"../../../../config/settings"
);
let
settings
=
require
(
"../../../../config/settings"
);
const
uuidv4
=
require
(
'uuid/v4'
);
/**
/**
* icp通知接口(百度icp接入)
* 增值服务订单服务
* 庄冰 2020.10.22
*/
*/
class
Order
extends
APIBase
{
class
Order
extends
APIBase
{
constructor
()
{
constructor
()
{
...
@@ -12,207 +11,75 @@ class Order extends APIBase {
...
@@ -12,207 +11,75 @@ class Order extends APIBase {
this
.
gatewaypushlogSve
=
system
.
getObject
(
"service.common.gatewaypushlogSve"
);
this
.
gatewaypushlogSve
=
system
.
getObject
(
"service.common.gatewaypushlogSve"
);
}
}
getUUID
()
{
var
uuid
=
uuidv4
();
var
u
=
uuid
.
replace
(
/
\-
/g
,
""
);
return
u
;
}
getResultSuccess
(
requestId
)
{
return
{
"status"
:
0
,
"msg"
:
"success"
,
"data"
:
null
,
"requestId"
:
requestId
};
}
getResultFail
(
errmsg
)
{
var
self
=
this
;
return
{
"status"
:
-
1
,
"msg"
:
errmsg
,
"requestId"
:
self
.
getUUID
(),
"data"
:
null
,
"bizmsg"
:
"empty"
};
}
//icp状态变更
//icp状态变更
async
notify
(
pobj
,
obj
,
req
)
{
async
notify
(
pobj
,
obj
,
req
)
{
var
self
=
this
;
if
(
!
pobj
.
appInfo
||
!
pobj
.
appInfo
.
uapp_key
||
!
pobj
.
appInfo
.
uapp_secret
)
{
if
(
!
pobj
.
appInfo
||
!
pobj
.
appInfo
.
uapp_key
||
!
pobj
.
appInfo
.
uapp_secret
){
return
system
.
getResultFailByErrMsg
(
"未知应用或应用未启用"
);
return
self
.
getResultFail
(
"未知应用或应用未启用"
);
}
}
if
(
!
pobj
.
orderNo
)
{
if
(
!
pobj
.
orderNo
)
{
return
self
.
getResultFail
(
"orderNo不能为空"
);
return
system
.
getResultFailByErrMsg
(
"orderNo不能为空"
);
}
if
(
!
pobj
.
isDirectBuy
||
pobj
.
isDirectBuy
==
"0"
){
pobj
.
isDirectBuy
=
0
;
}
}
pobj
.
isDirectBuy
=
pobj
.
isDirectBuy
||
0
;
//1是直购,0是下单未付款,算订单未付款需求
pobj
.
status
=
1
;
pobj
.
status
=
1
;
if
(
pobj
.
isDirectBuy
==
0
&&
!
pobj
.
bizId
)
{
if
(
pobj
.
isDirectBuy
==
1
&&
!
pobj
.
phone
)
{
return
self
.
getResultFail
(
"非直接下单bizId不能为空"
);
return
system
.
getResultFailByErrMsg
(
"直接下单phone不能为空"
);
}
if
(
pobj
.
isDirectBuy
==
1
&&
!
pobj
.
phone
)
{
return
self
.
getResultFail
(
"直接下单phone不能为空"
);
}
}
if
(
pobj
.
isDirectBuy
==
1
&&
!
pobj
.
consultType
)
{
if
(
pobj
.
isDirectBuy
==
1
&&
!
pobj
.
consultType
)
{
return
s
elf
.
getResultFail
(
"直接下单consultType不能为空"
);
return
s
ystem
.
getResultFailByErrMsg
(
"直接下单consultType不能为空"
);
}
else
{
}
else
{
if
(
pobj
.
consultType
==
"ICP"
)
{
if
(
pobj
.
consultType
==
"ICP"
)
{
pobj
.
consultType
=
"5"
;
pobj
.
consultType
=
"5"
;
}
}
if
(
pobj
.
consultType
==
"EDI"
)
{
if
(
pobj
.
consultType
==
"EDI"
)
{
pobj
.
consultType
=
"7"
;
pobj
.
consultType
=
"7"
;
}
}
pobj
.
action_type
=
"icpOrderStatus"
;
if
(
pobj
.
area
)
{
switch
(
pobj
.
area
)
{
case
"BEIJING"
:
pobj
.
area
=
"1"
;
break
;
case
"SHANGHAI"
:
pobj
.
area
=
"2"
;
break
;
case
"FUJIAN"
:
pobj
.
area
=
"3"
;
break
;
case
"GUANGXI"
:
pobj
.
area
=
"4"
;
break
;
case
"GUANGDONG"
:
pobj
.
area
=
"5"
;
break
;
case
"ANHUI"
:
pobj
.
area
=
"6"
;
break
;
case
"HENAN"
:
pobj
.
area
=
"7"
;
break
;
case
"HUBEI"
:
pobj
.
area
=
"8"
;
break
;
case
"ZHEJIANG"
:
pobj
.
area
=
"9"
;
break
;
case
"JIANGSU"
:
pobj
.
area
=
"10"
;
break
;
case
"SHANDONG"
:
pobj
.
area
=
"11"
;
break
;
case
"SHANGXI_SHAN"
:
pobj
.
area
=
"12"
;
break
;
case
"NINGXIA"
:
pobj
.
area
=
"13"
;
break
;
case
"GANSU"
:
pobj
.
area
=
"14"
;
break
;
case
"XINJIANG"
:
pobj
.
area
=
"15"
;
break
;
case
"QINGHAI"
:
pobj
.
area
=
"16"
;
break
;
case
"TIANJIN"
:
pobj
.
area
=
"17"
;
break
;
case
"CHONGQING"
:
pobj
.
area
=
"18"
;
break
;
case
"HEBEI"
:
pobj
.
area
=
"19"
;
break
;
case
"SHANXI_JIN"
:
pobj
.
area
=
"20"
;
break
;
case
"LIAONING"
:
pobj
.
area
=
"21"
;
break
;
case
"JINLIN"
:
pobj
.
area
=
"22"
;
break
;
case
"HEILONGJIANG"
:
pobj
.
area
=
"23"
;
break
;
case
"JIANGXI"
:
pobj
.
area
=
"24"
;
break
;
case
"HUNAN"
:
pobj
.
area
=
"25"
;
break
;
case
"SICHUAN"
:
pobj
.
area
=
"26"
;
break
;
case
"GUIZHOU"
:
pobj
.
area
=
"27"
;
break
;
case
"YUNNAN"
:
pobj
.
area
=
"28"
;
break
;
case
"NEIMENGGU"
:
pobj
.
area
=
"29"
;
break
;
case
"XIZANG"
:
pobj
.
area
=
"30"
;
break
;
case
"HANWAIZI"
:
pobj
.
area
=
"31"
;
break
;
case
"QUANWAIZI"
:
pobj
.
area
=
"31"
;
break
;
case
"WAIZI"
:
pobj
.
area
=
"31"
;
break
;
case
"HAINAN"
:
pobj
.
area
=
"34"
;
break
;
default
:
break
;
}
}
}
}
pobj
.
area
=
settings
.
areaConfig
[
pobj
.
area
];
// pobj.action_type = "icpOrderStatus";
if
(
!
pobj
.
area
)
{
if
(
!
pobj
.
area
)
{
return
self
.
getResultFail
(
"area参数错误"
);
return
self
.
getResultFail
(
"area参数错误"
);
}
}
var
param
=
{
let
param
=
{
requestId
:
req
.
requestId
||
self
.
getUUID
(),
requestId
:
req
.
requestId
||
self
.
getUUID
(),
requestUrl
:
"/icp/order/notify"
,
//
requestUrl: "/icp/order/notify",
requestjson
:
JSON
.
stringify
(
pobj
),
//请求地址
requestjson
:
JSON
.
stringify
(
pobj
),
//请求地址
pushUrl
:
"/action/intentionapi/springBoard"
,
//调用地址
//
pushUrl: "/action/intentionapi/springBoard",//调用地址
pushActionType
:
"icpOrderStatus"
,
//调用参数
//
pushActionType: "icpOrderStatus",//调用参数
pushtimes
:
0
,
//推送次数
pushtimes
:
0
,
//推送次数
pushStatus
:
"wts"
,
//推送状态
pushStatus
:
"wts"
,
//推送状态
version
:
1
,
interface_path
:
"service.receiveSve.icpOrderSve"
,
//接口路径
interface_method
:
"submitOrder"
,
//接口方法
}
}
await
self
.
gatewaypushlogSve
.
create
(
param
);
await
this
.
gatewaypushlogSve
.
create
(
param
);
return
s
elf
.
getResultSuccess
(
param
.
requestId
);
return
s
ystem
.
getResultSuccess
(
null
);
}
}
async
close
(
pobj
,
obj
,
req
){
async
close
(
pobj
,
obj
,
req
)
{
var
self
=
this
;
if
(
!
pobj
.
appInfo
||
!
pobj
.
appInfo
.
uapp_key
||
!
pobj
.
appInfo
.
uapp_secret
)
{
if
(
!
pobj
.
appInfo
||
!
pobj
.
appInfo
.
uapp_key
||
!
pobj
.
appInfo
.
uapp_secret
){
return
system
.
getResultFailByErrMsg
(
"未知应用或应用未启用"
);
return
self
.
getResultFail
(
"未知应用或应用未启用"
);
}
}
if
(
!
pobj
.
orderNo
)
{
if
(
!
pobj
.
orderNo
)
{
return
s
elf
.
getResultFail
(
"orderNo不能为空"
);
return
s
ystem
.
getResultFailByErrMsg
(
"orderNo不能为空"
);
}
}
pobj
.
channelOrderNo
=
pobj
.
orderNo
;
pobj
.
channelOrderNo
=
pobj
.
orderNo
;
pobj
.
action_type
=
"icpOrderClose"
;
//
pobj.action_type = "icpOrderClose";
var
param
=
{
let
param
=
{
requestId
:
req
.
requestId
||
self
.
getUUID
(),
requestId
:
req
.
requestId
||
self
.
getUUID
(),
requestUrl
:
"/icp/order/close"
,
//
requestUrl: "/icp/order/close",
requestjson
:
JSON
.
stringify
(
pobj
),
//请求地址
requestjson
:
JSON
.
stringify
(
pobj
),
//请求地址
pushUrl
:
"/action/intentionapi/springBoard"
,
//调用地址
//
pushUrl: "/action/intentionapi/springBoard",//调用地址
pushActionType
:
"icpOrderClose"
,
//调用参数
//
pushActionType: "icpOrderClose",//调用参数
pushtimes
:
0
,
//推送次数
pushtimes
:
0
,
//推送次数
pushStatus
:
"wts"
,
//推送状态
pushStatus
:
"wts"
,
//推送状态
version
:
1
,
interface_path
:
"service.receiveSve.icpOrderSve"
,
//接口路径
interface_method
:
"closeOrder"
,
//接口方法
}
}
await
self
.
gatewaypushlogSve
.
create
(
param
);
await
this
.
gatewaypushlogSve
.
create
(
param
);
return
s
elf
.
getResultSuccess
(
param
.
requestId
);
return
s
ystem
.
getResultSuccess
(
null
);
}
}
}
}
module
.
exports
=
Order
;
module
.
exports
=
Order
;
\ No newline at end of file
center-channel/app/base/db/metadata/apps/platform.js
View file @
846ee4e8
...
@@ -16,12 +16,10 @@ module.exports = {
...
@@ -16,12 +16,10 @@ module.exports = {
// },
// },
],
],
},
},
"bizs"
:
{
"bizs"
:
{},
},
"pdict"
:
{
"pdict"
:
{
"logLevel"
:
{
"debug"
:
0
,
"info"
:
1
,
"warn"
:
2
,
"error"
:
3
,
"fatal"
:
4
},
"logLevel"
:
{
"debug"
:
0
,
"info"
:
1
,
"warn"
:
2
,
"error"
:
3
,
"fatal"
:
4
},
"push_return_type"
:
{
"0"
:
"推送失败"
,
"1"
:
"推送成功"
},
"push_return_type"
:
{
"0"
:
"推送失败"
,
"1"
:
"推送成功"
},
}
,
}
}
}
}
}
\ No newline at end of file
center-channel/app/base/db/models/common/gatewaypushlog.js
View file @
846ee4e8
...
@@ -2,58 +2,58 @@ const system = require("../../../system");
...
@@ -2,58 +2,58 @@ const system = require("../../../system");
const
settings
=
require
(
"../../../../config/settings"
);
const
settings
=
require
(
"../../../../config/settings"
);
const
uiconfig
=
system
.
getUiConfig2
(
settings
.
appKey
);
const
uiconfig
=
system
.
getUiConfig2
(
settings
.
appKey
);
module
.
exports
=
(
db
,
DataTypes
)
=>
{
module
.
exports
=
(
db
,
DataTypes
)
=>
{
return
db
.
define
(
"gatewaypushlog"
,
{
return
db
.
define
(
"gatewaypushlog"
,
{
requestId
:
DataTypes
.
STRING
,
requestId
:
DataTypes
.
STRING
,
requestUrl
:
DataTypes
.
STRING
,
//请求地址
requestUrl
:
DataTypes
.
STRING
,
//请求地址
requestjson
:
DataTypes
.
STRING
,
//请求地址
requestjson
:
DataTypes
.
STRING
,
//请求地址
pushUrl
:
DataTypes
.
STRING
,
//调用地址
pushUrl
:
DataTypes
.
STRING
,
//调用地址
pushActionType
:
DataTypes
.
STRING
,
//调用参数
pushActionType
:
DataTypes
.
STRING
,
//调用参数
pushtimes
:
DataTypes
.
INTEGER
,
//推送次数
pushtimes
:
DataTypes
.
INTEGER
,
//推送次数
pushStatus
:
DataTypes
.
STRING
,
//推送状态
pushStatus
:
DataTypes
.
STRING
,
//推送状态
error
:
DataTypes
.
STRING
(
5000
),
//错误信息
error
:
DataTypes
.
STRING
(
5000
),
//错误信息
},
{
interface_path
:
DataTypes
.
STRING
(
1024
),
//接口路径
paranoid
:
false
,
//假的删除
interface_method
:
DataTypes
.
STRING
,
//接口方法
underscored
:
true
,
},
{
version
:
true
,
paranoid
:
false
,
//假的删除
freezeTableName
:
true
,
underscored
:
true
,
timestamps
:
true
,
version
:
true
,
updatedAt
:
fals
e
,
freezeTableName
:
tru
e
,
//freezeTableName
: true,
timestamps
:
true
,
// define the table's name
updatedAt
:
false
,
tableName
:
'gateway_pushlog'
,
//freezeTableName: true
,
validate
:
{
// define the table's name
tableName
:
'gateway_pushlog'
,
},
validate
:
{
},
indexes
:
[
indexes
:
[
// Create a unique index on email
// Create a unique index on email
// {
// {
// unique: true,
// unique: true,
// fields: ['email']
// fields: ['email']
// },
// },
//
//
// // Creates a gin index on data with the jsonb_path_ops operator
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// {
// fields: ['data'],
// fields: ['data'],
// using: 'gin',
// using: 'gin',
// operator: 'jsonb_path_ops'
// operator: 'jsonb_path_ops'
// },
// },
//
//
// // By default index name will be [table]_[fields]
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// // Creates a multi column partial index
// {
// {
// name: 'public_by_author',
// name: 'public_by_author',
// fields: ['author', 'status'],
// fields: ['author', 'status'],
// where: {
// where: {
// status: 'public'
// status: 'public'
// }
// }
// },
// },
//
//
// // A BTREE index with a ordered field
// // A BTREE index with a ordered field
// {
// {
// name: 'title_index',
// name: 'title_index',
// method: 'BTREE',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
// }
]
]
});
});
}
}
center-channel/app/base/service/impl/receiveSve/icpNeedSve.js
0 → 100644
View file @
846ee4e8
let
system
=
require
(
"../../../system"
);
let
settings
=
require
(
"../../../../config/settings"
);
const
AppServiceBase
=
require
(
"../../app.base"
);
class
IcpNeedService
extends
AppServiceBase
{
constructor
()
{
super
();
this
.
utilsPushSve
=
system
.
getObject
(
"service.utilsSve.utilsPushSve"
);
}
async
submitNeed
(
pobj
)
{
if
(
!
pobj
.
actionBody
.
intentionBizId
)
{
return
system
.
getResult
(
null
,
"actionBody.intentionBizId can not be empty,6000001"
);
}
let
sobj
=
pobj
;
sobj
.
actionType
=
"getProductTypeInfo"
;
let
url
=
settings
.
centerAppUrl
()
+
"action/opProduct/springBoard"
;
let
rtn
=
await
this
.
execClient
.
execPost
(
sobj
,
url
);
if
(
!
rtn
||
!
rtn
.
stdout
)
{
return
system
.
getResultFail
(
-
5015
,
"需求类型查询失败,6000002"
);
}
let
data
=
JSON
.
parse
(
rtn
.
stdout
);
if
(
data
.
status
!=
0
)
{
return
system
.
getResultFail
(
-
5015
,
"需求类型查询失败6000003"
);
}
pobj
.
actionBody
.
service_product_id
=
data
.
data
.
service_product_id
;
pobj
.
actionBody
.
productId
=
data
.
data
.
service_product_id
;
pobj
.
actionBody
.
appName
=
pobj
.
appInfo
.
app_name
;
pobj
.
actionBody
.
type_code
=
data
.
data
.
type_code
;
pobj
.
actionBody
.
type_name
=
data
.
data
.
type_name
;
pobj
.
actionBody
.
channel_type_code
=
data
.
data
.
channel_type_code
;
pobj
.
actionBody
.
channel_type_name
=
data
.
data
.
channel_type_name
;
pobj
.
actionBody
.
type
=
pobj
.
actionBody
.
channel_type_code
;
pobj
.
actionBody
.
idempotentId
=
pobj
.
actionBody
.
intentionBizId
;
pobj
.
actionBody
.
idempotentSourceName
=
pobj
.
appInfo
.
app_name
;
// pobj.actionBody.type = "baidu.icp";
// pobj.actionBody.idempotentSource = "baidu_icp";
//推送云服需要的type、idempotentSource两个参数确定,先去掉试一试
// if (pobj.actionBody.channel_type_code == 5) {
// pobj.actionBody.type = "baidu.icp";
// pobj.actionBody.idempotentSource = "baidu_icp";
// } else if (pobj.actionBody.channel_type_code == 7) {
// pobj.actionBody.type = "baidu.edi";
// pobj.actionBody.idempotentSource = "baidu_edi";
// } else if (pobj.actionBody.channel_type_code == "NC") {
// pobj.actionBody.type = "baidu.wangwen";
// pobj.actionBody.idempotentSource = "baidu_wangwen";
// } else if (pobj.actionBody.channel_type_code == "RT") {
// pobj.actionBody.type = "baidu.radiotv";
// pobj.actionBody.idempotentSource = "baidu_radiotv";
// }
// if (pobj.appInfo && pobj.appInfo.uapp_id && pobj.appInfo.uapp_id == "52") {
// if (pobj.actionBody.channel_type_code == 5) {
// pobj.actionBody.type = "yiming.icp";
// pobj.actionBody.idempotentSource = "yiming.icp";
// } else if (pobj.actionBody.channel_type_code == 7) {
// pobj.actionBody.type = "yiming.edi";
// pobj.actionBody.idempotentSource = "yiming.edi";
// } else if (pobj.actionBody.channel_type_code == "ICPNB") {
// pobj.actionBody.type = "yiming.icpnb";
// pobj.actionBody.idempotentSource = "yiming.icpnb";
// } else if (pobj.actionBody.channel_type_code == "EDINB") {
// pobj.actionBody.type = "yiming.edinb";
// pobj.actionBody.idempotentSource = "yiming.edinb";
// } else if (pobj.actionBody.channel_type_code == "ICPXQ") {
// pobj.actionBody.type = "yiming.icpxq";
// pobj.actionBody.idempotentSource = "yiming.icpxq";
// } else if (pobj.actionBody.channel_type_code == "EDIXQ") {
// pobj.actionBody.type = "yiming.edixq";
// pobj.actionBody.idempotentSource = "yiming.edixq";
// }
// //外资暂时产品库未上架
// else if (pobj.actionBody.channel_type_code == "ICPWZ") {
// pobj.actionBody.type = "yiming.icpwz";
// pobj.actionBody.idempotentSource = "yiming.icpwz";
// } else if (pobj.actionBody.channel_type_code == "EDIWZ") {
// pobj.actionBody.type = "yiming.ediwz";
// pobj.actionBody.idempotentSource = "yiming.ediwz";
// }
// }
pobj
.
actionBody
.
level
=
"A"
;
pobj
.
actionType
=
"submitNeed"
;
let
reqUrl
=
settings
.
centerOrderUrl
()
+
"action/need/springBoard"
;
let
result
=
await
this
.
restPostUrl
(
pobj
,
reqUrl
);
if
(
result
.
status
==
0
)
{
this
.
utilsPushSve
.
business2Channel
(
pobj
,
"pushNeedICPBusinessNew"
);
}
return
result
;
}
}
module
.
exports
=
IcpNeedService
;
\ No newline at end of file
center-channel/app/base/service/impl/receiveSve/icpOrderSve.js
0 → 100644
View file @
846ee4e8
let
system
=
require
(
"../../../system"
);
let
settings
=
require
(
"../../../../config/settings"
);
const
AppServiceBase
=
require
(
"../../app.base"
);
class
IcpOrderService
extends
AppServiceBase
{
constructor
()
{
super
();
this
.
utilsPushSve
=
system
.
getObject
(
"service.utilsSve.utilsPushSve"
);
}
async
submitOrder
(
pobj
)
{
pobj
.
province
=
pobj
.
area
;
if
(
pobj
.
appInfo
.
uapp_id
==
"52"
)
{
// 易名渠道
if
(
pobj
.
consultType
==
"5"
||
pobj
.
consultType
==
"7"
)
{
// ICP 申请
pobj
.
province
=
pobj
.
area
+
'-申请'
;
}
}
let
sobj
=
{
actionType
:
"getIcpProduce"
,
actionBody
:
{
typeCode
:
pobj
.
actionBody
.
consultType
,
province
:
pobj
.
province
},
appInfo
:
pobj
.
appInfo
,
actionProcess
:
pobj
.
actionProcess
}
if
(
pobj
.
param1
||
pobj
.
param2
)
{
sobj
.
additionsDesc
=
pobj
.
param1
+
pobj
.
param2
;
}
//附加参数
let
productUrl
=
settings
.
centerAppUrl
()
+
"action/opProduct/springBoard"
;
let
rtn
=
await
this
.
execClient
.
execPost
(
sobj
,
productUrl
);
if
(
!
rtn
||
!
rtn
.
stdout
)
{
return
system
.
getResultFail
(
-
5010
,
"产品查询失败,6100001"
);
}
let
productItem
=
JSON
.
parse
(
rtn
.
stdout
);
if
(
productItem
.
status
!=
0
)
{
return
system
.
getResultFail
(
-
5010
,
"产品查询失败,6100002"
);
}
pobj
.
actionBody
.
totalSum
=
productItem
.
data
.
price
;
pobj
.
actionBody
.
orderPrice
=
productItem
.
data
.
price
;
pobj
.
actionBody
.
payTotalSum
=
productItem
.
data
.
price
;
pobj
.
actionBody
.
payCode
=
productItem
.
data
.
payCode
;
pobj
.
actionBody
.
productPriceId
=
productItem
.
data
.
productPriceId
;
pobj
.
actionBody
.
channelItemCode
=
productItem
.
data
.
channelItemCode
;
pobj
.
actionBody
.
channelNeedNo
=
productItem
.
data
.
channelNeedNo
;
pobj
.
actionBody
.
needNo
=
productItem
.
data
.
needNo
;
pobj
.
actionBody
.
quantity
=
1
;
pobj
.
actionBody
.
channelOrder
=
{
channelServiceNo
:
pobj
.
actionBody
.
orderNo
,
channelOrderNo
:
pobj
.
actionBody
.
orderNo
,
orderStatus
:
2
}
let
orderItem
=
await
this
.
utilsOrderSve
.
addOrder
(
pobj
,
pobj
.
actionBody
);
if
(
orderItem
.
status
!=
0
&&
orderItem
.
status
!=
-
1
)
{
return
system
.
getResultFail
(
-
5010
,
"订单创建失败,6100003"
);
}
if
(
orderItem
.
data
)
{
pobj
.
actionBody
.
orderNo
=
pobj
.
actionBody
.
channelOrder
.
channelOrderNo
;
}
pobj
.
actionBody
.
channelSolutionNo
=
pobj
.
actionBody
.
orderNo
;
pobj
.
actionType
=
"receiveSolutionPayInfoNew"
;
let
url
=
settings
.
centerOrderUrl
()
+
"action/icapi/springBoard"
;
let
solutionRes
=
await
this
.
execClient
.
execPost
(
pobj
,
url
);
if
(
!
solutionRes
||
!
solutionRes
.
stdout
)
{
return
system
.
getResultFail
(
-
5010
,
"方案创建失败,6100004"
);
}
let
solutionItem
=
JSON
.
parse
(
solutionRes
.
stdout
);
if
(
solutionItem
.
status
!=
0
)
{
return
system
.
getResultFail
(
-
5010
,
"方案创建失败,6100005"
);
}
// if (!solutiondata.data) {
// return system.getResultFail(-5012, "方案查询数据为空");
// }
// if (solutiondata.data && solutiondata.data.channelNeedNo) {
// pobj.actionBody.needId = solutiondata.data.channelNeedNo;
// }
// if (pobj.actionBody.channelItemCode == '5') {
// pobj.actionBody.regType = "baidu.icp";
// } else if (pobj.actionBody.channelItemCode == '7') {
// pobj.actionBody.regType = "baidu.edi";
// } else if (pobj.actionBody.channelItemCode == 'NC') {
// pobj.actionBody.regType = "baidu.wangwen";
// } else if (pobj.actionBody.channelItemCode == 'RT') {
// pobj.actionBody.regType = "baidu.radiotv";
// }
//
// if (pobj && pobj.appInfo && pobj.appInfo.uapp_id && pobj.appInfo.uapp_id == '52') {
// if (pobj.actionBody.channelItemCode == '5') {
// pobj.actionBody.regType = "yiming.icp";
// } else if (pobj.actionBody.channelItemCode == '7') {
// pobj.actionBody.regType = "yiming.edi";
// } else if (pobj.actionBody.channelItemCode == 'ICPXQ') {
// pobj.actionBody.regType = "yiming.icpxq";
// } else if (pobj.actionBody.channelItemCode == 'EDIXQ') {
// pobj.actionBody.regType = "yiming.edixq";
// } else if (pobj.actionBody.channelItemCode == 'ICPNB') {
// pobj.actionBody.regType = "yiming.icpnb";
// } else if (pobj.actionBody.channelItemCode == 'EDINB') {
// pobj.actionBody.regType = "yiming.edinb";
// } else if (pobj.actionBody.channelItemCode == 'ICPWZ') {
// pobj.actionBody.regType = "yiming.icpwz";
// } else if (pobj.actionBody.channelItemCode == 'EDIWZ') {
// pobj.actionBody.regType = "yiming.ediwz";
// }
// }
let
yfObj
=
{
actionBody
:
{
area
:
pobj
.
actionBody
.
province
,
idempotentSource
:
pobj
.
actionBody
.
regType
,
orderNo
:
pobj
.
actionBody
.
channelOrder
.
channelOrderNo
,
orderPrice
:
Number
(
pobj
.
actionBody
.
orderPrice
/
100
),
phone
:
pobj
.
actionBody
.
publishMobile
,
needId
:
pobj
.
actionBody
.
channelOrder
.
channelOrderNo
,
companyName
:
pobj
.
actionBody
.
CompanyName
||
''
,
appName
:
pobj
.
appInfo
.
app_name
||
''
,
sku
:
data
.
data
.
service_code
||
''
},
appInfo
:
pobj
.
appInfo
}
let
yunfuPushRes
=
await
this
.
utilsPushSve
.
business2Channel
(
yfObj
,
"pushOrderICPBusinessNew"
);
if
(
pobj
.
actionBody
.
isDirectBuy
&&
pobj
.
actionBody
.
isDirectBuy
==
1
)
{
//直接下单需执行添加订单业务员操作
if
(
yunfuPushRes
&&
yunfuPushRes
.
status
==
0
)
{
if
(
yunfuPushRes
.
data
&&
yunfuPushRes
.
data
.
data
)
{
let
deliveryObj
=
{
actionBody
:
{
orderNo
:
yunfuPushRes
.
data
.
orderNo
,
needsolution
:
yunfuPushRes
.
data
.
solutionContent
,
channelNeedNo
:
yunfuPushRes
.
data
.
channelNeedNo
,
channelSolutionNo
:
yunfuPushRes
.
data
.
channelSolutionNo
,
skuCode
:
data
.
data
.
payCode
,
servicer
:
{
code
:
'gsb'
,
name
:
'公司宝'
}
},
appInfo
:
pobj
.
appInfo
};
let
resData
=
yunfuPushRes
.
data
.
data
;
let
salesmanInfo
=
{
salesmanName
:
resData
.
orderList
&&
resData
.
orderList
.
length
>
0
?
resData
.
orderList
[
0
].
operatorName
:
""
,
salesmanChannelId
:
resData
.
orderList
&&
resData
.
orderList
.
length
>
0
?
resData
.
orderList
[
0
].
operator
:
""
,
};
deliveryObj
.
actionBody
.
needsolution
=
{
salesmanInfo
:
salesmanInfo
,
orderNo
:
orderrtn
.
data
.
orderNo
}
this
.
utilsPushSve
.
business2Channel
(
deliveryObj
,
"pushDeliveryOrder"
);
}
}
}
return
system
.
getResultSuccess
(
null
);
}
async
closeOrder
(
pobj
)
{
let
actionBody
=
pobj
.
actionBody
;
let
url
=
settings
.
centerOrderUrl
()
+
"action/qcapi/springBoard"
;
let
rtn
=
await
this
.
restPostUrl
(
pobj
,
url
);
if
(
rtn
.
status
==
0
&&
rtn
.
data
)
{
let
channelOrderNo
=
pobj
.
actionBody
.
orderNo
;
pobj
.
actionBody
.
orderNo
=
rtn
.
data
.
orderNo
;
pobj
.
actionType
=
"delOrder"
;
let
orderrtn
=
await
this
.
utilsOrderSve
.
delOrder
(
pobj
,
actionBody
);
if
(
orderrtn
.
status
<
0
)
{
return
system
.
getResultFail
(
-
5022
,
"订单关闭失败"
);
}
let
tmpObj
=
{
actionBody
:
{
orderNo
:
rtn
.
data
.
orderNo
,
channelNeedNo
:
rtn
.
data
.
channelNeedNo
,
needsolution
:
rtn
.
data
.
solutionContent
},
appInfo
:
pobj
.
appInfo
}
this
.
utilsPushSve
.
business2Channel
(
tmpObj
,
"pushDeliveryStatusNotify"
);
// tmpObj.actionBody.orderNo = channelOrderNo;
let
tmpObj2
=
{
actionBody
:
{
orderNo
:
channelOrderNo
,
channelNeedNo
:
rtn
.
data
.
channelNeedNo
||
channelOrderNo
,
//做云服和企服通没有渠道需求号的兼容
needsolution
:
rtn
.
data
.
solutionContent
},
appInfo
:
pobj
.
appInfo
};
this
.
utilsPushSve
.
business2Channel
(
tmpObj2
,
"pushOrderICPClose"
);
}
//通知更新状态
return
rtn
;
}
}
module
.
exports
=
IcpOrderService
;
\ No newline at end of file
center-channel/app/base/system.js
View file @
846ee4e8
...
@@ -218,6 +218,13 @@ class System {
...
@@ -218,6 +218,13 @@ class System {
data
:
data
,
data
:
data
,
};
};
}
}
static
getResultFailByErrMsg
(
errmsg
=
"fail"
)
{
return
{
status
:
-
1
,
msg
:
errmsg
,
data
:
""
,
};
}
/**
/**
* 请求返回失败
* 请求返回失败
...
...
center-channel/app/config/routes/api.js
View file @
846ee4e8
...
@@ -6,7 +6,7 @@ const utilsFeishuSve = system.getObject("service.utilsSve.utilsFeishuSve");
...
@@ -6,7 +6,7 @@ const utilsFeishuSve = system.getObject("service.utilsSve.utilsFeishuSve");
const
signSve
=
system
.
getObject
(
"service.common.signSve"
);
const
signSve
=
system
.
getObject
(
"service.common.signSve"
);
const
xml2js
=
require
(
'xml2js'
);
const
xml2js
=
require
(
'xml2js'
);
const
jwt
=
require
(
'jsonwebtoken'
);
const
jwt
=
require
(
'jsonwebtoken'
);
const
{
PDICT
}
=
require
(
"../../config/businessConfig"
);
const
{
PDICT
}
=
require
(
"../../config/businessConfig"
);
const
settings
=
require
(
"../../config/settings"
);
const
settings
=
require
(
"../../config/settings"
);
module
.
exports
=
function
(
app
)
{
module
.
exports
=
function
(
app
)
{
...
@@ -243,7 +243,7 @@ module.exports = function (app) {
...
@@ -243,7 +243,7 @@ module.exports = function (app) {
return
;
return
;
}
}
// 2020 0812 lin 只去掉了check,因为要记录智能诊断的返回值,其他接口暂时未去掉
// 2020 0812 lin 只去掉了check,因为要记录智能诊断的返回值,其他接口暂时未去掉
if
([
"getAppTokenByHosts"
,
"getAppTokenByAppKey"
,
"test"
,
"getIndustries"
,
"getSecondIndustries"
,
"getQualificationByIndustry"
,
"counselling"
,
"queryTradeProduceList"
,
"getNeedComparisonList"
].
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
if
([
"getAppTokenByHosts"
,
"getAppTokenByAppKey"
,
"test"
,
"getIndustries"
,
"getSecondIndustries"
,
"getQualificationByIndustry"
,
"counselling"
,
"queryTradeProduceList"
,
"getNeedComparisonList"
].
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
req
.
body
.
actionBody
.
appHosts
=
req
.
host
;
req
.
body
.
actionBody
.
appHosts
=
req
.
host
;
next
();
next
();
return
;
return
;
...
@@ -394,32 +394,29 @@ module.exports = function (app) {
...
@@ -394,32 +394,29 @@ module.exports = function (app) {
//-----------------------新的模式---------api---------开始
//-----------------------新的模式---------api---------开始
//百度手动获取签名sign方法
//百度手动获取签名sign方法
// app.post("/baidu/creatSign", async function (req, res, next) {
app
.
post
(
"/baidu/creatSign"
,
async
function
(
req
,
res
,
next
)
{
// if (!req.body.key) {
if
(
!
req
.
body
.
key
)
{
// res.end({ code: -200, message: "缺少加签秘钥key参数" });
res
.
end
({
code
:
-
200
,
message
:
"缺少加签秘钥key参数"
});
// return;
return
;
// }
}
// if (!req.body.obj) {
if
(
!
req
.
body
.
obj
)
{
// res.end({ code: -200, message: "缺少obj参数" });
res
.
end
({
code
:
-
200
,
message
:
"缺少obj参数"
});
// return;
return
;
// }
}
// let obj = req.body.obj;
let
obj
=
req
.
body
.
obj
;
// let key = req.body.key;
let
key
=
req
.
body
.
key
;
// let result = await signSve.createSign(obj, key);
let
result
=
await
signSve
.
createSign
(
obj
,
key
);
// res.end(JSON.stringify(result));
res
.
end
(
JSON
.
stringify
(
result
));
// return;
return
;
// });
});
app
.
all
(
"/api/*"
,
async
function
(
req
,
res
,
next
)
{
app
.
all
(
"/api/*"
,
async
function
(
req
,
res
,
next
)
{
var
result
=
system
.
getResult
(
null
,
"req method must is post"
);
let
result
=
system
.
getResult
(
null
,
"req method must is post"
);
if
(
req
.
method
!=
"POST"
)
{
if
(
req
.
method
!=
"POST"
)
{
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
console
.
log
(
req
.
originalUrl
,
"sy-------------------------------00001---yy"
)
;
let
appkey
=
req
.
headers
[
"appkey"
]
||
""
;
if
(
PDICT
.
apiAliSendKeyPathList
.
indexOf
(
req
.
originalUrl
)
>=
0
)
{
if
(
PDICT
.
apiAliSendKeyPathList
.
indexOf
(
req
.
originalUrl
)
>=
0
)
{
//验证数据key
var
appkey
=
req
.
headers
[
"appkey"
]
||
""
;
if
(
!
appkey
)
{
if
(
!
appkey
)
{
result
.
msg
=
"req headers appkey can not be empty"
;
result
.
msg
=
"req headers appkey can not be empty"
;
result
.
data
=
null
;
result
.
data
=
null
;
...
@@ -434,18 +431,16 @@ module.exports = function (app) {
...
@@ -434,18 +431,16 @@ module.exports = function (app) {
}
}
next
();
next
();
return
;
return
;
}
}
//规定的请求path、请求头中appkey验证是否等于201912031344的路由【符合放过】
if
(
PDICT
.
apiSecretPathList
.
indexOf
(
req
.
originalUrl
)
>=
0
)
{
if
(
PDICT
.
apiSecretPathList
.
indexOf
(
req
.
originalUrl
)
>=
0
)
{
//验证数据签名
console
.
log
(
"apiSecretPathList"
,
req
.
headers
)
var
appkey
=
req
.
headers
[
"appkey"
]
||
""
;
if
(
!
appkey
)
{
if
(
!
appkey
)
{
result
.
msg
=
"req headers appkey can not be empty"
;
result
.
msg
=
"req headers appkey can not be empty"
;
result
.
data
=
null
;
result
.
data
=
null
;
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
var
sign
=
req
.
headers
[
"sign"
]
||
""
;
let
sign
=
req
.
headers
[
"sign"
]
||
""
;
if
(
!
sign
)
{
if
(
!
sign
)
{
result
.
msg
=
"req headers sign can not be empty"
;
result
.
msg
=
"req headers sign can not be empty"
;
result
.
data
=
null
;
result
.
data
=
null
;
...
@@ -453,18 +448,17 @@ module.exports = function (app) {
...
@@ -453,18 +448,17 @@ module.exports = function (app) {
return
;
return
;
}
}
//1.通过appkey 获取appInfo
//1.通过appkey 获取appInfo
var
appRes
=
await
signSve
.
getAppInfoByAppKey
(
appkey
);
let
appRes
=
await
signSve
.
getAppInfoByAppKey
(
appkey
);
if
(
!
appRes
||
appRes
.
status
!=
0
)
{
if
(
!
appRes
||
appRes
.
status
!=
0
)
{
result
.
msg
=
"获取应用信息失败"
;
result
.
msg
=
"获取应用信息失败"
;
result
.
data
=
null
;
result
.
data
=
null
;
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
var
appInfo
=
appRes
.
data
;
let
appInfo
=
appRes
.
data
;
//2.通过appsecret 验签
//2.通过appsecret 验签
req
.
body
.
sign
=
sign
;
req
.
body
.
sign
=
sign
;
var
signParams
=
req
.
body
;
let
verifyRes
=
await
signSve
.
verifySign
(
req
.
body
,
appInfo
.
uapp_secret
);
var
verifyRes
=
await
signSve
.
verifySign
(
req
.
body
,
appInfo
.
uapp_secret
);
if
(
verifyRes
&&
verifyRes
.
status
==
0
)
{
if
(
verifyRes
&&
verifyRes
.
status
==
0
)
{
req
.
body
.
appInfo
=
appInfo
;
req
.
body
.
appInfo
=
appInfo
;
req
.
appInfo
=
appInfo
;
req
.
appInfo
=
appInfo
;
...
@@ -476,22 +470,27 @@ module.exports = function (app) {
...
@@ -476,22 +470,27 @@ module.exports = function (app) {
return
;
return
;
}
}
}
}
//规定的请求path、请求头中sign验证的路由【符合放过】
if
([
"getAppTokenByHosts"
,
"getAppTokenByAppKey"
,
"getTmNclFilterSearch"
,
"feedback"
,
"accountingInfo"
,
"booksInfo"
].
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
if
([
"getAppTokenByHosts"
,
"getAppTokenByAppKey"
,
"getTmNclFilterSearch"
,
"feedback"
,
"accountingInfo"
,
"booksInfo"
].
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
req
.
body
.
actionBody
.
appHosts
=
req
.
host
;
req
.
body
.
actionBody
.
appHosts
=
req
.
host
;
next
();
next
();
return
;
return
;
}
}
//规定的actionType请求路由,有getAppTokenByAppKey获取请求头中token【符合放过】
if
(
req
.
path
.
indexOf
(
"/taskapi/"
)
>=
0
)
{
if
(
req
.
path
.
indexOf
(
"/taskapi/"
)
>=
0
)
{
next
();
next
();
return
;
return
;
}
}
//任务请求的路由【符合放过】
if
(
!
req
.
body
.
actionType
)
{
if
(
!
req
.
body
.
actionType
)
{
result
.
msg
=
"actionType can not be empty"
;
result
.
msg
=
"actionType can not be empty"
;
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
//actionType不能为空
var
token
=
req
.
headers
[
"token"
]
||
""
;
//验证请求头中的token-------------------------------------------------开始
let
token
=
req
.
headers
[
"token"
]
||
""
;
if
(
!
token
)
{
if
(
!
token
)
{
result
.
msg
=
"req headers token can not be empty"
;
result
.
msg
=
"req headers token can not be empty"
;
result
.
data
=
null
;
result
.
data
=
null
;
...
@@ -515,14 +514,8 @@ module.exports = function (app) {
...
@@ -515,14 +514,8 @@ module.exports = function (app) {
let
tmpAppInfo
=
JSON
.
parse
(
decryptResult
.
data
);
let
tmpAppInfo
=
JSON
.
parse
(
decryptResult
.
data
);
req
.
body
.
appInfo
=
tmpAppInfo
;
req
.
body
.
appInfo
=
tmpAppInfo
;
req
.
body
.
actionProcess
=
tmpAppInfo
.
app_code
;
req
.
body
.
actionProcess
=
tmpAppInfo
.
app_code
;
// var cacheManager = system.getObject("db.common.cacheManager");
//验证请求头中的token-------------------------------------------------结束
// var result = await cacheManager["AppTokenByHostsCache"].getCache(token, system.exTime);
// if (result.status != 0) {
// res.end(JSON.stringify(result));
// return;
// }
// req.body.appInfo = result.data;
// req.body.actionProcess = result.data.app_code;
if
(
PDICT
.
apiMustUserpinList
.
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
if
(
PDICT
.
apiMustUserpinList
.
indexOf
(
req
.
body
.
actionType
)
>=
0
)
{
var
userpin
=
req
.
headers
[
"userpin"
]
||
""
;
var
userpin
=
req
.
headers
[
"userpin"
]
||
""
;
if
(
!
userpin
)
{
if
(
!
userpin
)
{
...
@@ -532,20 +525,6 @@ module.exports = function (app) {
...
@@ -532,20 +525,6 @@ module.exports = function (app) {
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
// var params = {
// "appInfo": req.body.appInfo,
// "actionType": "getLoginInfo",
// "actionBody": {
// "userpin": userpin
// }
// }
// result = await utilsAuthSve.getLoginInfo(params, params.actionBody);
// if (result.status != 0) {
// result.status = system.noLogin;
// result.msg = "user login is invalidation";
// res.end(JSON.stringify(result));
// return;
// }
let
userpin_secret_str
=
null
;
let
userpin_secret_str
=
null
;
jwt
.
verify
(
userpin
,
tokenSecret
,
function
(
err
,
decoded
)
{
// decoded:指的是token解码后用户信息
jwt
.
verify
(
userpin
,
tokenSecret
,
function
(
err
,
decoded
)
{
// decoded:指的是token解码后用户信息
if
(
err
)
{
//如果token过期则会执行err的代码块
if
(
err
)
{
//如果token过期则会执行err的代码块
...
@@ -565,7 +544,7 @@ module.exports = function (app) {
...
@@ -565,7 +544,7 @@ module.exports = function (app) {
res
.
end
(
JSON
.
stringify
(
result
));
res
.
end
(
JSON
.
stringify
(
result
));
return
;
return
;
}
}
}
//需要
用户登录
}
//需要
设置用户登录的actionType请求验证
next
();
next
();
});
});
...
@@ -624,6 +603,8 @@ module.exports = function (app) {
...
@@ -624,6 +603,8 @@ module.exports = function (app) {
});
});
//-----------------------新的模式---------api---------结束
//-----------------------新的模式---------api---------结束
//-----------------------新的模式---------ICP---------开始
//-----------------------新的模式---------ICP---------开始
app
.
all
(
"/icp/*"
,
async
function
(
req
,
res
,
next
)
{
app
.
all
(
"/icp/*"
,
async
function
(
req
,
res
,
next
)
{
var
result
=
system
.
getResult
(
null
,
"req method must is post"
);
var
result
=
system
.
getResult
(
null
,
"req method must is post"
);
...
...
center-channel/app/config/settings.js
View file @
846ee4e8
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment