EqpMonitorProcessAction.java

package com.mycim.webapp.actions.dmmprocess;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.i18n.I18nUtils;
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.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.consts.LinkTypeList;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.prp.ProcessPlanning;
import com.mycim.valueobject.prp.ProcessVersion;
import com.mycim.valueobject.prp.Route;
import com.mycim.valueobject.security.UserGroup;
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.webapp.secutiry.jwt.JwtUtils;
import com.mycim.webapp.secutiry.jwt.token.JwtToken;
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.util.*;

/**
 * DMM 流程定义
 *
 * @author shijie.deng
 * @version 6.0.0
 * @date 2019/11/8
 **/
public class EqpMonitorProcessAction extends NpwSetupAction {
    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        TechnologyVersionInfoForm theform = (TechnologyVersionInfoForm) form;
        String instanceId = theform.getInstanceId();
        instanceId = StringUtils.trimToUpperCase(instanceId);
        theform.setInstanceId(instanceId);
        ProcessPlanning processPlanning = new ProcessPlanning(instanceId, getNamedSpace(ObjectList.WFL_KEY,
                                                                                        LocalContext.getFacilityRrn()),
                                                              ObjectList.WFL_KEY);
        ProcessPlanning processPlanningData = prpService.getProcessPlanning(processPlanning);
        processPlanning = processPlanningData == null ? processPlanning : processPlanningData;
        PropertyUtils.copyProperties(theform, processPlanning);
        if (processPlanning == null || processPlanning.getInstanceRrn() == 0) {
            theform.setTransId(Constants.CREATE_KEY);
        } else {
            NamedObject object = baseService.getNamedObject(processPlanning.getInstanceRrn());
            theform.setTransId(Constants.MODIFY_KEY);
            Assert.isTrue(StringUtils.equalsIgnoreCase(MONITOR, object.getFlagType()),
                          Errors.create().key(MessageIdList.DMM_NOT_DMM_PROCESS).content("Not a dmm process!").build());
            //检查是否有权限查看该process
            checkProcessPermission(processPlanning.getInstanceId());
            List<Relation> fullRelations = baseService
                    .getFullRelations(LinkTypeList.PROCESS_TO_PERMISSIONS_GROUP, processPlanning.getInstanceRrn(), 0L);
            StringBuilder processPermissionsGroupRrns = new StringBuilder();
            StringBuilder processPermissionsGroupIds = new StringBuilder();
            int i = 0;
            for (Relation relation : fullRelations) {
                processPermissionsGroupRrns.append(relation.getToRrn());
                processPermissionsGroupIds.append(baseService.getNamedObjectId(relation.getToRrn()));
                i++;
                if (i < fullRelations.size()) {
                    processPermissionsGroupRrns.append(",");
                    processPermissionsGroupIds.append(",");
                }
            }
            theform.setProcessPermissionsGroupRrns(processPermissionsGroupRrns.toString());
            theform.setProcessPermissionsGroupIds(processPermissionsGroupIds.toString());
            request.setAttribute("permissionsGroup", processPermissionsGroupRrns.toString());
        }
        List<ProcessVersion> processVersions = prpService.getProcessVersions(processPlanning);
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(processVersions)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnable(processVersions));
        theform.setDisableFlag(baseService.getNamedObjectDisableFlag(processPlanning.getInstanceRrn()));
        theform.setFlagType(processPlanning.getFlagType());
        request.setAttribute(SessionNames.PROCESSPLANNING_KEY, processPlanning);
        request.setAttribute("versionForm", theform);
        return mapping.getInputForward();
    }

    public ActionForward create(ActionMapping mapping, TechnologyVersionInfoForm theform, HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
        ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
                                                                                                     LocalContext
                                                                                                             .getFacilityRrn()),
                                                              ObjectList.WFL_KEY);

        Assert.isFalse(StringUtils.isEmpty(theform.getInstanceId()),
                       Errors.create().key(MessageIdList.PROCESS_EMPTY_ID).content("process id is empty!").build());

        Assert.isFalse(getInstanceRrn(theform.getInstanceId(), LocalContext.getFacilityRrn(), ObjectList.WFL_KEY) > 0,
                       Errors.create().key(MessageIdList.PROCESS_INVALID_SAME).content("流程号已经存在,不能重复添加!").build());

        theform.setInstanceId(StringUtils.trimToUpperCase(theform.getInstanceId()));

        PropertyUtils.copyProperties(processPlanning, theform);

        processPlanning.setTransPerformedby(LocalContext.getUserId());
        processPlanning.setDisableFlag(theform.getDisableFlag());
        processPlanning.setTransId(Constants.CREATE_KEY);

        processPlanning.setObjectType(ObjectList.ROUTE_KEY);
        processPlanning.setObjectSubtype(ObjectList.PROCESS_KEY);
        processPlanning.setFlagType(theform.getFlagType());

        String processPermissionsGroupRrns = theform.getProcessPermissionsGroupRrns();
        String[] groupRrnArray = StringUtils.split(processPermissionsGroupRrns, ',');
        StringBuilder processPermissionsGroupIds = new StringBuilder();
        int i = 0;
        for (String groupRrn : groupRrnArray) {
            i++;
            processPermissionsGroupIds.append(getInstanceId(new Long(groupRrn)));
            if (i < groupRrnArray.length) {
                processPermissionsGroupIds.append(",");
            }
        }
        //用于回显下拉框的值
        theform.setProcessPermissionsGroupIds(processPermissionsGroupIds.toString());

        String processPermissionsGroup = theform.getProcessPermissionsGroupRrns();
        String[] groups = StringUtils.split(processPermissionsGroup, ',');
        boolean hasUserFlag = false;
        for (String group : groups) {
            List<Map> userGroupGrantUserList = securityService
                    .getHasGrantUserAll(new Long(group), LocalContext.getUserId());
            for (Map map : userGroupGrantUserList) {
                String instanceId = MapUtils.getString(map, "instanceId");
                if (StringUtils.isEqual(instanceId, LocalContext.getUserId())) {
                    hasUserFlag = true;
                }
            }
        }
        //如果所选用户组中都不包含当前用户,则不允许添加该流程
        Assert.isTrue(hasUserFlag, Errors.create().key(MessageIdList.PROCESS_USERGROUP_NO_USER).content(
                "Please select at least one User Group containing the current " + "user!").build());

        prpService.insertProcessPlanning(processPlanning, groups);
        updateLocalContext(response);
        //重定向刷新LocalContext
        response.sendRedirect("dmmprocess.do?instanceId=" + processPlanning.getInstanceId());
        return null;
    }

    public ActionForward update(ActionMapping mapping, TechnologyVersionInfoForm theform, HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
        ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
                                                                                                     LocalContext
                                                                                                             .getFacilityRrn()),
                                                              ObjectList.WFL_KEY);
        processPlanning = (ProcessPlanning) getInstance(processPlanning);

        checkPermissionForOperateProcess(processPlanning.getInstanceRrn());
        PropertyUtils.copyProperties(processPlanning, theform);

        processPlanning.setObjectType(ObjectList.ROUTE_KEY);
        processPlanning.setObjectSubtype(ObjectList.PROCESS_KEY);
        processPlanning.setFlagType(theform.getFlagType());
        processPlanning.setTransPerformedby(LocalContext.getUserId());
        processPlanning.setDisableFlag(theform.getDisableFlag());

        prpService.updateProcessPlanning(processPlanning, theform.getProcessPermissionsGroupRrns());

        updateLocalContext(response);
        //重新请求刷新LocalContext
        request.getRequestDispatcher("dmmprocess.do?action=init").forward(request, response);
        return WebUtils.NULLActionForward;
    }

    public ActionForward delete(ActionMapping mapping, TechnologyVersionInfoForm theform, HttpServletRequest request,
                                HttpServletResponse response) throws Exception {


        ProcessPlanning processPlanning = new ProcessPlanning(theform.getInstanceId(), getNamedSpace(ObjectList.WFL_KEY,
                                                                                                     LocalContext
                                                                                                             .getFacilityRrn()),
                                                              ObjectList.WFL_KEY);
        long processPlanningRrn = baseService.getNamedObjectRrn(processPlanning);
        checkPermissionForOperateProcess(processPlanningRrn);
        prpService.deleteProcessPlanning(processPlanningRrn);

        updateLocalContext(response);
        theform.setInstanceId(null);
        return init(mapping, theform, request, response);
    }


    public ActionForward useInfo(ActionMapping mapping, TechnologyVersionInfoForm theform, HttpServletRequest request) {

        String processId = theform.getInstanceId();
        ProcessPlanning processPlanning = new ProcessPlanning(processId, getNamedSpace(ObjectList.WFL_KEY,
                                                                                       LocalContext.getFacilityRrn()),
                                                              ObjectList.WFL_KEY);
        processPlanning = prpService.getProcessPlanning(processPlanning);
        if ((processId == null || "".equalsIgnoreCase(processId.trim())) && processPlanning != null) {
            processId = processPlanning.getInstanceId();
            theform.setInstanceId(processId);
            theform.setNamedSpace(processPlanning.getNamedSpace());
            theform.setInstanceDesc(processPlanning.getInstanceDesc());
        }

        Assert.isFalse(processId == null || processId.equals(""),
                       Errors.create().key(MessageIdList.PROCESS_EMPTY_ID).content("流程号不能为空!").build());
        processId = processId.trim().toUpperCase();

        Route route = new Route(getDMMRouteId(processId),
                                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);

        Collection<Map<String, String>> eqptList = dmmService.getDMMUsedEqptId(routeRrn, null);
        request.setAttribute("eqptList", eqptList);

        return mapping.findForward("processwheretouse");
    }

    /**
     * 更新LocalContext中的processRrns
     *
     * @param response response对象
     */
    private void updateLocalContext(HttpServletResponse response) {
        String dataPermissionFlag = sysService.getDataPermissionFlag(LocalContext.getFacilityRrn());
        String processRrns = getProcessRrns(LocalContext.getUserRrn());
        JwtToken jwtToken = new JwtToken(LocalContext.getFacilityRrn(), LocalContext.getUserRrn(),
                                         LocalContext.getUserId(), I18nUtils.getCurrentLanguage().toString(),
                                         processRrns, dataPermissionFlag);
        JwtUtils.setTokenToCookie(response, JwtUtils.sign(jwtToken));
    }

    private String getProcessRrns(long userRrn) {
        Set<Long> processRrns = new HashSet<>();
        List<UserGroup> userGroups = securityService.getUserGroupByUserRrn(userRrn);
        for (UserGroup userGroup : userGroups) {
            List<Relation> relations = baseService
                    .getRelationsUseToRrn(userGroup.getInstanceRrn(), LinkTypeList.PROCESS_TO_PERMISSIONS_GROUP);
            for (Relation relation : relations) {
                processRrns.add(relation.getFromRrn());
            }
        }
        return StringUtils.join(processRrns, ",");
    }

}