提交 a3955eaa 编写于 作者: Mosher's avatar Mosher

update:更新

上级 dcb1a0f5
{ {{#appNavParams}}'{{lowerCase key}}':{{#if (eq rawValue true)}}'{{lowerCase value}}'{{else}}'%{{lowerCase value}}%'{{/if}}{{#unless @last}},{{/unless}}{{/appNavParams}} } { {{#appNavParams}}'{{lowerCase key}}':{{#if (eq rawValue true)}}'{{value}}'{{else}}'%{{lowerCase value}}%'{{/if}}{{#unless @last}},{{/unless}}{{/appNavParams}} }
\ No newline at end of file \ No newline at end of file
/**
* {{singleAppMethod.codeName}}
*
* @param {IContext} [context={}]
* @param {IParam} [data = {}]
* @returns {Promise<any>}
* @memberof {{pascalCase appEntity.codeName}}ServiceBase
*/
public async {{singleAppMethod.codeName}}(context: IContext = {}, data: IParam = {}): Promise<any> {
{{#if singleAppMethod.psDEDataSet}}
{{#if singleAppMethod.psDEDataSet.psDEDataQueries}}
{{#singleAppMethod.psDEDataSet.psDEDataQueries}}
// const cond: any = this.get{{codeName}}Cond();
{{/singleAppMethod.psDEDataSet.psDEDataQueries}}
// return this.searchAppLocal(cond, new SearchFilter(context, data));
// return this.searchAppLocal(null, new SearchFilter(context, data));
// 从数据模式暂未支持。等待后续补充
const res = { ok: true, data: [], status: 200 };
return res;
{{else}}
// return this.searchAppLocal(null, new SearchFilter(context, data));
// 从数据模式暂未支持。等待后续补充
const res = { ok: true, data: [], status: 200 };
return res;
{{/if}}
{{else}}
const res: any = { ok: false, message: '未设置数据集', status: 500 };
return res;
{{/if}}
}
...@@ -46,6 +46,10 @@ export class {{pascalCase appEntity.codeName}}ServiceBase extends EntityService ...@@ -46,6 +46,10 @@ export class {{pascalCase appEntity.codeName}}ServiceBase extends EntityService
{{! 非内置行为和非临时数据方法才输出 }} {{! 非内置行为和非临时数据方法才输出 }}
{{#if (and (eq builtinMethod false) (eq tempDataMode 0))}} {{#if (and (eq builtinMethod false) (eq tempDataMode 0))}}
{{#if (eq appEntity.psDEServiceAPI.nested true)}} {{#if (eq appEntity.psDEServiceAPI.nested true)}}
{{#or (eq methodType 'FETCH') (eq methodType 'SELECT')}}
{{> @macro/front-end/entity/service-nested-fetch-method.hbs singleAppMethod=singleAppMethod}}
{{/or}}
{{!-- todo嵌套行为补充 --}} {{!-- todo嵌套行为补充 --}}
{{else}} {{else}}
{{!-- todo 插件 --}} {{!-- todo 插件 --}}
......
import { ExpView, isExist } from '@core'; import { ExpView, isExist } from '@core';
import { deepCopy, hasFunction } from '@core/utils';
import { TabExpViewProps } from './tab-exp-view-prop'; import { TabExpViewProps } from './tab-exp-view-prop';
import { TabExpViewState } from './tab-exp-view-state'; import { TabExpViewState } from './tab-exp-view-state';
...@@ -17,12 +18,53 @@ export class TabExpView extends ExpView { ...@@ -17,12 +18,53 @@ export class TabExpView extends ExpView {
public declare state: TabExpViewState; public declare state: TabExpViewState;
/** /**
*【内置功能】提供通过viewparams里的srfDefaultPanel指定默认打开的分页的功能 * 视图输入参数
*
* @type {TabExpViewProps}
* @memberof TabExpView
*/
public declare props: TabExpViewProps;
/**
*【内置功能】提供通过viewparams里的srfdefaultpanel指定默认打开的分页的功能
*/ */
public useDefaultPanel() { public useDefaultPanel() {
const { srfDefaultPanel } = this.state.viewParams; const { srfdefaultpanel } = this.state.viewParams;
if (isExist(srfDefaultPanel)) { if (isExist(srfdefaultpanel)) {
this.state.defaultActivePanel = srfDefaultPanel; this.state.defaultActivePanel = srfdefaultpanel;
}
}
/**
* 使用加载模型模块
*
* @private
* @memberof TabExpView
*/
private useLoadModel() {
const { context, appEntityCodeName, appDeMajorFieldName } = this.state;
if (context && context[appEntityCodeName.toLowerCase()]) {
const tempContext = deepCopy(context);
// 从数据模式标识
if (tempContext.srfsessionid) {
tempContext.srfsessionkey = tempContext.srfsessionid;
delete tempContext.srfsessionid;
}
App.getDataService(appEntityCodeName.toLowerCase(), tempContext).then((service: any) => {
if (service && hasFunction(service, 'getDataInfo')) {
service.getDataInfo(tempContext, {}, false).then((response: any) => {
if (response && response.status === 200) {
this.state.viewCtx['viewGlobal'] = response.data;
// TODO 计算工具栏权限
if (appDeMajorFieldName && response.data[appDeMajorFieldName]) {
this.state.viewCaption += ` - ${response.data[appDeMajorFieldName]}`;
}
}
});
}
}).catch((error: any) => {
console.warn('获取实体服务异常');
});
} }
} }
...@@ -33,7 +75,8 @@ export class TabExpView extends ExpView { ...@@ -33,7 +75,8 @@ export class TabExpView extends ExpView {
*/ */
public moduleInstall() { public moduleInstall() {
const superParams = super.moduleInstall(); const superParams = super.moduleInstall();
this.useDefaultPanel() this.useDefaultPanel();
this.useLoadModel();
return { return {
...superParams, ...superParams,
}; };
......
...@@ -97,6 +97,24 @@ export class ViewBase { ...@@ -97,6 +97,24 @@ export class ViewBase {
} }
} }
/**
* 初始化视图操作参数
*
* @private
* @memberof ViewBase
*/
private initViewCtx() {
const { context, viewParams } = this.state;
const viewCtx = {
viewContext: context,
viewNavParams: viewParams,
view: this,
viewGlobal: {}
};
this.state.viewCtx = viewCtx;
}
/** /**
* @description 处理视图导航参数 * @description 处理视图导航参数
* *
...@@ -148,6 +166,7 @@ export class ViewBase { ...@@ -148,6 +166,7 @@ export class ViewBase {
const pageCustomViewParams = UIUtil.computedNavData(null, context.value, viewParams.value, appViewNavParams); const pageCustomViewParams = UIUtil.computedNavData(null, context.value, viewParams.value, appViewNavParams);
Object.assign(viewParams.value, pageCustomViewParams); Object.assign(viewParams.value, pageCustomViewParams);
} }
this.initViewCtx();
} }
/** /**
......
...@@ -43,6 +43,13 @@ export interface ViewStateBase { ...@@ -43,6 +43,13 @@ export interface ViewStateBase {
*/ */
viewSubject: Subject<IActionParam>; viewSubject: Subject<IActionParam>;
/**
* @description 视图操作参数
* @type {IParam}
* @memberof ViewStateBase
*/
viewCtx: IParam;
/** /**
* @description 是否显示标题栏 * @description 是否显示标题栏
* @type {boolean} * @type {boolean}
......
...@@ -28,4 +28,11 @@ export interface ControlPropsBase { ...@@ -28,4 +28,11 @@ export interface ControlPropsBase {
* @memberof ControlPropsBase * @memberof ControlPropsBase
*/ */
viewSubject: Subject<IActionParam>; viewSubject: Subject<IActionParam>;
/**
* @description 父部件(该部件上一层组件)
* @type {*}
* @memberof ControlPropsBase
*/
parent: any;
} }
\ No newline at end of file
...@@ -7,5 +7,11 @@ import { MainControlProps } from "@core"; ...@@ -7,5 +7,11 @@ import { MainControlProps } from "@core";
* @extends {MainControlProps} * @extends {MainControlProps}
*/ */
export interface TabViewPanelControlProps extends MainControlProps { export interface TabViewPanelControlProps extends MainControlProps {
/**
* 父视图,即分页导航视图
*
* @type {*}
* @memberof TabViewPanelControlProps
*/
parentView: any;
} }
\ No newline at end of file
...@@ -10,16 +10,41 @@ export interface TabViewPanelControlState extends MainControlState { ...@@ -10,16 +10,41 @@ export interface TabViewPanelControlState extends MainControlState {
/** /**
* 导航过滤项 * 导航过滤项
*
* @type {string}
* @memberof TabViewPanelControlState
*/ */
navFilter?:string; navFilter?:string;
/**
* 导航关系
*
* @type {IParam}
* @memberof TabViewPanelControlState
*/
navPSDer?: IParam;
/** /**
* 导航上下文集合 * 导航上下文集合
*
* @type {IParam}
* @memberof TabViewPanelControlState
*/ */
navContexts?:IParam; navContexts?:IParam;
/** /**
* 导航参数集合 * 导航参数集合
*
* @type {IParam}
* @memberof TabViewPanelControlState
*/ */
navParams?:IParam; navParams?:IParam;
/**
* 父视图,即分页导航视图
*
* @type {*}
* @memberof TabViewPanelControlState
*/
parentView: any;
} }
\ No newline at end of file
import { IActionParam, MainControl, UIUtil } from '@core'; import { IActionParam, MainControl, UIUtil, IParam, isExistAndNotEmpty } from '@core';
import { TabViewPanelControlProps } from './tab-view-panel-control-prop'; import { TabViewPanelControlProps } from './tab-view-panel-control-prop';
import { TabViewPanelControlState } from './tab-view-panel-control-state'; import { TabViewPanelControlState } from './tab-view-panel-control-state';
...@@ -16,6 +16,62 @@ export class TabViewPanelControl extends MainControl { ...@@ -16,6 +16,62 @@ export class TabViewPanelControl extends MainControl {
*/ */
public declare state: TabViewPanelControlState; public declare state: TabViewPanelControlState;
/**
* 部件输入参数
*
* @type {TabViewPanelControlProps}
* @memberof TabViewPanelControl
*/
public declare props: TabViewPanelControlProps;
/**
* 设置部件状态
*
* @memberof TabViewPanelControl
*/
public setState() {
super.setState();
this.state.parentView = this.props.parentView;
}
/**
* 处理导航数据
*
* @private
* @return {*}
* @memberof TabViewPanelControl
*/
private handleNavData() {
const { navPSDer, parentView } = this.state;
const { context, viewParams } = toRefs(this.state);
if (!parentView || !parentView.state || !navPSDer) {
return;
}
const data: IParam = parentView.state.viewCtx?.viewGlobal || {};
const getValue = (key: string) => {
if (isExistAndNotEmpty(data[key])) {
return data[key];
} else if (isExistAndNotEmpty(context.value[key])) {
return context.value[key];
} else if (isExistAndNotEmpty(viewParams.value[key])) {
return viewParams.value[key];
}
return null;
}
if (navPSDer.major && navPSDer.majorKey) {
const value = getValue(navPSDer.majorKey);
if (navPSDer.isMajor) {
if (value) {
Object.assign(context.value, { [navPSDer.major]: value });
}
} else {
if (value) {
Object.assign(viewParams.value, { [`n_${navPSDer.majorKey}_eq`]: value });
}
}
}
}
/** /**
* 支持导航参数的处理 * 支持导航参数的处理
* 监听props里的context和viewParams, * 监听props里的context和viewParams,
...@@ -24,31 +80,27 @@ export class TabViewPanelControl extends MainControl { ...@@ -24,31 +80,27 @@ export class TabViewPanelControl extends MainControl {
*/ */
public useNavParams() { public useNavParams() {
const { navContexts, navParams, navFilter, appDeCodeName } = this.state; const { navContexts, navParams, navFilter, appDeCodeName } = this.state;
// 处理导航数据
this.handleNavData();
const { context, viewParams } = toRefs(this.state); const { context, viewParams } = toRefs(this.state);
watch( // 处理导航过滤项
[context, viewParams], if(navFilter && appDeCodeName && context.value[appDeCodeName.toLowerCase()]){
(newValues: any[], prevValues: any[]) => { context.value[navFilter] = context.value[appDeCodeName.toLowerCase()];
// 处理导航过滤项 }
if(navFilter && appDeCodeName && this.state.context[appDeCodeName.toLowerCase()]){
this.state.context[navFilter] = this.state.context[appDeCodeName.toLowerCase()];
}
// 处理导航上下文 // 处理导航上下文
if (navContexts && Object.keys(navContexts).length > 0) { if (navContexts && Object.keys(navContexts).length > 0) {
const _context = UIUtil.computedNavData({}, this.state.context, this.state.viewParams, navContexts); const _context = UIUtil.computedNavData({}, context.value, viewParams.value, navContexts);
Object.assign(this.state.context, _context); Object.assign(context.value, _context);
} }
// 处理导航视图参数 // 处理导航视图参数
if (navParams && Object.keys(navParams).length > 0) { if (navParams && Object.keys(navParams).length > 0) {
const _param = UIUtil.computedNavData({}, this.state.context, this.state.viewParams, navParams); const _param = UIUtil.computedNavData({}, context.value, viewParams.value, navParams);
Object.assign(this.state.viewParams, _param); Object.assign(viewParams.value, _param);
} }
}, console.log(1111, this.state.context, this.state.viewParams);
{
immediate: true,
},
);
} }
/** /**
......
...@@ -39,7 +39,7 @@ export class GridService<T extends ControlVOBase> extends ControlServiceBase<T> ...@@ -39,7 +39,7 @@ export class GridService<T extends ControlVOBase> extends ControlServiceBase<T>
public async search(context: IParam, data: IParam, opts: { action: string; isLoading?: boolean }): Promise<any> { public async search(context: IParam, data: IParam, opts: { action: string; isLoading?: boolean }): Promise<any> {
let _entityService: any = this.entityService; let _entityService: any = this.entityService;
const { context: Context, data: Data } = this.handleRequestData(context, data, opts); const { context: Context, data: Data } = this.handleRequestData(context, data, opts);
const action = hasFunction(_entityService, opts.action) ? opts.action : 'GET'; const action = hasFunction(_entityService, opts.action) ? opts.action : 'FetchDefault';
const response = await _entityService[action](Context, Data, opts.isLoading); const response = await _entityService[action](Context, Data, opts.isLoading);
let resData:any[] = response.data; let resData:any[] = response.data;
for (let index = 0; index < resData.length; index++) { for (let index = 0; index < resData.length; index++) {
......
...@@ -38,7 +38,7 @@ export class ListService<T extends ControlVOBase> extends ControlServiceBase<T> ...@@ -38,7 +38,7 @@ export class ListService<T extends ControlVOBase> extends ControlServiceBase<T>
public async search(context: IParam, data: IParam, opts: { action: string; isLoading?: boolean }): Promise<any> { public async search(context: IParam, data: IParam, opts: { action: string; isLoading?: boolean }): Promise<any> {
let _entityService: any = this.entityService; let _entityService: any = this.entityService;
const { context: Context, data: Data } = this.handleRequestData(context, data, opts); const { context: Context, data: Data } = this.handleRequestData(context, data, opts);
const action = hasFunction(_entityService, opts.action) ? opts.action : 'GET'; const action = hasFunction(_entityService, opts.action) ? opts.action : 'FetchDefault';
const response = await _entityService[action](Context, Data, opts.isLoading); const response = await _entityService[action](Context, Data, opts.isLoading);
let resData: any[] = response.data; let resData: any[] = response.data;
for (let index = 0; index < resData.length; index++) { for (let index = 0; index < resData.length; index++) {
......
...@@ -153,4 +153,30 @@ export class EntityService { ...@@ -153,4 +153,30 @@ export class EntityService {
} }
/**
* 获取数据(实体类重写该方法实现)
*
* @protected
* @param {IContext} context 应用上下文
* @param {IParam} [data={}] 参数
* @return {*} {Promise<any>}
* @memberof EntityService
*/
protected Get(context: IContext, data: IParam = {}): Promise<any> {
return Promise.resolve({ ok: true, status: 200, data: data });
}
/**
* 获取数据信息
*
* @protected
* @param {IContext} context 应用上下文
* @param {IParam} data 参数
* @return {*} {Promise<any>}
* @memberof EntityService
*/
protected getDataInfo(context: IContext, data: IParam): Promise<any> {
return this.Get(context, data);
}
} }
\ No newline at end of file
...@@ -151,6 +151,9 @@ export class RouteUtil { ...@@ -151,6 +151,9 @@ export class RouteUtil {
curMatch++; curMatch++;
curRoutPath += `/${deResNode.pathName}/${notEmpty(value) ? value : 'undefined'}`; curRoutPath += `/${deResNode.pathName}/${notEmpty(value) ? value : 'undefined'}`;
} }
} else {
curMatch++;
curRoutPath += `/${deResNode.pathName}/${notEmpty(value) ? value : 'undefined'}`;
} }
}); });
...@@ -160,12 +163,6 @@ export class RouteUtil { ...@@ -160,12 +163,6 @@ export class RouteUtil {
routePath = curRoutPath; routePath = curRoutPath;
} }
}); });
// 如果一个匹配的没有,即没有任何主键匹配上,关系路径为实体自身的/pathName/undefined
if(routePath == ''){
routePath = "/"+deResPaths[deResPaths.length -1][0].pathName+"/undefined";
}
return routePath; return routePath;
} }
......
...@@ -36,7 +36,8 @@ interface CtrlEmit { ...@@ -36,7 +36,8 @@ interface CtrlEmit {
const emit = defineEmits <CtrlEmit> (); const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法 // 安装功能模块,提供状态和能力方法
const { name, state, onCtrlEvent } = new TabExpPanelControl(ctrlState, props, emit).moduleInstall(); const tabExpPanelControl = new TabExpPanelControl(ctrlState, props, emit).moduleInstall();
const { name, state, onCtrlEvent } = tabExpPanelControl;
// 暴露内部状态及能力 // 暴露内部状态及能力
defineExpose({ name, state }); defineExpose({ name, state });
...@@ -57,7 +58,8 @@ defineExpose({ name, state }); ...@@ -57,7 +58,8 @@ defineExpose({ name, state });
:context="state.context" :context="state.context"
:viewParams="state.viewParams" :viewParams="state.viewParams"
:viewSubject="state.viewSubject" :viewSubject="state.viewSubject"
:parent="parent" :parent="tabExpPanelControl"
:parentView="parent"
@onCtrlEvent="onCtrlEvent" @onCtrlEvent="onCtrlEvent"
/> />
</a-tab-pane> </a-tab-pane>
......
...@@ -3,6 +3,20 @@ export const ctrlState = { ...@@ -3,6 +3,20 @@ export const ctrlState = {
controlName: '{{ctrl.name}}', controlName: '{{ctrl.name}}',
appDeCodeName: '{{ctrl.psAppDataEntity.codeName}}', appDeCodeName: '{{ctrl.psAppDataEntity.codeName}}',
navFilter: "{{ctrl.navFilter}}", navFilter: "{{ctrl.navFilter}}",
{{#if ctrl.navPSDER}}
navPSDer: {
{{#if ctrl.navPSDER.minorCodeName}}
isMajor: false,
minorCodeName: '{{lowerCase ctrl.navPSDER.minorCodeName}}',
{{else}}
isMajor: true,
{{/if}}
{{#if ctrl.navPSDER.majorPSDataEntity}}
major: '{{lowerCase ctrl.navPSDER.majorPSDataEntity.codeName}}',
majorKey: '{{lowerCase ctrl.navPSDER.majorPSDataEntity.keyPSDEField.codeName}}'
{{/if}}
}
{{/if}}
{{#if ctrl.psNavigateContexts}} {{#if ctrl.psNavigateContexts}}
navContexts:{{> @macro/front-end/common/navparam.hbs appNavParams=ctrl.psNavigateContexts}}, navContexts:{{> @macro/front-end/common/navparam.hbs appNavParams=ctrl.psNavigateContexts}},
{{/if}} {{/if}}
......
...@@ -11,6 +11,10 @@ interface Props { ...@@ -11,6 +11,10 @@ interface Props {
viewParams?: IParam; viewParams?: IParam;
showBusyIndicator?: boolean; showBusyIndicator?: boolean;
viewSubject: Subject<IActionParam>; viewSubject: Subject<IActionParam>;
// 父部件,即分页导航面板
parent: any;
// 父视图,此处指向分页导航视图
parentView: any;
} }
const props = withDefaults(defineProps < Props > (), { const props = withDefaults(defineProps < Props > (), {
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册