提交 2f391f52 编写于 作者: sq3536's avatar sq3536

Merge remote-tracking branch 'origin/master'

......@@ -156,7 +156,7 @@
<dependency>
<groupId>net.ibizsys.model</groupId>
<artifactId>ibiz-model</artifactId>
<version>0.3.0</version>
<version>0.2.23</version>
<exclusions>
<exclusion>
<artifactId>slf4j-simple</artifactId>
......
......@@ -69,8 +69,13 @@ public class AppEntityModel extends BaseModel{
}
// 初始化界面行为
keyField = getAppDataEntity().getPSDataEntity().getKeyPSDEField().getCodeName();
majorField = getAppDataEntity().getPSDataEntity().getMajorPSDEField().getCodeName();
try {
keyField = getAppDataEntity().getPSDataEntity().getKeyPSDEField().getCodeName();
majorField = getAppDataEntity().getPSDataEntity().getMajorPSDEField().getCodeName();
}catch (Exception e){
}
if(getAppDataEntity().getAllPSAppDEUIActions() != null){
getAppDataEntity().getAllPSAppDEUIActions().forEach(appDEUIAction ->{
JSONObject actionJson = new JSONObject();
......
......@@ -113,7 +113,7 @@ public class ModelStorage {
CliOption opt = newCliOption(TemplateFileType.apiDto)
.setCliSubType(dto.getType())
.baseData(dto, dto.getCodeName())
.set("apiDtos", dto.getCodeName()).set("apis", dto.getApi().getCodeName().toLowerCase());
.set("apiDtos", dto.getCodeName()).set("apis", dto.getApi().getCodeName().toLowerCase()).set("modules",item.getEntity().getModule());
rt.addOption(opt);
});
});
......@@ -146,6 +146,14 @@ public class ModelStorage {
getSystemModel().getWorkflows().forEach(item -> {
CliOption opt = newCliOption(TemplateFileType.workflow)
.baseData(item, item.getCodeName().toString())
.set("wf",item.getWFVer().getWFCodeName());
rt.addOption(opt);
});
}
else if (type.equals(TemplateFileType.sysUtil)) {
getSystemModel().getSysUtils().forEach(item -> {
CliOption opt = newCliOption(TemplateFileType.sysUtil)
.baseData(item, item.getCodeName().toString());
rt.addOption(opt);
});
......
......@@ -9,9 +9,11 @@ import lombok.experimental.Accessors;
import net.ibizsys.model.app.view.IPSAppView;
import net.ibizsys.model.control.IPSControl;
import net.ibizsys.model.control.expbar.IPSExpBar;
import net.ibizsys.model.control.expbar.IPSTabExpPanel;
import net.ibizsys.model.control.toolbar.IPSDETBUIActionItem;
import net.ibizsys.model.control.toolbar.IPSDEToolbar;
import net.ibizsys.model.view.IPSUIAction;
import net.ibizsys.model.control.dashboard.IPSDashboard;
import java.util.*;
......@@ -48,9 +50,21 @@ public class PageModel extends BaseModel{
if(!this.ctrlsMap.containsKey(ctrl.getId())){
this.ctrlsMap.put(ctrl.getId(),ctrl);
}
String ctrlType = ctrl.getControl().getControlType();
// 树导航栏获取数据部件
if ("TREEEXPBAR".equals(ctrl.getControl().getControlType())) {
List<IPSControl> controls = ((IPSExpBar)item).getPSControls();
if ("TREEEXPBAR".equals(ctrlType) || "DASHBOARD".equals(ctrlType) || "TABEXPPANEL".equals(ctrlType)) {
List<IPSControl> controls = new ArrayList<>();
switch (ctrlType) {
case "TREEEXPBAR":
controls = ((IPSExpBar)item).getPSControls();
break;
case "DASHBOARD":
controls = ((IPSDashboard)item).getPSControls();
break;
case "TABEXPPANEL":
controls = ((IPSTabExpPanel)item).getPSControls();
break;
}
if (controls.size() > 0) {
for (IPSControl control : controls) {
CtrlModel ctrlModel = new CtrlModel(appModel, control);
......
package cn.ibizlab.codegen.model;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import net.ibizsys.model.res.IPSSysUtil;
import net.ibizsys.model.service.IPSSubSysServiceAPI;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
public class SysUtilModel extends BaseModel {
public SysUtilModel(IPSSysUtil ipsSysUtil) {
this.opt = ipsSysUtil;
this.setCodeName(ipsSysUtil.getCodeName());
this.setName(ipsSysUtil.getName());
}
}
......@@ -142,6 +142,26 @@ public class SystemModel extends BaseModel {
return getWorkflowsMap().values();
}
private Map<String, SysUtilModel> sysUtilModelMap;
public synchronized Map<String, SysUtilModel> getSysUtilModelMaps() {
if (sysUtilModelMap == null) {
try {
sysUtilModelMap = new LinkedHashMap<>();
getSystem().getAllPSSysUtils().forEach(iPSSysUtil -> {
sysUtilModelMap.put(iPSSysUtil.getCodeName(), new SysUtilModel(iPSSysUtil));
});
} catch (Exception e) {
}
}
return sysUtilModelMap;
}
public Collection<SysUtilModel> getSysUtils() {
return getSysUtilModelMaps().values();
}
public boolean isHasMsgTemplate() {
return !ObjectUtils.isEmpty(getSystem().getAllPSSysMsgTempls());
}
......
......@@ -10,6 +10,7 @@ import net.ibizsys.model.dataentity.action.IPSDEAction;
import net.ibizsys.model.dataentity.action.IPSDELogicAction;
import net.ibizsys.model.dataentity.action.IPSDEScriptAction;
import net.ibizsys.model.wf.*;
import org.springframework.util.CollectionUtils;
import org.springframework.util.DigestUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
......@@ -515,5 +516,23 @@ public class WorkflowModel extends BaseModel{
return fieldCond;
}
public List<IPSWFLink> getLinks() {
List<IPSWFLink> links = new ArrayList<>();
IPSWFProcess startProcess = getWFVer().getStartPSWFProcess();
getProcessLink(startProcess, links);
return links;
}
public void getProcessLink(IPSWFProcess process, List<IPSWFLink> links) {
List<IPSWFLink> processLinks = process.getPSWFLinks();
if(CollectionUtils.isEmpty(processLinks))
return ;
for (IPSWFLink link : processLinks) {
if(links.stream().anyMatch(l ->l.getId().equals(link.getId())))
continue;
links.add(link);
getProcessLink(link.getToPSWFProcess(), links);
}
}
}
......@@ -10,6 +10,7 @@ public enum TemplateFileType {
entity(Constants.ENTITIES),
module(Constants.MODULES),
workflow(Constants.WORKFLOWS),
sysUtil(Constants.SYSUTILS),
subService(Constants.SUB_SERVICEAPIS),
subEntity(Constants.SUB_ENTITIES),
api(Constants.APIS),
......@@ -52,6 +53,7 @@ public enum TemplateFileType {
public static final String APPS = "apps";
public static final String ENTITIES = "entities";
public static final String WORKFLOWS = "workflows";
public static final String SYSUTILS = "syUtils";
public static final String SUB_SERVICEAPIS = "subServiceApis";
public static final String SUB_ENTITIES = "subEntities";
public static final String API_ENTITIES = "apiEntities";
......
*volumes
*target
.settings
*node_modules
*bin
*.project
*.classpath
*.factorypath
.history
.vscode
.idea
**.iml
*.jar
*.log
.DS_Store
**.ibizlab-generator-ignore
**.DS_Store
**@macro/**
\ No newline at end of file
{{#eq _item.wFLinkType 'IAACTION'}}
#### {{_item.name}}{{#if (and (_item.parentModel) (or (and (eq _item.modelType "PSSYSTEM") (neq _item.parentModel.modelType "PSSYSTEM" )) (neq _item.parentModel.modelType _item.modelType) ) )}}@{{_item.parentModel.name}}{{/if}}
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if (and _item.name (neq _item.name ""))}}
|名称&nbsp;(name)|{{_item.name}}|&nbsp;|
{{/if}}
{{#if (and _item.logicName (neq _item.logicName ""))}}
|逻辑名称&nbsp;(logicName)|{{_item.logicName}}|&nbsp;|
{{/if}}
{{#if (and _item.userTag (neq _item.userTag ""))}}
|用户标记&nbsp;(userTag)|{{_item.userTag}}|&nbsp;|
{{/if}}
{{/eq}}
{{#each items as |_item|}}
{{> @macro/net.ibizsys.model.wf.IPSWFInteractiveLink.item.md.hbs _item=_item}}
{{/each}}
{{#each items as |_item|}}
{{> @macro/net.ibizsys.model.wf.IPSWFStartProcess.item.md.hbs _item=_item}}
{{/each}}
{{#eq _item.wFLinkType 'ROUTE'}}
#### {{_item.name}}
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if _item.name}}
|名称&nbsp;(name)|{{_item.name}}|&nbsp;|
{{/if}}
{{#if _item.logicName}}
|逻辑名称&nbsp;(logicName)|{{_item.logicName}}|&nbsp;|
{{/if}}
{{#if _item.userTag}}
|用户标记&nbsp;(userTag)|{{_item.userTag}}|&nbsp;|
{{/if}}
{{#if _item.userTag2}}
|用户标记2&nbsp;(userTag2)|{{_item.userTag2}}|&nbsp;|
{{/if}}
{{#if _item.userTag3}}
|用户标记3&nbsp;(userTag3)|{{_item.userTag3}}|&nbsp;|
{{/if}}
{{#if _item.userTag4}}
|用户标记4&nbsp;(userTag4)|{{_item.userTag4}}|&nbsp;|
{{/if}}
{{#if _item.userCat}}
|用户模型分类&nbsp;(userCat)|{{_item.userCat}}|&nbsp;|
{{/if}}
{{#if _item.autoModel}}
|自动产生模型&nbsp;(autoModel)|{{_item.autoModel}}|&nbsp;|
{{/if}}
{{#if _item.customCond}}
|自定义条件&nbsp;(customCond)|{{_item.customCond}}|&nbsp;|
{{/if}}
{{#if _item.formCodeName}}
|操作表单标记&nbsp;(formCodeName)|{{_item.formCodeName}}|&nbsp;|
{{/if}}
{{#if _item.fromPSWFProcess}}
|源流程处理&nbsp;(fromPSWFProcess)|{{_item.fromPSWFProcess.name}}|&nbsp;|
{{/if}}
{{#if _item.lNPSLanguageRes}}
|逻辑名称语言资源&nbsp;(lNPSLanguageRes)|{{_item.lNPSLanguageRes.name}}|&nbsp;|
{{/if}}
{{#if _item.mobFormCodeName}}
|移动端操作表单标记&nbsp;(mobFormCodeName)|{{_item.mobFormCodeName}}|&nbsp;|
{{/if}}
{{#if _item.mobViewCodeName}}
|移动端操作视图标记&nbsp;(mobViewCodeName)|{{_item.mobViewCodeName}}|&nbsp;|
{{/if}}
{{#if _item.nextCondition}}
|下一步条件&nbsp;(nextCondition)|{{_item.nextCondition}}|&nbsp;|
{{/if}}
{{#if _item.pSDynaModel}}
|动态模型对象&nbsp;(pSDynaModel)|{{_item.pSDynaModel.name}}|&nbsp;|
{{/if}}
{{#if _item.toPSWFProcess}}
|目标流程处理&nbsp;(toPSWFProcess)|{{_item.toPSWFProcess.name}}|&nbsp;|
{{/if}}
{{#if _item.userData}}
|连接数据&nbsp;(userData)|{{_item.userData}}|&nbsp;|
{{/if}}
{{#if _item.userData2}}
|连接数据2&nbsp;(userData2)|{{_item.userData2}}|&nbsp;|
{{/if}}
{{#if _item.viewCodeName}}
|操作视图标记&nbsp;(viewCodeName)|{{_item.viewCodeName}}|&nbsp;|
{{/if}}
{{#if _item.wFLinkType}}
|处理连接处理&nbsp;(wFLinkType)|{{item.wFLinkType}}&nbsp;({{_item.wFLinkType}})|&nbsp;|
{{/if}}
{{/eq}}
{{#eq _item.wFProcessType "START"}}
#### {{_item.name}}{{#if (and _item.parentModel (or (and (eq _item.modelType "PSSYSTEM") (neq _item.parentModel.modelType "PSSYSTEM")) (neq _item.parentModel.modelType _item.modelType)))}}@{{_item.parentModel.name}}{{/if}}
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if _item.name}}
|名称&nbsp;(name)|{{_item.name}}|&nbsp;|
{{/if}}
{{#if _item.codeName}}
|代码标识&nbsp;(codeName)|{{_item.codeName}}|&nbsp;|
{{/if}}
{{#if _item.logicName}}
|逻辑名称&nbsp;(logicName)|{{_item.logicName}}|&nbsp;|
{{/if}}
{{#if _item.userTag}}
|用户标记&nbsp;(userTag)|{{_item.userTag}}|&nbsp;|
{{/if}}
{{#if _item.userTag2}}
{{/if}}
{{#if _item.userTag3}}
|用户标记3&nbsp;(userTag3)|{{_item.userTag3}}|&nbsp;|
{{/if}}
{{#if _item.userTag4}}
{{/if}}
{{#if _item.userCat}}
|用户模型分类&nbsp;(userCat)|{{_item.userCat}}|&nbsp;|
{{/if}}
{{#if _item.autoModel}}
|自动产生模型&nbsp;(autoModel)|{{_item.autoModel}}|&nbsp;|
{{/if}}
{{#if _item.formCodeName}}
|操作表单标记&nbsp;(formCodeName)|{{_item.formCodeName}}|&nbsp;|
{{/if}}
{{#if _item.height}}
|高度&nbsp;(height)|{{_item.height}}|&nbsp;|
{{/if}}
{{#if _item.leftPos}}
|左侧位置&nbsp;(leftPos)|{{_item.leftPos}}|&nbsp;|
{{/if}}
{{#if _item.mobFormCodeName}}
|移动端操作表单标记&nbsp;(mobFormCodeName)|{{_item.mobFormCodeName}}|&nbsp;|
{{/if}}
{{#if _item.namePSLanguageRes}}
|名称语言资源&nbsp;(namePSLanguageRes)|{{_item.namePSLanguageRes.name}}|&nbsp;|
{{/if}}
{{#if _item.pSDynaModel}}
|动态模型对象&nbsp;(pSDynaModel)|{{_item.pSDynaModel.name}}|&nbsp;|
{{/if}}
{{#if _item.pSSysMsgTempl}}
|通知消息模板&nbsp;(pSSysMsgTempl)|{{_item.pSSysMsgTempl.name}}|&nbsp;|
{{/if}}
{{#if _item.pSWFWorkTime}}
|流程工作时间&nbsp;(pSWFWorkTime)|{{_item.pSWFWorkTime.name}}|&nbsp;|
{{/if}}
{{#if _item.timeout}}
|处理超时时长&nbsp;(timeout)|{{_item.timeout}}|&nbsp;|
{{/if}}
{{#if _item.timeoutField}}
|动态超时时长存放属性&nbsp;(timeoutField)|{{_item.timeoutField}}|&nbsp;|
{{/if}}
{{#if _item.timeoutType}}
|处理超时单位&nbsp;(timeoutType)|srfcodelist('WFTimeoutType', _item.timeoutType)&nbsp;({{_item.timeoutType}})|&nbsp;|
{{/if}}
{{#if _item.topPos}}
|上方位置&nbsp;(topPos)|{{_item.topPos}}|&nbsp;|
{{/if}}
{{#if _item.userData}}
|处理数据&nbsp;(userData)|{{_item.userData}}|&nbsp;|
{{/if}}
{{#if _item.userData2}}
|处理数据2&nbsp;(userData2)|{{_item.userData2}}|&nbsp;|
{{/if}}
{{#if _item.wFProcessType}}
|流程处理类型&nbsp;(wFProcessType)|srfcodelist('AllWFProcessType', _item.wFProcessType)&nbsp;({{_item.wFProcessType}})|&nbsp;|
{{/if}}
{{#if _item.wFStepValue}}
|流程步骤值&nbsp;(wFStepValue)|{{_item.wFStepValue}}|&nbsp;|
{{/if}}
{{#if _item.width}}
|宽度&nbsp;(width)|{{_item.width}}|&nbsp;|
{{/if}}
{{#if _item.asynchronousProcess}}
|异步处理&nbsp;(asynchronousProcess)|{{_item.asynchronousProcess}}|&nbsp;|
{{/if}}
{{#if _item.enableTimeout}}
|启用处理超时&nbsp;(enableTimeout)|{{_item.enableTimeout}}|&nbsp;|
{{/if}}
{{#if _item.startProcess}}
|开始处理&nbsp;(startProcess)|{{_item.startProcess}}|&nbsp;|
{{/if}}
*来源:getPSWFProcessParams*
{{#if _item.pSWFProcessParams}}
##### 处理参数集合
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
{{/if}}
{{/eq}}
<#comment>net.ibizsys.model.wf.IPSWFCallOrgActivityProcess</#comment>
<#if _item.getWFProcessType()=='CALLORGACTIVITY'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTargetPSWF()??>
|调用目标流程&nbsp;(getTargetPSWF)|<#if _item.getTargetPSWF().getRTMOSFilePath()?? &&_item.getTargetPSWF().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getTargetPSWF().getRTMOSFilePath()}">${_item.getTargetPSWF().getName()}</a><#else>${_item.getTargetPSWF().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
*来源:getPSWFProcessRoles*
<#if _item.getPSWFProcessRoles()?? && srflist(_item.getPSWFProcessRoles())?size gt 0>
##### 组织角色集合<#assign _items2 = _item.getPSWFProcessRoles()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessRole.list.md</#ibizinclude>
</#if>
</#if>
<#if _item.getWFProcessType()=='PROCESS'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getDEActionName()?? && _item.getDEActionName()?length gt 0>
|实体行为标识&nbsp;(dEActionName)|${_item.getDEActionName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDEAction()??>
|实体行为&nbsp;(getPSDEAction)|<#if _item.getPSDEAction().getRTMOSFilePath()?? &&_item.getPSDEAction().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDEAction().getRTMOSFilePath()}">${_item.getPSDEAction().getName()}</a><#else>${_item.getPSDEAction().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDEWF()??>
|实体工作流&nbsp;(getPSDEWF)|<#if _item.getPSDEWF().getRTMOSFilePath()?? &&_item.getPSDEWF().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDEWF().getRTMOSFilePath()}">${_item.getPSDEWF().getName()}</a><#else>${_item.getPSDEWF().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDataEntity()??>
|实体对象&nbsp;(getPSDataEntity)|<#if _item.getPSDataEntity().getRTMOSFilePath()?? &&_item.getPSDataEntity().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDataEntity().getRTMOSFilePath()}">${_item.getPSDataEntity().getName()}</a><#else>${_item.getPSDataEntity().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFEmbedWFProcess</#comment>
<#if _item.getWFProcessType()=='EMBED'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
*来源:getPSWFProcessSubWFs*
<#if _item.getPSWFProcessSubWFs()?? && srflist(_item.getPSWFProcessSubWFs())?size gt 0>
##### 嵌套流程集合<#assign _items2 = _item.getPSWFProcessSubWFs()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessSubWF.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFEndProcess</#comment>
<#if _item.getWFProcessType()=='END'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getExitStateValue()?? && _item.getExitStateValue()?length gt 0>
|结束状态值&nbsp;(exitStateValue)|${_item.getExitStateValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
<#if _item.isTerminalProcess()??>
|终止处理&nbsp;(terminalProcess)|${_item.isTerminalProcess()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFExclusiveGatewayProcess</#comment>
<#if _item.getWFProcessType()=='EXCLUSIVEGATEWAY'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFInclusiveGatewayProcess</#comment>
<#if _item.getWFProcessType()=='INCLUSIVEGATEWAY'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFInteractiveProcess</#comment>
<#if _item.getWFProcessType()=='INTERACTIVE'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getEditMode()??>
|编辑模式&nbsp;(editMode)|${srfcodelist('WFProcessEditMode', _item.getEditMode())}&nbsp;(${_item.getEditMode()?c})|&nbsp;|
</#if>
<#if _item.getFormCodeName()?? && _item.getFormCodeName()?length gt 0>
|操作表单标记&nbsp;(formCodeName)|${_item.getFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getMemoField()?? && _item.getMemoField()?length gt 0>
|处理意见字段&nbsp;(memoField)|${_item.getMemoField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobFormCodeName()?? && _item.getMobFormCodeName()?length gt 0>
|移动端操作表单标记&nbsp;(mobFormCodeName)|${_item.getMobFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUAGroupCodeName()?? && _item.getMobUAGroupCodeName()?length gt 0>
|移动端附加界面行为组标记&nbsp;(mobUAGroupCodeName)|${_item.getMobUAGroupCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil2FormCodeName()?? && _item.getMobUtil2FormCodeName()?length gt 0>
|移动端功能2操作表单标记&nbsp;(mobUtil2FormCodeName)|${_item.getMobUtil2FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil2FormName()?? && _item.getMobUtil2FormName()?length gt 0>
|移动端功能2操作表单名称&nbsp;(mobUtil2FormName)|${_item.getMobUtil2FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil3FormCodeName()?? && _item.getMobUtil3FormCodeName()?length gt 0>
|移动端功能3操作表单标记&nbsp;(mobUtil3FormCodeName)|${_item.getMobUtil3FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil3FormName()?? && _item.getMobUtil3FormName()?length gt 0>
|移动端功能3操作表单名称&nbsp;(mobUtil3FormName)|${_item.getMobUtil3FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil4FormCodeName()?? && _item.getMobUtil4FormCodeName()?length gt 0>
|移动端功能4操作表单标记&nbsp;(mobUtil4FormCodeName)|${_item.getMobUtil4FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil4FormName()?? && _item.getMobUtil4FormName()?length gt 0>
|移动端功能4操作表单名称&nbsp;(mobUtil4FormName)|${_item.getMobUtil4FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil5FormCodeName()?? && _item.getMobUtil5FormCodeName()?length gt 0>
|移动端功能5操作表单标记&nbsp;(mobUtil5FormCodeName)|${_item.getMobUtil5FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtil5FormName()?? && _item.getMobUtil5FormName()?length gt 0>
|移动端功能5操作表单名称&nbsp;(mobUtil5FormName)|${_item.getMobUtil5FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtilFormCodeName()?? && _item.getMobUtilFormCodeName()?length gt 0>
|移动端功能操作表单标记&nbsp;(mobUtilFormCodeName)|${_item.getMobUtilFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMobUtilFormName()?? && _item.getMobUtilFormName()?length gt 0>
|移动端功能操作表单名称&nbsp;(mobUtilFormName)|${_item.getMobUtilFormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getMsgType()??>
|发送通知类型&nbsp;(msgType)|${srfcodelist('WFInfomMsgType', _item.getMsgType())}&nbsp;(${_item.getMsgType()?c})|&nbsp;|
</#if>
<#if _item.getMultiInstMode()?? && _item.getMultiInstMode()?length gt 0>
|多实例模式&nbsp;(multiInstMode)|${srfcodelist('WFProcMultiInstMode', _item.getMultiInstMode())}&nbsp;(${_item.getMultiInstMode()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUAGroupCodeName()?? && _item.getUAGroupCodeName()?length gt 0>
|附加界面行为组标记&nbsp;(uAGroupCodeName)|${_item.getUAGroupCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil2FormCodeName()?? && _item.getUtil2FormCodeName()?length gt 0>
|功能2操作表单标记&nbsp;(util2FormCodeName)|${_item.getUtil2FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil2FormName()?? && _item.getUtil2FormName()?length gt 0>
|功能2操作表单名称&nbsp;(util2FormName)|${_item.getUtil2FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil3FormCodeName()?? && _item.getUtil3FormCodeName()?length gt 0>
|功能3操作表单标记&nbsp;(util3FormCodeName)|${_item.getUtil3FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil3FormName()?? && _item.getUtil3FormName()?length gt 0>
|功能3操作表单名称&nbsp;(util3FormName)|${_item.getUtil3FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil4FormCodeName()?? && _item.getUtil4FormCodeName()?length gt 0>
|功能4操作表单标记&nbsp;(util4FormCodeName)|${_item.getUtil4FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil4FormName()?? && _item.getUtil4FormName()?length gt 0>
|功能4操作表单名称&nbsp;(util4FormName)|${_item.getUtil4FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil5FormCodeName()?? && _item.getUtil5FormCodeName()?length gt 0>
|功能5操作表单标记&nbsp;(util5FormCodeName)|${_item.getUtil5FormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtil5FormName()?? && _item.getUtil5FormName()?length gt 0>
|功能5操作表单名称&nbsp;(util5FormName)|${_item.getUtil5FormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtilFormCodeName()?? && _item.getUtilFormCodeName()?length gt 0>
|功能操作表单标记&nbsp;(utilFormCodeName)|${_item.getUtilFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUtilFormName()?? && _item.getUtilFormName()?length gt 0>
|功能操作表单名称&nbsp;(utilFormName)|${_item.getUtilFormName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEditable()??>
|支持编辑&nbsp;(editable)|${_item.isEditable()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
<#if _item.isSendInform()??>
|发送通知&nbsp;(sendInform)|${_item.isSendInform()?c}|&nbsp;|
</#if>
*来源:getEditFields*
<#if _item.getEditFields()?? && srflist(_item.getEditFields())?size gt 0>
##### 编辑相关属性<#list _item.getEditFields() as x2>
<#if x2_index gt 0></#if>${x2}
</#list>
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
*来源:getPSWFProcessRoles*
<#if _item.getPSWFProcessRoles()?? && srflist(_item.getPSWFProcessRoles())?size gt 0>
##### 交互处理角色集合<#assign _items2 = _item.getPSWFProcessRoles()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessRole.list.md</#ibizinclude>
</#if>
*来源:getPredefinedActions*
<#if _item.getPredefinedActions()?? && srflist(_item.getPredefinedActions())?size gt 0>
##### 预定义行为<#list _item.getPredefinedActions() as x2>
<#if x2_index gt 0></#if>${x2}
</#list>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFParallelGatewayProcess</#comment>
<#if _item.getWFProcessType()=='PARALLELGATEWAY'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFParallelSubWFProcess</#comment>
<#if _item.getWFProcessType()=='PARALLEL'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
*来源:getPSWFProcessSubWFs*
<#if _item.getPSWFProcessSubWFs()?? && srflist(_item.getPSWFProcessSubWFs())?size gt 0>
##### 嵌套流程集合<#assign _items2 = _item.getPSWFProcessSubWFs()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessSubWF.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFProcess</#comment>
<#if _item.getWFProcessType()!='END' && _item.getWFProcessType()!='START'&& _item.getWFProcessType()!='PROCESS'&& _item.getWFProcessType()!='CALLORGACTIVITY'&& _item.getWFProcessType()!='EMBED'&& _item.getWFProcessType()!='EXCLUSIVEGATEWAY'&& _item.getWFProcessType()!='INCLUSIVEGATEWAY'&& _item.getWFProcessType()!='INTERACTIVE'&& _item.getWFProcessType()!='PARALLELGATEWAY'&& _item.getWFProcessType()!='PARALLEL'&& _item.getWFProcessType()!='TIMEREVENT'&& _item.getWFProcessType()!='END'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFProcessParam</#comment>
###### ${_item2.getName()}
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item2.getName()?? && _item2.getName()?length gt 0>
|名称&nbsp;(name)|${_item2.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserTag()?? && _item2.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item2.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserTag2()?? && _item2.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item2.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserTag3()?? && _item2.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item2.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserTag4()?? && _item2.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item2.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserCat()?? && _item2.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item2.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.isAutoModel() && _item2.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item2.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item2.getDstField()?? && _item2.getDstField()?length gt 0>
|目标属性&nbsp;(dstField)|${_item2.getDstField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item2.getPSDynaModel().getRTMOSFilePath()?? &&_item2.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item2.getPSDynaModel().getRTMOSFilePath()}">${_item2.getPSDynaModel().getName()}</a><#else>${_item2.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item2.getPSWFProcess()??>
|流程处理&nbsp;(getPSWFProcess)|<#if _item2.getPSWFProcess().getRTMOSFilePath()?? &&_item2.getPSWFProcess().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item2.getPSWFProcess().getRTMOSFilePath()}">${_item2.getPSWFProcess().getName()}</a><#else>${_item2.getPSWFProcess().getName()}</#if>|&nbsp;|
</#if>
<#if _item2.getSrcValue()?? && _item2.getSrcValue()?length gt 0>
|源值&nbsp;(srcValue)|${_item2.getSrcValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getSrcValueType()?? && _item2.getSrcValueType()?length gt 0>
|源值类型&nbsp;(srcValueType)|${_item2.getSrcValueType()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserData()?? && _item2.getUserData()?length gt 0>
|处理角色数据&nbsp;(userData)|${_item2.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item2.getUserData2()?? && _item2.getUserData2()?length gt 0>
|处理角色数据2&nbsp;(userData2)|${_item2.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
{{#eq _item.wFLinkType 'IAACTION'}}
#### {{_item.name}}
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if _item.name}}
|名称&nbsp;(name)|{{_item.name}}|&nbsp;|
{{/if}}
{{#if _item.logicName}}
|逻辑名称&nbsp;(logicName)|{{_item.logicName}}|&nbsp;|
{{/if}}
{{#if _item.userTag}}
|用户标记&nbsp;(userTag)|{{_item.userTag}}|&nbsp;|
{{/if}}
{{#if _item.userTag2}}
|用户标记2&nbsp;(userTag2)|{{_item.userTag2}}|&nbsp;|
{{/if}}
{{#if _item.userTag3}}
|用户标记3&nbsp;(userTag3)|{{_item.userTag3}}|&nbsp;|
{{/if}}
{{#if _item.userTag4}}
|用户标记4&nbsp;(userTag4)|{{_item.userTag4}}|&nbsp;|
{{/if}}
{{#if _item.userCat}}
|用户模型分类&nbsp;(userCat)|{{_item.userCat}}|&nbsp;|
{{/if}}
{{#if _item.autoModel}}
|自动产生模型&nbsp;(autoModel)|{{_item.autoModel}}|&nbsp;|
{{/if}}
{{#if _item.customCond}}
|自定义条件&nbsp;(customCond)|{{_item.customCond}}|&nbsp;|
{{/if}}
{{#if _item.formCodeName}}
|操作表单标记&nbsp;(formCodeName)|{{_item.formCodeName}}|&nbsp;|
{{/if}}
{{#if _item.fromPSWFProcess}}
|源流程处理&nbsp;(fromPSWFProcess)|{{_item.fromPSWFProcess.name}}|&nbsp;|
{{/if}}
{{#if _item.lNPSLanguageRes}}
|逻辑名称语言资源&nbsp;(lNPSLanguageRes)|{{_item.lNPSLanguageRes.name}}|&nbsp;|
{{/if}}
{{#if _item.mobFormCodeName}}
|移动端操作表单标记&nbsp;(mobFormCodeName)|{{_item.mobFormCodeName}}|&nbsp;|
{{/if}}
{{#if _item.mobViewCodeName}}
|移动端操作视图标记&nbsp;(mobViewCodeName)|{{_item.mobViewCodeName}}|&nbsp;|
{{/if}}
{{#if _item.nextCondition}}
|下一步条件&nbsp;(nextCondition)|{{_item.nextCondition}}|&nbsp;|
{{/if}}
{{#if _item.pSDynaModel}}
|动态模型对象&nbsp;(pSDynaModel)|{{_item.pSDynaModel.name}}|&nbsp;|
{{/if}}
{{#if _item.toPSWFProcess}}
|目标流程处理&nbsp;(toPSWFProcess)|{{_item.toPSWFProcess.name}}|&nbsp;|
{{/if}}
{{#if _item.userData}}
|连接数据&nbsp;(userData)|{{_item.userData}}|&nbsp;|
{{/if}}
{{#if _item.userData2}}
|连接数据2&nbsp;(userData2)|{{_item.userData2}}|&nbsp;|
{{/if}}
{{#if _item.viewCodeName}}
|操作视图标记&nbsp;(viewCodeName)|{{_item.viewCodeName}}|&nbsp;|
{{/if}}
{{#if _item.wFLinkType}}
|处理连接处理&nbsp;(wFLinkType)|{{item.wFLinkType}}&nbsp;({{_item.wFLinkType}})|&nbsp;|
{{/if}}
{{/eq}}
<#comment>net.ibizsys.model.wf.IPSWFStartProcess</#comment>
<#if _item.getWFProcessType()=='START'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getFormCodeName()?? && _item.getFormCodeName()?length gt 0>
|操作表单标记&nbsp;(formCodeName)|${_item.getFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getMobFormCodeName()?? && _item.getMobFormCodeName()?length gt 0>
|移动端操作表单标记&nbsp;(mobFormCodeName)|${_item.getMobFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
<#if _item.isStartProcess()??>
|开始处理&nbsp;(startProcess)|${_item.isStartProcess()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFTimerEventProcess</#comment>
<#if _item.getWFProcessType()=='TIMEREVENT'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFStartProcess</#comment>
<#if _item.getWFProcessType()=='START'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getFormCodeName()?? && _item.getFormCodeName()?length gt 0>
|操作表单标记&nbsp;(formCodeName)|${_item.getFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getMobFormCodeName()?? && _item.getMobFormCodeName()?length gt 0>
|移动端操作表单标记&nbsp;(mobFormCodeName)|${_item.getMobFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
<#if _item.isStartProcess()??>
|开始处理&nbsp;(startProcess)|${_item.isStartProcess()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
<#comment>net.ibizsys.model.wf.IPSWFStartProcess</#comment>
<#if _item.getWFProcessType()=='START'>
#### ${_item.getName()}<#if _item.getParentModel()?? && ((item.getModelType() == 'PSSYSTEM' && _item.getParentModel().getModelType()!='PSSYSTEM')||(_item.getParentModel().getModelType() != item.getModelType()))>@${_item.getParentModel().name}</#if>
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
<#if _item.getName()?? && _item.getName()?length gt 0>
|名称&nbsp;(name)|${_item.getName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getCodeName()?? && _item.getCodeName()?length gt 0>
|代码标识&nbsp;(codeName)|${_item.getCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getLogicName()?? && _item.getLogicName()?length gt 0>
|逻辑名称&nbsp;(logicName)|${_item.getLogicName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag()?? && _item.getUserTag()?length gt 0>
|用户标记&nbsp;(userTag)|${_item.getUserTag()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag2()?? && _item.getUserTag2()?length gt 0>
|用户标记2&nbsp;(userTag2)|${_item.getUserTag2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag3()?? && _item.getUserTag3()?length gt 0>
|用户标记3&nbsp;(userTag3)|${_item.getUserTag3()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserTag4()?? && _item.getUserTag4()?length gt 0>
|用户标记4&nbsp;(userTag4)|${_item.getUserTag4()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserCat()?? && _item.getUserCat()?length gt 0>
|用户模型分类&nbsp;(userCat)|${_item.getUserCat()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.isAutoModel() && _item.isAutoModel()??>
|自动产生模型&nbsp;(autoModel)|${_item.isAutoModel()?c}|&nbsp;|
</#if>
<#if _item.getFormCodeName()?? && _item.getFormCodeName()?length gt 0>
|操作表单标记&nbsp;(formCodeName)|${_item.getFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getHeight()??>
|高度&nbsp;(height)|${_item.getHeight()?c}|&nbsp;|
</#if>
<#if _item.getLeftPos()??>
|左侧位置&nbsp;(leftPos)|${_item.getLeftPos()?c}|&nbsp;|
</#if>
<#if _item.getMobFormCodeName()?? && _item.getMobFormCodeName()?length gt 0>
|移动端操作表单标记&nbsp;(mobFormCodeName)|${_item.getMobFormCodeName()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getNamePSLanguageRes()??>
|名称语言资源&nbsp;(getNamePSLanguageRes)|<#if _item.getNamePSLanguageRes().getRTMOSFilePath()?? &&_item.getNamePSLanguageRes().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getNamePSLanguageRes().getRTMOSFilePath()}">${_item.getNamePSLanguageRes().getName()}</a><#else>${_item.getNamePSLanguageRes().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSDynaModel()??>
|动态模型对象&nbsp;(getPSDynaModel)|<#if _item.getPSDynaModel().getRTMOSFilePath()?? &&_item.getPSDynaModel().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSDynaModel().getRTMOSFilePath()}">${_item.getPSDynaModel().getName()}</a><#else>${_item.getPSDynaModel().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSSysMsgTempl()??>
|通知消息模板&nbsp;(getPSSysMsgTempl)|<#if _item.getPSSysMsgTempl().getRTMOSFilePath()?? &&_item.getPSSysMsgTempl().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSSysMsgTempl().getRTMOSFilePath()}">${_item.getPSSysMsgTempl().getName()}</a><#else>${_item.getPSSysMsgTempl().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getPSWFWorkTime()??>
|流程工作时间&nbsp;(getPSWFWorkTime)|<#if _item.getPSWFWorkTime().getRTMOSFilePath()?? &&_item.getPSWFWorkTime().getRTMOSFilePath()?length gt 0><a href="${_prepath}${_item.getPSWFWorkTime().getRTMOSFilePath()}">${_item.getPSWFWorkTime().getName()}</a><#else>${_item.getPSWFWorkTime().getName()}</#if>|&nbsp;|
</#if>
<#if _item.getTimeout()??>
|处理超时时长&nbsp;(timeout)|${_item.getTimeout()?c}|&nbsp;|
</#if>
<#if _item.getTimeoutField()?? && _item.getTimeoutField()?length gt 0>
|动态超时时长存放属性&nbsp;(timeoutField)|${_item.getTimeoutField()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getTimeoutType()?? && _item.getTimeoutType()?length gt 0>
|处理超时单位&nbsp;(timeoutType)|${srfcodelist('WFTimeoutType', _item.getTimeoutType())}&nbsp;(${_item.getTimeoutType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getTopPos()??>
|上方位置&nbsp;(topPos)|${_item.getTopPos()?c}|&nbsp;|
</#if>
<#if _item.getUserData()?? && _item.getUserData()?length gt 0>
|处理数据&nbsp;(userData)|${_item.getUserData()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getUserData2()?? && _item.getUserData2()?length gt 0>
|处理数据2&nbsp;(userData2)|${_item.getUserData2()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWFProcessType()?? && _item.getWFProcessType()?length gt 0>
|流程处理类型&nbsp;(wFProcessType)|${srfcodelist('AllWFProcessType', _item.getWFProcessType())}&nbsp;(${_item.getWFProcessType()?replace('
','<BR>')?replace('
','<BR>')})|&nbsp;|
</#if>
<#if _item.getWFStepValue()?? && _item.getWFStepValue()?length gt 0>
|流程步骤值&nbsp;(wFStepValue)|${_item.getWFStepValue()?replace('
','<BR>')?replace('
','<BR>')}|&nbsp;|
</#if>
<#if _item.getWidth()??>
|宽度&nbsp;(width)|${_item.getWidth()?c}|&nbsp;|
</#if>
<#if _item.isAsynchronousProcess()??>
|异步处理&nbsp;(asynchronousProcess)|${_item.isAsynchronousProcess()?c}|&nbsp;|
</#if>
<#if _item.isEnableTimeout()??>
|启用处理超时&nbsp;(enableTimeout)|${_item.isEnableTimeout()?c}|&nbsp;|
</#if>
<#if _item.isStartProcess()??>
|开始处理&nbsp;(startProcess)|${_item.isStartProcess()?c}|&nbsp;|
</#if>
*来源:getPSWFProcessParams*
<#if _item.getPSWFProcessParams()?? && srflist(_item.getPSWFProcessParams())?size gt 0>
##### 处理参数集合<#assign _items2 = _item.getPSWFProcessParams()>
<#ibizinclude>../TEMPL/net.ibizsys.model.wf.IPSWFProcessParam.list.md</#ibizinclude>
</#if>
</#if>
# {{system.logicName}}
## 基本
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
|名称&nbsp;(name)|{{system.name}}|&nbsp;|
|代码标识&nbsp;(codeName)|{{system.codeName}}|&nbsp;|
|逻辑名称&nbsp;(logicName)|{{system.logicName}}|&nbsp;|
## 工作流集合
|名称|版本|代码标识|说明|
|-------------------|:-------------------|:-------------------|:-------------------|
{{#each system.workflows}}
|<a href="#/{{wFCodeName}}/{{codeName}}">{{name}}</a>|{{wFVersion}}|{{codeName}}|&nbsp;|
{{/each}}
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{system.logicName}}</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/@fortawesome/fontawesome-free/css/fontawesome.css"/>
<link rel="stylesheet" href="//unpkg.com/@fortawesome/fontawesome-free/css/brands.css"/>
<link rel="stylesheet" href="//unpkg.com/@fortawesome/fontawesome-free/css/regular.css"/>
<link rel="stylesheet" href="//unpkg.com/@fortawesome/fontawesome-free/css/solid.css"/>
<!-- Theme -->
<!-- //jhildenbiddle.github.io/docsify-themeable -->
<!-- Theme: Simple Dark -->
<!-- <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple-dark.css"> -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/@sujaykumarh/docsify-plugin-footer@1.x/dist/plugin.min.css">
<link rel="stylesheet" href="//unpkg.com/@markbattistella/docsify-charty@latest/dist/docsify-charty.min.css">
</head>
<style>
:root {
--content-max-width: 55em;
}
.content {
padding-top: 0px;
}
</style>
<body>
<div id="app"></div>
<script>
window.$docsify = {
// routerMode: 'history',
// crossOriginLinks: ['http://cdn.jsdelivr.net','http://172.16.100.202','http://demo.ibizlab.cn'],
loadNavbar: true,
loadNavbar: 'navbar.md',
// loadSidebar: true,
// loadSidebar: 'sidebar.md',
repo: '{{system.pSSVNInstRepo.gitPath}}',
auto2top: true,
themeable: {
readyTransition: true,
responsiveTables: true
},
plantuml: {
skin: 'classic',
renderSvgAsObject: true,
serverPath: "http://172.16.240.229:8080/svg/"
},
tabs: {
theme: "material",
sync: false,
},
copyCode: {
buttonText: '复制到剪贴板',
errorText: '错误',
successText: '已复制'
},
progress: {
position: "top",
color: "var(--theme-color,#42b983)",
height: "2px",
},
customPageFooter: {
showPoweredBy: false,
showCopyright: true,
copyright: '<div class="copyright"><span>XXXX </span> <span>Copyright @2021 ibizsys.cn</span> <span>X</span></div>',
useLocalStorage: false,
},
}
</script>
<!-- Docsify v4 -->
<script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
<!-- docsify-themeable (latest v0.x.x) -->
<!-- <script src="//cdn.jsdelivr.net/npm/docsify-themeable@0/dist/js/docsify-themeable.min.js"></script> -->
<script src="//cdn.jsdelivr.net/npm/prismjs@1.25.0/components/prism-java.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.25.0/components/prism-sql.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.25.0/components/prism-git.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.25.0/components/prism-json.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.25.0/components/prism-yaml.min.js"></script>
<!-- tabs -->
<script src="//cdn.jsdelivr.net/npm/docsify-tabs@1"></script>
<!-- copy code -->
<script src="//unpkg.com/docsify-copy-code@2"></script>
<!-- plantuml -->
<script src="//unpkg.com/docsify-plantuml/dist/docsify-plantuml.min.js"></script>
<!-- progress -->
<script src="//cdn.jsdelivr.net/npm/docsify-progress@latest/dist/progress.min.js"></script>
<!-- charty -->
<script src="//unpkg.com/@markbattistella/docsify-charty@latest/dist/docsify-charty.min.js"></script>
<!-- footer -->
<script src="//cdn.jsdelivr.net/npm/@sujaykumarh/docsify-plugin-footer@1.x/dist/plugin.min.js"></script>
<!-- glossary -->
<script src="//unpkg.com/docsify-glossary/dist/docsify-glossary.min.js"></script>
<!-- fontawesome -->
<script src="//unpkg.com/docsify-fontawesome/dist/docsify-fontawesome.min.js"></script>
<!-- example -->
<script src="//cdn.jsdelivr.net/npm/docsify-example-panels"></script>
</body>
</html>
\ No newline at end of file
- [iBiz MosDynamic](http://studio.ibizmodeling.cn/mosdynamictool/mos-dynamic-mgr/#/mosdynamicmgr/${sys.getPubSystemId()} "iBiz MosDynamic")
- [MeterSphere](http://172.16.240.229:8081)
\ No newline at end of file
# {{workflow.name}}
*对象:net.ibizsys.model.wf.IPSWFVersion
## 基本
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
|名称&nbsp;(name)|{{workflow.name}}|&nbsp;|
|版本&nbsp;(wFVersion)|{{workflow.wFVersion}}|&nbsp;|
|代码标识&nbsp;(codeName)|{{workflow.codeName}}|&nbsp;|
{{#if workflow.links}}
```plantuml
@startuml
!theme plain
hide footbox
{{#each workflow.links}}
{{#eq fromPSWFProcess.wFProcessType "START"}}(*){{/eq}}{{#neq fromPSWFProcess.wFProcessType "START"}}"{{fromPSWFProcess.name}}"{{/neq}} --> [{{#if logicName}}{{logicName}}{{/if}}{{#unless logicName}}{{name}}{{/unless}}]{{#eq toPSWFProcess.wFProcessType "END"}}(*){{/eq}}{{#neq toPSWFProcess.wFProcessType "END"}}"{{toPSWFProcess.name}}"{{/neq}}
{{/each}}
@enduml
```
{{/if}}
## 逻辑
### 流程处理集合
*来源:getPSWFProcesses*
{{#if workflow.pSWFProcesses}}
{{> @macro/net.ibizsys.model.wf.IPSWFProcess.list.md.hbs items=workflow.pSWFProcesses}}
{{else}}
*(无数据)*
{{/if}}
### 流程连接集合
*来源:getPSWFLinks*
{{#if workflow.pSWFLinks}}
{{> @macro/net.ibizsys.model.wf.IPSWFLink.list.md.hbs items=workflow.pSWFLinks}}
{{else}}
*(无数据)*
{{/if}}
## 用户扩展
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if workflow.userTag}}
|用户标记&nbsp;(userTag)|{{workflow.userTag}}|&nbsp;|
{{/if}}
{{#if workflow.userTag2}}
|用户标记2&nbsp;(userTag2)|{{workflow.userTag2}}|&nbsp;|
{{/if}}
{{#if workflow.userTag3}}
|用户标记3&nbsp;(userTag3)|{{workflow.userTag3}}|&nbsp;|
{{/if}}
{{#if workflow.userTag4}}
|用户标记4&nbsp;(userTag4)|{{workflow.userTag4}}|&nbsp;|
{{/if}}
{{#if workflow.userCat}}
|用户模型分类&nbsp;(userCat)|{{workflow.userCat}}|&nbsp;|
{{/if}}
## 其它
| 项 |值 |说明 |
|-------------------|:---------------------|:------------------------|
{{#if workflow.autoModel}}
|自动产生模型&nbsp;(autoModel)|{{workflow.autoModel}}|&nbsp;|
{{/if}}
{{#if workflow.dynaInstMode}}
|动态实例模式&nbsp;(dynaInstMode)|{{workflow.dynaInstMode}}|&nbsp;|
{{/if}}
{{#if workflow.dynaInstTag}}
|动态实例标记&nbsp;(dynaInstTag)|{{workflow.dynaInstTag}}|&nbsp;|
{{/if}}
{{#if workflow.dynaInstTag2}}
|动态实例标记2&nbsp;(dynaInstTag2)|{{workflow.dynaInstTag2}}|&nbsp;|
{{/if}}
{{#if workflow.pSDynaModel}}
|动态模型对象&nbsp;(getPSDynaModel)|{{workflow.pSDynaModel.name}}|&nbsp;|
{{/if}}
{{#if workflow.pSWorkflow}}
|工作流&nbsp;(getPSWorkflow)|{{workflow.pSWorkflow.name}}|&nbsp;|
{{/if}}
{{#if workflow.startPSWFProcess}}
|开始处理&nbsp;(getStartPSWFProcess)|{{workflow.startPSWFProcess.name}}|&nbsp;|
{{/if}}
{{#if workflow.wFCodeName}}
|工作流代码标识&nbsp;(wFCodeName)|{{workflow.wFCodeName}}|&nbsp;|
{{/if}}
{{#if workflow.wFMode}}
|流程模式&nbsp;(wFMode)|{{workflow.wFMode}}|&nbsp;|
{{/if}}
{{#if workflow.wFStepPSCodeList}}
|流程步骤代码表&nbsp;(getWFStepPSCodeList)|{{workflow.wFStepPSCodeList.name}}|&nbsp;|
{{/if}}
{{#if workflow.mobStartView}}
|有移动端流程启动视图&nbsp;(hasMobStartView)|{{workflow.mobStartView}}|&nbsp;|
{{/if}}
{{#if workflow.startView}}
|有流程启动视图&nbsp;(hasStartView)|{{workflow.startView}}|&nbsp;|
{{/if}}
{{#if workflow.valid}}
|是否启用&nbsp;(valid)|{{workflow.valid}}|&nbsp;|
{{/if}}
## 模型
```yaml
{srfjson2yaml(workflow.getModel().toString())}
```
\ No newline at end of file
{{#*inline "PORTLET"}}{{>@macro/front-end/widgets/dashboard-detail/portlet.hbs}}{{/inline}}
\ No newline at end of file
{{#eq ctrl.psLayout.layout "FLEX"}}
<div class="app-dashboard-layout-flex" style="{{#if ctrl.psLayout.dir}}flex-direction: {{ctrl.psLayout.dir}};{{/if}}{{#if ctrl.psLayout.align}}justify-content: {{ctrl.psLayout.align}};{{/if}}{{#if ctrl.psLayout.vAlign}}align-items: {{ctrl.psLayout.vAlign}};{{/if}}">
</div>
{{else}}
<a-row class="app-dashboard-layout-table">
{{#each ctrl.PSControls as | portlet | }}
<a-col
{{> @macro/front-end/widgets/common/layout-pos.hbs item=portlet.psLayoutPos}} >
{{#eq portlet.portletType 'CONTAINER'}}
{{#if portlet.PSControls}}
<div class="portlet-card" :bordered="false" dis-hover :padding="0">
{{else}}
<div class="portlet-card custom-card" :bordered="false" dis-hover :padding="10">
{{/if}}
{{#if (and portlet.showTitleBar portlet.title)}}
<div class="portlet-card-title">\{{portlet.title}}</div>
{{/if}}
</div>
{{/if}}
</div>
{{/eq}}
</a-col>
{{/each}}
</a-row>
{{/eq}}
\ No newline at end of file
......@@ -4,7 +4,54 @@
declare module 'vue' {
export interface GlobalComponents {
404: typeof import('./src/components/common/404.vue')['default']
AppAutoComplete: typeof import('./src/components/editors/app-auto-complete.vue')['default']
AppCheckbox: typeof import('./src/components/editors/app-checkbox.vue')['default']
AppCheckboxList: typeof import('./src/components/editors/app-checkbox-list.vue')['default']
AppCode: typeof import('./src/components/editors/app-code.vue')['default']
AppDataPicker: typeof import('./src/components/editors/app-data-picker.vue')['default']
AppDataPickerView: typeof import('./src/components/editors/app-data-picker-view.vue')['default']
AppDatePicker: typeof import('./src/components/editors/app-date-picker.vue')['default']
AppDefaultIndexViewLayout: typeof import('./src/components/layout/app-default-index-view-layout.vue')['default']
AppDrawer: typeof import('./src/components/render/app-drawer.vue')['default']
AppDropdownList: typeof import('./src/components/editors/app-dropdown-list.vue')['default']
AppEditViewLayout: typeof import('./src/components/layout/app-edit-view-layout.vue')['default']
AppFilterTree: typeof import('./src/components/render/app-filter-tree.vue')['default']
AppFormDruipart: typeof import('./src/components/render/app-form-druipart.vue')['default']
AppFormGroup: typeof import('./src/components/render/app-form-group.vue')['default']
AppFormItem: typeof import('./src/components/render/app-form-item.vue')['default']
AppGridViewLayout: typeof import('./src/components/layout/app-grid-view-layout.vue')['default']
AppIconText: typeof import('./src/components/render/app-icon-text.vue')['default']
AppIndexViewBaseLayout: typeof import('./src/components/layout/app-index-view-base-layout.vue')['default']
AppInput: typeof import('./src/components/editors/app-input.vue')['default']
AppInputIp: typeof import('./src/components/editors/app-input-ip.vue')['default']
AppListBox: typeof import('./src/components/editors/app-list-box.vue')['default']
AppLoading: typeof import('./src/components/render/app-loading.vue')['default']
AppMenuCenter: typeof import('./src/components/render/app-menu-center.vue')['default']
AppMenuItem: typeof import('./src/components/render/app-menu-item.vue')['default']
AppModal: typeof import('./src/components/render/app-modal.vue')['default']
AppMpickupViewLayout: typeof import('./src/components/layout/app-mpickup-view-layout.vue')['default']
AppPickupGridViewLayout: typeof import('./src/components/layout/app-pickup-grid-view-layout.vue')['default']
AppPickupViewLayout: typeof import('./src/components/layout/app-pickup-view-layout.vue')['default']
AppPopover: typeof import('./src/components/render/app-popover.vue')['default']
AppPortalViewLayout: typeof import('./src/components/layout/app-portal-view-layout.vue')['default']
AppQuickGroup: typeof import('./src/components/render/app-quick-group.vue')['default']
AppRadioGroup: typeof import('./src/components/editors/app-radio-group.vue')['default']
AppRating: typeof import('./src/components/editors/app-rating.vue')['default']
AppRaw: typeof import('./src/components/editors/app-raw.vue')['default']
AppRichText: typeof import('./src/components/editors/app-rich-text.vue')['default']
AppSlider: typeof import('./src/components/editors/app-slider.vue')['default']
AppSpan: typeof import('./src/components/editors/app-span.vue')['default']
AppSplit: typeof import('./src/components/common/app-split.vue')['default']
AppStepper: typeof import('./src/components/editors/app-stepper.vue')['default']
AppSwitch: typeof import('./src/components/editors/app-switch.vue')['default']
AppToolbar: typeof import('./src/components/render/app-toolbar.vue')['default']
AppTreeExpViewLayout: typeof import('./src/components/layout/app-tree-exp-view-layout.vue')['default']
AppTreeViewLayout: typeof import('./src/components/layout/app-tree-view-layout.vue')['default']
AppUpload: typeof import('./src/components/editors/app-upload.vue')['default']
AppUser: typeof import('./src/components/render/app-user.vue')['default']
AppViewBaseLayout: typeof import('./src/components/layout/app-view-base-layout.vue')['default']
Login: typeof import('./src/components/common/login.vue')['default']
}
}
......
import { SyncSeriesHook } from "qx-util";
import { Environment } from "@/environments/environment";
import router from "@/router";
import { OpenViewService } from "@/utils";
import { AppBase, IParam, ViewDetail, IApp, IOpenViewService, deepCopy, getSessionStorage, Http, AppUtil } from "@core";
import { AppBase, IParam, ViewDetail, IApp, IOpenViewService, deepCopy, Http, IAppAuthService, IAppNotificationService, IAppFuncService, IAppActionService } from "@core";
import { AppFuncConfig, AppViewConfig, AppEntityConfig } from './config';
import { DataServiceRegister, UIServiceRegister } from "./register";
import { AppActionService, AppAuthService, AppFuncService, AppNotificationService, OpenViewService } from "@/service";
export class App extends AppBase implements IApp {
......@@ -50,31 +50,14 @@ export class App extends AppBase implements IApp {
}
/**
* 初始化应用权限
* 初始化应用
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @memberof App
*/
public async initAppAuth(params: IParam): Promise<any> {
let result = true;
if (Environment && Environment.SaaSMode) {
if (getSessionStorage('activeOrgData')) {
result = await AppUtil.getAppData(App.hooks, params);
} else {
result = await AppUtil.getOrgsByDcsystem(App.hooks);
if (result) {
result = await AppUtil.getAppData(App.hooks, params);
}
}
} else {
result = await AppUtil.getAppData(App.hooks, params);
}
if (!result) {
// 登录
}
// TODO
return true;
public async initApp(params: IParam): Promise<any> {
return await this.getAppAuthService().initAppAuth(params, App.hooks);
}
/**
......@@ -87,6 +70,16 @@ export class App extends AppBase implements IApp {
return AppFuncConfig;
}
/**
* 获取应用权限服务
*
* @return {*} {IAppAuthService}
* @memberof App
*/
public getAppAuthService(): IAppAuthService {
return AppAuthService.getInstance();
}
/**
* 获取打开视图服务
*
......@@ -97,6 +90,36 @@ export class App extends AppBase implements IApp {
return OpenViewService.getInstance();
}
/**
* 获取通知服务
*
* @return {*} {IAppNotificationService}
* @memberof App
*/
public getNotificationService(): IAppNotificationService {
return AppNotificationService.getInstance();
}
/**
* 获取应用功能服务
*
* @return {IAppFuncService}
* @memberof App
*/
public getAppFuncService(): IAppFuncService {
return AppFuncService.getInstance();
}
/**
* 获取界面行为服务
*
* @return {*} {IAppActionService}
* @memberof App
*/
public getAppActionService(): IAppActionService {
return AppActionService.getInstance();
}
/**
* 获取UI服务
*
......@@ -158,14 +181,4 @@ export class App extends AppBase implements IApp {
}
}
/**
* @description 登录
*
* @return {*} {Promise<IParam>}
* @memberof App
*/
handleLogin(): Promise<IParam> {
throw new Error("Method not implemented.");
}
}
\ No newline at end of file
<template>
<div class="login">
<img src="@/assets/img/background.png" class="login-background" />
<div class="login-con" v-if="!isEmbedThridPlatForm">
<div class="login-con">
<card :bordered="false" class="login-card">
<div slot="title" class="login-header">
<p class="login-caption" style="text-align: center">桌面端应用示例</p>
</div>
<div class="login-content">
<div class="login-content">
<div class="form-con">
<a-form ref="loginForm" :rules="rules" :model="loginState">
<a-form-item name="loginname">
......@@ -14,7 +14,8 @@
size="large"
v-model:value="loginState.loginname"
placeholder="请输入用户名"
@pressEnter="handleSubmit">
@pressEnter="handleSubmit"
>
<template #prefix>
<user-outlined />
</template>
......@@ -26,19 +27,16 @@
v-model:value="loginState.password"
type="password"
placeholder="请输入密码"
@pressEnter="handleSubmit">
@pressEnter="handleSubmit"
>
<template #prefix>
<lock-outlined />
</template>
</a-input-password>
</a-form-item>
<a-form-item>
<a-button @click="handleSubmit" type="primary" class="login_btn">
登录
</a-button>
<a-button @click="goReset" type="success" class="login_reset">
重置
</a-button>
<a-button @click="handleSubmit" type="primary" class="login_btn">登录</a-button>
<a-button @click="goReset" type="success" class="login_reset">重置</a-button>
</a-form-item>
<a-form-item>
<div style="text-align: center">
......@@ -54,31 +52,30 @@
</div>
</a-form-item>
</a-form>
<p class="login-tip">\{{loginTip}}</p>
<p class="login-tip">{{ loginTip }}</p>
</div>
</div>
</card>
<div class="log_footer">
<div class="copyright">
<a href="https://www.ibizlab.cn/" target="_blank"> is based on ibizlab .</a>
<a href="https://www.ibizlab.cn/" target="_blank">is based on ibizlab .</a>
</div>
</div>
</div>
<div class="login-loadding-container" v-if="isEmbedThridPlatForm">
<div class="content-loadding">
<span>第三方登录跳转中</span>
<!-- loading待补充 -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { Ref, ref } from 'vue';
import { Ref, ref, unref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { clearCookie, setCookie } from 'qx-util';
import { Environment } from '@/environments/environment';
import { setCookie } from 'qx-util';
import { Http } from '@core';
interface LoginState {
loginname: string;
password: '';
}
/**
* 表单对象
*
......@@ -86,8 +83,8 @@ import { Http } from '@core';
* @memberof Login
*/
const loginState = reactive<LoginState>({
loginname: '',
password: ''
loginname: '',
password: '',
});
/**
......@@ -99,74 +96,46 @@ const loginState = reactive<LoginState>({
const loginTip: Ref<string> = ref('');
/**
* 运行平台
* 值规则
*
* @type {*}
* @memberof Login
*/
const platform: Ref<any> = ref({});
const rules: Ref<any> = ref({
loginname: [{ required: true, message: '用户名不能为空', trigger: 'change' }],
password: [{ required: true, message: '密码不能为空', trigger: 'change' }],
});
/**
* 是否嵌入第三方平台
* 登录表单
*
* @type {boolean}
* @type {*}
* @memberof Login
*/
const isEmbedThridPlatForm: Ref<boolean> = ref(false);
const loginForm: Ref<any> = ref(null);
/**
* 按钮可点击
* 路由对象
*
* @type {boolean}
* @type {*}
* @memberof Login
*/
const canClick: Ref<boolean> = ref(true);
const route = useRoute();
/**
* 应用名称
* 路由器对象
*
* @type {string}
* @type {*}
* @memberof Login
*/
const appTitle: string = Environment.AppTitle;
interface LoginState {
loginname: string,
password: ''
}
const router = useRouter();
/**
* 值规则
* 消除loadding
*
* @type {*}
* @memberof Login
*/
const rules: Ref<any> = ref({});
const loginForm: Ref<any> = ref(null);
const route = useRoute();
const router = useRouter();
const setRules = () => {
rules.value = {
loginname: [{ required: true, message: '用户名不能为空', trigger: 'change' }],
password: [{ required: true, message: '密码不能为空', trigger: 'change' }],
};
};
const afterCreated = () => {
setRules();
platform.value = window.navigator.userAgent.toUpperCase();
if (platform.value.indexOf('DINGTALK') !== -1) {
// this.DingDingLogin();
isEmbedThridPlatForm.value = true;
} else if (platform.value.indexOf('WXWORK') !== -1) {
// this.WXWorkLogin();
isEmbedThridPlatForm.value = true;
}
};
onMounted(() => {
setTimeout(() => {
const el = document.getElementById('app-loading-x');
......@@ -176,23 +145,32 @@ onMounted(() => {
}, 300);
});
/**
* 重置
*
* @type {*}
* @memberof Login
*/
const goReset = () => {
loginForm.value = { loginname: '', password: '' };
};
/**
* 提交表单数据
*
* @type {*}
* @memberof Login
*/
const handleSubmit = (): void => {
// clearAppData();
const _form = unref(loginForm);
const form = unref(loginForm);
let validatestate: boolean = true;
_form.validate((valid: boolean) => {
form.validate((valid: boolean) => {
validatestate = valid ? true : false;
});
if (!validatestate) {
return;
}
const loginname: string = loginState.loginname;
console.log("登录用户名", loginState)
// TODO 使用AppAuthService
Http.getInstance()
.post('/v7/login', loginState, true)
.then((post: any) => {
......@@ -207,7 +185,7 @@ const handleSubmit = (): void => {
// 设置cookie,保存账号密码7天
setCookie('loginname', loginname, 7, true);
// TODO 从路由中获取
const url: any = route.query?.redirecrt ? route.query.redirecrt : '/';
const url: any = unref(route).query?.redirecrt ? unref(route).query.redirecrt : '/';
router.push({ path: url });
}
})
......@@ -223,169 +201,12 @@ const handleSubmit = (): void => {
});
};
const clearAppData = () => {
// 清除user、token
clearCookie('ibzuaa-token', true);
clearCookie('ibzuaa-expired', true);
clearCookie('ibzuaa-user', true);
// 清除应用级数据
localStorage.removeItem('localdata');
// this.$store.commit('addAppData', {});
// this.$store.dispatch('authresource/commitAuthData', {});
// 清除租户相关信息
// removeSessionStorage("activeOrgData");
// removeSessionStorage("srfdynaorgid");
// removeSessionStorage("dcsystem");
// removeSessionStorage("orgsData");
};
/**
* 第三方登录(网页扫码方式)
*
* @memberof Login
*/
const handleThridLogin = (type: string) => {
if (!type) return;
switch (type) {
case 'DINGDING':
dingtalkHandleClick();
break;
case 'WXWORK':
wxWorkHandleClick();
break;
default:
// LogUtil.log(`暂不支持${type}登录`);
break;
}
};
/**
* 钉钉授权登录
*
* @memberof Login
*/
const dingtalkHandleClick = async () => {
// let result: any = await this.appThirdService.dingtalkLogin(Environment);
// if (result?.state && Object.is(result?.state, 'SUCCESS')) {
// const data = result.data;
// // 截取地址,拼接需要部分组成新地址
// const baseUrl = this.getNeedLocation();
// // 1.钉钉开放平台提供的appId
// const appId = data.appid;
// // 2.钉钉扫码后回调地址,需要UrlEncode转码
// const redirect_uri = baseUrl + 'assets/third/dingdingRedirect.html?id=' + data.appid;
// const redirect_uri_encode = encodeURIComponent(redirect_uri);
// // 3.钉钉扫码url
// const url =
// 'https://oapi.dingtalk.com/connect/qrconnect?response_type=code' +
// '&appid=' +
// appId +
// '&redirect_uri=' +
// redirect_uri_encode +
// '&scope=snsapi_login' +
// '&state=STATE';
// // 4.跳转钉钉扫码
// window.location.href = url;
// } else {
// this.$throw(result?.message,'dingtalkHandleClick');
// }
};
/**
* 企业微信授权登录
*
* @memberof Login
*/
const wxWorkHandleClick = async () => {
// let result: any = await this.appThirdService.wxWorkLogin(Environment);
// if (result?.state && Object.is(result?.state, 'SUCCESS')) {
// const data = result.data;
// // 截取地址,拼接需要部分组成新地址
// const baseUrl = this.getNeedLocation();
// // 1.钉钉开放平台提供的appId
// const appId = data.corp_id;
// const agentId = data.agentid;
// // 2.钉钉扫码后回调地址,需要UrlEncode转码
// const redirect_uri = baseUrl + 'assets/third/wxWorkRedirect.html?id=' + data.appid;
// const redirect_uri_encode = encodeURIComponent(redirect_uri);
// // 3.钉钉扫码url
// const url =
// 'https://open.work.weixin.qq.com/wwopen/sso/qrConnect?state=STATE' +
// '&appid=' +
// appId +
// '&agentid=' +
// agentId +
// '&redirect_uri=' +
// redirect_uri_encode;
// // 4.跳转钉钉扫码
// window.location.href = url;
// } else {
// // this.$throw(result?.message,'wxWorkHandleClick');
// }
};
/**
* 钉钉免登
*
* @memberof Login
*/
const DingDingLogin = async () => {
// let result: any = await this.appThirdService.embedDingTalkLogin(Environment);
// if (result?.state && Object.is(result?.state, 'SUCCESS')) {
// if (result.data.token && result.data.user) {
// setCookie('ibzuaa-token', result.data.token, 7,true);
// if (this.$route.query.redirect) {
// window.location.href = decodeURIComponent(this.$route.query.redirect as any);
// } else {
// this.$router.push({ path: '/' });
// }
// }
// } else {
// this.$throw(result?.message,'DingDingLogin');
// }
};
const WXWorkLogin = async () => {
// let result: any = await this.appThirdService.embedwxWorkLogin(Environment);
// if (result?.state && Object.is(result?.state, 'SUCCESS')) {
// // 截取地址,拼接需要部分组成新地址
// const baseUrl = this.getNeedLocation();
// // 1.企业微信提供的corp_id
// const appId = result.data.corp_id;
// // 2.认证成功后回调地址,需要UrlEncode转码
// const redirect_uri = baseUrl + 'assets/third/wxWorkRedirect.html?id=' + result.data.appid;
// const redirect_uri_encode = encodeURIComponent(redirect_uri);
// // 3.微信认证url
// const url =
// 'https://open.weixin.qq.com/connect/oauth2/authorize?response_type=code&scope=snsapi_base&#wechat_redirect' +
// '&appid=' +
// appId +
// '&redirect_uri=' +
// redirect_uri_encode +
// '&scope=snsapi_base' +
// '&state=STATE';
// // 4.跳转到微信认证地址
// window.location.href = url;
// } else {
// this.$throw(result?.message,'WXWorkLogin');
// }
};
const getNeedLocation = () => {
// 截取地址,拼接需要部分组成新地址
const scheme = window.location.protocol;
const host = window.location.host;
let baseUrl: any = scheme + '//' + host;
const port = window.location.port;
if (port) {
if (port == '80' || port == '443') {
baseUrl += '/';
} else {
baseUrl += ':' + port + '/';
}
} else {
baseUrl += '/';
}
return baseUrl;
console.log(`暂不支持${type}登录`);
};
</script>
\ No newline at end of file
......@@ -253,7 +253,7 @@ const onLanguageChange = (item: string) => {
:value="language"
v-for="(language,index) in languages"
:key="index"
>\{{language}}</a-select-option>
>{{language}}</a-select-option>
</a-select>
</div>
<div class="right-toolbar">
......
......@@ -45,9 +45,9 @@ const emit = defineEmits<EditorEmit>();
<template>
<div :class="['app-raw-item', 'app-raw', `app-raw-${name}`]">
<div class="raw-caption" v-if="caption">\{{ caption }}</div>
<div class="raw-caption" v-if="caption">{{ caption }}</div>
<div v-if="Object.is(contentType, 'RAW')">
\{{ value }}
{{ value }}
</div>
<div v-else-if="Object.is(contentType, 'HTML')" v-html="value" />
<div v-else-if="Object.is(contentType, 'IMAGE')">
......
......@@ -134,7 +134,7 @@ onBeforeMount(() => {
<template>
<div :class="['app-editor-container', 'app-span', `app-span-${name}`]">
<span v-format="textFormat">\{{text}}</span>
<span v-format="textFormat">{{text}}</span>
</div>
</template>
......
......@@ -134,11 +134,11 @@ const onChange = ($event: any) => {
@change="onChange">
<a-button v-if="Object.is(listType,'text')">
<upload-outlined></upload-outlined>
\{{tooltip}}
{{tooltip}}
</a-button>
<div v-else>
<plus-outlined />
<div class="ant-upload-text">\{{tooltip}}</div>
<div class="ant-upload-text">{{tooltip}}</div>
</div>
</a-upload>
</div>
......
<script setup lang="ts">
</script>
<template>
<AppViewBaseLayout>
<template v-slot:header-left>
<slot name="caption" />
</template>
<template v-slot:header-right>
<slot name="toolbar" />
</template>
<template v-slot:header-bottom>
<slot name="topMessage" />
</template>
<template v-slot:body-top>
<slot name="bodyMessage" />
</template>
<slot />
<template v-slot:footer-content>
<slot name="bottomMessage" />
</template>
</AppViewBaseLayout>
</template>
<style lang="scss">
</style>
\ No newline at end of file
<script setup lang="ts">
import { IParam, ViewDetail } from '@core';
import { Subject } from 'rxjs';
import { Ref, ref } from 'vue';
interface AppDrawerProps {
/**
* @description 视图
*/
view: ViewDetail;
/**
* @description 视图上下文参数
*/
context?: any;
/**
* @description 视图参数
*/
viewParams?: any;
/**
* @description 数据传递对象
*/
subject?: Subject<any>;
/**
* @description 关闭回调
*/
close: Function;
/**
* @description 是否全屏
*/
isFullscreen:boolean;
/**
* @description 模态参数
*/
option?: IParam;
}
const props = withDefaults(defineProps<AppDrawerProps>(), {
context: {},
viewParams: {},
});
/**
* 是否显示
*/
let isVisible: Ref<boolean> = ref(false);
/**
* 临时结果
*/
let tempResult = { ret: '' };
/**
* 视图名称
*/
let viewName: Ref<string> = ref('');
/**
* 抽屉的方向
*/
let placement: Ref<string> = ref('right');
/**
* 视图标题
*/
let title: string = '';
/**
* 视图宽度
*/
let width: Ref<number> = ref(0);
/**
* 视图高度
*/
let height: Ref<number> = ref(0);
/**
* 视图样式
*/
let style: any = {};
/**
* 暴露subject
*/
const getSubject = () => {
return props.subject;
};
/**
* Vue生命周期beforeMount
*/
onBeforeMount(() => {
if (props.view) {
viewName.value = props.view.name as string;
title = props.view.title || '';
placement.value = props.view.placement || 'right';
if (props.isFullscreen) {
Object.assign(style, { height: 'auto' });
} else {
if (!props.view.width || props.view.width === 0 || Object.is(props.view.width, '0px')) {
let viewWidth = 600;
if (window && window.innerWidth > 100) {
if (window.innerWidth > 100) {
viewWidth = window.innerWidth - 100;
} else {
viewWidth = window.innerWidth;
}
}
width.value = viewWidth;
} else {
width.value = props.view.width;
}
if (props.view.height && !Object.is(props.view.height, '0px')) {
Object.assign(style, { height: props.view.height + 'px' });
height.value = props.view.height;
} else {
height.value = 800;
}
}
}
});
/**
* Vue生命周期mounted
*/
onMounted(() => {
isVisible.value = true;
});
/**
* 视图关闭
*/
const close = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { datas: JSON.parse(JSON.stringify(result)) });
}
isVisible.value = false;
};
/**
* 视图数据变化
*/
const viewDataChange = (result: any) => {
tempResult = { ret: '' };
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { datas: JSON.parse(JSON.stringify(result)) });
}
};
/**
* 视图数据激活
*/
const viewDataActivated = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
close(result);
}
};
/**
* 模态显示隐藏切换回调
*/
const onVisibleChange = ($event: any) => {
handleShowState($event);
props.close(tempResult);
};
/**
* 处理数据,向外抛值
*/
const handleShowState = ($event: any) => {
if (props.subject && tempResult) {
props.subject.next(tempResult);
}
};
</script>
<template>
<a-drawer
ref="curDrawer"
class="app-drawer"
v-model:visible="isVisible"
:placement="placement"
:title="title"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
:width="width"
:height="height"
:bodyStyle="style"
@close="onVisibleChange($event)"
>
<component
:is="viewName"
class="app-drawer-view-component"
:width="width"
:height="height"
:context="context"
:viewParams="viewParams"
:viewDefaultUsage="false"
:noViewCaption="true"
@viewDataChange="viewDataChange($event)"
@viewDataActivated="viewDataActivated($event)"
@close="close($event)"
:ref="viewName"
></component>
</a-drawer>
</template>
\ No newline at end of file
......@@ -48,7 +48,7 @@ const handleMenuGroupAction = ($event: IParam) => {
<template v-if="Object.is(uIActionGroup.extractMode, 'ITEMS')">
<a-dropdown>
<a class="group-action" @click.prevent>
\{{uIActionGroup.caption}}
{{uIActionGroup.caption}}
</a>
<template #overlay>
<a-menu @click="handleMenuGroupAction">
......
......@@ -45,7 +45,7 @@ const initRules = () => {
:validateStatus="error ? 'error' : 'validating'"
>
<template #label>
<label :style="{ width: labelWidth + 'px' }" :class="titleStyle">\{{ label }}</label>
<label :style="{ width: labelWidth + 'px' }" :class="titleStyle">{{ label }}</label>
</template>
<slot></slot>
</a-form-item>
......
......@@ -34,7 +34,7 @@ const extraClass = {
<i v-if="iconClass" :class="'app-icon-text__icon ' + iconClass" />
<img v-else-if="imgPath" class="app-icon-text__icon-img" :src="imgPath" />
</template>
<span class="app-icon-text__text" v-if="text">\{{text}}</span>
<span class="app-icon-text__text" v-if="text">{{text}}</span>
<template v-if="position == 'right'">
<i v-if="iconClass" :class="'app-icon-text__icon ' + iconClass" />
<img v-else-if="imgPath" class="app-icon-text__icon-img" :src="imgPath" />
......
......@@ -45,7 +45,7 @@ const getLayout = (item: IParam ,name: string) => {
<a-space :size="24" class="app-menu__card--flex">
<template v-for="item in menu.items">
<a-button v-if="!item.hidden" size="large" :class="['app-menu-item', item.itemSysCss]" @click="onClick(item)">
\{{ item.caption }}
{{ item.caption }}
</a-button>
</template>
</a-space>
......@@ -64,7 +64,7 @@ const getLayout = (item: IParam ,name: string) => {
@click="onClick(item)"
>
<a-button size="large">
\{{ item.caption }}
{{ item.caption }}
</a-button>
</a-col>
</a-row>
......
......@@ -16,7 +16,7 @@ const props = withDefaults(defineProps<Props>(), {
<template #icon>
<AppIconText :iconClass="item.iconClass" :imgPath="item.imgPath" :text="collapsed ? item.caption[0] : undefined"/>
</template>
<a-tooltip :title="item.tooltip">\{{item.caption}}</a-tooltip>
<a-tooltip :title="item.tooltip">{{item.caption}}</a-tooltip>
</a-menu-item>
</template>
<template v-else>
......@@ -24,7 +24,7 @@ const props = withDefaults(defineProps<Props>(), {
<template #icon>
<AppIconText :iconClass="item.iconClass" :imgPath="item.imgPath" :text="collapsed ? item.caption[0] : undefined"/>
</template>
<template #title><a-tooltip :title="item.tooltip">\{{item.caption}}</a-tooltip></template>
<template #title><a-tooltip :title="item.tooltip">{{item.caption}}</a-tooltip></template>
<AppMenuItem :items="item.items" />
</a-sub-menu>
</template>
......
<script setup lang="ts">
import { IActionParam, IParam, ViewDetail } from '@core';
import { Subject } from 'rxjs';
import { Ref, ref } from 'vue';
interface AppModalProps {
/**
* @description 视图
*/
view: ViewDetail;
/**
* @description 视图上下文参数
*/
context?: any;
/**
* @description 视图参数
*/
viewParams?: any;
/**
* @description 数据传递对象
*/
subject?: Subject<any>;
/**
* @description 关闭回调
*/
close: Function;
/**
* @description 是否全屏
*/
isFullscreen: boolean;
/**
* @description 模态参数
*/
option?: IParam;
}
const props = withDefaults(defineProps<AppModalProps>(), {
context: {},
viewParams: {},
});
/**
* 是否显示
*/
let isVisible: Ref<boolean> = ref(false);
/**
* 临时结果
*/
let tempResult = { ret: '' };
/**
* 视图名称
*/
let viewName: Ref<string> = ref('');
/**
* 视图标题
*/
let title: string = '';
/**
* 视图宽度
*/
let width: Ref<number> = ref(0);
/**
* 视图高度
*/
let height: Ref<number> = ref(0);
/**
* 视图样式
*/
let style: any = {};
/**
* 暴露subject
*/
const getSubject = () => {
return props.subject;
};
/**
* Vue生命周期beforeMount
*/
onBeforeMount(() => {
if (props.view) {
viewName.value = props.view.name as string;
title = props.view.title || '';
if (props.isFullscreen) {
Object.assign(style, { height: 'auto' });
} else {
if (!props.view.width || props.view.width === 0 || Object.is(props.view.width, '0px')) {
let viewWidth = 600;
if (window && window.innerWidth > 100) {
if (window.innerWidth > 100) {
viewWidth = window.innerWidth - 100;
} else {
viewWidth = window.innerWidth;
}
}
width.value = viewWidth;
} else {
width.value = props.view.width;
}
if (props.view.height && !Object.is(props.view.height, '0px')) {
Object.assign(style, { height: props.view.height + 'px' });
height.value = props.view.height;
} else {
height.value = 800;
}
}
}
});
/**
* Vue生命周期mounted
*/
onMounted(() => {
isVisible.value = true;
});
/**
* 视图关闭
*/
const close = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { resultData: JSON.parse(JSON.stringify(result)) });
}
props.subject?.next(tempResult);
isVisible.value = false;
};
/**
* 视图数据变化
*/
const viewDataChange = (result: any) => {
tempResult = { ret: '' };
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { resultData: JSON.parse(JSON.stringify(result)) });
}
};
/**
* 视图数据激活
*/
const viewDataActivated = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
close(result);
}
};
const handelViewEvent = (actionParam: IActionParam) => {
const { tag, action, data } = actionParam;
switch (action) {
case 'viewDataChange':
viewDataChange(data);
break;
case 'close':
close(data);
break;
}
};
/**
* 模态显示隐藏切换回调
*/
const onVisibleChange = ($event: any) => {
handleShowState($event);
props.close(tempResult);
};
/**
* 处理数据,向外抛值
*/
const handleShowState = ($event: any) => {
if (props.subject && tempResult) {
props.subject.next(tempResult);
}
};
</script>
<template>
<a-modal
ref="curModal"
class="app-modal"
v-model:visible="isVisible"
:title="title"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
:width="width"
:height="height"
:bodyStyle="style"
@cancel="onVisibleChange($event)"
>
<component
:is="viewName"
class="app-modal-view-component"
:context="context"
:viewParams="viewParams"
:viewDefaultUsage="false"
:noViewCaption="true"
@viewEvent="handelViewEvent($event)"
@viewDataActivated="viewDataActivated($event)"
@close="close($event)"
:ref="viewName"
></component>
</a-modal>
</template>
\ No newline at end of file
<script setup lang="ts">
import { IActionParam, IParam, ViewDetail } from '@core';
import { Subject } from 'rxjs';
import { Ref, ref, h } from 'vue';
interface AppPopoverProps {
/**
* @description 视图
*/
view: ViewDetail;
/**
* @description 视图上下文参数
*/
context?: any;
/**
* @description 视图参数
*/
viewParams?: any;
/**
* @description 数据传递对象
*/
subject?: Subject<any>;
/**
* @description 是否全屏
*/
isFullscreen:boolean;
/**
* @description 模态参数
*/
option?: IParam;
/**
* @description 鼠标移出回调
*/
mouseout: Function;
}
const props = withDefaults(defineProps<AppPopoverProps>(), {
context: {},
viewParams: {},
});
/**
* 临时结果
*/
let tempResult = { ret: '' };
/**
* 视图名称
*/
let viewName: Ref<string> = ref('');
/**
* 抽屉的方向
*/
let placement: Ref<string> = ref('bottom');
/**
* 视图标题
*/
let title: string = '';
/**
* 视图宽度
*/
let width: Ref<number> = ref(0);
/**
* 视图高度
*/
let height: Ref<number> = ref(0);
/**
* 视图样式
*/
let style: any = {};
/**
* 暴露subject
*/
const getSubject = () => {
return props.subject;
};
/**
* Vue生命周期beforeMount
*/
onBeforeMount(() => {
if (props.view) {
viewName.value = props.view.name as string;
title = props.view.title || '';
placement.value = props.view.placement || 'bottom';
if (props.isFullscreen) {
Object.assign(style, { height: 'auto' });
} else {
if (!props.view.width || props.view.width === 0 || Object.is(props.view.width, '0px')) {
width.value = 300;
Object.assign(style, { width: width.value + 'px' });
} else {
width.value = props.view.width;
Object.assign(style, { width: width.value + 'px' });
}
if (props.view.height && !Object.is(props.view.height, '0px')) {
height.value = props.view.height;
Object.assign(style, { height: height.value + 'px' });
} else {
height.value = 300;
Object.assign(style, { height: height.value + 'px' });
}
}
}
});
/**
* 视图关闭
*/
const close = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { datas: JSON.parse(JSON.stringify(result)) });
}
props.subject?.next(tempResult);
};
/**
* 视图数据变化
*/
const viewDataChange = (result: any) => {
tempResult = { ret: '' };
if (result && Array.isArray(result) && result.length > 0) {
Object.assign(tempResult, { ret: 'OK' }, { datas: JSON.parse(JSON.stringify(result)) });
}
};
/**
* 视图数据激活
*/
const viewDataActivated = (result: any) => {
if (result && Array.isArray(result) && result.length > 0) {
close(result);
}
};
/**
* 显示隐藏切换回调
*/
const onVisibleChange = ($event: any) => {
handleShowState($event);
};
/**
* 处理数据,向外抛值
*/
const handleShowState = ($event: any) => {
if (props.subject && tempResult) {
props.subject.next(tempResult);
}
};
/**
* 处理视图事件
*/
const handelViewEvent = (actionParam: IActionParam) => {
const { tag, action, data } = actionParam;
switch (action) {
case 'viewDataChange':
viewDataChange(data);
break;
case 'close':
close(data);
break;
}
};
/**
* 点击事件
*/
const click = (e:any) => {
e.stopPropagation()
}
/**
* 鼠标移出事件
*/
const mouseout = (e:any) => {
props.mouseout();
}
</script>
<template>
<div :style="style" class="app-popover" @click="click" @mouseleave="mouseout">
<component
:is="viewName"
class="app-popover-component"
:width="width"
:height="height"
:context="context"
:viewParams="viewParams"
:viewDefaultUsage="false"
:noViewCaption="true"
@viewEvent="handelViewEvent($event)"
@viewDataActivated="viewDataActivated($event)"
@close="close($event)"
></component>
</div>
</template>
\ No newline at end of file
......@@ -74,7 +74,7 @@ const dropdownList = [
<template>
<div class="app-user">
<span class="user-name">\{{ user.name }}</span>
<span class="user-name">{{ user.name }}</span>
<a-dropdown>
<a-avatar size="large" :src="user.avatar" @click.prevent>
<template #icon><AppIconText iconClass="fa fa-user-o"></AppIconText></template>
......@@ -82,7 +82,7 @@ const dropdownList = [
<template #overlay>
<a-menu @click="dropdownClick">
<a-menu-item :value="item.tag" v-for="item in dropdownList" :key="item.tag">
\{{ item.label }}
{{ item.label }}
</a-menu-item>
</a-menu>
</template>
......
import { IParam, ViewDetail } from "../common";
import { IAppFuncService, IOpenViewService } from "../service";
import { IAppActionService, IAppAuthService, IAppFuncService, IAppNotificationService, IOpenViewService } from "../service";
/**
......@@ -11,21 +11,13 @@ import { IAppFuncService, IOpenViewService } from "../service";
export interface IApp {
/**
* 初始化应用权限
* 初始化应用
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @memberof IApp
*/
initAppAuth(params: IParam): Promise<any>;
/**
* 获取应用所有功能
*
* @return {*} {IParam[]}
* @memberof IApp
*/
getAllFuncs(): IParam[];
initApp(params: IParam): Promise<any>;
/**
* 获取应用功能服务
......@@ -43,6 +35,30 @@ export interface IApp {
*/
getOpenViewService(): IOpenViewService;
/**
* 获取应用权限服务
*
* @return {*} {IAppAuthService}
* @memberof IApp
*/
getAppAuthService(): IAppAuthService;
/**
* 获取通知服务
*
* @return {*} {IAppNotificationService}
* @memberof IApp
*/
getNotificationService(): IAppNotificationService;
/**
* 获取界面行为服务
*
* @return {*} {IAppActionService}
* @memberof IApp
*/
getAppActionService(): IAppActionService;
/**
* 获取UI服务
*
......@@ -63,6 +79,14 @@ export interface IApp {
*/
getDataService(entityKey: string, context?: IParam): Promise<any>;
/**
* 获取应用所有功能
*
* @return {*} {IParam[]}
* @memberof IApp
*/
getAllFuncs(): IParam[];
/**
* 获取指定视图信息
*
......@@ -82,7 +106,6 @@ export interface IApp {
*/
getEntityInfo(codeName: string): any;
/**
* 获取应用数据
*
......@@ -106,12 +129,4 @@ export interface IApp {
*/
gotoLoginPage(): void;
/**
* @description 登录
*
* @return {*} {Promise<IParam>}
* @memberof IApp
*/
handleLogin(): Promise<IParam>;
}
\ No newline at end of file
import { IParam } from "../common";
/**
* @description 应用权限服务
* @export
* @interface IAppAuthService
*/
export interface IAppAuthService {
/**
* 初始化应用权限
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @memberof IAppAuthService
*/
initAppAuth(params: IParam, hooks: IParam): Promise<any>;
/**
* 获取应用数据
*
* @return {*} {IParam}
* @memberof IAppAuthService
*/
getAppData(): IParam;
/**
* 设置应用数据
*
* @param {IParam} opt
* @memberof IAppAuthService
*/
setAppData(opt: IParam): void;
/**
* 登录
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @memberof IAppAuthService
*/
login(opts: IParam): Promise<IParam>;
}
\ No newline at end of file
/**
* @description 应用权限服务
* @export
* @interface IAppNotificationService
*/
export interface IAppNotificationService {
/**
* 成功提示
*
* @param {*} opts 参数
* @memberof IAppNotificationService
*/
success(opts: any): void;
/**
* 信息提示
*
* @param {*} opts 参数
* @memberof IAppNotificationService
*/
info(opts: any): void;
/**
* 警告提示
*
* @param {*} opts 参数
* @memberof IAppNotificationService
*/
warning(opts: any): void;
/**
* 错误提示
*
* @param {*} opts 参数
* @memberof IAppNotificationService
*/
error(opts: any): void;
}
\ No newline at end of file
export * from './i-app-func-service';
export * from './i-app-notification-service';
export * from './i-app-action-service';
export * from './i-open-view-service';
export * from './i-data-service-register';
export * from './i-ui-service-register';
\ No newline at end of file
export * from './i-ui-service-register';
export * from './i-app-auth-service';
\ No newline at end of file
export * from './app-func-service';
export * from './app-action-service';
\ No newline at end of file
import { AppActionService, IContext, IParam, UIActionUtil } from "@core";
import { IContext, IParam, UIActionUtil } from "@core";
export interface ActionParams {
/**
......@@ -211,7 +211,7 @@ export class AppActionBase {
return;
}
// 参数合并 todo
AppActionService.getInstance().execute(actionModel, params);
App.getAppActionService().execute(actionModel, params);
}
/**
......
export * from './app-logic';
export * from './app-ui-action';
\ No newline at end of file
import { AppFuncService, IApp, IAppFuncService, IOpenViewService, ViewDetail } from "@core";
import { IParam } from "@core/interface";
import { IApp, IAppFuncService, IOpenViewService, ViewDetail } from "@core";
import { IAppActionService, IAppAuthService, IAppNotificationService, IParam } from "@core/interface";
/**
* 应用基类
......@@ -10,52 +10,53 @@ import { IParam } from "@core/interface";
export abstract class AppBase implements IApp {
/**
* 应用功能服务
* 初始化应用
*
* @private
* @type {AppFuncService}
* @param {IParam} opt
* @memberof AppBase
*/
private appFuncService: AppFuncService = AppFuncService.getInstance();
public initApp(params: IParam): Promise<any> {
throw new Error("Method not implemented.");
}
/**
* 应用数据
* 设置应用数据
*
* @private
* @type {IParam}
* @param {IParam} opt
* @memberof AppBase
*/
private appData: IParam = {};
public setAppData(opt: IParam): void {
this.getAppAuthService().setAppData(opt);
}
/**
* 初始化应用权限
* 获取应用数据
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @return {*} {IParam}
* @memberof AppBase
*/
public async initAppAuth(params: IParam): Promise<any> {
throw new Error("Method not implemented.");
public getAppData(): IParam {
return this.getAppAuthService().getAppData();
}
/**
* 设置应用数据
* 获取应用权限服务
*
* @param {IParam} opt
* @return {IAppFuncService}
* @memberof AppBase
*/
public setAppData(opt: IParam): void {
this.appData = opt;
public getAppAuthService(): IAppAuthService {
throw new Error("Method not implemented.");
}
/**
* 获取应用数据
* 获取通知服务
*
* @return {*} {IParam}
* @return {*} {IAppNotificationService}
* @memberof AppBase
*/
public getAppData(): IParam {
return this.appData;
public getNotificationService(): IAppNotificationService {
throw new Error("Method not implemented.");
}
/**
......@@ -65,7 +66,7 @@ export abstract class AppBase implements IApp {
* @memberof AppBase
*/
public getAppFuncService(): IAppFuncService {
return this.appFuncService;
throw new Error("Method not implemented.");
}
/**
......@@ -78,6 +79,16 @@ export abstract class AppBase implements IApp {
throw new Error("Method not implemented.");
}
/**
* 获取界面行为服务
*
* @return {*} {IAppActionService}
* @memberof AppBase
*/
public getAppActionService(): IAppActionService {
throw new Error("Method not implemented.");
}
/**
* 获取UI服务
*
......@@ -132,21 +143,12 @@ export abstract class AppBase implements IApp {
}
/**
* @description 跳转登录页
* @description 跳转登录页
*
* @memberof AppBase
*/
gotoLoginPage(): void {
public gotoLoginPage(): void {
throw new Error("Method not implemented.");
}
/**
* @description 登录
*
* @return {*} {Promise<IParam>}
* @memberof AppBase
*/
handleLogin(): Promise<IParam> {
throw new Error("Method not implemented.");
}
}
\ No newline at end of file
......@@ -9,4 +9,6 @@ export * from './pickup-view'
export * from './mpickup-view'
export * from './pickup-grid-view'
export * from './tree-exp-view'
export * from './tree-view'
\ No newline at end of file
export * from './tree-view'
export * from './portal-view'
export * from './tab-exp-view'
import { ViewBase, MainViewState, IActionParam, IParam, AppActionService } from '@core';
import { ViewBase, MainViewState, IActionParam, IParam } from '@core';
/**
* 实体视图
......@@ -49,20 +49,7 @@ export class MainView extends ViewBase {
actionEnvironment: this
};
// 执行行为
AppActionService.getInstance().execute(uIAction, inputParam);
}
/**
* 处理部件事件
*
* @param {IActionParam} actionParam
* @memberof MainView
*/
public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam;
if (Object.is(action, 'closeView')) {
this.closeView();
}
App.getAppActionService().execute(uIAction, inputParam);
}
/**
......@@ -76,7 +63,6 @@ export class MainView extends ViewBase {
...superParams,
xDataControl: this.xDataControl,
onToolbarEvent: this.onToolbarEvent.bind(this),
onCtrlEvent: this.onCtrlEvent.bind(this),
};
}
}
export * from './portal-view-prop'
export * from './portal-view-state'
export * from './portal-view'
\ No newline at end of file
import { ViewPropsBase } from "@core";
/**
* @description 应用看板(门户)视图props
* @export
* @interface PortalViewProps
* @extends {ViewPropsBase}
*/
export interface PortalViewProps extends ViewPropsBase {
}
\ No newline at end of file
import { ViewStateBase } from "@core";
/**
* @description 应用看板(门户)视图state
* @export
* @interface PortalViewState
* @extends {ViewStateBase}
*/
export interface PortalViewState extends ViewStateBase {
}
\ No newline at end of file
import { PortalViewState, IParam, ViewBase } from '@core';
/**
* @description 应用看板(门户)视图
* @export
* @class PortalView
* @extends {PortalView}
*/
export class PortalView extends ViewBase {
/**
* 视图状态
*
* @type {PortalViewState}
* @memberof PortalView
*/
public declare state: PortalViewState;
/**
* 当前视图数据看板
*
* @type {IParam}
* @memberof PortalView
*/
public declare dashboard: IParam;
/**
* @description 处理视图初始化
*
* @memberof PortalView
*/
public useViewInit() {
// 初始化数据看板引用
this.dashboard = ref(null);
const { viewSubject } = this.state;
onMounted(() => {
const { viewParams } = this.state;
viewSubject.next({ tag: this.getDashboard().name, action: "load", data: viewParams });
})
}
/**
* 获取数据看板部件
*
* @return {*} {*}
* @memberof PortalView
*/
public getDashboard(): any {
if (this.dashboard.value) {
return this.dashboard.value;
} else {
return null;
}
}
/**
* @description 安装视图所有功能模块的方法
*
* @memberof PortalView
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
dashboard: this.dashboard
};
}
}
export * from './tab-exp-view-prop';
export * from './tab-exp-view-state';
export { TabExpView } from './tab-exp-view';
\ No newline at end of file
import { ExpViewProps } from "@core";
/**
* @description 树导航视图props
* @export
* @interface TabExpViewProps
* @extends {ExpViewProps}
*/
export interface TabExpViewProps extends ExpViewProps {}
import { ExpViewState } from "@core";
/**
* @description 树导航视图状态
* @export
* @interface TabExpViewState
* @extends {ExpViewState}
*/
export interface TabExpViewState extends ExpViewState {}
\ No newline at end of file
import { ExpView } from "@core";
import { TabExpViewProps } from "./tab-exp-view-prop";
import { TabExpViewState } from "./tab-exp-view-state";
/**
* @description 分页导航视图
* @export
* @class TabExpView
* @extends {ExpView}
*/
export class TabExpView extends ExpView {
/**
* @description 视图状态
* @type {TabExpViewState}
* @memberof TabExpView
*/
public declare state: TabExpViewState;
/**
* @description 安装视图所有功能模块的方法
* @return {*}
* @memberof TabExpView
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams
};
}
}
\ No newline at end of file
......@@ -92,7 +92,7 @@ export class ViewBase {
* 关闭视图
*
*/
public closeView(){
public closeView() {
window.history.go(-1);
}
......@@ -109,8 +109,8 @@ export class ViewBase {
const { appViewNavContexts, appViewNavParams } = this.state;
if (Object.is(props.openType, 'ROUTE')) {
// 应用上下文
const appContext = App.getAppData();
Object.assign(context.value, appContext);
const appData = App.getAppData();
Object.assign(context.value, appData.context ? appData.context : {});
// 视图应用上下文
const pageContext = {};
const routeParams = useRoute().params;
......@@ -204,6 +204,18 @@ export class ViewBase {
*/
public useCounterService() { }
/**
* 处理部件事件
*
* @param {IActionParam} actionParam
* @memberof ViewBase
*/
public onCtrlEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam;
if (Object.is(action, 'closeView')) {
this.closeView();
}
}
/**
* @description 安装视图所有功能模块的方法
......@@ -224,7 +236,8 @@ export class ViewBase {
// 处理视图初始化
this.useViewInit();
return {
state: this.state
state: this.state,
onCtrlEvent: this.onCtrlEvent.bind(this),
};
}
}
......@@ -82,6 +82,14 @@ export class ControlBase {
this.emit('ctrlEvent', { tag: this.props.name, action: 'closeView', data: undefined });
}
/**
* 处理部件事件
*
* @param {IActionParam} actionParam
* @memberof ControlBase
*/
public onCtrlEvent(actionParam: IActionParam) {}
/**
* @description 安装部件所有功能模块的方法
* @param {ControlPropsBase} props 传入的Props
......@@ -94,7 +102,8 @@ export class ControlBase {
this.useControlContextParams();
return {
state: this.state,
getData: this.getData
getData: this.getData.bind(this),
onCtrlEvent: this.onCtrlEvent.bind(this),
};
}
}
import { IParam, MainControlProps } from "@core";
/**
* @description 数据看板部件的props
* @export
* @interface DashboardControlProps
* @extends {MainControlProps}
*/
export interface DashboardControlProps extends MainControlProps {
}
\ No newline at end of file
import { IParam, MainControlState } from '@core';
/**
* @description 数据看板部件状态
* @export
* @interface DashboardControlState
* @extends {MainControlState}
*/
export interface DashboardControlState extends MainControlState {
}
import { IActionParam, MainControl } from '@core';
import { DashboardControlProps } from './dashboard-control-prop';
import { DashboardControlState } from './dashboard-control-state';
/**
* @description 选择视图面板部件
* @export
* @class DashboardControl
* @extends {MainControl}
*/
export class DashboardControl extends MainControl {
/**
* @description 部件状态
* @type {DashboardControlState}
* @memberof DashboardControl
*/
public declare state: DashboardControlState;
/**
* @description
* @param {DashboardControlProps} props
* @memberof DashboardControl
*/
public useLoad(props: DashboardControlProps) {
const { viewSubject, controlName, context, viewParams } = this.state;
// 订阅viewSubject,监听load行为
if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
if (Object.is(controlName, tag) && Object.is("load", action)) {
viewSubject.next({ tag: tag, action: "load", data: data });
}
})
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
})
}
}
/**
* @description 安装部件所有功能模块的方法
* @return {*}
* @memberof DashboardControl
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
load:this.useLoad.bind(this),
};
}
}
\ No newline at end of file
export * from './dashboard-control-prop'
export * from './dashboard-control-state'
export * from './dashboard-control'
\ No newline at end of file
......@@ -11,3 +11,7 @@ export * from './tree-control'
export * from './search-form-control'
export * from './quick-search-form-control'
export * from './searchbar-control'
export * from './dashboard-control'
export * from './portlet-control'
export * from './tab-exp-panel-control'
export * from './tab-view-panel-control'
......@@ -34,7 +34,7 @@ export class MDControl extends MainControl {
* @protected
* @param [opt={}]
*/
protected async load(opt: any = {}) {}
protected async load(opt: any = {}) { }
/**
* @description 使用加载功能模块
......@@ -80,9 +80,11 @@ export class MDControl extends MainControl {
}
this.handleStateChange();
}
} catch (error) {
// todo 错误异常处理
console.log(error);
} catch (error: any) {
App.getNotificationService().error({
message: '加载数据失败',
description: error?.data
})
}
};
......@@ -111,7 +113,7 @@ export class MDControl extends MainControl {
* @protected
* @param [opt={}]
*/
protected async save(opt: any = {}) {}
protected async save(opt: any = {}) { }
/**
* @description 使用保存功能模块
......@@ -128,7 +130,7 @@ export class MDControl extends MainControl {
const { updateAction, createAction } = controlAction;
const saveAction: any =
item.rowDataState == 'update' ? updateAction : item.rowDataState == 'create' ? createAction : '';
const saveFunName = item.rowDataState == 'update' ? 'update' : 'create';
const saveFunName = item.rowDataState == 'update' ? 'update' : 'create';
if (!saveAction) {
return;
}
......@@ -175,7 +177,7 @@ export class MDControl extends MainControl {
* @protected
* @param [opt={}]
*/
protected async remove(opt: any = {}) {}
protected async remove(opt: any = {}) { }
/**
* @description 使用删除功能模块
......@@ -255,7 +257,7 @@ export class MDControl extends MainControl {
* @protected
* @param [opt={}]
*/
protected async newRow(opt: any = {}) {}
protected async newRow(opt: any = {}) { }
/**
* @description 使用新建功能模块
......@@ -313,7 +315,7 @@ export class MDControl extends MainControl {
* @protected
* @param [opt={}]
*/
protected async refresh(opt: any = {}) {}
protected async refresh(opt: any = {}) { }
/**
* @description 使用刷新功能模块
......@@ -358,7 +360,7 @@ export class MDControl extends MainControl {
*
* @memberof MDControl
*/
public handleStateChange() {}
public handleStateChange() { }
/**
* 处理数据分组
......@@ -382,7 +384,7 @@ export class MDControl extends MainControl {
* @protected
* @memberof MDControl
*/
protected autoGroupData() {}
protected autoGroupData() { }
/**
* 代码表分组
......@@ -390,7 +392,7 @@ export class MDControl extends MainControl {
* @protected
* @memberof MDControl
*/
protected codeListGroupData() {}
protected codeListGroupData() { }
/**
* 获取当前激活数据
......
export * from './portlet-control-prop'
export * from './portlet-control-state'
export * from './portlet-control'
\ No newline at end of file
import { MainControlProps } from "@core";
/**
* @description 门户部件参数
* @export
* @interface PortletControlProps
* @extends {MainControlProps}
*/
export interface PortletControlProps extends MainControlProps {
}
\ No newline at end of file
import { IParam, MainControlState } from '@core';
/**
* @description 门户部件状态
* @export
* @interface PortletControlState
* @extends {MainControlState}
*/
export interface PortletControlState extends MainControlState {
}
\ No newline at end of file
import { IActionParam, MainControl } from '@core';
import { PortletControlProps } from './portlet-control-prop';
import { PortletControlState } from './portlet-control-state';
/**
* @description 门户部件
* @export
* @class PortletControl
* @extends {MainControl}
*/
export class PortletControl extends MainControl {
/**
* @description 部件状态
* @type {PortletControlState}
* @memberof PortletControl
*/
public declare state: PortletControlState;
/**
* @description 加载
* @param {PortletControlProps} props
* @memberof PortletControl
*/
public useLoad(props: PortletControlProps) {
const { viewSubject, controlName, context, viewParams } = this.state;
// 订阅viewSubject,监听load行为
if (viewSubject) {
let subscription = viewSubject.subscribe(({ tag, action, data }: IActionParam) => {
if (Object.is(controlName, tag) && Object.is("load", action)) {
viewSubject.next({ tag: tag, action: "load", data: data });
}
})
// 部件卸载时退订viewSubject
onUnmounted(() => {
subscription.unsubscribe();
})
}
}
/**
* 部件事件
*
* @param {IActionParam} actionParam
* @memberof PortletControl
*/
public onViewEvent(actionParam: IActionParam) {
const { tag, action, data } = actionParam;
const { controlName } = this.state;
}
/**
* @description 安装部件所有功能模块的方法
* @return {*}
* @memberof PortletControl
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
load:this.useLoad.bind(this),
onViewEvent: this.onViewEvent.bind(this)
};
}
}
\ No newline at end of file
......@@ -20,8 +20,8 @@ export class SearchBarControl extends MainControl {
* @param {SearchBarControlProps} props
* @memberof SearchBarControl
*/
public setState(props: SearchBarControlState) {
super.setState(props);
public setState() {
super.setState();
this.state.filterFields = Object.values(this.state.detailsModel);
this.state.filterItems = [];
}
......@@ -33,8 +33,8 @@ export class SearchBarControl extends MainControl {
* @return {*}
* @memberof SearchBarControl [emit] 事件
*/
public moduleInstall(props: SearchBarControlProps, emit?: Function) {
const superParams = super.moduleInstall(props, emit);
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
state: this.state,
......
export * from './tab-exp-panel-control-prop'
export * from './tab-exp-panel-control-state'
export * from './tab-exp-panel-control'
\ No newline at end of file
import { IParam, MainControlProps } from "@core";
/**
* @description 搜索栏部件的props
* @export
* @interface TabExpPanelControlProps
* @extends {MainControlProps}
*/
export interface TabExpPanelControlProps extends MainControlProps {
}
\ No newline at end of file
import { IParam, MainControlState } from '@core';
/**
* @description 搜索栏部件状态
* @export
* @interface TabExpPanelControlState
* @extends {MainControlState}
*/
export interface TabExpPanelControlState extends MainControlState {
}
\ No newline at end of file
import { UIUtil, deepCopy, IActionParam, IParam, MainControl, TabExpPanelControlState, TabExpPanelControlProps } from '@core';
/**
* @description 分页导航部件
* @export
* @class TabExpPanelControl
* @extends {MainControl}
*/
export class TabExpPanelControl extends MainControl {
/**
* @description 部件状态
* @type {TabExpPanelControlState}
* @memberof TabExpPanelControl
*/
public declare state: TabExpPanelControlState;
/**
* @description 安装部件所有功能模块的方法
* @param {TabExpPanelControlProps} props
* @param {Function} [emit]
* @return {*}
* @memberof TabExpPanelControl [emit] 事件
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
state: this.state,
};
}
}
\ No newline at end of file
export * from './tab-view-panel-control-prop'
export * from './tab-view-panel-control-state'
export * from './tab-view-panel-control'
\ No newline at end of file
import { MainControlProps } from "@core";
/**
* @description 选择视图面板部件参数
* @export
* @interface TabViewPanelControlProps
* @extends {MainControlProps}
*/
export interface TabViewPanelControlProps extends MainControlProps {
}
\ No newline at end of file
import { IParam, MainControlState } from '@core';
/**
* @description 选择视图面板通讯对象
* @export
* @interface TabViewPanelControlState
* @extends {MainControlState}
*/
export interface TabViewPanelControlState extends MainControlState {
}
\ No newline at end of file
import { IActionParam, MainControl } from '@core';
import { TabViewPanelControlProps } from './tab-view-panel-control-prop';
import { TabViewPanelControlState } from './tab-view-panel-control-state';
/**
* @description 分页视图面板部件
* @export
* @class TabViewPanelControl
* @extends {MainControl}
*/
export class TabViewPanelControl extends MainControl {
/**
* @description 部件状态
* @type {FormControlState}
* @memberof TabViewPanelControl
*/
public declare state: TabViewPanelControlState;
/**
* @description 安装部件所有功能模块的方法
* @return {*}
* @memberof TabViewPanelControl
*/
public moduleInstall() {
const superParams = super.moduleInstall();
return {
...superParams,
};
}
}
\ No newline at end of file
import { hasFunction } from "@core";
import { IParam, IContext, IAppActionService } from "@core/interface";
import { AppSysAction } from "../app-ui-action/app-sys-action";
import { AppSysAction, hasFunction, IAppActionService, IContext, IParam } from "@core";
export class AppActionService implements IAppActionService {
/**
* @description 唯一实例
* @private
* @static
* @memberof AppActionService
*/
private static readonly instance = new AppActionService();
/**
* @description 获取唯一实例
* @static
* @return {*} {AppActionService}
* @memberof AppActionService
*/
public static getInstance(): AppActionService {
return AppActionService.instance;
}
/**
* 界面行为服务基类
*
* @export
* @class AppActionServiceBase
* @implements {IAppActionService}
*/
export abstract class AppActionServiceBase implements IAppActionService {
/**
* 执行界面行为
......
import qs from "qs";
import { getCookie } from "qx-util";
import { clearCookie, getCookie, setCookie } from "qx-util";
import { deepCopy, getSessionStorage, Http, IAppAuthService, IParam, removeSessionStorage, setSessionStorage } from "@core";
import { Environment } from "@/environments/environment";
import { getSessionStorage, Http, IParam, setSessionStorage } from "@core";
/**
* 应用相关处理逻辑工具
* 应用权限服务基
*
* @export
* @class AppUtil
* @abstract
* @class AppAuthServiceBase
* @implements {IAppAuthService}
*/
export class AppUtil {
export abstract class AppAuthServiceBase implements IAppAuthService {
/**
* 应用数据
*
* @private
* @type {IParam}
* @memberof AppAuthServiceBase
*/
private appData: IParam = {};
/**
* 获取应用数据
*
* @static
* @return {*} {IParam}
* @memberof AppAuthServiceBase
*/
public getAppData(): IParam {
return this.appData;
}
/**
* 设置应用数据
*
* @param {IParam} opt
* @memberof AppAuthServiceBase
*/
public setAppData(opt: IParam = {}): void {
this.appData = opt;
}
/**
* 初始化应用权限
*
* @param {IParam} params 应用预置参数
* @return {*} {Promise<any>}
* @memberof AppAuthServiceBase
*/
public async initAppAuth(params: IParam, hooks: IParam): Promise<any> {
let result = true;
if (Environment && Environment.SaaSMode) {
if (getSessionStorage('activeOrgData')) {
result = await this.getAppInitData(hooks, params);
} else {
result = await this.getOrgsByDcsystem(hooks);
if (result) {
result = await this.getAppInitData(hooks, params);
}
}
} else {
result = await this.getAppInitData(hooks, params);
}
return result;
}
/**
* 获取应用初始数据
*
* @param {IParam} hooks 应用钩子
* @param {IParam} [params={}] 应用参数
* @return {*} {Promise<boolean>}
* @memberof AppUtil
* @memberof AppAuthServiceBase
*/
public static async getAppData(hooks: IParam, params: IParam = {}): Promise<boolean> {
public async getAppInitData(hooks: IParam, params: IParam = {}): Promise<boolean> {
try {
const url = '/appdata';
hooks.appBefore.callSync({ url: url, param: params });
......@@ -32,22 +86,24 @@ export class AppUtil {
return false;
}
// token认证把用户信息放入应用级数据
let localAppData: any = {};
if (getCookie('ibzuaa-user')) {
let user: any = JSON.parse(getCookie('ibzuaa-user') as string);
let localAppData: any = {};
if (user.sessionParams) {
localAppData = { context: user.sessionParams };
Object.assign(localAppData, data);
} else {
Object.assign(localAppData, data);
}
data = JSON.parse(JSON.stringify(localAppData));
} else {
Object.assign(localAppData, data);
}
App.setAppData(data);
this.setAppData(deepCopy(localAppData));
return true;
} else {
return false;
}
} catch (error) {
// App.gotoLoginPage();
return false;
}
}
......@@ -58,9 +114,9 @@ export class AppUtil {
* @static
* @param {IParam} hooks 应用钩子
* @return {*} {Promise<boolean>}
* @memberof AppUtil
* @memberof AppAuthServiceBase
*/
public static async getOrgsByDcsystem(hooks: IParam): Promise<boolean> {
public async getOrgsByDcsystem(hooks: IParam): Promise<boolean> {
try {
let tempViewParam = this.hanldeViewParam(window.location.href);
if (!tempViewParam.srfdcsystem) {
......@@ -95,20 +151,85 @@ export class AppUtil {
return false;
}
} catch (error) {
// App.gotoLoginPage();
return false;
}
}
/**
* @description 登录
*
* @memberof AppAuthServiceBase
*/
public async login(opts: IParam): Promise<IParam> {
try {
this.clearAppData();
const result: IParam = await Http.getInstance().post('/v7/login', opts, true);
const { status, data } = result;
if (status == 200) {
if (data && data.token) {
setCookie('ibzuaa-token', data.token, 7, true);
}
if (data && data.user) {
setCookie('ibzuaa-user', JSON.stringify(data.user), 7, true);
}
setCookie('loginname', opts.loginname, 7, true);
return result;
} else {
return result;
}
} catch (error: any) {
return error;
}
}
/**
* 登出
*
* @return {*} {Promise<IParam>}
* @memberof AppAuthServiceBase
*/
public async logout(): Promise<IParam> {
try {
const result: IParam = await Http.getInstance().get('/v7/logout');
const { status, data } = result;
if (status === 200) {
this.clearAppData();
return data;
} else {
return data;
}
} catch (error: any) {
return error;
}
}
/**
* 清除应用级数据
*
* @memberof AppAuthServiceBase
*/
public clearAppData() {
// 清除登录信息
clearCookie('ibzuaa-token', true);
clearCookie('ibzuaa-user', true);
clearCookie('loginname', true);
// 清除应用级数据
this.setAppData();
// 清除租户相关信息
removeSessionStorage('dcsystem');
removeSessionStorage('orgsData');
removeSessionStorage('activeOrgData');
}
/**
* 处理路径数据
*
* @static
* @param {string} urlStr 路径
* @return {*} {*}
* @memberof AppUtil
* @memberof AppAuthServiceBase
*/
public static hanldeViewParam(urlStr: string): any {
public hanldeViewParam(urlStr: string): any {
let tempViewParam: any = {};
const tempViewparam: any = urlStr.slice(urlStr.indexOf('?') + 1);
const viewparamArray: Array<string> = decodeURIComponent(tempViewparam).split(';');
......
import { IAppFuncService, IParam } from "@core";
export class AppFuncService implements IAppFuncService{
/**
* @description 唯一实例
* @private
* @static
* @memberof AppFuncService
*/
private static readonly instance = new AppFuncService();
/**
* @description 获取唯一实例
* @static
* @return {*} {AppFuncService}
* @memberof AppFuncService
*/
public static getInstance(): AppFuncService {
return AppFuncService.instance;
}
/**
* 应用功能服务基类
*
* @export
* @class AppFuncServiceBase
* @implements {IAppFuncService}
*/
export abstract class AppFuncServiceBase implements IAppFuncService{
/**
* @description 执行应用功能
* @param {string} menu 菜单项
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
executeAppFunc(menu: IParam, context: IParam, viewParams: IParam) {
const appFunc = App.getAllFuncs().find((func: IParam)=> Object.is(func.funcTag, menu.funcTag));
......@@ -54,7 +43,7 @@ export class AppFuncService implements IAppFuncService{
* @param {IParam} appFunc 应用功能
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
executeCustomFunc(appFunc: IParam, context: IParam, viewParams: IParam) {
console.warn(`${appFunc.appFuncType} 类型应用功能暂未支持`);
......@@ -65,7 +54,7 @@ export class AppFuncService implements IAppFuncService{
* @param {IParam} appFunc 应用功能
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
executeJavaScript(appFunc: IParam, context: IParam, viewParams: IParam) {
console.warn(`${appFunc.appFuncType} 类型应用功能暂未支持`);
......@@ -77,7 +66,7 @@ export class AppFuncService implements IAppFuncService{
* @param {IParam} appFunc 应用功能
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
executePresetFunc(appFunc: IParam, context: IParam, viewParams: IParam) {
console.warn(`${appFunc.appFuncType} 类型应用功能暂未支持`);
......@@ -88,7 +77,7 @@ export class AppFuncService implements IAppFuncService{
* @param {IParam} appFunc 应用功能
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
openHtmlPage(appFunc: IParam, context: IParam, viewParams: IParam) {
window.open(appFunc.htmlPageUrl, '_blank');
......@@ -99,7 +88,7 @@ export class AppFuncService implements IAppFuncService{
* @param {IParam} appFunc 应用功能
* @param {IParam} context 上下文
* @param {IParam} viewParams 视图参数
* @memberof AppFuncService
* @memberof AppFuncServiceBase
*/
openAppView(appFunc: IParam, context: IParam, viewParams: IParam) {
const view = {
......
import { IAppNotificationService } from "@core/interface";
import { notification } from 'ant-design-vue';
/**
* 应用通知服务基类
*
* @export
* @abstract
* @class AppNotificationServiceBase
* @implements {IAppNotificationService}
*/
export abstract class AppNotificationServiceBase implements IAppNotificationService {
/**
* 成功提示
*
* @param {*} opts
* @memberof AppNotificationServiceBase
*/
public success(opts: any): void {
notification.success(opts);
}
/**
* 信息提示
*
* @param {*} opts
* @memberof AppNotificationServiceBase
*/
public info(opts: any): void {
notification.info(opts);
}
/**
* 警告提示
*
* @param {*} opts
* @memberof AppNotificationServiceBase
*/
public warning(opts: any): void {
notification.warning(opts);
}
/**
* 错误提示
*
* @param {*} opts
* @memberof AppNotificationServiceBase
*/
public error(opts: any): void {
notification.error(opts);
}
}
\ No newline at end of file
export { AppActionServiceBase } from './app-action-service-base';
export { AppAuthServiceBase } from './app-auth-service-base';
export { AppFuncServiceBase } from './app-func-service-base';
export { AppNotificationServiceBase } from './app-notification-service-base';
export { OpenViewServiceBase } from './open-view-service-base';
\ No newline at end of file
import { IOpenViewService, IParam, ViewDetail } from "@core";
import { Subject } from "rxjs";
/**
* 打开视图服务
*
* @export
* @class OpenViewService
*/
export abstract class OpenViewServiceBase implements IOpenViewService {
/**
* @description 打开视图
* @param {ViewDetail} view 视图对象参数
* @param {IParam} params 打开视图参数
* @return {*} {*}
* @memberof OpenViewServiceBase
*/
public openView(view: ViewDetail, params: IParam): Subject<any> | undefined {
// 获取详细视图信息
let _view: ViewDetail | undefined = App.getViewInfo(view.codeName);
if (!_view) {
console.error(`应用中不存在${view.codeName}视图`);
return;
}
// view的openMode覆盖配置的
if (view.openMode) {
_view.openMode = view.openMode;
}
// 重定向视图走重定向逻辑,其他根据openMode打开
if (_view.redirectView) {
this.openRedirectView(_view, params);
} else {
return this.openByOpenMode(_view, params);
}
}
/**
* 根据打开方式打开视图
*
* @param view 视图信息
* @param params 相关参数
* @memberof OpenViewServiceBase
*/
public openByOpenMode(_view: ViewDetail, params: IParam): Subject<any> | undefined {
throw new Error("Method not implemented.");
}
/**
* 打开重定向视图
*
* @param {ViewDetail} _view
* @param {IParam} params
* @memberof OpenViewServiceBase
*/
public openRedirectView(_view: ViewDetail, params: IParam) {
throw new Error("Method not implemented.");
}
}
\ No newline at end of file
export { UIServiceBase } from './entity-ui-service-base';
\ No newline at end of file
export * from './control-service'
export * from './entity-service'
export * from './ui-service'
\ No newline at end of file
export * from './app-service';
export * from './control-service';
export * from './entity-service';
export * from './entity-ui-service';
\ No newline at end of file
......@@ -2,5 +2,4 @@ export { RouteUtil } from './route-util';
export { UIUtil } from './ui-util';
export { UIActionUtil } from './uiaction-util';
export { ViewUtil } from './view-util';
export { AppUtil } from './app-util';
export { DataTypes } from './data-types';
\ No newline at end of file
......@@ -6,7 +6,7 @@ const routes = [
path: "/apps/:app?",
beforeEnter: async (to: any, from: any) => {
const appParams:IParam = {};
const auth: Promise<any> = await App.initAppAuth(appParams);
const auth: Promise<any> = await App.initApp(appParams);
return auth;
},
meta: {
......@@ -18,7 +18,13 @@ const routes = [
{{#if appEntityResource.appDataEntity.allPSAppViews}}
{{#each appEntityResource.appDataEntity.allPSAppViews as |appView|}}
{{#if (eq appView.getRefFlag true)}}
{{#if (or (eq appView.viewType 'DEEDITVIEW') (eq appView.viewType 'DEGRIDVIEW') (eq appView.viewType 'DETREEEXPVIEW') (eq appView.viewType 'DETREEVIEW'))}}
{{#if (or
(eq appView.viewType 'DEEDITVIEW')
(eq appView.viewType 'DEGRIDVIEW')
(eq appView.viewType 'DETREEEXPVIEW')
(eq appView.viewType 'DETREEVIEW')
(eq appView.viewType 'DETABEXPVIEW')
) }}
{
path: "{{appEntityResource.path}}/views/{{lowerCase appView.codeName}}",
meta: {
......@@ -53,6 +59,7 @@ const routes = [
},
{
path: '/404',
name: '404',
component: () => import('@components/common/404.vue')
},
{
......
import { AppActionServiceBase } from "@core";
import { IAppActionService } from "@core/interface";
/**
* 界面行为服务
*
* @export
* @class AppActionService
* @extends {AppActionServiceBase}
* @implements {IAppActionService}
*/
export class AppActionService extends AppActionServiceBase implements IAppActionService {
/**
* @description 唯一实例
* @private
* @static
* @memberof AppActionService
*/
private static readonly instance = new AppActionService();
/**
* @description 获取唯一实例
* @static
* @return {*} {AppActionService}
* @memberof AppActionService
*/
public static getInstance(): AppActionService {
return AppActionService.instance;
}
}
\ No newline at end of file
import { AppAuthServiceBase, IAppAuthService, IParam } from "@core";
/**
* 应用权限服务
*
* @export
* @class AppAuthService
*/
export class AppAuthService extends AppAuthServiceBase implements IAppAuthService {
/**
* 唯一实例
*
* @private
* @static
* @memberof AppAuthService
*/
private static readonly instance = new AppAuthService();
/**
* 获取唯一实例
*
* @static
* @return {*} {AppAuthService}
* @memberof AppAuthService
*/
public static getInstance(): AppAuthService {
return AppAuthService.instance;
}
}
\ No newline at end of file
import { AppFuncServiceBase, IAppFuncService } from "@core";
/**
* 应用功能服务
*
* @export
* @class AppFuncService
* @extends {AppFuncServiceBase}
* @implements {IAppFuncService}
*/
export class AppFuncService extends AppFuncServiceBase implements IAppFuncService {
/**
* @description 唯一实例
* @private
* @static
* @memberof AppFuncService
*/
private static readonly instance = new AppFuncService();
/**
* @description 获取唯一实例
* @static
* @return {*} {AppFuncService}
* @memberof AppFuncService
*/
public static getInstance(): AppFuncService {
return AppFuncService.instance;
}
}
\ No newline at end of file
import { IAppNotificationService, AppNotificationServiceBase } from "@core";
/**
* 通知提示服务
*
* @export
* @class AppNotificationService
* @extends {AppNotificationServiceBase}
* @implements {IAppNotificationService}
*/
export class AppNotificationService extends AppNotificationServiceBase implements IAppNotificationService {
/**
* 唯一实例
*
* @private
* @static
* @memberof AppNotificationService
*/
private static readonly instance = new AppNotificationService();
/**
* 获取唯一实例
*
* @static
* @return {*} {AppNotificationService}
* @memberof AppNotificationService
*/
public static getInstance(): AppNotificationService {
return AppNotificationService.instance;
}
}
\ No newline at end of file
import { Subject } from 'rxjs';
import Router from '@/router';
import Antd from 'ant-design-vue';
import AppDrawerComponent from "@components/render/app-drawer.vue";
import AppLoading from '@components/render/app-loading.vue';
import { IParam, ViewDetail } from '@core';
export class AppDrawer {
/**
* 实例对象
*
* @private
* @static
* @memberof AppDrawer
*/
private static drawer = new AppDrawer();
/**
* 构造方法
*
* @memberof AppDrawer
*/
constructor() {
if (AppDrawer.drawer) {
return AppDrawer.drawer;
}
}
/**
* 获取实例对象
*
* @static
* @returns
* @memberof AppDrawer
*/
public static getInstance() {
if (!AppDrawer.drawer) {
AppDrawer.drawer = new AppDrawer();
}
return AppDrawer.drawer;
}
/**
* 创建 Vue 实例对象
*
* @private
* @param {view} ViewDetail 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @return {*} {Subject<any>}
* @memberof AppDrawer
*/
private createVueExample(view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
let subject: null | Subject<any> = new Subject<any>();
let props = { view: view, context: params.context, viewParams: params.viewParams, isFullscreen: params.isFullscreen, subject: subject, options: options };
let dir = view.fileDir?.replace(/@views/, '');
//Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
const modules = import.meta.glob('../../page/*/*/index.ts');
const AsyncComp = defineAsyncComponent({
// 工厂函数
loader: modules['../../page' + dir + '/index.ts'],
// 加载异步组件时要使用的组件
loadingComponent: AppLoading,
// 在显示 loadingComponent 之前的延迟 | 默认值:200(单位 ms)
delay: 0,
});
if (AsyncComp) {
const component = AppDrawerComponent;
const div = document.createElement('div');
document.body.appendChild(div);
const app = createApp(component,
{
close: () => { document.body.removeChild(div); app.unmount(); },
...props
}
);
app.component(view.name as string, AsyncComp);
app.use(Router).use(Antd).mount(div);
}
return subject;
} catch (error) {
console.error(error);
return new Subject<any>();
}
}
/**
* 打开抽屉
*
* @param {View} view 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @returns {Subject<any>}
* @memberof AppDrawer
*/
public openDrawer(view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
const subject = this.createVueExample(view, params, options);
return subject;
} catch (error) {
console.log(error);
return new Subject<any>();
}
}
/**
* 生成uuid
*
* @private
* @returns {string}
* @memberof AppDrawer
*/
private getUUID(): string {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
}
\ No newline at end of file
import { Subject } from 'rxjs';
import Router from '@/router';
import Antd from 'ant-design-vue';
import AppModalComponent from "@components/render/app-modal.vue";
import AppLoading from '@components/render/app-loading.vue';
import { IParam, ViewDetail } from '@core';
export class AppModal {
/**
* 实例对象
*
* @private
* @static
* @memberof AppModal
*/
private static modal = new AppModal();
/**
*
*
* @type {*}
* @memberof AppModal
*/
public asyncComp: any;
/**
* Creates an instance of AppModal.
*
* @memberof AppModal
*/
private constructor() {
if (AppModal.modal) {
return AppModal.modal;
}
}
/**
* 获取单例对象
*
* @static
* @returns {AppModal}
* @memberof AppModal
*/
public static getInstance(): AppModal {
if (!AppModal.modal) {
AppModal.modal = new AppModal();
}
return AppModal.modal;
}
/**
* 创建vue对象
*
* @private
* @param {view} ViewDetail 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @return {*} {Subject<any>}
* @memberof AppModal
*/
private createVueExample(view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
let subject: null | Subject<any> = new Subject<any>();
let props = { view: view, context: params.context, viewParams: params.viewParams, isFullscreen: params.isFullscreen, subject: subject, options: options };
let dir = view.fileDir?.replace(/@views/, '');
//Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
const modules = import.meta.glob('../../views/*/*/index.ts');
const AsyncComp = defineAsyncComponent({
// 工厂函数
loader: modules['../../views' + dir + '/index.ts'],
// 加载异步组件时要使用的组件
loadingComponent: AppLoading,
// 在显示 loadingComponent 之前的延迟 | 默认值:200(单位 ms)
delay: 0,
});
if (AsyncComp) {
const component = AppModalComponent;
const div = document.createElement('div');
document.body.appendChild(div);
const app = createApp(component,
{
close: () => { document.body.removeChild(div); app.unmount(); },
...props
}
);
app.component(view.name as string, AsyncComp);
app.use(Router).use(Antd).mount(div);
}
return subject;
} catch (error) {
console.error(error);
return new Subject<any>();
}
}
/**
* 打开模态视图
*
* @param {View} view 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @return {*} {Subject<any>}
* @memberof AppModal
*/
public openModal(view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
const subject = this.createVueExample(view, params, options);
return subject;
} catch (error) {
console.log(error);
return new Subject<any>();
}
}
/**
* 获取节点标识
*
* @private
* @returns {string}
* @memberof AppModal
*/
private getUUID(): string {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
}
\ No newline at end of file
import { Subject } from 'rxjs';
import Router from '@/router';
import Antd from 'ant-design-vue';
import AppPopoverComponent from "@components/render/app-popover.vue";
import AppLoading from '@components/render/app-loading.vue';
import { IParam, ViewDetail } from '@core';
import { createPopper, Instance } from '@popperjs/core/lib/popper-lite.js';
import preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow.js';
import flip from '@popperjs/core/lib/modifiers/flip.js';
import { Placement } from '@popperjs/core/lib/enums';
export class AppPopover {
/**
* 实例对象
*
* @private
* @static
* @memberof AppPopover
*/
private static popover = new AppPopover();
/**
* PopperJs实例
*
* @private
* @type {Instance}
* @memberof AppPopover
*/
private popperExample?: Instance;
/**
* 是否显示悬浮窗
*
* @private
* @type {boolean}
* @memberof AppPopover
*/
private showPopper: boolean = false;
/**
* 是否在点击空白区域时自动关闭
*
* @private
* @type {boolean}
* @memberof AppPopover
*/
private isAutoClose: boolean = true;
/**
* 是否在离开该飘窗区域时自动关闭
*
* @private
* @type {boolean}
* @memberof AppPopover
*/
private isMoveOutClose: boolean = false;
/**
* 构造方法
*
* @memberof AppPopover
*/
constructor() {
if (AppPopover.popover) {
return AppPopover.popover;
}
}
/**
* 获取实例对象
*
* @static
* @returns
* @memberof AppPopover
*/
public static getInstance() {
if (!AppPopover.popover) {
AppPopover.popover = new AppPopover();
}
return AppPopover.popover;
}
/**
* 创建 Vue 实例对象
*
* @private
* @param event
* @param {view} ViewDetail 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @return {*} {Subject<any>}
* @memberof AppPopover
*/
private createVueExample(event:any, view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
// 阻止事件冒泡
event.stopPropagation();
// 处理关闭模式(点击空白区域关闭、鼠标离开飘窗区域)
if (params.isAutoClose) {
this.isAutoClose = params.isAutoClose;
}
if (params.isMoveOutClose) {
this.isMoveOutClose = params.isMoveOutClose;
}
// 获取悬浮窗相对位置的元素
const element: Element = event.toElement || event.srcElement;
let subject: null | Subject<any> = new Subject<any>();
let props = { element: element, view: view, context: params.context, viewParams: params.viewParams, isFullscreen: params.isFullscreen, subject: subject, options: options };
// 解析文件路径
let dir = view.fileDir?.replace(/@views/, '');
// Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
const modules = import.meta.glob('../../page/*/*/index.ts');
// 创建一个只有在需要时才会加载的异步组件
const AsyncComp = defineAsyncComponent({
// 工厂函数
loader: modules['../../page' + dir + '/index.ts'],
// 加载异步组件时要使用的组件
loadingComponent: AppLoading,
// 在显示 loadingComponent 之前的延迟 | 默认值:200(单位 ms)
delay: 0,
});
if (AsyncComp) {
const component = AppPopoverComponent;
// 创建dom
const container = document.createElement('div');
container.className = 'app-popover-wrapper';
const div = document.createElement('div');
container.appendChild(div);
document.body.appendChild(container);
this.showPopper = true;
const app = createApp(component,
{
mouseout: () => {
if (!this.showPopper || !this.isMoveOutClose) {
return;
}
this.popperDestroy();
document.body.removeChild(container);
app.unmount();
},
...props
}
);
app.component(view.name as string, AsyncComp);
app.use(Router).use(Antd).mount(div);
// 创建Popover实例
this.popperExample = createPopper(element, div, {
placement: view.placement as Placement,
strategy: 'absolute',
modifiers: [preventOverflow, flip]
});
// 点击空白区域时事件处理
container.addEventListener('click', () => {
if (!this.showPopper || !this.isAutoClose) {
return;
}
this.popperDestroy();
document.body.removeChild(container);
app.unmount();
})
}
return subject;
} catch (error) {
console.error(error);
return new Subject<any>();
}
}
/**
* 打开飘窗
*
* @param {*} event
* @param {View} view 视图对象
* @param {IParam} params 视图参数
* @param {IParam} [options] 模态配置项
* @returns {Subject<any>}
* @memberof AppPopover
*/
public openPopover(event:any, view: ViewDetail, params: IParam, options?: IParam): Subject<any> {
try {
const subject = this.createVueExample(event, view, params, options);
return subject;
} catch (error) {
console.log(error);
return new Subject<any>();
}
}
/**
* 销毁popper(带回填数据)
*
* @memberof AppPopover
*/
public popperDestroy(): void {
if (this.popperExample) {
this.popperExample.destroy();
this.showPopper = false;
}
}
}
\ No newline at end of file
export { AppDrawer } from './app-drawer';
export { AppModal } from './app-modal';
export { AppPopover } from './app-popover';
export { OpenViewService } from './open-view-service';
\ No newline at end of file
import { IOpenViewService, IParam, OpenViewServiceBase, RouteUtil, ViewDetail } from '@core';
import router from '@/router';
import { Subject } from 'rxjs';
import { AppModal } from './app-modal';
/**
* 打开视图服务
* @export
* @class OpenViewService
*/
export class OpenViewService extends OpenViewServiceBase implements IOpenViewService {
/**
* 唯一实例
*
* @private
* @static
* @memberof OpenViewService
*/
private static readonly instance = new OpenViewService();
/**
* 获取唯一实例
*
* @static
* @return {*} {OpenViewService}
* @memberof OpenViewService
*/
public static getInstance(): OpenViewService {
return OpenViewService.instance;
}
/**
* 根据打开方式打开视图
*
* @param view 视图信息
* @param params 相关参数
*/
public openByOpenMode(view: ViewDetail, params: IParam): Subject<any> | undefined {
const openMode = params.openMode || view.openMode;
const { viewParams, context } = params;
// 路由打开视图
if (openMode == 'INDEXVIEWTAB' || openMode == 'POPUPAPP') {
// TODO 视图关系参数处理
const routePath = RouteUtil.buildUpRoutePath(view, context, viewParams, router.currentRoute.value);
if (openMode == 'INDEXVIEWTAB') {
router.push(routePath);
} else {
window.open('./#' + routePath, '_blank');
}
return;
} else if (openMode == 'POPUPMODAL') {
return AppModal.getInstance().openModal(view, params);
} else if (openMode?.indexOf('DRAWER') !== -1) {
// TODO PMS上面抽屉DRAWER_TOP
} else if (openMode == 'POPOVER') {
// TODO 打开气泡卡片
} else {
console.error(`未支持${openMode}打开方式`);
}
}
/**
* 打开重定向视图
*
* @param view 视图信息
* @param params 相关参数
*/
public openRedirectView(view: any, params: IParam) {
// TODO 重定向视图处理
}
}
export * from './app-open-view-service';
export { AppActionService } from './app-action-service';
export { AppAuthService } from './app-auth-service';
export { AppFuncService } from './app-func-service';
export { AppNotificationService } from './app-notification-service';
\ No newline at end of file
......@@ -25,4 +25,18 @@ body{
border-radius: 0;
box-shadow: none;
border: 0;
}
// 飘窗样式
.app-popover-wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
.app-popover {
border-radius: 5px;
overflow: auto;
background: #e8e8e8;
}
}
\ No newline at end of file
import {{page.codeName}} from "./{{spinalCase page.codeName}}.vue";
export default {{page.codeName}};
<script setup lang="ts">
import { Subject } from 'rxjs';
import { PortalView, IActionParam, IParam, IContext } from '@core';
import { viewState } from './{{spinalCase page.codeName}}-state';
{{#page.ctrls}}
{{#eq controlType "DASHBOARD"}}
import { {{codeName}}Dashboard } from '@widgets/app/{{spinalCase codeName}}-dashboard';
{{/eq}}
{{/page.ctrls}}
// props声明和默认值处理
interface Props {
context?: IContext;
viewParams?: IParam;
openType?: "ROUTE" | "MODAL" | "EMBED";
viewSubject?: Subject<IActionParam>;
}
const props = withDefaults(defineProps<Props>(), {
openType:'ROUTE',
viewSubject: () => new Subject<IActionParam>()
})
// emit声明
interface ViewEmit {
(name: "onViewEvent", value: IActionParam): void;
}
const emit = defineEmits<ViewEmit>();
// 安装功能模块,提供状态和能力方法
const { state } = new PortalView(viewState, props, emit).moduleInstall();
</script>
<template>
<AppPortalViewLayout :class="['app-edit-view', state.viewSysCss]">
<template v-slot:caption>
<AppIconText
class="app-view__caption"
size="large"
:subCaption="state.subCaption"
:showCaptionBar="state.showCaptionBar"
:text="state.viewCaption"
/>
</template>
{{#page.ctrls}}
{{#eq controlType "DASHBOARD"}}
<{{codeName}}Dashboard
ref="dashboard"
name="{{name}}"
:context="state.context"
:viewParams="state.viewParams"
:controlAction="state.{{name}}.action"
:viewSubject="state.viewSubject"
@ctrlEvent="onCtrlEvent"
></{{codeName}}Dashboard>
{{/eq}}
{{/page.ctrls}}
</AppPortalViewLayout>
</template>
<style lang="scss">
</style>
\ No newline at end of file
import {{page.codeName}} from "./{{spinalCase page.codeName}}.vue";
export default {{page.codeName}};
export const viewState = {
{{> @macro/front-end/views/view-base-config.hbs}}
};
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { PickupView, IActionParam, IParam, IContext } from '@core';
import { viewState } from './{{spinalCase page.codeName}}-state';
{{#page.ctrls}}
{{#eq controlType "TABEXPPANEL"}}
import { {{codeName}}TabExpPanel } from '@widgets/{{spinalCase appEntity.codeName}}/{{spinalCase codeName}}-tab-exp-panel';
{{/eq}}
{{/page.ctrls}}
// props声明和默认值处理
interface Props {
context?: IContext;
viewParams?: IParam;
openType?: "ROUTE" | "MODAL" | "EMBED";
viewSubject?: Subject<IActionParam>;
}
const props = withDefaults(defineProps<Props>(), {
openType:'ROUTE',
viewSubject: () => new Subject<IActionParam>()
})
// emit声明
interface ViewEmit {
(name: "viewEvent", value: IActionParam): void;
}
const emit = defineEmits<ViewEmit>();
// 安装功能模块,提供状态和能力方法
const { state, onCancel, onConfirm, onCtrlEvent, selectData } = new PickupView(viewState, props, emit).moduleInstall();
</script>
<template>
<AppPickupViewLayout :class="['app-tab-exp-view', state.viewSysCss]">
<template #caption>
<AppIconText class="app-view__caption" size="large" :text="state.viewCaption" />
</template>
{{#page.ctrls}}
{{#eq controlType "TOOLBAR"}}
<template v-slot:toolbar>
<AppToolbar
mode="button"
name="{{lowerCase codeName}}"
:actionModel="state.viewToolbarModel"
@onToolbarEvent="onToolbarEvent"/>
</template>
{{/eq}}
{{#eq controlType "TABEXPPANEL"}}
<{{codeName}}TabExpPanel
name="{{name}}"
:context="state.context"
:viewParams="state.viewParams"
:viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent"
></{{codeName}}TabExpPanel>
{{/eq}}
{{/page.ctrls}}
</AppPickupViewLayout>
</template>
\ No newline at end of file
import {{ctrl.codeName}}Dashboard from "./{{spinalCase ctrl.codeName}}-dashboard.vue";
export { {{ctrl.codeName}}Dashboard };
// 部件配置对象
export const ctrlState = {
controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}',
isEnableCustomized: {{ctrl.enableCustomized}},
};
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { ctrlState } from './{{spinalCase ctrl.codeName}}-dashboard-state';
import { DashboardControl, IActionParam, IParam, IContext } from '@core';
{{#each ctrl.psControls as | control |}}
{{#neq portletType "CONTAINER"}}
{{#if control.psAppDataEntity}}
import { {{codeName}}Portlet } from '@widgets/{{spinalCase control.psAppDataEntity.codeName}}/{{spinalCase codeName}}-portlet';
{{else}}
import { {{codeName}}Portlet } from '@widgets/app/{{spinalCase codeName}}-portlet';
{{/if}}
{{/neq}}
{{/each}}
interface Props {
name:string,
context: IContext;
viewParams?: IParam;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps < Props > (), {
viewSubject: () => new Subject < IActionParam > (),
})
// emit声明
interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void;
}
const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法
const { state } = new DashboardControl(ctrlState, props, emit).moduleInstall();
// 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' });
</script>
<template>
<div class="app-dashboard{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
{{#if (eq ctrl.enableCustomized false)}}
{{#eq ctrl.psLayout.layout "FLEX"}}
<div class="app-dashboard-layout-flex" style="{{#if ctrl.psLayout.dir}}flex-direction: {{ctrl.psLayout.dir}};{{/if}}{{#if ctrl.psLayout.align}}justify-content: {{ctrl.psLayout.align}};{{/if}}{{#if ctrl.psLayout.vAlign}}align-items: {{ctrl.psLayout.vAlign}};{{/if}}">
</div>
{{else}}
<a-row class="app-dashboard-layout-table">
{{#each ctrl.psPortlets as | portlet | }}
<a-col
{{> @macro/front-end/widgets/common/layout-pos.hbs item=portlet.psLayoutPos}} >
{{#eq portlet.portletType 'CONTAINER'}}
{{#if portlet.psPortlets}}
<div class="portlet-card" :bordered="false" dis-hover :padding="0">
{{else}}
<div class="portlet-card custom-card" :bordered="false" dis-hover :padding="10">
{{/if}}
{{#if (and portlet.showTitleBar portlet.title)}}
<div class="portlet-card-title">{{portlet.title}}</div>
{{/if}}
{{#each portlet.psPortlets as | item | }}
{{#eq item.psLayout.layout "FLEX"}}
<div class="app-dashboard-layout-flex" style="{{#if item.psLayout.dir}}flex-direction: {{item.psLayout.dir}};{{/if}}{{#if item.psLayout.align}}justify-content: {{item.psLayout.align}};{{/if}}{{#if item.psLayout.vAlign}}align-items: {{item.psLayout.vAlign}};{{/if}}">
</div>
{{else}}
<a-row class="app-dashboard-layout-table">
<a-col
{{> @macro/front-end/widgets/common/layout-pos.hbs item=item.psLayoutPos}} >
<{{codeName}}Portlet
ref="portlet"
name="{{item.name}}"
:context="state.context"
:viewParams="state.viewParams"
:viewSubject="state.viewSubject"
@ctrlEvent="onCtrlEvent"
></{{codeName}}Portlet>
</a-col>
</a-row>
{{/eq}}
{{/each}}
</div>
{{else}}
<{{codeName}}Portlet
ref="portlet"
name="{{name}}"
:context="state.context"
:viewParams="state.viewParams"
:viewSubject="state.viewSubject"
@ctrlEvent="onCtrlEvent"
></{{codeName}}Portlet>
{{/eq}}
</a-col>
{{/each}}
</a-row>
{{/eq}}
{{/if}}
</div>
</template>
<style lang="scss">
</style>
\ No newline at end of file
......@@ -45,6 +45,8 @@ defineExpose({ state, name: '{{ctrl.name}}' });
<div class="app-pickup-view-panel{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
{{#if ctrl.embeddedPSAppDEView}}
<{{ctrl.embeddedPSAppDEView.codeName}}
:context="state.context"
:viewParams="state.viewParams"
:isShowButton="state.isShowButton"
:selectedData="state.selectedData"
:viewSubject="state.viewSubject"
......
import {{ctrl.codeName}}Portlet from "./{{spinalCase ctrl.codeName}}-portlet.vue";
export { {{ctrl.codeName}}Portlet };
// 部件配置对象
export const ctrlState = {
controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}',
};
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { ctrlState } from './{{spinalCase ctrl.codeName}}-portlet-state';
import { PortletControl, IActionParam, IParam, IContext } from '@core';
interface Props {
name:string,
context: IContext;
viewParams?: IParam;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps < Props > (), {
viewSubject: () => new Subject < IActionParam > (),
})
// emit声明
interface CtrlEmit {
(name: "ctrlEvent", value: IActionParam): void;
}
const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法
const { state } = new PortletControl(ctrlState, props, emit).moduleInstall();
// 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' });
</script>
<template>
<div>portlet</div>
</template>
<style lang="scss">
</style>
\ No newline at end of file
import {{ctrl.codeName}}TabExpPanel from "./{{spinalCase ctrl.codeName}}-tab-exp-panel.vue";
export { {{ctrl.codeName}}TabExpPanel };
export const ctrlState = {
controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}',
data: {},
};
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { IActionParam, IParam, ControlAction, TabExpPanelControl, IContext } from '@core';
import { ctrlState } from './{{spinalCase ctrl.codeName}}-tab-exp-panel-state';
{{#each ctrl.psControls as |viewPanel| }}
import { {{codeName}}TabViewPanel } from '@widgets/{{spinalCase viewPanel.psAppDataEntity.codeName}}/{{spinalCase codeName}}-tab-view-panel';
{{/each}}
interface Props {
name:string,
context: IContext;
viewParams?: IParam;
showBusyIndicator?: boolean;
selectedData?: string;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps < Props > (), {
viewSubject: () => new Subject < IActionParam > (),
showBusyIndicator: true,
})
// emit声明
interface CtrlEmit {
(name: "onCtrlEvent", value: IActionParam): void;
}
const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法
const { state, onCtrlEvent } = new TabExpPanelControl(ctrlState, props, emit).moduleInstall();
// 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' });
</script>
<template>
<div class="app-tab-exp-panel{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
{{#if ctrl.psControls}}
<a-tabs class="app-tab-exp-panel__tabs">
{{#each ctrl.psControls as |viewPanel| }}
<a-tab-pane {{#if viewPanel.psSysCss}}class="{{viewPanel.psSysCss.cssName}}"{{/if}} key="{{viewPanel.codeName}}">
<template #tab>
<AppIconText {{#if viewPanel.psSysImage}}{{#if viewPanel.psSysImage.cssClass}}:iconClass="{{viewPanel.psSysImage.cssClass}}" {{/if}}{{#if viewPanel.psSysImage.imagePath}}:imgPath="{{viewPanel.psSysImage.imagePath}}" {{/if}}{{/if}}text="{{viewPanel.caption}}"/>
</template>
<{{viewPanel.codeName}}TabViewPanel
name="{{name}}"
:context="state.context"
:viewParams="state.viewParams"
:viewSubject="state.viewSubject"
@onCtrlEvent="onCtrlEvent"
/>
</a-tab-pane>
{{/each}}
</a-tabs>
{{else}}
<div class="app-tab-exp-panel--empty">视图不存在,请配置分页视图</div>
{{/if}}
</div>
</template>
\ No newline at end of file
import {{ctrl.codeName}}TabViewPanel from "./{{spinalCase ctrl.codeName}}-tab-view-panel.vue";
export { {{ctrl.codeName}}TabViewPanel };
export const ctrlState = {
controlCodeName: '{{ctrl.codeName}}',
controlName: '{{ctrl.name}}',
data: {},
};
\ No newline at end of file
<script setup lang="ts">
import { Subject } from 'rxjs';
import { IActionParam, IParam, ControlAction, TabViewPanelControl, IContext } from '@core';
import { ctrlState } from './{{spinalCase ctrl.codeName}}-tab-view-panel-state';
{{#if ctrl.embeddedPSAppDEView}}
import {{ctrl.embeddedPSAppDEView.codeName}} from '@views/{{spinalCase ctrl.embeddedPSAppDEView.psAppModule.codeName}}/{{spinalCase ctrl.embeddedPSAppDEView.codeName}}';
{{/if}}
interface Props {
name:string,
context: IContext;
viewParams?: IParam;
showBusyIndicator?: boolean;
viewSubject: Subject<IActionParam>;
}
const props = withDefaults(defineProps < Props > (), {
viewSubject: () => new Subject < IActionParam > (),
showBusyIndicator: true,
})
// emit声明
interface CtrlEmit {
(name: "onCtrlEvent", value: IActionParam): void;
}
const emit = defineEmits <CtrlEmit> ();
// 安装功能模块,提供状态和能力方法
const { state, onViewEvent } = new TabViewPanelControl(ctrlState, props, emit).moduleInstall();
// 暴露内部状态及能力
defineExpose({ state, name: '{{ctrl.name}}' });
</script>
<template>
<div class="app-tab-view-panel{{#if ctrl.psSysCss}} {{ctrl.psSysCss.cssName}}{{/if}}">
{{#if ctrl.embeddedPSAppDEView}}
<{{ctrl.embeddedPSAppDEView.codeName}}
:context="state.context"
:viewParams="state.viewParams"
:viewSubject="state.viewSubject"
@viewEvent="onViewEvent"
/>
{{else}}
<div class="app-tab-view-panel--empty">视图不存在,请配置选择视图</div>
{{/if}}
</div>
</template>
\ No newline at end of file
......@@ -407,6 +407,11 @@ assert-never@^1.2.1:
resolved "https://registry.npmmirror.com/assert-never/download/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
integrity sha1-EfDjY78UYgX7CBk7XHuQ9NHPRP4=
async-validator@^3.3.0:
version "3.5.2"
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500"
integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==
async-validator@^4.0.0, async-validator@^4.0.7:
version "4.0.7"
resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe"
......@@ -980,6 +985,11 @@ mlly@^0.2.2:
dependencies:
import-meta-resolve "^1.1.1"
moment@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
monaco-editor@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.24.0.tgz#990b55096bcc95d08d8d28e55264c6eb17707269"
......
*volumes
*target
.settings
*node_modules
*bin
*.project
*.classpath
*.factorypath
.history
.idea
**.iml
*.jar
*.log
.DS_Store
**.ibizlab-generator-ignore
**.DS_Store
**@macro/**
\ No newline at end of file
type: PSSYSTEM
psdevsln: {{system.getPSDevSlnId}}
psdevslnsys: {{system.getPubSystemId}}
psdevslnsysname: {{system.getLogicName}}
{{#if system.pSSVNInstRepo}}
git-remote: {{system.pSSVNInstRepo.gitPath}}
{{else}}
# 需自行补充 git-remote 参数,值为 git 地址
{{/if}}
\ No newline at end of file
<#if pub.getPSDeployCenter()?? && sysrun.getRunMode()??>
<#if pub.getPSDeployCenter().getCIType()?? && (pub.getPSDeployCenter().getCIType()=="JENKINS") >
<#if sysrun.getRunMode() == "STARTMSAPI">
<#assign depapi = sysrun.getPSDevSlnMSDepAPI()>
<#assign configId = depapi.getId()>
<#assign config = "api"+depapi.getName()>
<#assign depnode = sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()>
<#assign depplatform = sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatform()>
<#elseif sysrun.getRunMode() == "STARTMSAPP">
<#assign depapp = sysrun.getPSDevSlnMSDepApp()>
<#assign configId = depapp.getId()>
<#assign config = "app"+depapp.getName()>
<#assign depnode = sysrun.getPSDevSlnMSDepApp().getPSDCMSPlatformNode()>
<#assign depplatform = sysrun.getPSDevSlnMSDepApp().getPSDCMSPlatform()>
</#if>
<#if sys.getPSSVNInstRepo().getGitBranch()?? && sys.getPSSVNInstRepo().getGitBranch()!="">
<#assign branch=sys.getPSSVNInstRepo().getGitBranch()>
<#else>
<#assign branch='master'>
</#if>
<?xml version='1.1' encoding='UTF-8'?>
<project>
<actions/>
<description>${sys.codeName}</description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>para1</name>
<description></description>
<defaultValue>para1</defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>para2</name>
<description></description>
<defaultValue>para2</defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
</properties>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>
BUILD_ID=DONTKILLME
source /etc/profile
rm -rf ${sys.codeName?lower_case}
git clone -b ${branch} $para2 ${sys.codeName?lower_case}/
export NODE_OPTIONS=--max-old-space-size=4096
cd ${sys.codeName?lower_case}/
<#if sysrun.getRunMode() == "STARTMSAPP">
<#if pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="SWARM") >
mkdir -p /var/lib/jenkins/appcache/${depapp.getId()}
cd app_${pub.getPSApplication().getPKGCodeName()}/app
yarn
ln -s /var/lib/jenkins/appcache/${depapp.getId()} node_modules/.cache
yarn build
cd ..
yarn
yarn build
rm -rf app
tar -zcvf docker/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.tar.gz --exclude=docker * > /dev/null
cd docker
docker build -t registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}:latest .
docker push registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}:latest
docker -H $para1 stack deploy --compose-file=swarm.yaml ${depplatform.getName()} --with-registry-auth
<#elseif pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="K8S") >
cd app_${pub.getPSApplication().getPKGCodeName()}/app
yarn
yarn build
cd ..
yarn
yarn build
rm -rf app
tar -zcvf docker/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.tar.gz * > /dev/null
cd docker
docker build -t registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}:latest .
docker push registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}:latest
set +e
kubectl --kubeconfig ~/shanghai-demo-01 delete -f k8s.yaml -n ${depplatform.getName()?lower_case}
set -e
kubectl --kubeconfig ~/shanghai-demo-01 create -f k8s.yaml -n ${depplatform.getName()?lower_case}
<#else>
echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh
chmod -R 777 *
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r {{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.jar ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()}:${depnode.getWorkshopPath()}/${configId}
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/{{projectName}}-app-${pub.getPSApplication().getPKGCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
</#if>
</#if>
<#if sysrun.getRunMode() == "STARTMSAPI">
mvn clean package -P${pub.getPSSysServiceAPI().getCodeName()?lower_case}
mvn install -P${pub.getPSSysServiceAPI().getCodeName()?lower_case}
<#if pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="SWARM") >
cd {{projectName}}-provider
<#if depapi.getUserParam("multiplatform","")?? && depapi.getUserParam("multiplatform","")=="true">
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} exec:exec@prepare
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} exec:exec@buildpush
<#else>
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:build
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:push
</#if>
docker -H $para1 stack deploy --compose-file=src/main/docker/{{projectName}}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.yaml ${depplatform.getName()} --with-registry-auth
<#elseif pub.getPSDeployCenter().getCDType()?? && (pub.getPSDeployCenter().getCDType()=="K8S") >
cd {{projectName}}-provider
<#if depapi.getUserParam("multiplatform","")?? && depapi.getUserParam("multiplatform","")=="true">
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} exec:exec@prepare
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} exec:exec@buildpush
<#else>
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:build
mvn -P${pub.getPSSysServiceAPI().getCodeName()?lower_case} docker:push
</#if>
set +e
kubectl --kubeconfig ~/shanghai-demo-01 delete -f src/main/docker/{{projectName}}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}-k8s.yaml -n ${depplatform.getName()?lower_case}
set -e
kubectl --kubeconfig ~/shanghai-demo-01 create -f src/main/docker/{{projectName}}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}-k8s.yaml -n ${depplatform.getName()?lower_case}
<#else>
echo &apos;echo &quot;$para1&quot;&apos; &gt; apppasswd.sh
chmod -R 777 *
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;mkdir -p ${depnode.getWorkshopPath()}/${configId}&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; scp -r {{projectName}}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()}:${depnode.getWorkshopPath()}/${configId}
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;ps -ef | grep &apos;${depnode.getWorkshopPath()}/${configId}&apos;| tr -s &apos; &apos;|cut -d&apos; &apos; -f2,8,9 | grep -v grep | grep &apos;jar&apos; | cut -d&apos; &apos; -f1|xargs --no-run-if-empty kill -9&quot;
setsid env SSH_ASKPASS=&apos;./apppasswd.sh&apos; DISPLAY=&apos;none:0&apos; ssh ${depnode.getSSHUserName()}@${depnode.getSSHIPAddr()} &quot;source /etc/profile;source ~/.bash_profile; nohup java -jar -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=128m ${depnode.getWorkshopPath()}/${configId}/{{projectName}}-provider-${pub.getPSSysServiceAPI().getCodeName()?lower_case}.jar &gt;&gt;${depnode.getWorkshopPath()}/${configId}/${sys.codeName?lower_case}_${config?lower_case}-`date --date=&apos;0 days ago&apos; +%Y-%m-%d`.log 2&gt;&amp;1 &amp;&quot;
</#if>
</#if>
</command>
</hudson.tasks.Shell>
</builders>
<publishers>
<hudson.plugins.ws__cleanup.WsCleanup plugin="ws-cleanup@0.34">
<patterns class="empty-list"/>
<deleteDirs>false</deleteDirs>
<skipWhenFailed>false</skipWhenFailed>
<cleanWhenSuccess>true</cleanWhenSuccess>
<cleanWhenUnstable>true</cleanWhenUnstable>
<cleanWhenFailure>true</cleanWhenFailure>
<cleanWhenNotBuilt>true</cleanWhenNotBuilt>
<cleanWhenAborted>true</cleanWhenAborted>
<notFailBuild>false</notFailBuild>
<cleanupMatrixParent>false</cleanupMatrixParent>
<externalDelete></externalDelete>
</hudson.plugins.ws__cleanup.WsCleanup>
</publishers>
<buildWrappers/>
</project>
</#if>
</#if>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>{{projectName}}</artifactId>
<packaging>pom</packaging>
<parent>
<groupId>{{packageName}}</groupId>
<artifactId>{{projectName}}-dependencies</artifactId>
<version>1.0.0.0</version>
<relativePath>{{projectName}}-dependencies/pom.xml</relativePath>
</parent>
<modules>
<!-- dependencies -->
<module>{{projectName}}-dependencies</module>
<!-- cores -->
<module>{{projectName}}-core</module>
<!-- services -->
<module>{{projectName}}-provider</module>
</modules>
<dependencies>
<dependency>
<groupId>net.ibizsys.central.r8</groupId>
<artifactId>ibiz-central-r8</artifactId>
<version>0.2.15</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.7.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>ibizmvnrepository</id>
<name>ibizmvnrepository</name>
<url>http://172.16.240.220:8081/nexus/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>{{projectName}}</artifactId>
<groupId>{{packageName}}</groupId>
<version>1.0.0.0</version>
</parent>
<artifactId>{{projectName}}-core</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<!-- JBPM -->
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-flow-builder</artifactId>
</dependency>
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-bpmn2</artifactId>
</dependency>
<!-- Drools -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
</dependency>
<!-- <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency> -->
<!--MapStruct高性能属性映射工具-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<!--baomidou-jobs定时服务 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>jobs-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
</dependencies>
<properties>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<profiles>
<profile>
<id>diff</id>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.version}'}</version>
<executions>
<execution>
<id>prepare-newdb</id>
<configuration>
<changeLogFile>${project.basedir}'}/src/main/resources/liquibase/h2_table.xml</changeLogFile>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:file:${project.build.directory}/db/new;MODE=mysql</url>
<username>root</username>
<dropFirst>true</dropFirst>
</configuration>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
<execution>
<id>prepare-olddb</id>
<configuration>
<changeLogFile>${project.basedir}/src/main/resources/liquibase/master_table.xml</changeLogFile>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:file:${project.build.directory}/db/last;MODE=mysql</url>
<username>root</username>
<dropFirst>true</dropFirst>
</configuration>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
<execution>
<id>make-diff</id>
<configuration>
<changeLogFile>${project.basedir}/src/main/resources/liquibase/empty.xml</changeLogFile>
<diffChangeLogFile>${project.basedir}/src/main/resources/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:file:${project.build.directory}/db/last;MODE=mysql</url>
<username>root</username>
<password></password>
<referenceUrl>jdbc:h2:file:${project.build.directory}/db/new;MODE=mysql</referenceUrl>
<referenceDriver>org.h2.Driver</referenceDriver>
<referenceUsername>root</referenceUsername>
<verbose>true</verbose>
<logging>debug</logging>
<contexts>!test</contexts>
<diffExcludeObjects>Index:.*,table:ibzfile,ibzuser,ibzdataaudit,ibzcfg,IBZFILE,IBZUSER,IBZDATAAUDIT,IBZCFG</diffExcludeObjects>
</configuration>
<phase>process-resources</phase>
<goals>
<goal>diff</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
package {{packageName}}.core.config;
import com.baomidou.jobs.starter.EnableJobs;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
@EnableJobs
@Configuration
@ConditionalOnProperty(name = "jobs.enabled", havingValue = "true", matchIfMissing = false)
public class JobsConfiguration {
}
package {{packageName}}.core.runtime;
public interface ISystemRuntime extends net.ibizsys.central.r8.IR8SystemRuntime {
{{#each system.allPSDataEntities as |entity|}}
default {{packageName}}.core.{{lowerCase entity.pSSystemModule.codeName}}.service.I{{pascalCase entity.codeName}}Service get{{pascalCase entity.codeName}}Service(){
return ({{packageName}}.core.{{lowerCase entity.pSSystemModule.codeName}}.service.I{{pascalCase entity.codeName}}Service) this.getDEService("{{entity.dynaModelFilePath}}");
}
{{/each}}
}
package {{packageName}}.core.runtime;
import net.ibizsys.central.dataentity.IDataEntityRuntime;
import net.ibizsys.central.dataentity.service.IDEService;
import net.ibizsys.central.r8.R8SystemRuntime;
import net.ibizsys.model.IPSDynaInstService;
import net.ibizsys.model.res.IPSSysUtil;
import net.ibizsys.runtime.res.ISysUtilRuntime;
public class SystemRuntimeBase extends R8SystemRuntime implements ISystemRuntime {
@Override
public String getName() {
return "{{system.name}}";
}
{{#if system.allPSSysUtils}}
@Override
protected ISysUtilRuntime createDefaultSysUtilRuntime(IPSSysUtil iPSSysUtil) {
{{#each system.allPSSysUtils as |sysUtil|}}
{{#if (and (eq sysUtil.utilType "USER")) (unless sysUtil.pSSysSFPlugin)}}
if(iPSSysUtil.getCodeName().equals("{{sysUtil.codeName}}"))
return new {{packageName}}.core.runtime.sysutil.{{sysUtil.codeName}}();
{{/if}}
{{/each}}
return super.createDefaultSysUtilRuntime(iPSSysUtil);
}
{{/if}}
@Override
protected void onInit() throws Exception {
this.registerDEServiceObjs();
super.onInit();
}
@Override
public IDEService getDEService(IDataEntityRuntime iDataEntityRuntime) {
if (!this.getSystemGatewayContext().isMultiSystemMode()) {
return this.getSystemGatewayContext().getDEService("{{packageName}}.core.runtime.ISystemRuntime", iDataEntityRuntime.getId());
}
return super.getDEService(iDataEntityRuntime);
}
protected void registerDEServiceObjs() {
{{#each system.allPSDataEntities as |entity|}}
this.registerDEServiceObj("{{entity.dynaModelFilePath}}","{entityService}");
{{/each}}
}
}
<#assign hasCodeList=false>
<#if sys.getAllPSCodeLists()??>
<#list sys.getAllPSCodeLists() as codeList>
<#if codeList.getCodeListType()=='STATIC'>
<#assign hasCodeList=true>
<#break >
</#if>
</#list>
</#if>
<#if hasCodeList>
package {{packageName}}.core.runtime.dict;
import lombok.Getter;
public class StaticDict {
<#if sys.getAllPSCodeLists()??>
<#list sys.getAllPSCodeLists() as codeList>
<#assign hasCodeItem=calcHasCodeItem(codeList)>
<#if codeList.getCodeListType()=='STATIC' && hasCodeItem>
<#assign codeListName=codeList.codeName>
<#comment>数值代码表int,其余为String</#comment>
<#if codeList.isCodeItemValueNumber()>
<#assign valueType="int">
<#else>
<#assign valueType="String">
</#if>
/**
* 代码表[${codeList.name}]
*/
@Getter
public enum ${codeListName} {
<#if codeList.getAllPSCodeItems()??>
<#list codeList.getAllPSCodeItems() as codeItem>
<#assign codeItemValue=codeItem.getValue()>
<#assign codeItemText=codeItem.getText()>
${codeItem.codeName?upper_case}(<#if valueType=='int'>${codeItemValue}<#else>"${codeItemValue}"</#if>,"${codeItemText}")<#if codeItem_has_next>,<#else>;</#if>
</#list>
</#if>
private ${valueType} value;
private String text;
private String valueSeparator="<#if codeList.getValueSeparator()??>${codeList.getValueSeparator()}</#if>";
private String textSeparator="<#if codeList.getTextSeparator()??>${codeList.getTextSeparator()}</#if>";
private String emptyText="<#if codeList.getEmptyText()?? && codeList.getEmptyText()!='未定义'>${codeList.getEmptyText()}</#if>";
${codeListName}(${valueType} value , String text) {
this.value=value;
this.text = text;
}
}
</#if>
</#list>
</#if>
}
</#if>
<#comment>替换代码表中的特殊字符</#comment>
<#function replaceCodeItemValue codeItemValue>
<#assign result=codeItemValue?replace("[^\\w]+","_","r")>
<#return result>
</#function>
<#comment>判断是否含有代码项</#comment>
<#function calcHasCodeItem codeList>
<#assign hasCodeItem=false>
<#if codeList.getAllPSCodeItems()??>
<#list codeList.getAllPSCodeItems() as codeItem>
<#assign hasCodeItem=true>
<#break>
</#list>
</#if>
<#return hasCodeItem>
</#function>
\ No newline at end of file
{{#if (and (eq sysUtil.utilType "USER")) (unless sysUtil.pSSysSFPlugin)}}
package {{packageName}}.core.runtime.sysutil;
import net.ibizsys.central.r8.sysutil.IR8SysUtilRuntime;
public interface I{{sysUtil.codeName}} extends IR8SysUtilRuntime {
}
{{/if}}
\ No newline at end of file
{{#if (and (eq sysUtil.utilType "USER")) (unless sysUtil.pSSysSFPlugin)}}
package {{packageName}}.core.runtime.sysutil;
import net.ibizsys.central.r8.sysutil.IR8SysUtilRuntime;
import net.ibizsys.central.r8.sysutil.R8SysUtilRuntimeBase;
import {{packageName}}.core.runtime.ISystemRuntime;
public class {{sysUtil.codeName}} extends R8SysUtilRuntimeBase implements I{{sysUtil.codeName}} {
public ISystemRuntime getSystemRuntime() {
return (ISystemRuntime) super.getSystemRuntime();
}
}
{{/if}}
\ No newline at end of file
package {{packageName}}.core.{{modules}}.dto;
import java.sql.Timestamp;
import java.util.List;
import java.math.BigDecimal;
import net.ibizsys.central.util.EntityDTO;
import com.fasterxml.jackson.annotation.JsonIgnore;
import net.ibizsys.runtime.util.DataTypeUtils;
public class {{apiDto.codeName}} extends EntityDTO {
{{#each apiDto.apiDtoFields as |field|}}
/**
* {{field.logicName}}
*/
public final static String FIELD_{{upperCase field.codeName}} = "{{field.codeName}}";
/**
* 设置「{{field.logicName}}
*
* @param {{camelCase codeName}}
*/
@JsonIgnore
public {{apiDto.codeName}} set{{pascalCase codeName}}({{javaType}} {{camelCase codeName}}) {
this._set(FIELD_{{upperCase field.codeName}}, {{camelCase codeName}});
return this;
}
/**
* 获取「{{field.logicName}}」值
*
*/
@JsonIgnore
public {{javaType}} get{{pascalCase codeName}}() {
{{#if (or (eq javaType 'Integer') (eq javaType 'Long') (eq javaType 'Double') (eq javaType 'BigInteger') (eq javaType 'BigDecimal') (eq javaType 'Timestamp'))}}
try{
{{#if (eq javaType 'Timestamp')}}
return DataTypeUtils.getDateTimeValue(this._get(FIELD_{{upperCase field.codeName}}),null);
{{else}}
return DataTypeUtils.get{{javaType}}Value(this._get(FIELD_{{upperCase field.codeName}}),null);
{{/if}}
}catch (Exception e){
throw new RuntimeException(e);
}
{{else}}
return ({{javaType}}) this._get(FIELD_{{upperCase field.codeName}});
{{/if}}
}
/**
* 判断 「{{field.logicName}}」是否有值
*
*/
@JsonIgnore
public boolean contains{{pascalCase codeName}}() {
return this._contains(FIELD_{{upperCase field.codeName}});
}
/**
* 重置 「{{field.logicName}}
*
*/
@JsonIgnore
public {{apiDto.codeName}} reset{{pascalCase codeName}}() {
this._reset(FIELD_{{upperCase field.codeName}});
return this;
}
{{/each}}
}
\ No newline at end of file
package {{packageName}}.core.{{entity.module}}.service;
{{#each entity.allPSDEMethodDTOs as |deMethodDTO|}}
{{#if (or (eq deMethodDTO.type 'DEFAULT') (eq deMethodDTO.type 'DEACTIONINPUT'))}}
import {{packageName}}.core.{{entity.module}}.dto.{{deMethodDTO.name}};
{{/if}}
{{/each}}
import net.ibizsys.central.dataentity.service.IDEService;
import net.ibizsys.central.util.IEntityDTO;
import net.ibizsys.central.util.ISearchContextDTO;
import net.ibizsys.central.util.SearchContextDTO;
import net.ibizsys.model.dataentity.action.IPSDEAction;
import net.ibizsys.model.dataentity.ds.IPSDEDataSet;
import net.ibizsys.model.dataentity.service.IPSDEMethodDTO;
import java.math.BigDecimal;
import java.util.List;
import org.springframework.data.domain.Page;
/**
* {{entity.logicName}}
{{#if entity.memo}}
* {{entity.memo}}
{{/if}}
*
*/
public interface I{{entity.codeName}}Service extends IDEService<{{entity.defaultPSDEMethodDTO.name}}, SearchContextDTO> {
{{#each entity.allPSDEFields as |field|}}
/**
* 属性: {{field.logicName}}
*/
String FIELD_{{upperCase field.name}} = "{{field.name}}";
{{/each}}
{{#each entity.allPSDEActions as |action|}}
/**
* 行为: {{action.logicName}}
*/
String ACTION_{{upperCase action.name}} = "{{action.name}}";
{{/each}}
{{#each entity.allPSDEDataQueries as |query|}}
/**
* 查询: {{query.logicName}}
*/
String DATAQUERY_{{upperCase query.name}} = "{{query.name}}";
{{/each}}
{{#each entity.allPSDEDataSets as |dataSet|}}
/**
* 集合: {{dataSet.logicName}}
*/
String DATASET_{{upperCase dataSet.name}} = "{{dataSet.name}}";
{{/each}}
@Override
default String getDataEntityId() {
return "{{entity.dynaModelFilePath}}";
}
@Override
default IEntityDTO createEntityDTO(IPSDEMethodDTO iPSDEMethodDTO) {
String strName = iPSDEMethodDTO.getName();
switch (strName) {
{{#each entity.allPSDEMethodDTOs as |deMethodDTO|}}
{{#if (or (eq deMethodDTO.type 'DEFAULT') (eq deMethodDTO.type 'DEACTIONINPUT'))}}
case "{{deMethodDTO.name}}":
return new {{deMethodDTO.name}}();
{{/if}}
{{/each}}
default:
return null;
}
}
@Override
default ISearchContextDTO createSearchContextDTO(IPSDEMethodDTO iPSDEMethodDTO) {
return new SearchContextDTO();
}
@Override
default Object executeAction(String strActionName, IPSDEAction iPSDEAction, Object[] args) throws Throwable {
switch (strActionName.toLowerCase()) {
{{#each entity.allPSDEActions as |deAction|}}
{{#if deAction.enableBackend}}
case "{{lowerCase deAction.name}}" :
{{#if neq deAction.pSDEActionReturn.type 'VOID'}}
return this.{srfmethodname(deAction.getCodeName())}(({getDEActionInputType(deAction)}) args[0]);
{{else}}
this.{srfmethodname(deAction.getCodeName())}(({getDEActionInputType(deAction)}) args[0]);
return null;
{{/if}}
{{/if}}
{{/each}}
}
return this.getDataEntityRuntime().executeAction(strActionName, iPSDEAction, args, true);
}
@Override
default Object fetchDataSet(String strDataSetName, IPSDEDataSet iPSDEDataSet, Object[] args) throws Throwable {
switch (strDataSetName.toLowerCase()) {
{{#each entity.allPSDEDataSets as |deDataSet|}}
case "{{lowerCase deDataSet.name}}" :
return this.fetch{{pascalCase deDataSet.codeName}}((ISearchContextDTO) args[0]);
{{/each}}
}
return this.getDataEntityRuntime().fetchDataSet(strDataSetName, iPSDEDataSet, args, true);
}
{{#each entity.allPSDEActions as |deAction|}}
{{#if deAction.enableBackend}}
/**
* {{#if deAction.logicName}}{{deAction.logicName}}{{else}}{{deAction.name}}{{/if}}
{{#if deAction.memo}}
* {{deAction.memo}}
{{/if}}
*
* @param dto
* @throws Throwable
*/
default {getDEActionReturn(deAction)} {srfmethodname(deAction.getCodeName())}({getDEActionInput(deAction)}) throws Throwable {
{{#if neq deAction.pSDEActionReturn.type 'VOID'}}return ({getDEActionReturn(deAction)}) {{/if}}this.getDataEntityRuntime().executeAction("{deAction.getName()}", null, new Object[]{{getDEActionInputParams(deAction)}}, true);
}
{{/if}}
{{/each}}
{{#each entity.allPSDEDataSets as |dataSet|}}
{{#neq dataSet.ctionHoldera 2}}
/**
* {{#if dataSet.logicName}}{{dataSet.logicName}}{{else}}{{dataSet.name}}{{/if}}
{{#if dataSet.memo}}
* {{dataSet.memo}}
{{/if}}
*
* @param dto
* @return
* @throws Throwable
*/
default Page<{{entity.defaultPSDEMethodDTO.name}}> fetch{{pascalCase dataSet.codeName}}(ISearchContextDTO dto) throws Throwable {
return (Page<{{entity.defaultPSDEMethodDTO.name}}>) this.getDataEntityRuntime().fetchDataSet("{{dataSet.name}}", null, new Object[]{dto}, true);
}
{{/neq}}
{{/each}}
{{#each entity.allPSDEDataQueries as |dataQuery|}}
/**
* {{#if dataQuery.logicName}}{{dataQuery.logicName}}{{else}}{{dataQuery.name}}{{/if}}
{{#if dataQuery.memo}}
* {{dataQuery.memo}}
{{/if}}
*
* @param dto
* @return
* @throws Throwable
*/
default List<{{entity.defaultPSDEMethodDTO.name}}> select{{pascalCase dataQuery.codeName}}(ISearchContextDTO dto) throws Throwable {
Object obj = this.getDataEntityRuntime().selectDataQuery("{{dataQuery.name}}", dto);
return (List<{{entity.defaultPSDEMethodDTO.name}}>) obj;
}
{{/each}}
}
\ No newline at end of file
package {{packageName}}.core.{{entity.module}}.service.impl;
{{#each entity.allPSDEMethodDTOs as |deMethodDTO|}}
{{#if (or (eq deMethodDTO.type 'DEFAULT') (eq deMethodDTO.type 'DEACTIONINPUT'))}}
import {{packageName}}.core.{{entity.module}}.dto.{{deMethodDTO.name}};
{{/if}}
{{/each}}
import net.ibizsys.central.dataentity.service.DEServiceBase;
import net.ibizsys.central.dataentity.service.IDEService;
import net.ibizsys.central.r8.IR8SystemGateway;
import {{packageName}}.core.runtime.ISystemRuntime;
import net.ibizsys.model.dataentity.action.IPSDEAction;
import net.ibizsys.central.util.SearchContextDTO;
import net.ibizsys.model.dataentity.ds.IPSDEDataSet;
import net.ibizsys.runtime.dataentity.DataEntityRuntimeException;
import net.ibizsys.runtime.dataentity.IDataEntityRuntimeContext;
import net.ibizsys.runtime.dataentity.action.IDEActionPluginRuntime;
import net.ibizsys.runtime.dataentity.ds.IDEDataSetPluginRuntime;
import net.ibizsys.runtime.util.ActionSessionManager;
import net.ibizsys.runtime.util.Errors;
import net.ibizsys.runtime.util.IAction;
import net.ibizsys.runtime.util.ITransactionalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.List;
@Service
public class {{entity.codeName}}ServiceImpl extends DEServiceBase<{{entity.defaultPSDEMethodDTO.name}}, SearchContextDTO> implements {{packageName}}.core.{{entity.module}}.service.I{{entity.codeName}}Service {
@Autowired(required = false)
IR8SystemGateway systemGateway;
ISystemRuntime iSystemRuntime;
@Override
public ISystemRuntime getSystemRuntime() {
if (this.iSystemRuntime == null)
this.iSystemRuntime = systemGateway.getSystemRuntime(ISystemRuntime.class, false);
return this.iSystemRuntime;
}
@PostConstruct
private void postConstruct() throws Exception {
if (systemGateway != null && !systemGateway.isMultiSystemMode()) {
try {
IDEService iDEService = systemGateway.getDEService("{{packageName}}.core.runtime.ISystemRuntime", this.getDataEntityId());
if(iDEService.getClass() == {{entity.codeName}}ServiceImpl.class)
systemGateway.registerDEService("{{packageName}}.core.runtime.ISystemRuntime", this.getDataEntityId(), this);
}catch (Exception e){
systemGateway.registerDEService("{{packageName}}.core.runtime.ISystemRuntime", this.getDataEntityId(), this);
}
}
}
@Override
protected void onPrepare() {
super.onPrepare();
try {
{{#each entity.allPSDEActions as |deAction|}}
<#if deAction.isEnableBackend() && !(deAction.getPSSysSFPlugin()??)>
{{#if (eq deAction.actionType 'USERCUSTOM')}}
this.getDataEntityRuntime().registerDEActionPluginRuntime(ACTION_{{upperCase deAction.name}}, new IDEActionPluginRuntime() {
@Override
public Object execute(IDataEntityRuntimeContext iDataEntityRuntimeContext, IPSDEAction iPSDEAction, Object[] args, Object actionData) throws Throwable {
{{#if neq deAction.pSDEActionReturn.type 'VOID'}}
return ActionSessionManager.getCurrentSession().execute(new IAction() {
@Override
public Object execute(Object[] args) throws Throwable {
return on{{pascalCase deAction.codeName}}(({getDEActionInputType(deAction)}) args[0]);
}
}, args, ITransactionalUtil.PROPAGATION_REQUIRED);
{{else}}
return ActionSessionManager.getCurrentSession().execute(new IAction() {
@Override
public Object execute(Object[] args) throws Throwable {
on{{pascalCase deAction.codeName}}(({getDEActionInputType(deAction)}) args[0]);
return null;
}
}, args, ITransactionalUtil.PROPAGATION_REQUIRED);
{{/if}}
}
});
{{elseif deAction.isRenderBeforeAfter}}
this.getDataEntityRuntime().registerDEActionPluginRuntime(ACTION_{{upperCase deAction.name}}, new IDEActionPluginRuntime() {
@Override
public Object execute(IDataEntityRuntimeContext iDataEntityRuntimeContext, IPSDEAction iPSDEAction, Object[] args, Object actionData) throws Throwable {
{getDEActionInputType2(deAction)} dto = ({getDEActionInputType2(deAction)}) args[0];
onBefore{deAction.getCodeName()}(dto);
<#if actionReturnType != 'VOID'>{getDEActionReturn(deAction)} result = ({getDEActionReturn(deAction)}) </#if>iDataEntityRuntimeContext.executeActionReal(iPSDEAction, args, actionData);
<#if actionReturnType != 'VOID'>
return onAfter{deAction.getCodeName()}(<#if actionReturnType != 'VOID'>result, </#if>dto);
<#else>
onAfter{deAction.getCodeName()}(<#if actionReturnType != 'VOID'> result, </#if>dto);
return null;
</#if>
}
});
</#if>
{{/if}}
{{/each}}
//结果集
{{#each entity.allPSDEDataSets as |dataSet|}}
this.getDataEntityRuntime().registerDEDataSetPluginRuntime(DATASET_{{upperCase dataSet.name}}, new IDEDataSetPluginRuntime() {
@Override
public Object fetch(IDataEntityRuntimeContext iDataEntityRuntimeContext, IPSDEDataSet iPSDEDataSet, Object[] args, Object actionData) throws Throwable {
return iDataEntityRuntimeContext.fetchDataSetReal(iPSDEDataSet, args, actionData);
}
});
{{/each}}
} catch (Throwable e) {
throw new RuntimeException(String.format("准备实体服务发生异常,%s", e.getMessage()), e);
}
}
{{#each entity.allPSDEActions as |deAction|}}
{{#if (and deAction.enableBackend (unless deAction.pSSysSFPlugin))}}
{{#if (eq deAction.actionType 'USERCUSTOM')}}
protected {getDEActionReturn(deAction)} on{{pascalCase deAction.codeName}}({getDEActionInput(deAction)}) throws Throwable {
throw new DataEntityRuntimeException(this.getDataEntityRuntime(), String.format("行为[%s]未实现", "{{#if deAction.logicName}}{{deAction.logicName}}{{else}}{{deAction.name}}{{/if}}"), Errors.NOTIMPL);
}
{{elseif deAction.isRenderBeforeAfter}}
protected void onBefore{{pascalCase deAction.codeName}}({getDEActionInput2(deAction)}) throws Throwable {
}
protected {getDEActionReturn(deAction)} onAfter{{pascalCase deAction.codeName}}({{#if neq deAction.pSDEActionReturn.type 'VOID'}}{getDEActionReturn(deAction)} result, {{/if}}{getDEActionInput2(deAction)}) throws Throwable {
{{#if neq deAction.pSDEActionReturn.type 'VOID'}}return result;{{/if}}
}
{{/if}}
{{/if}}
{{/each}}
}
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSLOCALE
</#ibiztemplate>
#${item.name}
<#list sys.getAllPSLanguageReses() as res>
<#assign content=res.getContent(item.id,false)>
<#if content?? && content?length gt 0>
${res.getLanResTag()}=${srfibiz5msg(content)}
</#if>
</#list>
\ No newline at end of file
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
</databaseChangeLog>
<#if sysrun.getPSDBDevInst()??>
<#assign dbinst = sysrun.getPSDBDevInst()>
create schema if not exists ${dbinst.getUserName()};
set schema ${dbinst.getUserName()};
<#--CREATE ALIAS IF NOT EXISTS TO_NUMBER AS $$-->
<#--Long toNumber(String value) {-->
<#--return value == null ? null : Long.valueOf(value);-->
<#--}-->
<#--$$;-->
</#if>
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<!--liquibase启动时需要指定chanlogxml,若无changelog,则使用此xml来初始化liquibase,使liquibase能正常启动 -->
</databaseChangeLog>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<include file="h2_table.xml" relativeToChangelogFile="true"/>
<include file="view.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#if sysrun.getPSDBDevInst()??>
<#assign dbinst = sysrun.getPSDBDevInst()>
<#assign curdate=.now?string["yyyyMMddHHmmss"]>
</#if>
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
<#assign sequenceNumber=0>
<#list sys.getAllPSDataEntities() as de>
<#if de.getTableName?? &&de.getTableName()?? &&de.getStorageMode()?? &&de.getStorageMode()==1 && de.isSubSysDE()==false>
<#assign bPubDb=false>
<#if de.getAllPSDEDBConfigs()?? >
<#list de.getAllPSDEDBConfigs() as dbpub>
<#if dbpub.isPubModel() == true >
<#assign bPubDb = true>
<#break >
</#if>
</#list>
</#if>
<#assign sequenceNumber=sequenceNumber+1>
<#assign deVersion=de.getVersion()?c>
<#assign deName=de.getName()?lower_case>
<#assign hasPhisicalDEField=false>
<#comment>判断表中是否有物理属性</#comment>
<#list de.getAllPSDEFields() as defield>
<#if defield.isPhisicalDEField()==true>
<#assign hasPhisicalDEField=true>
<#break>
</#if>
</#list>
<#comment>输出表结构</#comment>
<#if bPubDb==true && hasPhisicalDEField==true>
<!--输出实体[${de.getName()}]数据结构 -->
<changeSet author="root" id="tab-${deName}-${deVersion}-${sequenceNumber}">
<createTable tableName="${de.getTableName()}">
<#list de.getAllPSDEFields() as defield>
<#if defield.isPhisicalDEField()==true><#comment>物理属性</#comment>
<#assign dataType="${srfdatatype(defield.getStdDataType())}">
<#assign javaType="${srfr7javatype(defield.stdDataType)}">
<#comment>varchar需要设置字段长度,若不设置,则liquibase比较时会自动填充,最终恢复到生产库会报错</#comment>
<#if javaType=='String'>
<#if defield.getLength()?? && defield.getLength()?c!='-1'>
<#assign dataType="${srfdatatype(defield.getStdDataType())}(${defield.getLength()?c})" >
<#else>
<#assign dataType="${srfdatatype(defield.getStdDataType())}(200)">
</#if>
<#elseif dataType?lower_case=='decimal'>
<#assign dataType="${srfdatatype(defield.getStdDataType())}(38,2)"><#comment>设置数值类型精度</#comment>
</#if>
<#if javaType='BigDecimal'>
<#assign dataType="DECIMAL(38,2)"><#comment>数据类型转换varchar-->decimal</#comment>
</#if>
<#comment>由于liquibase不支持修改mysql的remarks,修改remarks会导致启动报错,所以mysql数据库暂时不发remarks</#comment>
<column name="${defield.getName()}" remarks="<#if dbinst?? && (dbinst.getDBType()!='MYSQL5')>${defield.getLogicName()}</#if>" type="${dataType}">
<#if defield.isKeyDEField()==true>
<#comment>oracle中约束名长度不能大于30</#comment>
<#assign constraintName="PK_"+de.getName()+"_"+defield.getName()>
<#if constraintName?length gt 30>
<#assign constraintName=constraintName?substring(0,30)>
</#if>
<constraints primaryKey="true" primaryKeyName="${constraintName}"/>
</#if>
</column>
</#if>
</#list>
</createTable>
</changeSet>
</#if>
</#if>
</#list>
<#comment>输出外键</#comment>
<#list sys.getAllPSDataEntities() as de>
<#assign deVersion=de.getVersion()?c>
<#assign deName=de.getName()?lower_case>
<#if de.getTableName?? &&de.getTableName()?? &&de.getTableName()?upper_case!='IBZUSER'&&de.getTableName()?upper_case!='IBZFILE'&&de.getTableName()?upper_case!='IBZDATAAUDIT' &&de.getStorageMode()?? &&de.getStorageMode()==1 && de.isSubSysDE()==false>
<#assign bPubDb=false>
<#if de.getAllPSDEDBConfigs()?? >
<#list de.getAllPSDEDBConfigs() as dbpub>
<#if dbpub.isPubModel() == true >
<#assign bPubDb = true>
<#break >
</#if>
</#list>
</#if>
<#if de.getMinorPSDERs?? && de.getMinorPSDERs()?? >
<#list de.getMinorPSDERs() as fk>
<#if fk.getDERType()=='DER1N' && fk.isEnableFKey()==true>
<#if fk.getMajorPSDataEntity().getTableName()??>
<#assign sequenceNumber=sequenceNumber+1>
<#comment>oracle中约束名长度不能大于30</#comment>
<#assign fkConstraintName=fk.getName()>
<#if fkConstraintName?length gt 30>
<#assign fkConstraintName=fkConstraintName?substring(0,30)>
</#if>
<#if !P.exists("fk_",fkConstraintName,"") && bPubDb==true>
<!--输出实体[${de.getName()}]外键关系 -->
<changeSet author="root" id="fk-${deName}-${deVersion}-${sequenceNumber}">
<addForeignKeyConstraint baseColumnNames="${fk.getPSPickupDEField().getName()}" baseTableName="${de.getTableName()}" constraintName="${fkConstraintName}" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" referencedColumnNames="${fk.getMajorPSDataEntity().getKeyPSDEField().getName()}" referencedTableName="${fk.getMajorPSDataEntity().getTableName()}" validate="true"/>
</changeSet>
</#if>
</#if>
</#if>
</#list>
</#if>
</#if>
</#list>
</databaseChangeLog>
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<includeAll path="liquibase/changelog/"/>
<include file="view.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<includeAll path="liquibase/changelog/"/>
</databaseChangeLog>
\ No newline at end of file
<#if sysrun.getPSDBDevInst()??>
<#assign dbinst = sysrun.getPSDBDevInst()>
<#assign curdate=.now?string["yyyyMMddHHmmss"]>
</#if>
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
<#assign sequenceNumber=0>
<#comment>输出视图信息</#comment>
<#list sys.getAllPSDataEntities() as de>
<#if de.getStorageMode()==1>
<#if de.getViewName?? && ((de.getViewName()!'')!='') && de.isSubSysDE()==false && de.isNoViewMode()!=true>
<#assign bPubDb=false>
<#if de.getAllPSDEDBConfigs()?? >
<#list de.getAllPSDEDBConfigs() as dbpub>
<#if dbpub.isPubModel() == true >
<#assign bPubDb = true>
<#break >
</#if>
</#list>
</#if>
<#assign sequenceNumber=sequenceNumber+1>
<#assign deVersion=de.getVersion()?c>
<#assign deName=de.getName()?lower_case>
<#if !P.exists("view_",de.getViewName(),"") && bPubDb == true>
<!--输出实体[${de.getName()}]视图结构信息 runOnChange="true" 当视图发生变更时,通过liquibase强刷prod的视图,实现视图的同步-->
<changeSet author="root" id="view-${deName}-${deVersion}-${sequenceNumber}" runOnChange="true">
<createView fullDefinition="false" replaceIfExists="true" viewName="${de.getViewName()}">
<#if de.getAllPSDEDataQueries?? && de.getAllPSDEDataQueries()??>
<#assign resultDataQuery = de.getAllPSDEDataQueries()>
<#list resultDataQuery as singleQuery>
<#if singleQuery.getCodeName()?lower_case=='default'>
<#if singleQuery.getAllPSDEDataQueryCodes()??>
<#assign queryCodeList = singleQuery.getAllPSDEDataQueryCodes()>
<#assign sql="">
<#comment>遍历数据查询,有oracle则输出,无则输出mysql</#comment>
<#list singleQuery.getAllPSDEDataQueryCodes() as dedqcode>
<#assign sql=srfjavasqlcode('${dedqcode.getQueryCode()}')>
<#assign dbtype=dedqcode.getDBType()?lower_case?replace("mysql5","mysql")>
<#if dbtype?lower_case=='oracle'>
<#break>
</#if>
</#list>
<![CDATA[ ${sql}]]>
<#break>
</#if>
</#if>
</#list>
</#if>
</createView>
</changeSet>
</#if>
</#if>
</#if>
</#list>
</databaseChangeLog>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>{{projectName}}-dependencies</artifactId>
<groupId>{{packageName}}</groupId>
<version>1.0.0.0</version>
<packaging>pom</packaging>
<!-- Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
</parent>
<properties>
<!-- Spring Cloud Alibaba(2.2.x.RELEASE) & Spring Cloud(Spring Cloud Greenwich) & Spring Boot(2.2.x.RELEASE) compatibility -->
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud-openfeign.version>2.2.1.RELEASE</spring-cloud-openfeign.version>
<!-- Alibaba Druid -->
<!-- <alibaba-druid.version>1.1.21</alibaba-druid.version> -->
<!-- Mybatis Plus -->
<mybatis-plus.version>3.4.1</mybatis-plus.version>
<mybatis-plus-dynamic-datasource.version>3.2.1</mybatis-plus-dynamic-datasource.version>
<!-- Swagger2 -->
<springfox-swagger.version>2.9.2</springfox-swagger.version>
<!-- JBPM+Drools -->
<drools-version>7.23.0.Final</drools-version>
<!-- Error -->
<zalando-problem-spring-web.version>0.23.0</zalando-problem-spring-web.version>
<!-- Security -->
<spring-cloud-security.version>2.1.1.RELEASE</spring-cloud-security.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<!--logstash-logback-encoder-->
<logstash.version>5.2</logstash.version>
<!--Zuul网关-->
<spring-cloud-starter-netflix-zuul.version>2.2.1.RELEASE</spring-cloud-starter-netflix-zuul.version>
<!--MapStruct高性能属性映射工具-->
<mapstruct.version>1.3.0.Final</mapstruct.version>
<!--Java Web Token-->
<jsonwebtoken-jjwt.version>0.9.1</jsonwebtoken-jjwt.version>
<!--Liquibase数据库版本更新工具-->
<liquibase.version>3.9.0</liquibase.version>
<!--H2内存数据库-->
<h2.version>1.4.200</h2.version>
<!--caffeine缓存-->
<caffeine-cache.version>2.6.0</caffeine-cache.version>
<!--反序列化工具-->
<kryo.version>4.0.2</kryo.version>
<!--httpClient -->
<openfeign-httpclient.version>11.0</openfeign-httpclient.version>
<!--baomidou-jobs定时服务 -->
<baomidou-jobs.version>1.0.3</baomidou-jobs.version>
<!-- eureka微服务注册中心 -->
<eureka-client.version>2.2.1.RELEASE</eureka-client.version>
<!-- 阿里sentinel熔断器 -->
<alibaba-sentinel.version>2.1.1.RELEASE</alibaba-sentinel.version>
<!-- 阿里seata分布式事务 -->
<alibaba-seata.version>1.3.0</alibaba-seata.version>
{{#each system.allPSSystemDBConfigs as |dbConfig|}}
{{#if (eq dbConfig.dBType 'MYSQL5')}}
{{else if (eq dbConfig.dBType 'ORACLE')}}
<!-- Oracle 驱动 -->
<oracle.version>19.8.0.0</oracle.version>
{{else if (eq dbConfig.dBType 'POSTGRESQL')}}
<!-- PostgreSql 驱动 -->
<postgresql.version>42.2.6</postgresql.version>
{{/if}}
{{/each}}
{{#if system.enableMQ}}
<rocketmq.version>4.7.0</rocketmq.version>
{{/if}}
<flowable-modeler.version>6.4.2</flowable-modeler.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Alibaba Cloud -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-dependencies</artifactId>
<version>${spring-cloud-openfeign.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${alibaba-sentinel.version}</version>
</dependency>
<!-- eureka服务注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${eureka-client.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${alibaba-druid.version}</version>
</dependency>
<!-- Mybatis Plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${mybatis-plus-dynamic-datasource.version}</version>
</dependency> -->
<!-- Liquibase -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
</dependency>
<!-- H2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
<!-- Swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<!-- JBPM -->
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-flow-builder</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-bpmn2</artifactId>
<version>${drools-version}</version>
</dependency>
<!-- Drools -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools-version}</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>${logstash.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>${spring-cloud-starter-netflix-zuul.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
<version>${spring-cloud-security.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jsonwebtoken-jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.zalando</groupId>
<artifactId>problem-spring-web</artifactId>
<version>${zalando-problem-spring-web.version}</version>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>${caffeine-cache.version}</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo-shaded</artifactId>
<version>${kryo.version}</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>${openfeign-httpclient.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>jobs-spring-boot-starter</artifactId>
<version>${baomidou-jobs.version}</version>
</dependency>
{{#if system.enableGlobalTransaction}}
<!-- 阿里seata分布式事务 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${alibaba-seata.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
{{/if}}
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-json-converter</artifactId>
<version>${flowable-modeler.version}</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-ui-modeler-conf</artifactId>
<version>${flowable-modeler.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- Liquibase -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<!-- H2内存库 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
{{#each system.allPSSystemDBConfigs as |dbConfig|}}
{{#if (eq dbConfig.dBType 'MYSQL5')}}
<!-- MySQL驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
{{else if (eq dbConfig.dBType 'ORACLE')}}
<!-- Oracle驱动包 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>${oracle.version}</version>
</dependency>
{{else if (eq dbConfig.dBType 'POSTGRESQL')}}
<!-- PostgreSQL驱动包 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
{{/if}}
{{/each}}
{{#if system.enableES}}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
{{/if}}
{{#if system.enableMQ}}
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${rocketmq.version}</version>
</dependency>
{{/if}}
{{#each system.allPSSysSFPubs as |pub|}}
{{#eq pub.contentType "CODE"}}
{{#each pub.getPSSysSFPubPkgs as |package|}}
{{#if package.pkgParam}}
{{package.pkgParam}}
{{/if}}
{{/each}}
{{/eq}}
{{/each}}
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>{{projectName}}</artifactId>
<groupId>{{packageName}}</groupId>
<version>1.0.0.0</version>
</parent>
<artifactId>{{projectName}}-provider</artifactId>
<dependencies>
<dependency>
<groupId>{{packageName}}</groupId>
<artifactId>{{projectName}}-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<docker.image.prefix>registry.cn-shanghai.aliyuncs.com/ibizsys</docker.image.prefix>
</properties>
<profiles>
<profile>
<id>runtime</id>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>{{projectName}}-provider</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>{{packageName}}.IBizRuntimeApplication</mainClass>
<outputDirectory>../</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
{{!--
<#if pub.getPSDeployCenter()?? && pub.getPSDeployCenter().getPSRegistryRepo()??>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<serverId>ibiz-dev</serverId>
<imageName>${docker.image.prefix}/${project.artifactId}:latest</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>../</directory>
<include>${project.artifactId}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>prepare</id>
<configuration>
<executable>cp</executable>
<arguments>
<argument>../${project.artifactId}.jar</argument>
<argument>${project.basedir}/src/main/docker/</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>buildpush</id>
<configuration>
<executable>docker</executable>
<arguments>
<argument>buildx</argument>
<argument>build</argument>
<argument>--platform</argument>
<argument>linux/amd64,linux/arm64</argument>
<argument>-t</argument>
<argument>${docker.image.prefix}/${project.artifactId}:latest</argument>
<argument>${project.basedir}/src/main/docker</argument>
<argument>--push</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-model</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<!-- 输出目录 -->
<outputDirectory>${project.build.outputDirectory}/model--${sys.getPubSystemId()}--${sys.getSysVersion()}</outputDirectory>
<resources>
<resource>
<!-- 资源目录 -->
<directory>${project.basedir}/../model</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</#if>
--}}
</plugins>
</build>
</profile>
</profiles>
</project>
FROM image.ibizlab.cn/library/openjdk:8-jre-alpine
ENV TZ=Asia/Shanghai \
SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
IBIZ_SLEEP=0 \
JAVA_OPTS=""
CMD echo "The application will start in ${IBIZ_SLEEP}s..." && \
sleep ${IBIZ_SLEEP} && \
java ${JAVA_OPTS} -Duser.timezone=$TZ -Djava.security.egd=file:/dev/./urandom -jar /{{projectName}}-provider.jar
EXPOSE 8081
ADD {{projectName}}-provider.jar /{{projectName}}-provider.jar
<#ibiztemplate>
TARGET=PSSYSSERVICEAPI
</#ibiztemplate>
<#assign httpPort = "8081">
<#assign nacosUrl = "127.0.0.1:8848" >
<#assign redisHost = "127.0.0.1" >
<#assign redisPort = "6379" >
<#assign redisDataBase = "0" >
<#assign dbUserName="root">
<#assign dbPassWord="123456">
<#assign dbUrl="jdbc:mysql://127.0.0.1:3306/"+sys.name+"?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&allowMultiQueries=true">
<#assign dbDriver="com.mysql.jdbc.Driver">
<#assign dockerPortMap="">
<#if sysrun?? && sysrun.getPSDevSlnMSDepAPI()?? >
<#assign depSysApi=sysrun.getPSDevSlnMSDepAPI()>
<#if depSysApi.getHttpPort()??>
<#assign httpPort = depSysApi.getHttpPort()?c>
</#if>
<#if depSysApi.getPSDCMSPlatformNode()??>
<#assign depSysApiPlatformNode=depSysApi.getPSDCMSPlatformNode()>
<#assign depSysApiPlatform=depSysApi.getPSDCMSPlatform()>
<#if depSysApiPlatform.getUserParam("nacos","127.0.0.1:8848")??>
<#assign nacosUrl = depSysApiPlatform.getUserParam("nacos","127.0.0.1:8848")>
</#if>
<#if depSysApi.getUserParam("spring.redis.host","")?? && depSysApi.getUserParam("spring.redis.host","")!="">
<#assign redisHost = depSysApi.getUserParam("spring.redis.host","")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.host","")?? && depSysApiPlatform.getUserParam("spring.redis.host","")!="">
<#assign redisHost = depSysApiPlatform.getUserParam("spring.redis.host","")>
</#if>
<#if depSysApi.getUserParam("spring.redis.port","")?? && depSysApi.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApi.getUserParam("spring.redis.port")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.port","")?? && depSysApiPlatform.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApiPlatform.getUserParam("spring.redis.port")>
</#if>
<#if depSysApi.getUserParam("spring.redis.database","")?? && depSysApi.getUserParam("spring.redis.database","")!="">
<#assign redisDataBase = depSysApi.getUserParam("spring.redis.database","")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.database","")?? && depSysApiPlatform.getUserParam("spring.redis.database","")!="">
<#assign redisDataBase = depSysApiPlatform.getUserParam("spring.redis.database","")>
</#if>
<#if depSysApi.getUserParam("portmap","")?? && depSysApi.getUserParam("portmap","")!="">
<#assign dockerPortMap= depSysApi.getUserParam("portmap","")>
</#if>
</#if>
</#if>
<#comment>数据库配置</#comment>
<#if sysrun.getPSDBDevInst()??>
<#assign sysRunDBInst = sysrun.getPSDBDevInst()>
<#assign dbUserName=sysRunDBInst.getUserName()>
<#assign dbPassWord=sysRunDBInst.getPassword()>
<#assign dbUrl=sysRunDBInst.getConnUrl()>
<#if (sysRunDBInst.getDBType()=='MYSQL5')>
<#assign dbDriver="com.mysql.jdbc.Driver">
<#assign dbUrl=dbUrl+"&allowMultiQueries=true&serverTimezone=GMT%2B8">
<#elseif (sysRunDBInst.getDBType()=='DB2')>
<#assign dbDriver="com.ibm.db2.jcc.DB2Driver">
<#elseif (sysRunDBInst.getDBType()=='ORACLE')>
<#assign dbDriver="oracle.jdbc.driver.OracleDriver">
<#elseif (sysRunDBInst.getDBType()=='SQLSERVER')>
<#assign dbDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver">
<#elseif (sysRunDBInst.getDBType()=='POSTGRESQL')>
<#assign dbDriver="org.postgresql.Driver">
<#elseif (sysRunDBInst.getDBType()=='PPAS')>
<#assign dbDriver="com.edb.Driver">
</#if>
</#if>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{projectName}}-provider
labels:
app: {{projectName}}-provider
spec:
replicas: 1
selector:
matchLabels:
app: {{projectName}}-provider
template:
metadata:
labels:
app: {{projectName}}-provider
spec:
imagePullSecrets:
- name: aly-shanghai
containers:
- name: {{projectName}}-provider
image: registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-provider:latest
imagePullPolicy: Always
ports:
- containerPort: ${httpPort}
<#if sysrun?? && sysrun.getPSDevSlnMSDepAPI()?? && sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()??>
<#assign depSysApi=sysrun.getPSDevSlnMSDepAPI()>
<#assign depSysApiPlatformNode=sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()>
<#assign depSysApiPlatform=sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatform()>
env:
<#if depSysApiPlatformNode.getSSHIPAddr()??>
- name: SPRING_CLOUD_NACOS_DISCOVERY_IP
value: "${depSysApiPlatformNode.getSSHIPAddr()}"
</#if>
<#comment>系统运行参数设置,从SysRun中获取到当前部署相关信息</#comment>
- name: SERVER_PORT
value: "${httpPort}"
- name: SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR
value: "${nacosUrl}"
- name: SPRING_REDIS_HOST
value: "${redisHost}"
- name: SPRING_REDIS_PORT
value: "${redisPort}"
- name: SPRING_REDIS_DATABASE
value: "${redisDataBase}"
- name: SPRING_DATASOURCE_USERNAME
value: "${dbUserName}"
- name: SPRING_DATASOURCE_PASSWORD
value: "${dbPassWord}"
- name: SPRING_DATASOURCE_URL
value: "${dbUrl}"
- name: SPRING_DATASOURCE_DRIVER-CLASS-NAME
value: "${dbDriver}"
- name: SPRING_DATASOURCE_DEFAULTSCHEMA
value: "${dbUserName}"
<#comment>输出服务接口自定义参数替换标准参数</#comment>
<#if depSysApi.getUserParamNames()??>
<@outputUserParam depSysApi depSysApi.getUserParamNames()/>
</#if>
<#comment>输出微服务平台自定义参数替换标准参数</#comment>
<#if depSysApiPlatform.getUserParamNames()??>
<@outputUserParam depSysApiPlatform depSysApiPlatform.getUserParamNames()/>
</#if>
</#if>
---
apiVersion: v1
kind: Service
metadata:
name: {{projectName}}-provider
labels:
app: {{projectName}}-provider
spec:
type: NodePort
ports:
- name: http
port: ${httpPort}
targetPort: ${httpPort}
nodePort: ${httpPort}
protocol: TCP
<#if dockerPortMap!=''>
- name: portmap
port: ${dockerPortMap}
targetPort: ${dockerPortMap}
nodePort: ${dockerPortMap}
protocol: TCP
</#if>
selector:
app: {{projectName}}-provider
<#comment>输出用户自定义参数</#comment>
<#macro outputUserParam paramObj paramList>
<#list paramList as param>
<#assign userParamkey=param?upper_case?replace(".","_")>
<#comment>nacos、数据库连接等信息从sysRun中获取</#comment>
<#if userParamkey!="SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR" && userParamkey!="SPRING_REDIS_HOST" &&
userParamkey!="SERVER_PORT" &&userParamkey!="SPRING_REDIS_PORT" &&userParamkey!="SPRING_REDIS_DATABASE"
&&userParamkey!="SPRING_DATASOURCE_USERNAME" &&userParamkey!="SPRING_DATASOURCE_PASSWORD"
&&userParamkey!="SPRING_DATASOURCE_URL" &&userParamkey!="SPRING_DATASOURCE_DRIVER-CLASS-NAME" &&userParamkey!="SPRING_DATASOURCE_DEFAULTSCHEMA">
<#comment>扩展标准配置:用户配置参数替换标准配置(application-sys.yml)</#comment>
<#if !P.exists('SysApiDeployUserParam',param)>
- name: ${userParamkey}
value: "${paramObj.getUserParam(param,"")}"
</#if>
</#if>
</#list>
</#macro>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSSERVICEAPI
</#ibiztemplate>
<#assign httpPort = "8081">
<#assign nacosUrl = "127.0.0.1:8848" >
<#assign redisHost = "127.0.0.1" >
<#assign redisPort = "6379" >
<#assign redisDataBase = "0" >
<#assign dbUserName="root">
<#assign dbPassWord="123456">
<#assign dbUrl="jdbc:mysql://127.0.0.1:3306/"+sys.name+"?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&allowMultiQueries=true">
<#assign dbDriver="com.mysql.jdbc.Driver">
<#assign dockerPortMap="">
<#if sysrun?? && sysrun.getPSDevSlnMSDepAPI()?? >
<#assign depSysApi=sysrun.getPSDevSlnMSDepAPI()>
<#if depSysApi.getHttpPort()??>
<#assign httpPort = depSysApi.getHttpPort()?c>
</#if>
<#if depSysApi.getPSDCMSPlatformNode()??>
<#assign depSysApiPlatformNode=depSysApi.getPSDCMSPlatformNode()>
<#assign depSysApiPlatform=depSysApi.getPSDCMSPlatform()>
<#if depSysApiPlatform.getUserParam("nacos","127.0.0.1:8848")??>
<#assign nacosUrl = depSysApiPlatform.getUserParam("nacos","127.0.0.1:8848")>
</#if>
<#if depSysApi.getUserParam("spring.redis.host","")?? && depSysApi.getUserParam("spring.redis.host","")!="">
<#assign redisHost = depSysApi.getUserParam("spring.redis.host","")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.host","")?? && depSysApiPlatform.getUserParam("spring.redis.host","")!="">
<#assign redisHost = depSysApiPlatform.getUserParam("spring.redis.host","")>
</#if>
<#if depSysApi.getUserParam("spring.redis.port","")?? && depSysApi.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApi.getUserParam("spring.redis.port")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.port","")?? && depSysApiPlatform.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApiPlatform.getUserParam("spring.redis.port")>
</#if>
<#if depSysApi.getUserParam("spring.redis.database","")?? && depSysApi.getUserParam("spring.redis.database","")!="">
<#assign redisDataBase = depSysApi.getUserParam("spring.redis.database","")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.database","")?? && depSysApiPlatform.getUserParam("spring.redis.database","")!="">
<#assign redisDataBase = depSysApiPlatform.getUserParam("spring.redis.database","")>
</#if>
<#if depSysApi.getUserParam("portmap","")?? && depSysApi.getUserParam("portmap","")!="">
<#assign dockerPortMap= depSysApi.getUserParam("portmap","")>
</#if>
</#if>
</#if>
<#comment>数据库配置</#comment>
<#if sysrun.getPSDBDevInst()??>
<#assign sysRunDBInst = sysrun.getPSDBDevInst()>
<#assign dbUserName=sysRunDBInst.getUserName()>
<#assign dbPassWord=sysRunDBInst.getPassword()>
<#assign dbUrl=sysRunDBInst.getConnUrl()>
<#if (sysRunDBInst.getDBType()=='MYSQL5')>
<#assign dbDriver="com.mysql.jdbc.Driver">
<#assign dbUrl=dbUrl+"&allowMultiQueries=true&serverTimezone=GMT%2B8">
<#elseif (sysRunDBInst.getDBType()=='DB2')>
<#assign dbDriver="com.ibm.db2.jcc.DB2Driver">
<#elseif (sysRunDBInst.getDBType()=='ORACLE')>
<#assign dbDriver="oracle.jdbc.driver.OracleDriver">
<#elseif (sysRunDBInst.getDBType()=='SQLSERVER')>
<#assign dbDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver">
<#elseif (sysRunDBInst.getDBType()=='POSTGRESQL')>
<#assign dbDriver="org.postgresql.Driver">
<#elseif (sysRunDBInst.getDBType()=='PPAS')>
<#assign dbDriver="com.edb.Driver">
</#if>
</#if>
version: "3.2"
services:
{{projectName}}-provider:
image: registry.cn-shanghai.aliyuncs.com/ibizsys/{{projectName}}-provider:latest
ports:
- "${httpPort}:${httpPort}"
<#if dockerPortMap!=''>
- "${dockerPortMap}"
</#if>
networks:
- agent_network
<#if sysrun?? && sysrun.getPSDevSlnMSDepAPI()?? && sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()??>
<#assign depSysApi=sysrun.getPSDevSlnMSDepAPI()>
<#assign depSysApiPlatformNode=sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatformNode()>
<#assign depSysApiPlatform=sysrun.getPSDevSlnMSDepAPI().getPSDCMSPlatform()>
environment:
<#if depSysApiPlatformNode.getSSHIPAddr()??>
- SPRING_CLOUD_NACOS_DISCOVERY_IP=${depSysApiPlatformNode.getSSHIPAddr()}
</#if>
<#comment>系统运行参数设置,从SysRun中获取到当前部署相关信息</#comment>
- SERVER_PORT=${httpPort}
- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=${nacosUrl}
- SPRING_REDIS_HOST=${redisHost}
- SPRING_REDIS_PORT=${redisPort}
- SPRING_REDIS_DATABASE=${redisDataBase}
- SPRING_DATASOURCE_USERNAME=${dbUserName}
- SPRING_DATASOURCE_PASSWORD=${dbPassWord}
- SPRING_DATASOURCE_URL=${dbUrl}
- SPRING_DATASOURCE_DRIVER-CLASS-NAME=${dbDriver}
- SPRING_DATASOURCE_DEFAULTSCHEMA=${dbUserName}
<#comment>输出服务接口自定义参数替换标准参数</#comment>
<#if depSysApi.getUserParamNames()??>
<@outputUserParam depSysApi depSysApi.getUserParamNames()/>
</#if>
<#comment>输出微服务平台自定义参数替换标准参数</#comment>
<#if depSysApiPlatform.getUserParamNames()??>
<@outputUserParam depSysApiPlatform depSysApiPlatform.getUserParamNames()/>
</#if>
</#if>
deploy:
resources:
limits:
memory: 4048M
reservations:
memory: 400M
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
volumes:
- "nfs:/app/file"
volumes:
nfs:
driver: local
driver_opts:
type: "nfs"
o: "addr=172.16.240.109,rw"
device: ":/nfs"
networks:
agent_network:
driver: overlay
attachable: true
<#comment>输出用户自定义参数</#comment>
<#macro outputUserParam paramObj paramList>
<#list paramList as param>
<#assign userParamkey=param?upper_case?replace(".","_")>
<#comment>nacos、数据库连接等信息从sysRun中获取</#comment>
<#if userParamkey!="SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR" && userParamkey!="SPRING_REDIS_HOST" &&
userParamkey!="SERVER_PORT" &&userParamkey!="SPRING_REDIS_PORT" &&userParamkey!="SPRING_REDIS_DATABASE"
&&userParamkey!="SPRING_DATASOURCE_USERNAME" &&userParamkey!="SPRING_DATASOURCE_PASSWORD"
&&userParamkey!="SPRING_DATASOURCE_URL" &&userParamkey!="SPRING_DATASOURCE_DRIVER-CLASS-NAME" &&userParamkey!="SPRING_DATASOURCE_DEFAULTSCHEMA">
<#comment>扩展标准配置:用户配置参数替换标准配置(application-sys.yml)</#comment>
<#if !P.exists('SysApiDeployUserParam',param)>
- ${userParamkey}=${paramObj.getUserParam(param,"")}
</#if>
</#if>
</#list>
</#macro>
\ No newline at end of file
package {{packageName}};
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@Slf4j
@EnableDiscoveryClient
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = { "net.ibizsys.central.database", "net.ibizsys.central.r8", "{{packageName}}" })
@SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
})
@Import({ org.springframework.cloud.openfeign.FeignClientsConfiguration.class })
@EnableFeignClients(basePackages = { "net.ibizsys.central.r8", "{{packageName}}" })
@EnableAsync
@EnableScheduling
public class IBizRuntimeApplication extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(IBizRuntimeApplication.class, args);
}
}
package {{packageName}}.config;
import net.ibizsys.central.r8.security.AuthorizationTokenFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.core.GrantedAuthorityDefaults;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class SampleApiSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationEntryPoint unauthorizedHandler;
@Autowired
private UserDetailsService userDetailsService;
/**
* 自定义基于JWT的安全过滤器
*/
@Autowired
AuthorizationTokenFilter authenticationTokenFilter;
@Value("${ibiz.auth.path:v7/login}")
private String loginPath;
@Value("${ibiz.auth.logoutpath:v7/logout}")
private String logoutPath;
@Value("${ibiz.file.uploadpath:ibizutil/upload}")
private String uploadpath;
@Value("${ibiz.file.downloadpath:ibizutil/download}")
private String downloadpath;
@Value("${ibiz.file.previewpath:ibizutil/preview}")
private String previewpath;
@Value("${ibiz.auth.excludesPattern:}")
private String[] excludesPattern;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoderBean());
}
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
// Remove the ROLE_ prefix
return new GrantedAuthorityDefaults("");
}
@Bean
public PasswordEncoder passwordEncoderBean() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// 禁用 CSRF
.csrf().disable()
// 授权异常
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 不创建会话
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/**/*.ico", "/**/assets/**",
"/**/css/**", "/**/fonts/**", "/**/js/**", "/**/img/**", "/", "webjars/**", "/swagger-resources/**",
"/v2/**")
.permitAll()
// 放行登录请求
.antMatchers(HttpMethod.POST, "/" + loginPath).permitAll()
// 放行注销请求
//.antMatchers(HttpMethod.GET, "/" + logoutPath).permitAll()
// 文件操作
.antMatchers("/" + downloadpath + "/**").permitAll().antMatchers("/" + uploadpath).permitAll()
.antMatchers("/" + previewpath + "/**").permitAll();
for (String excludePattern : excludesPattern) {
authenticationTokenFilter.addExcludePattern(excludePattern);
httpSecurity.authorizeRequests().antMatchers(excludePattern).permitAll();
}
// 所有请求都需要认证
httpSecurity.authorizeRequests().anyRequest().authenticated()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
#eureka配置中心
spring:
cloud:
nacos:
discovery:
enabled: false
eureka:
client:
enabled: true
serviceUrl:
defaultZone: http://127.0.0.1:8762/eureka/
#nacos配置中心
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
enabled: true
eureka:
client:
enabled: false
\ No newline at end of file
#缓存、数据源
spring:
jackson:
time-zone: GMT+8
cache:
redis:
time-to-live: 72000
caffeine:
spec: initialCapacity=5,maximumSize=500,expireAfterWrite=72000s
redis:
host: 172.16.240.110
port: 6379
password:
database: 0
lettuce:
pool:
max-active: 32
max-wait: 300ms
max-idle: 16
min-idle: 8
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
{{#if (or system.enableMongo system.enableES)}}
data:
{{/if}}
{{#if system.enableMongo}}
mongodb:
uri: mongodb://admin:admin@127.0.0.1:27017/{{projectName}}
{{/if}}
{{#if system.enableES}}
elasticsearch:
cluster-name: es-cluster
cluster-nodes: 127.0.0.1:9300
repositories:
enabled: true
{{/if}}
datasource:
username: a_LAB01_da1af574b
password: 'D33f8870'
url: jdbc:mysql://172.16.186.185:3306/a_LAB01_da1af574b?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true&serverTimezone=GMT%2B8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
isSyncDBSchema: false
defaultSchema: a_LAB01_da1af574b
dynamic:
druid: #以下是全局默认值,可以全局更改
filters: stat,wall,log4j2
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
#max-pool-prepared-statement-per-connection-size: 20
datasource:
master:
username: ${spring.datasource.username}
password: ${spring.datasource.password}
url: ${spring.datasource.url}
driver-class-name: ${spring.datasource.driver-class-name}
#启动是否加载liquibase构建表结构
liquibase:
enabled: false
change-log: classpath:liquibase/master.xml
# Mybatis-plus配置
mybatis-plus:
global-config:
refresh-mapper: true
db-config:
# 全局逻辑已删除默认值
logic-delete-value: 0
# 全局逻辑未删除默认值
logic-not-delete-value: 1
# mapper-locations: classpath*:/mapper/*/*/*.xml
configuration:
jdbc-type-for-null: 'null'
map-underscore-to-camel-case: false
type-handlers-package: net.ibizsys.central.database.mybatis.typehandler
{{#if system.enableES}}
management:
health:
elasticsearch:
enabled: false
{{/if}}
# 阿里sentinel熔断器
feign:
httpclient:
enabled: true
sentinel:
enabled: true
compression:
request:
enabled: true
mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
min-response-size: 10240
response:
enabled: true
#zuul网关超时设置
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
{{#if system.enableGlobalTransaction}}
seata:
enabled: true #是否开启全局事务
application-id: {{projectName}} #服务标识
tx-service-group: {{projectName}}group #事务组
service:
vgroup-mapping:
{{projectName}}group: default #指定事务组对应的Tc Server集群
registry:
type: nacos #注册中心
nacos:
application: seata-server #Tc Server服务标识
server-addr: 127.0.0.1:8848 #注册中心地址
group: DEFAULT_GROUP #服务组
namespace: #服务命名空间
userName: #用户名
password: #密码
{{/if}}
{{#if system.enableMQ}}
rocketmq:
producer:
namesrvAddr: 127.0.0.1:9876
isOnOff: 'off'
groupName: default
topic: default
consumer:
namesrvAddr: 127.0.0.1:9876
isOnOff: 'off'
groupName: default
topic: default
{{/if}}
#Log配置
logging:
level:
net.ibizsys.central.database.mybatis: INFO
org.springframework.boot.autoconfigure: ERROR
#系统是否开启权限验证、是否开启缓存
#缓存级别:无缓存(无配置项)、一级缓存(L1)、二级缓存(L2)
ibiz:
systemid: {{system.codeName}}
systemname: {{system.logicName}}
enablePermissionValid: true
cacheLevel: L1 #(L1)一级本地caffeine缓存;(L2)caffeine缓存+Redis缓存
{{#eq system.saaSMode 4}}
saas:
column: SRFDCID
sys-tables: ACT_RU_TASK,act_re_procdef,databasechangelog,databasechangeloglock{{#each system.entities as |entity|}}{{#if (and (eq entity.storage "SQL") (entity.saaSMode 0))}},{{entity.tableName}}{{/if}}{{/each}}
{{/eq}}
### jobs
jobs:
#admin-address: http://127.0.0.1:40005
app-name: ibznotify
app-port: 9999
#app-ip: 127.0.0.1
### 启用Gzip压缩
server:
compression:
enabled: true
mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
min-response-size: 10240
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<property name="LOG_PATH" value="logs" />
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %-40.40logger{39} : %msg%n" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="LOG_PATTERN2" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([${LOG_LEVEL_PATTERN:-%5p}]) %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 控制台输出 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}/{{projectName}}-provider.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="Console" />
<!-- <appender-ref ref="file" /> -->
</root>
</configuration>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册