package com.webclient.beans.udmxware;

import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXApplicationException;
import psdi.util.MXException;
import psdi.webclient.beans.pr.PRAppBean;
import psdi.webclient.system.beans.AppBean;
import psdi.webclient.system.beans.ResultsBean;
import psdi.webclient.system.controller.WebClientEvent;

import java.rmi.RemoteException;
import java.util.Date;

/**
 * 模芯出入库AppBean
 * edit 2023-09-22
 */
public class UdmxwareAppBean extends AppBean {


    public void initializeApp() throws MXException, RemoteException {
        super.initializeApp();
        ResultsBean resultsbean = app.getResultsBean();
        MboSetRemote set=resultsbean.getMboSet();
        String userid=set.getUserInfo().getPersonId();
        MboSetRemote pset= MXServer.getMXServer().getMboSet("person", set.getUserInfo());
        pset.setWhere("personid='"+userid+"'");
        if(!pset.isEmpty() && pset.count()>0){
            MboRemote per=pset.getMbo(0);
            //权限等级
            String aut=per.getString("UDAUTGRADE");
            String orgid=per.getString("LOCATIONORG");
            String siteid=per.getString("LOCATIONSITE");

            if("Level 1".equalsIgnoreCase(aut)){
                set.setWhere(" 1=1 ");
            }else if("Level 2".equalsIgnoreCase(aut)){
                set.setWhere(" ORGID='"+orgid+"' ");
            }else if("Level 3".equalsIgnoreCase(aut)){
                set.setWhere(" SITEID='"+siteid+"' ");
            }else if("Level 4".equalsIgnoreCase(aut)){
                set.setWhere(" ORGID='"+orgid+"' and SITEID='"+siteid+"' and CREATEBY='"+userid+"'");
            }else{
                //没有等级
                set.setWhere("1=2");
            }
        }
        pset.close();

    }


    public void MWDAPOOL()throws RemoteException, MXException {
        app.getAppBean().save();
        MboRemote appMbo = app.getAppBean().getMbo();
        String status = appMbo.getString("STATUS");
        String doctype = appMbo.getString("DOCTYPE");
        String deptnum = appMbo.getString("DEPTNUM");
        String location = appMbo.getString("LOCATION");

        if(!"COMP".equalsIgnoreCase(status)){
            //模芯库存交易记录表
            MboSetRemote udmxjymxSet = MXServer.getMXServer().getMboSet("UDCORETRADE", MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote udmxkcSet = MXServer.getMXServer().getMboSet("UDCOREINVENTORY", MXServer.getMXServer().getSystemUserInfo());
            MboSetRemote mxlineSet = appMbo.getMboSet("UDMXWARELINE");
            if (null != udmxjymxSet && null != udmxkcSet && null != mxlineSet) {
                //校验数量能否通过
                for (int j = 0; j < mxlineSet.count(); j++) {
                    MboRemote mxlineMbo = mxlineSet.getMbo(j);
                    String itemnum = mxlineMbo.getString("ITEMNUM");
                    udmxkcSet.setWhere("ITEMNUM='" + itemnum + "' AND LOCATION='" + location + "'");
                    udmxkcSet.reset();
                    if (null != udmxkcSet && !udmxkcSet.isEmpty()) {
                        MboRemote udinvMbo=udmxkcSet.getMbo(0);
                        //生产领用 From：库存数量（系统默认） To：在用数量（系统默认）
                        if("M02".equalsIgnoreCase(doctype) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("STOCKNEW")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的库存数量不足，请检查后重新操作！"} );
                            }
                        }
                        //生产归还 From：在用数量 To：库存数量
                        if("M03".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("USEOLD")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的在用数量不足，请检查后重新操作！"} );
                            }
                        }
                        //生产归还 From：在用数量 To：待修数量
                        if("M03".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("USEOLD")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的在用数量不足，请检查后重新操作！"} );
                            }
                        }
                        //物料送修 From：待修数量 To：在修数量
                        if("M04".equalsIgnoreCase(doctype) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N05".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("REPAIREDCOUNT")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的待修数量不足，请检查后重新操作！"} );
                            }
                        }
                        //维修入库 From：库存数量 To：库存数量
                        if("M05".equalsIgnoreCase(doctype) &&
                                "N05".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("REPAIRING")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的在修数量不足，请检查后重新操作！"} );
                            }
                        }
                        //物料报废 From：库存数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("STOCKNEW")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的库存数量不足，请检查后重新操作！"} );
                            }
                        }
                        //物料报废 From：在用数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("USEOLD")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的在用数量不足，请检查后重新操作！"} );
                            }
                        }
                        //物料报废 From：待修数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("REPAIREDCOUNT")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的待修数量不足，请检查后重新操作！"} );
                            }
                        }
                        //物料报废 From：在修数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N05".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            if((udinvMbo.getDouble("REPAIRING")-mxlineMbo.getDouble("QUANTITY"))<0){
                                throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+udinvMbo.getString("ITEMNUM")+"的在修数量不足，请检查后重新操作！"} );
                            }
                        }
                    }else{
                        if("M02".equalsIgnoreCase(doctype) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //生产归还 From：在用数量 To：库存数量
                        if("M03".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //生产归还 From：在用数量 To：待修数量
                        if("M03".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //物料送修 From：待修数量 To：在修数量
                        if("M04".equalsIgnoreCase(doctype) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N05".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //维修入库 From：库存数量 To：库存数量
                        if("M05".equalsIgnoreCase(doctype) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //物料报废 From：库存数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //物料报废 From：在用数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //物料报废 From：待修数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                        //物料报废 From：在修数量 To：报废数量
                        if("M06".equalsIgnoreCase(doctype) &&
                                "N05".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
                            throw new MXApplicationException("udmxware", "udmxware_crk", new String[]{"物料"+mxlineMbo.getString("ITEMNUM")+"在模芯库存中不存在，请检查后重新操作！"} );
                        }
                    }
                }

                //通过后进行插入交易记录
                for (int i = 0; i < mxlineSet.count(); i++) {
                    MboRemote mxlineMbo = mxlineSet.getMbo(i);
                    String itemnum = mxlineMbo.getString("ITEMNUM");
                    udmxkcSet.setWhere("ITEMNUM='" + itemnum + "' AND LOCATION='" + location + "'");
                    udmxkcSet.reset();
                    MboRemote udinvMbo=null;
                    if (null != udmxkcSet && !udmxkcSet.isEmpty()) {
                        //插入交易记录表
                        udinvMbo=udmxkcSet.getMbo(0);
                        setudmatuSetValue( udmxjymxSet, udinvMbo, appMbo, itemnum, deptnum, mxlineMbo);
                    } else {
                        udinvMbo=udmxkcSet.add();
                        udinvMbo.setValue("ITEMNUM", itemnum,2L);
                        udinvMbo.setValue("DEPTNUM", deptnum,2L);
                        udinvMbo.setValue("LOCATION", appMbo.getString("LOCATION"),2L);
                        udinvMbo.setValue("BINNUM", mxlineMbo.getString("BINNUM"),2L);
                        udinvMbo.setValue("ORGID", appMbo.getString("ORGID"),2L);
                        udinvMbo.setValue("SITEID", appMbo.getString("SITEID"),2L);
                        udinvMbo.getThisMboSet().save();
                        //插入交易记录表

                        setudmatuSetValue( udmxjymxSet, udinvMbo, appMbo, itemnum, deptnum, mxlineMbo);
                    }
                }
            }
            appMbo.setValue("STATUS", "COMP", 2L);
            appMbo.getThisMboSet().save();
            app.getAppBean().refreshTable();
            app.getAppBean().reloadTable();
            System.gc();
        }else{
            throw new MXApplicationException("udmxware", "udmxware_cf", new String[]{} );
        }
    }


    public void setudmatuSetValue(MboSetRemote udmxjymxSet,MboRemote udinvMbo,MboRemote appMbo,String itemnum,String deptnum,MboRemote mxlineMbo) throws RemoteException, MXException {
        MboRemote udmxjymxMbo=udmxjymxSet.add();
        //OWNERTABLE='UDCOREINVENTORY'  and PARENTID=:UDCOREINVENTORYID AND ORGID=:ORGID AND SITEID=:SITEID
        udmxjymxMbo.setValue("OWNERTABLE", "UDMXWARE", 2L);
        udmxjymxMbo.setValue("PARENTID", appMbo.getInt("UDMXWAREID"), 2L);
        udmxjymxMbo.setValue("ORGID", appMbo.getString("ORGID"), 2L);
        udmxjymxMbo.setValue("SITEID", appMbo.getString("SITEID"), 2L);
        String doctype=appMbo.getString("DOCTYPE");
        udmxjymxMbo.setValue("ITEMNUM", itemnum, 2L);
        udmxjymxMbo.setValue("DEPTNUM", deptnum, 2L);
        udmxjymxMbo.setValue("LOCATION", appMbo.getString("LOCATION"), 2L);
        udmxjymxMbo.setValue("BINNUM", mxlineMbo.getString("BINNUM"), 2L);
        udmxjymxMbo.setValue("TRADETYPE", doctype, 2L);
        udmxjymxMbo.setValue("TRADETIME", new Date(), 2L);
        udmxjymxMbo.setValue("JYNUM", appMbo.getString("UDMXWARENUM"), 2L);
        udmxjymxMbo.setValue("TRADEBY", appMbo.getString("CREATEBY"), 2L);
        udmxjymxMbo.setValue("APPNAME", "UDMXWARE", 2L);

        //新模入库 From：空值（系统默认） To：库存数量（系统默认）
        if("M01".equalsIgnoreCase(doctype) &&
                "N01".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("KCSL", mxlineMbo.getDouble("QUANTITY"), 2L);//库存数量
        }
        //生产领用 From：库存数量（系统默认） To：在用数量（系统默认）
        if("M02".equalsIgnoreCase(doctype) &&
                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N03".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("KCSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//库存数量
            udmxjymxMbo.setValue("ZYSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//在用数量
        }
        //生产归还 From：在用数量 To：库存数量
        if("M03".equalsIgnoreCase(doctype) &&
                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("KCSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//库存数量
            udmxjymxMbo.setValue("ZYSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//在用数量

        }
        //生产归还 From：在用数量 To：待修数量
        if("M03".equalsIgnoreCase(doctype) &&
                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N04".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("ZYSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//在用数量
            udmxjymxMbo.setValue("DXSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//待修数量

        }
        //物料送修 From：待修数量 To：在修数量
        if("M04".equalsIgnoreCase(doctype) &&
                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N05".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("ZXSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//在修数量
            udmxjymxMbo.setValue("DXSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//待修数量

        }
        //维修入库 From：库存数量 To：库存数量
        if("M05".equalsIgnoreCase(doctype) &&
                "N05".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N02".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("KCSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//库存数量
            udmxjymxMbo.setValue("ZXSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//在修数量

        }
        //物料报废 From：库存数量 To：报废数量
        if("M06".equalsIgnoreCase(doctype) &&
                "N02".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("KCSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//库存数量
            udmxjymxMbo.setValue("BFSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//报废数量

        }
        //物料报废 From：在用数量 To：报废数量
        if("M06".equalsIgnoreCase(doctype) &&
                "N03".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("ZYSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//在用数量
            udmxjymxMbo.setValue("BFSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//报废数量

        }
        //物料报废 From：待修数量 To：报废数量
        if("M06".equalsIgnoreCase(doctype) &&
                "N04".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("DXSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//待修数量
            udmxjymxMbo.setValue("BFSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//报废数量

        }
        //物料报废 From：在修数量 To：报废数量
        if("M06".equalsIgnoreCase(doctype) &&
                "N05".equalsIgnoreCase(mxlineMbo.getString("FROMZ")) &&
                "N06".equalsIgnoreCase(mxlineMbo.getString("TOZ")) ){
            udmxjymxMbo.setValue("ZXSL", (-mxlineMbo.getDouble("QUANTITY")), 2L);//在修数量
            udmxjymxMbo.setValue("BFSL", (mxlineMbo.getDouble("QUANTITY")), 2L);//报废数量

        }
        udmxjymxMbo.getThisMboSet().save();

    }



}
