package thyyxxk.webserver.service.datamodify;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.constants.Capacity;
import thyyxxk.webserver.dao.his.datamodify.InOrOutOfWarehouseDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.entity.datamodify.InOrOutOfWarehousePojo;
import thyyxxk.webserver.entity.datamodify.YpInDetl;
import thyyxxk.webserver.entity.datamodify.YpOutDetl;
import thyyxxk.webserver.utils.ResultVoUtil;
import thyyxxk.webserver.utils.TokenUtil;

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

/**
 * <p>
 * 描述： 药品入库或出库
 * </p>
 *
 * @author xc
 * @date 2021-06-01 14:07
 */
@Service
@Slf4j
public class InOrOutOfWarehouseService {

    private final InOrOutOfWarehouseDao dao;

    @Autowired
    public InOrOutOfWarehouseService(InOrOutOfWarehouseDao dao) {
        this.dao = dao;
    }

    /**
     * 根据入库单号 或者 入库时间 来查询数据
     *
     * @param param currentPage pageSize startTime endTime inDocuNo：入库单号
     * @return 返回分页的数据
     */
    public ResultVo<Map<String, Object>> queryRuKuXinXi(InOrOutOfWarehousePojo param) {
        IPage<InOrOutOfWarehousePojo> page = new Page<>(param.getCurrentPage(), param.getPageSize());
        List<YpInDetl> list = dao.queryRuKuXinXi(page, param);
        if (list.size() > 0) {
            return ResultVoUtil.success(getMap(page.getTotal(), list));
        }
        return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
    }

    /**
     * 封装返回 map 的类
     *
     * @param total 总条数
     * @param list  数据
     * @return 返回map数据
     */
    private Map<String, Object> getMap(long total, List<?> list) {
        Map<String, Object> map = new HashMap<>(Capacity.TWO);
        map.put("data", list);
        map.put("total", total);
        return map;
    }

    /**
     * 远程搜索：供应商、采购员、生产厂家
     *
     * @param pyCode 拼音编码
     * @param flag   标识 判断要搜索哪一个 1-供应商 2-采购员 3-生产厂家
     * @return 返回 code和 name 集合
     */
    public ResultVo<List<GetDropdownBox>> queryCode(String pyCode, Integer flag) {
        if (flag == 1) {
            //供应商
            return ResultVoUtil.success(dao.queryCode("yp_zd_supply", "%" + pyCode.toUpperCase() + "%"));
        } else if (flag == 2) {
            //采购员
            return ResultVoUtil.success(dao.queryCode("a_employee_mi", "%" + pyCode.toUpperCase() + "%"));
        } else if (flag == 3) {
            //生产厂家
            return ResultVoUtil.success(dao.queryCode("yp_zd_manufactory", "%" + pyCode.toUpperCase() + "%"));
        }
        return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
    }

    /**
     * 修改入库的信息
     *
     * @param param 修改的字段
     * @return 返回通知
     */
    public ResultVo<String> xiuGiRuKuXinXi(YpInDetl param) {
        dao.xiuGiRuKuXinXi(param);
        log.info("修改入库信息：{},修改人：{}", param, TokenUtil.getInstance().getTokenUserId());
        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "修改成功");
    }

    /* 出库的信息 */

    /**
     * 根据条件查询出库单号
     *
     * @param param currentPage pageSize startTime endTime drawNo：出库单号
     * @return 返回分页的数据
     */
    public ResultVo<Map<String, Object>> queryChuKuXinXi(InOrOutOfWarehousePojo param) {
        IPage<InOrOutOfWarehousePojo> page = new Page<>(param.getCurrentPage(), param.getPageSize());
        List<YpOutDetl> list = dao.queryChuKuXinXi(page, param);
        if (list.size() > 0) {
            return ResultVoUtil.success(getMap(page.getTotal(), list));
        }
        return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
    }

    /**
     * 获取科室和药房的 code name
     *
     * @return 返回数组
     */
    public ResultVo<Map<String, Object>> queryDeptCode() {
        Map<String, Object> map = new HashMap<>(Capacity.TWO);
        map.put("deptCode", dao.queryDeptCode());
        map.put("groupNo", dao.queryGroupNo());
        return ResultVoUtil.success(map);
    }

    /**
     * 修改出库的信息
     *
     * @param param 修改字段
     * @return 返回通知
     */
    public ResultVo<String> xiuGaiChuKuXinXi(YpOutDetl param) {
        log.info("修改出库信息：{},修改人：{}", param, TokenUtil.getInstance().getTokenUserId());
        dao.xiuGaiChuKu(param);
        dao.xiuGaiYaoFangRuKuXinXi(param);
        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "修改成功。");
    }

    /**
     * 删除出库的一条记录
     *
     * @param drawNo     出库号
     * @param chargeCode 药品编码
     * @param outSeri    序号
     * @param inDrawNo   入库单号
     * @return 返回提醒
     */
    public ResultVo<String> shanChuChuKuXinXi(String drawNo, String chargeCode, Integer outSeri, String inDrawNo) {
        if (dao.shanChuChuKuXinXin(drawNo, chargeCode, outSeri, inDrawNo) > 0) {
            log.info("删除出库信息：操作人：{}，出库号：{}，药品编码：{}，序号：{}，入库单号：{}", TokenUtil.getInstance().getTokenUserId(), drawNo, chargeCode, outSeri, inDrawNo);
            if (dao.shanChuYaoFangShuJu(drawNo, chargeCode, outSeri) == 0) {
                log.info("出库信息删除成功，但药房药品入库没有删除成功");
                return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "出库单删除成功，但药房药品入库没有删除成功<br />" +
                        "原因：<span style='color:red'>【出库单序号与药库入库单序号不一致】。</span>");
            }
            return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "删除成功。");
        }
        log.info("删除出库信息失败：操作人：{}，出库号：{}，药品编码：{}，序号：{}，入库单号：{}", TokenUtil.getInstance().getTokenUserId(), drawNo, chargeCode, outSeri, inDrawNo);
        return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "删除失败，原因：【修改了出库单号或序号，导致系统找不到指定的数据，解决方法重新查找对应的数据】");
    }
}
