提交 ed6d8ab4 编写于 作者: ibizdev's avatar ibizdev

xignzi006 发布系统代码

上级 cf99b134
......@@ -52,8 +52,21 @@ export class QuickSummaryEngine extends ViewEngine {
}
if (opt.quicksummary) {
this.quickSummary = opt.quicksummary;
console.log(this.quickSummary, this.quickSummary.controlType);
}
console.log(this.context);
}
/**
* 向快捷信息栏部件填充数据
*
* @memberof QuickSummaryEngine
*/
public setData(): void {
const data = this.view.$appService.contextStore.getContextData(this.context, this.view.appDeName);
if (this.quickSummary && Object.is(this.quickSummary.controlType, 'FORM')) {
if (data && data.data) {
this.quickSummary.fillForm(data.data);
}
}
}
}
\ No newline at end of file
......@@ -119,6 +119,8 @@ export default {
menuitem3: "设置",
menuitem4: "注销",
top_menus: "顶部菜单",
menuitem34: "消息通知",
menuitem35: "帮助",
left_exp: "左侧菜单",
menuitem17: "主页",
menuitem18: "最近",
......
......@@ -119,6 +119,8 @@ export default {
menuitem3: "设置",
menuitem4: "注销",
top_menus: "顶部菜单",
menuitem34: "消息通知",
menuitem35: "帮助",
left_exp: "左侧菜单",
menuitem17: "主页",
menuitem18: "最近",
......
......@@ -83,6 +83,44 @@ mock.onGet('v7/centralappmenu').reply((config: any) => {
textcls: '',
appfunctag: '',
resourcetag: '',
items: [
{
id: '5EC4881D-09C3-4536-A609-333F7A6A6012',
name: 'menuitem34',
text: '消息通知',
type: 'MENUITEM',
counterid: '',
tooltip: '消息通知',
expanded: false,
separator: false,
hidden: false,
hidesidebar: false,
opendefault: false,
iconcls: 'fa fa-bell-o',
icon: '',
textcls: '',
appfunctag: '',
resourcetag: '',
},
{
id: 'CC6EF1FE-F3A2-45A0-8572-BF6ACF6CA6D1',
name: 'menuitem35',
text: '帮助',
type: 'MENUITEM',
counterid: '',
tooltip: '帮助',
expanded: false,
separator: false,
hidden: false,
hidesidebar: false,
opendefault: false,
iconcls: 'sx-tb-help',
icon: '../sasrfex/images/default/icon_help16.png',
textcls: '',
appfunctag: '',
resourcetag: '',
},
],
},
{
id: '4aea3655e93af303beba942116b04a31',
......
import { Subject } from 'rxjs';
import { TabExpViewBase } from '@/studio-core';
import AccountService from '@/service/account/account-service';
import EditViewEngine from '@engine/view/edit-view-engine';
import TabExpViewEngine from '@engine/view/tab-exp-view-engine';
import AccountUIService from '@/uiservice/account/account-ui-service';
......@@ -108,6 +109,15 @@ export class AccountInfoBase extends TabExpViewBase {
protected viewtag: string = '2e9c7792c3a728896ca8902634f71983';
/**
* 视图引擎
*
* @public
* @type {Engine}
* @memberof AccountInfoBase
*/
public quicksummary: EditViewEngine = new EditViewEngine();
/**
* 视图引擎
*
......@@ -124,6 +134,14 @@ export class AccountInfoBase extends TabExpViewBase {
* @memberof AccountInfoBase
*/
public engineInit(): void {
this.quicksummary.init({
view: this,
form: this.$refs.quicksummary,
p2k: '',
keyPSDEField: 'account',
majorPSDEField: 'accountname',
isLoadDefault: true,
});
this.engine.init({
view: this,
keyPSDEField: 'account',
......@@ -163,6 +181,39 @@ export class AccountInfoBase extends TabExpViewBase {
}
}
/**
* quicksummary 部件 save 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof AccountInfoBase
*/
public quicksummary_save($event: any, $event2?: any): void {
this.quicksummary.onCtrlEvent('quicksummary', 'save', $event);
}
/**
* quicksummary 部件 remove 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof AccountInfoBase
*/
public quicksummary_remove($event: any, $event2?: any): void {
this.quicksummary.onCtrlEvent('quicksummary', 'remove', $event);
}
/**
* quicksummary 部件 load 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof AccountInfoBase
*/
public quicksummary_load($event: any, $event2?: any): void {
this.quicksummary.onCtrlEvent('quicksummary', 'load', $event);
}
/**
* 逻辑事件
*
......@@ -465,9 +516,13 @@ export class AccountInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.accountname) {
Object.assign(this.model, { dataInfo: _data.accountname });
const { data } = response;
if (data) {
this.$appService.contextStore.setContextData(this.context, this.appDeName, { data });
this.quickSummaryEngine.setData();
}
if (data.accountname) {
Object.assign(this.model, { dataInfo: data.accountname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -2,6 +2,30 @@
<template slot='title'>
<span class='caption-info'>{{$t(model.srfTitle)}}</span>
</template>
<template slot="quickSummary">
<view_quicksummary
:viewState="viewState"
:viewparams="viewparams"
:context="context"
:autosave="false"
:viewtag="viewtag"
:showBusyIndicator="true"
updateAction="Update"
removeAction="Remove"
loaddraftAction="GetDraft"
loadAction="Get"
createAction="Create"
WFSubmitAction=""
WFStartAction=""
style='width: 300px'
name="quicksummary"
ref='quicksummary'
@save="quicksummary_save($event)"
@remove="quicksummary_remove($event)"
@load="quicksummary_load($event)"
@closeview="closeView($event)">
</view_quicksummary>
</template>
<template slot="toolbar">
<view-toolbar mode="STYLE2" :model="toolBarModels" @item-click="toolbar_click($event)"/> </template>
<view_tabexppanel
......
......@@ -113,9 +113,9 @@ export class AccountStatusTabViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.accountname) {
Object.assign(this.model, { dataInfo: _data.accountname });
const { data } = response;
if (data.accountname) {
Object.assign(this.model, { dataInfo: data.accountname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -464,9 +464,9 @@ export class ContactInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.fullname) {
Object.assign(this.model, { dataInfo: _data.fullname });
const { data } = response;
if (data.fullname) {
Object.assign(this.model, { dataInfo: data.fullname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class ContactTabExpViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.fullname) {
Object.assign(this.model, { dataInfo: _data.fullname });
const { data } = response;
if (data.fullname) {
Object.assign(this.model, { dataInfo: data.fullname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -464,9 +464,9 @@ export class InvoiceInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.invoicename) {
Object.assign(this.model, { dataInfo: _data.invoicename });
const { data } = response;
if (data.invoicename) {
Object.assign(this.model, { dataInfo: data.invoicename });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -361,9 +361,9 @@ export class CampaignInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.campaignname) {
Object.assign(this.model, { dataInfo: _data.campaignname });
const { data } = response;
if (data.campaignname) {
Object.assign(this.model, { dataInfo: data.campaignname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class IBizListInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.listname) {
Object.assign(this.model, { dataInfo: _data.listname });
const { data } = response;
if (data.listname) {
Object.assign(this.model, { dataInfo: data.listname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -361,9 +361,9 @@ export class ProductInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.productname) {
Object.assign(this.model, { dataInfo: _data.productname });
const { data } = response;
if (data.productname) {
Object.assign(this.model, { dataInfo: data.productname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -361,9 +361,9 @@ export class CompetitorInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.competitorname) {
Object.assign(this.model, { dataInfo: _data.competitorname });
const { data } = response;
if (data.competitorname) {
Object.assign(this.model, { dataInfo: data.competitorname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class GoalInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.title) {
Object.assign(this.model, { dataInfo: _data.title });
const { data } = response;
if (data.title) {
Object.assign(this.model, { dataInfo: data.title });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class GoalStateTabViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.title) {
Object.assign(this.model, { dataInfo: _data.title });
const { data } = response;
if (data.title) {
Object.assign(this.model, { dataInfo: data.title });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -498,9 +498,9 @@ export class LeadInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.fullname) {
Object.assign(this.model, { dataInfo: _data.fullname });
const { data } = response;
if (data.fullname) {
Object.assign(this.model, { dataInfo: data.fullname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class LeadStatusTabViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.fullname) {
Object.assign(this.model, { dataInfo: _data.fullname });
const { data } = response;
if (data.fullname) {
Object.assign(this.model, { dataInfo: data.fullname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -498,9 +498,9 @@ export class OpportunityInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.opportunityname) {
Object.assign(this.model, { dataInfo: _data.opportunityname });
const { data } = response;
if (data.opportunityname) {
Object.assign(this.model, { dataInfo: data.opportunityname });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -464,9 +464,9 @@ export class QuoteInfoBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.quotename) {
Object.assign(this.model, { dataInfo: _data.quotename });
const { data } = response;
if (data.quotename) {
Object.assign(this.model, { dataInfo: data.quotename });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -361,9 +361,9 @@ export class SalesLiteratureInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.salesliteraturename) {
Object.assign(this.model, { dataInfo: _data.salesliteraturename });
const { data } = response;
if (data.salesliteraturename) {
Object.assign(this.model, { dataInfo: data.salesliteraturename });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -464,9 +464,9 @@ export class SalesOrderInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.salesordername) {
Object.assign(this.model, { dataInfo: _data.salesordername });
const { data } = response;
if (data.salesordername) {
Object.assign(this.model, { dataInfo: data.salesordername });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -113,9 +113,9 @@ export class IncidentInfoViewBase extends TabExpViewBase {
if (!response || response.status !== 200) {
return;
}
const { data: _data } = response;
if (_data.title) {
Object.assign(this.model, { dataInfo: _data.title });
const { data } = response;
if (data.title) {
Object.assign(this.model, { dataInfo: data.title });
if(this.$route){
this.$route.meta.info = this.model.dataInfo;
}
......
......@@ -358,7 +358,7 @@ export default class GradationService extends ControlService {
strNodeId += this.TREENODE_SEPARATOR;
strNodeId += strId;
Object.assign(treeNode, { id: strNodeId + '_#_' + filter.srfnodeid });
Object.assign(treeNode, { collapsed: true });
Object.assign(treeNode, { collapsed: false });
Object.assign(treeNode, { leaf: true });
let objLeafFlag = entity.childaccountcount;
if (objLeafFlag != null ) {
......@@ -536,7 +536,7 @@ export default class GradationService extends ControlService {
strNodeId += this.TREENODE_SEPARATOR;
strNodeId += strId;
Object.assign(treeNode, { id: strNodeId + '_#_' + filter.srfnodeid });
Object.assign(treeNode, { collapsed: true });
Object.assign(treeNode, { collapsed: false });
Object.assign(treeNode, { leaf: true });
let objLeafFlag = entity.childaccountcount;
if (objLeafFlag != null ) {
......
......@@ -90,6 +90,46 @@ export default class CentralModel {
textcls: '',
appfunctag: '',
resourcetag: '',
items: [
{
id: '5EC4881D-09C3-4536-A609-333F7A6A6012',
name: 'menuitem34',
text: '消息通知',
type: 'MENUITEM',
counterid: '',
tooltip: '消息通知',
expanded: false,
separator: false,
hidden: false,
hidesidebar: false,
opendefault: false,
iconcls: 'fa fa-bell-o',
icon: '',
textcls: '',
appfunctag: '',
resourcetag: '',
}
,
{
id: 'CC6EF1FE-F3A2-45A0-8572-BF6ACF6CA6D1',
name: 'menuitem35',
text: '帮助',
type: 'MENUITEM',
counterid: '',
tooltip: '帮助',
expanded: false,
separator: false,
hidden: false,
hidesidebar: false,
opendefault: false,
iconcls: 'sx-tb-help',
icon: '../sasrfex/images/default/icon_help16.png',
textcls: '',
appfunctag: '',
resourcetag: '',
}
,
],
}
,
{
......
......@@ -4,7 +4,7 @@
<!--输出实体[ACCOUNT]数据结构 -->
<changeSet author="a_LAB01_e85d8801c" id="tab-account-510-1">
<changeSet author="a_LAB01_e85d8801c" id="tab-account-516-1">
<createTable tableName="ACCOUNT">
<column name="ADDRESS1_PRIMARYCONTACTNAME" remarks="" type="VARCHAR(100)">
</column>
......@@ -10978,31 +10978,31 @@
</changeSet>
<!--输出实体[ACCOUNT]外键关系 -->
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-132">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-132">
<addForeignKeyConstraint baseColumnNames="PARENTACCOUNTID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__ACCOUNT__PARENT" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="ACCOUNTID" referencedTableName="ACCOUNT" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-133">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-133">
<addForeignKeyConstraint baseColumnNames="PRIMARYCONTACTID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__CONTACT__PRIMAR" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="CONTACTID" referencedTableName="CONTACT" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-134">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-134">
<addForeignKeyConstraint baseColumnNames="PREFERREDEQUIPMENTID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__EQUIPMENT__PREF" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="EQUIPMENTID" referencedTableName="EQUIPMENT" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-135">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-135">
<addForeignKeyConstraint baseColumnNames="ORIGINATINGLEADID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__LEAD__ORIGINATI" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="LEADID" referencedTableName="LEAD" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-136">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-136">
<addForeignKeyConstraint baseColumnNames="DEFAULTPRICELEVELID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__PRICELEVEL__DEF" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="PRICELEVELID" referencedTableName="PRICELEVEL" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-137">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-137">
<addForeignKeyConstraint baseColumnNames="PREFERREDSERVICEID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__SERVICE__PREFER" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="SERVICEID" referencedTableName="SERVICE" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-138">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-138">
<addForeignKeyConstraint baseColumnNames="SLAID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__SLA__SLAID" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="SLAID" referencedTableName="SLA" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-139">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-139">
<addForeignKeyConstraint baseColumnNames="TERRITORYID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__TERRITORY__TERR" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="TERRITORYID" referencedTableName="TERRITORY" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-account-510-140">
<changeSet author="a_LAB01_e85d8801c" id="fk-account-516-140">
<addForeignKeyConstraint baseColumnNames="TRANSACTIONCURRENCYID" baseTableName="ACCOUNT" constraintName="DER1N_ACCOUNT__TRANSACTIONCURR" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="TRANSACTIONCURRENCYID" referencedTableName="TRANSACTIONCURRENCY" validate="true"/>
</changeSet>
<!--输出实体[ACTIVITYMIMEATTACHMENT]外键关系 -->
......
......@@ -457,7 +457,7 @@
{
"appid":"CRM",
"appname":"客户管理",
"appmenu":[{"menuid":"Central", "menuname":"Central", "menuitem":[{ "id":"user_menus" , "name":"用户菜单" , "items":[{ "id":"menuitem3" , "name":"设置" },{ "id":"menuitem4" , "name":"注销" }]},{ "id":"top_menus" , "name":"顶部菜单" },{ "id":"left_exp" , "name":"左侧菜单" , "items":[{ "id":"menuitem17" , "name":"主页" },{ "id":"menuitem18" , "name":"最近" },{ "id":"menuitem19" , "name":"固定" },{ "id":"menuitem16" , "name":"我的工作" , "items":[{ "id":"menuitem1" , "name":"仪表盘" },{ "id":"menuitem2" , "name":"活动" }]},{ "id":"menuitem20" , "name":"客户" , "items":[{ "id":"menuitem5" , "name":"客户" },{ "id":"menuitem7" , "name":"联系人" }]},{ "id":"menuitem21" , "name":"销售" , "items":[{ "id":"menuitem8" , "name":"潜在客户" },{ "id":"menuitem9" , "name":"商机" },{ "id":"menuitem10" , "name":"竞争对手" }]},{ "id":"menuitem22" , "name":"宣传资料" , "items":[{ "id":"menuitem11" , "name":"报价单" },{ "id":"menuitem12" , "name":"订单" },{ "id":"menuitem13" , "name":"发票" },{ "id":"menuitem6" , "name":"产品" },{ "id":"menuitem14" , "name":"销售宣传资料" }]},{ "id":"menuitem23" , "name":"市场营销" , "items":[{ "id":"menuitem30" , "name":"市场活动" },{ "id":"menuitem15" , "name":"市场营销列表" },{ "id":"menuitem29" , "name":"快速市场活动" }]},{ "id":"menuitem24" , "name":"绩效" , "items":[{ "id":"menuitem25" , "name":"目标" },{ "id":"menuitem31" , "name":"目标度量" },{ "id":"menuitem26" , "name":"预测" },{ "id":"menuitem33" , "name":"目标分页" }]},{ "id":"menuitem27" , "name":"服务" , "items":[{ "id":"menuitem28" , "name":"服务案例" },{ "id":"menuitem32" , "name":"知识文章" }]}]},{ "id":"bottom_exp" , "name":"底部内容" },{ "id":"footer_left" , "name":"底部左侧" },{ "id":"footer_center" , "name":"底部中间" },{ "id":"footer_right" , "name":"底部右侧" }] }]
"appmenu":[{"menuid":"Central", "menuname":"Central", "menuitem":[{ "id":"user_menus" , "name":"用户菜单" , "items":[{ "id":"menuitem3" , "name":"设置" },{ "id":"menuitem4" , "name":"注销" }]},{ "id":"top_menus" , "name":"顶部菜单" , "items":[{ "id":"menuitem34" , "name":"消息通知" },{ "id":"menuitem35" , "name":"帮助" }]},{ "id":"left_exp" , "name":"左侧菜单" , "items":[{ "id":"menuitem17" , "name":"主页" },{ "id":"menuitem18" , "name":"最近" },{ "id":"menuitem19" , "name":"固定" },{ "id":"menuitem16" , "name":"我的工作" , "items":[{ "id":"menuitem1" , "name":"仪表盘" },{ "id":"menuitem2" , "name":"活动" }]},{ "id":"menuitem20" , "name":"客户" , "items":[{ "id":"menuitem5" , "name":"客户" },{ "id":"menuitem7" , "name":"联系人" }]},{ "id":"menuitem21" , "name":"销售" , "items":[{ "id":"menuitem8" , "name":"潜在客户" },{ "id":"menuitem9" , "name":"商机" },{ "id":"menuitem10" , "name":"竞争对手" }]},{ "id":"menuitem22" , "name":"宣传资料" , "items":[{ "id":"menuitem11" , "name":"报价单" },{ "id":"menuitem12" , "name":"订单" },{ "id":"menuitem13" , "name":"发票" },{ "id":"menuitem6" , "name":"产品" },{ "id":"menuitem14" , "name":"销售宣传资料" }]},{ "id":"menuitem23" , "name":"市场营销" , "items":[{ "id":"menuitem30" , "name":"市场活动" },{ "id":"menuitem15" , "name":"市场营销列表" },{ "id":"menuitem29" , "name":"快速市场活动" }]},{ "id":"menuitem24" , "name":"绩效" , "items":[{ "id":"menuitem25" , "name":"目标" },{ "id":"menuitem31" , "name":"目标度量" },{ "id":"menuitem26" , "name":"预测" },{ "id":"menuitem33" , "name":"目标分页" }]},{ "id":"menuitem27" , "name":"服务" , "items":[{ "id":"menuitem28" , "name":"服务案例" },{ "id":"menuitem32" , "name":"知识文章" }]}]},{ "id":"bottom_exp" , "name":"底部内容" },{ "id":"footer_left" , "name":"底部左侧" },{ "id":"footer_center" , "name":"底部中间" },{ "id":"footer_right" , "name":"底部右侧" }] }]
}
,
{
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册