ShareIncomeServiceImpl.java 113 KB
Newer Older
kangxiaoshan committed
1 2
package common.service.impl;

lzxry committed
3 4 5
import com.amazonaws.services.dynamodbv2.xspec.S;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
kangxiaoshan committed
6
import common.model.*;
lzxry committed
7
import common.repository.*;
kangxiaoshan committed
8 9 10 11
import common.service.ShareIncomeService;
import dic.ContractStatusEnum;
import dic.RoleEnum;
import net.sf.json.JSONArray;
12 13 14
import offline.model.AccountVO;
import offline.model.TrackFlowVO;
import offline.repository.TkioOfflineRepository;
kangxiaoshan committed
15 16
import org.joda.time.DateTime;
import org.joda.time.Days;
kangxiaoshan committed
17
import org.joda.time.Months;
kangxiaoshan committed
18 19
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
kangxiaoshan committed
20 21
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
lzxry committed
22
import org.springframework.util.CollectionUtils;
kangxiaoshan committed
23
import org.springframework.util.StringUtils;
lzxry committed
24 25 26 27
import tkio.model.Account;
import tkio.repository.AccountRepository;
import tkio.repository.AppRepository;
import tkio.service.AccountFlowRestrictService;
lzxry committed
28
import util.Constant;
lzxry committed
29
import util.ContractBranchUtil;
lzxry committed
30
import util.DateUtil;
31
import util.StringUtil;
kangxiaoshan committed
32

kangxiaoshan committed
33
import java.math.BigDecimal;
lzxry committed
34
import java.math.BigInteger;
kangxiaoshan committed
35
import java.util.ArrayList;
lzxry committed
36
import java.util.Date;
37
import java.util.Iterator;
kangxiaoshan committed
38 39
import java.util.List;
import java.util.Map;
lzxry committed
40
import java.util.*;
lzxry committed
41
import java.util.function.Function;
kangxiaoshan committed
42
import java.util.stream.Collectors;
kangxiaoshan committed
43
import java.util.stream.Stream;
kangxiaoshan committed
44 45 46

@Service
public class ShareIncomeServiceImpl implements ShareIncomeService {
kangxiaoshan committed
47 48 49

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

kangxiaoshan committed
50 51 52 53 54 55 56 57
    @Autowired
    private ContractRepository contractRepository;
    @Autowired
    private AuthRepository authRepository;
    @Autowired
    private ContractBodyRepository contractBodyRepository;
    @Autowired
    private ContractChangeRepository contractChangeRepository;
lzxry committed
58 59
    @Autowired
    private BarrioCityRepository barrioCityRepository;
lzxry committed
60 61 62 63 64 65
    @Autowired
    private AppRepository appRepository;
    @Autowired
    private AccountRepository accountRepository;
    @Autowired
    private AccountFlowRestrictService accountFlowRestrictService;
lzxry committed
66 67
    @Autowired
    private PackageBaseRepository packageBaseRepository;
lzxry committed
68
    @Autowired
lzxry committed
69
    private TkioFlowRepository tkioFlowRepository;
70 71
    @Autowired
    private TkioOfflineRepository tkioOfflineRepository;
kangxiaoshan committed
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

    @Override
    public List<Contract> shareIncomeList(User loginAccount, String startDate, String endDate, String platform, String bodyCode, String serchName) {

        List<Contract> contracts = new ArrayList<>();

        if ("all".equals(bodyCode)) {
            bodyCode = null;
        }

        List<String> financeBodies = null;
        if (RoleEnum.FINANCE.getKey().equals(loginAccount.getRole())) {
            Auth auth = authRepository.findByUser(loginAccount.getId());
            financeBodies = JSONArray.fromObject(auth.getAuthExtend());
        }

        if (!StringUtils.isEmpty(bodyCode) && !StringUtils.isEmpty(serchName)) {

            if (financeBodies != null && !financeBodies.contains(bodyCode)) {
                //沒有权限查看
                return contracts;
            } else {
                contracts = contractRepository.findShareContranctByDate1(startDate, endDate, platform, bodyCode, serchName);
            }

        } else if (!StringUtils.isEmpty(bodyCode)) {
            if (financeBodies != null && !financeBodies.contains(bodyCode)) {
                //沒有权限查看
                return contracts;
            } else {
                contracts = contractRepository.findShareContranctByDate2(startDate, endDate, platform, bodyCode);
            }
        } else if (!StringUtils.isEmpty(serchName)) {
            if (financeBodies != null) {
                contracts = contractRepository.findShareContranctByDateSercheFinace(startDate, endDate, platform, serchName, financeBodies);
            } else {
                contracts = contractRepository.findShareContranctByDateSerche(startDate, endDate, platform, serchName);
            }
        } else {
            if (financeBodies != null) {
                contracts = contractRepository.findShareContranctByDateFinace(startDate, endDate, platform, financeBodies);
            } else {
                contracts = contractRepository.findShareContranctByDate3(startDate, endDate, platform);
            }
        }

kangxiaoshan committed
118 119
        /*contracts = new ArrayList<>();
        contracts.add(contractRepository.findOne(4603L));*/
kangxiaoshan committed
120

kangxiaoshan committed
121 122 123 124
        List<ContractBody> bodies = contractBodyRepository.findAll();
        Map<String, String> bodiesNameMap = bodies.stream().collect(
                Collectors.toMap(ContractBody::getCode, ContractBody::getName, (v1, v2) -> v1));

lzxry committed
125 126 127
        List<BarrioCity> barrioCities = barrioCityRepository.findAll();
        Map<Long, BarrioCity> barrioCitiesNameMap = barrioCities.stream().collect(Collectors.toMap(BarrioCity::getId, Function.identity(), (v1, v2) -> v1));

lzxry committed
128 129
        List<PackageBase> packageBases = packageBaseRepository.findByPlatAndStatus(platform, 1);
        Map<Long, PackageBase> packageBaseMap = packageBases.stream().collect(Collectors.toMap(PackageBase::getId, Function.identity(), (v1, v2) -> v1));
lzxry committed
130

kangxiaoshan committed
131 132 133
        DateTime start = new DateTime(startDate);
        DateTime end = new DateTime(endDate);

kangxiaoshan committed
134
        long start_ = System.currentTimeMillis();
135 136 137 138
//        for (Contract contract : contracts) {
//            this.shareIncome4Contract(contract, start, end);
//            contract.setMyBodyName(bodiesNameMap.get(contract.getMyBodyCode()));
//        }
kangxiaoshan committed
139
        try (Stream<Contract> streamContract = contracts.parallelStream()) {
140
            streamContract.forEachOrdered(v -> {
kangxiaoshan committed
141
                v.setMyBodyName(bodiesNameMap.get(v.getMyBodyCode()));
kangxiaoshan committed
142
                if (v.getBarrioId() != null)
lzxry committed
143
                    v.setBarrioName(barrioCitiesNameMap.get(barrioCitiesNameMap.get(v.getBarrioId()).getParentId()).getName());
kangxiaoshan committed
144
                if (v.getPriceLevel() != null)
lzxry committed
145
                    v.setPriceLevelName(packageBaseMap.get(v.getPriceLevel()).getPackageName());
kangxiaoshan committed
146
            });
kangxiaoshan committed
147
        }
kangxiaoshan committed
148 149 150
        if ("tkio".equals(platform)) {
            this.shareIncome4ContractTKIO_2(contracts, start, end);
        } else {
lzxry committed
151 152 153
            try (Stream<Contract> streamContract = contracts.parallelStream()) {
                streamContract.forEachOrdered(v -> {

kangxiaoshan committed
154 155 156 157
                    switch (ContractBranchUtil.getValue(platform)) {
                        case "type_one":
                            this.shareIncome4Contract(v, start, end);
                            break;
lzxry committed
158
                        case "type_two":
kangxiaoshan committed
159
                            if (v.getPriceLevel() == Constant.tkioPriceLevelNotLimit) {
lzxry committed
160 161
                                //TKIO不限量套餐
                                this.shareIncome4Contract(v, start, end);
kangxiaoshan committed
162
                            } else {
lzxry committed
163 164
                                //TKIO普通流量套餐
                                //this.shareIncome4ContractTwo(v, start, end);
kangxiaoshan committed
165
                                this.shareIncome4ContractTKIO(v, start, end, false);
lzxry committed
166 167
                            }
                            break;
kangxiaoshan committed
168 169 170 171 172 173
                        case "type_three":
                            this.shareIncome4ContractCAS(v, start, end);
                            break;
                        default:
                            this.shareIncome4Contract(v, start, end);
                            break;
lzxry committed
174 175 176 177 178
                    }
                });
            }
        }

kangxiaoshan committed
179
        if (ContractBranchUtil.getValue(platform).equals("type_three")) {
lzxry committed
180
            List<Contract> removeContracts = new ArrayList<>();
181
            for (Contract contract : contracts) {
kangxiaoshan committed
182
                if (contract.getIntervalUseDays() < 0) {
lzxry committed
183
                    removeContracts.add(contract);
184 185
                }
            }
kangxiaoshan committed
186
            if (!CollectionUtils.isEmpty(removeContracts)) {
lzxry committed
187 188
                contracts.removeAll(removeContracts);
            }
189 190
        }

lzxry committed
191

kangxiaoshan committed
192
        logger.info("计算分摊收入耗时:{}", (System.currentTimeMillis() - start_));
kangxiaoshan committed
193

194 195 196 197
        //结果集result二次加工
        if ("tkio".equals(platform)) {
            //查询主账号为空的 并且 结束日期在查询范围内的
            List<Long> allEmailIsNullIds = contractRepository.findAllEmailIsNull(startDate, endDate);
kangxiaoshan committed
198 199
            for (Contract contract : contracts) {
                if (StringUtil.isEmpty(contract.getEmail()) || "null".equals(contract.getEmail())) {
200
                    //不在查询范围内的数据,全部置空
kangxiaoshan committed
201
                    if (allEmailIsNullIds == null || !allEmailIsNullIds.contains(BigInteger.valueOf(contract.getId()))) {
202 203 204 205 206 207 208 209 210 211
                        contract.setClickFlow(0D); //区间点击数(万次)
                        contract.setIntervaIncomeShare(0L);//区间分摊收入
                        contract.setAdjustmentFund(0L);//区间调整金额
                        contract.setIncomeShareAll(0L);//区间总收入
                        contract.setIncomeGross(0L);//累计总收入(元)
                    }
                }
            }
        }

kangxiaoshan committed
212 213
        return contracts;
    }
lzxry committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240

    private void shareIncome4ContractCAS(Contract contract, DateTime start, DateTime end) {
        DateTime[] selected = new DateTime[]{
                start,
                end};//用户筛选开始/结束日期
        DateTime[] contractPart = new DateTime[]{
                new DateTime(contract.getStartDate()),
                new DateTime(contract.getEndDate())};//合同开始结束 时间
        DateTime[] contractValidPart = new DateTime[]{
                new DateTime(contract.getValidStartDate()),
                new DateTime(contract.getValidEndDate())};//合同有效日 开始结束 时间
        DateTime[] usePart = new DateTime[]{
                selected[0].compareTo(contractValidPart[0]) <= 0 ? contractValidPart[0] : selected[0],
                selected[1].compareTo(contractValidPart[1]) >= 0 ? contractValidPart[1] : selected[1]
        };

        usePart[0] = usePart[0].compareTo(usePart[1]) >= 0 ? usePart[1] : usePart[0];

        contract.setIntervalUseDays(getDayRange(contractValidPart[0], usePart[1]) + 1);

        BigDecimal bigDecimal = new BigDecimal(contract.getMoney() / 1.13)
                .setScale(8, BigDecimal.ROUND_HALF_UP);


        Long excludTax = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue();//不含税收入*100
        contract.setIncomeExcludingTax(excludTax);

lzxry committed
241
        BigDecimal oneTimeRecognizedRevenue = null;
lzxry committed
242
        BigDecimal dailyRevenueRecognition = null;
kangxiaoshan committed
243
        if (contract.getOneTime() != null && contract.getOneTime() == false) {//处理cas是否计算一次性收入标识
lzxry committed
244
            oneTimeRecognizedRevenue = new BigDecimal("0");
lzxry committed
245
            dailyRevenueRecognition = bigDecimal.multiply(new BigDecimal("100"));
kangxiaoshan committed
246
        } else {
247
            oneTimeRecognizedRevenue = bigDecimal.multiply(new BigDecimal("0.9"));
lzxry committed
248
            dailyRevenueRecognition = bigDecimal.multiply(new BigDecimal("10"));//0.1*100=10,前端拿到区间分摊收入/100得到最终的值
lzxry committed
249
        }
lzxry committed
250
        contract.setOneTimeRecognizedRevenue(oneTimeRecognizedRevenue.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
251
        int contractAllDay = getDayRange(contractValidPart[0], contractValidPart[1]) + 1;//合同总天数
lzxry committed
252 253

        //处理精度
kangxiaoshan committed
254
        BigDecimal dayShareIncome = dailyRevenueRecognition.divide(new BigDecimal(String.valueOf(contractAllDay)), 8, BigDecimal.ROUND_HALF_UP);
lzxry committed
255 256

        //作废合同处理
kangxiaoshan committed
257
        Contract cancleContract = this.cancledShareCAS(contract, oneTimeRecognizedRevenue, contractAllDay, dayShareIncome, contractPart, usePart, selected, contractValidPart);
lzxry committed
258 259 260 261 262
        if (cancleContract != null) {
            return;
        }

        //中止合同处理
kangxiaoshan committed
263
        Contract suspendContract = this.suspendShareCAS(contract, oneTimeRecognizedRevenue, contractAllDay, dayShareIncome, contractPart, usePart, selected, contractValidPart);
lzxry committed
264 265 266 267 268 269 270 271 272 273 274
        if (suspendContract != null) {
            return;
        }


        //晚录合同处理
        DateTime create = new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")); //录入时间点
        DateTime[] creatPoints = new DateTime[]{
                create, //录入日
                create.dayOfMonth().withMinimumValue() //录入月1日
        };
kangxiaoshan committed
275
        this.afterContractCAS(contract, oneTimeRecognizedRevenue, contractAllDay, dayShareIncome, contractPart, usePart, selected, creatPoints, contractValidPart);
lzxry committed
276 277 278 279 280 281 282 283 284 285 286 287

    }

    private void afterContractCAS(Contract contract, BigDecimal oneTimeRecognizedRevenue, int contractAllDay, BigDecimal dayShareIncome, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] creatPoints, DateTime[] contractValidPart) {
        int betweenMonth = Months.monthsBetween(contractPart[0], creatPoints[0]).getMonths();
        //时间范围内用于计算分摊金额的天数
        int daysIncom = getDayRange(usePart[0], usePart[1]) + 1;
        //区间分摊总收入
        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
        /*if(checkTwoTime(contractValidPart[0],usePart[1]) && checkTwoTime(usePart[0],contractValidPart[0])){
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare()+oneTimeRecognizedRevenue.setScale(0,BigDecimal.ROUND_HALF_UP).longValue());
        }*/
kangxiaoshan committed
288
        if (checkTwoTime(contractValidPart[0], usePart[1]) && checkTwoTime(usePart[0], contractValidPart[0])) {
lzxry committed
289
            //contract.setIntervaIncomeShare(contract.getIntervaIncomeShare()+oneTimeRecognizedRevenue.setScale(0,BigDecimal.ROUND_HALF_UP).longValue());
kangxiaoshan committed
290
        } else {
lzxry committed
291 292 293 294 295 296 297 298 299
            contract.setOneTimeRecognizedRevenue(0.0);
        }


        Long adjustmentFund = 0L;//调整金

        boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
        if (ContractStatusEnum.LATE.getKey().equals(contract.getStatus())) {
            isLateContract = true;
lzxry committed
300
        }/* else if (checkLateContract(contractValidPart[0], creatPoints[0])) {
lzxry committed
301
            isLateContract = true;
lzxry committed
302
        }*/
lzxry committed
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336

        if (isLateContract) {
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        }

        boolean isLater = true;
        if (!isLateContract || betweenMonth < 1) {
            //非合同晚录
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
            isLater = false;


        } else if (selected[1].isBefore(creatPoints[1])) {
            //录入月1号之前 调整金为 0 分摊为 0
            contract.setIntervaIncomeShare(0L);
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
            contract.setOneTimeRecognizedRevenue(0.0);
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        } else {
            contract.setStatus(ContractStatusEnum.LATE.getKey());
            //合同晚录
            //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
            DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];
            daysIncom = getDayRange(useStart, usePart[1]) + 1;

            contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
            /*if(checkTwoTime(contractValidPart[0],usePart[1]) && checkTwoTime(useStart,contractValidPart[0])){
                contract.setIntervaIncomeShare(contract.getIntervaIncomeShare()+oneTimeRecognizedRevenue.setScale(0,BigDecimal.ROUND_HALF_UP).longValue());
            }*/

            adjustmentFund = shareMultiply(dayShareIncome, new BigDecimal(getDayRange(contractValidPart[0], creatPoints[1].plusDays(-1)) + 1), 0);

kangxiaoshan committed
337
            adjustmentFund += oneTimeRecognizedRevenue.multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
lzxry committed
338 339 340 341 342 343 344 345 346 347
            if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                //所选时间范围包含 录入月 1 号 显示统计的调整金
                contract.setAdjustmentFund(adjustmentFund);
            } else {
                contract.setAdjustmentFund(0L);
            }
        }

        if (checkTwoTime(selected[0], contractValidPart[1]) && checkTwoTime(contractValidPart[1], selected[1])) {
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractValidPart[0], contractValidPart[1]) + 1), dayShareIncome, 0));
kangxiaoshan committed
348
            contract.setIncomeGross(contract.getIncomeGross() + oneTimeRecognizedRevenue.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
349 350
        } else {
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractValidPart[0], selected[1]) + 1), dayShareIncome, 0));
kangxiaoshan committed
351 352
            if (checkTwoTime(contractValidPart[0], selected[1])) {
                contract.setIncomeGross(contract.getIncomeGross() + oneTimeRecognizedRevenue.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
            }
        }

        if (checkTwoTime(contractValidPart[1], selected[1])) {
            //最后一日分摊金计算处理
            Long lastDay;
            if (isLater) {


                lastDay = contract.getIncomeExcludingTax() - adjustmentFund
                        - shareMultiply(dayShareIncome, new BigDecimal(getDayRange(creatPoints[1], contractValidPart[1])), 0);
            } else {
                lastDay = contract.getIncomeExcludingTax() - adjustmentFund
                        - shareMultiply(dayShareIncome, new BigDecimal(getDayRange(contractValidPart[0], contractValidPart[1])), 0);
            }

            //最后一日 或 包含最后一日 时
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() -
                    dayShareIncome.setScale(0, BigDecimal.ROUND_HALF_UP).longValue() + lastDay);

        }
        Double v = contract.getOneTimeRecognizedRevenue() * 100L;
        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund() + v.longValue());
    }

    private Contract suspendShareCAS(Contract contract, BigDecimal oneTimeRecognizedRevenue, int contractAllDay, BigDecimal dayShareIncome, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] contractValidPart) {
        if (!ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
            return null;
        }

        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.SUSPEND.getValue(),
                contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            return contract;
        }
        // 合同终止日 或 作废日
        DateTime cancelDate = new DateTime(contractChange.getDs());

        //中止操作入库时间
        DateTime suspendDate = new DateTime(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));

        Long adjustmentFund = 0L;
        if (checkTwoTime(suspendDate, cancelDate)) {
            adjustmentFund = 0L;
        } else {
            adjustmentFund = shareMultiply(new BigDecimal((getDayRange(cancelDate, suspendDate) + 1) * -1), dayShareIncome, 0);
kangxiaoshan committed
403 404 405
            if (checkTwoTime(contractValidPart[0], suspendDate) && checkTwoTime(cancelDate, contractValidPart[0])) {
                adjustmentFund += oneTimeRecognizedRevenue.multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
            } else {
lzxry committed
406 407 408 409 410 411 412 413 414 415 416 417 418
                contract.setOneTimeRecognizedRevenue(0.0);
            }
        }

        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;
        int daysIncom = Days.daysBetween(usePart[0], usedEnd).getDays() + 1;
        daysIncom = daysIncom < 0 ? 0 : daysIncom;

        //区间分摊总收入
        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
        /*if(checkTwoTime(contractValidPart[0],usedEnd) && checkTwoTime(usePart[0],contractValidPart[0])){
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare()+oneTimeRecognizedRevenue.setScale(BigDecimal.ROUND_HALF_UP).longValue());
        }*/
kangxiaoshan committed
419 420
        if (checkTwoTime(contractValidPart[0], usedEnd) && checkTwoTime(usePart[0], contractValidPart[0])) {
        } else {
lzxry committed
421 422 423 424 425 426
            contract.setOneTimeRecognizedRevenue(0.0);
        }

        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
            contract.setAdjustmentFund(adjustmentFund);
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractValidPart[0], cancelDate) + 1), dayShareIncome, 0));
kangxiaoshan committed
427 428
            if (checkTwoTime(contractValidPart[0], cancelDate) && checkTwoTime(contractPart[0], contractValidPart[0])) {
                contract.setIncomeGross(contract.getIntervaIncomeShare() + oneTimeRecognizedRevenue.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
429 430 431 432
            }
        } else {
            contract.setAdjustmentFund(0L);
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractValidPart[0], selected[1]) + 1), dayShareIncome, 0));
kangxiaoshan committed
433 434
            if (checkTwoTime(contractValidPart[0], cancelDate) && checkTwoTime(contractPart[0], contractValidPart[0])) {
                contract.setIncomeGross(contract.getIntervaIncomeShare() + oneTimeRecognizedRevenue.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
            }
        }

        Double v = contract.getOneTimeRecognizedRevenue() * 100L;
        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund() + v.longValue());

        return contract;
    }

    private Contract cancledShareCAS(Contract contract, BigDecimal oneTimeRecognizedRevenue, int contractAllDay, BigDecimal dayShareIncome, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] contractValidPart) {
        if (!ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus())) {
            return null;
        }
        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            return contract;
        }

        // 合同终止日 或 作废日
        DateTime cancelDate = new DateTime(contractChange.getDs());
        Long adjustmentFund = shareMultiply(new BigDecimal((getDayRange(contractValidPart[0], cancelDate) + 1) * -1), dayShareIncome, 0);

kangxiaoshan committed
461 462 463
        adjustmentFund -= oneTimeRecognizedRevenue.multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        if (checkTwoTime(contractValidPart[0], selected[1]) && checkTwoTime(selected[0], contractValidPart[0])) {
        } else {
lzxry committed
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
            contract.setOneTimeRecognizedRevenue(0.0);
        }

        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;

        int daysIncom = Days.daysBetween(usePart[0], usedEnd).getDays() + 1;
        daysIncom = daysIncom < 0 ? 0 : daysIncom;

        contract.setIntervalUseDays(getDayRange(contractValidPart[0], usedEnd) + 1);
        //区间分摊总收入

        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));

        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
            contract.setAdjustmentFund(adjustmentFund);
        } else {
            contract.setAdjustmentFund(0L);
        }
        contract.setIncomeGross(0L);
        Double v = contract.getOneTimeRecognizedRevenue() * 100L;
        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund() + v.longValue());
        return contract;
    }

lzxry committed
488 489
    /**
     * 功能描述:增加补充协议的逻辑
kangxiaoshan committed
490
     *
lzxry committed
491 492 493 494 495 496 497 498
     * @author liyin
     * @date 2020/11/5
     */
    private void shareIncome4ContractTKIO_2(List<Contract> contracts, DateTime start, DateTime end) {
        Multimap<String, Contract> multimap = ArrayListMultimap.create();
        //查出所有报表->进行代码分组,按照email分组  计算
        try (Stream<Contract> streamContract = contracts.parallelStream()) {
            streamContract.forEachOrdered(v -> {
kangxiaoshan committed
499 500 501 502
                if (!StringUtil.isEmpty(v.getEmail())) {
                    multimap.put(v.getEmail(), v);
                } else {
                    if (v.getPriceLevel() == Constant.tkioPriceLevelNotLimit) {
lzxry committed
503
                        int contractAllDay = getDayRange(new DateTime(v.getStartDate()), new DateTime(v.getEndDate())) + 1;//合同总天数
kangxiaoshan committed
504 505 506
                        v.setUnitPrice(new BigDecimal(v.getMoney() / 1.06 / contractAllDay).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
                    } else {
                        v.setUnitPrice(new BigDecimal(v.getMoney() / 1.06 / v.getTrackFlow())
lzxry committed
507 508
                                .setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
                    }
lzxry committed
509 510
                    v.setClickFlow(0.0);
                    v.setAdjustmentFund(0L);
kangxiaoshan committed
511 512
                    if (checkTwoTime(new DateTime(v.getEndDate()), end) || checkTwoTime(start, new DateTime(v.getEndDate()))) {
                        v.setIntervaIncomeShare(new BigDecimal(v.getMoney() / 1.06 * 100).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
513
                        v.setIncomeGross(v.getIntervaIncomeShare());
lzxry committed
514
                        v.setIncomeShareAll(v.getIntervaIncomeShare());
lzxry committed
515 516
                    }
                }
lzxry committed
517 518 519 520 521 522 523 524 525 526
            });
        }
        //遍历map,找出主合同,注:补充协议不能与补充协议互相绑定
        Set<String> emails = multimap.keySet();
        for (String email : emails) {
            //开始处理
            Collection<Contract> groupContracts = multimap.get(email);
            HashMap<String, Contract> map = new HashMap<>();
            //处理查询区间内只有补充协议没有主合同的情况
            for (Contract groupContract : groupContracts) {
kangxiaoshan committed
527
                map.put(groupContract.getContractCode(), groupContract);
lzxry committed
528 529
            }
            for (Contract groupContract : groupContracts) {
kangxiaoshan committed
530
                if ("2".equals(groupContract.getContractType())) {
lzxry committed
531
                    Contract contract = map.get(groupContract.getRelationCode());//补充协议查找map内是否有他的主合同(首次/续约)
kangxiaoshan committed
532
                    if (contract == null) {
lzxry committed
533
                        //查出该补充协议之前签订的所有关联的合同(首次/续约-补充协议)
kangxiaoshan committed
534
                        List<Contract> contractList = contractRepository.findByCreateTimeAndCodeNotOwn(groupContract.getRelationCode(), DateUtil.format(groupContract.getCreateTime(), DateUtil.C_TIME_PATTON_DEFAULT), groupContract.getId());
lzxry committed
535
                        for (Contract contract1 : contractList) {
kangxiaoshan committed
536
                            map.put(contract1.getContractCode(), contract1);
lzxry committed
537 538 539 540 541 542 543 544 545 546
                        }
                        groupContracts = map.values();//只要不加入传进来的那个list里面就不会影响查询的列表
                    }
                }
            }


            //再次进行合同的关系分组--->master
            List<ContractVO> contractVOs = new ArrayList<>();
            for (Contract contract : groupContracts) {
kangxiaoshan committed
547
                if (!"2".equals(contract.getContractType())) {
lzxry committed
548 549 550 551 552 553 554 555
                    ContractVO contractVO = new ContractVO();
                    contractVO.setMaster(contract);
                    contractVOs.add(contractVO);
                }
            }
            //再次进行合同的关系分组--->sideLette
            for (ContractVO contractVO : contractVOs) {
                for (Contract contract : groupContracts) {
kangxiaoshan committed
556
                    if ("2".equals(contract.getContractType()) && contractVO.getMaster().getContractCode().equals(contract.getRelationCode())) {
lzxry committed
557
                        List<Contract> sideLette = contractVO.getSideLette();
kangxiaoshan committed
558
                        if (sideLette == null) {
lzxry committed
559 560 561 562 563 564 565 566 567 568
                            sideLette = new ArrayList<>();
                        }
                        sideLette.add(contract);
                        contractVO.setSideLette(sideLette);
                    }
                }
            }
            //1个合同<----->多个合同
            //1个合同->走普通的,走tkio逻辑
            for (ContractVO contractVO : contractVOs) {
kangxiaoshan committed
569
                if (CollectionUtils.isEmpty(contractVO.getSideLette())) {//1个合同
lzxry committed
570
                    Contract master = contractVO.getMaster();
kangxiaoshan committed
571 572 573 574
                    if (master.getPriceLevel() == Constant.tkioPriceLevelNotLimit) {//无限流量走adi计算逻辑
                        shareIncome4Contract(master, start, end);
                    } else {//普通流量走tkio计算逻辑
                        shareIncome4ContractTKIO(master, start, end, false);
lzxry committed
575
                    }
kangxiaoshan committed
576
                } else {//该首次签约/续约合同 绑定了补充协议合同
lzxry committed
577
                    List<Contract> sideLette = contractVO.getSideLette();
lzxry committed
578
                    /*Boolean isNotLimit = false;
lzxry committed
579 580 581 582
                    for (Contract contract : sideLette) {
                        if(contract.getPriceLevel()==Constant.tkioPriceLevelNotLimit){
                            isNotLimit = true;
                        }
lzxry committed
583
                    }*/
lzxry committed
584 585 586 587
                    //补充协议按照录入时间排序->从后到前,从大到小反推计算合同
                    sideLette.add(contractVO.getMaster());
                    Contract[] contractsArray = orderByCreateTime(sideLette);

kangxiaoshan committed
588
                    for (int j = 0; j < contractsArray.length; j++) { //计算除了最后一个的每个合同历史所用流量
lzxry committed
589 590 591 592

                        boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
                        if (ContractStatusEnum.LATE.getKey().equals(contractsArray[j].getStatus())) {
                            isLateContract = true;
kangxiaoshan committed
593
                        } else if (checkLateContract(new DateTime(contractsArray[j].getSignedDate() == null ? contractsArray[j].getStartDate() : contractsArray[j].getSignedDate()), new DateTime(new DateTime(contractsArray[j].getCreateTime()).toString("yyyy-MM-dd")))) {
lzxry committed
594 595 596 597 598
                            isLateContract = true;
                            contractsArray[j].setStatus(ContractStatusEnum.LATE.getKey());
                        }

                        String startDate = null;
kangxiaoshan committed
599
                        if (isLateContract && j > 0) {//补充协议晚录
lzxry committed
600
                            startDate = new DateTime(contractsArray[j].getCreateTime()).dayOfMonth().withMinimumValue().toString("yyyy-MM-dd");
kangxiaoshan committed
601 602
                        } else {
                            startDate = contractsArray[j].getSignedDate() == null ? contractsArray[j].getStartDate() : contractsArray[j].getSignedDate();
lzxry committed
603 604 605 606 607 608
                        }
                        String endDate = contractsArray[j].getNextSignedDate() == null ? contractsArray[j].getEndDate() : contractsArray[j].getNextSignedDate();
                        ArrayList<String> codes = new ArrayList<>();
                        for (int k = 0; k <= j; k++) {
                            codes.add(contractsArray[k].getContractCode());
                        }
kangxiaoshan committed
609
                        BigDecimal flow = tkioFlowRepository.sumFlowByDsAndContractCodes(startDate, endDate, codes);
lzxry committed
610 611
                        double i1 = flow == null ? 0 : flow.divide(new BigDecimal(10000.0)).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();

kangxiaoshan committed
612
                        if (j > 0) {//上一份合同超出的流量算在当前合同上(肯定在签订日之前)合同的开始日(补充协议的开始日就是原合同的开始日,结束日为上一个合同的下一个签订日)
lzxry committed
613 614
                            BigDecimal bigDecimal = tkioFlowRepository.sumFlowByContractCodeAndDs(contractsArray[j].getContractCode(), contractsArray[j].getStartDate(), contractsArray[j - 1].getNextSignedDate());
                            double i = bigDecimal == null ? 0 : bigDecimal.divide(new BigDecimal(10000.0)).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
kangxiaoshan committed
615
                            i1 += i;
lzxry committed
616 617 618 619 620 621
                        }
                        contractsArray[j].setHistoryTkioFlow(i1);
                    }

                    //补充协议核心逻辑
                    //能运行到这里说明只有补充协议才会出现无限流量(最后一个),如果是主合同无限流量,就不可能有补充协议
kangxiaoshan committed
622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
                    for (int i = 0; i < contractsArray.length; i++) {
                        if (i > 0) {
                            Contract contract = contractsArray[i];
                            if (contracts.contains(contract)) {
                                //计算当前单价

                                double totalFlow = 0;
                                double totalprice = 0.0;
                                double accruingFlow = 0;
                                double accruingAmounts = 0.0;

                                for (int j = 0; j < i; j++) {
                                    totalFlow += contractsArray[j].getTrackFlow();

                                    totalprice += new BigDecimal(contractsArray[j].getMoney() / 1.06).setScale(16, BigDecimal.ROUND_HALF_UP).doubleValue();
                                    double currentFlow = totalFlow - accruingFlow;
                                    double currentMoney = totalprice - accruingAmounts;

                                    contractsArray[j].setUnitPriceAccurate(new BigDecimal(currentMoney / currentFlow)
                                            .setScale(16, BigDecimal.ROUND_HALF_UP));//存储16位单价

                                    accruingAmounts += new BigDecimal(currentMoney / currentFlow * contractsArray[j].getHistoryTkioFlow())
                                            .setScale(16, BigDecimal.ROUND_HALF_UP).doubleValue();//当前合同之前的累计消耗金额
                                    accruingFlow += contractsArray[j].getHistoryTkioFlow();//当前合同之前的累计消耗流量,万单位
                                }
                                totalFlow = totalFlow - accruingFlow < 0 ? 0 : totalFlow - accruingFlow;
                                totalFlow = totalFlow + contract.getTrackFlow();
                                totalprice = totalprice - accruingAmounts < 0 ? 0 : totalprice - accruingAmounts;
                                totalprice = totalprice + new BigDecimal(contract.getMoney() / 1.06).setScale(16, BigDecimal.ROUND_HALF_UP).doubleValue();

                                contract.setIncomeExcludingTax(new BigDecimal(totalprice)
                                        .setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue());
                                BigDecimal unitPriceAccurate = null;
                                if (!contract.getPriceLevel().equals(Constant.tkioPriceLevelNotLimit)) {
                                    unitPriceAccurate = new BigDecimal(totalprice / totalFlow)
                                            .setScale(16, BigDecimal.ROUND_HALF_UP);//当前合同的单价
                                    //四舍五入单价
                                    double unitPrice = unitPriceAccurate.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                                    contract.setUnitPrice(unitPrice);
                                }
                                boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
                                if (ContractStatusEnum.LATE.getKey().equals(contract.getStatus())) {
                                    isLateContract = true;
                                } else if (checkLateContract(new DateTime(contract.getSignedDate() == null ? contract.getStartDate() : contract.getSignedDate()), new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")))) {
                                    isLateContract = true;
                                    contract.setStatus(ContractStatusEnum.LATE.getKey());
                                }
lzxry committed
669

kangxiaoshan committed
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
                                //正常查流量
                                DateTime[] selected = {start, end};//用户筛选日期区间
                                DateTime[] contractPart = new DateTime[]{
                                        new DateTime(contract.getSignedDate()),
                                        new DateTime(contract.getNextSignedDate() == null ? contract.getEndDate() : contract.getNextSignedDate())};//合同开始结束(下一份合同签订日前一天) 时间
                                DateTime[] usePart = new DateTime[]{
                                        selected[0].compareTo(contractPart[0]) <= 0 ? contractPart[0] : selected[0],
                                        selected[1].compareTo(contractPart[1]) >= 0 ? contractPart[1] : selected[1]
                                };
                                usePart[0] = usePart[0].compareTo(usePart[1]) >= 0 ? usePart[1] : usePart[0];

                                DateTime create = new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")); //录入时间点
                                DateTime[] creatPoints = new DateTime[]{
                                        create, //录入日
                                        create.dayOfMonth().withMinimumValue() //录入月1日
                                };
                                if (selected[1].isBefore(contractPart[0])) {
                                    contract.setUnitPrice(0.0);
                                    contract.setIntervaIncomeShare(0L);
                                    contract.setAdjustmentFund(0L);
                                    contract.setIncomeShareAll(contract.getIntervaIncomeShare());
                                    contract.setClickFlow(0.0);
                                    contract.setIncomeGross(0L);
                                    contracts.remove(contract);//移出列表
                                } else if (!contract.getPriceLevel().equals(Constant.tkioPriceLevelNotLimit)) {
                                    boolean isLater = true;
                                    if (!isLateContract) {//正常合同
                                        //补充协议的开始时间和结束时间是与主合同时间一致的,所以需要按照补充协议的字段再次判断补充协议是否在区间选择内
                                        if (selected[0].compareTo(contractPart[1]) > 0 || selected[1].compareTo(contractPart[0]) < 0) {
lzxry committed
699 700 701 702 703
                                            contract.setIntervaIncomeShare(0L);
                                            contract.setAdjustmentFund(0L);
                                            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
                                            contract.setClickFlow(0.0);
                                            contract.setIncomeGross(0L);
kangxiaoshan committed
704
                                        } else {
lzxry committed
705 706 707 708
                                            ArrayList<String> codes = new ArrayList<>();
                                            for (int k = 0; k <= i; k++) {
                                                codes.add(contractsArray[k].getContractCode());
                                            }
kangxiaoshan committed
709 710 711
                                            contract.setClickFlow(0.0);
                                            BigDecimal clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(usePart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), codes);
                                            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
712
                                            BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
713
                                            if (clickFlow != 0) {
lzxry committed
714 715
                                                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                                                //区间点击数
kangxiaoshan committed
716
                                                contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
717 718 719
                                            }
                                            //区间分摊收入
                                            contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
kangxiaoshan committed
720 721 722 723 724 725 726 727 728
                                            //调整金,正常情况下可能存在之前合同超出的流量所产生的调整金(记录在签订日)
                                            BigDecimal beforSigndFlow = null;
                                            if (checkTwoTime(selected[0], contractPart[0]) && checkTwoTime(contractPart[1], selected[0])) {
                                                DateTime startDate = new DateTime(contract.getStartDate());
                                                DateTime endDate = contractPart[0].plusDays(-1);//签约日前一天
                                                beforSigndFlow = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd"));
                                                beforSigndFlow = beforSigndFlow == null ? new BigDecimal(0) : beforSigndFlow;
                                                BigDecimal beforSigndAdjustmentFund = beforSigndFlow.divide(new BigDecimal(10000.0 / 100)).multiply(unitPriceAccurate);
                                                contract.setAdjustmentFund(beforSigndAdjustmentFund.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
729 730 731 732
                                            } else {
                                                contract.setAdjustmentFund(0L);
                                            }

kangxiaoshan committed
733 734 735
                                            contract.setIncomeShareAll(contract.getIntervaIncomeShare());

                                            //todo 累计总收入,还得算上签订日之前的流量
lzxry committed
736
                                            clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(contractPart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), codes);
lzxry committed
737
                                            clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
738 739 740 741 742
                                            if (beforSigndFlow != null) {
                                                clickFlow += beforSigndFlow.intValue();
                                            }
                                            contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
                                        }
kangxiaoshan committed
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
                                        isLater = false;
                                    } else if (selected[1].isBefore(creatPoints[1])) {
                                        //录入月1号之前 所有调整金为 0 分摊为 0
                                        contract.setIntervaIncomeShare(0L);
                                        contract.setAdjustmentFund(0L);
                                        contract.setIncomeShareAll(contract.getIntervaIncomeShare());
                                        contract.setClickFlow(0.0);
                                        contract.setIncomeGross(0L);
                                        contract.setStatus(ContractStatusEnum.LATE.getKey());
                                    } else {
                                        contract.setStatus(ContractStatusEnum.LATE.getKey());
                                        //合同晚录
                                        //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
                                        DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];
                                        ArrayList<String> codes = new ArrayList<>();
                                        for (int k = 0; k <= i; k++) {
                                            codes.add(contractsArray[k].getContractCode());
                                        }
                                        BigDecimal clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(useStart.toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), codes);
                                        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                        BigDecimal clickTenThousand = new BigDecimal(0);

                                        if (clickFlow != 0) {
                                            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                                            //区间点击数
                                            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
                                        }
                                        BigDecimal beforSigndFlow = null;
                                        //区间分摊收入
                                        contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
                                        if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                                            //所选时间范围包含 录入月 1 号 显示统计的调整金
                                            //合同开始日期,合同录入日期的一号,-1就是上个月最后一天
                                            //contractPart[0], creatPoints[1].plusDays(-1)
                                            //晚录调整金
                                            clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(contractPart[0].toString("yyyy-MM-dd"), creatPoints[1].plusDays(-1).toString("yyyy-MM-dd"), codes);
                                            clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                            clickTenThousand = new BigDecimal(0);
                                            if (clickFlow != 0) {
                                                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
783
                                            }
kangxiaoshan committed
784 785 786 787 788 789 790 791 792
                                            contract.setAdjustmentFund(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
                                            //超出流量调整金
                                            if (checkTwoTime(selected[0], contractPart[0]) && checkTwoTime(contractPart[1], selected[0])) {
                                                DateTime startDate = new DateTime(contract.getStartDate());
                                                DateTime endDate = creatPoints[1].plusDays(-1);//签约录入日前一天
                                                beforSigndFlow = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd"));
                                                beforSigndFlow = beforSigndFlow == null ? new BigDecimal(0) : beforSigndFlow;
                                                BigDecimal beforSigndAdjustmentFund = beforSigndFlow.divide(new BigDecimal(10000.0 / 100)).multiply(unitPriceAccurate);
                                                contract.setAdjustmentFund(contract.getAdjustmentFund() + beforSigndAdjustmentFund.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
793
                                            }
kangxiaoshan committed
794 795 796
                                            //处理上一个合同的调整金
                                            if (i > 0) {
                                                contractsArray[i - 1].setAdjustmentFund(contractsArray[i - 1].getAdjustmentFund() - contractsArray[i - 1].getUnitPriceAccurate().multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
797 798
                                            }

kangxiaoshan committed
799 800
                                        } else {
                                            contract.setAdjustmentFund(0L);
lzxry committed
801 802
                                        }

kangxiaoshan committed
803 804 805 806 807 808 809 810
                                        //累计总收入
                                        clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(contractPart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), codes);
                                        clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                        if (beforSigndFlow != null) {
                                            clickFlow += beforSigndFlow.intValue();
                                        }
                                        contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
                                    }
lzxry committed
811

kangxiaoshan committed
812 813 814 815 816 817 818 819 820 821 822
                                    //判断合同真实结束日期之前判断该合同有没有下一份合同
                                    if (contract.getNextSignedContractCode() == null && checkTwoTime(contractPart[1], selected[1])) {
                                        //最后一日分摊收入计算处理(合同的最后一天,不管流量剩余多少,都算作做最后一天的收入)
                                        Long lastDay;
                                        DateTime lastDate[];
                                        if (isLater) {
                                            lastDate = new DateTime[]{creatPoints[1], contractPart[1].plusDays(-1)};
                                        } else {
                                            lastDate = new DateTime[]{contractPart[0], contractPart[1].plusDays(-1)};
                                        }
                                        //合同除去最后一天的流量
lzxry committed
823 824 825 826
                                        ArrayList<String> codes = new ArrayList<>();
                                        for (int k = 0; k <= i; k++) {
                                            codes.add(contractsArray[k].getContractCode());
                                        }
kangxiaoshan committed
827 828 829 830 831
                                        BigDecimal clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(lastDate[0].toString("yyyy-MM-dd"), lastDate[1].toString("yyyy-MM-dd"), codes);
                                        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                        BigDecimal clickTenThousand = new BigDecimal(0);
                                        if (clickFlow != 0) {
                                            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
832
                                        }
kangxiaoshan committed
833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
                                        long beforeTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();

                                        //最后一天的流量
                                        clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(contractPart[1].toString("yyyy-MM-dd"), contractPart[1].toString("yyyy-MM-dd"), codes);
                                        clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                        clickTenThousand = new BigDecimal(0);
                                        if (clickFlow != 0)
                                            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                                        long lastDayTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
                                        //合同的税后总金额减去最后合同一日之前的钱和调整金
                                        long excludTax = new BigDecimal(totalprice)
                                                .setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue();
                                        //TODO 超出的流量算在了调整金了这里好像减去了
                                        lastDay = excludTax - contract.getAdjustmentFund() - beforeTheMoney;
                                        //最后一日 或 包含最后一日 时
                                        contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() - lastDayTheMoney + lastDay);
                                        contract.setIncomeGross(contract.getIncomeGross() - lastDayTheMoney + lastDay);
                                    }
lzxry committed
851

kangxiaoshan committed
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
                                    contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());
                                } else {//不限量套餐
                                    int contractAllDay = getDayRange(contractPart[0], contractPart[1]) + 1;//合同总天数
                                    BigDecimal dayShareIncome = new BigDecimal(totalprice / contractAllDay)
                                            .setScale(16, BigDecimal.ROUND_HALF_UP);

                                    contract.setUnitPrice(dayShareIncome.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());//设置不限量套餐的单价
                                    int betweenMonth = Months.monthsBetween(contractPart[0], creatPoints[0]).getMonths();
                                    //时间范围内用于计算分摊金额的天数
                                    int daysIncom = getDayRange(usePart[0], usePart[1]) + 1;
                                    //区间分摊总收入
                                    contract.setIntervaIncomeShare(shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(daysIncom), 0));

                                    //无限流量套餐合同的区间点击数
                                    ArrayList<String> codes = new ArrayList<>();
                                    for (int k = 0; k <= i; k++) {
                                        codes.add(contractsArray[k].getContractCode());
                                    }
                                    BigDecimal clickNumLimit = tkioFlowRepository.sumFlowByDsAndContractCodes(usePart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), codes);
                                    long clickFlowLimit = clickNumLimit == null ? 0L : clickNumLimit.longValue();
                                    if (clickFlowLimit != 0) {
                                        contract.setClickFlow(new BigDecimal(clickFlowLimit / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
                                    } else {
                                        contract.setClickFlow(0.0);
                                    }
lzxry committed
877

kangxiaoshan committed
878
                                    Long adjustmentFund = 0L;//调整金
lzxry committed
879

kangxiaoshan committed
880 881 882
                                    if (isLateContract) {
                                        contract.setStatus(ContractStatusEnum.LATE.getKey());
                                    }
lzxry committed
883

kangxiaoshan committed
884 885 886 887 888 889
                                    boolean isLater = true;
                                    if (!isLateContract || betweenMonth < 1) {
                                        //非合同晚录
                                        contract.setAdjustmentFund(0L);
                                        contract.setIncomeShareAll(contract.getIntervaIncomeShare());
                                        isLater = false;
lzxry committed
890

kangxiaoshan committed
891 892 893 894 895 896 897 898 899 900 901 902
                                    } else if (selected[1].isBefore(creatPoints[1])) {
                                        //录入月1号之前 调整金为 0 分摊为 0
                                        contract.setIntervaIncomeShare(0L);
                                        contract.setAdjustmentFund(0L);
                                        contract.setIncomeShareAll(contract.getIntervaIncomeShare());
                                        contract.setStatus(ContractStatusEnum.LATE.getKey());
                                    } else {
                                        contract.setStatus(ContractStatusEnum.LATE.getKey());
                                        //合同晚录
                                        //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
                                        DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];
                                        daysIncom = getDayRange(useStart, usePart[1]) + 1;
lzxry committed
903

kangxiaoshan committed
904 905
                                        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(daysIncom), 0));
                                        adjustmentFund = shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(getDayRange(contractPart[0], creatPoints[1].plusDays(-1)) + 1), 0);
lzxry committed
906

kangxiaoshan committed
907 908 909
                                        if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                                            //所选时间范围包含 录入月 1 号 显示统计的调整金
                                            contract.setAdjustmentFund(adjustmentFund);
lzxry committed
910
                                        } else {
kangxiaoshan committed
911
                                            contract.setAdjustmentFund(0L);
lzxry committed
912 913 914
                                        }


kangxiaoshan committed
915 916 917 918 919 920 921 922 923
                                        //处理上一份合同
                                        BigDecimal clickNum = tkioFlowRepository.sumFlowByDsAndContractCodes(contractPart[0].toString("yyyy-MM-dd"), creatPoints[1].plusDays(-1).toString("yyyy-MM-dd"), codes);
                                        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
                                        BigDecimal clickTenThousand = new BigDecimal(0);
                                        if (clickFlow != 0) {
                                            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                                        }
                                        if (i > 0) {
                                            contractsArray[i - 1].setAdjustmentFund(contractsArray[i - 1].getAdjustmentFund() - contractsArray[i - 1].getUnitPriceAccurate().multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
924
                                        }
kangxiaoshan committed
925
                                    }
lzxry committed
926

kangxiaoshan committed
927 928 929 930 931
                                    if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
                                        contract.setIncomeGross(shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(getDayRange(contractPart[0], contractPart[1]) + 1), 0));
                                    } else {
                                        contract.setIncomeGross(shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(getDayRange(contractPart[0], selected[1]) + 1), 0));
                                    }
lzxry committed
932

kangxiaoshan committed
933 934 935 936 937 938 939 940 941 942 943 944 945 946
                                    if (checkTwoTime(contractPart[1], selected[1])) {
                                        //最后一日分摊金计算处理
                                        Long lastDay;
                                        if (isLater) {
                                            lastDay = contract.getIncomeExcludingTax() - adjustmentFund
                                                    - shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(getDayRange(creatPoints[1], contractPart[1])), 0);
                                        } else {
                                            lastDay = contract.getIncomeExcludingTax() - adjustmentFund
                                                    - shareMultiply(dayShareIncome.multiply(new BigDecimal(100L)), new BigDecimal(getDayRange(contractPart[0], contractPart[1])), 0);
                                        }
                                        //最后一日 或 包含最后一日 时
                                        contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() -
                                                dayShareIncome.multiply(new BigDecimal(100L)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue() + lastDay);
                                        contract.setIncomeGross(contract.getIncomeGross() - dayShareIncome.multiply(new BigDecimal(100L)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue() + lastDay);
lzxry committed
947 948

                                    }
kangxiaoshan committed
949 950 951 952

                                    contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());


lzxry committed
953 954
                                }
                            }
kangxiaoshan committed
955 956 957 958 959 960 961 962
                        } else {
                            Contract contractMaster = contractsArray[i];
                            if (contracts.contains(contractMaster)) {
                                String endDate = contractMaster.getEndDate();
                                contractMaster.setEndDate(contractMaster.getNextSignedDate());
                                shareIncome4ContractTKIO(contractMaster, start, end, true);//到结束的前一天
                                contractMaster.setEndDate(endDate);
                            }
lzxry committed
963
                        }
kangxiaoshan committed
964
                    }
lzxry committed
965 966 967 968 969
                }
            }

        }
    }
lzxry committed
970 971


kangxiaoshan committed
972
    public Contract[] orderByCreateTime(List<Contract> contracts) {//从小到大排序
lzxry committed
973 974
        Contract[] contractsArray = new Contract[contracts.size()];
        contractsArray = contracts.toArray(contractsArray);
kangxiaoshan committed
975 976 977
        for (int i = 0; i < contractsArray.length - 1; i++) {
            for (int j = 0; j < contractsArray.length - 1 - i; j++) {
                if (contractsArray[j].getCreateTime().getTime() > contractsArray[j + 1].getCreateTime().getTime()) {
lzxry committed
978
                    Contract temp = contractsArray[j];
kangxiaoshan committed
979
                    contractsArray[j] = contractsArray[j + 1];
lzxry committed
980
                    contractsArray[j + 1] = temp;
kangxiaoshan committed
981
                } else if (contractsArray[j].getCreateTime().getTime() == contractsArray[j + 1].getCreateTime().getTime()) {
lzxry committed
982
                    String contractCode = StringUtil.matchNumber(contractsArray[j].getContractCode());
kangxiaoshan committed
983 984
                    String contractCodeMin = StringUtil.matchNumber(contractsArray[j + 1].getContractCode());
                    if (Long.valueOf(contractCode) > Long.valueOf(contractCodeMin)) {
lzxry committed
985
                        Contract temp = contractsArray[j];
kangxiaoshan committed
986
                        contractsArray[j] = contractsArray[j + 1];
lzxry committed
987 988
                        contractsArray[j + 1] = temp;
                    }
lzxry committed
989 990 991 992 993
                }
            }
        }
        return contractsArray;
    }
kangxiaoshan committed
994 995

    private void shareIncome4ContractTKIO(Contract contract, DateTime start, DateTime end, Boolean isMore) {
lzxry committed
996 997 998
        DateTime[] selected = new DateTime[]{
                start,
                end};//用户筛选开始/结束日期
kangxiaoshan committed
999 1000 1001
        DateTime[] contractPart = new DateTime[]{
                new DateTime(contract.getStartDate()),
                new DateTime(contract.getEndDate())};//合同开始结束 时间
lzxry committed
1002 1003 1004 1005
        DateTime[] usePart = new DateTime[]{
                selected[0].compareTo(contractPart[0]) <= 0 ? contractPart[0] : selected[0],
                selected[1].compareTo(contractPart[1]) >= 0 ? contractPart[1] : selected[1]
        };
lzxry committed
1006

lzxry committed
1007 1008 1009 1010 1011
        usePart[0] = usePart[0].compareTo(usePart[1]) >= 0 ? usePart[1] : usePart[0];

        Long excludTax = new BigDecimal(contract.getMoney() / 1.06)
                .setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue();//不含税收入*100
        contract.setIncomeExcludingTax(excludTax);
lzxry committed
1012
        BigDecimal unitPriceAccurate = null;
lzxry committed
1013
        //计算单价,精准保留16位数
lzxry committed
1014
        try {
kangxiaoshan committed
1015
            unitPriceAccurate = new BigDecimal(contract.getMoney() / 1.06 / contract.getTrackFlow())
lzxry committed
1016
                    .setScale(16, BigDecimal.ROUND_HALF_UP);
kangxiaoshan committed
1017
        } catch (Exception e) {
lzxry committed
1018 1019
            e.printStackTrace();
        }
lzxry committed
1020 1021 1022 1023 1024 1025 1026 1027 1028
        //四舍五入单价
        double unitPrice = unitPriceAccurate.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        //不限量套餐会在方法里面重新赋值单价
        contract.setUnitPrice(unitPrice);
        //作废合同  累计收入= 0
        //中止合同  累计收入= 如果中止日期在选择日期之内,【合同开始日期-中止日期】,否则【合同开始日期-选择结束日期】,不需要考虑调整金
        //晚录合同  累计收入= 同下
        //正常合同  累计收入= 如果合同结束日期在选择日期之内,则直接取 [合同金额/1.06]得到总金额 ,否则 【合同开始日期-选择结束日期】
        //作废合同处理
kangxiaoshan committed
1029
        Contract cancleContract = this.cancledShareFlow(contract, unitPriceAccurate, usePart, selected);
lzxry committed
1030 1031 1032 1033
        if (cancleContract != null) {
            return;
        }
        //中止合同处理
kangxiaoshan committed
1034
        Contract suspendContract = this.suspendShareFlow(contract, unitPriceAccurate, contractPart, usePart, selected);
lzxry committed
1035 1036 1037
        if (suspendContract != null) {
            return;
        }
lzxry committed
1038 1039

        //补充协议的主合同特殊处理
kangxiaoshan committed
1040
        if (isMore && new DateTime(contract.getNextSignedDate()).isBefore(selected[0])) {
lzxry committed
1041 1042 1043 1044 1045 1046 1047 1048
            contract.setIntervaIncomeShare(0L);
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
            contract.setClickFlow(0.0);
            contract.setIncomeGross(0L);
            return;
        }

lzxry committed
1049 1050 1051 1052 1053 1054
        //晚录合同处理//正常合同处理
        DateTime create = new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")); //录入时间点
        DateTime[] creatPoints = new DateTime[]{
                create, //录入日
                create.dayOfMonth().withMinimumValue() //录入月1日
        };
kangxiaoshan committed
1055
        this.afterContractFlow(contract, unitPriceAccurate, contractPart, usePart, selected, creatPoints, isMore);
lzxry committed
1056 1057
    }

lzxry committed
1058
    private void afterContractFlow(Contract contract, BigDecimal unitPriceAccurate, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] creatPoints, Boolean isMore) {
lzxry committed
1059 1060 1061 1062 1063
        Long adjustmentFund = 0L;//调整金
        contract.setClickFlow(0.0);
        boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
        if (ContractStatusEnum.LATE.getKey().equals(contract.getStatus())) {
            isLateContract = true;
lzxry committed
1064
        }/* else if (checkLateContract(contractPart[0], creatPoints[0])) {
lzxry committed
1065 1066
            isLateContract = true;
            contract.setStatus(ContractStatusEnum.LATE.getKey());
lzxry committed
1067
        }*/
lzxry committed
1068 1069 1070 1071

        boolean isLater = true;
        if (!isLateContract) {
            //非合同晚录
kangxiaoshan committed
1072 1073
            BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), usePart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"));
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1074 1075
            BigDecimal clickTenThousand = new BigDecimal(0);

kangxiaoshan committed
1076
            if (clickFlow != 0) {
lzxry committed
1077 1078
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                //区间点击数
kangxiaoshan committed
1079
                contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1080 1081 1082 1083 1084 1085 1086
            }
            //区间分摊收入
            contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());

            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());

kangxiaoshan committed
1087
            if (!isMore && checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1088
                contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1089
            } else {
lzxry committed
1090
                //累计总收入
kangxiaoshan committed
1091 1092
                clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contractPart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"));
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1093 1094 1095 1096 1097 1098 1099 1100
                contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
            }
            isLater = false;
        } else if (selected[1].isBefore(creatPoints[1])) {
            //录入月1号之前 调整金为 0 分摊为 0
            contract.setIntervaIncomeShare(0L);
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
kangxiaoshan committed
1101 1102 1103
            BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), usePart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"));
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1104 1105 1106 1107 1108 1109 1110 1111
            contract.setIncomeGross(0L);
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        } else {
            contract.setStatus(ContractStatusEnum.LATE.getKey());
            //合同晚录
            //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
            DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];

kangxiaoshan committed
1112 1113
            BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), useStart.toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"));
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1114 1115
            BigDecimal clickTenThousand = new BigDecimal(0);

kangxiaoshan committed
1116
            if (clickFlow != 0) {
lzxry committed
1117 1118
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                //区间点击数
kangxiaoshan committed
1119 1120 1121
                BigDecimal clickNumReal = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), selected[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"));
                int clickNumRealFlow = clickNumReal == null ? 0 : clickNumReal.intValue();
                contract.setClickFlow(new BigDecimal(clickNumRealFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1122 1123 1124 1125 1126 1127 1128 1129 1130
            }
            //区间分摊收入
            contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());


            if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                //所选时间范围包含 录入月 1 号 显示统计的调整金
                //合同开始日期,合同录入日期的一号,-1就是上个月最后一天
                //contractPart[0], creatPoints[1].plusDays(-1)
kangxiaoshan committed
1131 1132
                clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contractPart[0].toString("yyyy-MM-dd"), creatPoints[1].plusDays(-1).toString("yyyy-MM-dd"));
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1133
                clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1134
                if (clickFlow != 0) {
lzxry committed
1135 1136 1137 1138 1139 1140 1141 1142
                    clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                    //区间点击数
                }
                contract.setAdjustmentFund(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
            } else {
                contract.setAdjustmentFund(0L);
            }

kangxiaoshan committed
1143
            if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1144
                contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1145
            } else {
lzxry committed
1146
                //累计总收入
kangxiaoshan committed
1147 1148
                clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contractPart[0].toString("yyyy-MM-dd"), selected[1].plusDays(-1).toString("yyyy-MM-dd"));
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1149 1150 1151 1152
                contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
            }
        }

kangxiaoshan committed
1153
        if (!isMore && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1154 1155 1156 1157
            //最后一日分摊收入计算处理(合同的最后一天,不管流量剩余多少,都算作做最后一天的收入)
            Long lastDay;
            DateTime lastDate[];
            if (isLater) {
kangxiaoshan committed
1158
                lastDate = new DateTime[]{creatPoints[1], contractPart[1].plusDays(-1)};
lzxry committed
1159
            } else {
kangxiaoshan committed
1160
                lastDate = new DateTime[]{contractPart[0], contractPart[1].plusDays(-1)};
lzxry committed
1161 1162
            }
            //合同除去最后一天的流量
kangxiaoshan committed
1163 1164
            BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), lastDate[0].toString("yyyy-MM-dd"), lastDate[1].toString("yyyy-MM-dd"));
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1165
            BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1166
            if (clickFlow != 0) {
lzxry committed
1167 1168 1169 1170 1171
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
            }
            long beforeTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();

            //最后一天的流量
kangxiaoshan committed
1172 1173
            clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contractPart[1].toString("yyyy-MM-dd"), contractPart[1].toString("yyyy-MM-dd"));
            clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1174
            clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1175
            if (clickFlow != 0) clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
            long lastDayTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
            //合同的税后总金额减去最后合同一日之前的钱和调整金
            lastDay = contract.getIncomeExcludingTax() - contract.getAdjustmentFund() - beforeTheMoney;
            //最后一日 或 包含最后一日 时
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() - lastDayTheMoney + lastDay);
        }

        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());
    }

    private Contract suspendShareFlow(Contract contract, BigDecimal unitPriceAccurate, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected) {
        if (!ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
            return null;
        }
        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.SUSPEND.getValue(),
                contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            contract.setClickFlow(0.0);
            return contract;
        }
        // 合同中止日
        DateTime cancelDate = new DateTime(contractChange.getDs());

        //中止操作入库时间
        DateTime suspendDate = new DateTime(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));
        contract.setClickFlow(0.0);
        //调整金
        Long adjustmentFund = 0L;
        if (checkTwoTime(suspendDate, cancelDate)) {
            adjustmentFund = 0L;
        } else {
            //查询调整金的点击,日期开始结束时间注意不能颠倒

kangxiaoshan committed
1213 1214
            BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), cancelDate.toString("yyyy-MM-dd"), suspendDate.toString("yyyy-MM-dd"));
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1215 1216

            BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1217
            if (clickFlow != 0) {
lzxry committed
1218 1219 1220 1221 1222 1223 1224 1225
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
            }
            adjustmentFund = unitPriceAccurate.multiply(clickTenThousand.multiply(new BigDecimal(-1))).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        }
        //调整金
        contract.setAdjustmentFund(adjustmentFund);
        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;
        //查询开始->中止日期的点击(有收入的点击),不包括调整金
kangxiaoshan committed
1226 1227
        BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), usePart[0].toString("yyyy-MM-dd"), usedEnd.toString("yyyy-MM-dd"));
        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1228
        BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1229
        if (clickFlow != 0) {
lzxry committed
1230 1231
            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
            //区间点击数
kangxiaoshan committed
1232
            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1233 1234 1235 1236
        }
        //区间分摊收入,乘以100,前端除以100
        long share = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        contract.setIntervaIncomeShare(share);
kangxiaoshan committed
1237
        contract.setIncomeShareAll(share + adjustmentFund);
lzxry committed
1238

kangxiaoshan committed
1239
        if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1240
            contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1241
        } else {
lzxry committed
1242
            //累计总收入
kangxiaoshan committed
1243 1244
            clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contractPart[0].toString("yyyy-MM-dd"), selected[1].toString("yyyy-MM-dd"));
            clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1245 1246 1247 1248 1249
            contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
        }
        return contract;
    }

1250
    private Contract cancledShareFlow(Contract contract, BigDecimal unitPriceAccurate, DateTime[] usePart, DateTime[] selected) {
lzxry committed
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
        if (!ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus())) {
            return null;
        }
        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());
        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            contract.setClickFlow(0.0);
            return contract;
        }

        DateTime cancelDate = new DateTime(contractChange.getDs());//合同作废日
        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;


kangxiaoshan committed
1267 1268
        BigDecimal clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), usePart[0].toString("yyyy-MM-dd"), usedEnd.toString("yyyy-MM-dd"));
        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1269 1270 1271
        //区间点击数
        contract.setClickFlow(0.0);
        BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1272
        if (clickFlow != 0) {
lzxry committed
1273 1274
            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
            //区间点击数
kangxiaoshan committed
1275
            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1276 1277 1278 1279 1280
        }
        //区间分摊收入,乘以100,前端除以100
        long share = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        contract.setIntervaIncomeShare(share);
        //调整金
1281
        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
kangxiaoshan committed
1282 1283
            clickNum = tkioFlowRepository.sumFlowByContractCodeAndDs(contract.getContractCode(), contract.getStartDate(), usedEnd.toString("yyyy-MM-dd"));
            clickFlow = clickNum == null ? 0L : clickNum.longValue();
1284 1285
            //区间点击数
            clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1286
            if (clickFlow != 0) {
1287 1288 1289
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
                //区间点击数
                contract.setAdjustmentFund(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue() * -1L);
kangxiaoshan committed
1290
            } else {
1291 1292
                contract.setAdjustmentFund(0L);
            }
kangxiaoshan committed
1293
        } else {
1294 1295
            contract.setAdjustmentFund(0L);
        }
lzxry committed
1296 1297 1298 1299 1300 1301
        //分摊总收入
        contract.setIncomeShareAll(0L);
        contract.setIncomeGross(0L);
        return contract;
    }

lzxry committed
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
    //需求禅道 1608
    public void shareIncome4ContractTwo(Contract contract, DateTime start, DateTime end) {
        DateTime[] selected = new DateTime[]{
                start,
                end};//用户筛选开始/结束日期
        DateTime[] contractPart = new DateTime[]{
                new DateTime(contract.getStartDate()),
                new DateTime(contract.getEndDate())};//合同开始结束 时间
        DateTime[] usePart = new DateTime[]{
                selected[0].compareTo(contractPart[0]) <= 0 ? contractPart[0] : selected[0],
                selected[1].compareTo(contractPart[1]) >= 0 ? contractPart[1] : selected[1]
        };
        usePart[0] = usePart[0].compareTo(usePart[1]) >= 0 ? usePart[1] : usePart[0];

        Long excludTax = new BigDecimal(contract.getMoney() / 1.06)
                .setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue();//不含税收入*100
        contract.setIncomeExcludingTax(excludTax);

        //计算单价,精准保留16位数
kangxiaoshan committed
1321
        BigDecimal unitPriceAccurate = new BigDecimal(contract.getMoney() / 1.06 / contract.getTrackFlow())
lzxry committed
1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335
                .setScale(16, BigDecimal.ROUND_HALF_UP);
        //四舍五入单价
        double unitPrice = unitPriceAccurate.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        //不限量套餐会在方法里面重新赋值单价
        contract.setUnitPrice(unitPrice);
        //查询用户下所有appkey
        Account account = accountRepository.findByEmail(contract.getEmail());
        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);
kangxiaoshan committed
1336
        appkeyStr = "'" + appkeyStr + "'";
lzxry committed
1337 1338 1339 1340 1341 1342 1343

        //作废合同  累计收入= 0
        //中止合同  累计收入= 如果中止日期在选择日期之内,【合同开始日期-中止日期】,否则【合同开始日期-选择结束日期】,不需要考虑调整金
        //晚录合同  累计收入= 同下
        //正常合同  累计收入= 如果合同结束日期在选择日期之内,则直接取 [合同金额/1.06]得到总金额 ,否则 【合同开始日期-选择结束日期】

        //作废合同处理
kangxiaoshan committed
1344
        Contract cancleContract = this.cancledShareTKIO(contract, appkeyStr, unitPriceAccurate, usePart, selected);
lzxry committed
1345 1346 1347 1348 1349
        if (cancleContract != null) {
            return;
        }

        //中止合同处理
kangxiaoshan committed
1350
        Contract suspendContract = this.suspendShareTKIO(contract, appkeyStr, unitPriceAccurate, contractPart, usePart, selected);
lzxry committed
1351 1352 1353 1354 1355 1356 1357 1358 1359 1360
        if (suspendContract != null) {
            return;
        }

        //晚录合同处理//正常合同处理
        DateTime create = new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")); //录入时间点
        DateTime[] creatPoints = new DateTime[]{
                create, //录入日
                create.dayOfMonth().withMinimumValue() //录入月1日
        };
kangxiaoshan committed
1361
        this.afterContractTKIO(contract, appkeyStr, unitPriceAccurate, contractPart, usePart, selected, creatPoints);
lzxry committed
1362 1363 1364 1365


    }

kangxiaoshan committed
1366
    private void afterContractTKIO(Contract contract, String appkeyStr, BigDecimal unitPriceAccurate, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] creatPoints) {
lzxry committed
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382


        Long adjustmentFund = 0L;//调整金
        contract.setClickFlow(0.0);
        boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
        if (ContractStatusEnum.LATE.getKey().equals(contract.getStatus())) {
            isLateContract = true;
        } else if (checkLateContract(contractPart[0], creatPoints[0])) {
            isLateContract = true;
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        }

        boolean isLater = true;
        if (!isLateContract) {
            //非合同晚录
            BigInteger clickNum = accountFlowRestrictService.getTotalNum(usePart[0].toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1383
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1384 1385
            BigDecimal clickTenThousand = new BigDecimal(0);

kangxiaoshan committed
1386
            if (clickFlow != 0) {
lzxry committed
1387
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1388
                //区间点击数
kangxiaoshan committed
1389
                contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1390 1391 1392 1393 1394 1395 1396
            }
            //区间分摊收入
            contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());

            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());

kangxiaoshan committed
1397
            if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1398
                contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1399
            } else {
lzxry committed
1400 1401
                //累计总收入
                clickNum = accountFlowRestrictService.getTotalNum(contractPart[0].toString("yyyy-MM-dd"), selected[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1402
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1403
                contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
            }

            isLater = false;
        } else if (selected[1].isBefore(creatPoints[1])) {
            //录入月1号之前 调整金为 0 分摊为 0
            contract.setIntervaIncomeShare(0L);
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
            contract.setClickFlow(0.0);
            contract.setIncomeGross(0L);
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        } else {
            contract.setStatus(ContractStatusEnum.LATE.getKey());
            //合同晚录
            //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
            DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];

            BigInteger clickNum = accountFlowRestrictService.getTotalNum(useStart.toString("yyyy-MM-dd"), usePart[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1422
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1423 1424
            BigDecimal clickTenThousand = new BigDecimal(0);

kangxiaoshan committed
1425
            if (clickFlow != 0) {
lzxry committed
1426
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1427
                //区间点击数
kangxiaoshan committed
1428
                contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1429 1430 1431 1432 1433 1434 1435 1436 1437
            }
            //区间分摊收入
            contract.setIntervaIncomeShare(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());


            if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                //所选时间范围包含 录入月 1 号 显示统计的调整金
                //合同开始日期,合同录入日期的一号,-1就是上个月最后一天
                //contractPart[0], creatPoints[1].plusDays(-1)
kangxiaoshan committed
1438 1439
                clickNum = accountFlowRestrictService.getTotalNum(contractPart[0].toString("yyyy-MM-dd"), creatPoints[1].plusDays(-1).toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1440
                clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1441
                if (clickFlow != 0) {
lzxry committed
1442
                    clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1443 1444 1445 1446 1447 1448 1449
                    //区间点击数
                }
                contract.setAdjustmentFund(unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
            } else {
                contract.setAdjustmentFund(0L);
            }

kangxiaoshan committed
1450
            if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1451
                contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1452
            } else {
lzxry committed
1453 1454
                //累计总收入
                clickNum = accountFlowRestrictService.getTotalNum(contractPart[0].toString("yyyy-MM-dd"), selected[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1455
                clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1456
                contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
1457 1458 1459 1460 1461 1462 1463 1464
            }
        }

        if (checkTwoTime(contractPart[1], selected[1])) {
            //最后一日分摊收入计算处理(合同的最后一天,不管流量剩余多少,都算作做最后一天的收入)
            Long lastDay;
            DateTime lastDate[];
            if (isLater) {
kangxiaoshan committed
1465
                lastDate = new DateTime[]{creatPoints[1], contractPart[1].plusDays(-1)};
lzxry committed
1466
            } else {
kangxiaoshan committed
1467
                lastDate = new DateTime[]{contractPart[0], contractPart[1].plusDays(-1)};
lzxry committed
1468 1469 1470
            }
            //合同除去最后一天的流量
            BigInteger clickNum = accountFlowRestrictService.getTotalNum(lastDate[0].toString("yyyy-MM-dd"), lastDate[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1471
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1472
            BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1473
            if (clickFlow != 0) {
lzxry committed
1474
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1475 1476 1477 1478 1479
            }
            long beforeTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();

            //最后一天的流量
            clickNum = accountFlowRestrictService.getTotalNum(contractPart[1].toString("yyyy-MM-dd"), contractPart[1].toString("yyyy-MM-dd"), appkeyStr, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1480
            clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1481
            clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1482
            if (clickFlow != 0) clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
            long lastDayTheMoney = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
            //合同的税后总金额减去最后合同一日之前的钱和调整金
            lastDay = contract.getIncomeExcludingTax() - contract.getAdjustmentFund() - beforeTheMoney;
            //最后一日 或 包含最后一日 时
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() - lastDayTheMoney + lastDay);
        }

        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());

    }

kangxiaoshan committed
1494
    private Contract suspendShareTKIO(Contract contract, String appkeys, BigDecimal unitPriceAccurate, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected) {
lzxry committed
1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
        if (!ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
            return null;
        }
        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.SUSPEND.getValue(),
                contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            contract.setClickFlow(0.0);
            return contract;
        }
        // 合同中止日
        DateTime cancelDate = new DateTime(contractChange.getDs());

        //中止操作入库时间
        DateTime suspendDate = new DateTime(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));
        contract.setClickFlow(0.0);
        //调整金
        Long adjustmentFund = 0L;
        if (checkTwoTime(suspendDate, cancelDate)) {
            adjustmentFund = 0L;
        } else {
            //查询调整金的点击,日期开始结束时间注意不能颠倒
            BigInteger clickNum = accountFlowRestrictService.getTotalNum(cancelDate.toString("yyyy-MM-dd"), suspendDate.toString("yyyy-MM-dd"), appkeys, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1521
            long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1522 1523

            BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1524
            if (clickFlow != 0) {
lzxry committed
1525
                clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1526 1527 1528 1529 1530 1531 1532 1533
            }
            adjustmentFund = unitPriceAccurate.multiply(clickTenThousand.multiply(new BigDecimal(-1))).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        }
        //调整金
        contract.setAdjustmentFund(adjustmentFund);
        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;
        //查询开始->中止日期的点击(有收入的点击),不包括调整金
        BigInteger clickNum = accountFlowRestrictService.getTotalNum(usePart[0].toString("yyyy-MM-dd"), usedEnd.toString("yyyy-MM-dd"), appkeys, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1534
        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1535
        BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1536
        if (clickFlow != 0) {
lzxry committed
1537
            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1538
            //区间点击数
kangxiaoshan committed
1539
            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1540 1541 1542 1543
        }
        //区间分摊收入,乘以100,前端除以100
        long share = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        contract.setIntervaIncomeShare(share);
kangxiaoshan committed
1544
        contract.setIncomeShareAll(share + adjustmentFund);
lzxry committed
1545

kangxiaoshan committed
1546
        if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
lzxry committed
1547
            contract.setIncomeGross(contract.getIncomeExcludingTax());
kangxiaoshan committed
1548
        } else {
lzxry committed
1549 1550
            //累计总收入
            clickNum = accountFlowRestrictService.getTotalNum(contractPart[0].toString("yyyy-MM-dd"), selected[1].toString("yyyy-MM-dd"), appkeys, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1551
            clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1552
            contract.setIncomeGross(unitPriceAccurate.multiply(new BigDecimal(clickFlow / 10000.0 * 100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
lzxry committed
1553 1554 1555 1556
        }
        return contract;
    }

1557
    private Contract cancledShareTKIO(Contract contract, String appkeys, BigDecimal unitPriceAccurate, DateTime[] usePart, DateTime[] selected) {
lzxry committed
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
        if (!ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus())) {
            return null;
        }
        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());
        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            contract.setClickFlow(0.0);
            return contract;
        }

        DateTime cancelDate = new DateTime(contractChange.getDs());//合同作废日
        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;

        BigInteger clickNum = accountFlowRestrictService.getTotalNum(usePart[0].toString("yyyy-MM-dd"), usedEnd.toString("yyyy-MM-dd"), appkeys, "account_track_flow_restrict", "click_sum");
kangxiaoshan committed
1574
        long clickFlow = clickNum == null ? 0L : clickNum.longValue();
lzxry committed
1575 1576 1577
        //区间点击数
        contract.setClickFlow(0.0);
        BigDecimal clickTenThousand = new BigDecimal(0);
kangxiaoshan committed
1578
        if (clickFlow != 0) {
lzxry committed
1579
            clickTenThousand = new BigDecimal(clickFlow / 10000.0 * 100);
lzxry committed
1580
            //区间点击数
kangxiaoshan committed
1581
            contract.setClickFlow(new BigDecimal(clickFlow / 10000.0).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1582 1583 1584 1585 1586
        }
        //区间分摊收入,乘以100,前端除以100
        long share = unitPriceAccurate.multiply(clickTenThousand).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        contract.setIntervaIncomeShare(share);
        //调整金
1587
        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
kangxiaoshan committed
1588 1589
            contract.setAdjustmentFund(share * -1L);
        } else {
1590 1591
            contract.setAdjustmentFund(0L);
        }
lzxry committed
1592 1593 1594 1595 1596
        //分摊总收入
        contract.setIncomeShareAll(0L);
        contract.setIncomeGross(0L);
        return contract;
    }
kangxiaoshan committed
1597

kangxiaoshan committed
1598 1599
    public void shareIncome4Contract(Contract contract, DateTime start, DateTime end) {

1600 1601
        DateTime[] selected = new DateTime[]{
                start,
lzxry committed
1602
                end};//用户筛选开始/结束日期
kangxiaoshan committed
1603 1604 1605 1606 1607 1608 1609 1610
        DateTime[] contractPart = new DateTime[]{
                new DateTime(contract.getStartDate()),
                new DateTime(contract.getEndDate())};//合同开始结束 时间
        DateTime[] usePart = new DateTime[]{
                selected[0].compareTo(contractPart[0]) <= 0 ? contractPart[0] : selected[0],
                selected[1].compareTo(contractPart[1]) >= 0 ? contractPart[1] : selected[1]
        };

kangxiaoshan committed
1611 1612
        usePart[0] = usePart[0].compareTo(usePart[1]) >= 0 ? usePart[1] : usePart[0];

kangxiaoshan committed
1613 1614
        contract.setIntervalUseDays(getDayRange(contractPart[0], usePart[1]) + 1);

kangxiaoshan committed
1615 1616
        Long excludTax = new BigDecimal(contract.getMoney() / 1.06)
                .setScale(2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L)).longValue();//不含税收入*100
kangxiaoshan committed
1617 1618 1619 1620
        contract.setIncomeExcludingTax(excludTax);
        int contractAllDay = getDayRange(contractPart[0], contractPart[1]) + 1;//合同总天数

        //处理精度
kangxiaoshan committed
1621
        BigDecimal dayShareIncome = new BigDecimal(excludTax * 1.0 / contractAllDay);
kangxiaoshan committed
1622

kangxiaoshan committed
1623 1624
        if ("tkio".equals(contract.getPlatform())) {//设置tkio无限流量的日单价
            contract.setUnitPrice(dayShareIncome.divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
lzxry committed
1625
        }
kangxiaoshan committed
1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638

        //作废合同处理
        Contract cancleContract = this.cancledShare(contract, contractAllDay, dayShareIncome, contractPart, usePart, selected);
        if (cancleContract != null) {
            return;
        }

        //中止合同处理
        Contract suspendContract = this.suspendShare(contract, contractAllDay, dayShareIncome, contractPart, usePart, selected);
        if (suspendContract != null) {
            return;
        }

1639 1640 1641 1642 1643 1644
        //特殊合同处理
        Contract specilContract = this.specilContract(contract, dayShareIncome, contractPart, usePart, selected);
        if (specilContract != null) {
            return;
        }

kangxiaoshan committed
1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655
        //晚录合同处理
        DateTime create = new DateTime(new DateTime(contract.getCreateTime()).toString("yyyy-MM-dd")); //录入时间点
        DateTime[] creatPoints = new DateTime[]{
                create, //录入日
                create.dayOfMonth().withMinimumValue() //录入月1日
        };

        this.afterContract(contract, contractAllDay, dayShareIncome, contractPart, usePart, selected, creatPoints);

    }

1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671

    private Contract specilContract(Contract contract, BigDecimal dayShareIncome, DateTime[] contractPart, DateTime[] usePart, DateTime[] selected) {

        if (!"QQ-ADI-20190729-57".equals(contract.getContractCode())) {
            return null;
        }

        /*19年不含税金额:24268.88
        已摊销天数:161
        20不含税金额:31202.8181132075
        未摊销天数:205
        合同日期2019.7.24-2020.7.23,
        合同编号:QQ-ADI-20190729-57*/

        DateTime[] middlePoiont = new DateTime[]{new DateTime("2019-12-31"), new DateTime("2020-01-01")};

1672 1673 1674
        contract.setAdjustmentFund(0L);
        contract.setIncomeExcludingTax(new BigDecimal(24268.88 * 100).add(new BigDecimal(31202.8181132075 * 100))
                .setScale(2, BigDecimal.ROUND_HALF_UP).longValue());
1675

1676 1677
        BigDecimal dayShare_19 = new BigDecimal(24268.88).multiply(new BigDecimal(100))
                .divide(new BigDecimal(161), 15, BigDecimal.ROUND_HALF_UP);
1678

1679 1680 1681
        //选择时间范围内 20 年分摊天数 及每天分摊
        BigDecimal dayShare_20 = new BigDecimal(31202.8181132075).multiply(new BigDecimal(100))
                .divide(new BigDecimal(205), 15, BigDecimal.ROUND_HALF_UP);
1682

1683
        if (checkTwoTime(usePart[0], middlePoiont[0]) && checkTwoTime(middlePoiont[1], usePart[1])) {
kangxiaoshan committed
1684
            //选择时间范围内 19 + 20  年分摊天数 及每天分摊
1685 1686 1687 1688
            Long allDayShare = dayShare_19.multiply(new BigDecimal(getDayRange(usePart[0], middlePoiont[0]) + 1))
                    .add(dayShare_20.multiply(new BigDecimal(getDayRange(middlePoiont[1], usePart[1]) + 1)))
                    .setScale(2, BigDecimal.ROUND_HALF_UP).longValue();
            contract.setIntervaIncomeShare(allDayShare);
1689 1690 1691

        } else {

1692 1693 1694 1695
            int days = getDayRange(usePart[0], usePart[1]) + 1;
            if (checkTwoTime(usePart[1], middlePoiont[0])) {
                //19 年
                contract.setIntervaIncomeShare(shareMultiply(dayShare_19, new BigDecimal(days), 2));
1696

1697 1698 1699
            } else {
                //20 年
                contract.setIntervaIncomeShare(shareMultiply(dayShare_20, new BigDecimal(days), 2));
1700

1701 1702
            }
        }
1703 1704 1705

        contract.setIncomeShareAll(contract.getIntervaIncomeShare());
        return contract;
1706

1707 1708
    }

kangxiaoshan committed
1709
    private void afterContract(Contract contract, int contractAllDay, BigDecimal dayShareIncome,
kangxiaoshan committed
1710 1711
                               DateTime[] contractPart, DateTime[] usePart, DateTime[] selected, DateTime[] creatPoints) {

kangxiaoshan committed
1712
        int betweenMonth = Months.monthsBetween(contractPart[0], creatPoints[0]).getMonths();
kangxiaoshan committed
1713 1714 1715
        //时间范围内用于计算分摊金额的天数
        int daysIncom = getDayRange(usePart[0], usePart[1]) + 1;
        //区间分摊总收入
kangxiaoshan committed
1716
        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
kangxiaoshan committed
1717 1718

        Long adjustmentFund = 0L;//调整金
kangxiaoshan committed
1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730

        boolean isLateContract = false; // 是否为晚录合同(为了兼容历史数据 此处做冗余判断)
        if (ContractStatusEnum.LATE.getKey().equals(contract.getStatus())) {
            isLateContract = true;
        } else if (checkLateContract(contractPart[0], creatPoints[0])) {
            isLateContract = true;
        }

        if (isLateContract) {
            contract.setStatus(ContractStatusEnum.LATE.getKey());
        }

1731
        boolean isLater = true;
kangxiaoshan committed
1732
        if (!isLateContract || betweenMonth < 1) {
kangxiaoshan committed
1733 1734 1735
            //非合同晚录
            contract.setAdjustmentFund(0L);
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
1736
            isLater = false;
kangxiaoshan committed
1737

1738

kangxiaoshan committed
1739 1740
        } else if (selected[1].isBefore(creatPoints[1])) {
            //录入月1号之前 调整金为 0 分摊为 0
kangxiaoshan committed
1741
            contract.setIntervaIncomeShare(0L);
kangxiaoshan committed
1742
            contract.setAdjustmentFund(0L);
kangxiaoshan committed
1743
            contract.setIncomeShareAll(contract.getIntervaIncomeShare());
kangxiaoshan committed
1744
            contract.setStatus(ContractStatusEnum.LATE.getKey());
kangxiaoshan committed
1745
        } else {
kangxiaoshan committed
1746
            contract.setStatus(ContractStatusEnum.LATE.getKey());
kangxiaoshan committed
1747
            //合同晚录
kangxiaoshan committed
1748
            //所选时间范围内的分摊收入(录入月1号 即creatPoints[1] 开始计算)
kangxiaoshan committed
1749 1750 1751
            DateTime useStart = creatPoints[1].compareTo(selected[0]) >= 0 ? creatPoints[1] : selected[0];
            daysIncom = getDayRange(useStart, usePart[1]) + 1;

1752
            contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
kangxiaoshan committed
1753
            adjustmentFund = shareMultiply(dayShareIncome, new BigDecimal(getDayRange(contractPart[0], creatPoints[1].plusDays(-1)) + 1), 0);
kangxiaoshan committed
1754 1755 1756 1757 1758 1759 1760 1761 1762

            if (checkTwoTime(selected[0], creatPoints[1]) && checkTwoTime(creatPoints[1], selected[1])) {
                //所选时间范围包含 录入月 1 号 显示统计的调整金
                contract.setAdjustmentFund(adjustmentFund);
            } else {
                contract.setAdjustmentFund(0L);
            }
        }

lzxry committed
1763 1764 1765 1766 1767 1768
        if (checkTwoTime(selected[0], contractPart[1]) && checkTwoTime(contractPart[1], selected[1])) {
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractPart[0], contractPart[1]) + 1), dayShareIncome, 0));
        } else {
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractPart[0], selected[1]) + 1), dayShareIncome, 0));
        }

kangxiaoshan committed
1769 1770
        if (checkTwoTime(contractPart[1], selected[1])) {
            //最后一日分摊金计算处理
1771 1772
            Long lastDay;
            if (isLater) {
1773

kangxiaoshan committed
1774

1775
                lastDay = contract.getIncomeExcludingTax() - adjustmentFund
kangxiaoshan committed
1776 1777 1778 1779
                        - shareMultiply(dayShareIncome, new BigDecimal(getDayRange(creatPoints[1], contractPart[1])), 0);
            } else {
                lastDay = contract.getIncomeExcludingTax() - adjustmentFund
                        - shareMultiply(dayShareIncome, new BigDecimal(getDayRange(contractPart[0], contractPart[1])), 0);
1780 1781
            }

kangxiaoshan committed
1782
            //最后一日 或 包含最后一日 时
kangxiaoshan committed
1783 1784
            contract.setIntervaIncomeShare(contract.getIntervaIncomeShare() -
                    dayShareIncome.setScale(0, BigDecimal.ROUND_HALF_UP).longValue() + lastDay);
kangxiaoshan committed
1785 1786 1787 1788 1789 1790 1791

        }

        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());

    }

kangxiaoshan committed
1792
    private Contract suspendShare(Contract contract, int contractAllDay, BigDecimal dayShareIncome,
kangxiaoshan committed
1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816
                                  DateTime[] contractPart, DateTime[] usePart, DateTime[] selected) {
        if (!ContractStatusEnum.SUSPEND.getKey().equals(contract.getStatus())) {
            return null;
        }

        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.SUSPEND.getValue(),
                contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            return contract;
        }
        // 合同终止日 或 作废日
        DateTime cancelDate = new DateTime(contractChange.getDs());

        //中止操作入库时间
        DateTime suspendDate = new DateTime(new DateTime(contractChange.getCreateTime()).toString("yyyy-MM-dd"));

        Long adjustmentFund = 0L;
        if (checkTwoTime(suspendDate, cancelDate)) {
            adjustmentFund = 0L;
        } else {
kangxiaoshan committed
1817
            adjustmentFund = shareMultiply(new BigDecimal((getDayRange(cancelDate, suspendDate) + 1) * -1), dayShareIncome, 0);
kangxiaoshan committed
1818 1819 1820 1821 1822 1823 1824
        }

        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;
        int daysIncom = Days.daysBetween(usePart[0], usedEnd).getDays() + 1;
        daysIncom = daysIncom < 0 ? 0 : daysIncom;

        //区间分摊总收入
kangxiaoshan committed
1825
        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
kangxiaoshan committed
1826 1827 1828

        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
            contract.setAdjustmentFund(adjustmentFund);
lzxry committed
1829
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractPart[0], cancelDate) + 1), dayShareIncome, 0));
kangxiaoshan committed
1830 1831
        } else {
            contract.setAdjustmentFund(0L);
lzxry committed
1832
            contract.setIncomeGross(shareMultiply(new BigDecimal(getDayRange(contractPart[0], selected[1]) + 1), dayShareIncome, 0));
kangxiaoshan committed
1833 1834 1835 1836 1837 1838 1839
        }

        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());

        return contract;
    }

kangxiaoshan committed
1840
    private Contract cancledShare(Contract contract, int contractAllDay, BigDecimal dayShareIncome,
kangxiaoshan committed
1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857
                                  DateTime[] contractPart, DateTime[] usePart, DateTime[] selected) {

        if (!ContractStatusEnum.CANCEL.getKey().equals(contract.getStatus())) {
            return null;
        }

        ContractChange contractChange = contractChangeRepository.findByContentCode(ContractStatusEnum.CANCEL.getValue(), contract.getContractCode());

        if (contractChange == null) {
            contract.setAdjustmentFund(0L);
            contract.setIntervaIncomeShare(0L);
            contract.setIncomeShareAll(0L);
            return contract;
        }

        // 合同终止日 或 作废日
        DateTime cancelDate = new DateTime(contractChange.getDs());
kangxiaoshan committed
1858
        Long adjustmentFund = shareMultiply(new BigDecimal((getDayRange(contractPart[0], cancelDate) + 1) * -1), dayShareIncome, 0);
kangxiaoshan committed
1859
        DateTime usedEnd = usePart[1].compareTo(cancelDate) <= 0 ? usePart[1] : cancelDate;
kangxiaoshan committed
1860

kangxiaoshan committed
1861 1862
        int daysIncom = Days.daysBetween(usePart[0], usedEnd).getDays() + 1;
        daysIncom = daysIncom < 0 ? 0 : daysIncom;
kangxiaoshan committed
1863 1864

        contract.setIntervalUseDays(getDayRange(contractPart[0], usedEnd) + 1);
kangxiaoshan committed
1865
        //区间分摊总收入
1866

kangxiaoshan committed
1867
        contract.setIntervaIncomeShare(shareMultiply(dayShareIncome, new BigDecimal(daysIncom), 0));
kangxiaoshan committed
1868

kangxiaoshan committed
1869
        if (checkTwoTime(selected[0], cancelDate) && checkTwoTime(cancelDate, selected[1])) {
kangxiaoshan committed
1870 1871 1872 1873
            contract.setAdjustmentFund(adjustmentFund);
        } else {
            contract.setAdjustmentFund(0L);
        }
lzxry committed
1874
        contract.setIncomeGross(0L);
kangxiaoshan committed
1875 1876 1877 1878
        contract.setIncomeShareAll(contract.getIntervaIncomeShare() + contract.getAdjustmentFund());
        return contract;
    }

kangxiaoshan committed
1879 1880 1881 1882
    private Long shareMultiply(BigDecimal one, BigDecimal two, int scale) {
        return one.multiply(two).setScale(scale, BigDecimal.ROUND_HALF_UP).longValue();
    }

kangxiaoshan committed
1883 1884 1885 1886 1887 1888 1889
    @Override
    public boolean checkLateContract(DateTime dateTime, DateTime creatTime) {
        int aferDays = dateTime.monthOfYear().get() == 12 ? 29 : 9;
        return dateTime.dayOfMonth().withMaximumValue().plusDays(aferDays).isBefore(creatTime);

    }

kangxiaoshan committed
1890 1891 1892 1893 1894 1895 1896 1897
    private int getDayRange(DateTime range1, DateTime range2) {
        return Days.daysBetween(range1, range2).getDays();
    }

    public boolean checkTwoTime(DateTime dateTime1, DateTime dateTime2) {
        return dateTime1.isBefore(dateTime2) || dateTime1.isEqual(dateTime2);
    }

1898 1899 1900 1901 1902 1903 1904

    @Override
    public List<TrackFlowVO> trialFlow(User loginAccount, String startDate, String endDate, String platform, String email) {
        //离线数据值
        Map<String, Double> offlineResult = tkioOfflineRepository.findOfflineResult(startDate, endDate);

        //查询主账号
kangxiaoshan committed
1905 1906
        List<Map<String, String>> list = null;
        if (StringUtil.isEmpty(email)) {
1907
            list = accountRepository.findAllAccountAppKeys();
kangxiaoshan committed
1908
        } else {
1909 1910 1911
            list = accountRepository.findAccountAppKeysByEmail(email);
        }
        JSONArray jsonObject = JSONArray.fromObject(list);
kangxiaoshan committed
1912
        Iterator it = jsonObject.iterator();
1913
        List<AccountVO> avs = new ArrayList<>();
kangxiaoshan committed
1914
        while (it.hasNext()) {
1915 1916 1917 1918 1919 1920 1921 1922 1923 1924
            JSONArray array = JSONArray.fromObject(it.next());
            String e = array.getString(0);
            String k = array.getString(1);
            AccountVO vo = new AccountVO();
            vo.setEmail(e);
            vo.setAppKey(k);
            avs.add(vo);
        }
        //汇总计算
        List<TrackFlowVO> result = new ArrayList<>();
kangxiaoshan committed
1925
        for (AccountVO ac : avs) {
1926 1927 1928
            TrackFlowVO tf = new TrackFlowVO(ac.getEmail());
            String appKeys = ac.getAppKey();
            //如果appKey为空,流量为0
kangxiaoshan committed
1929
            if ("".equals(appKeys.trim())) {
1930 1931 1932 1933 1934 1935
                tf.setTrackFlow(0.0);
                result.add(tf);
                continue;
            }
            Double sum = 0.0;
            String[] keyArr = appKeys.split(",");
kangxiaoshan committed
1936
            for (String k : keyArr) {
1937
                Double v = offlineResult.get(k);
kangxiaoshan committed
1938
                if (v == null) {
1939 1940
                    v = 0.0;
                }
kangxiaoshan committed
1941
                sum += v;
1942
            }
kangxiaoshan committed
1943
            tf.setTrackFlow(new BigDecimal(sum / 10000).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
1944 1945 1946 1947 1948 1949
            result.add(tf);
        }
        return result;
    }


kangxiaoshan committed
1950
    public static void main(String[] args) {
lzxry committed
1951 1952 1953 1954 1955 1956 1957 1958
        DateTime dateTime = new DateTime("2020-10-30");
        DateTime creatTime = new DateTime("2020-11-9");
        int aferDays = dateTime.monthOfYear().get() == 12 ? 29 : 9;
        System.out.println(dateTime.monthOfYear().get());
        System.out.println(dateTime.dayOfMonth().withMaximumValue());
        System.out.println(dateTime.dayOfMonth().withMaximumValue().plusDays(aferDays));
        System.out.println(dateTime.dayOfMonth().withMaximumValue().plusDays(aferDays).isBefore(creatTime));
        dateTime.dayOfMonth().withMaximumValue().plusDays(aferDays).isBefore(creatTime);
kangxiaoshan committed
1959 1960 1961 1962

    }

    public static void main2(String[] args) {
kangxiaoshan committed
1963 1964
        DateTime contractStart = new DateTime("2020-05-15");
        DateTime create = new DateTime("2020-06-15");
kangxiaoshan committed
1965
        System.out.println(contractStart.monthOfYear().getDateTime());
kangxiaoshan committed
1966 1967 1968 1969
        System.out.println(contractStart.dayOfMonth().withMaximumValue().plusDays(1));
        System.out.println(contractStart.dayOfMonth().withMaximumValue().plusDays(9).isBefore(create));
        System.out.println(contractStart.compareTo(create));

kangxiaoshan committed
1970 1971 1972 1973
        long ss = new BigDecimal(94000 * 1.0 / 52)
                .setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
        System.out.println(ss);

kangxiaoshan committed
1974 1975 1976 1977 1978
        DateTime[][] times = new DateTime[][]{
                {new DateTime(), new DateTime()},
                {new DateTime(), new DateTime()}
        };
        System.out.println(times[1][0].toString());
kangxiaoshan committed
1979 1980
    }
}