consum-base/src/main/java/com/consum/base/controller/LWhFormTransferController.java
@@ -1,6 +1,7 @@
package com.consum.base.controller;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
@@ -9,29 +10,38 @@
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.fastjson.JSONObject;
import com.consum.base.pojo.*;
import com.consum.base.pojo.excel.ImportProcureOrderTemplate;
import com.consum.base.pojo.excel.LWhFormTransferTemplate;
import com.consum.base.pojo.query.WarehouseQry;
import com.consum.base.service.*;
import com.consum.base.util.DateUtil;
import com.consum.base.util.ExcelStyleUtil;
import com.consum.model.po.*;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import com.consum.base.BaseController;
import com.consum.base.core.WhBusinessEnum;
import com.consum.base.core.type.StatesType;
import com.consum.base.core.type.TransferStatesType;
import com.consum.base.core.utils.CommonUtil;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.pojo.GoodsUseRecordVO;
import com.consum.base.pojo.LWhFormTransferGoodsInfoParam;
import com.consum.base.pojo.RecordUserInfoVO;
import com.consum.base.pojo.UseRecordSkuVO;
import com.consum.base.pojo.dto.GoodsInfoDTO;
import com.consum.base.pojo.dto.UseRecordDTO;
import com.consum.base.pojo.excel.TransferExcelTemplate;
@@ -43,26 +53,12 @@
import com.consum.base.pojo.response.GoodsTemplateCountVO;
import com.consum.base.pojo.response.LWHFromTransferExtendVO;
import com.consum.base.pojo.response.TransferInfoVO;
import com.consum.base.service.BaseWarehouseService;
import com.consum.base.service.LGoodsUserRecordCoreService;
import com.consum.base.service.LWhFormTransferService;
import com.consum.base.service.LWhGoodsService;
import com.consum.base.service.LWhProcureModelService;
import com.consum.base.service.LWhProcureModelUserRecordService;
import com.consum.base.service.LWhProcureModelUserService;
import com.consum.base.service.core.LWhFormTransferCoreService;
import com.consum.model.po.BaseWarehouse;
import com.consum.model.po.FinSysTenantUser;
import com.consum.model.po.LWhFormTransfer;
import com.consum.model.po.LWhProcureModel;
import com.consum.model.po.LWhProcureModelUser;
import com.consum.model.po.LWhProcureModelUserRecord;
import com.iplatform.model.po.S_user_core;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.CollectionUtils;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.web.ResponseValue;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.util.ReflectUtil;
@@ -70,6 +66,7 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.multipart.MultipartFile;
/**
 * @Description 调拨管理
@@ -97,6 +94,14 @@
    private LWhGoodsService lWhGoodsService;
    @Autowired
    private BaseWarehouseService baseWarehouseService;
    @Autowired
    private FinSysTenantDepartmentService departmentService;
    @Autowired
    private BaseCategoryService baseCategoryService;
    @Autowired
    private BaseGoodsTemplateService baseGoodsTemplateService;
    @Autowired
    private BaseGoodsModelsService baseGoodsModelsService;
    /**
     * @Description 新增
@@ -104,6 +109,7 @@
    @ApiOperation(value = "单据新增", notes = "单据新增")
    @ApiImplicitParam(name = "param", value = "单据新增", required = true, dataType = "LWhFormTransferParam")
    @PostMapping("/add")
    @Transactional(rollbackFor = Exception.class)
    public ResponseValue add() throws Exception {
        LWhFormTransferParam param = CommonUtil.getObjFromReqBody(LWhFormTransferParam.class);
        LWhFormTransferParam param2 = new LWhFormTransferParam();
@@ -118,24 +124,31 @@
        if (CollectionUtils.isEmpty(transferGoods)) {
            return ResponseValue.error("调拨单不能为空");
        }
        long id = this.lWhFormTransferService.add(param, this.getSysInfo());
        long id = this.lWhFormTransferService.add(param, this.getSysInfo(), StrUtil.isEmpty(param.getProcureDoc()));
        if (id == -1L) {
            return ResponseValue.error("您不是库管员");
        }
        if (id == -2L) {
            return ResponseValue.error("仓库不存在");
        }
        Integer transferBusinessType = param.getTransferBusinessType();
        // 部门分发业务需要处理
        if (transferBusinessType == 1) {
        // 拆分 新逻辑
        if (transferBusinessType == 1 && !StrUtil.isEmpty(param.getProcureDoc())) {
            // 先出库,再入库
            // 出库前 设置出库仓库
            List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id);
            Set<Long> baseModelIds =
                modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
                    modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
            FinSysTenantUser sysTenantUser = this.getSysInfo();
            String agencyId = sysTenantUser.getTenantId();
            List<BaseWarehouse> baseWarehouseList =
                baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
                    baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
            Set<Long> wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet());
            // 通过调拨单中的型号id查询出该型号物品所在的仓库位置
            List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds);
            List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null);
            GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
            if (ObjectUtils.isEmpty(goodsInfoDTO)) {
                return ResponseValue.error("该型号没有库存可使用");
@@ -147,27 +160,160 @@
            lWhFormTransfer.setOutWarehouseId(wareHouseId);
            lWhFormTransfer.setOutWarehouseName(warehouseName);
            lWhFormTransferService.update(lWhFormTransfer);
            lWhFormTransferCoreService.doTransferOutPut(id, getCurrentUser());
            Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            if (l == -1L) {
                return ResponseValue.error("仓库数量不足");
            }
            lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName());
        }
        return ResponseValue.success();
    }
    public ResponseValue add2(LWhFormTransferParam param) throws Exception {
        S_user_core currentUser = this.getCurrentUser();
        if (currentUser == null) {
            return ResponseValue.error("登录用户信息不存在");
        }
        List<LWhFormTransferGoodsInfoParam> transferGoods = param.getTransferGoods();
        if (CollectionUtils.isEmpty(transferGoods)) {
            return ResponseValue.error("调拨单不能为空");
        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        long id = this.lWhFormTransferService.add(param, sysInfo, true);
        if (id == -1L) {
            return ResponseValue.error("您不是库管员");
        }
        if (id == -2L) {
            return ResponseValue.error("仓库不存在");
        }
        Integer transferBusinessType = param.getTransferBusinessType();
        // 部门分发业务需要处理
        // todo 拆分 新逻辑
        if (transferBusinessType == 1 && !StrUtil.isEmpty(param.getProcureDoc())) {
            // 先出库,再入库
            // 出库前 设置出库仓库
            List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id);
            Set<Long> baseModelIds =
                    modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
            FinSysTenantUser sysTenantUser = this.getSysInfo();
            String agencyId = sysTenantUser.getTenantId();
            List<BaseWarehouse> baseWarehouseList =
                    baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
            Set<Long> wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet());
            // 通过调拨单中的型号id查询出该型号物品所在的仓库位置
            List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null);
            GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
            if (ObjectUtils.isEmpty(goodsInfoDTO)) {
                return ResponseValue.error("该型号没有库存可使用");
            }
            Long wareHouseId = goodsInfoDTO.getWarehouseId();
            String warehouseName = goodsInfoDTO.getWarehouseName();
            LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id);
            lWhFormTransfer.setOutWarehouseId(wareHouseId);
            lWhFormTransfer.setOutWarehouseName(warehouseName);
            lWhFormTransferService.update(lWhFormTransfer);
            Long l = lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
            if (l == -1L) {
                return ResponseValue.error("仓库数量不足");
            }
            lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), param.getOperatorName());
        }
        return ResponseValue.success();
    }
    /**
     * 上传分发单(流程修改)
     *
     * @param idStr 调拨单id json
     * @return
     * @throws Exception
     */
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),})
    @Transactional(rollbackFor = Exception.class)
    @PostMapping("import")
    public ResponseValue upload(@RequestBody String idStr) throws Exception {
        Map<String, Object> map = JSONObject.parseObject(idStr, Map.class);
        String type = map.get("type").toString();
        Long id = Convert.toLong(map.get("idStr"));
        String procureDoc = map.get("procureDoc").toString();
        // [调拨]
        if ("0".equals(type)) {
            // 修改
            LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer();
            addLWhFormTransfer.setId(id);
            addLWhFormTransfer.setProcureDoc(procureDoc);
            int update = lWhFormTransferService.update(addLWhFormTransfer);
            if (update < 1) {
                return ResponseValue.error();
            }
            return ResponseValue.success();
        }
        // [分发]
        Long opTime = Convert.toLong(map.get("opTime"));
        // 修改表的文件逻辑
        LWHFromTransferExtendVO lwhFromTransferExtendVO = lWhFormTransferService.getById(id);
        // 修改
        LWhFormTransfer addLWhFormTransfer = new LWhFormTransfer();
        addLWhFormTransfer.setId(id);
        addLWhFormTransfer.setProcureDoc(procureDoc);
        addLWhFormTransfer.setInTime(opTime);
        addLWhFormTransfer.setOutputTime(opTime);
        int update = lWhFormTransferService.update(addLWhFormTransfer);
        if (update < 1) {
            return ResponseValue.error();
        }
        // 主分发逻辑
        // 先出库,再入库
        // 出库前 设置出库仓库
        List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.BUMENFENFA, id);
        Set<Long> baseModelIds =
                modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
        FinSysTenantUser sysTenantUser = this.getSysInfo();
        String agencyId = sysTenantUser.getTenantId();
        List<BaseWarehouse> baseWarehouseList =
                baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
        Set<Long> wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet());
        // 通过调拨单中的型号id查询出该型号物品所在的仓库位置
        List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, null);
        GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
        if (ObjectUtils.isEmpty(goodsInfoDTO)) {
            return ResponseValue.error("该型号没有库存可使用");
        }
        Long wareHouseId = goodsInfoDTO.getWarehouseId();
        String warehouseName = goodsInfoDTO.getWarehouseName();
        LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id);
        lWhFormTransfer.setOutWarehouseId(wareHouseId);
        lWhFormTransfer.setOutWarehouseName(warehouseName);
        lWhFormTransferService.update(lWhFormTransfer);
        lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.BUMENFENFA);
        lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), lwhFromTransferExtendVO.getOperatorName());
        return ResponseValue.success();
    }
    /**
     * @Description 列表查询(调拨明细)
     * @Author 卢庆阳
     * @Date 2023/10/30
     *       <p>
     *       1.查询调拨单
     *       <p>
     *       2.查询物品型号
     * <p>
     * 1.查询调拨单
     * <p>
     * 2.查询物品型号
     */
    @ApiOperation(value = "单据列表查询", notes = "单据列表查询")
    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页码", required = true, dataType = "int"),
        @ApiImplicitParam(name = "size", value = "每页条数", required = true, dataType = "int"),
        @ApiImplicitParam(name = "param", value = "条件参数", required = true, dataType = "TransferQry"),})
            @ApiImplicitParam(name = "size", value = "每页条数", required = true, dataType = "int"),
            @ApiImplicitParam(name = "param", value = "条件参数", required = true, dataType = "TransferQry"),})
    @GetMapping("/list")
    public ResponseValue queryFormTransferList() {
        TransferQry param = CommonUtil.getObjFromReq(TransferQry.class);
@@ -190,7 +336,7 @@
                // 查询型号数量
                List<GoodsTemplateCountVO> goodsTemplateCount =
                    lWhProcureModelService.getGoodsTemplateCountByBusinessId(item.getId());
                        lWhProcureModelService.getGoodsTemplateCountByBusinessId(item.getId());
                formTransferVO.setFromTransferTemplateInfoList(goodsTemplateCount);
                result.add(formTransferVO);
@@ -276,7 +422,7 @@
    @ApiOperation(value = "调拨入库", notes = "调拨入库")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),})
    @PostMapping("/income")
    public ResponseValue income(Long id) {
    public ResponseValue income(Long id) throws Exception {
        lWhFormTransferCoreService.doTransferInPut(id, getCurrentUser(), null);
        return ResponseValue.success();
    }
@@ -289,20 +435,20 @@
    @ApiOperation(value = "调拨出库", notes = "调拨出库")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),})
    @PostMapping("/output")
    public ResponseValue output(Long id) {
    public ResponseValue output(Long id) throws Exception {
        List<LWhProcureModel> modelByForm = lWhProcureModelService.getModelByForm(WhBusinessEnum.DIAOBO, id);
        Set<Long> baseModelIds =
            modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
                modelByForm.stream().map(LWhProcureModel::getBaseGoodsModelsId).collect(Collectors.toSet());
        FinSysTenantUser sysTenantUser = this.getSysInfo();
        String agencyId = sysTenantUser.getTenantId();
        List<BaseWarehouse> baseWarehouseList =
            baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
                baseWarehouseService.getBaseWareHouseList(Long.valueOf(agencyId), StatesType.NORMAL.getValue());
        Set<Long> wareHouseIds = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toSet());
        // 通过调拨单中的型号id查询出该型号物品所在的仓库位置
        List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds);
        List<GoodsInfoDTO> goodsInfoDTOS = lWhGoodsService.queryGoodsInfo(baseModelIds, wareHouseIds, 1);
        GoodsInfoDTO goodsInfoDTO = goodsInfoDTOS.stream().findFirst().orElse(null);
        if (ObjectUtils.isEmpty(goodsInfoDTO)) {
            return ResponseValue.error("该型号没有库存可使用");
@@ -314,32 +460,36 @@
        lWhFormTransfer.setOutWarehouseName(warehouseName);
        lWhFormTransferService.update(lWhFormTransfer);
        // lWhFormTransferCoreService.doTransferOutPut(id, getCurrentUser());
        lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser());
        lWhFormTransferCoreService.doTransferOutPutNew(id, getCurrentUser(), WhBusinessEnum.DIAOBO);
        return ResponseValue.success();
    }
    @ApiOperation(value = "调拨单导出", notes = "调拨单导出")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "调拨单id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "type", value = "导出类型 1 入库 2 出库", required = true, dataType = "Integer"),})
            @ApiImplicitParam(name = "type", value = "导出类型 1 入库 2 出库", required = true, dataType = "Integer"),})
    @GetMapping("/list/export")
    public ResponseValue<String> export(Long id, Integer type, HttpServletResponse response) throws Exception {
        TemplateExportParams params;
        String fileName;
        if (type == 1) {
        if (type == 0) {
            params = new TemplateExportParams("import/调拨入库单.xls");
            fileName = "调拨入库单";
        } else if (type == 1) {
            params = new TemplateExportParams("import/调拨入库单1.xls");
            fileName = "调拨入库单";
        } else {
            params = new TemplateExportParams("import/调拨出库单.xls");
            fileName = "调拨出库单";
        }
        params.setHeadingStartRow(2);
        params.setStyle(ExcelStyleUtil.class);
        List<TransferExcelTemplate> export = this.lWhFormTransferService.export(id, type);
        int countNum =
            export.stream().filter(item -> item.getNum() != null).mapToInt(TransferExcelTemplate::getNum).sum();
                export.stream().filter(item -> item.getNum() != null).mapToInt(TransferExcelTemplate::getNum).sum();
        double totalAmount = export.stream().filter(item -> item.getTotalAmount() != null)
            .mapToDouble(TransferExcelTemplate::getAmount).sum();
                .mapToDouble(TransferExcelTemplate::getAmount).sum();
        Optional<TransferExcelTemplate> first = export.stream().findFirst();
        TransferExcelTemplate entity = first.get();
        String businessFormCode = entity.getBusinessFormCode();
@@ -356,7 +506,7 @@
        map.put("totalAmount", totalAmount);
        Workbook workbook = ExcelExportUtil.exportExcel(params, TransferExcelTemplate.class, export, map);
        String filePath = downLoadExcel(fileName, response, workbook);
        String filePath = downLoadExcel(fileName, workbook);
        return ResponseValue.success("导出成功", filePath);
    }
@@ -385,7 +535,7 @@
            param.setOutAgencyId(Long.valueOf(tenantId));
        }
        GenericPager<Map<String, Object>> transferInfoDetailsVoGenericPager =
            this.lWhFormTransferService.queryTransferInfo(param);
                this.lWhFormTransferService.queryTransferInfo(param);
        return ResponseValue.success(transferInfoDetailsVoGenericPager);
    }
@@ -408,7 +558,7 @@
        }
        Map<Long, List<ProcureModelInfoParam>> collect = param.getRecordInfoList().stream()
            .collect(Collectors.groupingBy(ProcureModelInfoParam::getBaseGoodModelId));
                .collect(Collectors.groupingBy(ProcureModelInfoParam::getBaseGoodModelId));
        for (Map.Entry<Long, List<ProcureModelInfoParam>> entry : collect.entrySet()) {
            Long baseGoodModelId = entry.getKey();
@@ -441,7 +591,7 @@
                    // 设置一下在用数量
                    Long oldProcureModelId = item.getOldProcureModelId();
                    LWhProcureModelUser oldInfo =
                        lWhProcureModelUserService.get(new LWhProcureModelUser(oldProcureModelId));
                            lWhProcureModelUserService.get(new LWhProcureModelUser(oldProcureModelId));
                    lWhProcureModelUser.setUseCount(oldInfo.getUseCount());
                    procureModelUserList.add(lWhProcureModelUser);
                }
@@ -476,52 +626,52 @@
        }
        List<GoodsUseRecordVO> goodsUseRecordList = useRecordDTOList.stream()
            .collect(Collectors.groupingBy(UseRecordDTO::getId)).entrySet().stream().map(entry -> {
                Long id = entry.getKey();
                List<UseRecordDTO> useRecordList = entry.getValue();
                UseRecordDTO useRecordDto = useRecordList.get(0);
                .collect(Collectors.groupingBy(UseRecordDTO::getId)).entrySet().stream().map(entry -> {
                    Long id = entry.getKey();
                    List<UseRecordDTO> useRecordList = entry.getValue();
                    UseRecordDTO useRecordDto = useRecordList.get(0);
                GoodsUseRecordVO goodsUseRecordVO = new GoodsUseRecordVO();
                goodsUseRecordVO.setId(id);
                goodsUseRecordVO.setUpdateUserName(useRecordDto.getUpdateUserName());
                goodsUseRecordVO.setUpdateTime(useRecordDto.getUpdateTime());
                    GoodsUseRecordVO goodsUseRecordVO = new GoodsUseRecordVO();
                    goodsUseRecordVO.setId(id);
                    goodsUseRecordVO.setUpdateUserName(useRecordDto.getUpdateUserName());
                    goodsUseRecordVO.setUpdateTime(useRecordDto.getUpdateTime());
                List<UseRecordSkuVO> useRecordSkuList =
                    useRecordList.stream().collect(Collectors.groupingBy(UseRecordDTO::getProcureModelId)).values()
                        .stream().map(recordList -> {
                            UseRecordDTO useRecordDTO = recordList.get(0);
                            UseRecordSkuVO useRecordSkuVO = new UseRecordSkuVO();
                            useRecordSkuVO.setBaseGoodModelId(useRecordDTO.getBaseGoodsModelsId());
                            useRecordSkuVO.setBaseGoodModelName(useRecordDTO.getBaseGoodsModelsName());
                            useRecordSkuVO.setUnit(useRecordDTO.getUnit());
                            useRecordSkuVO.setProcureModelId(useRecordDTO.getProcureModelId());
                    List<UseRecordSkuVO> useRecordSkuList =
                            useRecordList.stream().collect(Collectors.groupingBy(UseRecordDTO::getProcureModelId)).values()
                                    .stream().map(recordList -> {
                                        UseRecordDTO useRecordDTO = recordList.get(0);
                                        UseRecordSkuVO useRecordSkuVO = new UseRecordSkuVO();
                                        useRecordSkuVO.setBaseGoodModelId(useRecordDTO.getBaseGoodsModelsId());
                                        useRecordSkuVO.setBaseGoodModelName(useRecordDTO.getBaseGoodsModelsName());
                                        useRecordSkuVO.setUnit(useRecordDTO.getUnit());
                                        useRecordSkuVO.setProcureModelId(useRecordDTO.getProcureModelId());
                            List<RecordUserInfoVO> recordUserInfoList = recordList.stream().map(userInfo -> {
                                RecordUserInfoVO recordUserInfoVO = new RecordUserInfoVO();
                                recordUserInfoVO.setOldProcureModelId(userInfo.getOldProcureModelId());
                                recordUserInfoVO.setUseName(userInfo.getUseName());
                                recordUserInfoVO.setPhone(userInfo.getPhone());
                                recordUserInfoVO.setNum(userInfo.getNum());
                                return recordUserInfoVO;
                            }).collect(Collectors.toList());
                                        List<RecordUserInfoVO> recordUserInfoList = recordList.stream().map(userInfo -> {
                                            RecordUserInfoVO recordUserInfoVO = new RecordUserInfoVO();
                                            recordUserInfoVO.setOldProcureModelId(userInfo.getOldProcureModelId());
                                            recordUserInfoVO.setUseName(userInfo.getUseName());
                                            recordUserInfoVO.setPhone(userInfo.getPhone());
                                            recordUserInfoVO.setNum(userInfo.getNum());
                                            return recordUserInfoVO;
                                        }).collect(Collectors.toList());
                            useRecordSkuVO.setRecordUserInfos(recordUserInfoList);
                            return useRecordSkuVO;
                        }).collect(Collectors.toList());
                                        useRecordSkuVO.setRecordUserInfos(recordUserInfoList);
                                        return useRecordSkuVO;
                                    }).collect(Collectors.toList());
                goodsUseRecordVO.setRecordSkuDtoList(useRecordSkuList);
                return goodsUseRecordVO;
                    goodsUseRecordVO.setRecordSkuDtoList(useRecordSkuList);
                    return goodsUseRecordVO;
            }).sorted(Comparator.comparing(GoodsUseRecordVO::getUpdateTime, Comparator.nullsFirst(Long::compareTo))
                .reversed())
            .collect(Collectors.toList());
                }).sorted(Comparator.comparing(GoodsUseRecordVO::getUpdateTime, Comparator.nullsFirst(Long::compareTo))
                        .reversed())
                .collect(Collectors.toList());
        return ResponseValue.success(goodsUseRecordList);
    }
    @ApiOperation(value = "查询部门下的分发单", notes = "查询部门下的分发单")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "agencyId", value = "机构id", required = true, dataType = "Long", paramType = "query")})
            @ApiImplicitParam(name = "agencyId", value = "机构id", required = true, dataType = "Long", paramType = "query")})
    @GetMapping("/query/transfList")
    public ResponseValue queryDepartmentTransferOrderList() {
@@ -530,4 +680,330 @@
        lWhFormTransferService.queryDepartmentTransferOrder();
        return ResponseValue.success(transferInfoVO);
    }
    /**
     * 分发单导入
     *
     * @param file
     * @return
     */
    @ApiOperation(value = "分发单导入", notes = "分发单导入")
    @PostMapping("/import2")
    public ResponseValue import2(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // 文件格式校验
//        if (!".xls".endsWith(originalFilename)) {
//            return ResponseValue.error("文件格式有误!");
//        }
        FinSysTenantUser sysInfo = this.getSysInfo();
        if (sysInfo == null) {
            return ResponseValue.error("当前登录用户为空");
        }
        try {
            EasyExcelFactory.read(file.getInputStream(), LWhFormTransferTemplate.class,
                    new AnalysisEventListener<LWhFormTransferTemplate>() {
                        /**
                         * 分发单主数据
                         */
                        final List<LWhFormTransferGoodsInfoParam> list = Lists.newArrayList();
                        /**
                         * 分发单的外层的主数据
                         */
                        final LWhFormTransferParam lWhFormTransferParam = new LWhFormTransferParam();
                        /**
                         * 行索引
                         */
                        Integer index = 0;
                        /**
                         * 表头信息
                         * @param headMap
                         * @param context
                         */
                        @Override
                        public void invokeHeadMap(Map headMap, AnalysisContext context) {
                            // 验证表头数量
                            logger.info("解析分发单的表头长度: {}", headMap.size());
                            if (headMap.size() != 15) {
                                throw new ExcelAnalysisException("上传的文件不符!");
                            }
                        }
                        /**
                         * 导入主(文件数据处理)
                         * @param data
                         * @param analysisContext
                         */
                        @Override
                        public void invoke(LWhFormTransferTemplate data, AnalysisContext analysisContext) {
                            index++;
                            String categoryOne = data.getCategoryOne();
                            String categoryTwo = data.getCategoryTwo();
                            String categoryThree = data.getCategoryThree();
                            if (StrUtil.isEmpty(categoryThree)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品类名称不能为空:" + categoryThree);
                            }
                            String goodsName = data.getGoodsName();
                            if (StrUtil.isEmpty(goodsName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,品名不能为空:" + goodsName);
                            }
                            String goodModelName = data.getGoodModelName();
                            if (StrUtil.isEmpty(goodModelName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,规格型号不能为空:" + goodModelName);
                            }
                            String unit = data.getUnit();
                            String type = data.getType();
                            if (StrUtil.isEmpty(type)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,管理分类不能为空:" + type);
                            }
                            String agencyName = data.getAgencyName();
                            if (StrUtil.isEmpty(agencyName)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,创建机构不能为空:" + agencyName);
                            }
                            //String warehouseName = data.getWarehouseName();
                            String supplierName = data.getSupplierName();
                            //String price = data.getPrice();
                            String num = data.getNum();
                            if (StrUtil.isEmpty(num)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,领用数量不能为空:" + num);
                            }
                            // 物品类型(自采集采)
                            //String goodsType = data.getGoodsType();
                            // 使用人部门
                            String userDepartment = data.getUserDepartment();
                            if (StrUtil.isEmpty(userDepartment)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,使用人部门不能为空:" + userDepartment);
                            }
                            // 填报人
                            String reportedBy = data.getReportedBy();
                            if (StrUtil.isEmpty(reportedBy)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,填报人不能为空:" + reportedBy);
                            }
                            // 使用人
                            String user = data.getUser();
                            if (StrUtil.isEmpty(user) && type.equals("A")) {
                                throw new ExcelAnalysisException("第" + index + "条数据,管理分类为A的物品,使用人不能为空:" + user);
                            }
                            // 联系电话
                            String userContactPhone = data.getUserContactPhone();
                            if (StrUtil.isEmpty(userContactPhone)) {
                                throw new ExcelAnalysisException("第" + index + "条数据,联系电话不能为空:" + userContactPhone);
                            }
                            // 第一次进来把外层的值设置一下
                            if (StrUtil.isEmpty(lWhFormTransferParam.getDepartmentName())) {
                                // 机构id (根据 机构名称和部门名称 查找对应的id)
                                FinSysTenantDepartment finSysTenantDepartment = departmentService.queryIdByTenDepName(agencyName, userDepartment);
                                if (finSysTenantDepartment == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "机构-部门未找到:[" + agencyName + "-" + userDepartment + "]");
                                }
                                lWhFormTransferParam.setTransferBusinessType(1);
                                lWhFormTransferParam.setDepartmentId(finSysTenantDepartment.getId());
                                lWhFormTransferParam.setDepartmentName(userDepartment);
                                lWhFormTransferParam.setOperatorName(reportedBy);
                                lWhFormTransferParam.setTel(0L);
                                lWhFormTransferParam.setCreateTime(DateUtil.getNowDate());
                                lWhFormTransferParam.setProcureDoc("");
                                lWhFormTransferParam.setOutAgencyId(finSysTenantDepartment.getTenantId());
                            }
                            // 查询分类id
                            BaseCategory baseCategory = baseCategoryService.getByCategoryByName(categoryThree);
                            if (baseCategory == null) {
                                throw new ExcelAnalysisException("第" + index + "条数据" + "此分类未找到:" + categoryThree);
                            }
                            Long categoryId = baseCategory.getId();
                            // 不同采集类型,不同筛选
                            Optional<LWhFormTransferGoodsInfoParam> optional = null;
                            // 筛选类型
                            optional = list.stream().filter(item -> item.getBaseCategoryId().equals(categoryId)).findFirst();
                            // 筛选物品名
                            Optional<LWhFormTransferGoodsInfoParam> optional2 =
                                    list.stream().filter(item -> item.getGoodsTemplateName().equals(goodsName)).findFirst();
                            // 数据第二层-物品的id
                            BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                            if (goodsTemplate == null) {
                                throw new ExcelAnalysisException("第" + index + "条数据" + "此物品未找到:" + goodsName);
                            }
                            if (optional.isPresent() && optional2.isPresent()) {
                                // 内层list(领用人)
                                List<LWhTransferModelParam> models3 = optional.get().getModels();
                                // 找型号名字一样的
                                Optional<LWhTransferModelParam> optional3 =
                                        models3.stream().filter(item -> item.getBaseGoodsModelsName().equals(goodModelName)).findFirst();
                                int counts = 0;
                                for (LWhTransferModelParam m : models3) {
                                    int addNum = 0;
                                    if (m.getNum() != null) {
                                        addNum = m.getCounts();
                                    }
                                    counts += addNum;
                                }
                                // 同一个型号的
                                if (optional3.isPresent()) {
                                    if ("A".equals(type)) {
                                        LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                        lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                        lWhProcureModelUserParam.setNowUserName(user);
                                        lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                        Integer counts1 = optional3.get().getCounts();
                                        Integer num1 = optional3.get().getNum();
                                        optional3.get().setCounts(Integer.valueOf(num) + counts1);
                                        optional3.get().setNum(Integer.valueOf(num) + num1);
                                        optional3.get().getProcureModelUserList().add(lWhProcureModelUserParam);
                                    } else {
                                        Integer counts1 = optional3.get().getCounts();
                                        Integer num1 = optional3.get().getNum();
                                        optional3.get().setCounts(Integer.valueOf(num) + counts1);
                                        optional3.get().setNum(Integer.valueOf(num) + num1);
                                    }
                                } else {
                                    // 此物品另外的规格型号
                                    LWhTransferModelParam lWhTransferModelParam = new LWhTransferModelParam();
                                    // 模板的id
                                    BaseGoodsModels selBaseGoodsModels = new BaseGoodsModels();
                                    selBaseGoodsModels.setModelName(goodModelName);
                                    selBaseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                    BaseGoodsModels selByModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(selBaseGoodsModels);
                                    if (selByModelNameAndGoodsTemplatesId == null) {
                                        throw new ExcelAnalysisException("第" + index + "条数据" + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                    }
                                    lWhTransferModelParam.setBaseGoodsModelsId(selByModelNameAndGoodsTemplatesId.getId());
                                    // 内层list的数量之和
                                    lWhTransferModelParam.setCounts(Integer.valueOf(num));
                                    // 模板名称
                                    lWhTransferModelParam.setBaseGoodsModelsName(goodModelName);
                                    List<LWhProcureModelUserParam> addLWhProcureModelUserParam = new ArrayList<>();
                                    LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                    lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                    // 查询库存数量
                                    Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId());
                                    if(nowNum<new Integer(num)){
                                        throw new ExcelAnalysisException("第" + index + "条数据" + "品名:[" + goodsName + "] 规格型号:[" + goodModelName + "] 库存数量不足:["+nowNum+"]");
                                    }
                                    lWhProcureModelUserParam.setNowUserName(user);
                                    lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                    addLWhProcureModelUserParam.add(lWhProcureModelUserParam);
                                    lWhTransferModelParam.setProcureModelUserList(addLWhProcureModelUserParam);
                                    optional.get().getModels().add(lWhTransferModelParam);
                                }
                            } else {
                                LWhFormTransferGoodsInfoParam lWhFormTransferGoodsInfoParam = new LWhFormTransferGoodsInfoParam();
                                // 分类id
                                lWhFormTransferGoodsInfoParam.setBaseCategoryId(categoryId);
                                // 数据第二层-物品的id
                                //BaseGoodsTemplate goodsTemplate = baseGoodsTemplateService.getByGoodsNameAndCategoryId(goodsName, categoryId);
                                BaseGoodsModels selBaseGoodsModels = new BaseGoodsModels();
                                selBaseGoodsModels.setModelName(goodModelName);
                                selBaseGoodsModels.setGoodsTemplatesId(goodsTemplate.getId());
                                BaseGoodsModels selByModelNameAndGoodsTemplatesId = baseGoodsModelsService.getByModelNameAndGoodsTemplatesId(selBaseGoodsModels);
                                if (selByModelNameAndGoodsTemplatesId == null) {
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "品名:" + goodsName + ",规格型号:" + goodModelName + "未找到");
                                }
                                // 物品的id :爱玛电动车
                                lWhFormTransferGoodsInfoParam.setBaseGoodsTemplateId(goodsTemplate.getId());
                                lWhFormTransferGoodsInfoParam.setGoodsTemplateName(goodsName);
                                // 内层
                                LWhTransferModelParam lWhTransferModelParam = new LWhTransferModelParam();
                                // 规格id
                                lWhTransferModelParam.setBaseGoodsModelsId(selByModelNameAndGoodsTemplatesId.getId());
                                // 新增的时候默认一条
                                lWhTransferModelParam.setCounts(new Integer(num));
                                lWhTransferModelParam.setNum(new Integer(num));
                                List<LWhProcureModelUserParam> lWhFormProcureGoodsInfoParam = new ArrayList<>();
                                LWhProcureModelUserParam lWhProcureModelUserParam = new LWhProcureModelUserParam();
                                lWhProcureModelUserParam.setGoodsNum(Integer.valueOf(num));
                                // 查询库存数量
                                Integer nowNum = selectAllNumber(lWhFormTransferParam.getOutAgencyId(), selByModelNameAndGoodsTemplatesId.getId());
                                if(nowNum<new Integer(num)){
                                    throw new ExcelAnalysisException("第" + index + "条数据 " + "品名:[" + goodsName + "] 规格型号:[" + goodModelName + "] 库存数量不足:["+nowNum+"]");
                                }
                                lWhProcureModelUserParam.setNowUserName(user);
                                lWhProcureModelUserParam.setNowUserPhone(new Long(userContactPhone));
                                lWhFormProcureGoodsInfoParam.add(lWhProcureModelUserParam);
                                lWhTransferModelParam.setProcureModelUserList(lWhFormProcureGoodsInfoParam);
                                lWhTransferModelParam.setBaseGoodsModelsName(goodModelName);
                                List<LWhTransferModelParam> lWhTransferModelParams = new ArrayList<>();
                                lWhTransferModelParams.add(lWhTransferModelParam);
                                lWhFormTransferGoodsInfoParam.setModels(lWhTransferModelParams);
                                lWhFormTransferGoodsInfoParam.setType(type);
                                list.add(lWhFormTransferGoodsInfoParam);
                            }
                        }
                        /**
                         * 分发单导入主方法
                         * @param analysisContext
                         */
                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            lWhFormTransferParam.setTransferGoods(list);
                            long id = IdUtil.generateId();
                            //lWhFormTransferParam.setProcureDoc("[{\"fileType\":\"png\",\"id\":\"883654049218335\",\"name\":\"微信截图_20240426143552.png\",\"url\":\"http://172.16.60.172:8083/lowConsum/file/2024/5/883654049218335.png\",\"path\":\"2024/5/883654049218335.png\",\"attSize\":6772}]");
                            lWhFormTransferParam.setProcureDoc("-");
                            lWhFormTransferParam.setId(id);
                            String jsonString = JSONObject.toJSONString(lWhFormTransferParam);
                            logger.info("导入分发单json数据 --------------------");
                            logger.info(jsonString);
                            // 分发单据
                            try {
                                ResponseValue responseValue = add2(lWhFormTransferParam);
                                logger.info(responseValue.toString());
                            } catch (Exception e) {
                                e.printStackTrace();
                                throw new RuntimeException(e);
                            }
                        }
                        @Override
                        public void onException(Exception exception, AnalysisContext analysisContext) throws Exception {
                            if (exception instanceof ExcelDataConvertException) {
                                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
                                Integer row = excelDataConvertException.getRowIndex() + 1;
                                Integer column = excelDataConvertException.getColumnIndex() + 1;
                                throw new ExcelAnalysisException("第" + row + "行,第" + column + "列解析异常,请正确填写");
                            } else {
                                throw new ExcelAnalysisException(exception.getMessage());
                            }
                        }
                    }).sheet(0).doRead();
        } catch (ExcelAnalysisException e) {
            return ResponseValue.error(e.getMessage());
        } catch (RuntimeException e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseValue.error("系统错误");
        }
        return ResponseValue.success("导入成功!");
    }
    /**
     * 查询库存Id
     * @param agencyId
     * @param baseGoodsModelsId
     * @return
     */
    public Integer selectAllNumber(Long agencyId,Long baseGoodsModelsId) {
        WarehouseQry warehouseQry = new WarehouseQry();
        warehouseQry.setAgencyId(agencyId);
        warehouseQry.setBaseGoodsModelsId(baseGoodsModelsId);
        List<BaseWarehouse> baseWarehouseList =
                baseWarehouseService.getBaseWareHouseList(agencyId, StatesType.NORMAL.getValue());
        List<Long> warehouseIdList = baseWarehouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toList());
        Integer warehouseType = warehouseQry.getWarehouseType();
        Integer states = warehouseQry.getStates();
        Integer buyType = warehouseQry.getBuyType();
        // 调拨时只查机构类型的集采仓库库存
        // 部门分发时不分机构和部门,因为调拨进来的物品也算在库存里只是类型为部门,同样检视所有仓库该型号的数量
        int num = lWhGoodsService.queryGoodsModelInWareHouseNum(warehouseType, warehouseIdList, baseGoodsModelsId,
                states, buyType);
        return num;
    }
}