Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
I
iBiz企业中心
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
iBiz企业套件
iBiz企业中心
提交
98f5198e
提交
98f5198e
编写于
7月 09, 2020
作者:
ibizdev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chitanda 发布系统代码
上级
6541c9ca
变更
11
展开全部
显示空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
1705 行增加
和
28 行删除
+1705
-28
filter-mode.vue
app_CRM/src/components/filter-tree/filter-mode.vue
+66
-5
filter-tree.vue
app_CRM/src/components/filter-tree/filter-tree.vue
+89
-21
quotes.ts
app_CRM/src/mock/entity/quotes/quotes.ts
+896
-0
quote-service-base.ts
app_CRM/src/service/quote/quote-service-base.ts
+120
-0
info-all-form-base.tsx
.../src/widgets/account/info-all-form/info-all-form-base.tsx
+1
-1
QuoteMapper.java
...bizlab/businesscentral/core/sales/mapper/QuoteMapper.java
+4
-0
IQuoteService.java
...lab/businesscentral/core/sales/service/IQuoteService.java
+4
-0
QuoteServiceImpl.java
...nesscentral/core/sales/service/impl/QuoteServiceImpl.java
+36
-0
QuoteMapper.xml
...ore/src/main/resources/mapper/sales/quote/QuoteMapper.xml
+36
-0
systemResource.json
...al-core/src/main/resources/permission/systemResource.json
+1
-1
QuoteResource.java
...bizlab/businesscentral/centralapi/rest/QuoteResource.java
+452
-0
未找到文件。
app_CRM/src/components/filter-tree/filter-mode.vue
浏览文件 @
98f5198e
<
template
>
<el-select
size=
"small"
class=
"filter-mode"
placeholder=
"条件逻辑
"
v-model=
"curVal"
@
change=
"onChange"
>
<el-select
size=
"small"
class=
"filter-mode"
:placeholder=
"$t('components.filterMode.placeholder')
"
v-model=
"curVal"
@
change=
"onChange"
>
<el-option
v-for=
"mode in filterMode"
v-for=
"mode in fi
eldFi
lterMode"
:key=
"mode.value"
:label=
"getLabel(mode)"
:value=
"mode.value"
...
...
@@ -11,7 +11,7 @@
</
template
>
<
script
lang=
"ts"
>
import
{
Vue
,
Component
,
Model
}
from
"vue-property-decorator"
;
import
{
Vue
,
Component
,
Model
,
Prop
,
Watch
}
from
"vue-property-decorator"
;
@
Component
({})
export
default
class
FilterMode
extends
Vue
{
...
...
@@ -24,6 +24,19 @@ export default class FilterMode extends Vue {
*/
@
Model
(
'change'
)
readonly
value
:
any
;
/**
* 自定义逻辑集合
*
* @type {*}
* @memberof FilterMode
*/
@
Prop
()
modes
!
:
any
[];
@
Watch
(
'modes'
)
onModesChange
(
newVal
:
any
)
{
this
.
setDefValue
();
}
get
curVal
()
{
return
this
.
value
;
}
...
...
@@ -34,6 +47,21 @@ export default class FilterMode extends Vue {
this
.
$emit
(
'change'
,
val
);
}
get
fieldFilterMode
()
{
if
(
this
.
modes
&&
this
.
modes
.
length
>
0
)
{
let
index
:
number
=
this
.
modes
.
findIndex
((
mode
:
any
)
=>
Object
.
is
(
mode
.
mode
,
'all'
));
if
(
index
<
0
)
{
let
items
:
any
[]
=
[];
this
.
modes
.
forEach
((
mode
:
any
)
=>
{
let
item
:
any
=
this
.
filterMode
.
find
((
filter
:
any
)
=>
Object
.
is
(
filter
[
'en-US'
],
mode
.
mode
));
items
.
push
(
item
);
})
return
items
;
}
}
return
this
.
filterMode
;
}
/**
* 过滤模式
*
...
...
@@ -60,13 +88,37 @@ export default class FilterMode extends Vue {
// { 'zh-CN': '', en: 'NOTEXISTS', value: '$notExists' }
];
/**
* 生命周期
*
* @return {void}
* @memberof FilterMode
*/
public
mounted
()
{
this
.
setDefValue
()
}
/**
* 设置默认值
*
* @return {void}
* @memberof FilterMode
*/
public
setDefValue
()
{
if
(
this
.
fieldFilterMode
.
length
>
0
)
{
this
.
curVal
=
this
.
fieldFilterMode
[
0
].
value
;
this
.
onChange
();
}
}
/**
* 获取语言文本
*
* @return {string}
* @memberof FilterMode
*/
getLabel
(
mode
:
any
):
string
{
public
getLabel
(
mode
:
any
):
string
{
if
(
this
.
$i18n
.
locale
)
{
return
mode
[
this
.
$i18n
.
locale
];
}
...
...
@@ -79,7 +131,16 @@ export default class FilterMode extends Vue {
* @memberof FilterMode
*/
public
onChange
()
{
this
.
$emit
(
'mode-change'
,
this
.
value
);
this
.
$nextTick
(()
=>
{
let
item
:
any
=
this
.
filterMode
.
find
((
filter
:
any
)
=>
Object
.
is
(
filter
.
value
,
this
.
curVal
));
if
(
this
.
modes
&&
this
.
modes
.
length
>
0
)
{
let
mode
:
any
=
this
.
modes
.
find
((
mode
:
any
)
=>
Object
.
is
(
mode
.
mode
,
item
[
'en-US'
]));
if
(
!
mode
)
{
mode
=
this
.
modes
.
find
((
mode
:
any
)
=>
Object
.
is
(
mode
.
mode
,
'all'
));
}
this
.
$emit
(
'on-change'
,
mode
);
}
})
}
}
...
...
app_CRM/src/components/filter-tree/filter-tree.vue
浏览文件 @
98f5198e
...
...
@@ -7,25 +7,25 @@
<el-option
v-for=
"mode in relationModes"
:key=
"mode.value"
:label=
"getLabel(mode)"
:value=
"mode.value"
></el-option>
</el-select>
<div
class=
"filter-tree-action"
>
<i-button
title=
"添加条件"
@
click=
"onAddItem(data)"
><i
class=
"fa fa-plus"
aria-hidden=
"true"
></i>
添加条件
</i-button>
<i-button
title=
"添加组"
@
click=
"onAddGroup(data)"
><i
class=
"fa fa-plus"
aria-hidden=
"true"
></i>
添加组
</i-button>
<i-button
:title=
"$t('components.filterTree.title1')"
@
click=
"onAddItem(data)"
><i
class=
"fa fa-plus"
aria-hidden=
"true"
></i>
{{
$t
(
'components.filterTree.title1'
)
}}
</i-button>
<i-button
:title=
"$t('components.filterTree.title2')"
@
click=
"onAddGroup(data)"
><i
class=
"fa fa-plus"
aria-hidden=
"true"
></i>
{{
$t
(
'components.filterTree.title2'
)
}}
</i-button>
<icon
v-if=
"!data.isroot"
type=
"md-close"
@
click=
"onRemoveItem(node, data)"
/>
</div>
</div>
</
template
>
<
template
v-else
>
<div
class=
"filter-tree-item"
>
<el-select
size=
"small"
class=
"filter-item-field"
v-model=
"data.field"
clearable
placeholder=
"属性"
@
change=
"onFieldChange(data
)"
>
<el-select
size=
"small"
class=
"filter-item-field"
v-model=
"data.field"
clearable
:placeholder=
"$t('components.filterTree.placeholder'
)"
>
<el-option
v-for=
"item in fields"
:key=
"item.
prop
"
v-for=
"item in field
Item
s"
:key=
"item.
value
"
:label=
"item.label"
:value=
"item.
nam
e"
>
:value=
"item.
valu
e"
>
</el-option>
</el-select>
<filter-mode
class=
"filter-item-mode"
v-model=
"data.mode"
></filter-mode>
<filter-mode
class=
"filter-item-mode"
v-model=
"data.mode"
:modes=
"getModes(data.field)"
@
on-change=
"onModeChange($event, data)"
></filter-mode>
<div
class=
"filter-item-value"
>
<i-input
v-if=
"!data.
field
"
></i-input>
<i-input
v-if=
"!data.
editor
"
></i-input>
<slot
v-else
:data=
"data"
></slot>
</div>
<div
class=
"filter-tree-action"
>
...
...
@@ -64,6 +64,14 @@ export default class FilterTree extends Vue {
*/
@
Prop
()
fields
:
any
;
/**
* 属性项集合
*
* @type {*}
* @memberof FilterTree
*/
protected
fieldItems
:
any
[]
=
[];
/**
* 组条件集合
*
...
...
@@ -89,34 +97,81 @@ export default class FilterTree extends Vue {
};
if
(
this
.
datas
.
length
==
0
)
{
this
.
onAddItem
(
root
);
this
.
onAddItem
(
root
);
}
return
[
root
];
}
/**
*
获取语言文本
*
生命周期
*
* @return {
string
}
* @return {
void
}
* @memberof FilterTree
*/
getLabel
(
mode
:
any
):
string
{
if
(
this
.
$i18n
.
locale
)
{
return
mode
[
this
.
$i18n
.
locale
]
;
public
created
()
{
if
(
!
this
.
fields
)
{
return
;
}
return
mode
[
'zh-CN'
];
this
.
fields
.
forEach
((
field
:
any
)
=>
{
let
index
:
number
=
this
.
fieldItems
.
findIndex
((
item
:
any
)
=>
Object
.
is
(
item
.
value
,
field
.
prop
));
if
(
index
<
0
)
{
this
.
fieldItems
.
push
({
label
:
field
.
label
,
value
:
field
.
prop
,
modes
:
this
.
getFieldModes
(
field
.
prop
)
})
}
});
}
/**
*
属性变化
*
获取逻辑模式集合
*
* @return {
*
}
* @return {
void
}
* @memberof FilterTree
*/
public
onFieldChange
(
data
:
any
)
{
if
(
!
data
.
mode
)
{
data
.
mode
=
'$eq'
;
public
getModes
(
field
:
string
)
{
if
(
this
.
fieldItems
.
length
>
0
)
{
let
item
:
any
=
this
.
fieldItems
.
find
((
item
:
any
)
=>
Object
.
is
(
item
.
value
,
field
));
if
(
item
)
{
return
item
.
modes
;
}
}
return
[];
}
/**
* 获取属性逻辑模式集合
*
* @return {void}
* @memberof FilterTree
*/
public
getFieldModes
(
name
:
string
)
{
let
modes
:
any
[]
=
[];
for
(
let
i
=
0
;
i
<
this
.
fields
.
length
;
i
++
)
{
let
field
:
any
=
this
.
fields
[
i
];
if
(
!
Object
.
is
(
field
.
prop
,
name
))
{
continue
;
}
modes
.
push
({
name
:
field
.
name
,
mode
:
field
.
mode
?
field
.
mode
:
'all'
})
}
return
modes
;
}
/**
* 获取语言文本
*
* @return {string}
* @memberof FilterTree
*/
getLabel
(
mode
:
any
):
string
{
if
(
this
.
$i18n
.
locale
)
{
return
mode
[
this
.
$i18n
.
locale
];
}
return
mode
[
'zh-CN'
];
}
/**
...
...
@@ -129,7 +184,8 @@ export default class FilterTree extends Vue {
if
(
data
&&
data
.
children
)
{
data
.
children
.
push
({
field
:
null
,
mode
:
null
mode
:
null
,
editor
:
null
});
}
}
...
...
@@ -163,6 +219,18 @@ export default class FilterTree extends Vue {
}
}
}
/**
* 条件逻辑变化
*
* @return {*}
* @memberof FilterTree
*/
public
onModeChange
(
mode
:
any
,
data
:
any
)
{
if
(
mode
&&
data
)
{
data
.
editor
=
mode
.
name
;
}
}
}
</
script
>
...
...
app_CRM/src/mock/entity/quotes/quotes.ts
浏览文件 @
98f5198e
此差异已折叠。
点击以展开。
app_CRM/src/service/quote/quote-service-base.ts
浏览文件 @
98f5198e
...
...
@@ -838,6 +838,36 @@ export default class QuoteServiceBase extends EntityService {
return
Http
.
getInstance
().
get
(
`/quotes/fetchbyparentkey`
,
tempData
,
isloading
);
}
/**
* FetchClosed接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof QuoteServiceBase
*/
public
async
FetchClosed
(
context
:
any
=
{},
data
:
any
=
{},
isloading
?:
boolean
):
Promise
<
any
>
{
if
(
context
.
account
&&
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchclosed`
,
tempData
,
isloading
);
}
if
(
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchclosed`
,
tempData
,
isloading
);
}
if
(
context
.
account
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchclosed`
,
tempData
,
isloading
);
}
if
(
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/opportunities/
${
context
.
opportunity
}
/quotes/fetchclosed`
,
tempData
,
isloading
);
}
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/quotes/fetchclosed`
,
tempData
,
isloading
);
}
/**
* FetchDefault接口方法
*
...
...
@@ -867,4 +897,94 @@ export default class QuoteServiceBase extends EntityService {
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/quotes/fetchdefault`
,
tempData
,
isloading
);
}
/**
* FetchDraft接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof QuoteServiceBase
*/
public
async
FetchDraft
(
context
:
any
=
{},
data
:
any
=
{},
isloading
?:
boolean
):
Promise
<
any
>
{
if
(
context
.
account
&&
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchdraft`
,
tempData
,
isloading
);
}
if
(
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchdraft`
,
tempData
,
isloading
);
}
if
(
context
.
account
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchdraft`
,
tempData
,
isloading
);
}
if
(
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/opportunities/
${
context
.
opportunity
}
/quotes/fetchdraft`
,
tempData
,
isloading
);
}
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/quotes/fetchdraft`
,
tempData
,
isloading
);
}
/**
* FetchEffective接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof QuoteServiceBase
*/
public
async
FetchEffective
(
context
:
any
=
{},
data
:
any
=
{},
isloading
?:
boolean
):
Promise
<
any
>
{
if
(
context
.
account
&&
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetcheffective`
,
tempData
,
isloading
);
}
if
(
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetcheffective`
,
tempData
,
isloading
);
}
if
(
context
.
account
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetcheffective`
,
tempData
,
isloading
);
}
if
(
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/opportunities/
${
context
.
opportunity
}
/quotes/fetcheffective`
,
tempData
,
isloading
);
}
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/quotes/fetcheffective`
,
tempData
,
isloading
);
}
/**
* FetchWin接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof QuoteServiceBase
*/
public
async
FetchWin
(
context
:
any
=
{},
data
:
any
=
{},
isloading
?:
boolean
):
Promise
<
any
>
{
if
(
context
.
account
&&
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchwin`
,
tempData
,
isloading
);
}
if
(
context
.
contact
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/contacts/
${
context
.
contact
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchwin`
,
tempData
,
isloading
);
}
if
(
context
.
account
&&
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/accounts/
${
context
.
account
}
/opportunities/
${
context
.
opportunity
}
/quotes/fetchwin`
,
tempData
,
isloading
);
}
if
(
context
.
opportunity
&&
true
){
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/opportunities/
${
context
.
opportunity
}
/quotes/fetchwin`
,
tempData
,
isloading
);
}
let
tempData
:
any
=
JSON
.
parse
(
JSON
.
stringify
(
data
));
return
Http
.
getInstance
().
get
(
`/quotes/fetchwin`
,
tempData
,
isloading
);
}
}
\ No newline at end of file
app_CRM/src/widgets/account/info-all-form/info-all-form-base.tsx
浏览文件 @
98f5198e
...
...
@@ -213,7 +213,7 @@ export class Info_AllEditFormBase extends EditFormControlBase {
'sic'
,
'tickersymbol'
,
'ownershipcode'
,
]
]
,
,
uiActionGroup
:
{
caption
:
'编辑_账户信息'
,
langbase
:
'entities.account.info_all_form'
,
extractMode
:
'ITEM'
,
details
:
[{
name
:
'group1_uc040f39'
,
caption
:
'编辑'
,
uiactiontag
:
'account_edit_accountinfo'
,
icon
:
'fa fa-pencil'
,
isShowCaption
:
false
,
isShowIcon
:
true
}]
}
}),
grouppanel1
:
new
FormGroupPanelModel
({
caption
:
'地址信息'
,
detailType
:
'GROUPPANEL'
,
name
:
'grouppanel1'
,
visible
:
true
,
isShowCaption
:
true
,
form
:
this
,
showMoreMode
:
0
,
uiActionGroup
:
{
caption
:
'编辑_地址信息'
,
langbase
:
'entities.account.info_all_form'
,
extractMode
:
'ITEM'
,
details
:
[{
name
:
'grouppanel1_u2ccbfc9'
,
caption
:
'编辑'
,
uiactiontag
:
'account_edit_address'
,
icon
:
'fa fa-pencil'
,
isShowCaption
:
false
,
isShowIcon
:
true
}]
}
}),
...
...
businesscentral-core/src/main/java/cn/ibizlab/businesscentral/core/sales/mapper/QuoteMapper.java
浏览文件 @
98f5198e
...
...
@@ -20,7 +20,11 @@ import com.alibaba.fastjson.JSONObject;
public
interface
QuoteMapper
extends
BaseMapper
<
Quote
>{
Page
<
Quote
>
searchByParentKey
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
Page
<
Quote
>
searchClosed
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
Page
<
Quote
>
searchDefault
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
Page
<
Quote
>
searchDraft
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
Page
<
Quote
>
searchEffective
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
Page
<
Quote
>
searchWin
(
IPage
page
,
@Param
(
"srf"
)
QuoteSearchContext
context
,
@Param
(
"ew"
)
Wrapper
<
Quote
>
wrapper
)
;
@Override
Quote
selectById
(
Serializable
id
);
@Override
...
...
businesscentral-core/src/main/java/cn/ibizlab/businesscentral/core/sales/service/IQuoteService.java
浏览文件 @
98f5198e
...
...
@@ -41,7 +41,11 @@ public interface IQuoteService extends IService<Quote>{
void
saveBatch
(
List
<
Quote
>
list
)
;
Quote
win
(
Quote
et
)
;
Page
<
Quote
>
searchByParentKey
(
QuoteSearchContext
context
)
;
Page
<
Quote
>
searchClosed
(
QuoteSearchContext
context
)
;
Page
<
Quote
>
searchDefault
(
QuoteSearchContext
context
)
;
Page
<
Quote
>
searchDraft
(
QuoteSearchContext
context
)
;
Page
<
Quote
>
searchEffective
(
QuoteSearchContext
context
)
;
Page
<
Quote
>
searchWin
(
QuoteSearchContext
context
)
;
List
<
Quote
>
selectByCampaignid
(
String
campaignid
)
;
void
removeByCampaignid
(
String
campaignid
)
;
List
<
Quote
>
selectByOpportunityid
(
String
opportunityid
)
;
...
...
businesscentral-core/src/main/java/cn/ibizlab/businesscentral/core/sales/service/impl/QuoteServiceImpl.java
浏览文件 @
98f5198e
...
...
@@ -272,6 +272,15 @@ public class QuoteServiceImpl extends ServiceImpl<QuoteMapper, Quote> implements
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
* 查询集合 已关闭
*/
@Override
public
Page
<
Quote
>
searchClosed
(
QuoteSearchContext
context
)
{
com
.
baomidou
.
mybatisplus
.
extension
.
plugins
.
pagination
.
Page
<
Quote
>
pages
=
baseMapper
.
searchClosed
(
context
.
getPages
(),
context
,
context
.
getSelectCond
());
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
* 查询集合 DEFAULT
*/
...
...
@@ -281,6 +290,33 @@ public class QuoteServiceImpl extends ServiceImpl<QuoteMapper, Quote> implements
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
* 查询集合 草稿
*/
@Override
public
Page
<
Quote
>
searchDraft
(
QuoteSearchContext
context
)
{
com
.
baomidou
.
mybatisplus
.
extension
.
plugins
.
pagination
.
Page
<
Quote
>
pages
=
baseMapper
.
searchDraft
(
context
.
getPages
(),
context
,
context
.
getSelectCond
());
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
* 查询集合 有效报价单
*/
@Override
public
Page
<
Quote
>
searchEffective
(
QuoteSearchContext
context
)
{
com
.
baomidou
.
mybatisplus
.
extension
.
plugins
.
pagination
.
Page
<
Quote
>
pages
=
baseMapper
.
searchEffective
(
context
.
getPages
(),
context
,
context
.
getSelectCond
());
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
* 查询集合 赢单
*/
@Override
public
Page
<
Quote
>
searchWin
(
QuoteSearchContext
context
)
{
com
.
baomidou
.
mybatisplus
.
extension
.
plugins
.
pagination
.
Page
<
Quote
>
pages
=
baseMapper
.
searchWin
(
context
.
getPages
(),
context
,
context
.
getSelectCond
());
return
new
PageImpl
<
Quote
>(
pages
.
getRecords
(),
context
.
getPageable
(),
pages
.
getTotal
());
}
/**
...
...
businesscentral-core/src/main/resources/mapper/sales/quote/QuoteMapper.xml
浏览文件 @
98f5198e
...
...
@@ -109,6 +109,15 @@
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据集合[Closed]-->
<select
id=
"searchClosed"
parameterType=
"cn.ibizlab.businesscentral.core.sales.filter.QuoteSearchContext"
resultMap=
"QuoteResultMap"
>
select t1.* from (
<include
refid=
"Closed"
/>
)t1
<where><if
test=
"ew!=null and ew.sqlSegment!=null and !ew.emptyOfWhere"
>
${ew.sqlSegment}
</if></where>
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据集合[Default]-->
<select
id=
"searchDefault"
parameterType=
"cn.ibizlab.businesscentral.core.sales.filter.QuoteSearchContext"
resultMap=
"QuoteResultMap"
>
select t1.* from (
...
...
@@ -118,6 +127,33 @@
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据集合[Draft]-->
<select
id=
"searchDraft"
parameterType=
"cn.ibizlab.businesscentral.core.sales.filter.QuoteSearchContext"
resultMap=
"QuoteResultMap"
>
select t1.* from (
<include
refid=
"Draft"
/>
)t1
<where><if
test=
"ew!=null and ew.sqlSegment!=null and !ew.emptyOfWhere"
>
${ew.sqlSegment}
</if></where>
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据集合[Effective]-->
<select
id=
"searchEffective"
parameterType=
"cn.ibizlab.businesscentral.core.sales.filter.QuoteSearchContext"
resultMap=
"QuoteResultMap"
>
select t1.* from (
<include
refid=
"Effective"
/>
)t1
<where><if
test=
"ew!=null and ew.sqlSegment!=null and !ew.emptyOfWhere"
>
${ew.sqlSegment}
</if></where>
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据集合[Win]-->
<select
id=
"searchWin"
parameterType=
"cn.ibizlab.businesscentral.core.sales.filter.QuoteSearchContext"
resultMap=
"QuoteResultMap"
>
select t1.* from (
<include
refid=
"Win"
/>
)t1
<where><if
test=
"ew!=null and ew.sqlSegment!=null and !ew.emptyOfWhere"
>
${ew.sqlSegment}
</if></where>
<if
test=
"ew!=null and ew.sqlSegment!=null and ew.emptyOfWhere"
>
${ew.sqlSegment}
</if>
</select>
<!--数据查询[ByParentKey]-->
<sql
id=
"ByParentKey"
databaseId=
"mysql"
>
<![CDATA[ SELECT t1.`ACCOUNTIDYOMINAME`, t1.`BILLTO_ADDRESSID`, t1.`BILLTO_CITY`, t1.`BILLTO_COMPOSITE`, t1.`BILLTO_CONTACTNAME`, t1.`BILLTO_COUNTRY`, t1.`BILLTO_FAX`, t1.`BILLTO_LINE1`, t1.`BILLTO_LINE2`, t1.`BILLTO_LINE3`, t1.`BILLTO_NAME`, t1.`BILLTO_POSTALCODE`, t1.`BILLTO_STATEORPROVINCE`, t1.`BILLTO_TELEPHONE`, t1.`CAMPAIGNID`, t1.`CAMPAIGNNAME`, t1.`CLOSEDON`, t1.`CONTACTIDYOMINAME`, t1.`CREATEDATE`, t1.`CREATEMAN`, t1.`CUSTOMERID`, t1.`CUSTOMERIDTYPE`, t1.`CUSTOMERIDYOMINAME`, t1.`DESCRIPTION`, t1.`DISCOUNTAMOUNT`, t1.`DISCOUNTAMOUNT_BASE`, t1.`DISCOUNTPERCENTAGE`, t1.`EFFECTIVEFROM`, t1.`EFFECTIVETO`, t1.`EMAILADDRESS`, t1.`EXCHANGERATE`, t1.`EXPIRESON`, t1.`FREIGHTAMOUNT`, t1.`FREIGHTAMOUNT_BASE`, t1.`FREIGHTTERMSCODE`, t1.`IMPORTSEQUENCENUMBER`, t1.`LASTONHOLDTIME`, t1.`ONHOLDTIME`, t1.`OPPORTUNITYID`, t1.`OPPORTUNITYNAME`, t1.`OVERRIDDENCREATEDON`, t1.`OWNERID`, t1.`OWNERIDTYPE`, t1.`OWNERIDYOMINAME`, t1.`PAYMENTTERMSCODE`, t1.`PRICELEVELID`, t1.`PRICELEVELNAME`, t1.`PRICINGERRORCODE`, t1.`PROCESSID`, t1.`QUOTEID`, t1.`QUOTENAME`, t1.`QUOTENUMBER`, t1.`REQUESTDELIVERYBY`, t1.`REVISIONNUMBER`, t1.`SHIPPINGMETHODCODE`, t1.`SHIPTO_ADDRESSID`, t1.`SHIPTO_CITY`, t1.`SHIPTO_COMPOSITE`, t1.`SHIPTO_CONTACTNAME`, t1.`SHIPTO_COUNTRY`, t1.`SHIPTO_FAX`, t1.`SHIPTO_FREIGHTTERMSCODE`, t1.`SHIPTO_LINE1`, t1.`SHIPTO_LINE2`, t1.`SHIPTO_LINE3`, t1.`SHIPTO_NAME`, t1.`SHIPTO_POSTALCODE`, t1.`SHIPTO_STATEORPROVINCE`, t1.`SHIPTO_TELEPHONE`, t1.`SLAID`, t1.`SLANAME`, t1.`STAGEID`, t1.`STATECODE`, t1.`STATUSCODE`, t1.`TIMEZONERULEVERSIONNUMBER`, t1.`TOTALAMOUNT`, t1.`TOTALAMOUNTLESSFREIGHT`, t1.`TOTALAMOUNTLESSFREIGHT_BASE`, t1.`TOTALAMOUNT_BASE`, t1.`TOTALDISCOUNTAMOUNT`, t1.`TOTALDISCOUNTAMOUNT_BASE`, t1.`TOTALLINEITEMAMOUNT`, t1.`TOTALLINEITEMAMOUNT_BASE`, t1.`TOTALLINEITEMDISCOUNTAMOUNT`, t1.`TOTALTAX`, t1.`TOTALTAX_BASE`, t1.`TRANSACTIONCURRENCYID`, t1.`TRANSACTIONCURRENCYNAME`, t1.`TRAVERSEDPATH`, t1.`UNIQUEDSCID`, t1.`UPDATEDATE`, t1.`UPDATEMAN`, t1.`UTCCONVERSIONTIMEZONECODE`, t1.`VERSIONNUMBER`, t1.`WILLCALL` FROM `QUOTE` t1
...
...
businesscentral-core/src/main/resources/permission/systemResource.json
浏览文件 @
98f5198e
...
...
@@ -319,7 +319,7 @@
"dename"
:
"Quote"
,
"delogicname"
:
"报价单"
,
"sysmoudle"
:{
"id"
:
"SALES"
,
"name"
:
"Sales"
},
"dedataset"
:[{
"id"
:
"ByParentKey"
,
"name"
:
"ByParentKey"
},{
"id"
:
"
Default"
,
"name"
:
"DEFAULT
"
}],
"dedataset"
:[{
"id"
:
"ByParentKey"
,
"name"
:
"ByParentKey"
},{
"id"
:
"
Closed"
,
"name"
:
"已关闭"
},{
"id"
:
"Default"
,
"name"
:
"DEFAULT"
},{
"id"
:
"Draft"
,
"name"
:
"草稿"
},{
"id"
:
"Effective"
,
"name"
:
"有效报价单"
},{
"id"
:
"Win"
,
"name"
:
"赢单
"
}],
"deaction"
:[{
"id"
:
"Create"
,
"name"
:
"Create"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Update"
,
"name"
:
"Update"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Remove"
,
"name"
:
"Remove"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Get"
,
"name"
:
"Get"
,
"type"
:
"BUILTIN"
},{
"id"
:
"GetDraft"
,
"name"
:
"GetDraft"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Active"
,
"name"
:
"激活报价单"
,
"type"
:
"DELOGIC"
},{
"id"
:
"CheckKey"
,
"name"
:
"CheckKey"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Close"
,
"name"
:
"结束报价单"
,
"type"
:
"DELOGIC"
},{
"id"
:
"GenSalesOrder"
,
"name"
:
"创建订单"
,
"type"
:
"USERCUSTOM"
},{
"id"
:
"Save"
,
"name"
:
"Save"
,
"type"
:
"BUILTIN"
},{
"id"
:
"Win"
,
"name"
:
"赢单"
,
"type"
:
"DELOGIC"
}],
"datascope"
:[{
"id"
:
"all"
,
"name"
:
"全部数据"
},
{
"id"
:
"createman"
,
"name"
:
"创建人"
}]
}
...
...
businesscentral-provider/businesscentral-provider-centralapi/src/main/java/cn/ibizlab/businesscentral/centralapi/rest/QuoteResource.java
浏览文件 @
98f5198e
此差异已折叠。
点击以展开。
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录