package com.consum.base.service.impl; import com.consum.base.core.CodeGeneratorEnum; import com.consum.base.core.CodeGeneratorService; import com.consum.base.service.core.DepUsingFormBackCoreService; 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.core.utils.PageUtil; import com.consum.base.pojo.dto.UsingFormBackDetailDTO; import com.consum.base.pojo.query.UsingFormBackQry; import com.consum.base.pojo.request.UsingFormBackGoodsInfo; import com.consum.base.pojo.request.UsingFormBackParam; import com.consum.base.pojo.request.baseGoodModel; import com.consum.base.pojo.response.*; import com.consum.base.service.*; import com.consum.model.po.*; 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.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; import jakarta.annotation.Resource; 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 java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author asus * @version 1.0 * @description: 物品回收单 * @date 2023/12/1 11:27 */ @Service public class UsingFormBackServiceImpl extends BaseServiceImpl implements UsingFormBackService { @Autowired private CodeGeneratorService codeGeneratorService; @Autowired private BaseCategoryService baseCategoryService; @Autowired private UsingFormBackModelService usingFormBackModelService; @Autowired private UsingFormBackGoodsService usingFormBackGoodsService; @Autowired private FinSysTenantDepartmentService finSysTenantDepartmentService; @Autowired private LWhFormTransferService lWhFormTransferService; @Resource private DepUsingFormBackCoreService depUsingFormBackCoreService; @Resource private UsingFormBackModelService UsingFormBackModelService; @Override public void add(UsingFormBackParam usingFormBackParam, FinSysTenantUser sysInfo, S_user_core currentUser) { Long departmentId = usingFormBackParam.getDepartmentId(); Long operatorId = usingFormBackParam.getOperatorId(); String operatorName = usingFormBackParam.getOperatorName(); Long backTime = usingFormBackParam.getDealTime(); String procureDoc = usingFormBackParam.getProcureDoc(); List goodsList = usingFormBackParam.getGoods(); // 检查部门是否存在 FinSysTenantDepartment department = finSysTenantDepartmentService.getById(departmentId); if (department == null) { throw new RuntimeException("部门不存在"); } String departmentName = department.getName(); // 添加退回表单 Long usingFormBackId = addUsingFormBack(sysInfo, departmentId, departmentName, operatorId, operatorName, backTime, procureDoc); // 批量插入退回商品和退回商品模型 List goodsBatch = new ArrayList<>(); List modelBatch = new ArrayList<>(); for (UsingFormBackGoodsInfo goodsInfo : goodsList) { UsingFormBackGoods goods = createUsingFormBackGoods(usingFormBackId, goodsInfo); goodsBatch.add(goods); for (baseGoodModel model : goodsInfo.getModels()) { UsingFormBackModel formModel = createUsingFormBackModel(usingFormBackId, goods.getId(), goodsInfo, model); modelBatch.add(formModel); } } // 批量插入退回商品和退回商品模型 usingFormBackModelService.insertBatch(goodsBatch); usingFormBackGoodsService.insertBatch(modelBatch); depUsingFormBackCoreService.updateBack(usingFormBackId, currentUser, DateUtils.getDateTimeNumber(System.currentTimeMillis())); } private UsingFormBackGoods createUsingFormBackGoods(Long usingFormBackId, UsingFormBackGoodsInfo goodsInfo) { UsingFormBackGoods goods = new UsingFormBackGoods(); goods.setId(IdUtil.generateId()); goods.setUsingFormBackId(usingFormBackId); goods.setBaseGoodsTemplateId(goodsInfo.getBaseGoodsTemplateId()); goods.setBaseGoodsTemplateName(goodsInfo.getGoodsTemplateName()); BaseCategory baseCategory = baseCategoryService.getById(goodsInfo.getBaseCategoryId()); goods.setCategoryName(baseCategory.getCategoryName()); goods.setClassification(baseCategory.getClassification()); goods.setTransBusinessId(goodsInfo.getTransBusinessId()); goods.setBusinessFormCode(goodsInfo.getBusinessFormCode()); LWhFormTransfer lWhFormTransfer = lWhFormTransferService.selectById(goodsInfo.getTransBusinessId()); goods.setTransOutWarehouseType(lWhFormTransfer.getOutWarehouseType()); goods.setTransOutWarehouseId(lWhFormTransfer.getOutWarehouseId()); return goods; } private UsingFormBackModel createUsingFormBackModel(Long usingFormBackId, Long usingFormBackGoodsId, UsingFormBackGoodsInfo goodsInfo, baseGoodModel model) { UsingFormBackModel formModel = new UsingFormBackModel(); formModel.setId(IdUtil.generateId()); formModel.setUsingFormBackId(usingFormBackId); formModel.setUsingFormBackGoodsId(usingFormBackGoodsId); formModel.setBaseGoodsTemplateId(model.getGoodsTemplatesId()); formModel.setBaseGoodsTemplateName(goodsInfo.getGoodsTemplateName()); formModel.setClassification(model.getClassification()); formModel.setUnit(model.getUnit()); formModel.setBaseGoodsModelsId(model.getBaseGoodsModelsId()); formModel.setBaseGoodsModelsName(model.getModelName()); formModel.setProcureModelUserId(model.getModelUserId()); formModel.setInitialCount(model.getGoodsNum()); formModel.setUseCount(model.getUserUseCount()); formModel.setCounts(model.getCounts()); formModel.setGoodsUserName(model.getNowUserName()); return formModel; } @Override public PageUtil selectPageByList(UsingFormBackQry usingFormBackParam) { StringBuilder sql = new StringBuilder("SELECT\n" + "\tDISTINCT ufb.ID,\n" + "\tufb.BUSINESS_FORM_CODE,\n" + "\tufb.DEPARTMENT_NAME,\n" + "\tufb.OPERATOR_NAME,\n" + "\tufb.DEAL_TIME\n" + "FROM\n" + "\tusing_form_back ufb\n" + "\tLEFT JOIN using_form_back_goods ufbg ON ufb.ID = ufbg.USING_FORM_BACK_ID\n" + "\tLEFT JOIN using_form_back_model ufbm ON ufbg.ID = ufbm.USING_FORM_BACK_GOODS_ID\n" + "where 1=1 "); String businessFormCode = usingFormBackParam.getBusinessFormCode(); Long departmentId = usingFormBackParam.getDepartmentId(); String goodsTemplateName = usingFormBackParam.getGoodsTemplateName(); String goodsTemplateId = usingFormBackParam.getGoodsTemplateId(); Long startTime = usingFormBackParam.getStartTime(); Long endTime = usingFormBackParam.getEndTime(); Long baseGoodsModelsId = usingFormBackParam.getBaseGoodsModelsId(); Long agencyId = usingFormBackParam.getAgencyId(); String createName = usingFormBackParam.getCreateName(); Map map = new HashMap<>(); if (StringUtils.isNotEmpty(businessFormCode)) { sql.append("AND ufb.BUSINESS_FORM_CODE = :businessFormCode "); map.put("businessFormCode", businessFormCode); } if (departmentId != null) { sql.append("AND ufb.DEPARTMENT_ID = :departmentId "); map.put("departmentId", departmentId); } if (StringUtils.isNotEmpty(goodsTemplateName)) { sql.append("AND ufbg.BASE_GOODS_TEMPLATE_NAME = :goodsTemplateName "); map.put("goodsTemplateName", goodsTemplateName); } if (StringUtils.isNotEmpty(goodsTemplateId)) { sql.append("AND ufbg.BASE_GOODS_TEMPLATE_ID = :goodsTemplateId "); map.put("goodsTemplateId", goodsTemplateId); } if (startTime != null) { sql.append("AND ufb.CREATE_TIME >= :startTime "); map.put("startTime", startTime * 1000000); } if (endTime != null) { sql.append("AND ufb.CREATE_TIME < :endTime "); map.put("endTime", endTime * 1000000 + 240000); } if (baseGoodsModelsId != null) { sql.append("AND ufbm.BASE_GOODS_MODELS_ID = :baseGoodsModelsId "); map.put("baseGoodsModelsId", baseGoodsModelsId); } if (agencyId != null) { sql.append("AND ufb.AGENCY_ID like :agencyId"); map.put("agencyId", agencyId); } if (StringUtils.isNotEmpty(createName)) { sql.append("AND ufb.OPERATOR_NAME = :createName "); map.put("createName", createName); } sql.append("ORDER BY ufb.CREATE_TIME DESC "); GenericPager> mapGenericPager = this.selectSplit(sql.toString(), map, usingFormBackParam.getPageNum(), usingFormBackParam.getPageSize(), new MapperUtil()); PageUtil pageUtil = new PageUtil(mapGenericPager); List pageList = Lists.newArrayList(); mapGenericPager.getDatas().forEach(item -> { UsingFormBackVO usingFormBackVO = MapUtils.convertMapToObj(item, UsingFormBackVO.class); Long id = usingFormBackVO.getId(); List usingCount = UsingFormBackModelService.getUsingCountByBusinessId(id); usingFormBackVO.setGoodsTemplateInfoList(usingCount); pageList.add(usingFormBackVO); }); pageUtil.setDatas(pageList); return pageUtil; } @Override public UsingFormBackDetailVO getDetail(Long id) { StringBuilder sql = new StringBuilder("SELECT\n" + "\tDISTINCT ufb.ID,\n" + "\tufb.BUSINESS_FORM_CODE,\n" + "\tufb.AGENCY_NAME,\n" + "\tufb.DEPARTMENT_NAME,\n" + "\tufb.OPERATOR_NAME,\n" + "\tufb.DEAL_TIME,\n" + "\tufb.PROCURE_DOC,\n" + "\tufbg.CATEGORY_NAME,\n" + "\tufbg.BASE_GOODS_TEMPLATE_NAME,\n" + "\tufbg.CLASSIFICATION,\n" + "\tufbg.BUSINESS_FORM_CODE,\n" + "\tufbm.BASE_GOODS_MODELS_NAME,\n" + "\tufbm.BASE_GOODS_TEMPLATE_ID,\n" + "\tufbm.BASE_GOODS_MODELS_ID,\n" + "\tufbm.UNIT,\n" + "\tufbm.COUNTS,\n" + "\tufbm.USE_COUNT,\n" + "\tufbm.GOODS_USER_NAME\n" + "FROM\n" + "\tusing_form_back ufb\n" + "\tLEFT JOIN using_form_back_goods ufbg ON ufb.ID = ufbg.USING_FORM_BACK_ID\n" + "\tLEFT JOIN using_form_back_model ufbm ON ufbg.ID = ufbm.USING_FORM_BACK_GOODS_ID where ufb.id =:id"); Map map = new HashMap<>(); map.put("id", id); List> select = this.select(sql.toString(), map, new MapperUtil()); if (CollectionUtils.isEmpty(select)) { return null; } List usingFormBackDetailDTOList = Lists.newArrayList(); select.forEach(item -> { UsingFormBackDetailDTO usingFormBackDetailDTO = MapUtils.convertMapToObj(item, UsingFormBackDetailDTO.class); usingFormBackDetailDTOList.add(usingFormBackDetailDTO); }); UsingFormBackDetailVO usingFormBackDetailVO = new UsingFormBackDetailVO(); List goodsTemplateInfoList = Lists.newArrayList(); usingFormBackDetailDTOList.stream() .collect(Collectors.groupingBy(UsingFormBackDetailDTO::getBaseGoodsTemplateId)) .forEach((templateId, templateInfo) -> { UsingFormBackDetailDTO templateInfoDTO = templateInfo.get(0); BeanUtils.copyProperties(templateInfoDTO, usingFormBackDetailVO); UsingFormBackGoodsTemplateInfo usingFormBackGoodsTemplateInfo = new UsingFormBackGoodsTemplateInfo(); usingFormBackGoodsTemplateInfo.setId(templateId); usingFormBackGoodsTemplateInfo.setCategoryName(templateInfoDTO.getCategoryName()); usingFormBackGoodsTemplateInfo.setBaseGoodsTemplateName(templateInfoDTO.getBaseGoodsTemplateName()); usingFormBackGoodsTemplateInfo.setType(templateInfoDTO.getClassification()); usingFormBackGoodsTemplateInfo.setBusinessFormCode(templateInfoDTO.getBusinessFormCode()); goodsTemplateInfoList.add(usingFormBackGoodsTemplateInfo); usingFormBackDetailVO.setGoodsTemplateInfoList(goodsTemplateInfoList); List modelInfoList = Lists.newArrayList(); templateInfo.stream().collect(Collectors.groupingBy(UsingFormBackDetailDTO::getBaseGoodsModelsId)) .forEach((modelId, modelInfo) -> { UsingFormBackDetailDTO modelInfoDTO = modelInfo.stream().findFirst().orElse(null); UsingFormBackModelInfo usingFormBackModelInfo = new UsingFormBackModelInfo(); if (modelInfoDTO != null) { usingFormBackModelInfo.setBaseGoodsModelsName(modelInfoDTO.getBaseGoodsModelsName()); usingFormBackModelInfo.setUnit(modelInfoDTO.getUnit()); usingFormBackModelInfo.setId(modelId); } modelInfoList.add(usingFormBackModelInfo); usingFormBackGoodsTemplateInfo.setModelInfoList(modelInfoList); List useInfoList = Lists.newArrayList(); for (UsingFormBackDetailDTO useInfoDTO : modelInfo) { UseInfo useInfo = new UseInfo(); useInfo.setUseName(useInfoDTO.getGoodsUserName()); useInfo.setReturnNum(useInfoDTO.getCounts()); useInfo.setUseUnm(useInfoDTO.getUseCount()); useInfoList.add(useInfo); usingFormBackModelInfo.setUseInfoList(useInfoList); } }); }); return usingFormBackDetailVO; } @Override public PageUtil selectPageByDetail(UsingFormBackQry usingFormBackParam) { StringBuilder sql = new StringBuilder("SELECT\n" + "\tufb.ID,\n" + "\tufb.BUSINESS_FORM_CODE,\n" + "\tufbm.BASE_GOODS_TEMPLATE_NAME,\n" + "\tufbm.BASE_GOODS_MODELS_NAME,\n" + "\tufbm.counts,\n" + "\tufb.AGENCY_NAME,\n" + "\tufb.DEPARTMENT_NAME,\n" + "\tufb.OPERATOR_NAME,\n" + "\tufb.DEAL_TIME\n" + "FROM\n" + "\tusing_form_back ufb\n" + "\tLEFT JOIN using_form_back_goods ufbg ON ufb.ID = ufbg.USING_FORM_BACK_ID\n" + "\tLEFT JOIN using_form_back_model ufbm ON ufbg.ID = ufbm.USING_FORM_BACK_GOODS_ID\n" + "where 1=1 "); String businessFormCode = usingFormBackParam.getBusinessFormCode(); Long departmentId = usingFormBackParam.getDepartmentId(); String goodsTemplateName = usingFormBackParam.getGoodsTemplateName(); String goodsTemplateId = usingFormBackParam.getGoodsTemplateId(); Long startTime = usingFormBackParam.getStartTime(); Long endTime = usingFormBackParam.getEndTime(); Long baseGoodsModelsId = usingFormBackParam.getBaseGoodsModelsId(); Long agencyId = usingFormBackParam.getAgencyId(); String createName = usingFormBackParam.getCreateName(); Map map = new HashMap<>(); if (StringUtils.isNotEmpty(businessFormCode)) { sql.append("AND ufb.BUSINESS_FORM_CODE = :businessFormCode "); map.put("businessFormCode", businessFormCode); } if (departmentId != null) { sql.append("AND ufb.DEPARTMENT_ID = :departmentId "); map.put("departmentId", departmentId); } if (StringUtils.isNotEmpty(goodsTemplateName)) { sql.append("AND ufbg.BASE_GOODS_TEMPLATE_NAME = :goodsTemplateName "); map.put("goodsTemplateName", goodsTemplateName); } if (StringUtils.isNotEmpty(goodsTemplateId)) { sql.append("AND ufbg.BASE_GOODS_TEMPLATE_ID = :goodsTemplateId "); map.put("goodsTemplateId", goodsTemplateId); } if (startTime != null) { sql.append("AND ufb.CREATE_TIME >= :startTime "); map.put("startTime", startTime * 1000000); } if (endTime != null) { sql.append("AND ufb.CREATE_TIME < :endTime "); map.put("endTime", endTime * 1000000 + 240000); } if (baseGoodsModelsId != null) { sql.append("AND ufbm.BASE_GOODS_MODELS_ID = :baseGoodsModelsId "); map.put("baseGoodsModelsId", baseGoodsModelsId); } if (agencyId != null) { sql.append("AND ufb.AGENCY_ID like :agencyId "); map.put("agencyId", agencyId); } if (StringUtils.isNotEmpty(createName)) { sql.append("AND ufb.OPERATOR_NAME = :createName "); map.put("createName", createName); } sql.append("ORDER BY ufb.CREATE_TIME DESC "); GenericPager> mapGenericPager = this.selectSplit(sql.toString(), map, usingFormBackParam.getPageNum(), usingFormBackParam.getPageSize(), new MapperUtil()); PageUtil pageUtil = new PageUtil(mapGenericPager); List pageList = Lists.newArrayList(); mapGenericPager.getDatas().forEach(item -> { UsingFormBackDetailListVO usingFormBackVO = MapUtils.convertMapToObj(item, UsingFormBackDetailListVO.class); pageList.add(usingFormBackVO); }); pageUtil.setDatas(pageList); return pageUtil; } @Transactional public Long addUsingFormBack(FinSysTenantUser sysInfo, Long departmentId, String departmentName, Long operatorId, String operatorName, Long backTime, String procureDoc) { UsingFormBack usingFormBack = new UsingFormBack(); usingFormBack.setId(IdUtil.generateId()); usingFormBack.setBusinessFormCode(codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.GOBACK)); usingFormBack.setOutWarehouseType(1); usingFormBack.setOutWarehouseId(departmentId); usingFormBack.setOutWarehouseName(departmentName); String tenantId = sysInfo.getTenantId(); String tenantName = sysInfo.getTenantName(); usingFormBack.setAgencyId(Long.valueOf(tenantId)); usingFormBack.setAgencyName(tenantName); usingFormBack.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); usingFormBack.setStates(1); Long sysDeptId = sysInfo.getSysDeptId(); FinSysTenantDepartment department = finSysTenantDepartmentService.getById(sysDeptId); if (department == null) { throw new RuntimeException("部门不存在"); } usingFormBack.setDepartmentId(department.getId()); usingFormBack.setDepartmentName(department.getName()); usingFormBack.setOperatorId(sysInfo.getId()); usingFormBack.setOperatorName(operatorName); usingFormBack.setDealTime(backTime); usingFormBack.setProcureDoc(procureDoc); this.insert(usingFormBack); return usingFormBack.getId(); } }