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 { @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 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 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 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 countCodeList = filterInvCountOrderSaveRequest.getCountCodeList(); if (CollUtil.isNotEmpty(countCodeList)) { invCountCodesDao.insertBatch(countCodeList); } invCountOrderDetailDao.deleteByOrderId(invCountOrder.getOrderId()); List 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 orderDetailList = invCountOrderDetailDao.selectByOrderId(invCountOrder.getOrderId()); List lossCodesList = new ArrayList<>(); List 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 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); } }