TrackingFlowTask.java 19.7 KB
Newer Older
lzxry committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
package track.task;

import common.model.CalculationFlow;
import common.model.Contract;
import common.model.TkioFlow;
import common.repository.CalculationFlowRepository;
import common.repository.ContractChangeRepository;
import common.repository.ContractRepository;
import common.repository.TkioFlowRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import tkio.model.Account;
import tkio.repository.AccountRepository;
import tkio.repository.AppRepository;
import tkio.service.AccountFlowRestrictService;
import util.DateUtil;
18
import util.StringUtil;
lzxry committed
19

lzxry committed
20
import java.math.BigDecimal;
lzxry committed
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
import java.math.BigInteger;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author liyin
 * @description
 * @date
 */
public class TrackingFlowTask {

    private final Logger logger = LoggerFactory.getLogger(TrackingFlowTask.class);

    @Autowired
    private ContractRepository contractRepository;
    @Autowired
    private AccountRepository accountRepository;
    @Autowired
    private AppRepository appRepository;
    @Autowired
    private AccountFlowRestrictService accountFlowRestrictService;
    @Autowired
    private TkioFlowRepository tkioFlowRepository;
    @Autowired
    private ContractChangeRepository contractChangeRepository;
    @Autowired
    private CalculationFlowRepository calculationFlowRepository;

    public void syncFlow(){
lzxry committed
51
        List<CalculationFlow> calculationFlows = calculationFlowRepository.findByStatus(0);
lzxry committed
52 53 54 55 56 57 58
        for (CalculationFlow calculationFlow : calculationFlows) {
            List<TkioFlow> tkioFlowList = new ArrayList<>();
            calculationFlow.setStatus(1);
            calculationFlowRepository.save(calculationFlow);
            tkioFlowRepository.deleteByEmail(calculationFlow.getEmail());
            String email = calculationFlow.getEmail();
            //查询用户下所有appkey
lzxry committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
            try{
                Account account = accountRepository.findByEmail(email);
                List<Account> accountList = accountRepository.findByRootParent(account.getRootParent());
                List<Long> idList = new ArrayList<>();
                for (Account ac : accountList) {
                    idList.add(ac.getId());
                }
                List<String> appkeys = appRepository.findAppkeysNotDebug(idList);
                String appkeyStr = String.join("','", appkeys);
                appkeyStr = "'" + appkeyStr + "'";

                String ago = DateUtil.format(account.getCreateTime(), DateUtil.C_DATE_PATTON_DEFAULT);//查找最早一天的流量
                if (ago == null) {
                    calculationFlow.setStatus(2);
                    calculationFlowRepository.save(calculationFlow);
                    continue;
                }
lzxry committed
76

lzxry committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
                int between = 0;
                try {
                    between = DateUtil.daysBetween(ago, DateUtil.getBeforeDays(1)) + 1;
                } catch (ParseException e) {
                    logger.error("强转错误:", e);
                }
                int startInt = 0;
                if (Integer.valueOf(DateUtil.getHH()) > 10) {
                    startInt = -1;
                }
                for (int ii = between; ii > startInt; ii--) {
                    String yesterday = DateUtil.getBeforeDays(ii);//昨日
                    BigInteger clickNum = accountFlowRestrictService.getTotalNum(yesterday, yesterday, appkeyStr, "account_track_flow_restrict", "click_sum");
                    if (clickNum != null && clickNum.longValue() > 0) {
                        List<Contract> contracts = contractRepository.findByPlatformAndEmail("tkio", email);
                        if (contracts.size() == 1) {//只有一个合同
                            TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contracts.get(0));
                            if (tkioFlow != null) {
                                tkioFlowList.add(tkioFlow);
lzxry committed
96
                                tkioFlowRepository.save(tkioFlow);
lzxry committed
97
                            }
lzxry committed
98 99 100 101 102 103 104 105 106 107
                        } else {
                            //多个合同
                            //看昨日被哪几个合同包含了
                            List<Contract> correlationContract = new ArrayList<>();
                            for (Contract contract : contracts) {
                                /*if (ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus()) || ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
                                    //中止或作废合同处理结束时间,以方便昨日流量的归属计算
                                    ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());
                                    if (contractChange != null) {
                                        contract.setEndDate(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));
lzxry committed
108
                                    }
lzxry committed
109 110 111 112 113
                                }*/
                                String startDate = contract.getStartDate();
                                String endDate = contract.getEndDate();
                                if (DateUtil.getDate(yesterday).getTime() >= DateUtil.getDate(startDate).getTime() && DateUtil.getDate(yesterday).getTime() <= DateUtil.getDate(endDate).getTime()) {
                                    correlationContract.add(contract);
lzxry committed
114 115
                                }
                            }
lzxry committed
116 117 118 119 120 121
                            //多个合同时,进行排序,如果第一个合同流量超出就要看第二个合同,以此往下
                            if (correlationContract.size() > 1) {
                                //冒泡
                                //第一优先级:合同开始日期,第二优先级,合同编号大小
                                Contract[] contractsArray = new Contract[correlationContract.size()];
                                contractsArray = correlationContract.toArray(contractsArray);
lzxry committed
122

lzxry committed
123
                                contractsArray = orderByContract(contractsArray);
lzxry committed
124

lzxry committed
125 126
                                for (int i = 0; i < contractsArray.length; i++) {
                                    TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contractsArray[i]);
127
                                    if (tkioFlow != null && i < contractsArray.length - 1 && tkioFlow.getCostFlow() !=null && tkioFlow.getCostFlow() > 0L) {//处理成本流量,如果超出了,依次算在下一个合同上
lzxry committed
128 129
                                        clickNum = BigInteger.valueOf(tkioFlow.getCostFlow());
                                        tkioFlow.setCostFlow(null);
lzxry committed
130 131 132 133
                                        if(tkioFlow.getFlow()>0){
                                            tkioFlowList.add(tkioFlow);
                                            tkioFlowRepository.save(tkioFlow);
                                        }
lzxry committed
134 135
                                    } else {
                                        if (tkioFlow != null) {
lzxry committed
136
                                            tkioFlowList.add(tkioFlow);
lzxry committed
137
                                            tkioFlowRepository.save(tkioFlow);
lzxry committed
138 139 140
                                        }
                                        break;
                                    }
lzxry committed
141

lzxry committed
142
                                }
lzxry committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
                            } else {
                                if (correlationContract.size() == 0) {//昨日不包含在所有合同中
                                    //排序
                                    Contract[] contractsArray = new Contract[contracts.size()];
                                    contractsArray = contracts.toArray(contractsArray);
                                    contractsArray = orderByContract(contractsArray);
                                    //如果昨日日期在第一个合同之前,则归属到第一个合同的成本,其余区间都归属到前一个合同的成本上
                                    for (int i = 0; i < contractsArray.length; i++) {
                                        if (DateUtil.getDate(yesterday).getTime() <= DateUtil.getDate(contractsArray[i].getStartDate()).getTime() || i == contractsArray.length - 1) {
                                            int j = 0;

                                            if (i != 0) {
                                                j = i - 1;
                                            }

                                            if (i == contractsArray.length - 1) {
                                                j = i;
                                            }

                                            TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contractsArray[j]);
                                            if (tkioFlow != null) {
                                                tkioFlowList.add(tkioFlow);
lzxry committed
165
                                                tkioFlowRepository.save(tkioFlow);
lzxry committed
166 167 168 169 170 171 172 173
                                            }
                                            break;
                                        }
                                    }
                                } else {
                                    TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, correlationContract.get(0));
                                    if (tkioFlow != null) {
                                        tkioFlowList.add(tkioFlow);
lzxry committed
174
                                        tkioFlowRepository.save(tkioFlow);
lzxry committed
175
                                    }
lzxry committed
176 177
                                }

lzxry committed
178
                            }
lzxry committed
179 180 181
                        }
                    }
                }
lzxry committed
182
                if (tkioFlowList.size() > 0) {
lzxry committed
183
                    //tkioFlowRepository.save(tkioFlowList);
lzxry committed
184 185 186 187
                }
                calculationFlow.setStatus(2);
                calculationFlowRepository.save(calculationFlow);
            }catch(Exception e){
188
                logger.error("CalculationFlow:Id::"+calculationFlow.getId()+":全流量同步失败",e);
lzxry committed
189 190
                calculationFlow.setStatus(3);
                calculationFlowRepository.save(calculationFlow);
lzxry committed
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
            }
        }
    }

    public void task(){
        List<String> emails = contractRepository.findDistinctEmailByPlatform("tkio");

        List<TkioFlow> tkioFlowList = new ArrayList<>();

        for (String email : emails) {

            //查询用户下所有appkey
            Account account = accountRepository.findByEmail(email);
            List<Account> accountList = accountRepository.findByRootParent(account.getRootParent());
            List<Long> idList = new ArrayList<>();
            for (Account ac : accountList) {
                idList.add(ac.getId());
            }
            List<String> appkeys = appRepository.findAppkeysNotDebug(idList);
            String appkeyStr = String.join("','", appkeys);
            appkeyStr= "'"+appkeyStr+"'";


            String yesterday = DateUtil.getBeforeDays(1);//昨日
            BigInteger clickNum = accountFlowRestrictService.getTotalNum(yesterday, yesterday, appkeyStr, "account_track_flow_restrict", "click_sum");
            if(clickNum!=null&&clickNum.longValue()>0){
                List<Contract> contracts = contractRepository.findByPlatformAndEmail("tkio", email);
                if(contracts.size()==1){//只有一个合同
                    TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contracts.get(0));
                    if(tkioFlow!=null){
                        tkioFlowList.add(tkioFlow);
lzxry committed
222
                        tkioFlowRepository.save(tkioFlow);
lzxry committed
223 224 225 226 227
                    }
                }else{//多个合同
                    //看昨日被哪几个合同包含了
                    List<Contract>  correlationContract = new ArrayList<>();
                    for (Contract contract : contracts) {
lzxry committed
228
                        /*if (ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus()) || ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
lzxry committed
229 230 231
                            //中止或作废合同处理结束时间,以方便昨日流量的归属计算
                            ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());
                            if(contractChange!=null){
lzxry committed
232
                                contract.setEndDate(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));
lzxry committed
233
                            }
lzxry committed
234
                        }*/
lzxry committed
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
                        String startDate = contract.getStartDate();
                        String endDate = contract.getEndDate();
                        if(DateUtil.getDate(yesterday).getTime()>=DateUtil.getDate(startDate).getTime() && DateUtil.getDate(yesterday).getTime()<=DateUtil.getDate(endDate).getTime()){
                            correlationContract.add(contract);
                        }
                    }
                    //多个合同时,进行排序,如果第一个合同流量超出就要看第二个合同,以此往下
                    if(correlationContract.size()>1){
                        //冒泡
                        //第一优先级:合同开始日期,第二优先级,合同编号大小
                        Contract[] contractsArray = new Contract[correlationContract.size()];
                        contractsArray = correlationContract.toArray(contractsArray);

                        contractsArray = orderByContract(contractsArray);

                        for (int i = 0; i < contractsArray.length; i++) {
                            TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contractsArray[i]);
lzxry committed
252
                            if(tkioFlow!=null&& i<contractsArray.length-1 && tkioFlow.getCostFlow()!=null && tkioFlow.getCostFlow()>0L){//处理成本流量,如果超出了,依次算在下一个合同上
lzxry committed
253 254
                                clickNum = BigInteger.valueOf(tkioFlow.getCostFlow());
                                tkioFlow.setCostFlow(null);
lzxry committed
255 256 257 258
                                if(tkioFlow.getFlow()>0) {
                                    tkioFlowList.add(tkioFlow);
                                    tkioFlowRepository.save(tkioFlow);
                                }
lzxry committed
259 260 261
                            }else{
                                if(tkioFlow!=null){
                                    tkioFlowList.add(tkioFlow);
lzxry committed
262
                                    tkioFlowRepository.save(tkioFlow);
lzxry committed
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
                                }
                                break;
                            }

                        }
                    }else{
                        if(correlationContract.size()==0){//昨日不包含在所有合同中
                            //排序
                            Contract[] contractsArray = new Contract[contracts.size()];
                            contractsArray = contracts.toArray(contractsArray);
                            contractsArray = orderByContract(contractsArray);
                            //如果昨日日期在第一个合同之前,则归属到第一个合同的成本,其余区间都归属到前一个合同的成本上
                            for (int i = 0; i < contractsArray.length; i++) {
                                if(DateUtil.getDate(yesterday).getTime()<=DateUtil.getDate(contractsArray[i].getStartDate()).getTime() || i==contractsArray.length-1){
                                    int j = 0;

                                    if(i!=0){
                                        j=i-1;
                                    }

                                    if(i==contractsArray.length-1){
                                        j = i;
                                    }

                                    TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, contractsArray[j]);
                                    if(tkioFlow!=null){
                                        tkioFlowList.add(tkioFlow);
lzxry committed
290
                                        tkioFlowRepository.save(tkioFlow);
lzxry committed
291 292 293 294 295 296 297 298 299 300 301
                                    }
                                    break;
                                }
                            }



                        }else{
                            TkioFlow tkioFlow = getTkioFlow(clickNum, yesterday, correlationContract.get(0));
                            if(tkioFlow!=null){
                                tkioFlowList.add(tkioFlow);
lzxry committed
302
                                tkioFlowRepository.save(tkioFlow);
lzxry committed
303 304 305 306 307 308 309 310 311 312 313
                            }
                        }

                    }
                }
            }



        }
        if(tkioFlowList.size()>0){
lzxry committed
314
            //tkioFlowRepository.save(tkioFlowList);
lzxry committed
315 316 317 318 319 320 321 322 323 324 325 326 327
        }

    }

    //排序
    public Contract[] orderByContract(Contract[] contractsArray){
        for (int i = 0; i < contractsArray.length-1; i++) {
            for (int j = 0; j < contractsArray.length-1-i; j++) {
                if(DateUtil.getDate(contractsArray[j].getStartDate()).getTime() > DateUtil.getDate(contractsArray[j + 1].getStartDate()).getTime()){
                    Contract temp = contractsArray[j];
                    contractsArray[j] = contractsArray[j+1];
                    contractsArray[j + 1] = temp;
                }else if(DateUtil.getDate(contractsArray[j].getStartDate()).getTime() == DateUtil.getDate(contractsArray[j + 1].getStartDate()).getTime()){
328 329 330

                    String contractCode = StringUtil.matchNumber(contractsArray[j].getContractCode());
                    String contractCodeMin = StringUtil.matchNumber(contractsArray[j+ 1].getContractCode());
lzxry committed
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
                    if(Long.valueOf(contractCode)>Long.valueOf(contractCodeMin)){
                        Contract temp = contractsArray[j];
                        contractsArray[j] = contractsArray[j+1];
                        contractsArray[j + 1] = temp;
                    }
                }
            }
        }
        return contractsArray;
    }

    public TkioFlow getTkioFlow(BigInteger clickNum,String yesterday,Contract contract){
        TkioFlow tkioFlow = new TkioFlow();
        tkioFlow.setDs(yesterday);
        tkioFlow.setEmail(contract.getEmail());
        tkioFlow.setContractCode(contract.getContractCode());
        try {
lzxry committed
348
            if(DateUtil.daysBetween(contract.getStartDate(), yesterday)<0 || DateUtil.daysBetween(contract.getEndDate(), yesterday)>0){//昨日日期早于合同开始日期
lzxry committed
349 350 351 352
                //设置为成本流量
                tkioFlow.setCostFlow(clickNum.longValue());
            }else{
                //查看历史总消耗流量是否超出
lzxry committed
353
                BigDecimal totalFlow = tkioFlowRepository.sumFlowByEmailAndContractCode(contract.getEmail(),contract.getContractCode());
lzxry committed
354
                totalFlow=totalFlow==null?new BigDecimal(0):totalFlow;
lzxry committed
355 356
                    Double contractTrackFlow = contract.getTrackFlow() * 10000;
                    if(contractTrackFlow.longValue()-totalFlow.longValue()-clickNum.longValue()>=0){
lzxry committed
357 358
                        tkioFlow.setFlow(clickNum.longValue());
                    }else{
lzxry committed
359
                        tkioFlow.setFlow(contractTrackFlow.longValue() - totalFlow.longValue());
lzxry committed
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
                        tkioFlow.setCostFlow(clickNum.longValue()-tkioFlow.getFlow());
                    }

            }
            return tkioFlow;
        } catch (ParseException e) {
            logger.error("合同编号-"+contract.getContractCode()+"-同步昨日流量错误:",e);
        }
        return null;
    }

    public static void main(String[] args) throws ParseException {
        String ago = "2020-10-01";
        int between = DateUtil.daysBetween(ago, DateUtil.getBeforeDays(1))+1;
        System.out.println(between);
        for (int i = between; i > 0; i--) {
            System.out.println(DateUtil.getBeforeDays(i));
        }
    }
}