package com.boco.nbd.wios.flow.service;

import com.boco.nbd.framework.common.ResponseMessage2;
import com.boco.nbd.framework.persistence.IBaseDaoService3;
import com.boco.nbd.framework.workflow.entity.TaskInfoResponse;
import com.boco.nbd.wios.core.entity.AlgorithmDic;
import com.boco.nbd.wios.core.entity.ReportEntry;
import com.boco.nbd.wios.flow.entity.bo.BusinessDataBO;
import com.boco.nbd.wios.flow.entity.bo.LocalSubmitFlowBO;
import com.boco.nbd.wios.flow.entity.bo.ManualSapBo;
import com.boco.nbd.wios.flow.entity.bo.WorkTaskVO;
import com.boco.nbd.wios.flow.entity.po.*;
import com.boco.nbd.wios.flow.entity.qo.CamsOrderQo;
import com.boco.nbd.wios.flow.entity.qo.FlowChartQo;
import com.boco.nbd.wios.flow.entity.qo.FlowNodeUserQo;
import com.boco.nbd.wios.flow.entity.vo.FlowChartVO;
import com.boco.nbd.wios.flow.entity.vo.RegionInfoVO;
import com.boco.nbd.wios.flow.entity.vo.VisitOrderVO;
import com.boco.nbd.wios.flow.enums.OrderInfoEnum;
import com.boco.nbd.wios.log.entity.po.InterfaceMonitorPO;
import com.boco.nbd.wios.flow.entity.pdf.BlockPairBo;
import com.boco.nbd.wios.manage.entity.bo.OrderBo;
import com.boco.nbd.wios.manage.entity.bo.SupplierContractVo;
import com.boco.nbd.wios.manage.entity.cams.enums.UploadFileType;
import com.boco.nbd.wios.manage.entity.common.bo.UploadFile;
import com.boco.nbd.wios.wx.entity.bo.MinaOrderTrack;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author:cao hai
 * @date:2022/6/28 8:36
 * @version:V1.0
 * @description:IOrderService
 * @modify:
 */
public interface IOrderService extends IBaseDaoService3<OrderPO> {

    /**
     * 流程流转
     *
     * @param bo
     * @return
     */
    ResponseMessage2<Boolean> submitFlow(LocalSubmitFlowBO bo);

    /**
     * 启动流程
     *
     * @param po
     * @return
     */
    ResponseMessage2<Boolean> startFlow(OrderPO po);

    /**
     * 获取待办列表
     *
     * @param qo
     * @return
     */
    WorkTaskVO getWaitDealWorkTask(CamsOrderQo qo);

    /**
     * 获取已办列表
     *
     * @param qo
     * @return
     */
    WorkTaskVO getMyFinishedWorkTask(CamsOrderQo qo);

    /**
     * 获取归档列表
     *
     * @param qo
     * @return
     */
    WorkTaskVO getArchivedWorkTask(CamsOrderQo qo);

    /**
     * 获取流转轨迹
     *
     * @param processInsId
     * @return
     */
    List<TaskInfoResponse> getWorkTrack(String processInsId);

    /**
     * 获取流程轨迹
     *
     * @param processInsId
     * @return
     */
    List<MinaOrderTrack> getMinaWorkTrack(String processInsId);


    /**
     * 获取menuId字段数据
     *
     * @param menuId
     * @return
     */
    List<MenuFieldPO> getMenuFields(String menuId);

    /**
     * 生成枚举字段
     *
     * @return
     */
    Map<String, Map<Object, String>> createEnumMap();


    /**
     * 评分自动计算算法
     *
     * @param parentKey
     * @return
     */
    List<AlgorithmDic> getScoreAlgorithm(Integer parentKey);

    /**
     * 获取报告配置实体
     *
     * @param parentKey
     * @return
     */
    List<ReportEntry> getReportEntry(Integer parentKey);

    /**
     * 获取处理时限
     *
     * @param nextNode
     * @param time
     * @return
     */
    Date getDueDate(int nextNode, Date time);

    /**
     * 获取表单操作界面数据
     *
     * @param workId
     * @return
     */
    BusinessDataBO getBusinessData(String workId);

    /**
     * 根据OEMID获取主机厂级联关系
     *
     * @param oemId
     * @return
     */
    List<OemCascadePO> getOemCascade(String oemId);

    /**
     * 获取packType标识
     *
     * @param packType
     * @return
     */
    String getPackTypeId(String packType);

    /**
     * 保存勘测数据
     *
     * @param po
     * @return
     */
    boolean saveOrderSurvey(OrderSurveyPO po);

    /**
     * 保存安装数据
     *
     * @param po
     * @param submitUserName
     * @return
     */
    boolean saveOrderInstall(OrderInstallPO po, String submitUserName);

    /**
     * 获取流程用户组
     *
     * @return
     */
    List<BaseUserPO> getSuperUserByGroup();

    /**
     * 加载流程节点用户
     *
     * @param qo
     * @return
     */
    List<FlowNodeUserPO> getFlowNodeUserInfo(FlowNodeUserQo qo);

    /**
     * 获取工单信息
     *
     * @param id
     * @return
     */
    OrderPO getOrder(String id);

    /**
     * 通过车企安装单号获取工单
     * @param outOrderId
     * @return
     */
    OrderPO getOrderByOutOrderId(String outOrderId);

    /**
     * 获取勘测数据
     *
     * @param orderId
     * @return
     */
    OrderSurveyPO getOrderSurvey(String orderId);

    /**
     * 获取安装数据
     *
     * @param orderId
     * @return
     */
    OrderInstallPO getOrderInstall(String orderId);

    /**
     * 更新业务数据
     *
     * @param business
     */
    void updateBusinessData(BusinessDataBO business);

    /**
     * 加载区域信息==》mysql 递归查询不友善
     *
     * @return
     */
    Map<Integer, RegionInfoVO> getRegionInfo();

    /**
     * 获取工单信息
     *
     * @param id
     * @param infoEnum
     * @return
     */
    Map<String, Object> getOrderInfo(String id, OrderInfoEnum infoEnum);

    /**
     * 是否用户导出userPhone权限
     *
     * @param account
     * @return
     */
    boolean hasExportUserPhone(String account);


    /**
     * 通过workId获取轨迹
     *
     * @param workId
     * @return
     */
    List<TaskInfoResponse> getTrackByWorkId(String workId);

    /**
     * 订单安装项目表更新=>全量数据处理
     *
     * @param request
     */
    void saveInstallItem(LocalSubmitFlowBO request);

    /**
     * 保存附件
     *
     * @param files
     * @param type
     * @param thirdPartyId
     * @return
     */
    int saveFileItem(List<UploadFile> files, UploadFileType type, String thirdPartyId);

    /**
     * 保存报告
     *
     * @param files
     * @param type
     * @param thirdPartyId
     * @return
     */
    int saveReportItem(List<UploadFile> files, UploadFileType type, String thirdPartyId);

    /**
     * 获取短信推送数据
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<SendMessagePO> getSendMessageData(Date startTime, Date endTime);

    /**
     * 根据workId获取流程信息
     *
     * @param workId
     * @return
     */
    TaskInfoResponse getTaskByWorkId(String workId);


    /**
     * 同步Sap
     *
     * @param bo
     */
    void pushSapOrder(ManualSapBo bo);

    /**
     * 获取流程数据
     *
     * @param qo
     * @return
     */
    ResponseMessage2<FlowChartVO> getFlowChart(FlowChartQo qo);

    /**
     * 获取地市查询条件
     *
     * @param regionId
     * @return
     */
    String getRegionQo(String regionId);

    /**
     * 获取服务商有效合同
     *
     * @param supplierId
     * @return
     */
    SupplierContractVo getSupplierContract(int supplierId);

    /**
     * 获取pm用户
     *
     * @return
     */
    List<PmUserPO> getPmUser();

    /**
     * 获取可用安装服务商
     *
     * @return
     */
    List<UsableSupplierPO> getUsableSupplier();

    /**
     * 获取服务商接单信息
     *
     * @param supplierId
     * @param regionId
     * @return
     */
    List<SupplierReceivePO> getSupplierReceiveInfo(Integer supplierId, String regionId);

    /**
     * 写入接口监控日志
     *
     * @param po
     * @return
     */
    int addMonitorLog(InterfaceMonitorPO po);

    /**
     * 生成pdf文件
     * @param blockPairBo
     * @param response
     * @return
     */
    void getAutogeneratePdf(BlockPairBo blockPairBo, HttpServletResponse response);

    /**
     * 获取回访订单数据
     * @param orderBo
     * @return
     */
    List<VisitOrderVO> getVisitOrderDate(OrderBo orderBo);
}