//package com.younike.api.task;
//
//import com.younike.api.service.WeChatPayService;
//import com.younike.common.constant.OrderState;
//import com.younike.common.constant.SMSType;
//import com.younike.common.exception.ApiException;
//import com.younike.common.id.IDGenerate;
//import com.younike.common.sms.AliSmsUtil;
//import com.younike.common.utils.json.JSONObject;
//import com.younike.common.utils.string.StringUtils;
//import com.younike.common.wxpay.service.WechatPayService;
//import com.younike.service.pojo.TAppUser;
//import com.younike.service.service.ITAppUserService;
//import lombok.extern.log4j.Log4j2;
//import org.apache.commons.collections.CollectionUtils;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.math.BigDecimal;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.time.temporal.ChronoUnit;
//
///**
// * @author Another
// * @date 2022/3/12 14:37
// */
//@Component
//@Log4j2
//public class SharedSpaceTask {
//
//    @Resource
//    private ITOrderService orderService;
//
//    @Resource
//    private WechatPayService payService;
//
//    @Resource
//    private ITAppUserService appUserService;
//
//    @Resource
//    private WeChatPayService weChatPayService;
//
//    @Resource
//    private AliSmsUtil aliSmsUtil;
//
//
//    /**
//     * 每5分钟一次？
//     * */
//    @Scheduled(fixedRate = 1000*60*5)
//    public synchronized void timedInsertionTask() throws Exception{
//
//
//    }
//
//
//    /**
//     * 订单开始前30分钟的定时任务
//     */
//    @Scheduled(fixedRate = 1000*60*5)
//    public void orderStartBeforeTask(){
//        List<ShareDto> orderStartBeforeList = orderService.getOrderStartBeforeList(30,5);
//        if(CollectionUtils.isNotEmpty(orderStartBeforeList)){
//            for (ShareDto shareDto : orderStartBeforeList) {
//                String parkingId = shareDto.getParkingId();
//                TBaseParking baseParking = baseParkingService.getByParkingId(parkingId);
//                // 获取道闸停车场ID
//                Long orgId = baseParking.getOrgId();
//                BaseOrganization baseOrganization = baseOrganizationService.getByOrgId(orgId);
//                String organizationCode = baseOrganization.getOrganizationCode();
//                // 拼接表名
//                String tableStr = organizationCode + "_CarIO_In";
//                if(StringUtils.isNotBlank(organizationCode)){
//                    // 查询业主是否在场
//                    TCar userCar = carService.getById(shareDto.getCarId());
//                    if(userCar != null){
//                        List<CarIOIn> userInParking = carIOInService.getByCarNumberAndTableName(userCar.getCarNumber(), tableStr);
//                        if(CollectionUtils.isNotEmpty(userInParking)){
//                            // 查询业主电话
//                            TAppUser user = appUserService.getById(shareDto.getUserId());
//                            log.info("您发布的共享车位${parkNo}租赁时间${date}，请在开始时间${time}分钟前出场，否则将会导致订单取消的情况");
//                            if(user != null){
//                                JSONObject jsonObject = new JSONObject();
//                                jsonObject.put("parkNo",shareDto.getSpaceNo());
//                                jsonObject.put("date",shareDto.getLeaseStart());
//                                jsonObject.put("time",5);
//                                aliSmsUtil.sendSms(user.getPhone(),jsonObject,SMSType.ORDER_START_BEFORE_USER.getCode());
//                            }
//                        }
//                    }
//                }
//            }
//        }
//    }
//
//
//
//    /**
//     * 查询已结束的订单
//     * */
//    @Scheduled(fixedRate = 1000*60*5)
//    public void updateSharedOrderEndStateTask(){
//        List<ShareDto> listByEndTimeAndState = orderService.getListByEndTimeAndState();
//        if(CollectionUtils.isNotEmpty(listByEndTimeAndState)){
//            for (ShareDto shareDto : listByEndTimeAndState) {
//                String parkingId = shareDto.getParkingId();
//                TBaseParking baseParking = baseParkingService.getByParkingId(parkingId);
//                // 获取道闸停车场ID
//                Long orgId = baseParking.getOrgId();
//                BaseOrganization baseOrganization = baseOrganizationService.getByOrgId(orgId);
//                String organizationCode = baseOrganization.getOrganizationCode();
//                // 拼接表名
//                String tableStr = organizationCode + "_CarIO_In";
//                // 查询业主信息
//                TAppUser appUser = appUserService.getById(shareDto.getUserId());
//                if(StringUtils.isNotBlank(organizationCode)){
//                    // 查询租户是否还在场，短信通知尽快离场
//                    List<CarIOIn> tenantInParking = carIOInService.getByCarNumberAndTableName(shareDto.getTenantCarNumber(), tableStr);
//                    String leaseEnd = shareDto.getLeaseEnd();
//                    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//                    // 计算时间
//                    long between = ChronoUnit.MINUTES.between(LocalDateTime.now(), LocalDateTime.parse(leaseEnd,df));
//                    if(CollectionUtils.isNotEmpty(tenantInParking)){
//                        log.info("短信通知保安：【优安停提醒您】车辆{XXX}租赁共享车位{XXX}距离出租结束时间已超过5分钟， 租赁时间{2022-03-25 10:30至2022-03-25 12:30}，请督促租客{手机号}尽快离场，或联系业主{手机号}协商处理");
//                        // 车辆${carNo}租赁共享车位${parkNo}距离出租结束时间已超过${time}分钟， 请督促租客${phone1}尽快离场，或联系业主${phone2}协商处理
//                        JSONObject jsonObject = new JSONObject();
//                        jsonObject.put("carNo",shareDto.getTenantCarNumber());
//                        jsonObject.put("parkNo",shareDto.getSpaceNo());
//                        jsonObject.put("time",Math.abs(between));
//                        jsonObject.put("phone1",shareDto.getTenantPone());
//                        jsonObject.put("phone2",appUser.getPhone());
//                        baseConfigPhoneService.sendSMS(shareDto.getParkingId(), SMSType.ORDER_END_ADMIN.getCode(),jsonObject);
//                    }
//                    // 查询业主是否在场
//                    TCar userCar = carService.getById(shareDto.getCarId());
//                    if(userCar != null){
//                        List<CarIOIn> userInParking = carIOInService.getByCarNumberAndTableName(userCar.getCarNumber(), tableStr);
//                        if(CollectionUtils.isNotEmpty(userInParking)){
//                            log.info("您在车位出租期间进场，请出场重新进场，否则会持续计算临停费用");
//                            JSONObject jsonObject = new JSONObject();
//                            aliSmsUtil.sendSms(appUser.getPhone(),jsonObject,SMSType.ORDER_END_USER.getCode());
//                        }
//                    }
//                }
//                // 插入账单记录
//                TOrderRecord tOrderRecord = new TOrderRecord();
//                tOrderRecord.setId(IDGenerate.nextId());
//                tOrderRecord.setOrderId(shareDto.getOrderId());
//                tOrderRecord.setParkingId(shareDto.getParkingId());
//                tOrderRecord.setPayPrice(shareDto.getPayPrice());
//                tOrderRecord.setRecordType("001");
//                // 查询项目配置
//                List<TBaseConfig> list = configService.list();
//                BigDecimal multiply = new BigDecimal(0.00);
//                BigDecimal subtract = new BigDecimal(0.00);
//                if(CollectionUtils.isNotEmpty(list)){
//                    TBaseConfig tBaseConfig = list.get(0);
//                    BigDecimal stage = tBaseConfig.getStage();
//                    // 抽成金额
//                    multiply = shareDto.getPayPrice().multiply(stage);
//                    // 入账金额
//                    subtract = shareDto.getPayPrice().subtract(multiply);
//                    tOrderRecord.setRoyaltyPrice(multiply);
//                    tOrderRecord.setPriceReceived(subtract);
//                }else{
//                    tOrderRecord.setRoyaltyPrice(new BigDecimal(0));
//                    tOrderRecord.setPriceReceived(shareDto.getPayPrice());
//                }
//                if(!orderRecordService.save(tOrderRecord)){
//                    log.error("账单生成失败");
//                    throw new ApiException("账单生成失败");
//                }
//                // 插入钱包记录表
//                TWalletRecord walletRecord = new TWalletRecord();
//                walletRecord.setType("001");
//                walletRecord.setUserId(shareDto.getUserId());
//                walletRecord.setTargetId(shareDto.getOrderId());
//                walletRecord.setAmount(subtract);
//                if(!walletRecordService.save(walletRecord)){
//                    log.error("钱包记录生成失败");
//                    throw new ApiException("钱包记录生成失败");
//                }
//                // 付款，给钱包业主加钱
//                TAppUser user = appUserService.getById(shareDto.getUserId());
//                user.setAmount(user.getAmount().add(subtract));
//                if(!appUserService.updateById(user)){
//                    log.error("钱包入账失败");
//                    throw new ApiException("钱包入账失败");
//                }
//                // 删除车牌号
//                if(StringUtils.isNotBlank(shareDto.getTargetId())){
//                    if(!housecarService.removeById(shareDto.getTargetId())){
//                        // 修改订单状态为已完成
//                        log.error("订单结束：删除车牌号失败");
//                    }
//                    TOrder order = orderService.getById(shareDto.getOrderId());
//                    order.setOrderState(OrderState.COMPLETE.getCode());
//                    if(!orderService.updateById(order)){
//                        log.error("订单状态更新失败");
//                    }
//                }
//            }
//        }
//    }
//
//    /**
//     * 共享结束前15分钟提示信息任务
//     *
//     */
//    @Scheduled(fixedRate = 1000*60*5)
//    public void sharedSpaceFiveMinTipsInfoTask(){
//        List<ShareDto> endFiveMinBeforeList = orderService.getEndFiveMinBeforeList();
//        if(CollectionUtils.isNotEmpty(endFiveMinBeforeList)){
//            for (ShareDto shareDto : endFiveMinBeforeList) {
//                String parkingId = shareDto.getParkingId();
//                TBaseParking baseParking = baseParkingService.getByParkingId(parkingId);
//                // 获取道闸停车场ID
//                Long orgId = baseParking.getOrgId();
//                BaseOrganization baseOrganization = baseOrganizationService.getByOrgId(orgId);
//                String organizationCode = baseOrganization.getOrganizationCode();
//                // 拼接表名
//                String tableStr = organizationCode + "_CarIO_In";
//                if(StringUtils.isNotBlank(organizationCode)){
//                    // 查询租户是否在场
//                    List<CarIOIn> tenantInParking = carIOInService.getByCarNumberAndTableName(shareDto.getTenantCarNumber(), tableStr);
//                    if(CollectionUtils.isNotEmpty(tenantInParking)){
//                        // 在场通知租客：【优安停提醒您】您的车辆{XXX}租赁共享车位{XXX}距离出租结束时间只剩5分钟，租赁时间{2022-03-25 10:30至2022-03-25 12:30}， 请尽快离场，以免影响业主停车，谢谢
//                        System.out.println("【优安停提醒您】您的车辆{XXX}租赁共享车位{XXX}距离出租结束时间只剩5分钟，租赁时间{2022-03-25 10:30至2022-03-25 12:30}， 请尽快离场，以免影响业主停车，谢谢");
//                        String leaseEnd = shareDto.getLeaseEnd();
//                        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//                        // 计算时间
//                        long between = ChronoUnit.MINUTES.between(LocalDateTime.now(), LocalDateTime.parse(leaseEnd,df));
//                        System.out.println("【优安停提醒您】剩余"+Math.abs(between));
//                        JSONObject tenantByBefore = new JSONObject();
//                        tenantByBefore.put("carNo",shareDto.getTenantCarNumber());
//                        tenantByBefore.put("parkNo",shareDto.getSpaceNo());
//                        tenantByBefore.put("time",Math.abs(between));
//                        aliSmsUtil.sendSms(shareDto.getTenantPone(),tenantByBefore,SMSType.TENANT_MOBILIZATION_TENANT.getCode());
//                        // 在场通知保安：【优安停提醒您】租客车辆{XXX}租赁共享车位{XXX}距离出租结束时间只剩5分钟，租赁时间{2022-03-25 10:30至2022-03-25 12:30}， 请督促租客尽快离场，以免影响业主停车，谢谢。
//                        System.out.println("【优安停提醒您】租客车辆{XXX}租赁共享车位{XXX}距离出租结束时间只剩5分钟，租赁时间{2022-03-25 10:30至2022-03-25 12:30}， 请督促租客尽快离场，以免影响业主停车，谢谢");
//                        // 租客车辆${carNo}租赁共享车位${parkNo}距离出租结束时间只剩${time}分钟，租赁时间${date}， 请督促租客${phone}尽快离场，以免影响业主停车，谢谢
//                        JSONObject adminByBefore = new JSONObject();
//                        adminByBefore.put("carNo",shareDto.getTenantCarNumber());
//                        adminByBefore.put("parkNo",shareDto.getSpaceNo());
//                        adminByBefore.put("time",Math.abs(between));
//                        adminByBefore.put("date",shareDto.getLeaseEnd());
//                        adminByBefore.put("phone",shareDto.getTenantPone());
//                        // TODO: 2022/4/2
//                        baseConfigPhoneService.sendSMS(shareDto.getParkingId(),SMSType.ORDER_END_BEFORE_ADMIN.getCode(), adminByBefore);
//                        // 查询业主信息
//                        TAppUser appUser = appUserService.getById(shareDto.getUserId());
//                        // TODO: 2022/4/2
//                        aliSmsUtil.sendSms(appUser.getPhone(),adminByBefore,SMSType.ORDER_END_BEFORE_ADMIN.getCode());
//                    }
//                }
//            }
//        }
//    }
//
//
//    public void checkInOutLog(){
//
//    }
//}
