wangting
2024-09-27 a3e87f78ee262ca9bb7d9b0c997639d5f3295890
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
package com.vci.client.uif.actions.client;
 
import java.util.Map;
 
import com.vci.client.bof.ClientBusinessObject;
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.portal.utility.PLDefination;
import com.vci.client.ui.swing.components.VCIJOptionPane;
import com.vci.client.uif.actions.client.ClipboardData.ClipboardDataType;
import com.vci.client.uif.actions.client.ClipboardData.ClipboardOperation;
import com.vci.client.uif.engine.common.IDataNode;
import com.vci.mw.ClientContextVariable;
 
/**
 * 粘贴操作
 * 只粘贴对象之间的关系
 * @author VCI-STGK006
 *
 */
public class PasteAction extends DoseNotSelectDataHasRightCheckAction {
 
    /**
     * 操作方法集合
     */
    private UIFUtils operation = 
            new UIFUtils();
    
    /**
     * 判断form的类型
     * 不同的form类型得到属性的key是不同的
     * 0:业务类型,1:链接类型
     */
    private int operationType = 0;
    
    /**
     * 按钮参数信息
     */
    private Map<String, String> paramsMap;
    
    /**
     * 是否需要先选择数据然后执行创建操作
     */
    boolean needSelect = false;
    
    public PasteAction(){
        super();
    }
    
    @Override
    public String getKey() {
        return PASTE;
    }
    
    @Override
    public boolean checkHasRight(){
        // 按LBO进行数据权限检查
        setDataRightCheckType(RightCheckConstants.RIGHT_CHECK_TYPE_FB);
        return super.checkHasRight();
    }
    
    /**
     * 判断执行Action任务之前是否需要先选择数据
     */
    public boolean beforePost() {
        
        //获得按钮参数
        paramsMap = getButtonParams();
        if(paramsMap.containsKey("needselect")){
            String value = paramsMap.get("needselect");
            if(value.equalsIgnoreCase("true")){
                needSelect = true;
            }
        }
        if(needSelect){
            if(!isSelectedObject()) return false;
            
            Object[] objs = getDataModel().getSelectObjects();
            if(objs.length > 1){
                VCIJOptionPane.showMessage(getParentComponent(), "只能选择一条数据执行创建操作!");
                return false;
            }
        }
        return true;
    }
 
    @Override
    public boolean doPost() {
        try {
            //获得按钮参数
            paramsMap = getButtonParams();
            //String formName= paramsMap.get("formName");
            //得到剪切板中的数据信息
            ClipboardData cdata = ClientBusinessObjectClipboard.getInstance().getdata();
            if(cdata == null){
                UIFUtils.showMessage(ClientContextVariable.getFrame(), 
                        "uifmodel.plm.uif.actions.parstedatanotexistmsg");
                return false;
            }
            if(!cdata.isFullData()){
                UIFUtils.showMessage(ClientContextVariable.getFrame(), 
                        "uifmodel.plm.uif.actions.parstedatanotfullmsg");
                return false;
            }
            //XXX 暂时去掉Link类型校验 判断复制的链接类型与粘贴的链接类型是否相符
            String copyType = cdata.getSrcLoName();
            String pasteType = "";
            //获得sourceDate,source可能来自用户选择的数据,也可能来自父窗口传递的数据
            IDataNode fromDataNode = null;
            if(needSelect){
                fromDataNode = (IDataNode)getDataModel().getSelectObjects()[0];
                //XXX 当使用选择的数据时linktype暂时应该没有获取的地方,按时不进行类型的校验
                //if(!copyType.equals(pasteType)){
                //    operation.showMessage(ClientContextVariable.getFrame(), 
                //            "uifmodel.plm.uif.actions.cannotparstemsg");
                //    return false;
                //}
            } else {
                fromDataNode = getRegionPanel().getSourceData();
                //当时用源作为粘贴的目标时,粘贴的linktype可从PLDefination中取
                PLDefination defination = getDefination();
                pasteType = defination.getLinkType();
                if(!copyType.equals(pasteType)){
                    UIFUtils.showMessage(ClientContextVariable.getFrame(), 
                            "uifmodel.plm.uif.actions.cannotparstemsg");
                    return false;
                }
            }
            ClientBusinessObject from = null;
            Object fromObj = fromDataNode.getMaterObject();
            if(fromObj instanceof ClientBusinessObject){
                from = (ClientBusinessObject) fromObj;
            } else if(fromObj instanceof ClientLinkObject) {
                //如果是LO对象,使用LO对应TO端BO对象作为创建的From对象
                ClientLinkObject fromLO = (ClientLinkObject) fromObj;
                from = getToBusinessObject(fromLO);
            }
            //验证from对象
            if(from == null 
                    || from.getBusinessObject().oid == null
                    || from.getBusinessObject().oid.equals("")){
                UIFUtils.showMessage(ClientContextVariable.getFrame(), 
                        "uifmodel.plm.uif.actions.createlinkerror.fromdelete");
                return false;
            }
            //判断复制的业务对象还是复制的链接对象
            boolean success = false;
            if(ClipboardDataType.BO.equals(cdata.getCt())){
                //得到复制的业务对象
                ClientBusinessObject[] cbos = (ClientBusinessObject[]) cdata.getData();
                success = operation.pasteBusinessObjects(
                        ClientContextVariable.getFrame(), from, pasteType, cbos);
            } else if (ClipboardDataType.LO.equals(cdata.getCt())){
                //得到复制的链接对象
                ClientLinkObject[] clos = (ClientLinkObject[]) cdata.getData();
                success = operation.pasteBusinessObjects(
                        ClientContextVariable.getFrame(), from, pasteType, clos);
            } else {
                //其它数据类型 暂时不做处理
                return false;
            }
            // 复制成功
            if(success){
                //判断是复制操作还是剪切操作
                if(cdata.getCo().equals(ClipboardOperation.cut)){
                    //暂时没有实现剪切操作
                    ClientLinkObject[] clos = (ClientLinkObject[]) cdata.getData();
                    //批量删除剪切的link
                    operation.deleteLinkObject(ClientContextVariable.getFrame(), clos, false);
                    //清空剪切板
                    ClientBusinessObjectClipboard.getInstance().clearClipboard();
                } else {
                    //XXX 复制成功后是否需要清空剪切板
                }
                UIFUtils.showMessage(ClientContextVariable.getFrame(),
                        "uifmodel.plm.uif.actions.pastesuccessmsg");
            } else {
                UIFUtils.showMessage(ClientContextVariable.getFrame(),
                        "uifmodel.plm.uif.actions.pastefailmsg");
            }
            return success;
        } catch (Exception e){
            UIFUtils.showErrorMessage(ClientContextVariable.getFrame(),
                    "uifmodel.plm.uif.actions.parsterror", e);
            return false;
        }
    }
    
    /**
     * 查询LO对象TO端的BO对象
     * @param clo
     * @return
     * @throws Exception
     */
    public ClientBusinessObject getToBusinessObject(ClientLinkObject clo) throws Exception{
        ClientBusinessObject cbo = null;
        String btmName = clo.getLinkObject().toBTName;
        String oid = clo.getLinkObject().toOid;
        cbo = operation.reloadClientBusinessObject(
                ClientContextVariable.getFrame(), oid, btmName);
        return cbo;
    }
}