package cn.iocoder.yudao.module.identity.service.scanrecord;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.identity.controller.admin.scanrecord.vo.*;
import cn.iocoder.yudao.module.identity.controller.app.scanrecord.vo.FirstScanRecordRespVO;
import cn.iocoder.yudao.module.identity.controller.app.scanrecord.vo.ScanRecordAppPageReqVO;
import cn.iocoder.yudao.module.identity.dal.dataobject.scanrecord.ScanRecordDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 扫码记录 Service 接口
 *
 * @author 芋道源码
 */
public interface ScanRecordService {

    /**
     * 创建扫码记录
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createScanRecord(@Valid ScanRecordCreateReqVO createReqVO);

    void createBatchScanRecord(CreateFirstScanRecordReqVO params);

    /**
     * 更新扫码记录
     *
     * @param updateReqVO 更新信息
     */
    void updateScanRecord(@Valid ScanRecordUpdateReqVO updateReqVO);

    /**
     * 删除扫码记录
     *
     * @param id 编号
     */
    void deleteScanRecord(Long id);

    /**
     * 获得扫码记录
     *
     * @param id 编号
     * @return 扫码记录
     */
    ScanRecordDO getScanRecord(Long id);

    /**
     * 获得扫码记录列表
     *
     * @param ids 编号
     * @return 扫码记录列表
     */
    List<ScanRecordDO> getScanRecordList(Collection<Long> ids);

    /**
     * 获得扫码记录分页
     *
     * @param pageReqVO 分页查询
     * @return 扫码记录分页
     */
    PageResult<ScanRecordDO> getScanRecordPage(ScanRecordPageReqVO pageReqVO);

    /**
     * 获得扫码记录列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 扫码记录列表
     */
    List<ScanRecordDO> getScanRecordList(ScanRecordExportReqVO exportReqVO);


    /**
     * 获得扫码次数
     * @param goodsName
     * @param belongBusinessName
     * @param timeHorizon1
     * @param timeHorizon2
     */
    int getScanRecordCount(String goodsName, String belongBusinessName,String timeHorizon1,String timeHorizon2);

    /**
     * 根据查询时间范围条件，查询出每日的查询次数
     * @param goodsName
     * @param belongBusinessName
     * @param timeHorizon1
     * @param timeHorizon2
     * @return
     */
    Map<String,Long> getScanCountByDay(String goodsName, String belongBusinessName,String timeHorizon1,String timeHorizon2);


    /**
     * 根据商户名称、商品和时间范围统计商户地区
     * @param goodsName 商品名称
     * @param businessName 商户名称
     * @param timeHorizon1 开始时间
     * @param timeHorizon2 结束时间
     * @return 商户地区列表
     */
    List<String> getBusinessRegionList( Long businessName,Long goodsName, String timeHorizon1, String timeHorizon2);

    /**
     * 为app获得扫码记录
     * @param identityCode 二维码码值
     * @return 扫码记录
     */
    List<ScanRecordDO> getRecordListForApp(String identityCode);

    PageResult<ScanRecordDO> getRecordPageForApp(ScanRecordAppPageReqVO pageReqVO);

    /**
     * 新增扫码记录
     *
     * @param identityCode 标识码内容
     * @param scanIp       ip
     * @param region       区域
     */
    void createByApp(String identityCode, String scanIp, String region, String type, String m, String mobileSystemInfo);

    /**
     * 根据identityUrl 获取首次的扫码时间与首次扫码地点
     * @param identityUrl
     * @return
     */
    ScanRecordDO getFirstScanInfoByUrl(String identityUrl);

    /**
     * 根据identityUrl 获取首次的扫码时间与首次扫码地点和扫码次数
     * @param identityUrl
     * @return
     */
    FirstScanRecordRespVO getFirstScanInfoByUrlAndNumber(String identityUrl);

    /**
     * 根据identityUrl 获取所有的扫码时间与扫码地点
     * @param identityUrl
     * @return
     */
    List<ScanRecordDO> getScanLocationAndTimeByUrl(String identityUrl);

    /**
     *根据采收批次ID 获取首次的扫码时间与首次扫码地点和扫码次数
     * @param batchId
     * @return
     */
    ScanRecordDO getFirstScanInfoByBatchId(String batchId);

    /**
     * 根据identityUrl APP获取首次的扫码时间与首次扫码地点
     * @param identityUrl
     * @return
     */
    ScanRecordDO getFirstScanInfoByUrlApp(String identityUrl);

    FirstScanRecordRespVO getLastScanInfoByUrl(String identityUrl);

    BrokenRespVO isBroken(String type, String m);

}
