You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
udi-wms-java/src/main/java/com/glxp/api/service/inv/InvCountOrderService.java

398 lines
18 KiB
Java

package com.glxp.api.service.inv;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.glxp.api.common.enums.ResultEnum;
import com.glxp.api.common.res.BaseResponse;
import com.glxp.api.common.util.ResultVOUtils;
import com.glxp.api.constant.Constant;
import com.glxp.api.constant.ConstantStatus;
import com.glxp.api.constant.ConstantType;
import com.glxp.api.dao.basic.BasicBussinessTypeDao;
import com.glxp.api.dao.basic.BasicCorpDao;
import com.glxp.api.dao.basic.CompanyProductRelevanceDao;
import com.glxp.api.dao.basic.UdiRelevanceDao;
import com.glxp.api.dao.inout.IoCodeDao;
import com.glxp.api.dao.inout.IoCodeTempDao;
import com.glxp.api.dao.inv.*;
import com.glxp.api.entity.auth.AuthAdmin;
import com.glxp.api.entity.basic.BasicBussinessTypeEntity;
import com.glxp.api.entity.basic.BasicCorpEntity;
import com.glxp.api.entity.basic.UdiEntity;
import com.glxp.api.entity.inout.IoCodeTempEntity;
import com.glxp.api.entity.inout.IoOrderEntity;
import com.glxp.api.entity.inv.*;
import com.glxp.api.req.basic.FilterUdiRelRequest;
import com.glxp.api.req.inv.*;
import com.glxp.api.res.basic.UdiRelevanceResponse;
import com.glxp.api.res.inv.InvCountOrderResponse;
import com.glxp.api.service.auth.CustomerService;
import com.glxp.api.service.basic.IBasicBussinessTypeService;
import com.glxp.api.service.inout.IoAddInoutService;
import com.glxp.api.service.inout.IoCheckInoutService;
import com.glxp.api.service.inout.IoOrderService;
import com.glxp.api.util.CustomUtil;
import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.IntUtil;
import com.glxp.api.util.OrderNoTypeBean;
import com.glxp.api.util.udi.FilterUdiUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class InvCountOrderService extends ServiceImpl<InvCountOrderMapper, InvCountOrderEntity> {
@Resource
private InvCountOrderMapper invCountOrderDao;
@Resource
private InvCountOrderDetailMapper invCountOrderDetailDao;
@Resource
private InvCountCodesMapper invCountCodesDao;
@Resource
private GennerOrderUtils gennerOrderUtils;
@Resource
private CustomerService customerService;
@Resource
private BasicCorpDao unitMaintainDao;
@Resource
private IoOrderService orderService;
@Resource
private IoCodeTempDao codesTempDao;
@Resource
private UdiRelevanceDao udiRelevanceDao;
@Resource
private IBasicBussinessTypeService basicBussinessTypeService;
@Resource
private InvCountSettingService invCountSettingService;
@Resource
IoAddInoutService addInoutService;
@Resource
@Lazy
IoCheckInoutService ioCheckInoutService;
public List<InvCountOrderResponse> filterList(FilterInvCountOrderRequest filterInvCountOrderRequest) {
if (null == filterInvCountOrderRequest) {
return Collections.emptyList();
}
if (null != filterInvCountOrderRequest.getPage() && null != filterInvCountOrderRequest.getLimit()) {
PageHelper.offsetPage((filterInvCountOrderRequest.getPage() - 1) * filterInvCountOrderRequest.getLimit(), filterInvCountOrderRequest.getLimit());
}
return invCountOrderDao.selectList(filterInvCountOrderRequest);
}
public InvCountOrderResponse selectJoinByOrderId(String orderId) {
FilterInvCountOrderRequest filterInvCountOrderRequest = new FilterInvCountOrderRequest();
filterInvCountOrderRequest.setOrderId(orderId);
List<InvCountOrderResponse> orderResponses = invCountOrderDao.selectList(filterInvCountOrderRequest);
if (CollUtil.isNotEmpty(orderResponses))
return orderResponses.get(0);
return null;
}
public void deleteOrder(String id) {
String orderId = invCountOrderDao.selectOrderIdById(id);
log.info("开始删除盘点单据,盘点单号: {}", orderId);
invCountOrderDao.deleteByOrderId(orderId);
if (invCountOrderDetailDao.countByOrderIdFk(orderId) > 0) {
invCountOrderDetailDao.deleteByOrderId(orderId);
}
if (invCountCodesDao.countByOrderIdFk(orderId) > 0) {
invCountCodesDao.deleteByOrderId(orderId);
}
log.info("盘点单据删除完成");
}
public BaseResponse saveCountOrder(InvCountOrderEntity invCountOrder) {
if (invCountOrder.getCountType() == 0 || invCountOrder.getCountType() == 2) {
//整库盘点
if (StrUtil.isBlank(invCountOrder.getInvStorageCode())) {
return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "请选择仓库信息!");
}
} else if (invCountOrder.getCountType() == 1) {
//货位盘点
if (StrUtil.isBlank(invCountOrder.getInvStorageCode()) || StrUtil.isBlank(invCountOrder.getInvWarehouseCode())) {
return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "请选择仓库和货位信息!");
}
}
//封装相关数据
//未提交
invCountOrder.setStatus(0);
if (StrUtil.isBlank(invCountOrder.getOrderId())) {
//生成单据号
String orderId = gennerOrderUtils.createStOrderNo(new OrderNoTypeBean(Constant.COUNT_ORDER, "yyyyMMdd"));
//盘点单号
invCountOrder.setOrderId(orderId);
AuthAdmin user = customerService.getUserBean();
invCountOrder.setCreateUser(user.getUserName());
invCountOrder.setCreateTime(new Date());
invCountOrder.setUpdateTime(new Date());
invCountOrderDao.insert(invCountOrder);
} else {
InvCountOrderEntity oldData = invCountOrderDao.selectByOrderId(invCountOrder.getOrderId());
BeanUtil.copyProperties(invCountOrder, oldData, "id", "createTime", "createUser");
oldData.setUpdateTime(new Date());
invCountOrderDao.updateByOrderId(oldData);
}
return ResultVOUtils.success(invCountOrder);
}
public BaseResponse submitAudit(String orderId) {
InvCountOrderEntity invCountOrder = invCountOrderDao.selectByOrderId(orderId);
if (null == invCountOrder) {
return ResultVOUtils.error(ResultEnum.DATA_ERROR, "单据不存在");
}
if (invCountOrder.getStatus() != 0) {
return ResultVOUtils.error(ResultEnum.DATA_ERROR, "单据已提交,请勿重复提交");
}
//查询单据详情和码表是否存在,如果无单据详情和条码,不允许提交
Long detailCount = invCountOrderDetailDao.countByOrderIdFk(invCountOrder.getOrderId());
if (detailCount == 0) {
return ResultVOUtils.error(ResultEnum.DATA_ERROR, "请先选择盘点产品");
}
//更新状态
invCountOrder.setStatus(1);
invCountOrder.setUpdateTime(new Date());
//查询单据详情,计算盘点盈亏状态
List<InvCountOrderDetailEntity> detailList = invCountOrderDetailDao.selectByOrderId(invCountOrder.getOrderId());
for (InvCountOrderDetailEntity invCountOrderDetail : detailList) {
int diff = IntUtil.value(invCountOrderDetail.getInvNum()) - IntUtil.value(invCountOrderDetail.getCountNum());
if (diff > 0) {
invCountOrderDetail.setLossNum(Math.abs(diff));
//盘亏
invCountOrderDetail.setStatus(0);
} else if (diff < 0) {
invCountOrderDetail.setProfitNum(Math.abs(diff));
//盘盈
invCountOrderDetail.setStatus(1);
} else {
//平衡
invCountOrderDetail.setStatus(2);
}
}
//更新单据信息
invCountOrderDao.updateByOrderId(invCountOrder);
//更新单据详情
invCountOrderDetailDao.updateBatchById(detailList);
return ResultVOUtils.success();
}
public BaseResponse updateCountOrderStatus(String id, Integer status) {
InvCountOrderEntity invCountOrder = invCountOrderDao.selectById(id);
invCountOrder.setStatus(status);
invCountOrder.setAuditUser(customerService.getUserBean().getUserName());
invCountOrder.setAuditTime(new Date());
invCountOrder.setUpdateTime(new Date());
if (status == 0) {
//审核不通过
//查询盘点单据详情,清空盘盈/盘亏数值
invCountOrderDetailDao.resetCountFiledValue(invCountOrder.getOrderId());
} else {
//审核通过
//根据单据详情生成相关单据
log.info("单据审核通过后将会生成对应盘盈盘亏单是否继续?,开始生成扫码单据");
countTransferOrder(invCountOrder);
}
invCountOrderDao.updateById(invCountOrder);
return ResultVOUtils.success();
}
@Transactional(rollbackFor = Exception.class)
public BaseResponse saveCountOrderForPDA(FilterInvCountOrderSaveRequest filterInvCountOrderSaveRequest) {
InvCountOrderEntity invCountOrder = invCountOrderDao.selectByOrderId(filterInvCountOrderSaveRequest.getOrderId());
if (null == invCountOrder) {
return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此单据不存在");
}
if (invCountOrder.getStatus() != 0) {
return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此单据不可编辑");
}
//解析条码,修改单据详情,修改单据状态为待审核
invCountOrder.setStatus(1);
invCountOrder.setUpdateTime(new Date());
invCountCodesDao.deleteByOrderId(invCountOrder.getOrderId());
List<InvCountCodesEntity> countCodeList = filterInvCountOrderSaveRequest.getCountCodeList();
if (CollUtil.isNotEmpty(countCodeList)) {
invCountCodesDao.insertBatch(countCodeList);
}
invCountOrderDetailDao.deleteByOrderId(invCountOrder.getOrderId());
List<InvCountOrderDetailEntity> orderDetailEntities = filterInvCountOrderSaveRequest.getOrderDetailEntities();
if (CollUtil.isNotEmpty(orderDetailEntities)) {
invCountOrderDetailDao.insertBatch(orderDetailEntities);
}
return submitAudit(invCountOrder.getOrderId());
}
/**
* 新版盘点单据转换
*/
private void countTransferOrder(InvCountOrderEntity invCountOrder) {
InvCountSettingEntity invCountSettingEntity = invCountSettingService.findByInvSpace(invCountOrder.getInvStorageCode(), invCountOrder.getInvWarehouseCode());
if (invCountSettingEntity == null) {
log.error("未配置盘点单据设置参数,无法转单");
return;
}
List<InvCountOrderDetailEntity> orderDetailList = invCountOrderDetailDao.selectByOrderId(invCountOrder.getOrderId());
List<IoCodeTempEntity> lossCodesList = new ArrayList<>();
List<IoCodeTempEntity> profitCodesList = new ArrayList<>();
if (CollUtil.isNotEmpty(orderDetailList)) {
for (InvCountOrderDetailEntity invCountOrderDetail : orderDetailList) {
if (IntUtil.value(invCountOrderDetail.getLossNum()) > 0) {
IoCodeTempEntity warehouseEntity = buildCodeEntity(invCountOrderDetail, invCountOrder, ConstantType.TYPE_OUT);
warehouseEntity.setSupId(invCountOrderDetail.getSupId());
lossCodesList.add(warehouseEntity);
}
if (IntUtil.value(invCountOrderDetail.getProfitNum()) > 0) {
IoCodeTempEntity warehouseEntity = buildCodeEntity(invCountOrderDetail, invCountOrder, ConstantType.TYPE_PUT);
warehouseEntity.setSupId(invCountOrderDetail.getSupId());
profitCodesList.add(warehouseEntity);
}
}
}
//生成盘亏出库单
if (CollUtil.isNotEmpty(lossCodesList)) {
IoOrderEntity order = createOrder(invCountSettingEntity, invCountOrder, ConstantType.TYPE_OUT);
invCountOrder.setOutOrderIds(order.getBillNo());
lossCodesList.forEach(warehouseEntity -> {
warehouseEntity.setOrderId(order.getBillNo());
warehouseEntity.setAction(order.getAction());
warehouseEntity.setCorpOrderId(order.getCorpOrderId());
});
orderService.insertOrder(order);
codesTempDao.insertBatch(lossCodesList);
addInoutService.dealProcess(order);
if (!ioCheckInoutService.checkManual(order.getBillNo())) {
ioCheckInoutService.check(order.getBillNo());
}
}
//生成盘盈入库单
if (CollUtil.isNotEmpty(profitCodesList)) {
IoOrderEntity order = createOrder(invCountSettingEntity, invCountOrder, ConstantType.TYPE_PUT);
invCountOrder.setInOrderIds(order.getBillNo());
profitCodesList.forEach(warehouseEntity -> {
warehouseEntity.setOrderId(order.getBillNo());
warehouseEntity.setAction(order.getAction());
warehouseEntity.setCorpOrderId(order.getCorpOrderId());
});
orderService.insertOrder(order);
codesTempDao.insertBatch(profitCodesList);
addInoutService.dealProcess(order);
if (!ioCheckInoutService.checkManual(order.getBillNo())) {
ioCheckInoutService.check(order.getBillNo());
}
}
}
private IoCodeTempEntity buildCodeEntity(InvCountOrderDetailEntity invCountOrderDetail, InvCountOrderEntity invCountOrder, String mainAction) {
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(Long.parseLong(invCountOrderDetail.getProductId()));
List<UdiRelevanceResponse> udiRelevanceResponses = udiRelevanceDao.filterUdiRelevance(filterUdiRelRequest);
String code = FilterUdiUtils.transGlxpNoSerStr(udiRelevanceResponses, invCountOrderDetail);
IoCodeTempEntity warehouseEntity = new IoCodeTempEntity();
warehouseEntity.setOrderId(invCountOrder.getOrderId());
warehouseEntity.setCode(code);
warehouseEntity.setRelId(Long.parseLong(invCountOrderDetail.getProductId()));
warehouseEntity.setMainAction(mainAction);
warehouseEntity.setInvCode(invCountOrder.getInvStorageCode());
warehouseEntity.setWarehouseCode(invCountOrder.getInvWarehouseCode());
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());
}
warehouseEntity.setCreateTime(new Date());
warehouseEntity.setUpdateTime(new Date());
warehouseEntity.setDeptCode(invCountOrder.getDeptCode());
return warehouseEntity;
}
/**
* 生成单据和条码数据
*
* @param invCountSettingEntity
* @param invCountOrder
* @param type
* @return
*/
public IoOrderEntity createOrder(InvCountSettingEntity invCountSettingEntity, InvCountOrderEntity invCountOrder, String type) {
BasicBussinessTypeEntity bussinessTypeEntity;
BasicCorpEntity unitMaintainEntity = null;
if (ConstantType.TYPE_PUT.equals(type)) {
bussinessTypeEntity = basicBussinessTypeService.findByAction(invCountSettingEntity.getInAction()); //查询单据往来单位数据
unitMaintainEntity = unitMaintainDao.selectByErpId(invCountSettingEntity.getInFromCorp());
} else {
bussinessTypeEntity = basicBussinessTypeService.findByAction(invCountSettingEntity.getOutAction());
unitMaintainEntity = unitMaintainDao.selectByErpId(invCountSettingEntity.getOutFromCorp());
}
//构造单据数据
IoOrderEntity orderEntity = new IoOrderEntity();
orderEntity.setMainAction(bussinessTypeEntity.getMainAction());
orderEntity.setAction(bussinessTypeEntity.getAction());
orderEntity.setCreateTime(new Date());
orderEntity.setInvCode(invCountOrder.getInvStorageCode());
orderEntity.setDeptCode(invCountOrder.getDeptCode());
if (unitMaintainEntity != null) {
orderEntity.setFromCorp(unitMaintainEntity.getErpId());
}
orderEntity.setCorpOrderId(CustomUtil.getId() + "x");
orderEntity.setExportStatus(0); //设置导出状态为未导出
orderEntity.setStatus(ConstantStatus.ORDER_STATUS_CHECK_PROCESS);
orderEntity.setDealStatus(ConstantStatus.ORDER_DEAL_DRAFT);
orderEntity.setCreateUser(invCountOrder.getAuditUser());
orderEntity.setCreateTime(new Date());
orderEntity.setUpdateUser(invCountOrder.getAuditUser());
orderEntity.setUpdateTime(new Date());
orderEntity.setCustomerId("110");
orderEntity.setOrderType(2);
orderEntity.setFromType(ConstantStatus.FROM_COUNT); //单据来源设置为盘点单据转单
String orderNo = gennerOrderUtils.createScOrderNo(new OrderNoTypeBean(Constant.SCAN_ORDER + StrUtil.trimToEmpty(bussinessTypeEntity.getPrefix()), "yyyyMMdd"));
orderEntity.setBillNo(orderNo);
return orderEntity;
}
public InvCountOrderEntity selectByOrderId(String orderId) {
return invCountOrderDao.selectByOrderId(orderId);
}
}