package com.sptg.estate.api.feigns;

import com.baomidou.mybatisplus.plugins.Page;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.estate.api.dto.UnitDto;
import com.sptg.estate.api.entity.Unit;
import com.sptg.estate.api.feigns.fallback.UnitFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * title: UnitFeign
 * package: com.sptg.estate.api.feigns.fallback
 * description: 单元 服务接口
 *
 *
 *
 */
@FeignClient(value = "smart-house-estate",fallbackFactory = UnitFeignFallbackFactory.class)
public interface UnitFeign {

    /**
     * 功能描述:单元列表查询（含分页）
     * @param unitDto 单元业务对象（含分页及查询条件）
     * @return  ResultBean<Page<Unit>>
     *
     *
     */
    @PostMapping(value = "/unit/showUnitList")
    ResultBean<Page<Unit>> showUnitList(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:新增单元
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/addUnit")
    ResultBean<UnitDto> addUnit(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据Id查找单元
     * @param id 必填
     * @return Unit
     *
     *
     */
    @GetMapping(value = "/unit/findUnitById/{id}")
    Unit findUnitById(@PathVariable(value = "id")Long id);

    /**
     * 功能描述:编辑单元
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/updateUnit")
    ResultBean<Boolean> updateUnit(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:删除单元
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/deleteUnit")
    ResultBean<Boolean> deleteUnit(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:单元放入垃圾箱
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/trashOrRecover")
    ResultBean<Boolean> trashOrRecover(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:批量删除单元
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/deleteUnitList")
    ResultBean<Boolean> deleteUnitList(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据位置查找单元
     * @param unitDto 单元业务对象
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/findListByPosition")
    ResultBean<Unit> findListByPosition(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据父节点查找单元
     * @param unitDto 单元业务对象
     * @return  List<Unit>
     *
     *
     */
    @PostMapping(value = "/unit/findListByPid")
    ResultBean<Unit> findListByPid(@RequestBody UnitDto unitDto);

    /**
     * 功能描述: 根据小区Id差单元列表
     * @param xqId 小区Id,机构表的Id
     * @return List<Unit>
     *
     *
     */
    @GetMapping(value = "/unit/getListByXqId/{xqId}")
    List<Unit> getListByXqId(@PathVariable(value = "xqId") Long xqId);

    /**
     * 功能描述: 根据单元Id列表 查询单元信息
     * @param dyIdList 单元Id列表
     * @return List<Unit>
     *
     *
     */
    @PostMapping(value = "/unit/getListByIdList")
    List<Unit> getListByIdList(@RequestBody List<Long> dyIdList);

    @PostMapping(value = "/unit/getListByIdListAndUnitName")
    List<Unit> getListByIdListAndUnitName(@RequestBody List<Long> dyIdList,@RequestParam("unitName") String unitName);

    /**
     * 功能描述:导入单元
     * @param unitDto 单元业务传输对象集合
     * @return ResultBean<Boolean>
     *
     *
     */
    @PostMapping(value = "/unit/importUnitList")
    ResultBean<Boolean> importUnitList(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据位置查询单元数量
     * @param unitDto
     * {
     *    orgPosition : 位置信息
     * }
     * @return ResultBean<Map<String,Integer>>
     *
     *
     */
    @PostMapping(value = "/unit/getUnitAccount")
    ResultBean<Map<String,Integer>> getUnitAccount(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据位置查询单元数量
     * @param unitDto
     * {
     *    orgPosition : 位置信息
     * }
     * @return int
     *
     *
     */
    @PostMapping(value = "/unit/getUnitCount")
    int getUnitCount(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据条件查询单元数量
     * @param unitDto 单元业务对象
     * @return int 数量
     *
     *
     */
    @PostMapping(value = "/unit/findUnitByCondition")
    int findUnitByCondition(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:根据单元名称和编号查询单元
     * @param unitDto 单元业务对象
     * @return Unit
     *
     *
     */
    @PostMapping(value = "/unit/findUnitByNameAndNumber")
    Unit findUnitByNameAndNumber(@RequestBody UnitDto unitDto);

    /**
     * 功能描述:导入生成单元
     * @param unit 单元对象
     * @return Unit
     *
     *
     */
    @PostMapping(value = "/unit/addUnitByImport")
    Unit addUnitByImport(@RequestBody Unit unit);

    /**
     * 根据单元编号获取单元信息
     * @param xqId 小区Id
     * @param unitNumber 单元编号
     * @return Unit
     */
    @GetMapping(value = "/unit/getByUnitNumberAndXqId")
    Unit getByUnitNumberAndXqId(
            @RequestParam(value = "xqId")Long xqId,
            @RequestParam(value = "unitNumber")String unitNumber);

    @PostMapping(value = "/unit/updateEntity")
    boolean updateEntity(@RequestBody Unit unit);

    @PostMapping(value = "/unit/updateUnitList")
    boolean updateUnitList(@RequestBody List<Unit> unitList);

    /**
     * 功能描述: 根据名称模糊查询
     * @param dto
     * @return List<Unit>
     *
     */
    @PostMapping(value = "/unit/getListByLikeName")
    List<Unit> getListByLikeName(@RequestBody UnitDto dto);

    /**
     * 根据原数据的Id获取单元信息
     * @param oldId java.lang.String
     * @return com.sptg.estate.api.entity.Unit
     */
    @GetMapping(value = "/unit/getByOldId/{oldId}")
    Unit getByOldId(@PathVariable(value = "oldId") String oldId);

    /**
     * 功能描述: 根据单元编号查询
     * @param unitNumber
     * @return List<Unit>
     *
     */
    @GetMapping(value = "/unit/getByUnitNumber/{unitNumber}")
    Unit getByUnitNumber(@PathVariable(value = "unitNumber") String unitNumber);

    /**
     * 功能描述: 新增新邻单元
     * @param unit
     * @return Boolean
     *
     */
    @GetMapping(value = "/unit/addUnitBySync")
    int addUnitBySync(Unit unit);

    @GetMapping(value = "/unit/getListByBuildingId")
    List<Unit> getListByBuildingId(@RequestParam(value = "buildingId") Long buildingId);

    @PostMapping(value = "/unit/getListByCondition")
    List<Unit> getListByCondition(@RequestBody UnitDto unitDto);
}
