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<LWhFormInventory> queryList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) {
|
StringBuilder sql = new StringBuilder(QUERY_LIST);
|
HashMap<String, Object> 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<FormInventoryGoodsVO> formInventoryGoodsList = dto.getFormInventoryGoodsList();
|
if (CollectionUtils.isEmpty(formInventoryGoodsList)) {
|
log.error("盘点单物品为空");
|
}
|
List<FormInventoryGoodsVO> 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<FormInventoryGoodsVO> 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<FormInventoryDetailVO> queryPdDetailList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) {
|
StringBuilder sql = new StringBuilder(QUERY_PD_DETAIL_LIST);
|
HashMap<String, Object> 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<Map<String, Object>> mapGenericPager =
|
selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapperUtil());
|
PageUtil<FormInventoryDetailVO> pageUtil = new PageUtil<>(mapGenericPager);
|
List<FormInventoryDetailVO> 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<FormInventoryGoodsVO> 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<String, Object> param = new HashMap<>();
|
param.put("id", id);
|
List<Map<String, Object>> select = select(sql, param, new MapperUtil());
|
List<FormInventoryGoodsVO> 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<String, Object> param = new HashMap<>();
|
param.put("warehouseId", warehouseId);
|
|
List<Map<String, Object>> result = this.select(sql, param, new MapperUtil());
|
List<FormInventoryGoodsVO> goodsVOList = Lists.newArrayList();
|
result.forEach(item -> {
|
FormInventoryGoodsVO baseGoodsModels = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class);
|
List<Long> 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<InventoryExcelTemplate> 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<String, Object> param = new HashMap<>();
|
param.put("id", id);
|
List<Map<String, Object>> select = this.select(sql, param, new MapperUtil());
|
if (CollectionUtils.isEmpty(select)) {
|
return Collections.emptyList();
|
}
|
List<InventoryExcelTemplate> 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<String, Object> paramts = new HashMap<>();
|
// 机构
|
sql.append("and AGENCY_ID =:agencyId ");
|
paramts.put("agencyId", sysInfo.getTenantId());
|
// 状态
|
sql.append("and states !=:states ");
|
paramts.put("states", "2");
|
List<LWhFormInventory> 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;
|
}
|
}
|