EmasEventAction.java

package com.mycim.webapp.actions;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.utils.ChartNamingRule;
import com.mycim.utils.EmasUtil;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.SystemConstant;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.consts.ReferenceDetailNames;
import com.mycim.valueobject.consts.SystemConstants;
import com.mycim.valueobject.emas.dto.EmasEventModifyDTO;
import com.mycim.valueobject.emas.dto.EmasEventQueryDTO;
import com.mycim.valueobject.security.UserGroup;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import org.apache.commons.collections.MapUtils;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author kangzhang
 * @version 1.0.0
 * @date 2021/6/23
 **/
public class EmasEventAction extends EmasAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) {
        List<Relation> userGroups = securityService.getUserGroups(LocalContext.getUserRrn());
        String userGroup = userGroups.stream().map(NamedObject::getInstanceId).collect(Collectors.joining(","));
        request.setAttribute("userGroup", userGroup);
        request.setAttribute("superPermission", StringUtils.contains(userGroup, SystemConstants.ADMIN_USER_GROUP)?
                SystemConstant.Str.ONE : SystemConstant.Str.ZERO);
        return mapping.getInputForward();
    }

    /**
     * Action 方法
     */
    public List<Map<String, Object>> queryEmasEventHistInfo(EmasEventQueryDTO queryDTO) {
        return emasService.getEmasEventHistory(queryDTO.getEmno());
    }

    /**
     * Action 方法
     */
    public Map<String, Object> queryEmasEventInfo(EmasEventQueryDTO queryDTO, Map map) {
        int  pageSize = MapUtils.getIntValue(map, "limit");
        int  pageNo   = MapUtils.getIntValue(map, "page");
        Page page     = new Page(pageNo, pageSize);
        queryDTO.setPage(page);
        checkTime(queryDTO);
        page = emasService.getEmasEventInfoByPage(queryDTO);
        Map<String, Object>       resultMap = new HashMap<String, Object>();
        resultMap.put("results", page.getResults());
        resultMap.put("totalCount", page.getTotalItems());
        return resultMap;
    }

    /**
     * Action 方法
     */
    public void specialCloseEmasEvent(EmasEventModifyDTO modifyDTO) {
        Assert.isFalse(StringUtils.isBlank(modifyDTO.getUserComment()),
                       Errors.create().key(MessageIdList.NEWEMAS_OBJECT_EMPTY).content("The {} can not be empty!")
                             .args("Comment").build());
        Assert.isFalse(modifyDTO.getUserComment().length()>1000, Errors.create().key(MessageIdList.NEWEMAS_FIELD_MORE_DB_LENGTH)
                .content("comments length cannot more than 1000!").build());

        Assert.isFalse(StringUtils.equalsIgnoreCase(modifyDTO.getStatus(), "Close"),
                       Errors.create().key(MessageIdList.NEWEMAS_EVENT_INVALID_STATUS).content("The event status: {} is invalid!")
                             .args("Close").build());
        //check Chart Permission and user userGroup
        checkChartIdPermission(modifyDTO);
        emasService.closeEmasEvent(modifyDTO.getEmno(), modifyDTO.getUserComment(), EmasUtil.Status.SPECIAL_CLOSE);
    }

    /**
     * Action 方法
     */
    public void delay(EmasEventModifyDTO modifyDTO) {
        Assert.isFalse(StringUtils.equalsIgnoreCase(modifyDTO.getStatus(), "Close"),
                       Errors.create().key(MessageIdList.NEWEMAS_EVENT_INVALID_STATUS).content("The event status: {} is invalid!")
                             .args("Close").build());
        //check Chart Permission and user userGroup
        checkChartIdPermission(modifyDTO);
        emasService.delayEmasEvent(modifyDTO.getEmno(), modifyDTO.getDelayTimeHour());
    }

    private void checkChartIdPermission(EmasEventModifyDTO modifyDTO) {
        String[] chartIdArr = StringUtils.split(modifyDTO.getChartId(), ";");

        List<Relation> userGroups = securityService.getUserGroups(LocalContext.getUserRrn());
        String userGroup = userGroups.stream().map(NamedObject::getInstanceId).collect(Collectors.joining(","));
        Map<String, String> referenceFileMap = getReferenceFileDetails(ReferenceDetailNames.SPC_CHART_OWNER).stream().collect(Collectors.toMap(
                ReferenceFileDetail::getKey1Value, ReferenceFileDetail::getData1Value, (key1, key2) -> key2));
        if (!StringUtils.contains(userGroup, SystemConstants.ADMIN_USER_GROUP)){
            for (String str:chartIdArr){
                String chartIdUserGroup = referenceFileMap.getOrDefault(ChartNamingRule.getCodeRepresentedAsPermissionUserGroup(str), StringUtils.EMPTY);
                Assert.isFalse(StringUtils.isNotBlank(chartIdUserGroup) && !StringUtils.contains(userGroup, chartIdUserGroup),
                               Errors.create().key("").content("没有此Chart:{}的权限").args(str).build());
            }
        }
    }

    private void checkTime(EmasEventQueryDTO queryDTO) {
        String startTime = queryDTO.getStartTime();
        if (StringUtils.isNotBlank(startTime)) {
            Assert.isTrue(startTime.matches(REGEX_OF_DATE),
                           Errors.create().key(MessageIdList.NEWEMAS_TIME_INVALID_FORMAT).content("Time format is wrong (example:{})!")
                                 .args(DateUtils.DATE_FORMAT4DATE).build());
        }

        String endTime = queryDTO.getEndTime();
        if (StringUtils.isNotBlank(endTime)) {
            Assert.isTrue(endTime.matches(REGEX_OF_DATE),
                          Errors.create().key(MessageIdList.NEWEMAS_TIME_INVALID_FORMAT).content("Time format is wrong (example:{})!")
                                .args(DateUtils.DATE_FORMAT4DATE).build());
        }
    }

}