黎星凯
2024-05-08 b4adff68a07b783fc90da1c9370d8be5f383e700
consum-base/src/main/java/com/consum/base/service/impl/LWhFormTransferServiceImpl.java
@@ -1,30 +1,52 @@
package com.consum.base.service.impl;
import static com.walker.db.Sorts.DESC;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import com.consum.base.core.CodeGeneratorEnum;
import com.consum.base.core.CodeGeneratorService;
import com.consum.base.core.type.CategoryType;
import com.consum.base.core.type.StatesType;
import com.consum.base.core.type.TransferBusinessType;
import com.consum.base.core.type.TransferStatesType;
import com.consum.base.core.type.WareHouseType;
import com.consum.base.core.utils.CurrencyUtil;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.core.utils.MapUtils;
import com.consum.base.core.utils.MapperUtil;
import com.consum.base.pojo.LWhFormTransferGoodsInfoParam;
import com.consum.base.pojo.LWhProcureModelUserParam;
import com.consum.base.pojo.LWhTransferModelParam;
import com.consum.base.pojo.dto.GoodModelInfoDTO;
import com.consum.base.pojo.excel.TransferExcelTemplate;
import com.consum.base.pojo.query.TransferQry;
import com.consum.base.pojo.request.LWhFormTransferParam;
import com.consum.base.pojo.response.DepartGoodsUseInfo;
import com.consum.base.pojo.response.FormTransferGoodsVO;
import com.consum.base.pojo.response.GoodsModelVO;
import com.consum.base.pojo.response.GoodsTemplateInfoVO;
import com.consum.base.pojo.response.LWHFromTransferExtendVO;
import com.consum.base.service.BaseGoodsModelsServiceImpl;
import com.consum.base.service.BaseWarehouseManagerService;
import com.consum.base.service.BaseWarehouseServiceImpl;
import com.consum.base.service.FinSysTenantServiceImpl;
import com.consum.base.service.LWhFormOutputServiceImpl;
import com.consum.base.service.BaseWarehouseService;
import com.consum.base.service.FinSysTenantService;
import com.consum.base.service.LWhFormTransferService;
import com.consum.base.service.LWhGoodsService;
import com.consum.base.service.LWhProcureModelService;
import com.consum.base.service.LWhProcureModelUserRecordServiceImpl;
import com.consum.base.service.LWhProcureModelUserServiceImpl;
import com.consum.base.service.LWhProcureModelUserRecordService;
import com.consum.base.service.LWhProcureModelUserService;
import com.consum.model.po.BaseWarehouse;
import com.consum.model.po.BaseWarehouseManager;
import com.consum.model.po.FinSysTenant;
@@ -34,19 +56,9 @@
import com.consum.model.po.LWhProcureModelUser;
import com.consum.model.po.LWhProcureModelUserRecord;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.service.BaseServiceImpl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
/**
 * @Description 调拨管理
@@ -57,126 +69,129 @@
public class LWhFormTransferServiceImpl extends BaseServiceImpl implements LWhFormTransferService {
    @Autowired
    private BaseWarehouseServiceImpl baseWarehouseService;
    private BaseWarehouseService baseWarehouseService;
    @Autowired
    private CodeGeneratorService codeGeneratorService;
    @Autowired
    private FinSysTenantServiceImpl finSysTenantService;
    private FinSysTenantService finSysTenantService;
    @Autowired
    private LWhGoodsService lWhGoodsService;
    @Autowired
    private LWhProcureModelService lWhProcureModelService;
    @Autowired
    private LWhFormOutputServiceImpl lWhFormOutputService;
    @Autowired
    private BaseGoodsModelsServiceImpl baseGoodsModelsService;
    @Autowired
    private LWhProcureModelUserServiceImpl lWhProcureModelUserService;
    private LWhProcureModelUserService lWhProcureModelUserService;
    @Autowired
    private LWhProcureModelUserRecordServiceImpl lWhProcureModelUserRecordService;
    private LWhProcureModelUserRecordService lWhProcureModelUserRecordService;
    @Autowired
    private BaseWarehouseManagerService baseWarehouseManagerService;
    private static String QUERY_FORM_TRANSFER_LIST = "SELECT ft.* FROM l_wh_form_transfer ft "
    private static final String QUERY_FORM_TRANSFER_LIST = "SELECT DISTINCT ft.* FROM l_wh_form_transfer ft "
        + "left join L_WH_PROCURE_MODEL pm on pm.BUSINESS_ID = ft.id "
        + "LEFT JOIN BASE_GOODS_MODELS bgm ON pm.BASE_GOODS_MODELS_ID=bgm.ID "
        + "LEFT JOIN BASE_GOODS_TEMPLATE bgt ON bgm.GOODS_TEMPLATES_ID=bgt.id WHERE 1 = 1 ";
    /**
     * @Description 新增
     * @Author 卢庆阳
     * @Date 2023/10/30
     */
    public long add(LWhFormTransferParam param, FinSysTenantUser sysInfo) throws Exception {
        //1.新增调拨单记录
    @Transactional(rollbackFor = Exception.class)
    public long add(LWhFormTransferParam param, FinSysTenantUser sysInfo,boolean isHaveDoc) throws Exception {
        // 1.新增调拨单记录
        LWhFormTransfer lWhFormTransfer = new LWhFormTransfer();
        //调拨单id
        // 调拨单id
        long lWhFormTransferId = IdUtil.generateId();
        lWhFormTransfer.setId(lWhFormTransferId);
        Integer businessType = param.getTransferBusinessType();
        // 单据类型。0仓库调拨;1部门分发;2部门物品回退
        // TODO 枚举字典
        // 单据类型。0仓库调拨;1部门分发
        lWhFormTransfer.setBusinessType(businessType);
        CodeGeneratorEnum codeGeneratorEnum = null;
        if (businessType == 0) {
        if (businessType == TransferBusinessType.STOCK_TRANSFER.getValue()) {
            codeGeneratorEnum = CodeGeneratorEnum.Transfer;
        } else if (businessType == 1) {
        } else if (businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue()) {
            codeGeneratorEnum = CodeGeneratorEnum.Distribute;
        } else if (businessType == 2) {
            codeGeneratorEnum = CodeGeneratorEnum.GOBACK;
        }
        lWhFormTransfer.setBusinessFormCode(codeGeneratorService.createBusinessFormCode(codeGeneratorEnum));
        Long warehouseId = param.getInWarehouseId();
        // 调拨类型单据
        if (businessType == 0) {
            //入库仓库为当前用户的默认仓库
        if (businessType == TransferBusinessType.STOCK_TRANSFER.getValue()) {
            // 入库仓库为当前用户的默认仓库中的第一个
            String tenantId = sysInfo.getTenantId();
            String tenantName = sysInfo.getTenantName();
            BaseWarehouse warehouse = baseWarehouseService.getDefaultWarehouseByAgencyId(Long.valueOf(tenantId));
            BaseWarehouse warehouse = baseWarehouseService.getWarehouseByAgencyId(Long.valueOf(tenantId), null);
            if (warehouse == null) {
                log.error("仓库不存在");
                throw new Exception("仓库不存在");
                //throw new Exception("仓库不存在");
                return -2L;
            }
            lWhFormTransfer.setInWarehouseId(warehouse.getId());
            lWhFormTransfer.setInWarehouseName(warehouse.getWarehouseName());
            lWhFormTransfer.setInAgencyId(Long.valueOf(tenantId));
            lWhFormTransfer.setInAgencyName(tenantName);
        }
        //当业务类型为部门分发时 添加部门分发记录和使用人
        if (businessType == 1) {
            //部门分发类型 出库仓库类型0机构1部门
            //从当前登录库管人从库中出库,入到所选部门的下
        // 当业务类型为部门分发时 添加部门分发记录和使用人
        if (businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue()) {
            // 部门分发类型 出库仓库类型0机构1部门
            // 从当前登录库管人从库中出库,入到所选部门的下
            //查询库管员信息和相关仓库
            Long id = sysInfo.getId();
            // 查询库管员信息和相关仓库
            Long sysUserId = sysInfo.getSysUserId();
            BaseWarehouseManager manager = new BaseWarehouseManager();
            manager.setManagerId(id);
            List<BaseWarehouseManager> managerList = baseWarehouseManagerService.selectAll(manager);
            manager.setManagerId(sysUserId);
            List<BaseWarehouseManager> managerList = baseWarehouseManagerService.select(manager);
            if (CollectionUtils.isEmpty(managerList)) {
                log.error("该用户不是库管员");
                throw new Exception("该用户不是库管员");
                //throw new Exception("该用户不是库管员");
                return -1L;
            }
            Optional<BaseWarehouseManager> first = managerList.stream().findFirst();
            if (first.isPresent()) {
                BaseWarehouseManager baseWarehouseManager = first.get();
                Long baseWarehouseId = baseWarehouseManager.getBaseWarehouseId();
                BaseWarehouse baseWarehouse = new BaseWarehouse();
                baseWarehouse.setId(baseWarehouseId);
                BaseWarehouse warehouse = baseWarehouseService.get(baseWarehouse);
            BaseWarehouseManager baseWarehouseManager = managerList.stream().findFirst().orElse(null);
            Long baseWarehouseId = baseWarehouseManager.getBaseWarehouseId();
            BaseWarehouse baseWarehouse = new BaseWarehouse();
            baseWarehouse.setId(baseWarehouseId);
            BaseWarehouse warehouse = baseWarehouseService.get(baseWarehouse);
                lWhFormTransfer.setInWarehouseType(1);
                lWhFormTransfer.setInWarehouseId(param.getDepartmentId());
                lWhFormTransfer.setInWarehouseName(param.getDepartmentName());
                lWhFormTransfer.setInOperatorName(param.getOperatorName());
            lWhFormTransfer.setInWarehouseType(WareHouseType.DEPARTMENT.getValue());
            lWhFormTransfer.setInWarehouseId(param.getDepartmentId());
            lWhFormTransfer.setInWarehouseName(param.getDepartmentName());
            lWhFormTransfer.setInOperatorName(param.getOperatorName());
            if(!isHaveDoc){
                lWhFormTransfer.setInTime(param.getCreateTime());
                lWhFormTransfer.setOutWarehouseType(0);
                lWhFormTransfer.setOutWarehouseId(warehouse.getId());
                lWhFormTransfer.setOutWarehouseName(warehouse.getWarehouseName());
                lWhFormTransfer.setOutOperatorId(sysInfo.getId());
                lWhFormTransfer.setOutOperatorName(sysInfo.getUserName());
                lWhFormTransfer.setOutputTime(param.getCreateTime());
                lWhFormTransfer.setTel(param.getTel());
            }
            lWhFormTransfer.setOutWarehouseType(WareHouseType.TENANT.getValue());
            lWhFormTransfer.setOutWarehouseId(warehouse.getId());
            lWhFormTransfer.setOutWarehouseName(warehouse.getWarehouseName());
            lWhFormTransfer.setOutOperatorId(sysInfo.getId());
            lWhFormTransfer.setOutOperatorName(sysInfo.getUserName());
            if(!isHaveDoc) {
                lWhFormTransfer.setOutputTime(param.getCreateTime());
            }
            lWhFormTransfer.setTel(param.getTel());
        }
        //根据机构id查询调拨机构
        // 根据机构id查询调拨机构
        FinSysTenant finSysTenant = finSysTenantService.get(new FinSysTenant(param.getOutAgencyId()));
        if (finSysTenant == null) {
            log.error("调拨机构不存在");
            throw new Exception("调拨机构不存在");
        }
        lWhFormTransfer.setOutAgencyId(finSysTenant.getId());
        Long outAgencyId = finSysTenant.getId();
        lWhFormTransfer.setOutAgencyId(outAgencyId);
        lWhFormTransfer.setOutAgencyName(finSysTenant.getName());
        lWhFormTransfer.setOperatorId(sysInfo.getId());
        lWhFormTransfer.setOperatorName(sysInfo.getUserName());
        lWhFormTransfer.setCreateTime(param.getCreateTime());
        //0=待出库;1=待接收;2=已入库库:4=已撤销
        lWhFormTransfer.setStates(0);
        // 0=待出库;1=待接收;2=已入库库:4=已撤销
        lWhFormTransfer.setStates(TransferStatesType.OUT_PENDING.getValue());
        lWhFormTransfer.setProcureDoc(param.getProcureDoc());
        int flag1 = this.insert(lWhFormTransfer);
@@ -184,9 +199,26 @@
            log.error("新增调拨单失败");
        }
        //2.新增物品型号记录
        // 2.新增物品型号记录
        List<LWhFormTransferGoodsInfoParam> transferGoods = param.getTransferGoods();
        List<LWhProcureModel> modelList = new ArrayList<>();
        // 判断添加一次使用人记录
        List<LWhFormTransferGoodsInfoParam> recordType = transferGoods.stream()
            .filter(
                item -> businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue() && item.getModels().stream()
                    .anyMatch(model -> baseGoodsModelsService.queryGoodsModelInfo(model.getBaseGoodsModelsId()).stream()
                        .findFirst().orElse(null).get("type").equals(CategoryType.TYPE_A.getValue())))
            .collect(Collectors.toList());
        LWhProcureModelUserRecord lWhProcureModelUserRecord = new LWhProcureModelUserRecord();
        if (!CollectionUtils.isEmpty(recordType)) {
            lWhProcureModelUserRecord.setId(IdUtil.generateId());
            lWhProcureModelUserRecord.setTransBusinessId(lWhFormTransferId);
            lWhProcureModelUserRecord.setOperatorId(sysInfo.getId());
            lWhProcureModelUserRecord.setOperatorName(sysInfo.getUserName());
            lWhProcureModelUserRecord.setDealTime(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
            lWhProcureModelUserRecordService.insert(lWhProcureModelUserRecord);
        }
        for (LWhFormTransferGoodsInfoParam transferGoodsInfo : transferGoods) {
            for (LWhTransferModelParam model : transferGoodsInfo.getModels()) {
                LWhProcureModel lWhProcureModel = new LWhProcureModel();
@@ -194,21 +226,28 @@
                // 调拨业务类型转换到物品类型
                // 物品类型 1 采购2 调拨 3出库4部门分发
                Long baseGoodsModelsId = model.getBaseGoodsModelsId();
                if (businessType == 0) {
                if (businessType == TransferBusinessType.STOCK_TRANSFER.getValue()) {
                    lWhProcureModel.setBusinessType(2);
                    //根据物品型号查询物品库存
                    int goodsNum = this.lWhGoodsService.queryGoodsModelNum(0, warehouseId, baseGoodsModelsId, 1, null);
                    // 根据物品型号查询物品库存
                    // 调拨申请时没有仓库id 查询上级机构的所有仓库
                    List<BaseWarehouse> baseWareHouseList =
                        baseWarehouseService.getBaseWareHouseList(outAgencyId, StatesType.NORMAL.getValue());
                    List<Long> warehouseIdList =
                        baseWareHouseList.stream().map(BaseWarehouse::getId).collect(Collectors.toList());
                    int goodsNum = lWhGoodsService.queryGoodsModelNum(WareHouseType.TENANT.getValue(), warehouseIdList,
                        baseGoodsModelsId, 1, null);
                    lWhProcureModel.setWorehouseCount(goodsNum);
                }
                if (businessType == 1) {
                if (businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue()) {
                    lWhProcureModel.setBusinessType(4);
                }
                lWhProcureModel.setCounts(model.getCounts());
                lWhProcureModel.setUseCount(model.getCounts());
                lWhProcureModel.setBusinessId(lWhFormTransferId);
                lWhProcureModel.setBaseGoodsModelsId(baseGoodsModelsId);
                //根据型号id查询型号
                List<Map<String, Object>> baseGoodsModels = this.baseGoodsModelsService.queryGoodsModelInfo(baseGoodsModelsId);
                // 根据型号id查询型号
                List<Map<String, Object>> baseGoodsModels =
                    this.baseGoodsModelsService.queryGoodsModelInfo(baseGoodsModelsId);
                Map<String, Object> baseModelMap = baseGoodsModels.get(0);
                if (baseGoodsModels != null && !CollectionUtils.isEmpty(baseModelMap)) {
                    Object modelName = baseModelMap.get("modelName");
@@ -216,17 +255,11 @@
                }
                lWhProcureModel.setSupplier(transferGoodsInfo.getSupplier());
                //3.当业务类型为部门分发时 添加部门分发记录和使用人
                // 3.当业务类型为部门分发时 添加部门分发记录和使用人
                // 单据类型 1 采购2 调拨 3出库4部门分发
                //部门分发类型
                if (businessType == 1 && "A".equals(baseModelMap.get("type"))) {
                    LWhProcureModelUserRecord lWhProcureModelUserRecord = new LWhProcureModelUserRecord();
                    lWhProcureModelUserRecord.setId(IdUtil.generateId());
                    lWhProcureModelUserRecord.setTransBusinessId(lWhFormTransferId);
                    lWhProcureModelUserRecord.setOperatorId(sysInfo.getId());
                    lWhProcureModelUserRecord.setOperatorName(sysInfo.getUserName());
                    lWhProcureModelUserRecordService.insert(lWhProcureModelUserRecord);
                // 部门分发类型
                if (businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue()
                    && CategoryType.TYPE_A.getValue().equals(baseModelMap.get("type"))) {
                    List<LWhProcureModelUser> procureModelUserList = Lists.newArrayList();
                    for (LWhProcureModelUserParam lWhProcureModelUserParam : model.getProcureModelUserList()) {
                        LWhProcureModelUser lWhProcureModelUser = new LWhProcureModelUser();
@@ -246,7 +279,6 @@
                        log.error("新增物品使用信息失败");
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
                modelList.add(lWhProcureModel);
@@ -261,7 +293,6 @@
        return lWhFormTransferId;
    }
    /**
     * @Description 列表查询
     * @Author 卢庆阳
@@ -270,7 +301,7 @@
    public GenericPager<LWhFormTransfer> queryFormTransferList(TransferQry param) {
        HashMap<String, Object> paramts = new HashMap<>();
        StringBuilder sql = new StringBuilder(QUERY_FORM_TRANSFER_LIST);
        //调拨单号
        // 调拨单号
        if (!StringUtils.isEmpty(param.getBusinessFormCode())) {
            sql.append(" and BUSINESS_FORM_CODE = :businessFormCode ");
            paramts.put("businessFormCode", param.getBusinessFormCode());
@@ -279,32 +310,38 @@
            sql.append("and ft.BUSINESS_TYPE = :businessType ");
            paramts.put("businessType", param.getQryType());
        }
        //物品名称
        // 物品名称
        if (!StringUtils.isEmpty(param.getGoodsTemplateName())) {
            sql.append("AND bgt.GOODS_NAME LIKE :goodsTemplateName ");
            paramts.put("goodsTemplateName", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
            paramts.put("goodsTemplateName",
                StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
        }
        //调拨机构
        // 物品id
        if (param.getGoodsTemplateId() != null) {
            sql.append("AND bgt.id = :goodsTemplateId ");
            paramts.put("goodsTemplateId", param.getGoodsTemplateId());
        }
        // 调拨机构
        if (param.getOutAgencyId() != null) {
            sql.append(" and OUT_AGENCY_ID = :OUT_AGENCY_ID ");
            paramts.put("OUT_AGENCY_ID", param.getOutAgencyId());
        }
        //接收机构
        // 接收机构
        if (param.getInAgencyId() != null) {
            sql.append(" and IN_AGENCY_ID = :IN_AGENCY_ID ");
            paramts.put("IN_AGENCY_ID", param.getInAgencyId());
        }
        //状态
        // 状态
        if (param.getStates() != null) {
            sql.append(" and ft.states =:states ");
            paramts.put("states", param.getStates());
        }
        //创建人
        // 创建人
        if (!StringUtils.isEmpty(param.getOperatorName())) {
            sql.append(" and OPERATOR_NAME =:OPERATOR_NAME ");
            paramts.put("OPERATOR_NAME", param.getOperatorName());
        }
        //申请时间
        // 申请时间
        if (param.getCreateTimeStart() != null) {
            sql.append(" and ft.CREATE_TIME >=:createTimeStart ");
            paramts.put("createTimeStart", param.getCreateTimeStart() * 1000000);
@@ -313,7 +350,7 @@
            sql.append(" and ft.CREATE_TIME <:createTimeEnd ");
            paramts.put("createTimeEnd", param.getCreateTimeEnd() * 1000000 + 240000);
        }
        //接收时间
        // 接收时间
        if (param.getStartTime() != null) {
            sql.append(" and IN_TIME >=:inTimeStart ");
            paramts.put("inTimeStart", param.getStartTime() * 1000000);
@@ -322,10 +359,10 @@
            sql.append(" and IN_TIME <:inTimeEnd ");
            paramts.put("inTimeEnd", param.getEndTime() * 1000000 + 240000);
        }
        //分发部门
        if (param.getInWarehouseId() != null) {
        // 分发部门
        if (param.getDepartmentId() != null) {
            sql.append("and ft.IN_WAREHOUSE_ID = :inWarehouseId ");
            paramts.put("inWarehouseId", param.getInWarehouseId());
            paramts.put("inWarehouseId", param.getDepartmentId());
        }
        sql.append(" ORDER BY ft.CREATE_TIME DESC");
@@ -341,46 +378,60 @@
     */
    public LWHFromTransferExtendVO getById(Long id) {
        LWHFromTransferExtendVO result = new LWHFromTransferExtendVO();
        //1.查询调拨单
        // 1.查询调拨单
        LWhFormTransfer lWhFormTransfer = this.get(new LWhFormTransfer(id));
        if (lWhFormTransfer != null) {
            BeanUtils.copyProperties(lWhFormTransfer, result);
            result.setDepartmentName(lWhFormTransfer.getInWarehouseName());
        }
        String sql = "SELECT bgt.id, CATEGORY_ID, CATEGORY_NAME, GOODS_NAME,bgt.CLASSIFICATION type "
            + "FROM l_wh_procure_model pm LEFT JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID "
            + "LEFT JOIN base_goods_template bgt ON bgt.id = bgm.GOODS_TEMPLATES_ID " + "WHERE pm.BUSINESS_ID =:id GROUP BY bgt.id ";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", result.getId());
        List<Map<String, Object>> procureModelList = lWhFormOutputService.select(sql, paramMap, new MapperUtil());
        List<GoodModelInfoDTO> goodsModelInfo =
            lWhProcureModelService.getGoodsModelListByBusinessId(result.getId(), null);
        if (CollectionUtils.isEmpty(goodsModelInfo)) {
            return result;
        }
        String queryRecord = "SELECT * FROM l_wh_procure_model_user_record where TRANS_BUSINESS_ID = :id order by DEAL_TIME desc limit 1";
        LWhProcureModelUserRecord lWhProcureModelUserRecord = lWhProcureModelUserRecordService.get(queryRecord, paramMap, new LWhProcureModelUserRecord());
        List<FormTransferGoodsVO> formTransferGoods = Lists.newArrayList();
        for (Map<String, Object> map : procureModelList) {
            FormTransferGoodsVO procureTemplateInfoVO = MapUtils.convertMapToObj(map, FormTransferGoodsVO.class);
            Long baseGoodsTemplateId = procureTemplateInfoVO.getId();
            // 查询型号数量
            List<GoodsModelVO> goodsModelVOList = Lists.newArrayList();
            String sql2 = "SELECT pm.id,pm.BASE_GOODS_MODELS_NAME,bgm.UNIT,COUNTS,total_amount "
                + "FROM l_wh_procure_model pm LEFT JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID "
                + "LEFT JOIN base_goods_template bgt ON bgt.id = bgm.GOODS_TEMPLATES_ID " + "WHERE pm.BUSINESS_ID =:id and bgt.id =:baseGoodsTemplateId";
            Map<String, Object> goodsModelParamMap = new HashMap<>();
            goodsModelParamMap.put("id", result.getId());
            goodsModelParamMap.put("baseGoodsTemplateId", baseGoodsTemplateId);
            List<Map<String, Object>> modelList = lWhFormOutputService.select(sql2, goodsModelParamMap, new MapperUtil());
            modelList.forEach(item -> {
                GoodsModelVO goodsModelVO = MapUtils.convertMapToObj(item, GoodsModelVO.class);
        Map<Long, List<GoodModelInfoDTO>> collect =
            goodsModelInfo.stream().filter(Objects::nonNull).filter(dto -> dto.getBaseGoodsTemplateId() != null)
                .collect(Collectors.groupingBy(GoodModelInfoDTO::getBaseGoodsTemplateId));
        List<GoodsTemplateInfoVO> goodsTemplateInfoList = Lists.newArrayList();
        for (Map.Entry<Long, List<GoodModelInfoDTO>> entry : collect.entrySet()) {
            List<GoodModelInfoDTO> value = entry.getValue();
            GoodModelInfoDTO goodModelInfoDTO = value.stream().findFirst().orElse(null);
            GoodsTemplateInfoVO goodsTemplateInfoVO = new GoodsTemplateInfoVO();
            if (goodModelInfoDTO != null) {
                goodsTemplateInfoVO.setId(goodModelInfoDTO.getId());
                goodsTemplateInfoVO.setCategoryName(goodModelInfoDTO.getCategoryName());
                goodsTemplateInfoVO.setGoodsName(goodModelInfoDTO.getBaseGoodsName());
                goodsTemplateInfoVO.setType(goodModelInfoDTO.getType());
            }
            List<GoodsModelVO> goodsModelList = Lists.newArrayList();
            for (GoodModelInfoDTO goodModelInfo : value) {
                GoodsModelVO goodsModelVO = new GoodsModelVO();
                goodsModelVO.setId(goodModelInfo.getId());
                goodsModelVO.setBaseGoodsModelsName(goodModelInfo.getBaseGoodsModelsName());
                goodsModelVO.setUnit(goodModelInfo.getUnit());
                goodsModelVO.setCounts(goodModelInfo.getCounts());
                goodsModelVO.setTotalAmount(CurrencyUtil.convertFenToYuan(goodModelInfo.getTotalAmount()));
                // 部门分发需要查询使用信息
                Integer businessType = result.getBusinessType();
                String type = procureTemplateInfoVO.getType();
                //部门分发需要查询使用信息
                if (businessType == 1 && "A".equals(type)) {
                String type = goodsTemplateInfoVO.getType();
                if (businessType == TransferBusinessType.DEPARTMENT_PROCURE.getValue()
                    && CategoryType.TYPE_A.getValue().equals(type)) {
                    Long procureModelId = goodsModelVO.getId();
                    LWhProcureModelUserRecord lWhProcureModelUserRecord = new LWhProcureModelUserRecord();
                    lWhProcureModelUserRecord.setTransBusinessId(id);
                    List<LWhProcureModelUserRecord> select = lWhProcureModelUserRecordService
                        .select(lWhProcureModelUserRecord, DESC().setField("DEAL_TIME"));
                    LWhProcureModelUserRecord record = select.stream().findFirst().orElse(null);
                    LWhProcureModelUser lWhProcureModelUser = new LWhProcureModelUser();
                    lWhProcureModelUser.setWhProcureModelId(procureModelId);
                    lWhProcureModelUser.setProcureModelUserRecordId(lWhProcureModelUserRecord.getId());
                    List<LWhProcureModelUser> procureModelUserList = this.lWhProcureModelUserService.select(lWhProcureModelUser);
                    lWhProcureModelUser.setProcureModelUserRecordId(record.getId());
                    List<LWhProcureModelUser> procureModelUserList =
                        this.lWhProcureModelUserService.select(lWhProcureModelUser);
                    if (!CollectionUtils.isEmpty(procureModelUserList)) {
                        List<DepartGoodsUseInfo> departGoodsUseInfoList = Lists.newArrayList();
                        procureModelUserList.forEach(useInfo -> {
@@ -395,18 +446,16 @@
                        });
                        goodsModelVO.setUseInfo(departGoodsUseInfoList);
                    }
                }
                goodsModelVOList.add(goodsModelVO);
                procureTemplateInfoVO.setModels(goodsModelVOList);
            });
            formTransferGoods.add(procureTemplateInfoVO);
                goodsModelList.add(goodsModelVO);
            }
            goodsTemplateInfoVO.setModels(goodsModelList);
            goodsTemplateInfoList.add(goodsTemplateInfoVO);
        }
        result.setFormTransferGoods(formTransferGoods);
        result.setFormTransferGoods(goodsTemplateInfoList);
        return result;
    }
    /**
     * @Description 导出调拨出库单
@@ -414,24 +463,13 @@
     * @Date 2023/10/31
     */
    public List<TransferExcelTemplate> export(Long id, Integer type) {
        String sql = "SELECT\n"
            + "\tft.BUSINESS_FORM_CODE,\n"
            + "\tft.OPERATOR_NAME,\n"
            + "\tft.CREATE_TIME,\n"
            + "\tft.IN_AGENCY_NAME,\n"
            + "\tft.OUT_AGENCY_NAME,\n"
            + "\tGOODS_NAME templateName,\n"
            + "\tpm.BASE_GOODS_MODELS_NAME baseModelName,\n"
            + "\tpm.COUNTS num,\n"
            + "\tpm.total_amount,\n"
            + "\tft.BEIZ1 remark\n"
            + "FROM\n"
            + "\tl_wh_form_transfer ft\n"
        String sql = "SELECT\n" + "\tft.BUSINESS_FORM_CODE,\n" + "\tft.OPERATOR_NAME,\n" + "\tft.CREATE_TIME,\n"
            + "\tft.IN_AGENCY_NAME,\n" + "\tft.OUT_AGENCY_NAME,\n" + "\tGOODS_NAME templateName,\n"
            + "\tpm.BASE_GOODS_MODELS_NAME baseModelName,\n" + "\tpm.COUNTS num,\n" + "\tpm.total_amount,\n"
            + "\tft.BEIZ1 remark\n" + "FROM\n" + "\tl_wh_form_transfer ft\n"
            + "\tINNER JOIN l_wh_procure_model pm ON ft.ID = pm.BUSINESS_ID\n"
            + "\tINNER JOIN base_goods_models bgm ON bgm.ID = pm.BASE_GOODS_MODELS_ID\n"
            + "\tINNER JOIN base_goods_template bgt ON bgt.ID = bgm.GOODS_TEMPLATES_ID\n"
            + "WHERE\n"
            + "\tft.id = :id";
            + "\tINNER JOIN base_goods_template bgt ON bgt.ID = bgm.GOODS_TEMPLATES_ID\n" + "WHERE\n" + "\tft.id = :id";
        Map<String, Object> paramts = new HashMap<>();
        paramts.put("id", id);
        List<Map<String, Object>> select = this.select(sql, paramts, new MapperUtil());
@@ -443,6 +481,7 @@
            } else {
                templateExcelTransfer.setTenantName(templateExcelTransfer.getInAgencyName());
            }
            templateExcelTransfer.setAmount(CurrencyUtil.convertFenToYuan(templateExcelTransfer.getTotalAmount()));
            list.add(templateExcelTransfer);
        });
@@ -457,7 +496,7 @@
     */
    public int updateStatus(Long id) {
        LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(id);
        lWhFormTransfer.setStates(4);
        lWhFormTransfer.setStates(TransferStatesType.CANCEL.getValue());
        return this.update(lWhFormTransfer);
    }
@@ -467,42 +506,50 @@
        StringBuilder sql = new StringBuilder(
            "SELECT ft.id,ft.BUSINESS_FORM_CODE,bgt.GOODS_NAME,bgt.CLASSIFICATION type,bgm.id goodsModelId,bgm.MODEL_NAME goodsModelName,pm.COUNTS goodsCount,fst.`name` tenantName,"
                + "ft.IN_WAREHOUSE_NAME departmentName,ft.OPERATOR_ID,ft.CREATE_TIME,ft.OPERATOR_NAME FROM l_wh_form_transfer ft "
                + "inner JOIN l_wh_procure_model pm ON ft.ID = pm.BUSINESS_ID " + "inner JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID "
                + "inner JOIN l_wh_procure_model pm ON ft.ID = pm.BUSINESS_ID "
                + "inner JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID "
                + "inner JOIN base_goods_template bgt ON bgt.id = bgm.GOODS_TEMPLATES_ID "
                + "inner JOIN fin_sys_tenant_user fstu ON fstu.id = ft.OPERATOR_ID "
                + "inner JOIN fin_sys_tenant_department fstd ON fstu.SYS_DEPT_ID = fstd.ID "
                + "inner JOIN fin_sys_tenant fst ON fst.id = fstd.TENANT_ID where ft.BUSINESS_TYPE =1 ");
        //单号
        // 单号
        if (StringUtils.isNotEmpty(transferQry.getBusinessFormCode())) {
            sql.append("AND BUSINESS_FORM_CODE like :businessFormCode ");
            paramts.put("businessFormCode", StringUtils.CHAR_PERCENT + transferQry.getBusinessFormCode() + StringUtils.CHAR_PERCENT);
            paramts.put("businessFormCode",
                StringUtils.CHAR_PERCENT + transferQry.getBusinessFormCode() + StringUtils.CHAR_PERCENT);
        }
        //物品名称
        // 物品名称
        if (StringUtils.isNotEmpty(transferQry.getGoodsTemplateName())) {
            sql.append("AND bgt.GOODS_NAME like:goodsName ");
            paramts.put("goodsName", StringUtils.CHAR_PERCENT + transferQry.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
            paramts.put("goodsName",
                StringUtils.CHAR_PERCENT + transferQry.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
        }
        // 物品id
        if (transferQry.getGoodsTemplateId() != null) {
            sql.append("AND bgt.id =:goodsTemplateId ");
            paramts.put("goodsTemplateId", transferQry.getGoodsTemplateId());
        }
        // 规格型号
        if (transferQry.getBaseGoodsModelsId() != null) {
            sql.append("AND bgm.id =:goodsModelId ");
            paramts.put("goodsModelId", transferQry.getBaseGoodsModelsId());
        }
        //调拨机构
        // 调拨机构
        if (transferQry.getOutAgencyId() != null) {
            sql.append("AND OUT_AGENCY_ID = :OUT_AGENCY_ID ");
            paramts.put("OUT_AGENCY_ID", transferQry.getOutAgencyId());
            sql.append("AND OUT_AGENCY_ID like :OUT_AGENCY_ID ");
            paramts.put("OUT_AGENCY_ID", transferQry.getOutAgencyId() + StringUtils.CHAR_PERCENT);
        }
        //分发部门
        if (transferQry.getInWarehouseId() != null) {
        // 分发部门
        if (transferQry.getDepartmentId() != null) {
            sql.append("and ft.IN_WAREHOUSE_ID = :inWarehouseId ");
            paramts.put("inWarehouseId", transferQry.getInWarehouseId());
            paramts.put("inWarehouseId", transferQry.getDepartmentId());
        }
        //创建人
        // 创建人
        if (StringUtils.isNotEmpty(transferQry.getOperatorName())) {
            sql.append("AND ft.OPERATOR_NAME =:OPERATOR_NAME ");
            paramts.put("OPERATOR_NAME", transferQry.getOperatorName());
        }
        //申请时间
        // 申请时间
        if (transferQry.getStartTime() != null) {
            sql.append("AND ft.CREATE_TIME >=:createTimeStart ");
            paramts.put("createTimeStart", transferQry.getStartTime() * 1000000);
@@ -513,23 +560,23 @@
        }
        sql.append("ORDER BY ft.CREATE_TIME DESC");
        GenericPager<Map<String, Object>> mapGenericPager = this.selectSplit(sql.toString(), paramts, transferQry.getPageNum(), transferQry.getPageSize(),
            new MapperUtil());
        GenericPager<Map<String, Object>> mapGenericPager = this.selectSplit(sql.toString(), paramts,
            transferQry.getPageNum(), transferQry.getPageSize(), new MapperUtil());
        return mapGenericPager;
    }
    public GenericPager<Map<String, Object>> queryFormTransferDetailList(TransferQry param) {
        HashMap<String, Object> params = new HashMap<>();
        StringBuilder sql = new StringBuilder(
            "SELECT ft.id,\n" + "       ft.BUSINESS_FORM_CODE,\n" + "       bgt.GOODS_NAME,\n" + "       bgt.CLASSIFICATION,\n"
                + "       pm.BASE_GOODS_MODELS_NAME,\n" + "       pm.COUNTS,\n" + "       ft.IN_AGENCY_NAME,\n" + "       ft.OPERATOR_NAME,\n"
                + "       ft.CREATE_TIME,\n" + "       ft.IN_TIME,\n" + "       ft.OUT_AGENCY_NAME,\n" + "       ft.OUT_OPERATOR_NAME,\n"
                + "       ft.OUTPUT_TIME\n" + "FROM l_wh_form_transfer ft\n" + "         LEFT JOIN l_wh_procure_model pm ON ft.ID = pm.BUSINESS_ID\n"
                + "         LEFT JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID\n"
                + "         LEFT JOIN base_goods_template bgt ON bgt.id = bgm.GOODS_TEMPLATES_ID where 1=1 ");
        StringBuilder sql = new StringBuilder("SELECT ft.id,\n" + "       ft.BUSINESS_FORM_CODE,\n"
            + "       bgt.GOODS_NAME,\n" + "       bgt.CLASSIFICATION,\n" + "       pm.BASE_GOODS_MODELS_NAME,\n"
            + "       pm.COUNTS,\n" + "       ft.IN_AGENCY_NAME,\n" + "       ft.OPERATOR_NAME,\n"
            + "       ft.CREATE_TIME,\n" + "       ft.IN_TIME,\n" + "       ft.OUT_AGENCY_NAME,\n"
            + "       ft.OUT_OPERATOR_NAME,\n" + "       ft.OUTPUT_TIME\n" + "FROM l_wh_form_transfer ft\n"
            + "         LEFT JOIN l_wh_procure_model pm ON ft.ID = pm.BUSINESS_ID\n"
            + "         LEFT JOIN base_goods_models bgm ON bgm.id = pm.BASE_GOODS_MODELS_ID\n"
            + "         LEFT JOIN base_goods_template bgt ON bgt.id = bgm.GOODS_TEMPLATES_ID where ft.BUSINESS_TYPE =0 ");
        if (StringUtils.isNotEmpty(param.getBusinessFormCode())) {
            sql.append("AND ft.BUSINESS_FORM_CODE = :businessFormCode ");
            params.put("businessFormCode", param.getBusinessFormCode());
@@ -538,23 +585,27 @@
            sql.append("AND bgt.GOODS_NAME like :goodsName ");
            params.put("goodsName", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
        }
        if (param.getGoodsTemplateId() != null) {
            sql.append("AND bgt.id = :goodsTemplateId ");
            params.put("goodsTemplateId", param.getGoodsTemplateId());
        }
        if (param.getBaseGoodsModelsId() != null) {
            sql.append("AND bgm.id = :goodsModelId ");
            params.put("goodsModelId", param.getBaseGoodsModelsId());
        }
        if (param.getOutAgencyId() != null) {
            sql.append("AND ft.OUT_AGENCY_ID like :outAgencyId ");
            params.put("outAgencyId", param.getOutAgencyId());
            params.put("outAgencyId", param.getOutAgencyId() + StringUtils.CHAR_PERCENT);
        }
        if (param.getOutAgencyId() != null) {
        if (param.getInAgencyId() != null) {
            sql.append("AND ft.IN_AGENCY_ID like :inAgencyId ");
            params.put("inAgencyId", param.getInAgencyId());
            params.put("inAgencyId", param.getInAgencyId() + StringUtils.CHAR_PERCENT);
        }
        if (StringUtils.isNotEmpty(param.getOperatorName())) {
            sql.append("AND ft.OPERATOR_NAME = :operatorName ");
            params.put("operatorName", param.getOperatorName());
        }
        //申请创建时间
        // 申请创建时间
        if (param.getCreateTimeStart() != null) {
            sql.append("AND ft.CREATE_TIME >= :createTimeStart ");
            params.put("createTimeStart", param.getCreateTimeStart() * 1000000);
@@ -563,7 +614,7 @@
            sql.append("AND ft.CREATE_TIME < :createTimeEnd ");
            params.put("createTimeEnd", param.getCreateTimeEnd() * 1000000 + 240000);
        }
        //接收时间
        // 接收时间
        if (param.getStartTime() != null) {
            sql.append("AND ft.IN_TIME >= :createTimeStart ");
            params.put("createTimeStart", param.getStartTime() * 1000000);
@@ -572,19 +623,20 @@
            sql.append("AND ft.IN_TIME < :createTimeEnd ");
            params.put("createTimeEnd", param.getEndTime() * 1000000 + 240000);
        }
        GenericPager<Map<String, Object>> mapGenericPager = this.selectSplit(sql.toString(), params, param.getPageNum(), param.getPageSize(), new MapperUtil());
        GenericPager<Map<String, Object>> mapGenericPager =
            this.selectSplit(sql.toString(), params, param.getPageNum(), param.getPageSize(), new MapperUtil());
        return mapGenericPager;
    }
    public List<Map<String, Object>> queryDepartmentTransferOrder() {
        String sql =
            "SELECT ft.id,\n" + "       ft.BUSINESS_FORM_CODE,\n" + "       gr.GOODS_TEMPLATE_NAME,\n" + "       gr.BASE_GOODS_TEMPLATE_ID goodsTemplateId,\n"
                + "       ft.CREATE_TIME\n" + "\n" + "FROM l_wh_form_transfer ft\n" + "         LEFT JOIN L_WAREHOUSE_FLOW wf ON ft.id = wf.BUSINESS_FORM_ID\n"
                + "         left join L_WH_GOODS_RECORD gr on gr.WAREHOUSE_FLOW_ID = wf.id\n"
                + "         LEFT JOIN L_GOODS_WH_RECORD gwr on gwr.WAREHOUSE_FLOW_ID = wf.id\n"
                + "         left join L_WH_GOODS g on g.id = gwr.WH_GOODS_ID where ft.BUSINESS_TYPE = 1 GROUP BY gr.BASE_GOODS_TEMPLATE_ID \n";
        String sql = "SELECT ft.id,\n" + "       ft.BUSINESS_FORM_CODE,\n" + "       gr.GOODS_TEMPLATE_NAME,\n"
            + "       gr.BASE_GOODS_TEMPLATE_ID goodsTemplateId,\n" + "       ft.CREATE_TIME\n" + "\n"
            + "FROM l_wh_form_transfer ft\n" + "         LEFT JOIN L_WAREHOUSE_FLOW wf ON ft.id = wf.BUSINESS_FORM_ID\n"
            + "         left join L_WH_GOODS_RECORD gr on gr.WAREHOUSE_FLOW_ID = wf.id\n"
            + "         LEFT JOIN L_GOODS_WH_RECORD gwr on gwr.WAREHOUSE_FLOW_ID = wf.id\n"
            + "         left join L_WH_GOODS g on g.id = gwr.WH_GOODS_ID where ft.BUSINESS_TYPE = 1 GROUP BY gr.BASE_GOODS_TEMPLATE_ID \n";
        HashMap<String, Object> param = new HashMap<>();
        List<Map<String, Object>> select = this.select(sql, param, new MapperUtil());
        select.forEach(item -> {