package com.sdtool.common.api;

import com.sdtool.common.entity.base.ProcessSearchItem;
import com.sdtool.common.entity.base.ScriptContent;
import com.sdtool.common.entity.doc.BusinessScript;
import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.system.CompanyInfo;
import com.sweetfish.service.RetResult;
import com.sweetfish.source.PageFlipper;
import com.sweetfish.util.AutoLoad;
import org.rex.RMap;

import java.util.List;

/**
 * Created by jlutt on 2020-07-28
 * 基础档案
 * 注意档案服务必须保证至少有一个和业务类服务order或者施工单在一个进程内
 * 这样脚本才能返回
 *
 * @author jlutt
 */
@AutoLoad(false)
public interface DocInfoService extends ScriptService {

    //region 业务脚本

    /**
     * 从redis中按code获取脚本
     * 脚本数据量不会太大，维护从数据库中获取即可，但redis中会存有code对应的信息，用于其他业务快速使用
     *
     * @param code         脚本编码
     * @param supplierCode 分表
     * @return 脚本信息
     */
    BusinessScript getRedisBusinessScript(String code, long supplierCode);

    /**
     * 从redis中获取脚本名称
     *
     * @param code         脚本编码
     * @param supplierCode 分表
     * @return 脚本名称
     */
    String getRedisBusinessScriptName(String code, long supplierCode);

    /**
     * 分页获取业务脚本列表
     * 从数据库中获取数据
     *
     * @param searchData  查询条件
     * @param pageFlipper 分页信息
     * @return 脚本列表
     */
    @SuppressWarnings({"rawtypes"})
    RMap getBusinessScriptList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 从code获取业务脚本信息
     *
     * @param code         脚本编码
     * @param supplierCode 分表
     * @return 脚本信息
     */
    @SuppressWarnings({"rawtypes"})
    RMap getBusinessScriptInfo(String code, String dataSourceId, long supplierCode);

    /**
     * 增加业务脚本
     *
     * @param businessScript
     * @param currentUser
     * @param dataSourceId
     * @param supplierCode
     */
    int addBusinessScriptLocal(BusinessScript businessScript, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 增加业务脚本
     *
     * @param businessScript
     * @param currentUser
     * @return
     */
    @SuppressWarnings({"rawtypes"})
    RMap addBusinessScript(BusinessScript businessScript, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改业务脚本
     *
     * @param businessScript
     * @param currentUser
     * @return
     */
    @SuppressWarnings({"rawtypes"})
    RMap updateBusinessScript(BusinessScript businessScript, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 启用、禁用业务脚本
     *
     * @param businessScript
     * @param currentUser
     * @return
     */
    @SuppressWarnings({"rawtypes"})
    RMap voidBusinessScript(BusinessScript businessScript, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取业务脚本脚本内容
     *
     * @param code 脚本编号
     * @return 脚本内容
     */
    RetResult<ScriptContent> getBusinessScriptContent(String code, String dataSourceId, long supplierCode);

    /**
     * 编译业务脚本脚本
     *
     * @param script
     * @return
     */
    @SuppressWarnings({"rawtypes"})
    RMap compileBusinessScriptContent(ScriptContent script, String dataSourceId, long supplierCode);

    /**
     * 存储业务脚本脚本
     *
     * @param script
     * @return
     */
    int saveBusinessScriptContent(ScriptContent script, boolean clearCache, String dataSourceId, long supplierCode, ERPTokenUser currentUser);

    //endregion

    //region 分厂档案
    /**
     * 从id获取分厂信息信息
     * @param id    id
     * @return 分厂对象
     */
    CompanyInfo getCompanyInfo(long id, long supplierCode);

    /**
     * 从redis中获取分厂信息
     * @param id            id
     * @param supplierCode  分表
     * @return 分行名
     */
    String getRedisCompanyInfoName(long id, long supplierCode);

    /**
     * 分页获取分厂信息列表
     * 从数据库中获取数据
     * @param searchData    查询条件
     * @param pageFlipper   分页
     * @return  分厂列表
     */
    @SuppressWarnings({"rawtypes"})
    RetResult<List<CompanyInfo>> getCompanyInfoList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 获取所有的分厂信息，供下拉方式选择
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 分厂列表
     */
    RetResult<List<CompanyInfo>> getAllCompanyInfoList(String dataSourceId, long supplierCode);

    /**
     * 增加分厂信息
     * @param companyInfo   分厂对象
     * @param currentUser   当前用户
     * @return 成功失败
     */
    RetResult<CompanyInfo> addCompanyInfo(CompanyInfo companyInfo, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改分厂信息
     * @param companyInfo   分厂对象
     * @param currentUser   当前用户
     * @return 成功失败
     */
    RetResult<CompanyInfo> updateCompanyInfo(CompanyInfo companyInfo, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 启用、禁用分厂信息
     * @param companyInfo   分厂对象
     * @param currentUser   当前用户
     * @return  成功失败
     */
    RetResult<CompanyInfo> voidCompanyInfo(CompanyInfo companyInfo, ERPTokenUser currentUser, String dataSourceId, long supplierCode);
    //endregion
}
