package com.consum.base.service; import com.consum.base.core.CodeGeneratorEnum; import com.consum.base.core.CodeGeneratorService; import com.consum.base.core.utils.IdUtil; import com.consum.base.core.utils.MapRowMapper; import com.consum.base.core.utils.MapUtils; import com.consum.base.core.utils.MapperUtil; import com.consum.base.pojo.request.FormInventoryParam; import com.consum.base.pojo.request.LWhFormInventoryParam; import com.consum.base.pojo.response.FormInventoryGoodsVO; import com.consum.base.pojo.response.FormInventoryVO; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.FinSysTenantUser; import com.consum.model.po.LWhFormInventory; 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.HashMap; import java.util.List; import java.util.Map; import lombok.extern.slf4j.Slf4j; 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.util.CollectionUtils; /** * @Description 盘点 * @Author 卢庆阳 * @Date 2023/10/23 */ @Slf4j @Service public class LWhFormInventoryServiceImpl extends BaseServiceImpl { @Autowired private CodeGeneratorService codeGeneratorService; @Autowired private BaseWarehouseServiceImpl baseWarehouseService; @Autowired private FinSysTenantUserServiceImpl finSysTenantUserService; @Autowired private LWhFormInventoryGoodsServiceImpl inventoryGoodsService; @Autowired private BaseGoodsTemplateServiceImpl baseGoodsTemplateService; @Autowired private LWhGoodsService lWhGoodsService; private static final String QUERY_LIST = "select * from l_wh_form_inventory where 1=1 "; private static final String QUERY_PD_List = "SELECT bgt.GOODS_NAME goodsName,model.MODEL_NAME modelName,bgt.CLASSIFICATION,model.UNIT,\n" + " record.endCount,bgt.ID goodsTemplateId,model.ID modelsId\n" + "FROM BASE_GOODS_MODELS model\n" + " LEFT JOIN (SELECT COUNT(1) endCount, BASE_GOODS_MODELS_ID\n" + " FROM L_WH_GOODS\n" + " WHERE WAREHOUSE_TYPE = 0\n" + " AND WAREHOUSE_ID = 1\n" + " AND STATES = ?\n" + " GROUP BY BASE_GOODS_MODELS_ID) record ON record.BASE_GOODS_MODELS_ID = model.id\n" + "left join base_goods_template bgt on bgt.ID = model.GOODS_TEMPLATES_ID; "; private static final String QUERY_PD_DETAIL_LIST = "select lwfi.WAREHOUSE_NAME,lwfig.GOODS_TEMPLATE_NAME,\n" + " lwfig.BASE_GOODS_MODELS_NAME,\n" + " lwfig.INVENTORY_RESULT,\n" + " lwfig.INIT_COUNTS,\n" + " lwfig.INVENTORY_COUNTS,\n" + " lwfig.ERROR_COUNTS,\n" + " lwfi.AGENCY_NAME,\n" + " lwfi.OPERATOR_NAME,\n" + " lwfi.STOP_TIME\n" + "from l_wh_form_inventory lwfi\n" + " inner join l_wh_form_inventory_goods lwfig on lwfi.ID = lwfig.WH_FORM_INVENTORY_ID "; /** * @param param * @param currentUser 当前登录用户 * @param operatorUser 盘点人 * @param monitorUser 监盘人 * @return * @Description 新增 * @Author 卢庆阳 * @Date 2023/10/31 */ 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(0); lWhFormInventory.setAgencyId(Long.valueOf(currentUser.getTenantId())); lWhFormInventory.setAgencyName(currentUser.getTenantName()); 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 */ public GenericPager queryList(com.consum.base.pojo.LWhFormInventoryParam 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 =:AGENCY_ID "); paramts.put("AGENCY_ID", sysInfo.getTenantId()); sql.append("ORDER BY CREATE_TIME DESC "); return selectSplit(sql.toString(), paramts, new LWhFormInventory()); } /** * @param id 盘点单id * @Description 盘点 * @Author 卢庆阳 * @Date 2023/10/31 */ public List queryPdList(Long id) { //1.根据盘点单id查询盘点单 LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(id)); if (lWhFormInventory == null) { log.error("盘点失败"); } //2.查询盘点单数据 List> list = this.select(QUERY_PD_List, new Object[]{lWhFormInventory.getWarehouseId()}); if (CollectionUtils.isEmpty(list)) { log.error("盘点失败"); return null; } //3.新增盘点单物品记录 // int flag = inventoryGoodsService.add(list, lWhFormInventory.getWarehouseId()); // if (flag != list.size()) { // log.error("新增盘点单记录"); // return null; // } //4.根据盘点单id查询盘点单物品 return inventoryGoodsService.getByInventoryId(id); } /** * 暂存 * * @author 卢庆阳 * @date 2023/10/31 */ public int temporaryStorage(LWhFormInventoryParam dto, Integer state) { //1.根据盘点单id查询盘点单 LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(dto.getId())); if (lWhFormInventory == null) { log.error("根据盘点单id查询盘点单失败"); return 0; } //2.修改盘点单 lWhFormInventory.setStates(state); lWhFormInventory.setInventoryDate(DateUtils.getDateTimeNumber(System.currentTimeMillis())); int flag1 = this.update(lWhFormInventory); if (flag1 == 0) { log.error("修改盘点单失败"); return 0; } //3.添加盘点单物品 List inventoryGoodsList = dto.getInventoryGoodsList(); if (CollectionUtils.isEmpty(inventoryGoodsList)) { log.error("盘点单物品为空"); return 0; } int flag2 = inventoryGoodsService.add(inventoryGoodsList, lWhFormInventory.getWarehouseId()); if (flag2 != inventoryGoodsList.size()) { log.error("更新盘点单物品失败"); return 0; } return 1; } /** * 完成盘点 * * @author 卢庆阳 * @date 2023/10/31 */ // public int finishPd(LWhFormInventoryParam dto) { // //1.根据盘点单id查询盘点单 // LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(dto.getId())); // if (lWhFormInventory == null) { // log.error("根据盘点单id查询盘点单 失败"); // return 0; // } // //2.修改盘点单 // lWhFormInventory.setStates(2); // lWhFormInventory.setStopTime(DateUtils.getDateTimeNumber(System.currentTimeMillis())); // int flag1 = this.update(lWhFormInventory); // if (flag1 == 0) { // log.error("修改盘点单 失败"); // return 0; // } // //3.更新盘点单物品 // List inventoryGoodsList = dto.getInventoryGoodsList(); // if (CollectionUtils.isEmpty(inventoryGoodsList)) { // log.error("盘点单物品 为空"); // return 0; // } // for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) { // int errorCounts = inventoryGoods.getInitCounts() - inventoryGoods.getInventoryCounts(); // if (errorCounts > 0) { // inventoryGoods.setInventoryResult(3); // } else if (errorCounts < 0) { // inventoryGoods.setInventoryResult(2); // } else { // inventoryGoods.setInventoryResult(1); // } // inventoryGoods.setErrorCounts(Math.abs(errorCounts)); // } // int flag2 = inventoryGoodsService.update(inventoryGoodsList); // if (flag2 != inventoryGoodsList.size()) { // log.error("更新盘点单物品 失败"); // return 0; // } // return 1; // } /** * @return * @Description 异常明细列表查询 * @Author 卢庆阳 * @Date 2023/11/1 */ public GenericPager> queryPdDetailList(com.consum.base.pojo.LWhFormInventoryParam 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) { if (inventoryResult == 2) { //盘盈入库 sql.append(" and IN_BUSINESS_FORM_CODE =:IN_BUSINESS_FORM_CODE "); paramts.put("IN_BUSINESS_FORM_CODE", StringUtils.CHAR_PERCENT + param.getWarehouseFormCode() + StringUtils.CHAR_PERCENT); } else { //盘亏出库 sql.append(" and OUT_BUSINESS_FORM_CODE =:OUT_BUSINESS_FORM_CODE "); paramts.put("OUT_BUSINESS_FORM_CODE", StringUtils.CHAR_PERCENT + param.getWarehouseFormCode() + 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.getStopTimeStart() != null) { sql.append(" and STOP_TIME >=:stopTimeStart "); paramts.put("stopTimeStart", param.getStopTimeStart() * 1000000); } if (param.getStopTimeEnd() != null) { sql.append(" and STOP_TIME <:stopTimeEnd "); paramts.put("stopTimeEnd", param.getStopTimeEnd() * 1000000 + 240000); } sql.append(" ORDER BY CREATE_TIME DESC "); return selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapRowMapper()); } 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 total,fig.INVENTORY_COUNTS,fig.INVENTORY_RESULT status from " + "l_wh_form_inventory_goods fig 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; } 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(); Integer warehouseType = inventory.getWarehouseType(); formInventoryVO.setBusinessFormCode(inventory.getBusinessFormCode()); formInventoryVO.setBusinessFormName(inventory.getBusinessFormName()); formInventoryVO.setWarehouseId(warehouseId); formInventoryVO.setWarehouseName(inventory.getWarehouseName()); String sql = "select bgm.id,bgt.id baseGoodsTemplateId,bgt.GOODS_NAME goodsTemplateName,bgm.MODEL_NAME baseGoodsModelsName,bgt.CLASSIFICATION type,bgm.UNIT from base_goods_models bgm left join base_goods_template bgt on bgm.GOODS_TEMPLATES_ID = bgt.id " + "where bgt.AGENCY_ID = :agencyId"; HashMap param = new HashMap<>(); param.put("agencyId", inventory.getAgencyId()); List> result = this.select(sql, param, new MapperUtil()); List goodsVOList = Lists.newArrayList(); result.forEach(item -> { FormInventoryGoodsVO baseGoodsModels = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class); int inventoryCount = this.lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseId, baseGoodsModels.getId(), 1, null); baseGoodsModels.setInventoryCount(inventoryCount); goodsVOList.add(baseGoodsModels); }); formInventoryVO.setFormInventoryGoodsList(goodsVOList); return formInventoryVO; } }