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

lab_gzf 发布系统代码

上级 3552bc38
......@@ -190,11 +190,9 @@ export default {
uiactions: {
},
},
productinfo_form: {
abstractinfo_form: {
details: {
group1: "价目表信息",
druipart1: "",
grouppanel1: "产品明细信息",
group1: "商机基本信息",
formpage1: "基本信息",
srfupdatedate: "更新时间",
srforikey: "",
......@@ -204,15 +202,25 @@ export default {
srfuf: "",
srfdeid: "",
srfsourcekey: "",
pricelevelname: "价目表",
opportunityname: "商机名称",
parentcontactname: "联系人",
parentaccountname: "帐户",
purchasetimeframe: "购买时间范围",
transactioncurrencyname: "货币",
budgetamount: "预算金额",
purchaseprocess: "采购程序",
description: "说明",
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
opportunityid: "商机",
},
uiactions: {
},
},
main_form: {
productinfo_form: {
details: {
group1: "基本信息",
group1: "价目表信息",
druipart1: "",
grouppanel1: "产品明细信息",
formpage1: "基本信息",
......@@ -224,30 +232,17 @@ export default {
srfuf: "",
srfdeid: "",
srfsourcekey: "",
opportunityname: "商机名称",
parentcontactname: "联系人",
parentaccountname: "帐户",
purchasetimeframe: "购买时间范围",
transactioncurrencyname: "货币",
budgetamount: "预算金额",
purchaseprocess: "采购程序",
description: "说明",
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
pricelevelname: "价目表",
parentcontactid: "联系人",
parentaccountid: "帐户",
transactioncurrencyid: "货币",
opportunityid: "商机",
pricelevelid: "价目表",
},
uiactions: {
},
},
abstractinfo_form: {
main_form: {
details: {
group1: "商机基本信息",
group1: "基本信息",
druipart1: "",
grouppanel1: "产品明细信息",
formpage1: "基本信息",
srfupdatedate: "更新时间",
srforikey: "",
......@@ -268,7 +263,12 @@ export default {
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
pricelevelname: "价目表",
parentcontactid: "联系人",
parentaccountid: "帐户",
transactioncurrencyid: "货币",
opportunityid: "商机",
pricelevelid: "价目表",
},
uiactions: {
},
......
......@@ -189,11 +189,9 @@ export default {
uiactions: {
},
},
productinfo_form: {
abstractinfo_form: {
details: {
group1: "价目表信息",
druipart1: "",
grouppanel1: "产品明细信息",
group1: "商机基本信息",
formpage1: "基本信息",
srfupdatedate: "更新时间",
srforikey: "",
......@@ -203,15 +201,25 @@ export default {
srfuf: "",
srfdeid: "",
srfsourcekey: "",
pricelevelname: "价目表",
opportunityname: "商机名称",
parentcontactname: "联系人",
parentaccountname: "帐户",
purchasetimeframe: "购买时间范围",
transactioncurrencyname: "货币",
budgetamount: "预算金额",
purchaseprocess: "采购程序",
description: "说明",
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
opportunityid: "商机",
},
uiactions: {
},
},
main_form: {
productinfo_form: {
details: {
group1: "基本信息",
group1: "价目表信息",
druipart1: "",
grouppanel1: "产品明细信息",
formpage1: "基本信息",
......@@ -223,30 +231,17 @@ export default {
srfuf: "",
srfdeid: "",
srfsourcekey: "",
opportunityname: "商机名称",
parentcontactname: "联系人",
parentaccountname: "帐户",
purchasetimeframe: "购买时间范围",
transactioncurrencyname: "货币",
budgetamount: "预算金额",
purchaseprocess: "采购程序",
description: "说明",
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
pricelevelname: "价目表",
parentcontactid: "联系人",
parentaccountid: "帐户",
transactioncurrencyid: "货币",
opportunityid: "商机",
pricelevelid: "价目表",
},
uiactions: {
},
},
abstractinfo_form: {
main_form: {
details: {
group1: "商机基本信息",
group1: "基本信息",
druipart1: "",
grouppanel1: "产品明细信息",
formpage1: "基本信息",
srfupdatedate: "更新时间",
srforikey: "",
......@@ -267,7 +262,12 @@ export default {
currentsituation: "当前状况",
customerneed: "客户需求",
proposedsolution: "已拟定解决方案",
pricelevelname: "价目表",
parentcontactid: "联系人",
parentaccountid: "帐户",
transactioncurrencyid: "货币",
opportunityid: "商机",
pricelevelid: "价目表",
},
uiactions: {
},
......
import { Subject } from 'rxjs';
import { EditViewBase } from '@/studio-core';
import OpportunityService from '@/service/opportunity/opportunity-service';
import EditViewEngine from '@engine/view/edit-view-engine';
/**
* 商机编辑视图视图基类
*
* @export
* @class OpportunityInfo_AbstractBase
* @extends {EditViewBase}
*/
export class OpportunityInfo_AbstractBase extends EditViewBase {
/**
* 实体服务对象
*
* @type {OpportunityService}
* @memberof OpportunityInfo_AbstractBase
*/
protected appEntityService: OpportunityService = new OpportunityService;
/**
* 计数器服务对象集合
*
* @protected
* @type {Array<*>}
* @memberof OpportunityInfo_AbstractBase
*/
protected counterServiceArray: Array<any> = [];
/**
* 视图模型数据
*
* @protected
* @type {*}
* @memberof OpportunityInfo_AbstractBase
*/
protected model: any = {
srfCaption: 'entities.opportunity.views.info_abstract.caption',
srfTitle: 'entities.opportunity.views.info_abstract.title',
srfSubTitle: 'entities.opportunity.views.info_abstract.subtitle',
dataInfo: ''
}
/**
* 容器模型
*
* @protected
* @type {*}
* @memberof OpportunityInfo_AbstractBase
*/
protected containerModel: any = {
view_form: { name: 'form', type: 'FORM' },
};
/**
* 视图唯一标识
*
* @protected
* @type {string}
* @memberof ViewBase
*/
protected viewtag: string = '66b3d6f7e15711b61132066ba3a95f91';
/**
* 视图引擎
*
* @public
* @type {Engine}
* @memberof OpportunityInfo_AbstractBase
*/
public engine: EditViewEngine = new EditViewEngine();
/**
* 引擎初始化
*
* @public
* @memberof OpportunityInfo_AbstractBase
*/
public engineInit(): void {
this.engine.init({
view: this,
form: this.$refs.form,
p2k: '0',
keyPSDEField: 'opportunity',
majorPSDEField: 'opportunityname',
isLoadDefault: true,
});
}
/**
* form 部件 save 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof OpportunityInfo_AbstractBase
*/
public form_save($event: any, $event2?: any): void {
this.engine.onCtrlEvent('form', 'save', $event);
}
/**
* form 部件 remove 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof OpportunityInfo_AbstractBase
*/
public form_remove($event: any, $event2?: any): void {
this.engine.onCtrlEvent('form', 'remove', $event);
}
/**
* form 部件 load 事件
*
* @param {*} [args={}]
* @param {*} $event
* @memberof OpportunityInfo_AbstractBase
*/
public form_load($event: any, $event2?: any): void {
this.engine.onCtrlEvent('form', 'load', $event);
}
}
\ No newline at end of file
<studio-view-style2 viewName="opportunityinfo_abstract" viewTitle="商机编辑视图" class='deeditview opportunity-info-abstract'>
<template slot='title'>
<span class='caption-info'>{{$t(model.srfTitle)}}</span>
</template>
<view_form
: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=''
name="form"
ref='form'
@save="form_save($event)"
@remove="form_remove($event)"
@load="form_load($event)"
@closeview="closeView($event)">
</view_form>
</studio-view-style2>
\ No newline at end of file
<template src="./opportunity-info-abstract.html"/>
<script lang='tsx'>
import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { OpportunityInfo_AbstractBase } from './opportunity-info-abstract-base';
import view_form from '@widgets/opportunity/abstract-info-form/abstract-info-form.vue';
/**
* 商机编辑视图视图
*
* @export
* @class OpportunityInfo_Abstract
* @extends {OpportunityInfo_AbstractBase}
*/
@Component({
components: {
view_form,
},
beforeRouteEnter: (to: any, from: any, next: any) => {
next((vm: any) => {
vm.$store.commit('addCurPageViewtag', { route: to, viewtag: vm.viewtag });
});
}
})
@VueLifeCycleProcessing()
export default class OpportunityInfo_Abstract extends OpportunityInfo_AbstractBase { }
</script>
......@@ -3,7 +3,7 @@
import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { OpportunitySummaryBase } from './opportunity-summary-base';
import view_dashboard from '@widgets/opportunity/dashboard-dashboard/dashboard-dashboard.vue';
import view_dashboard from '@widgets/opportunity/abstract-info-dashboard/abstract-info-dashboard.vue';
/**
* 商机概览视图
......
......@@ -38,6 +38,7 @@ export const PageComponents = {
Vue.component('product-edit-quick-create', () => import('@pages/product/product-edit-quick-create/product-edit-quick-create.vue'));
Vue.component('campaign-info-manager', () => import('@pages/marketing/campaign-info-manager/campaign-info-manager.vue'));
Vue.component('contact-info-abstract', () => import('@pages/base/contact-info-abstract/contact-info-abstract.vue'));
Vue.component('opportunity-info-abstract', () => import('@pages/sales/opportunity-info-abstract/opportunity-info-abstract.vue'));
Vue.component('list-contact-edit-view', () => import('@pages/marketing/list-contact-edit-view/list-contact-edit-view.vue'));
Vue.component('campaign-grid-view', () => import('@pages/marketing/campaign-grid-view/campaign-grid-view.vue'));
Vue.component('list-lead-by-list', () => import('@pages/marketing/list-lead-by-list/list-lead-by-list.vue'));
......
......@@ -1079,6 +1079,51 @@ const router = new Router({
},
component: () => import('@pages/base/contact-info-abstract/contact-info-abstract.vue'),
},
{
path: 'accounts/:account?/contacts/:contact?/opportunities/:opportunity?/info_abstract/:info_abstract?',
meta: {
caption: 'entities.opportunity.views.info_abstract.title',
info:'',
parameters: [
{ pathName: 'central', parameterName: 'central' },
{ pathName: 'accounts', parameterName: 'account' },
{ pathName: 'contacts', parameterName: 'contact' },
{ pathName: 'opportunities', parameterName: 'opportunity' },
{ pathName: 'info_abstract', parameterName: 'info_abstract' },
],
requireAuth: true,
},
component: () => import('@pages/sales/opportunity-info-abstract/opportunity-info-abstract.vue'),
},
{
path: 'contacts/:contact?/opportunities/:opportunity?/info_abstract/:info_abstract?',
meta: {
caption: 'entities.opportunity.views.info_abstract.title',
info:'',
parameters: [
{ pathName: 'central', parameterName: 'central' },
{ pathName: 'contacts', parameterName: 'contact' },
{ pathName: 'opportunities', parameterName: 'opportunity' },
{ pathName: 'info_abstract', parameterName: 'info_abstract' },
],
requireAuth: true,
},
component: () => import('@pages/sales/opportunity-info-abstract/opportunity-info-abstract.vue'),
},
{
path: 'opportunities/:opportunity?/info_abstract/:info_abstract?',
meta: {
caption: 'entities.opportunity.views.info_abstract.title',
info:'',
parameters: [
{ pathName: 'central', parameterName: 'central' },
{ pathName: 'opportunities', parameterName: 'opportunity' },
{ pathName: 'info_abstract', parameterName: 'info_abstract' },
],
requireAuth: true,
},
component: () => import('@pages/sales/opportunity-info-abstract/opportunity-info-abstract.vue'),
},
{
path: 'accounts/:account?/contacts/:contact?/listcontacts/:listcontact?/editview/:editview?',
meta: {
......
......@@ -183,6 +183,8 @@ export const viewstate: any = {
viewaction: '',
viewdatachange: false,
refviews: [
'66b3d6f7e15711b61132066ba3a95f91',
'c74c14188b89f72079643170a83c25f5',
],
},
{
......@@ -622,6 +624,15 @@ export const viewstate: any = {
'9107350fc58a1dba2785d2f5da8afec8',
],
},
{
viewtag: '66b3d6f7e15711b61132066ba3a95f91',
viewmodule: 'Sales',
viewname: 'OpportunityInfo_Abstract',
viewaction: '',
viewdatachange: false,
refviews: [
],
},
{
viewtag: '688201ee5642d41628dbf4deba002d17',
viewmodule: 'Base',
......
import { Prop, Provide, Emit, Model } from 'vue-property-decorator';
import { Subject, Subscription } from 'rxjs';
import { Watch, MainControlBase } from '@/studio-core';
import OpportunityService from '@/service/opportunity/opportunity-service';
import AbstractInfoService from './abstract-info-dashboard-service';
import UtilService from '@/utilservice/util-service';
/**
* dashboard部件基类
*
* @export
* @class MainControlBase
* @extends {AbstractInfoDashboardBase}
*/
export class AbstractInfoDashboardBase extends MainControlBase {
/**
* 建构部件服务对象
*
* @type {AbstractInfoService}
* @memberof AbstractInfoDashboardBase
*/
public service: AbstractInfoService = new AbstractInfoService({ $store: this.$store });
/**
* 实体服务对象
*
* @type {OpportunityService}
* @memberof AbstractInfoDashboardBase
*/
public appEntityService: OpportunityService = new OpportunityService({ $store: this.$store });
/**
* 应用实体名称
*
* @protected
* @type {string}
* @memberof AbstractInfoDashboardBase
*/
protected appDeName: string = 'opportunity';
/**
* 是否支持看板定制
*
* @public
* @type {(boolean)}
* @memberof AbstractInfo
*/
@Prop() public isEnableCustomized!:boolean;
/**
* 是否已有看板定制
*
* @public
* @type {(boolean)}
* @memberof AbstractInfo
*/
public isHasCustomized:boolean = false;
/**
* 模型数据
*
* @public
* @type {(*)}
* @memberof AbstractInfo
*/
public modelDta:any;
/**
* modleId
*
* @type {string}
* @memberof AbstractInfo
*/
public modelId:string = "dashboard_opportunity_abstractinfo";
/**
* 建构功能服务对象
*
* @type {UtilService}
* @memberof AbstractInfo
*/
public utilService:UtilService = new UtilService();
/**
* 功能服务名称
*
* @type {string}
* @memberof AbstractInfo
*/
public utilServiceName:string = "";
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof AbstractInfo
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof AbstractInfo
*/
public getData(): any {
return {};
}
/**
* vue 生命周期
*
* @memberof AbstractInfo
*/
public created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof AbstractInfo
*/
public afterCreated(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
if (Object.is('load', action)) {
this.loadModel();
}
});
}
}
/**
* 动态设计水平列数
*
* @memberof AbstractInfo
*/
public layoutColNum:number = 12;
/**
* 动态设计单元格高度,80px
*
* @memberof AbstractInfo
*/
public layoutRowH:number = 80;
/**
* 通知状态
*
* @memberof AbstractInfo
*/
public notifyState(){
this.$nextTick(() =>{
if (this.isHasCustomized) {
if (this.modelDta && this.modelDta.length > 0) {
this.modelDta.forEach((item: any) => {
this.viewState.next({
tag: item.portletCodeName,
action: "load",
data: JSON.parse(JSON.stringify(this.viewparams))
});
});
}
} else {
if (this.viewState) {
const refs: any = this.$refs;
Object.keys(refs).forEach((name: string) => {
this.viewState.next({
tag: name,
action: "load",
data: JSON.parse(JSON.stringify(this.viewparams))
});
});
}
}
})
}
/**
* 加载布局与数据模型
*
* @memberof AbstractInfo
*/
public loadModel(){
if(this.isEnableCustomized){
this.utilService.getService(this.utilServiceName).then((service:any) =>{
service.loadModelData(JSON.parse(JSON.stringify(this.context)),{modelid:this.modelId,utilServiceName:this.utilServiceName}).then((res:any) =>{
if(res && res.status == 200){
const data:any = res.data;
if(data && data.length >0){
this.isHasCustomized = true;
this.modelDta = data;
this.$forceUpdate();
}else{
this.isHasCustomized = false;
}
this.notifyState();
}else{
console.error("加载面板模型异常");
this.isHasCustomized = false;
this.notifyState();
}
}).catch((error:any)=>{
console.error("加载面板模型异常");
console.error(error);
this.isHasCustomized = false;
this.notifyState();
});
})
}else{
this.notifyState();
}
}
/**
* 处理私人定制按钮
*
* @memberof AbstractInfo
*/
public handleClick(){
const view:any ={
viewname: 'app-portal-design',
title: '面板设计',
width: 1600,
placement: 'DRAWER_RIGHT'
}
const viewparam:any ={
modelid:this.modelId,
utilServiceName:this.utilServiceName,
appdeName:'Opportunity'
}
const appdrawer = this.$appdrawer.openDrawer(view, JSON.parse(JSON.stringify(this.context)), viewparam);
appdrawer.subscribe((result: any) => {
if(Object.is(result.ret,'OK')){
this.loadModel();
}
});
}
/**
* vue 生命周期
*
* @memberof AbstractInfo
*/
public destroyed() {
this.afterDestroy();
}
/**
* 执行destroyed后的逻辑
*
* @memberof AbstractInfo
*/
public afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
}
}
\ No newline at end of file
/**
* AbstractInfo 部件模型
*
* @export
* @class AbstractInfoModel
*/
export default class AbstractInfoModel {
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof AbstractInfoModel
*/
public getDataItems(): any[] {
return [
{
name: 'decisionmaker',
},
{
name: 'totallineitemamount',
},
{
name: 'processid',
},
{
name: 'discountpercentage',
},
{
name: 'pricingerrorcode',
},
{
name: 'totalamount',
},
{
name: 'totaltax_base',
},
{
name: 'totaltax',
},
{
name: 'updateman',
},
{
name: 'estimatedvalue_base',
},
{
name: 'presentfinalproposal',
},
{
name: 'developproposal',
},
{
name: 'opportunityratingcode',
},
{
name: 'totalamount_base',
},
{
name: 'totalamountlessfreight',
},
{
name: 'description',
},
{
name: 'identifycompetitors',
},
{
name: 'updatedate',
},
{
name: 'sendthankyounote',
},
{
name: 'totaldiscountamount_base',
},
{
name: 'totallineitemdiscountamount',
},
{
name: 'purchaseprocess',
},
{
name: 'traversedpath',
},
{
name: 'captureproposalfeedback',
},
{
name: 'finaldecisiondate',
},
{
name: 'stepid',
},
{
name: 'resolvefeedback',
},
{
name: 'budgetamount_base',
},
{
name: 'owneridyominame',
},
{
name: 'pursuitdecision',
},
{
name: 'revenuesystemcalculated',
},
{
name: 'scheduleproposalmeeting',
},
{
name: 'closeprobability',
},
{
name: 'utcconversiontimezonecode',
},
{
name: 'presentproposal',
},
{
name: 'schedulefollowup_prospect',
},
{
name: 'statuscode',
},
{
name: 'actualclosedate',
},
{
name: 'confirminterest',
},
{
name: 'customerid',
},
{
name: 'salesstage',
},
{
name: 'opportunity',
prop: 'opportunityid',
},
{
name: 'onholdtime',
},
{
name: 'qualificationcomments',
},
{
name: 'accountidyominame',
},
{
name: 'schedulefollowup_qualify',
},
{
name: 'participatesinworkflow',
},
{
name: 'exchangerate',
},
{
name: 'stepname',
},
{
name: 'customerneed',
},
{
name: 'importsequencenumber',
},
{
name: 'completeinternalreview',
},
{
name: 'evaluatefit',
},
{
name: 'salesstagecode',
},
{
name: 'identifypursuitteam',
},
{
name: 'contactidyominame',
},
{
name: 'initialcommunication',
},
{
name: 'versionnumber',
},
{
name: 'freightamount_base',
},
{
name: 'teamsfollowed',
},
{
name: 'proposedsolution',
},
{
name: 'filedebrief',
},
{
name: 'budgetamount',
},
{
name: 'budgetstatus',
},
{
name: 'discountamount_base',
},
{
name: 'completefinalproposal',
},
{
name: 'discountamount',
},
{
name: 'customeridyominame',
},
{
name: 'need',
},
{
name: 'stageid',
},
{
name: 'freightamount',
},
{
name: 'actualvalue',
},
{
name: 'ibizprivate',
},
{
name: 'timezoneruleversionnumber',
},
{
name: 'createdate',
},
{
name: 'prioritycode',
},
{
name: 'totallineitemamount_base',
},
{
name: 'estimatedclosedate',
},
{
name: 'currentsituation',
},
{
name: 'actualvalue_base',
},
{
name: 'customerpainpoints',
},
{
name: 'totaldiscountamount',
},
{
name: 'opportunityname',
},
{
name: 'owneridtype',
},
{
name: 'identifycustomercontacts',
},
{
name: 'timeline',
},
{
name: 'lastonholdtime',
},
{
name: 'totalamountlessfreight_base',
},
{
name: 'estimatedvalue',
},
{
name: 'emailaddress',
},
{
name: 'statecode',
},
{
name: 'purchasetimeframe',
},
{
name: 'createman',
},
{
name: 'quotecomments',
},
{
name: 'customeridtype',
},
{
name: 'overriddencreatedon',
},
{
name: 'ownerid',
},
{
name: 'slaname',
},
{
name: 'parentcontactid',
},
{
name: 'campaignid',
},
{
name: 'transactioncurrencyid',
},
{
name: 'parentaccountid',
},
{
name: 'pricelevelid',
},
{
name: 'originatingleadid',
},
{
name: 'slaid',
},
{
name: 'originatingleadname',
},
{
name: 'parentaccountname',
},
{
name: 'campaignname',
},
{
name: 'parentcontactname',
},
{
name: 'transactioncurrencyname',
},
{
name: 'pricelevelname',
},
]
}
}
\ No newline at end of file
import { Http } from '@/utils';
import ControlService from '@/widgets/control-service';
/**
* AbstractInfo 部件服务对象
*
* @export
* @class AbstractInfoService
*/
export default class AbstractInfoService extends ControlService {
}
\ No newline at end of file
<div class='dashboard'>
<row v-if="isEnableCustomized">
<app-build @handleClick="handleClick.apply(_self, arguments)"></app-build>
</row>
<row v-if="!isHasCustomized">
<i-col :md="{ span: 24, offset: 0 }" :lg="{ span: 18, offset: 0 }">
<card class="portlet-card" :bordered="false" dis-hover :padding="0">
<span>
<div class='portlet-container summarydashboard-container1 ' :style="{}">
<row>
<i-col :md="{ span: 24, offset: 0 }">
<div class="portlet-without-title">
<card class="portlet-card" :bordered="false" dis-hover :padding="0">
<span>
<view_dashboard_sysportlet1
:viewState="viewState"
:viewparams="viewparams"
:context="context"
name="dashboard_sysportlet1"
ref='dashboard_sysportlet1'
@closeview="closeView($event)">
</view_dashboard_sysportlet1>
</span>
</card>
</div>
</i-col>
</row>
</div>
</span>
</card>
</i-col>
<i-col :md="{ span: 24, offset: 0 }" :lg="{ span: 6, offset: 0 }">
<card class="portlet-card" :bordered="false" dis-hover :padding="0">
<span>
<div class='portlet-container summarydashboard-container2 ' :style="{}">
<row>
<i-col :md="{ span: 24, offset: 0 }">
<div class="portlet-without-title">
<card class="portlet-card" :bordered="false" dis-hover :padding="0">
<span>
<view_dashboard_sysportlet2
:viewState="viewState"
:viewparams="viewparams"
:context="context"
name="dashboard_sysportlet2"
ref='dashboard_sysportlet2'
@closeview="closeView($event)">
</view_dashboard_sysportlet2>
</span>
</card>
</div>
</i-col>
</row>
</div>
</span>
</card>
</i-col>
</row>
<row v-if="isHasCustomized" style="width: 100%;min-height: calc(100% - 40px);">
<div class="portlet-container" style="position: relative;width:100%;">
<template v-for="(item, index) of modelDta">
<div :key="index" :style="{zIndex: 10, position: 'absolute', height: item.h*layoutRowH + 'px', width: `calc(100% / ${layoutColNum} * ${item.w})`,top: item.y*layoutRowH + 'px', left: `calc(100% / ${layoutColNum} * ${item.x})`}">
<component :key="$util.createUUID()" :is="item.componentName" :name="item.portletCodeName" :context="JSON.parse(JSON.stringify(context))" :viewDefaultUsage="false" :isAdaptiveSize="true" :viewState="viewState"></component>
</div>
</template>
</div>
</row>
</div>
\ No newline at end of file
<template src="./abstract-info-dashboard.html"/>
<script lang='tsx'>
import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { AbstractInfoDashboardBase } from './abstract-info-dashboard-base';
import view_dashboard_sysportlet2 from '@widgets/opportunity/view-opp-pro-portlet/view-opp-pro-portlet.vue';
import view_dashboard_sysportlet1 from '@widgets/opportunity/view-opp-abs-portlet/view-opp-abs-portlet.vue';
/**
* dashboard部件
*
* @export
* @class AbstractInfoDashboard
* @extends {AbstractInfoDashboardBase}
*/
@Component({
components: {
view_dashboard_sysportlet2,
view_dashboard_sysportlet1,
}
})
@VueLifeCycleProcessing()
export default class AbstractInfoDashboard extends AbstractInfoDashboardBase { }
</script>
/**
* AbstractInfo 部件模型
*
* @export
* @class AbstractInfoModel
*/
export default class AbstractInfoModel {
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof AbstractInfoModel
*/
public getDataItems(): any[] {
return [
{
name: 'srfwfmemo',
prop: 'srfwfmemo',
dataType: 'TEXT',
},
// 前端新增修改标识,新增为"0",修改为"1"或未设值
{
name: 'srffrontuf',
prop: 'srffrontuf',
dataType: 'TEXT',
},
{
name: 'srfupdatedate',
prop: 'updatedate',
dataType: 'DATETIME',
},
{
name: 'srforikey',
},
{
name: 'srfkey',
prop: 'opportunityid',
dataType: 'GUID',
},
{
name: 'srfmajortext',
prop: 'opportunityname',
dataType: 'TEXT',
},
{
name: 'srftempmode',
},
{
name: 'srfuf',
},
{
name: 'srfdeid',
},
{
name: 'srfsourcekey',
},
{
name: 'opportunityname',
prop: 'opportunityname',
dataType: 'TEXT',
},
{
name: 'parentcontactname',
prop: 'parentcontactname',
dataType: 'PICKUPTEXT',
},
{
name: 'parentaccountname',
prop: 'parentaccountname',
dataType: 'PICKUPTEXT',
},
{
name: 'purchasetimeframe',
prop: 'purchasetimeframe',
dataType: 'SSCODELIST',
},
{
name: 'transactioncurrencyname',
prop: 'transactioncurrencyname',
dataType: 'PICKUPTEXT',
},
{
name: 'budgetamount',
prop: 'budgetamount',
dataType: 'BIGDECIMAL',
},
{
name: 'purchaseprocess',
prop: 'purchaseprocess',
dataType: 'SSCODELIST',
},
{
name: 'description',
prop: 'description',
dataType: 'TEXT',
},
{
name: 'currentsituation',
prop: 'currentsituation',
dataType: 'TEXT',
},
{
name: 'customerneed',
prop: 'customerneed',
dataType: 'TEXT',
},
{
name: 'proposedsolution',
prop: 'proposedsolution',
dataType: 'TEXT',
},
{
name: 'opportunityid',
prop: 'opportunityid',
dataType: 'GUID',
},
{
name: 'opportunity',
prop: 'opportunityid',
dataType: 'FONTKEY',
},
]
}
}
\ No newline at end of file
<i-form :model="this.data" class='app-form info-form-mode' ref='form' id='opportunity_abstractinfo' style="">
<input style="display:none;" />
<row >
<i-col v-show="detailsModel.group1.visible" :style="{}" :lg="{ span: 24, offset: 0 }">
<app-form-group layoutType="TABLE_24COL" titleStyle="" class='' :uiActionGroup="detailsModel.group1.uiActionGroup" @groupuiactionclick="groupUIActionClick($event)" :caption="$t('entities.opportunity.abstractinfo_form.details.group1')" :isShowCaption="false" uiStyle="DEFAULT" :titleBarCloseMode="0" :isInfoGroupMode="true" >
<row>
<i-col v-show="detailsModel.opportunityname.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='opportunityname' :itemRules="this.rules.opportunityname" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.opportunityname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.opportunityname.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='opportunityname' :value="data.opportunityname" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.parentcontactname.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='parentcontactname' :itemRules="this.rules.parentcontactname" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.parentcontactname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.parentcontactname.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='parentcontactname' :value="data.parentcontactname" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.parentaccountname.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='parentaccountname' :itemRules="this.rules.parentaccountname" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.parentaccountname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.parentaccountname.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='parentaccountname' :value="data.parentaccountname" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.purchasetimeframe.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='purchasetimeframe' :itemRules="this.rules.purchasetimeframe" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.purchasetimeframe')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.purchasetimeframe.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='purchasetimeframe' :value="data.purchasetimeframe" tag='Opportunity__PurchaseTimeframe' codelistType='STATIC' :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.transactioncurrencyname.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='transactioncurrencyname' :itemRules="this.rules.transactioncurrencyname" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.transactioncurrencyname')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.transactioncurrencyname.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='transactioncurrencyname' :value="data.transactioncurrencyname" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.budgetamount.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='budgetamount' :itemRules="this.rules.budgetamount" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.budgetamount')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.budgetamount.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='budgetamount' :value="data.budgetamount" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.purchaseprocess.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 8, offset: 0 }" :xl="{ span: 6, offset: 0 }">
<app-form-item name='purchaseprocess' :itemRules="this.rules.purchaseprocess" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.purchaseprocess')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.purchaseprocess.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='purchaseprocess' :value="data.purchaseprocess" tag='Opportunity__PurchaseProcess' codelistType='STATIC' :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.description.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 24, offset: 0 }" :xl="{ span: 24, offset: 0 }">
<app-form-item name='description' :itemRules="this.rules.description" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.description')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.description.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='description' :value="data.description" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.currentsituation.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 24, offset: 0 }" :xl="{ span: 24, offset: 0 }">
<app-form-item name='currentsituation' :itemRules="this.rules.currentsituation" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.currentsituation')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.currentsituation.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='currentsituation' :value="data.currentsituation" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.customerneed.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 24, offset: 0 }" :xl="{ span: 24, offset: 0 }">
<app-form-item name='customerneed' :itemRules="this.rules.customerneed" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.customerneed')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.customerneed.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='customerneed' :value="data.customerneed" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.proposedsolution.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 24, offset: 0 }" :xl="{ span: 24, offset: 0 }">
<app-form-item name='proposedsolution' :itemRules="this.rules.proposedsolution" class='' :caption="$t('entities.opportunity.abstractinfo_form.details.proposedsolution')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.proposedsolution.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span name='proposedsolution' :value="data.proposedsolution" :data="data" :context="context" :viewparams="viewparams" :localContext ='{ }' :localParam ='{ }' style=""></app-span>
</app-form-item>
</i-col>
</row>
</app-form-group>
</i-col>
</row>
</i-form>
\ No newline at end of file
<template src="./abstract-info-form.html"/>
<script lang='tsx'>
import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { AbstractInfoEditFormBase } from './abstract-info-form-base';
/**
* form部件
*
* @export
* @class AbstractInfoEditForm
* @extends {AbstractInfoEditFormBase}
*/
@Component({
components: {
}
})
@VueLifeCycleProcessing()
export default class AbstractInfoEditForm extends AbstractInfoEditFormBase { }
</script>
import { Prop, Provide, Emit, Model } from 'vue-property-decorator';
import { Subject, Subscription } from 'rxjs';
import { Watch, MainControlBase } from '@/studio-core';
import OpportunityService from '@/service/opportunity/opportunity-service';
import View_OppAbsService from './view-opp-abs-portlet-service';
import { Environment } from '@/environments/environment';
/**
* dashboard_sysportlet1部件基类
*
* @export
* @class MainControlBase
* @extends {View_OppAbsPortletBase}
*/
export class View_OppAbsPortletBase extends MainControlBase {
/**
* 建构部件服务对象
*
* @type {View_OppAbsService}
* @memberof View_OppAbsPortletBase
*/
public service: View_OppAbsService = new View_OppAbsService({ $store: this.$store });
/**
* 实体服务对象
*
* @type {OpportunityService}
* @memberof View_OppAbsPortletBase
*/
public appEntityService: OpportunityService = new OpportunityService({ $store: this.$store });
/**
* 应用实体名称
*
* @protected
* @type {string}
* @memberof View_OppAbsPortletBase
*/
protected appDeName: string = 'opportunity';
/**
* 长度
*
* @type {number}
* @memberof View_OppAbs
*/
@Prop() public height?: number;
/**
* 宽度
*
* @type {number}
* @memberof View_OppAbs
*/
@Prop() public width?: number;
/**
* 是否自适应大小
*
* @returns {boolean}
* @memberof View_OppAbsBase
*/
@Prop({default: false})public isAdaptiveSize!: boolean;
/**
* 获取多项数据
*
* @returns {any[]}
* @memberof View_OppAbsBase
*/
public getDatas(): any[] {
return [];
}
/**
* 获取单项树
*
* @returns {*}
* @memberof View_OppAbsBase
*/
public getData(): any {
return {};
}
/**
* 获取高度
*
* @returns {any[]}
* @memberof View_OppAbsBase
*/
get getHeight(): any{
if(!this.$util.isEmpty(this.height) && !this.$util.isNumberNaN(this.height)){
if(this.height == 0){
return 'auto';
} else {
return this.height+'px';
}
} else {
return 'auto';
}
}
/**
* vue 生命周期
*
* @memberof View_OppAbsBase
*/
public created() {
this.afterCreated();
}
/**
* 执行created后的逻辑
*
* @memberof View_OppAbsBase
*/
public afterCreated(){
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
return;
}
const refs: any = this.$refs;
Object.keys(refs).forEach((_name: string) => {
this.viewState.next({ tag: _name, action: action, data: data });
});
});
}
}
/**
* vue 生命周期
*
* @memberof View_OppAbsBase
*/
public destroyed() {
this.afterDestroy();
}
/**
* 执行destroyed后的逻辑
*
* @memberof View_OppAbsBase
*/
public afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
}
}
/**
* View_OppAbs 部件模型
*
* @export
* @class View_OppAbsModel
*/
export default class View_OppAbsModel {
/**
* 获取数据项集合
*
* @returns {any[]}
* @memberof View_OppAbsModel
*/
public getDataItems(): any[] {
return [
{
name: 'decisionmaker',
},
{
name: 'totallineitemamount',
},
{
name: 'processid',
},
{
name: 'discountpercentage',
},
{
name: 'pricingerrorcode',
},
{
name: 'totalamount',
},
{
name: 'totaltax_base',
},
{
name: 'totaltax',
},
{
name: 'updateman',
},
{
name: 'estimatedvalue_base',
},
{
name: 'presentfinalproposal',
},
{
name: 'developproposal',
},
{
name: 'opportunityratingcode',
},
{
name: 'totalamount_base',
},
{
name: 'totalamountlessfreight',
},
{
name: 'description',
},
{
name: 'identifycompetitors',
},
{
name: 'updatedate',
},
{
name: 'sendthankyounote',
},
{
name: 'totaldiscountamount_base',
},
{
name: 'totallineitemdiscountamount',
},
{
name: 'purchaseprocess',
},
{
name: 'traversedpath',
},
{
name: 'captureproposalfeedback',
},
{
name: 'finaldecisiondate',
},
{
name: 'stepid',
},
{
name: 'resolvefeedback',
},
{
name: 'budgetamount_base',
},
{
name: 'owneridyominame',
},
{
name: 'pursuitdecision',
},
{
name: 'revenuesystemcalculated',
},
{
name: 'scheduleproposalmeeting',
},
{
name: 'closeprobability',
},
{
name: 'utcconversiontimezonecode',
},
{
name: 'presentproposal',
},
{
name: 'schedulefollowup_prospect',
},
{
name: 'statuscode',
},
{
name: 'actualclosedate',
},
{
name: 'confirminterest',
},
{
name: 'customerid',
},
{
name: 'salesstage',
},
{
name: 'opportunity',
prop: 'opportunityid',
},
{
name: 'onholdtime',
},
{
name: 'qualificationcomments',
},
{
name: 'accountidyominame',
},
{
name: 'schedulefollowup_qualify',
},
{
name: 'participatesinworkflow',
},
{
name: 'exchangerate',
},
{
name: 'stepname',
},
{
name: 'customerneed',
},
{
name: 'importsequencenumber',
},
{
name: 'completeinternalreview',
},
{
name: 'evaluatefit',
},
{
name: 'salesstagecode',
},
{
name: 'identifypursuitteam',
},
{
name: 'contactidyominame',
},
{
name: 'initialcommunication',
},
{
name: 'versionnumber',
},
{
name: 'freightamount_base',
},
{
name: 'teamsfollowed',
},
{
name: 'proposedsolution',
},
{
name: 'filedebrief',
},
{
name: 'budgetamount',
},
{
name: 'budgetstatus',
},
{
name: 'discountamount_base',
},
{
name: 'completefinalproposal',
},
{
name: 'discountamount',
},
{
name: 'customeridyominame',
},
{
name: 'need',
},
{
name: 'stageid',
},
{
name: 'freightamount',
},
{
name: 'actualvalue',
},
{
name: 'ibizprivate',
},
{
name: 'timezoneruleversionnumber',
},
{
name: 'createdate',
},
{
name: 'prioritycode',
},
{
name: 'totallineitemamount_base',
},
{
name: 'estimatedclosedate',
},
{
name: 'currentsituation',
},
{
name: 'actualvalue_base',
},
{
name: 'customerpainpoints',
},
{
name: 'totaldiscountamount',
},
{
name: 'opportunityname',
},
{
name: 'owneridtype',
},
{
name: 'identifycustomercontacts',
},
{
name: 'timeline',
},
{
name: 'lastonholdtime',
},
{
name: 'totalamountlessfreight_base',
},
{
name: 'estimatedvalue',
},
{
name: 'emailaddress',
},
{
name: 'statecode',
},
{
name: 'purchasetimeframe',
},
{
name: 'createman',
},
{
name: 'quotecomments',
},
{
name: 'customeridtype',
},
{
name: 'overriddencreatedon',
},
{
name: 'ownerid',
},
{
name: 'slaname',
},
{
name: 'parentcontactid',
},
{
name: 'campaignid',
},
{
name: 'transactioncurrencyid',
},
{
name: 'parentaccountid',
},
{
name: 'pricelevelid',
},
{
name: 'originatingleadid',
},
{
name: 'slaid',
},
{
name: 'originatingleadname',
},
{
name: 'parentaccountname',
},
{
name: 'campaignname',
},
{
name: 'parentcontactname',
},
{
name: 'transactioncurrencyname',
},
{
name: 'pricelevelname',
},
]
}
}
import { Http } from '@/utils';
import ControlService from '@/widgets/control-service';
/**
* View_OppAbs 部件服务对象
*
* @export
* @class View_OppAbsService
*/
export default class View_OppAbsService extends ControlService {
}
<div class='portlet view-opp-abs ' :style="{}">
<p class='portlet-title'>
<span>
摘要信息
</span>
</p>
<div class="portlet-with-title">
<opportunity-info-abstract :viewdata="JSON.stringify(context)" :viewDefaultUsage="false" ></opportunity-info-abstract>
</div>
</div>
<template src="./view-opp-abs-portlet.html"/>
<script lang='tsx'>
import { Component } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '@/studio-core';
import { View_OppAbsPortletBase } from './view-opp-abs-portlet-base';
/**
* dashboard_sysportlet1部件
*
* @export
* @class View_OppAbsPortlet
* @extends {View_OppAbsPortletBase}
*/
@Component({
components: {
}
})
@VueLifeCycleProcessing()
export default class View_OppAbsPortlet extends View_OppAbsPortletBase { }
</script>
......@@ -10424,7 +10424,7 @@
<!--输出实体[OPPORTUNITY]数据结构 -->
<changeSet author="a_LAB01_e85d8801c" id="tab-opportunity-104-122">
<changeSet author="a_LAB01_e85d8801c" id="tab-opportunity-106-122">
<createTable tableName="OPPORTUNITY">
<column name="DECISIONMAKER" remarks="" type="INT">
</column>
......@@ -11647,25 +11647,25 @@
<!--输出实体[RELATIONSHIPS]外键关系 -->
<!--输出实体[CONNECTIONROLE]外键关系 -->
<!--输出实体[OPPORTUNITY]外键关系 -->
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-408">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-408">
<addForeignKeyConstraint baseColumnNames="PARENTACCOUNTID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__ACCOUNT__PA" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="ACCOUNTID" referencedTableName="ACCOUNT" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-409">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-409">
<addForeignKeyConstraint baseColumnNames="CAMPAIGNID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__CAMPAIGN__C" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="CAMPAIGNID" referencedTableName="CAMPAIGN" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-410">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-410">
<addForeignKeyConstraint baseColumnNames="PARENTCONTACTID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__CONTACT__PA" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="CONTACTID" referencedTableName="CONTACT" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-411">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-411">
<addForeignKeyConstraint baseColumnNames="ORIGINATINGLEADID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__LEAD__ORIGI" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="LEADID" referencedTableName="LEAD" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-412">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-412">
<addForeignKeyConstraint baseColumnNames="PRICELEVELID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__PRICELEVEL_" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="PRICELEVELID" referencedTableName="PRICELEVEL" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-413">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-413">
<addForeignKeyConstraint baseColumnNames="SLAID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__SLA__SLAID" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="SLAID" referencedTableName="SLA" validate="true"/>
</changeSet>
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-104-414">
<changeSet author="a_LAB01_e85d8801c" id="fk-opportunity-106-414">
<addForeignKeyConstraint baseColumnNames="TRANSACTIONCURRENCYID" baseTableName="OPPORTUNITY" constraintName="DER1N_OPPORTUNITY__TRANSACTION" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="TRANSACTIONCURRENCYID" referencedTableName="TRANSACTIONCURRENCY" validate="true"/>
</changeSet>
<!--输出实体[OPPORTUNITYCOMPETITOR]外键关系 -->
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册