WorkOrderAction.java

package com.mycim.webapp.actions.workOrder;

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.time.DateUtils;
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.prp.WorkOrder;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.PrpSetupAction;
import com.mycim.webapp.forms.WorkOrderForm;
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.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WorkOrderAction extends PrpSetupAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) {
        WorkOrderForm wfo = (WorkOrderForm) form;
        wfo.setWorkorderId(wfo.getInstanceId());

        String workorderId = StringUtils.upperCase(wfo.getWorkorderId());
        WorkOrder workOrder = workOrderService.getWorkOrderById(workorderId);
        if (workOrder != null) {
            workOrder.setProductList(buildProductInfo(workOrder.getWorkorderRrn()));
            PropertyUtils.copyProperties(wfo, workOrder);
        } else {
            workOrder = new WorkOrder();
            wfo.setWorkorderId(workorderId);
        }
        Integer completeTotal = lotService.getLotTotalByWorkOrderAndStatus(wfo.getWorkorderId(), "completed");
        Integer scrapTotal = lotService.getLotTotalByWorkOrderAndStatus(wfo.getWorkorderId(), "scrap");
        Integer runingTotal = lotService.getLotTotalByWorkOrderAndStatus(wfo.getWorkorderId(), "inrun");
        wfo.setCompleteWafer(completeTotal);
        wfo.setRuningWafer(runingTotal);
        wfo.setScrapWafer(scrapTotal);
        Integer unCompleteWafer = wfo.getPlannedYield() - completeTotal;
        wfo.setUnCompleteWafer(unCompleteWafer > 0 ? unCompleteWafer : 0);

        request.setAttribute("startDay", workOrder.getStartDay());
        request.setAttribute("requireDay", workOrder.getRequireDay());
        request.setAttribute("dayDay", workOrder.getDayDay());
        request.setAttribute("dueDate", workOrder.getDueDate());

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 增加工单
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     */
    public ActionForward addWorkOrder(ActionMapping mapping, WorkOrderForm form, HttpServletRequest request,
                                      HttpServletResponse response) {

        String namedSpace = getNamedSpace(ObjectList.WORKORDER, LocalContext.getFacilityRrn());
        WorkOrder workOrder = new WorkOrder();
        PropertyUtils.copyProperties(workOrder, form);
        workOrder.setNamedSpace(namedSpace);
        workOrder.setInstanceId(workOrder.getWorkorderId());
        workOrder.setCreateUser(LocalContext.getUserId());
        workOrder.setTransPerformedby(LocalContext.getUserId());
        workOrder.setTransId("CREATE");
        if (StringUtils.isNotEmpty(form.getStartDayStr())) {
            workOrder.setStartDay(new Timestamp(DateUtils.parse(form.getStartDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getRequireDayStr())) {
            workOrder.setRequireDay(new Timestamp(DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getDayDayStr())) {
            workOrder.setDayDay(new Timestamp(DateUtils.parse(form.getDayDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getDueDateStr())) {
            workOrder.setDueDate(new Timestamp(DateUtils.parse(form.getDueDateStr(), "yyyy/MM/dd").getTime()));
        }

        workOrder = workOrderService.insertWorkOrder(workOrder);
        PropertyUtils.copyProperties(form, workOrder);

        request.setAttribute("startDay", workOrder.getStartDay());
        request.setAttribute("requireDay", workOrder.getRequireDay());
        request.setAttribute("dayDay", workOrder.getDayDay());
        request.setAttribute("dueDate", workOrder.getDueDate());
        request.setAttribute("operationSuccess", "true");

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 修改工单
     *
     * @param mapping
     * @param request
     * @param form
     * @return
     */
    public ActionForward updateWorkOrder(ActionMapping mapping, HttpServletRequest request, WorkOrderForm form) {
        String namedSpace = getNamedSpace(ObjectList.WORKORDER, LocalContext.getFacilityRrn());
        WorkOrder workOrder = new WorkOrder(form.getWorkorderId(), namedSpace, ObjectList.WORKORDER);
        PropertyUtils.copyProperties(workOrder, form);

        if (StringUtils.isNotEmpty(form.getStartDayStr())) {
            workOrder.setStartDay(new Timestamp(DateUtils.parse(form.getStartDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getRequireDayStr())) {
            workOrder.setRequireDay(new Timestamp(DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getDayDayStr())) {
            workOrder.setDayDay(new Timestamp(DateUtils.parse(form.getDayDayStr(), "yyyy/MM/dd").getTime()));
        }
        if (StringUtils.isNotEmpty(form.getDueDateStr())) {
            workOrder.setDueDate(new Timestamp(DateUtils.parse(form.getDueDateStr(), "yyyy/MM/dd").getTime()));
        }

        workOrderService.updateWorkOrder(workOrder);
        workOrder.setProductList(buildProductInfo(workOrder.getWorkorderRrn()));
        PropertyUtils.copyProperties(form, workOrder);

        request.setAttribute("startDay", workOrder.getStartDay());
        request.setAttribute("requireDay", workOrder.getRequireDay());
        request.setAttribute("dayDay", workOrder.getDayDay());
        request.setAttribute("dueDate", workOrder.getDueDate());

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 增加产品
     *
     * @param mapping
     * @param wfo
     * @param request
     * @param response
     * @return
     */
    public ActionForward addProduct(ActionMapping mapping, WorkOrderForm wfo, HttpServletRequest request,
                                    HttpServletResponse response) {
        String productId = WebUtils.getParameterNoTrim("productId", request);
        Long workOrderRrn = wfo.getWorkorderRrn();
        if (workOrderRrn == null || workOrderRrn.longValue() <= 0) {
            workOrderRrn = getInstanceRrn(wfo.getWorkorderId(),
                                          getNamedSpace(ObjectList.WORKORDER, LocalContext.getFacilityRrn()),
                                          ObjectList.WORKORDER);
        }
        Assert.isFalse(workOrderRrn == null || workOrderRrn.longValue() <= 0,
                       Errors.create().key(MessageIdList.WORKORDER_ERRORWORKORDER).content("WorkOrder id error")
                             .build());
        Long productRrn = getInstanceRrn(productId,
                                         getNamedSpace(ObjectList.PRODUCT_KEY, LocalContext.getFacilityRrn()),
                                         ObjectList.PRODUCT_KEY);
        Assert.isFalse(productRrn == null || productRrn.longValue() <= 0,
                       Errors.create().key(MessageIdList.PRODUCT_ERRORPRODUCT).content("Error product id").build());
        Relation relation = new Relation(workOrderRrn, productRrn, LinkTypeList.WORKORDER_TO_PRODUCT_KEY);
        relation.setTransPerformedby(LocalContext.getUserId());
        baseService.insertRelation(relation);
        wfo.setProductList(buildProductInfo(workOrderRrn));

        wfo.setProductId(null);
        return mapping.findForward("workOrderInfo");
    }

    /**
     * 删除产品
     *
     * @param mapping
     * @param wfo
     * @param request
     * @param response
     * @return
     */
    public ActionForward delProduct(ActionMapping mapping, WorkOrderForm wfo, HttpServletRequest request,
                                    HttpServletResponse response) {
        long productRrn = WebUtils.getParameterLong("delProduct", request);
        Long workOrderRrn = wfo.getWorkorderRrn();
        Assert.isFalse(workOrderRrn == null || workOrderRrn.longValue() <= 0,
                       Errors.create().key(MessageIdList.WORKORDER_ERRORWORKORDER).content("WorkOrder id error")
                             .build());

        Relation relation = new Relation(workOrderRrn, productRrn, LinkTypeList.WORKORDER_TO_PRODUCT_KEY);
        relation.setTransPerformedby(LocalContext.getUserId());
        baseService.deleteRelation(relation);
        wfo.setProductList(buildProductInfo(workOrderRrn));

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 冻结工单
     *
     * @param mapping
     * @param request
     * @param form
     * @return
     */
    public ActionForward freezeWorkOrder(ActionMapping mapping, HttpServletRequest request, WorkOrderForm form) {
        form.setStatus("COMPLETED");
        updateWorkOrder(form);

        request.setAttribute("startDay", DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd"));
        request.setAttribute("requireDay", DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd"));
        request.setAttribute("dayDay", DateUtils.parse(form.getDayDayStr(), "yyyy/MM/dd"));
        request.setAttribute("dueDate", DateUtils.parse(form.getDueDateStr(), "yyyy/MM/dd"));

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 激活工单
     *
     * @param mapping
     * @param request
     * @param form
     * @return
     */
    public ActionForward activeWorkOrder(ActionMapping mapping, HttpServletRequest request, WorkOrderForm form) {
        form.setStatus("ACTIVE");
        updateWorkOrder(form);

        request.setAttribute("startDay", DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd"));
        request.setAttribute("requireDay", DateUtils.parse(form.getRequireDayStr(), "yyyy/MM/dd"));
        request.setAttribute("dayDay", DateUtils.parse(form.getDayDayStr(), "yyyy/MM/dd"));
        request.setAttribute("dueDate", DateUtils.parse(form.getDueDateStr(), "yyyy/MM/dd"));
        request.setAttribute("operationSuccess", "true");

        return mapping.findForward("workOrderInfo");
    }

    /**
     * 关闭工单
     *
     * @param mapping
     * @param request
     * @param form
     * @return
     */
    public ActionForward closeWorkOrder(ActionMapping mapping, HttpServletRequest request, WorkOrderForm form) {
        form.setStatus("CLOSE");
        updateWorkOrder(form);
        return mapping.findForward("workOrderInfo");
    }


    /**
     * 详情
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     */
    public ActionForward initDetail(ActionMapping mapping, WorkOrderForm form, HttpServletRequest request,
                                    HttpServletResponse response) {
        if (StringUtils.isEmpty(form.getWorkorderId())) {
            return mapping.findForward("initDetail");
        }
        form.setWorkorderId(form.getWorkorderId().trim().toUpperCase());
        WorkOrder workOrder = workOrderService.getWorkOrderById(form.getWorkorderId());
        Assert.notNull(workOrder,
                       Errors.create().key(MessageIdList.WORKORDER_ERRORWORKORDER).content("work order not exists")
                             .build());
        Integer completeTotal = lotService.getLotTotalByWorkOrderAndStatus(form.getWorkorderId(), "completed");
        Integer scrapTotal = lotService.getLotTotalByWorkOrderAndStatus(form.getWorkorderId(), "scrap");
        Integer runingTotal = lotService.getLotTotalByWorkOrderAndStatus(form.getWorkorderId(), "inrun");
        PropertyUtils.copyProperties(form, workOrder);
        form.setCompleteWafer(completeTotal);
        form.setRuningWafer(runingTotal);
        form.setScrapWafer(scrapTotal);
        Integer unCompleteWafer = form.getPlannedYield() - completeTotal;
        form.setUnCompleteWafer(unCompleteWafer > 0 ? unCompleteWafer : 0);
        return mapping.findForward("initDetail");
    }

    private void updateWorkOrder(WorkOrderForm form) {
        String namedSpace = getNamedSpace(ObjectList.WORKORDER, LocalContext.getFacilityRrn());
        WorkOrder workOrder = new WorkOrder(form.getWorkorderId(), namedSpace, ObjectList.WORKORDER);
        PropertyUtils.copyProperties(workOrder, form);
        workOrderService.updateWorkOrder(workOrder);
        workOrder.setProductList(buildProductInfo(workOrder.getWorkorderRrn()));
        PropertyUtils.copyProperties(form, workOrder);
    }

    private List<Map<String, String>> buildProductInfo(Long workOrderRrn) {
        List<Relation> relationInfos = baseService
                .getRelationsUseFromRrn(workOrderRrn, LinkTypeList.WORKORDER_TO_PRODUCT_KEY);

        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        Map<String, String> productInfo;
        NamedObject namedObject;
        for (Relation relation : relationInfos) {
            productInfo = new HashMap<String, String>();
            namedObject = new NamedObject(relation.getToRrn());
            namedObject = baseService.getNamedObject(namedObject);
            productInfo.put("productRrn", Long.toString(namedObject.getInstanceRrn()));
            productInfo.put("productId", namedObject.getInstanceId());
            productInfo.put("productDesc", namedObject.getInstanceDesc());

            list.add(productInfo);
        }
        return list;
    }

}