package com.consum.base.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import cn.hutool.core.collection.CollectionUtil; import com.consum.base.pojo.query.LWhLedgerQry; import com.consum.base.service.*; import org.apache.commons.compress.utils.Lists; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import com.consum.base.core.CodeGeneratorEnum; import com.consum.base.core.CodeGeneratorService; import com.consum.base.core.type.InventoryStatesType; 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.excel.InventoryExcelTemplate; import com.consum.base.pojo.query.LWhFormInventoryQry; import com.consum.base.pojo.request.FormInventoryParam; import com.consum.base.pojo.request.LWhFormInventoryParam; import com.consum.base.pojo.response.FormInventoryDetailVO; import com.consum.base.pojo.response.FormInventoryGoodsVO; import com.consum.base.pojo.response.FormInventoryVO; import com.consum.base.service.core.LWhFormInventoryCoreService; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenant; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.LWhFormInventory; 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; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * @Description 盘点 * @Author 卢庆阳 * @Date 2023/10/23 */ @Slf4j @Service public class LWhFormInventoryServiceImpl extends BaseServiceImpl implements LWhFormInventoryService { @Autowired private CodeGeneratorService codeGeneratorService; @Autowired private BaseWarehouseService baseWarehouseService; @Autowired private LWhFormInventoryGoodsService inventoryGoodsService; @Autowired private LWhGoodsService lWhGoodsService; @Autowired private FinSysTenantService finSysTenantService; @Autowired @Lazy private LWhFormInventoryCoreService lWhFormInventoryCoreService; @Resource private FinWarehouseLedgerServiceImpl finWarehouseLedgerService; private static final String QUERY_LIST = "select * from l_wh_form_inventory where 1=1 "; private static final String QUERY_PD_DETAIL_LIST = "SELECT fig.id,fi.WAREHOUSE_NAME,fig.GOODS_TEMPLATE_NAME,fig.BASE_GOODS_MODELS_NAME,fig.INVENTORY_RESULT,fig.INIT_COUNTS,fig.INVENTORY_COUNTS," + "fig.ERROR_COUNTS,fi.AGENCY_NAME,fi.OPERATOR_NAME,fi.STOP_TIME operatorTime," + "CASE WHEN fig.INVENTORY_RESULT = 2 THEN fi.IN_BUSINESS_FORM_CODE WHEN fig.INVENTORY_RESULT = 3 THEN fi.OUT_BUSINESS_FORM_CODE END warehouseFormCode " + "FROM l_wh_form_inventory fi INNER JOIN l_wh_form_inventory_goods fig ON fi.ID = fig.WH_FORM_INVENTORY_ID where 1=1 "; /** * @param param * @param currentUser 当前登录用户 * @param operatorUser 盘点人 * @param monitorUser 监盘人 * @return * @Description 新增 * @Author 卢庆阳 * @Date 2023/10/31 */ @Override public int add(FormInventoryParam param, FinSysTenantUser currentUser, FinSysTenantUser operatorUser, FinSysTenantUser monitorUser) { // 新增盘点单 LWhFormInventory lWhFormInventory = new LWhFormInventory(); BeanUtils.copyProperties(param, lWhFormInventory); lWhFormInventory.setId(IdUtil.generateId()); // 盘点单编码 String businessFormCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Inventory); lWhFormInventory.setBusinessFormCode(businessFormCode); // 根据仓库id查询仓库 BaseWarehouse baseWarehouse = this.baseWarehouseService.getById(param.getWarehouseId()); if (baseWarehouse != null) { lWhFormInventory.setWarehouseName(baseWarehouse.getWarehouseName()); } if (operatorUser != null) { lWhFormInventory.setOperatorId(operatorUser.getId()); lWhFormInventory.setOperatorName(operatorUser.getUserName()); } if (monitorUser != null) { lWhFormInventory.setOperatorId2(monitorUser.getId()); lWhFormInventory.setOperatorName2(monitorUser.getUserName()); } lWhFormInventory.setStates(InventoryStatesType.NEW.getValue()); lWhFormInventory.setAgencyId(Long.valueOf(currentUser.getTenantId())); FinSysTenant finSysTenant = finSysTenantService.selectById(Long.valueOf(currentUser.getTenantId())); lWhFormInventory.setAgencyName(finSysTenant.getName()); lWhFormInventory.setCreatorId(currentUser.getSysUserId()); lWhFormInventory.setCreatorName(currentUser.getUserName()); lWhFormInventory.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); lWhFormInventory.setBeiz1(param.getRemark()); return this.insert(lWhFormInventory); } /** * @Description 盘点单列表查询 * @Author 卢庆阳 * @Date 2023/10/31 */ @Override public GenericPager queryList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) { StringBuilder sql = new StringBuilder(QUERY_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.getBusinessFormName())) { sql.append("and BUSINESS_FORM_NAME like :BUSINESS_FORM_NAME "); paramts.put("BUSINESS_FORM_NAME", StringUtils.CHAR_PERCENT + param.getBusinessFormName() + StringUtils.CHAR_PERCENT); } // 仓库编号 if (param.getWarehouseId() != null) { sql.append("and WAREHOUSE_ID =:WAREHOUSE_ID "); paramts.put("WAREHOUSE_ID", param.getWarehouseId()); } // 盘点时间 if (param.getStartTime() != null) { sql.append("and INVENTORY_DATE >=:inventoryDateStart "); paramts.put("inventoryDateStart", param.getStartTime() * 1000000); } if (param.getEndTime() != null) { sql.append("and INVENTORY_DATE <:inventoryDateEnd "); paramts.put("inventoryDateEnd", param.getEndTime() * 1000000 + 240000); } // 机构 sql.append("and AGENCY_ID =:agencyId "); paramts.put("agencyId", sysInfo.getTenantId()); sql.append("ORDER BY CREATE_TIME DESC "); return selectSplit(sql.toString(), paramts, new LWhFormInventory()); } @Override public FormInventoryVO saveInventory(FormInventoryVO dto, Long id) { // 1.根据盘点单id查询盘点单 LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(id)); if (lWhFormInventory == null) { log.error("根据盘点单id查询盘点单失败"); } // 2.修改盘点单 lWhFormInventory.setStates(InventoryStatesType.PENDING.getValue()); lWhFormInventory.setInventoryDate(DateUtils.getDateTimeNumber(System.currentTimeMillis())); int flag1 = this.update(lWhFormInventory); if (flag1 == 0) { log.error("修改盘点单失败"); } // 3.添加盘点单物品 List formInventoryGoodsList = dto.getFormInventoryGoodsList(); if (CollectionUtils.isEmpty(formInventoryGoodsList)) { log.error("盘点单物品为空"); } List result = inventoryGoodsService.add(formInventoryGoodsList, id); dto.setFormInventoryGoodsList(result); return dto; } /** * 保存盘点信息 * * @author 卢庆阳 * @date 2023/10/31 */ @Transactional(rollbackFor = Exception.class) @Override public int updateInventoryInfo(LWhFormInventoryParam dto, Integer state, S_user_core currentUser, FinSysTenantUser sysInfo) { // 1.根据盘点单id查询盘点单 LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(dto.getId())); if (lWhFormInventory == null) { log.error("根据盘点单id查询盘点单失败"); return 0; } // 添加盘点单物品 List inventoryGoodsList = dto.getInventoryGoodsList(); if (CollectionUtils.isEmpty(inventoryGoodsList)) { log.error("盘点单物品为空"); return 0; } inventoryGoodsService.updateInventoryGoods(inventoryGoodsList); // 修改盘点单 if (state == 2) { // 完成盘点时设置完成盘点时间 lWhFormInventory.setStopTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); // 完成盘点时设置完成盘点时间 String inOutFormByInventoryId = lWhFormInventoryCoreService.createInOutFormByInventoryId(dto.getId(), currentUser, sysInfo); if (!StringUtils.isEmpty(inOutFormByInventoryId)) { log.error(inOutFormByInventoryId); return 0; } } lWhFormInventory.setStates(state); lWhFormInventory.setInventoryDate(DateUtils.getDateTimeNumber(System.currentTimeMillis())); int flag1 = this.update(lWhFormInventory); if (flag1 == 0) { log.error("修改盘点单失败"); return 0; } return 1; } /** * @return * @Description 异常明细列表查询 * @Author 卢庆阳 * @Date 2023/11/1 */ @Override public PageUtil queryPdDetailList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) { StringBuilder sql = new StringBuilder(QUERY_PD_DETAIL_LIST); HashMap paramts = new HashMap<>(); // 机构 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 (param.getWarehouseId() != null) { sql.append("and WAREHOUSE_ID =:WAREHOUSE_ID "); paramts.put("WAREHOUSE_ID", param.getWarehouseId()); } // 物品名称 if (!StringUtils.isEmpty(param.getGoodsTemplateName())) { sql.append("and GOODS_TEMPLATE_NAME =: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()); } // 类型(出入库类型) Integer inventoryResult = param.getInventoryResult(); if (inventoryResult != null) { sql.append("and INVENTORY_RESULT =:INVENTORY_RESULT "); paramts.put("INVENTORY_RESULT", inventoryResult); } // 出入库单号 if (param.getWarehouseFormCode() != null) { sql.append( " and CASE WHEN fig.INVENTORY_RESULT = 2 THEN fi.IN_BUSINESS_FORM_CODE =:warehouseFormCode WHEN fig.INVENTORY_RESULT = 3 THEN fi.OUT_BUSINESS_FORM_CODE =:warehouseFormCode END "); paramts.put("warehouseFormCode", param.getWarehouseFormCode()); } // 操作人 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 STOP_TIME >=:stopTimeStart "); paramts.put("stopTimeStart", param.getStartTime() * 1000000); } if (param.getEndTime() != null) { sql.append("and STOP_TIME <:stopTimeEnd "); paramts.put("stopTimeEnd", param.getEndTime() * 1000000 + 240000); } sql.append("AND fig.INVENTORY_RESULT in(2,3) "); sql.append("ORDER BY CREATE_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 -> { FormInventoryDetailVO formInventoryDetailVO = MapUtils.convertMapToObj(item, FormInventoryDetailVO.class); formInventoryDetailVO.setInventoryResultType(formInventoryDetailVO.getInventoryResult() == null ? null : (formInventoryDetailVO.getInventoryResult() == 2 ? "盘盈" : "盘亏")); formInventoryDetailVO.setInventoryType(formInventoryDetailVO.getInventoryResult() == null ? null : (formInventoryDetailVO.getInventoryResult() == 2 ? "盘盈入库" : "盘亏出库")); formInventoryDetailVO.setWarehouseFormCode(formInventoryDetailVO.getWarehouseFormCode()); result.add(formInventoryDetailVO); }); pageUtil.setDatas(result); return pageUtil; } @Override public List selectDetailById(Long id) { String sql = "select fig.id, fig.BASE_GOODS_TEMPLATE_ID,fig.GOODS_TEMPLATE_NAME,fig.BASE_GOODS_MODELS_NAME," + "fig.INIT_COUNTS inventoryCount,fig.INVENTORY_COUNTS realNum,fig.INVENTORY_RESULT status,fig.unit,bgt.CLASSIFICATION type from " + "l_wh_form_inventory_goods fig left join base_goods_template bgt on bgt.id =fig.BASE_GOODS_TEMPLATE_ID where fig.WH_FORM_INVENTORY_ID = :id"; HashMap param = new HashMap<>(); param.put("id", id); List> select = select(sql, param, new MapperUtil()); List result = Lists.newArrayList(); select.forEach(item -> { FormInventoryGoodsVO formInventoryGoodsVO = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class); result.add(formInventoryGoodsVO); }); return result; } @Override public FormInventoryVO queryInventBaseGoodTemplate(Long id) { FormInventoryVO formInventoryVO = new FormInventoryVO(); LWhFormInventory lWhFormInventory = new LWhFormInventory(); lWhFormInventory.setId(id); LWhFormInventory inventory = this.get(lWhFormInventory); if (inventory == null) { return null; } Long warehouseId = inventory.getWarehouseId(); formInventoryVO.setBusinessFormCode(inventory.getBusinessFormCode()); formInventoryVO.setBusinessFormName(inventory.getBusinessFormName()); formInventoryVO.setWarehouseId(warehouseId); formInventoryVO.setWarehouseName(inventory.getWarehouseName()); // 统计仓库内的物品 String sql = "SELECT distinct bgt.id baseGoodsTemplateId,bgm.id baseGoodsModelId,bgt.GOODS_NAME goodsTemplateName,bgm.MODEL_NAME baseGoodsModelsName," + "bgt.CLASSIFICATION TYPE,bgm.UNIT FROM l_wh_goods g " + "LEFT JOIN base_goods_template bgt ON g.BASE_GOODS_TEMPLATE_ID = bgt.ID " + "LEFT JOIN base_goods_models bgm ON bgm.GOODS_TEMPLATES_ID = bgt.id WHERE " + "WAREHOUSE_ID = :warehouseId GROUP BY g.BASE_GOODS_MODELS_ID "; HashMap param = new HashMap<>(); param.put("warehouseId", warehouseId); List> result = this.select(sql, param, new MapperUtil()); List goodsVOList = Lists.newArrayList(); result.forEach(item -> { FormInventoryGoodsVO baseGoodsModels = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class); List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); int inventoryCount = this.lWhGoodsService.queryGoodsModelNum(null, warehouseIds, baseGoodsModels.getBaseGoodsModelId(), 1, null); baseGoodsModels.setInventoryCount(inventoryCount); goodsVOList.add(baseGoodsModels); }); formInventoryVO.setFormInventoryGoodsList(goodsVOList); return formInventoryVO; } @Override public List getExportList(Long id) { String sql = "SELECT\n" + "\tfi.INVENTORY_DATE createTime,\n" + "\tfi.STOP_TIME endTime,\n" + "\tfi.OPERATOR_NAME,\n" + "\tfi.OPERATOR_NAME2 monitorName,\n" + "\tfi.AGENCY_NAME tenantName,\n" + "\tfig.GOODS_TEMPLATE_NAME templateName,\n" + "\tfig.BASE_GOODS_MODELS_NAME baseModelName,\n" + "\tfig.INVENTORY_COUNTS num,\n" + "\tfig.INIT_COUNTS stockNum,\n" + "\tfig.INVENTORY_RESULT,\n" + "\tBEIZ1 remark\n" + "FROM\n" + "\tl_wh_form_inventory fi\n" + "\tLEFT JOIN l_wh_form_inventory_goods fig ON fi.ID = fig.WH_FORM_INVENTORY_ID\n" + "WHERE\n" + "\tfi.ID = :id"; HashMap param = new HashMap<>(); param.put("id", id); List> select = this.select(sql, param, new MapperUtil()); if (CollectionUtils.isEmpty(select)) { return Collections.emptyList(); } List list = Lists.newArrayList(); select.forEach(item -> { InventoryExcelTemplate inventoryExcelTemplate = MapUtils.convertMapToObj(item, InventoryExcelTemplate.class); inventoryExcelTemplate.setInventoryDeception(inventoryExcelTemplate.getInventoryResult() == 1 ? "是" : "否"); inventoryExcelTemplate.setDeception(inventoryExcelTemplate.getInventoryResult() == 1 ? "正常" : (inventoryExcelTemplate.getInventoryResult() == 2 ? "盘盈" : "盘亏")); list.add(inventoryExcelTemplate); }); return list; } @Override public Integer isAddInventory(LWhFormInventoryQry param, FinSysTenantUser sysInfo) { // isAddInventory StringBuilder sql = new StringBuilder(QUERY_LIST); HashMap paramts = new HashMap<>(); // 机构 sql.append("and AGENCY_ID =:agencyId "); paramts.put("agencyId", sysInfo.getTenantId()); // 状态 sql.append("and states !=:states "); paramts.put("states", "2"); List select = select(sql.toString(), paramts, new LWhFormInventory()); if (!CollectionUtil.isEmpty(select)) { return 0; } LWhLedgerQry query = new LWhLedgerQry(); query.setAgencyId(new Long(sysInfo.getTenantId())); query.setPageSize(100); query.setPageNum(1); query.setStates(new Short("1")); GenericPager pager = finWarehouseLedgerService.ledgerList(query); if(pager==null || CollectionUtil.isEmpty(pager.getDatas())){ return -1; } return 1; } }