package com.consum.base.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; 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.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.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.core.utils.PageUtil; import com.consum.base.pojo.LWhFormScrappedGoodsInfoParam; import com.consum.base.pojo.LWhFormScrappedGoodsModelParams; import com.consum.base.pojo.LWhFormScrappedParam; import com.consum.base.pojo.dto.GoodModelInfoDTO; import com.consum.base.pojo.excel.ScrappedInfoExcelTemplate; import com.consum.base.pojo.query.LWhFormScrappedQry; import com.consum.base.pojo.response.FormScrappedGoodsDetailVO; import com.consum.base.pojo.response.GoodsModelVO; import com.consum.base.pojo.response.GoodsTemplateCountVO; import com.consum.base.pojo.response.GoodsTemplateInfoVO; import com.consum.base.pojo.response.LWhFormScrappedExtendVO; import com.consum.base.service.BaseGoodsModelsService; import com.consum.base.service.BaseGoodsTemplateService; import com.consum.base.service.BaseWarehouseService; import com.consum.base.service.FinSysTenantDepartmentService; import com.consum.base.service.LWhFormScrappedGoodsService; import com.consum.base.service.LWhFormScrappedService; import com.consum.base.service.LWhGoodsService; import com.consum.base.service.SDictDataServiceImpl; import com.consum.model.po.BaseGoodsModels; import com.consum.model.po.BaseGoodsTemplate; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenantDepartment; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.LWhFormScrapped; import com.consum.model.po.LWhFormScrappedGoods; import com.consum.model.po.SDictData; import com.iplatform.model.po.S_user_core; import com.walker.db.page.GenericPager; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; /** * @Description 报废单 * @Author 卢庆阳 * @Date 2023/11/1 */ @Service public class LWhFormScrappedServiceImpl extends BaseServiceImpl implements LWhFormScrappedService { @Autowired private CodeGeneratorService codeGeneratorService; @Autowired private BaseWarehouseService baseWarehouseService; @Autowired private FinSysTenantDepartmentService departmentService; @Autowired private LWhGoodsService lWhGoodsService; @Autowired private LWhFormScrappedGoodsService scrappedGoodsService; @Autowired private SDictDataServiceImpl sDictDataService; @Autowired private BaseGoodsModelsService baseGoodsModelsService; @Autowired private BaseGoodsTemplateService baseGoodsTemplateService; @Autowired private LWhFormScrappedCoreService lWhFormScrappedCoreService; private static String QUERY_LIST = "SELECT DISTINCT fs.* FROM l_wh_form_scrapped fs left join l_wh_form_scrapped_goods fsg on fs.id = fsg.FORM_SCRAPPED_ID WHERE 1 = 1 "; private static final String QUERY_BF_DETAIL_LIST = "select fs.id,fs.BUSINESS_FORM_CODE,fsg.GOODS_TEMPLATE_NAME,fsg.BASE_GOODS_MODELS_NAME,fsg.COUNTS," + "fs.AGENCY_NAME,OPERATOR_NAME,DEAL_TIME from l_wh_form_scrapped fs " + "inner join l_wh_form_scrapped_goods fsg on fs.ID = fsg.FORM_SCRAPPED_ID where 1=1 "; /** * 新增 * * @param param * @param currentUser 当前登录用户 * @param sysInfo 当前登录用户 * @return 1.新增报废单 2.新增报废单物品 */ @Override public int add(LWhFormScrappedParam param, S_user_core currentUser, FinSysTenantUser sysInfo) { // 1.新增报废单记录 LWhFormScrapped lWhFormScrapped = new LWhFormScrapped(); // 报废单id long lWhFormScrappedId = IdUtil.generateId(); lWhFormScrapped.setId(lWhFormScrappedId); lWhFormScrapped.setBusinessFormCode(codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Scrapped)); lWhFormScrapped.setWarehouseType(WareHouseType.TENANT.getValue()); // 公用 Long warehouseId = null; // 仓库名称 String wareHouseName = null; warehouseId = param.getWarehouseId(); // 根据仓库id查询仓库 BaseWarehouse warehouse = this.baseWarehouseService.getById(warehouseId); if (warehouse == null) { log.error("仓库不存在"); return 0; } wareHouseName = warehouse.getWarehouseName(); lWhFormScrapped.setWarehouseId(warehouseId); lWhFormScrapped.setWarehouseName(wareHouseName); lWhFormScrapped.setAgencyId(Long.valueOf(sysInfo.getTenantId())); lWhFormScrapped.setAgencyName(sysInfo.getTenantName()); lWhFormScrapped.setOperatorId(sysInfo.getSysUserId()); lWhFormScrapped.setOperatorName(sysInfo.getUserName()); lWhFormScrapped.setDealTime(param.getDealTime()); lWhFormScrapped.setStates(0); lWhFormScrapped.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); lWhFormScrapped.setUploadFiles(param.getUploadFiles()); // 根据部门id查询部门 FinSysTenantDepartment department = this.departmentService.getById(sysInfo.getSysDeptId()); if (department != null) { lWhFormScrapped.setDepartmentId(sysInfo.getSysDeptId()); lWhFormScrapped.setDepartmentName(department.getName()); } int flag1 = this.insert(lWhFormScrapped); if (flag1 == 0) { log.error("新增报废单失败"); return 0; } // 2.新增报废单物品记录 // 根据物品id查询物品 for (LWhFormScrappedGoodsInfoParam goodsInfo : param.getScrappedGoodsInfo()) { BaseGoodsTemplate goodsTemplate = this.baseGoodsTemplateService.get(new BaseGoodsTemplate(goodsInfo.getBaseGoodsTemplateId())); if (goodsTemplate == null) { log.error("该物品模板不存在"); return 0; } List scrappedGoodsParamList = goodsInfo.getScrappedGoodsList(); if (CollectionUtils.isEmpty(scrappedGoodsParamList)) { log.error("新增报废单物品记录失败"); return 0; } // 获取规格型号id List baseGoodsModelsIdList = scrappedGoodsParamList.stream() .map(params -> params.getBaseGoodsModelsId()).collect(Collectors.toList()); // 根据规格型号id查询规格型号 List models = this.baseGoodsModelsService.selectByModelsIdList(baseGoodsModelsIdList); if (CollectionUtils.isEmpty(models)) { log.error("该型号商品不存在"); return 0; } Map modelMap = models.stream().collect(Collectors.toMap(model -> model.getId(), model -> model)); // 获取报废原因code List scrappedCodeList = scrappedGoodsParamList.stream().map(params -> params.getScrappedCode()).collect(Collectors.toList()); // 根据报废原因code查询数据字典 List SDictDataList = this.sDictDataService.selectByScrappedCodeList(scrappedCodeList); Map scrappedNameMap = SDictDataList.stream().collect(Collectors.toMap(s -> s.getDict_code(), s -> s.getDict_label())); List scrappedGoodsList = new ArrayList<>(); for (LWhFormScrappedGoodsModelParams params : scrappedGoodsParamList) { LWhFormScrappedGoods scrappedGoods = new LWhFormScrappedGoods(); scrappedGoods.setId(IdUtil.generateId()); // 根据物品型号查询物品库存 List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); int goodsNum = lWhGoodsService.queryGoodsModelNum(WareHouseType.TENANT.getValue(), warehouseIds, scrappedGoods.getBaseGoodsModelsId(), 1, null); if (params.getCounts() > goodsNum) { log.error("报废数量大于库存数量"); return 0; } scrappedGoods.setCounts(params.getCounts()); // 报废原因 scrappedGoods.setScrappedCode(params.getScrappedCode()); scrappedGoods.setScrappedName(scrappedNameMap.get(Long.valueOf(params.getScrappedCode()))); scrappedGoods.setFormScrappedId(lWhFormScrappedId); // 物品模板 scrappedGoods.setBaseGoodsTemplateId(goodsTemplate.getId()); scrappedGoods.setGoodsTemplateName(goodsTemplate.getGoodsName()); // 规格型号 Long baseGoodsModelsId = params.getBaseGoodsModelsId(); BaseGoodsModels baseGoodsModels = modelMap.get(baseGoodsModelsId); if (baseGoodsModels != null) { scrappedGoods.setBaseGoodsModelsId(baseGoodsModelsId); scrappedGoods.setBaseGoodsModelsName(baseGoodsModels.getModelName()); scrappedGoods.setUnit(baseGoodsModels.getUnit()); } scrappedGoodsList.add(scrappedGoods); } int flag2 = this.scrappedGoodsService.insertBatch(scrappedGoodsList); if (flag2 == 0) { log.error("新增报废单物品记录 失败"); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return 0; } } // 3.根据报废单报废物品 Long lWarehouseFlowId = this.lWhFormScrappedCoreService.outFormByTransId(lWhFormScrappedId, currentUser, param.getDealTime()); if (lWarehouseFlowId == null) { log.error("根据出库单出库 失败"); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return 0; } return 1; } /** * @Description 列表查询 * @Author 卢庆阳 * @Date 2023/11/2 */ @Override public PageUtil queryList(LWhFormScrappedQry param, FinSysTenantUser sysInfo) { HashMap paramts = new HashMap<>(); StringBuilder sql = new StringBuilder(QUERY_LIST); // 报废单号 if (!StringUtils.isEmpty(param.getBusinessFormCode())) { sql.append("and BUSINESS_FORM_CODE = :businessFormCode "); paramts.put("businessFormCode", param.getBusinessFormCode()); } // 物品名称 if (!StringUtils.isEmpty(param.getGoodsTemplateName())) { sql.append("and fsg.GOODS_TEMPLATE_NAME LIKE :goodsTemplateName "); paramts.put("goodsTemplateName", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT); } // 机构 sql.append("and AGENCY_ID like :agencyId "); if (param.getAgencyId() != null) { paramts.put("agencyId", param.getAgencyId() + StringUtils.CHAR_PERCENT); } else { paramts.put("agencyId", sysInfo.getTenantId() + StringUtils.CHAR_PERCENT); } // 报废时间 if (param.getStartTime() != null) { sql.append("and DEAL_TIME >=:dealTimeStart "); paramts.put("dealTimeStart", param.getStartTime() * 1000000); } if (param.getEndTime() != null) { sql.append("and DEAL_TIME <:dealTimeEnd "); paramts.put("dealTimeEnd", param.getEndTime() * 1000000 + 240000); } sql.append("ORDER BY DEAL_TIME DESC"); GenericPager genericPager = selectSplit(sql.toString(), paramts, new LWhFormScrapped()); return new PageUtil(genericPager); } /** * @Description 根据id查询详情 * @Author 卢庆阳 * @Date 2023/11/2 */ @Override public LWhFormScrappedExtendVO getById(Long id) { LWhFormScrappedExtendVO scrappedExtend = new LWhFormScrappedExtendVO(); // 1.查询报废单 LWhFormScrapped lWhFormScrapped = this.get(new LWhFormScrapped(id)); if (lWhFormScrapped != null) { BeanUtils.copyProperties(lWhFormScrapped, scrappedExtend); } // 2.查询报废单商品信息 List scrappedGoodsInfoList = scrappedGoodsService.getScrappedGoodsByScrappedId(id); // 通过baseGoodsTemplateId 进行分组 Map> map = scrappedGoodsInfoList.stream().collect(Collectors.groupingBy(GoodModelInfoDTO::getBaseGoodsTemplateId)); // 循环map的key和value List scrappedGoodsVO = Lists.newArrayList(); for (Map.Entry> entry : map.entrySet()) { List goodsList = entry.getValue(); GoodModelInfoDTO goodModelInfoDTO = goodsList.stream().findFirst().orElse(null); GoodsTemplateInfoVO goodsTemplateInfoVO = new GoodsTemplateInfoVO(); if (goodModelInfoDTO != null) { goodsTemplateInfoVO.setId(goodModelInfoDTO.getId()); goodsTemplateInfoVO.setGoodsName(goodModelInfoDTO.getBaseGoodsName()); goodsTemplateInfoVO.setCategoryName(goodModelInfoDTO.getCategoryName()); goodsTemplateInfoVO.setId(goodModelInfoDTO.getId()); } List goodsModelList = Lists.newArrayList(); goodsList.forEach(item -> { GoodsModelVO goodsModelVO = new GoodsModelVO(); goodsModelVO.setId(item.getId()); goodsModelVO.setBaseGoodsModelsName(item.getBaseGoodsModelsName()); goodsModelVO.setUnit(item.getUnit()); goodsModelVO.setCounts(item.getCounts()); goodsModelVO.setBaseGoodsModelsId(item.getBaseGoodsModelsId()); goodsModelVO.setScrappedName(item.getScrappedName()); goodsModelList.add(goodsModelVO); }); goodsTemplateInfoVO.setModels(goodsModelList); scrappedGoodsVO.add(goodsTemplateInfoVO); } scrappedExtend.setScrappedGoods(scrappedGoodsVO); return scrappedExtend; } /** * 报废明细 * * @param param * @return */ @Override public PageUtil queryDetailList(LWhFormScrappedQry param, FinSysTenantUser sysInfo) { StringBuilder sql = new StringBuilder(QUERY_BF_DETAIL_LIST); HashMap paramts = new HashMap<>(); // 报废单号 if (!StringUtils.isEmpty(param.getBusinessFormCode())) { sql.append("and BUSINESS_FORM_CODE =:BUSINESS_FORM_CODE "); paramts.put("BUSINESS_FORM_CODE", param.getBusinessFormCode()); } // 物品名称 if (!StringUtils.isEmpty(param.getGoodsTemplateName())) { sql.append("and GOODS_TEMPLATE_NAME like:GOODS_TEMPLATE_NAME "); paramts.put("GOODS_TEMPLATE_NAME", StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT); } // 规格型号 if (param.getBaseGoodsModelsId() != null) { sql.append("and BASE_GOODS_MODELS_ID =:BASE_GOODS_MODELS_ID "); paramts.put("BASE_GOODS_MODELS_ID", param.getBaseGoodsModelsId()); } // 机构 sql.append("and AGENCY_ID like:AGENCY_ID "); if (param.getAgencyId() != null) { paramts.put("AGENCY_ID", param.getAgencyId() + StringUtils.CHAR_PERCENT); } else { paramts.put("AGENCY_ID", sysInfo.getTenantId() + StringUtils.CHAR_PERCENT); } // 创建人 if (!StringUtils.isEmpty(param.getOperatorName())) { sql.append("and OPERATOR_NAME =:OPERATOR_NAME "); paramts.put("OPERATOR_NAME", StringUtils.CHAR_PERCENT + param.getOperatorName() + StringUtils.CHAR_PERCENT); } // 结束时间 if (param.getStartTime() != null) { sql.append("and DEAL_TIME >=:dealTimeStart "); paramts.put("dealTimeStart", param.getStartTime() * 1000000); } if (param.getEndTime() != null) { sql.append("and DEAL_TIME <:dealTimeEnd "); paramts.put("dealTimeEnd", param.getEndTime() * 1000000 + 240000); } sql.append("ORDER BY DEAL_TIME DESC "); GenericPager> mapGenericPager = selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapperUtil()); PageUtil pageUtil = new PageUtil<>(mapGenericPager); List result = Lists.newArrayList(); mapGenericPager.getDatas().forEach(item -> { FormScrappedGoodsDetailVO formScrappedGoodsDetailVO = MapUtils.convertMapToObj(item, FormScrappedGoodsDetailVO.class); result.add(formScrappedGoodsDetailVO); }); pageUtil.setDatas(result); return pageUtil; } @Override public List export(Long id) { String sql = "SELECT BUSINESS_FORM_CODE,fs.DEAL_TIME,OPERATOR_NAME,\n" + "\tAGENCY_NAME tenantName,GOODS_TEMPLATE_NAME templateName,\n" + "\tBASE_GOODS_MODELS_NAME baseModelName,COUNTS num,SCRAPPED_NAME deception,\n" + "\tBEIZ remark,total_amount FROM l_wh_form_scrapped_goods fsg\n" + "\tLEFT JOIN l_wh_form_scrapped fs ON fs.id = fsg.FORM_SCRAPPED_ID WHERE fs.ID = :id\n" + "\tAND STATES = 1"; Map param = new HashMap<>(); param.put("id", id); List> select = this.select(sql, param, new MapperUtil()); if (CollectionUtils.isEmpty(select)) { return null; } List list = Lists.newArrayList(); select.forEach(item -> { ScrappedInfoExcelTemplate inventoryExcelTemplate = MapUtils.convertMapToObj(item, ScrappedInfoExcelTemplate.class); inventoryExcelTemplate.setAmount(CurrencyUtil.convertFenToYuan(inventoryExcelTemplate.getTotalAmount())); list.add(inventoryExcelTemplate); }); return list; } @Override public List getScrappedCountByBusinessId(Long businessId) { List goodsTemplateCount = Lists.newArrayList(); // 统计型号数量 String sql = "SELECT fsg.BASE_GOODS_TEMPLATE_ID id,fsg.GOODS_TEMPLATE_NAME goodsName,sum(counts) count FROM l_wh_form_scrapped fs left join l_wh_form_scrapped_goods fsg on fs.id = fsg.FORM_SCRAPPED_ID " + "where fsg.FORM_SCRAPPED_ID =:businessId group by fsg.BASE_GOODS_TEMPLATE_ID"; Map paramMap = new HashMap<>(); paramMap.put("businessId", businessId); List> procureModelList = this.select(sql, paramMap, new MapperUtil()); for (Map map : procureModelList) { GoodsTemplateCountVO goodsTemplateCountVO = MapUtils.convertMapToObj(map, GoodsTemplateCountVO.class); goodsTemplateCount.add(goodsTemplateCountVO); } return goodsTemplateCount; } }