package CASche.caschedule;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import CASche.CASPrivatePara;
import CASche.common.CaConstants;
import CASche.common.SchedultException;
public class MergeImpl implements Merge {
private CASPrivatePara cas_para=null;
private int multi_cnt=31;//�ϲ�����
public MergeImpl(CASPrivatePara cas_para,int multi_cnt){
this.cas_para=cas_para;
if(multi_cnt>0)
this.multi_cnt=multi_cnt;
}
/**
* ������ֺϲ�
* ��ͬ��ʼʱ�䣬����ʱ�䣬ָ������ �ϲ�
* @throws Exception
*/
public List<JCaCommand> mergeMultiCotrolId(List<JCmdDay> daylist) throws SchedultException {
//��ͬ�����ְ�����ָ��ϲ�
List<JCaCommand> samecontrollist=this.mergeSameCotrolId(daylist);
//�Ӽ���Ȩ���
//key=cmd_type
Map<String,List<JCaCommand>> mergeMap=new HashMap<String,List<JCaCommand>>();
//��ȡ��ͬcmd_type��ָ���б���ֳɼӼ���Ȩ�б�
for(JCaCommand cmd:samecontrollist){
if(mergeMap.containsKey(cmd.getCmd_type())){
mergeMap.get(cmd.getCmd_type()).add(cmd);
}else{
List<JCaCommand> list=new ArrayList<JCaCommand>();
list.add(cmd);
mergeMap.put(cmd.getCmd_type(), list);
}
}
List<JCaCommand> mergelist=new ArrayList<JCaCommand>();
Map<Long,Long> mergetransMap=new HashMap<Long,Long>();//��¼��д��transnum
//����Ȩ�����ϲ�����
if(mergeMap.containsKey(CaConstants.AddProduct)){
if(CASPrivatePara.MODE_SAMETIME.equals(this.cas_para.getAddMode())){
mergelist.addAll(this.multiCotrolId_SAMETIME(mergeMap.get(CaConstants.AddProduct),mergetransMap));
}else{
mergelist.addAll(this.multiCotrolId_ALLTIME(mergeMap.get(CaConstants.AddProduct),mergetransMap));
}
}
//����Ȩ�����ϲ�����
if(mergeMap.containsKey(CaConstants.CancelProduct)){
if(CASPrivatePara.MODE_SAMETIME.equals(this.cas_para.getCancelMode())){
mergelist.addAll(this.multiCotrolId_SAMETIME(mergeMap.get(CaConstants.CancelProduct),mergetransMap));
}else{
mergelist.addAll(this.multiCotrolId_ALLTIME(mergeMap.get(CaConstants.CancelProduct),mergetransMap));
}
}
//�����
for(JCmdDay day:daylist){
if(!mergetransMap.containsKey(day.getMerge_trunsnum()))
throw new SchedultException(day.getMerge_trunsnum()+"δ�ҵ��ϲ���Ӧmerge_trunsnum");
day.setMerge_trunsnum(mergetransMap.get(day.getMerge_trunsnum()));
}
return mergelist;
}
/**
* �����ϲ����ɸ�ʱ�����
* @param list
* @return
*/
private List<JCaCommand> multiCotrolId_ALLTIME(List<JCaCommand> list,Map<Long,Long> mergetransMap){
//ָ��ϲ�
List<JCaCommand> mergelist=new ArrayList<JCaCommand>();
StringBuilder merge_buffer=new StringBuilder();
//��ջ���
merge_buffer.delete(0, merge_buffer.length());
if(list.size()==1){
//��������
merge_buffer.append("CTRL1:'").append(list.get(0).getControl_id()).append("';");
list.get(0).setDetail_params(merge_buffer.toString());
mergelist.addAll(list);//װ���ϲ������Ȩ
//��¼�ϲ���ˮ
mergetransMap.put(list.get(0).getTransnum(), list.get(0).getTransnum());
}else{
//�����ϲ�
int merge_cnt=1;
merge_buffer.delete(0, merge_buffer.length());
JCaCommand start=null;
for(int i=0;i<list.size();i++){
JCaCommand cmd=list.get(i);
if(start==null){
start=cmd.esaycopyBean();
}
merge_buffer.append("CTRL").append(merge_cnt).append(":")
.append("'").append(cmd.getControl_id()).append("';");
if(!start.getAuth_begin_date().equals(cmd.getAuth_begin_date())
||!start.getAuth_end_date().equals(cmd.getAuth_end_date())){
//��ʼ����ʱ�䲻һ�£������ʱ�����
merge_buffer.append("BD").append(merge_cnt).append(":'").append(cmd.getAuth_begin_date())
.append("';").append("ED").append(merge_cnt).append(":'").append(cmd.getAuth_end_date()).append("';");
}
merge_cnt++;
//��¼�ϲ���ˮ
mergetransMap.put(cmd.getTransnum(), start.getTransnum());
//���ϲ�31��ָ��
if(merge_cnt>=this.multi_cnt){
merge_buffer.insert(0, "CNT:'"+(this.multi_cnt-1)+"';");
start.setDetail_params(merge_buffer.toString());
mergelist.add(start);//װ���ϲ������Ȩ
merge_cnt=1;
merge_buffer.delete(0, merge_buffer.length());
start=null;
}
}
if(merge_cnt>1){
merge_buffer.insert(0, "CNT:'"+(merge_cnt-1)+"';");
start.setDetail_params(merge_buffer.toString());
mergelist.add(start);//װ���ϲ������Ȩ
}
}
return mergelist;
}
/**
* ��ͬʱ��ģʽ��ָ��ϲ������ɸ�ʱ�����
* @param samecontrollist
*/
private List<JCaCommand> multiCotrolId_SAMETIME(List<JCaCommand> samecontrollist,Map<Long,Long> mergetransMap){
//key=auth_begin_date+cmd_type+auth_end_date
Map<String,List<JCaCommand>> mergeMap=new HashMap<String,List<JCaCommand>>();
StringBuilder buffer=new StringBuilder();
//��ȡ��ͬauth_begin_date+cmd_type+auth_end_date��ָ���б�
for(JCaCommand cmd:samecontrollist){
buffer.delete(0, buffer.length());
String key=buffer.append(cmd.getAuth_begin_date())
.append(cmd.getCmd_type())
.append(cmd.getAuth_end_date()).toString();
if(mergeMap.containsKey(key)){
mergeMap.get(key).add(cmd);
}else{
List<JCaCommand> list=new ArrayList<JCaCommand>();
list.add(cmd);
mergeMap.put(key, list);
}
}
//ָ��ϲ�
List<JCaCommand> mergelist=new ArrayList<JCaCommand>();
StringBuilder merge_buffer=new StringBuilder();
for(List<JCaCommand> list:mergeMap.values()){
merge_buffer.delete(0, merge_buffer.length());
if(list.size()==1){
merge_buffer.append("CTRL1:'").append(list.get(0).getControl_id()).append("';");
list.get(0).setDetail_params(merge_buffer.toString());
mergelist.addAll(list);//װ���ϲ������Ȩ
mergetransMap.put(list.get(0).getTransnum(), list.get(0).getTransnum());
}else{
int merge_cnt=1;
merge_buffer.delete(0, merge_buffer.length());
JCaCommand start=null;
for(int i=0;i<list.size();i++){
JCaCommand cmd=list.get(i);
if(start==null){
start=cmd.esaycopyBean();
}
merge_buffer.append("CTRL").append(merge_cnt).append(":")
.append("'").append(cmd.getControl_id()).append("';");
merge_cnt++;
//��¼�ϲ���ˮ
mergetransMap.put(cmd.getTransnum(), start.getTransnum());
//ֻ�ϲ�31��ָ��
if(merge_cnt>=this.multi_cnt){
merge_buffer.insert(0, "CNT:'"+this.multi_cnt+"';");
start.setDetail_params(merge_buffer.toString());
mergelist.add(start);//װ���ϲ������Ȩ
merge_cnt=1;
merge_buffer.delete(0, merge_buffer.length());
start=null;
}
}
if(merge_cnt>1){
merge_buffer.insert(0, "CNT:'"+(merge_cnt-1)+"';");
start.setDetail_params(merge_buffer.toString());
mergelist.add(start);//װ���ϲ������Ȩ
}
}
}
return mergelist;
}
/**
* ��ͬ�����ֺϲ�
* ��ȡ���µĿ����ֵļ�¼
*/
public List<JCaCommand> mergeSameCotrolId(List<JCmdDay> daylist) {
Map<String,List<JCmdDay>> mergeMap=new HashMap<String,List<JCmdDay>>();
for(JCmdDay day:daylist){
if(mergeMap.containsKey(day.getCacmd().getControl_id())){
//map���ڿ�����
mergeMap.get(day.getCacmd().getControl_id()).add(day);
}else{
//map�����ڿ�����
List<JCmdDay> list=new ArrayList<JCmdDay>();
list.add(day);
mergeMap.put(day.getCacmd().getControl_id(), list);
}
}
//��ȡ�ϲ���merger_trunsnum
List<JCaCommand> merge_list=new ArrayList<JCaCommand>();
for(String controlid: mergeMap.keySet()){
List<JCmdDay> list=mergeMap.get(controlid);
//ȡ��С����ָͬ���trunsnum��Ϊ�ϲ�merge_trunsnum
Long mergetrunsnum=list.get(0).getCacmd().getTransnum();
JCaCommand merge=list.get(list.size()-1).getCacmd().copyBean();
merge.setTransnum(mergetrunsnum.longValue());
merge_list.add(merge);
for(JCmdDay day:list){
day.setMerge_trunsnum(mergetrunsnum);
if(day.getCacmd().getAuth_end_date().compareTo(merge.getAuth_end_date())>0){
merge.setAuth_end_date(day.getCacmd().getAuth_end_date());
}
}
}
return merge_list;
}
}