EqpMonitorProcessVersionAction.java
package com.mycim.webapp.actions.dmmprocess;
import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.PropertyUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.ObjectVersion;
import com.mycim.valueobject.consts.ObjectStatus;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.consts.VersionStatus;
import com.mycim.valueobject.prp.*;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.NpwSetupAction;
import com.mycim.webapp.forms.TechnologyVersionInfoForm;
import com.mycim.workflow.valueobject.WorkflowEditorModel;
import com.mycim.workflow.valueobject.WorkflowLinkModel;
import com.mycim.workflow.valueobject.WorkflowStepModel;
import com.mycim.workflow.valueobject.WorkflowTemplateModel;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.Override;
import java.util.ArrayList;
import java.util.List;
/**
* @author shijie.deng
* @version 6.0.0
* @date 2019/11/11
**/
public class EqpMonitorProcessVersionAction extends NpwSetupAction {
@Override
public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setAttribute(SessionNames.FACILITY_INFO_KEY, sysService.getFacility(LocalContext.getFacilityRrn()));
TechnologyVersionInfoForm infoForm = (TechnologyVersionInfoForm) form;
ProcessPlanning processPlanning = new ProcessPlanning(infoForm.getInstanceId(),
getNamedSpace(ObjectList.WFL_KEY,
LocalContext.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
checkPermissionForOperateProcess(processPlanning.getInstanceRrn());
List<ProcessVersion> versions = prpService.getProcessVersions(processPlanning);
if (CollectionUtils.isEmpty(versions)) {
request.setAttribute("editaction", "/dmmprocessversion.do");
request.setAttribute("initaction", "/dmmprocess.do");
return mapping.findForward(Constants.ADDVERSION_KEY);
}
ObjectVersion currentVersion = versions.get(0);
if (StringUtils.isNotEmpty(infoForm.getVersionId())) {
currentVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(infoForm.getVersionId()));
}
currentVersion.copyNamedObject(processPlanning);
PropertyUtils.copyProperties(infoForm, currentVersion);
infoForm.setEcnFlag(getEcnFlag());
infoForm.setTransId(Constants.MODIFY_KEY);
infoForm.setVersionEditEnable(String.valueOf(checkVersionEditEnable(currentVersion)));
infoForm.setObjectDeleteEnable(checkObjectDeleteEnable(versions));
request.setAttribute(SessionNames.PROCESS_VERSION_KEY, currentVersion);
return mapping.findForward(Constants.MODIFY_KEY);
}
public ActionForward versionInfo(ActionMapping mapping, TechnologyVersionInfoForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String rrn = request.getParameter("versionRrn");
String version = request.getParameter("version");
int ver = Integer.parseInt(version);
long versionRrn = Long.parseLong(rrn);
NamedObject namedObject = new NamedObject();
namedObject.setInstanceRrn(versionRrn);
namedObject = baseService.getNamedObject(namedObject);
ProcessVersion pv = prpService.getProcessVersion(versionRrn, ver);
pv.copyNamedObject(namedObject);
request.setAttribute("historys",
baseService.getObjectVersionHistoryList(pv.getInstanceRrn(), pv.getInstanceVersion()));
PropertyUtils.copyProperties(form, pv);
form.setTransId(Constants.MODIFY_KEY);
request.setAttribute("actionedit", "/dmmprocessversion");
return (mapping.findForward("detail"));
}
public ActionForward addVersionWithEcn(ActionMapping mapping, TechnologyVersionInfoForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
ProcessPlanning processPlanning = new ProcessPlanning(form.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion processVersion = new ProcessVersion();
processVersion.copyNamedObject(processPlanning);
processVersion.setInstanceVersion(processPlanning.getCurrentVersion().intValue() + 1);
processVersion.setVersionId(processPlanning.getCurrentVersion().intValue() + 1 + "");
processVersion.setVersionDesc("Automatic schema generation");
processVersion.setVersionStatus(VersionStatus.UNFROZEN_KEY);
processVersion.setTransId(Constants.CREATE_KEY);
processVersion.setTransPerformedby(LocalContext.getUserId());
prpService.createProcessVersion(processVersion, processPlanning.getCurrentVersion());
Route route = new Route(getDMMRouteId(processPlanning.getInstanceId()),
getNamedSpace(ObjectList.WFL_KEY, LocalContext.getFacilityRrn()), ObjectList.WFL_KEY);
long routeRrn = this.getInstanceRrn(route.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.WFL_KEY);
if (routeRrn <= 0) {
route = new Route(route.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY, LocalContext.getFacilityRrn()),
ObjectList.WFL_KEY);
route.setObjectType(ObjectList.ROUTE_KEY);
route.setObjectSubtype(ObjectList.PROCEDURE_KEY);
route.setTransId(Constants.CREATE_KEY);
route.setTransPerformedby(LocalContext.getUserId());
routeRrn = prpService.insertRoute(route);
baseService.updateNamedObjectSystemUesd(routeRrn, "Y");
route.setInstanceRrn(routeRrn);
route.setCurrentVersion(0);
} else {
route.setInstanceRrn(routeRrn);
route = prpService.getRoute(route);
}
RouteVersion routeVersion = new RouteVersion();
routeVersion.copyNamedObject(route);
routeVersion.setInstanceVersion(route.getCurrentVersion().intValue() + 1);
routeVersion.setVersionId(route.getCurrentVersion().intValue() + 1 + "");
routeVersion.setVersionDesc("Automatic schema generation");
routeVersion.setTransId(Constants.CREATE_KEY);
routeVersion.setVersionStatus(VersionStatus.UNFROZEN_KEY);
routeVersion.setTransPerformedby(LocalContext.getUserId());
prpService.insertRouteVersionWithEcn(routeVersion);
importNewWorkflow(processVersion, route);
return init(mapping, form, request, response);
}
public ActionForward delete(ActionMapping mapping, TechnologyVersionInfoForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.删除process version
ProcessPlanning processPlanning = new ProcessPlanning(form.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion pv = new ProcessVersion();
pv.setInstanceRrn(processPlanning.getInstanceRrn());
pv.setInstanceVersion(Integer.parseInt(form.getVersionId()));
pv = prpService.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(form.getVersionId()));
pv.setTransId(Constants.DELETE_KEY);
pv.setTransPerformedby(LocalContext.getUserId());
prpService.deleteProcessVersion(pv);
//2.删除dmm route version
Route route = new Route(getDMMRouteId(processPlanning.getInstanceId()),
getNamedSpace(ObjectList.WFL_KEY, LocalContext.getFacilityRrn()), ObjectList.WFL_KEY);
long routeRrn = getInstanceRrn(route.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.WFL_KEY);
route.setInstanceRrn(routeRrn);
route = (Route) getInstance(route);
List<ObjectVersion> routeVersions = baseService.getObjectVersions(route);
if (CollectionUtils.isNotEmpty(routeVersions)) {
ObjectVersion objectVersion = routeVersions.get(0);
RouteVersion routeVersion = new RouteVersion();
routeVersion.copyObjectVersion(objectVersion);
routeVersion.copyNamedObject(route);
routeVersion.setTransId(Constants.DELETE_KEY);
routeVersion.setTransPerformedby(LocalContext.getUserId());
EqpMonitorModel dmmModel = dmmService
.getDmmModelByWfl(routeVersion.getInstanceRrn(), routeVersion.getInstanceVersion());
if (dmmModel != null) {
dmmService.deleteDMMModel(dmmModel);
}
prpService.deleteRouteVersion(routeVersion);
}
WebUtils.setSuccessMsg(request);
return detail(mapping, form, request, response);
}
public ActionForward activate(ActionMapping mapping, TechnologyVersionInfoForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.激活route
Route route = new Route(getDMMRouteId(form.getInstanceId()),
getNamedSpace(ObjectList.WFL_KEY, LocalContext.getFacilityRrn()), ObjectList.WFL_KEY);
long routeRrn = getInstanceRrn(route.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.WFL_KEY);
route.setInstanceRrn(routeRrn);
route = prpService.getRoute(route);
List<ObjectVersion> routeVersions = baseService.getObjectVersions(route);
if (CollectionUtils.isNotEmpty(routeVersions)) {
ObjectVersion objectVersion = routeVersions.get(0);
prpService.activeteEcnByRouteVersion(objectVersion, LocalContext.getUserId());
}
//2.激活process
ProcessPlanning processPlanning = new ProcessPlanning(form.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion processVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(form.getVersionId()));
// Ecn ecn = ecnService.getEcn(processVersion.getEcnRrn());
// ecnService.activateEcn(ecn.getInstanceRrn());
processVersion.setVersionStatus(VersionStatus.ACTIVE_KEY);
prpService.updateProcessVersionByEcnRrn(processVersion);
dmmService.updateModelStatus(routeRrn, processVersion.getInstanceVersion(), ObjectStatus.ACTIVE_KEY);
form.setVersionStatus(VersionStatus.ACTIVE_KEY);
List<ObjectVersion> versions = baseService.getObjectVersions(processPlanning);
processPlanning.setVersions(versions);
request.setAttribute("version", versions);
form.setTransId(Constants.MODIFY_KEY);
form.setVersionEditEnable("false");
return init(mapping, form, request, response);
}
public ActionForward detail(ActionMapping mapping, TechnologyVersionInfoForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setAttribute(SessionNames.FACILITY_INFO_KEY, sysService.getFacility(LocalContext.getFacilityRrn()));
ProcessPlanning processPlanning = new ProcessPlanning(form.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
List<ProcessVersion> versions = prpService.getProcessVersions(processPlanning);
if (CollectionUtils.isEmpty(versions)) {
versions = new ArrayList<>();
}
request.setAttribute("version", versions);
request.setAttribute("editaction", "/dmmprocessversion.do");
request.setAttribute("initaction", "/dmmprocess.do");
request.setAttribute("objectform", "technologyInfoForm");
request.setAttribute("versionedit", checkVersionEditEnable(versions) + "");
return (mapping.findForward("version"));
}
public ActionForward frozen(ActionMapping mapping, HttpServletRequest request, TechnologyVersionInfoForm theform,
HttpServletResponse response) throws Exception {
ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion processVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(theform.getVersionId()));
Ecn ecn = ecnService.getEcn(processVersion.getEcnRrn());
ecn.setEcnStatus(VersionStatus.FROZEN_KEY);
ecn.setTransId(TransactionNames.FROZEN_KEY);
ecn.setTransPerformedby(LocalContext.getUserId());
if (ecn.getObjectSubtype() == null) {
ecn.setObjectSubtype(ecn.getObjectType());
}
long workflowRrn = ecnService.getEcnSignOffRrn(ecn.getObjectSubtype(),
getNamedSpace(ObjectList.REFERENCE_FILE_KEY,
LocalContext.getFacilityRrn()),
getNamedSpace(ObjectList.WFL_KEY,
LocalContext.getFacilityRrn()));
Assert.isFalse(workflowRrn == 0, Errors.create().key(MessageIdList.WORKFLOW_MISSING_SIGNOFF)
.content("Not foud SignOff ecn Workflow").build());
List list = (List) ecn.getObjects();
validateProcessPlan(list);
//check multipath
prpService.checkWflIsInProcess(processVersion.getInstanceRrn(), processVersion.getInstanceVersion());
//todo ecn提交审核
// getProcessManager().invokeWorkflow(execRrn, map);
//冻结之前校验流程是否进行了配置
Route route = new Route(getDMMRouteId(processPlanning.getInstanceId()),
getNamedSpace(ObjectList.WFL_KEY, LocalContext.getFacilityRrn()), ObjectList.WFL_KEY);
long routeRrn = getInstanceRrn(route.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.WFL_KEY);
int instanceVersion = baseService.getNamedObject(routeRrn).getCurrentVersion();
//如果流程升版,即使没有修改添加步骤,也可以冻结,故这个check只需要判断路径版本为1的时候就可以了
ObjectVersion objectVersion = baseService.getObjectVersion(routeRrn, instanceVersion);
EqpMonitorModel dmmModel = dmmService
.getDmmModelByWfl(objectVersion.getInstanceRrn(), objectVersion.getInstanceVersion());
Assert.notNull(dmmModel,
Errors.create().key(MessageIdList.DMM_FROZEN_DMMPROCESS_CHECK).content("请先在流程中添加步骤").build());
List<EqpMonitorStep> stepList = dmmService.getDmmModelStepsInfo(dmmModel.getModelRrn());
Assert.isFalse(stepList.size() == 0,
Errors.create().key(MessageIdList.DMM_FROZEN_DMMPROCESS_CHECK).content("请先在流程中添加步骤").build());
// ecnService.frozenEcn(ecn.getInstanceRrn());
processVersion.setVersionStatus(VersionStatus.FROZEN_KEY);
prpService.updateProcessVersionByEcnRrn(processVersion);
return init(mapping, theform, request, response);
}
public ActionForward unfrozen(ActionMapping mapping, HttpServletRequest request, TechnologyVersionInfoForm theform,
HttpServletResponse response) throws Exception {
ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion processVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(theform.getVersionId()));
Ecn ecn = ecnService.getEcn(processVersion.getEcnRrn());
ecn.setEcnStatus(VersionStatus.UNFROZEN_KEY);
ecn.setTransId(TransactionNames.UNFROZEN_KEY);
ecn.setTransPerformedby(LocalContext.getUserId());
// ecnService.unFrozenEcn(ecn.getInstanceRrn());
processVersion.setVersionStatus(VersionStatus.UNFROZEN_KEY);
prpService.updateProcessVersionByEcnRrn(processVersion);
// fixme cleanECNExecutionRrn
// getProcessManager().cleanECNExecutionRrn(ecn.getInstanceRrn());
processVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), Integer.parseInt(theform.getVersionId()));
processVersion.copyNamedObject(processPlanning);
List<ProcessVersion> versions = prpService.getProcessVersions(processPlanning);
request.setAttribute(SessionNames.PROCESSVERSION_KEY, processVersion);
processPlanning.setVersions(versions);
request.setAttribute("version", versions);
request.setAttribute(SessionNames.PROCESSVERSION_KEY, processVersion);
theform.setVersionStatus(VersionStatus.UNFROZEN_KEY);
theform.setTransId(Constants.MODIFY_KEY);
theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(processVersion)));
theform.setObjectDeleteEnable(checkObjectDeleteEnable(versions));
theform.setObjectType(ecn.getObjectType());
return init(mapping, theform, request, response);
}
public ActionForward version(ActionMapping mapping, HttpServletRequest request, TechnologyVersionInfoForm theform,
HttpServletResponse response) throws Exception {
ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
LocalContext
.getFacilityRrn()),
ObjectList.WFL_KEY);
processPlanning = prpService.getProcessPlanning(processPlanning);
ProcessVersion processVersion = prpService
.getProcessVersion(processPlanning.getInstanceRrn(), theform.getInstanceVersion());
List<ProcessVersion> versions = prpService.getProcessVersions(processPlanning);
processVersion.copyNamedObject(processPlanning);
PropertyUtils.copyProperties(theform, processVersion);
theform.setEcnFlag(getEcnFlag());
theform.setTransId(Constants.MODIFY_KEY);
theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(processVersion)));
theform.setObjectDeleteEnable(checkObjectDeleteEnable(versions));
request.setAttribute(SessionNames.PROCESS_VERSION_KEY, processVersion);
return mapping.findForward(Constants.MODIFY_KEY);
}
private void importNewWorkflow(ProcessVersion processVersion, Route route) {
List<WorkflowStepModel> stepModels = dmmService
.buildStepModel(processVersion.getInstanceRrn(), processVersion.getInstanceVersion(), route);
List<WorkflowStepModel> oldStepModels = dmmService
.getStepModels(processVersion.getInstanceRrn(), processVersion.getInstanceVersion());
List<WorkflowLinkModel> linkModels = buildWorkflowLinkModel(stepModels);
List<WorkflowLinkModel> oldLinkModels = buildWorkflowLinkModel(oldStepModels);
WorkflowTemplateModel templateModel = buildTemplateModel(processVersion.getInstanceRrn(),
processVersion.getInstanceVersion(), stepModels);
WorkflowEditorModel editorModel = new WorkflowEditorModel(templateModel, "DMM", stepModels, oldStepModels,
linkModels, oldLinkModels);
dmmService.importWorkflow(editorModel);
}
private List<WorkflowLinkModel> buildWorkflowLinkModel(List<WorkflowStepModel> stepModels) {
Long startRrn = null;
Long endRrn = null;
WorkflowStepModel routeStep = null;
for (WorkflowStepModel stepModel : stepModels) {
if (StringUtils.equalsIgnoreCase("Start", stepModel.getStepId())) {
startRrn = stepModel.getStepRrn();
} else if (StringUtils.equalsIgnoreCase("End", stepModel.getStepId())) {
endRrn = stepModel.getStepRrn();
} else {
routeStep = stepModel;
}
}
List<WorkflowLinkModel> linkModels = new ArrayList<WorkflowLinkModel>();
if (startRrn != null && endRrn != null && routeStep != null) {
long stepRrn = startRrn.longValue();
WorkflowLinkModel linkModelStart = new WorkflowLinkModel();
linkModelStart.setStepRrn(stepRrn);
linkModelStart.setNextStepRrn(routeStep.getStepRrn());
linkModelStart.setConditionType("And");
linkModels.add(linkModelStart);
WorkflowLinkModel linkModelEnd = new WorkflowLinkModel();
linkModelEnd.setStepRrn(routeStep.getStepRrn());
linkModelEnd.setNextStepRrn(endRrn);
linkModelEnd.setConditionType("And");
linkModels.add(linkModelEnd);
}
return linkModels;
}
private WorkflowTemplateModel buildTemplateModel(Long processRrn, Integer version,
List<WorkflowStepModel> stepModels) {
WorkflowTemplateModel templateModel = new WorkflowTemplateModel(processRrn, version);
Long startRrn = null;
Long endRrn = null;
for (WorkflowStepModel stepModel : stepModels) {
if (StringUtils.equalsIgnoreCase("Start", stepModel.getStepId())) {
startRrn = stepModel.getStepRrn();
}
if (StringUtils.equalsIgnoreCase("End", stepModel.getStepId())) {
endRrn = stepModel.getStepRrn();
}
}
templateModel.setRootFlag("Y");
templateModel.setFirstStepRrn(startRrn);
templateModel.setLastStepRrn(endRrn);
return templateModel;
}
}