|
|
|
@ -11,6 +11,8 @@ import com.glxp.api.admin.constant.Constant;
|
|
|
|
|
import com.glxp.api.admin.constant.ConstantStatus;
|
|
|
|
|
import com.glxp.api.admin.constant.ConstantType;
|
|
|
|
|
import com.glxp.api.admin.dao.basic.BussinessTypeDao;
|
|
|
|
|
import com.glxp.api.admin.dao.basic.CompanyProductRelevanceDao;
|
|
|
|
|
import com.glxp.api.admin.dao.basic.UdiRelevanceDao;
|
|
|
|
|
import com.glxp.api.admin.dao.basic.UnitMaintainDao;
|
|
|
|
|
import com.glxp.api.admin.dao.inout.CodesDao;
|
|
|
|
|
import com.glxp.api.admin.dao.inout.CodesTempDao;
|
|
|
|
@ -19,11 +21,13 @@ import com.glxp.api.admin.dao.inventory.*;
|
|
|
|
|
import com.glxp.api.admin.entity.auth.AuthAdmin;
|
|
|
|
|
import com.glxp.api.admin.entity.basic.BussinessTypeEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.basic.UdiEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.basic.UdiRelevanceEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.basic.UnitMaintainEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.inout.OrderEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.inout.WarehouseEntity;
|
|
|
|
|
import com.glxp.api.admin.entity.inventory.*;
|
|
|
|
|
import com.glxp.api.admin.req.inventory.*;
|
|
|
|
|
import com.glxp.api.admin.res.basic.UdiRelevanceResponse;
|
|
|
|
|
import com.glxp.api.admin.res.inventory.InvCountOrderResponse;
|
|
|
|
|
import com.glxp.api.admin.service.auth.CustomerService;
|
|
|
|
|
import com.glxp.api.admin.service.inventory.InvCountCodesService;
|
|
|
|
@ -73,6 +77,11 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
private InvCountCodesService invCountCodesService;
|
|
|
|
|
@Resource
|
|
|
|
|
private CodesDao codesDao;
|
|
|
|
|
@Resource
|
|
|
|
|
private CompanyProductRelevanceDao companyProductRelevanceDao;
|
|
|
|
|
@Resource
|
|
|
|
|
private UdiRelevanceDao udiRelevanceDao;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<InvCountOrderResponse> filterList(FilterInvCountOrderRequest filterInvCountOrderRequest) {
|
|
|
|
@ -88,9 +97,15 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
@Override
|
|
|
|
|
public void deleteOrder(String id) {
|
|
|
|
|
String orderId = invCountOrderDao.selectOrderIdById(id);
|
|
|
|
|
invCountOrderDao.deleteByPrimaryKey(Integer.valueOf(id));
|
|
|
|
|
invCountOrderDetailDao.deleteByOrderId(orderId);
|
|
|
|
|
invCountCodesDao.deleteByOrderId(orderId);
|
|
|
|
|
log.info("开始删除盘点单据,盘点单号: {}", orderId);
|
|
|
|
|
invCountOrderDao.deleteByOrderId(orderId);
|
|
|
|
|
if (invCountOrderDetailDao.countByOrderIdFk(orderId) > 0) {
|
|
|
|
|
invCountOrderDetailDao.deleteByOrderId(orderId);
|
|
|
|
|
}
|
|
|
|
|
if (invCountCodesDao.countByOrderIdFk(orderId) > 0) {
|
|
|
|
|
invCountCodesDao.deleteByOrderId(orderId);
|
|
|
|
|
}
|
|
|
|
|
log.info("盘点单据删除完成");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -190,10 +205,12 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
} else {
|
|
|
|
|
//审核通过
|
|
|
|
|
//根据单据详情生成相关单据
|
|
|
|
|
log.info("单据审核通过,开始生成扫码单据");
|
|
|
|
|
ThreadUtil.execAsync(() -> {
|
|
|
|
|
countOrderTransfer(invCountOrder);
|
|
|
|
|
});
|
|
|
|
|
log.info("单据审核通过后将会生成对应盘盈盘亏单是否继续?,开始生成扫码单据");
|
|
|
|
|
// ThreadUtil.execAsync(() -> {
|
|
|
|
|
//
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
countTransferOrder(invCountOrder);
|
|
|
|
|
}
|
|
|
|
|
invCountOrderDao.updateByPrimaryKey(invCountOrder);
|
|
|
|
|
return ResultVOUtils.success();
|
|
|
|
@ -293,7 +310,7 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
warehouseEntity.setReCount(codeNum);
|
|
|
|
|
|
|
|
|
|
//设置供应商信息
|
|
|
|
|
setSupInfo(warehouseEntity);
|
|
|
|
|
setSupInfo(warehouseEntity, "loss");
|
|
|
|
|
outOrderCodes.add(warehouseEntity);
|
|
|
|
|
} else {
|
|
|
|
|
for (InvProductDetailEntity invProductDetailEntity : invProductDetailEntities) {
|
|
|
|
@ -309,10 +326,15 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
int codeNum = invCountOrderDetail.getLossNum() / actCount;
|
|
|
|
|
warehouseEntity.setCount(codeNum);
|
|
|
|
|
warehouseEntity.setReCount(codeNum);
|
|
|
|
|
} else {
|
|
|
|
|
//修改实际数量
|
|
|
|
|
int actCount = invCountCodesService.getActCount(udi.getUdi());
|
|
|
|
|
warehouseEntity.setCount(actCount);
|
|
|
|
|
warehouseEntity.setReCount(actCount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//设置供应商信息
|
|
|
|
|
setSupInfo(warehouseEntity);
|
|
|
|
|
setSupInfo(warehouseEntity, "loss");
|
|
|
|
|
outOrderCodes.add(warehouseEntity);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -326,7 +348,7 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
detailRequest.setStatus(1);
|
|
|
|
|
List<InvCountOrderDetail> profitDetailList = invCountOrderDetailDao.selectDetailList(detailRequest);
|
|
|
|
|
if (CollUtil.isNotEmpty(profitDetailList)) {
|
|
|
|
|
log.info("开始生成盘盈单据码明细");
|
|
|
|
|
log.info("开始生成盘盈单据码.明细");
|
|
|
|
|
//查询盘盈产品的库存详情
|
|
|
|
|
for (InvCountOrderDetail invCountOrderDetail : profitDetailList) {
|
|
|
|
|
//查询库存详情
|
|
|
|
@ -341,24 +363,34 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
List<String> countCodesList = invCountCodesDao.selectCodes(codesRequest);
|
|
|
|
|
List<String> invProductCodeList = invProductDetailEntities.stream().map(InvProductDetailEntity::getOriginCode).collect(Collectors.toList());
|
|
|
|
|
List<String> profitCodes = CollUtil.subtractToList(countCodesList, invProductCodeList); //计算盘盈的条码
|
|
|
|
|
log.info("查询盘盈产品的库存详情");
|
|
|
|
|
if (CollUtil.isNotEmpty(invProductCodeList) && CollUtil.isEmpty(profitCodes)) {
|
|
|
|
|
/**
|
|
|
|
|
* 盘点条码不为空,且库存条码也不为空,但是计算的条码差集为空
|
|
|
|
|
* 说明盘点的条码和库存的条码是相同的条码,直接根据盘盈数量计算出扫码数量,生成一个条码即可
|
|
|
|
|
*/
|
|
|
|
|
WarehouseEntity warehouseEntity = buildWarehouse(invCountOrder, countCodesList.get(0), invCountOrderDetail.getProductId());
|
|
|
|
|
String code = null;
|
|
|
|
|
if (CollUtil.isNotEmpty(countCodesList)) {
|
|
|
|
|
code = countCodesList.get(0);
|
|
|
|
|
} else {
|
|
|
|
|
code = invProductCodeList.get(0);
|
|
|
|
|
}
|
|
|
|
|
WarehouseEntity warehouseEntity = buildWarehouse(invCountOrder, code, invCountOrderDetail.getProductId());
|
|
|
|
|
//判断此条码,是否有批次号和序列号
|
|
|
|
|
UdiEntity udi = FilterUdiUtils.getUdi(countCodesList.get(0));
|
|
|
|
|
UdiEntity udi = FilterUdiUtils.getUdi(code);
|
|
|
|
|
//修改码数量
|
|
|
|
|
int actCount = invCountCodesService.getActCount(udi.getUdi());
|
|
|
|
|
//使用此盘点单据详情的盘亏数量 / 实际数量,计算得出扫码数量
|
|
|
|
|
//使用此盘点单据详情的盘盈数量 / 实际数量,计算得出扫码数量
|
|
|
|
|
int codeNum = invCountOrderDetail.getProfitNum() / actCount;
|
|
|
|
|
warehouseEntity.setCount(codeNum);
|
|
|
|
|
warehouseEntity.setReCount(codeNum);
|
|
|
|
|
setSupInfo(warehouseEntity);
|
|
|
|
|
setSupInfo(warehouseEntity, "profit");
|
|
|
|
|
inOrderCodes.add(warehouseEntity);
|
|
|
|
|
log.info("添加库存条码");
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
for (String code : profitCodes) {
|
|
|
|
|
log.info("添加盘盈天马条码");
|
|
|
|
|
if (!verifyCodeExist(inOrderCodes, code)) {
|
|
|
|
|
//生成码详情
|
|
|
|
|
WarehouseEntity warehouseEntity = buildWarehouse(invCountOrder, code, invCountOrderDetail.getProductId());
|
|
|
|
@ -367,12 +399,17 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
if ((StrUtil.isBlank(udi.getBatchNo()) && StrUtil.isBlank(udi.getSerialNo())) || (StrUtil.isBlank(udi.getSerialNo()) && StrUtil.isNotBlank(udi.getBatchNo()))) {
|
|
|
|
|
//修改码数量
|
|
|
|
|
int actCount = invCountCodesService.getActCount(udi.getUdi());
|
|
|
|
|
//使用此盘点单据详情的盘亏数量 / 实际数量,计算得出扫码数量
|
|
|
|
|
//使用此盘点单据详情的盘盈数量 / 实际数量,计算得出扫码数量
|
|
|
|
|
int codeNum = invCountOrderDetail.getProfitNum() / actCount;
|
|
|
|
|
warehouseEntity.setCount(codeNum);
|
|
|
|
|
warehouseEntity.setReCount(codeNum);
|
|
|
|
|
} else {
|
|
|
|
|
//修改实际数量
|
|
|
|
|
int actCount = invCountCodesService.getActCount(udi.getUdi());
|
|
|
|
|
warehouseEntity.setCount(actCount);
|
|
|
|
|
warehouseEntity.setReCount(actCount);
|
|
|
|
|
}
|
|
|
|
|
setSupInfo(warehouseEntity);
|
|
|
|
|
setSupInfo(warehouseEntity, "profit");
|
|
|
|
|
inOrderCodes.add(warehouseEntity);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -425,19 +462,137 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
invCountOrderDao.updateByOrderId(invCountOrder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 新版盘点单据转换
|
|
|
|
|
*/
|
|
|
|
|
private void countTransferOrder(InvCountOrder invCountOrder) {
|
|
|
|
|
|
|
|
|
|
List<InvCountSettingEntity> list = invCountSettingDao.filterList(null);
|
|
|
|
|
if (CollUtil.isEmpty(list)) {
|
|
|
|
|
log.error("未配置盘点单据设置参数,无法转单");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
InvCountSettingEntity invCountSettingEntity = list.get(0);
|
|
|
|
|
|
|
|
|
|
List<InvCountOrderDetail> orderDetailList = invCountOrderDetailDao.selectByOrderId(invCountOrder.getOrderId());
|
|
|
|
|
List<WarehouseEntity> lossCodesList = new ArrayList<>();
|
|
|
|
|
List<WarehouseEntity> profitCodesList = new ArrayList<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(orderDetailList)) {
|
|
|
|
|
for (InvCountOrderDetail invCountOrderDetail : orderDetailList) {
|
|
|
|
|
if (IntUtil.value(invCountOrderDetail.getLossNum()) > 0) {
|
|
|
|
|
WarehouseEntity warehouseEntity = buildCodeEntity(invCountOrderDetail, invCountOrder, ConstantType.TYPE_OUT);
|
|
|
|
|
warehouseEntity.setSupId(getSupId(warehouseEntity));
|
|
|
|
|
lossCodesList.add(warehouseEntity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (IntUtil.value(invCountOrderDetail.getProfitNum()) > 0) {
|
|
|
|
|
WarehouseEntity warehouseEntity = buildCodeEntity(invCountOrderDetail, invCountOrder, ConstantType.TYPE_OUT);
|
|
|
|
|
warehouseEntity.setSupId(getSupId(warehouseEntity));
|
|
|
|
|
profitCodesList.add(warehouseEntity);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//生成盘亏出库单
|
|
|
|
|
if (CollUtil.isNotEmpty(lossCodesList)) {
|
|
|
|
|
OrderEntity order = createOrder(invCountSettingEntity, invCountOrder, ConstantType.TYPE_OUT);
|
|
|
|
|
lossCodesList.forEach(warehouseEntity -> {
|
|
|
|
|
warehouseEntity.setOrderId(order.getId());
|
|
|
|
|
warehouseEntity.setAction(order.getAction());
|
|
|
|
|
warehouseEntity.setFromCorp(order.getFromCorp());
|
|
|
|
|
warehouseEntity.setFromCorpId(order.getFromCorpId());
|
|
|
|
|
warehouseEntity.setCorpOrderId(order.getCorpOrderId());
|
|
|
|
|
});
|
|
|
|
|
orderDao.insertOrder(order);
|
|
|
|
|
codesTempDao.insertCodesTemp(lossCodesList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//生成盘盈入库单
|
|
|
|
|
if (CollUtil.isNotEmpty(profitCodesList)) {
|
|
|
|
|
OrderEntity order = createOrder(invCountSettingEntity, invCountOrder, ConstantType.TYPE_PUT);
|
|
|
|
|
profitCodesList.forEach(warehouseEntity -> {
|
|
|
|
|
warehouseEntity.setOrderId(order.getId());
|
|
|
|
|
warehouseEntity.setAction(order.getAction());
|
|
|
|
|
warehouseEntity.setFromCorp(order.getFromCorp());
|
|
|
|
|
warehouseEntity.setFromCorpId(order.getFromCorpId());
|
|
|
|
|
warehouseEntity.setCorpOrderId(order.getCorpOrderId());
|
|
|
|
|
});
|
|
|
|
|
orderDao.insertOrder(order);
|
|
|
|
|
codesTempDao.insertCodesTemp(profitCodesList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private WarehouseEntity buildCodeEntity(InvCountOrderDetail invCountOrderDetail, InvCountOrder invCountOrder, String mainAction) {
|
|
|
|
|
|
|
|
|
|
List<UdiRelevanceResponse> udiRelevanceResponses = udiRelevanceDao.selectByRelId(invCountOrderDetail.getProductId());
|
|
|
|
|
String code = FilterUdiUtils.transGlxpNoSerStr(udiRelevanceResponses, invCountOrderDetail);
|
|
|
|
|
WarehouseEntity warehouseEntity = new WarehouseEntity();
|
|
|
|
|
warehouseEntity.setOrderId(invCountOrder.getOrderId());
|
|
|
|
|
warehouseEntity.setCode(code);
|
|
|
|
|
warehouseEntity.setRelId(invCountOrderDetail.getProductId());
|
|
|
|
|
warehouseEntity.setMainAction(mainAction);
|
|
|
|
|
warehouseEntity.setActor(invCountOrder.getCreateUser());
|
|
|
|
|
warehouseEntity.setInvStorageCode(invCountOrder.getInvStorageCode());
|
|
|
|
|
warehouseEntity.setInvWarehouseCode(invCountOrder.getInvWarehouseCode());
|
|
|
|
|
warehouseEntity.setLocStorageCode(invCountOrder.getInvStorageCode());
|
|
|
|
|
UdiEntity udi = FilterUdiUtils.getUdi(code);
|
|
|
|
|
warehouseEntity.setBatchNo(udi.getBatchNo());
|
|
|
|
|
warehouseEntity.setProduceDate(udi.getProduceDate());
|
|
|
|
|
warehouseEntity.setExpireDate(udi.getExpireDate());
|
|
|
|
|
warehouseEntity.setSerialNo(udi.getSerialNo());
|
|
|
|
|
warehouseEntity.setNameCode(udi.getUdi());
|
|
|
|
|
if (mainAction.equals(ConstantType.TYPE_PUT)) {
|
|
|
|
|
warehouseEntity.setCount(invCountOrderDetail.getProfitNum());
|
|
|
|
|
warehouseEntity.setReCount(invCountOrderDetail.getProfitNum());
|
|
|
|
|
} else {
|
|
|
|
|
warehouseEntity.setCount(invCountOrderDetail.getLossNum());
|
|
|
|
|
warehouseEntity.setReCount(invCountOrderDetail.getLossNum());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return warehouseEntity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对条码添加供应商信息
|
|
|
|
|
*
|
|
|
|
|
* @param warehouseEntity
|
|
|
|
|
* @param warehouseEntity 码明细
|
|
|
|
|
* @param countStatus 盈亏状态
|
|
|
|
|
*/
|
|
|
|
|
private void setSupInfo(WarehouseEntity warehouseEntity) {
|
|
|
|
|
//设置供应商参数
|
|
|
|
|
String supId = invProductDetailDao.selectSupIdByCode(warehouseEntity.getCode());
|
|
|
|
|
if (StrUtil.isNotEmpty(supId)) {
|
|
|
|
|
warehouseEntity.setSupId(supId);
|
|
|
|
|
//查询供应商名称
|
|
|
|
|
String name = unitMaintainDao.selectNameByErpId(supId);
|
|
|
|
|
warehouseEntity.setSupName(name);
|
|
|
|
|
private void setSupInfo(WarehouseEntity warehouseEntity, String countStatus) {
|
|
|
|
|
/**
|
|
|
|
|
* 根据此码明细的盈亏状态,使用不同的逻辑生成供应商信息
|
|
|
|
|
* 盘盈:此条码不存在于库存详情中,需要从供应商产品信息表查询供应商信息
|
|
|
|
|
* 盘亏:此条码在库存中存在,但是盘点中没有此条码,直接查询库存详情表中的供应商ID
|
|
|
|
|
*
|
|
|
|
|
* 若查询出的供应商信息多余1条,则表明此产品被多个供应商绑定,在此处不进行绑定,单据生成之后会进入异常单据页面,在异常单据页面手动指定供应商
|
|
|
|
|
*/
|
|
|
|
|
if (countStatus.equals("loss")) {
|
|
|
|
|
log.info("生成盘亏单据条码供应商详情,条码信息:{}", warehouseEntity.getCode());
|
|
|
|
|
List<String> supIds = invProductDetailDao.selectSupIdByCode(warehouseEntity.getCode());
|
|
|
|
|
if (CollUtil.isNotEmpty(supIds)) {
|
|
|
|
|
if (supIds.size() == 1) {
|
|
|
|
|
//此产品只绑定了一个供应商,若绑定了多个供应商,则不填供应商ID字段,生成单据之后会进入异常单据页面,手动指定供应商
|
|
|
|
|
warehouseEntity.setSupId(supIds.get(0));
|
|
|
|
|
//查询供应商名称
|
|
|
|
|
String name = unitMaintainDao.selectNameByErpId(supIds.get(0));
|
|
|
|
|
warehouseEntity.setSupName(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.info("生成盘盈单据条码供应商详情,条码信息:{}", warehouseEntity.getCode());
|
|
|
|
|
List<String> unitFkList = companyProductRelevanceDao.selectUnitFkByUdiRlIdFk(warehouseEntity.getRelId());
|
|
|
|
|
if (CollUtil.isNotEmpty(unitFkList)) {
|
|
|
|
|
if (unitFkList.size() == 1) {
|
|
|
|
|
//此产品只绑定了一个供应商,若绑定了多个供应商,则不填供应商ID字段,生成单据之后会进入异常单据页面,手动指定供应商
|
|
|
|
|
warehouseEntity.setSupId(unitFkList.get(0));
|
|
|
|
|
//查询供应商名称
|
|
|
|
|
String name = unitMaintainDao.selectNameByErpId(unitFkList.get(0));
|
|
|
|
|
warehouseEntity.setSupName(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -520,4 +675,14 @@ public class InvCountOrderServiceImpl implements InvCountOrderService {
|
|
|
|
|
return orderEntity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String getSupId(WarehouseEntity warehouseEntity) {
|
|
|
|
|
List<String> supIds = companyProductRelevanceDao.selectUnitFkByUdiRlIdFk(warehouseEntity.getRelId());
|
|
|
|
|
if (CollUtil.isNotEmpty(supIds) && supIds.size() == 1) {
|
|
|
|
|
return supIds.get(0);
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|