diff --git a/src/main/java/com/glxp/api/controller/inv/InvCountOrderDetailController.java b/src/main/java/com/glxp/api/controller/inv/InvCountOrderDetailController.java index 2708b31fa..08da1dedd 100644 --- a/src/main/java/com/glxp/api/controller/inv/InvCountOrderDetailController.java +++ b/src/main/java/com/glxp/api/controller/inv/InvCountOrderDetailController.java @@ -66,7 +66,7 @@ public class InvCountOrderDetailController { */ @PostMapping("/inv/count/order/detail/addCountOrderDetail") public BaseResponse addCountOrderDetail(@RequestBody InvCountOrderDetailEntity invCountOrderDetail) { - if (null == invCountOrderDetail || StrUtil.isBlank(invCountOrderDetail.getOrderIdFk()) || StrUtil.isBlank(invCountOrderDetail.getRelId())) { + if (null == invCountOrderDetail || StrUtil.isBlank(invCountOrderDetail.getOrderIdFk()) || null == invCountOrderDetail.getRelId()) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); } return invCountOrderDetailService.addCountOrderDetail(invCountOrderDetail); diff --git a/src/main/java/com/glxp/api/dao/basic/BasicCorpDao.java b/src/main/java/com/glxp/api/dao/basic/BasicCorpDao.java index 5cde0e627..34a7df53c 100644 --- a/src/main/java/com/glxp/api/dao/basic/BasicCorpDao.java +++ b/src/main/java/com/glxp/api/dao/basic/BasicCorpDao.java @@ -45,4 +45,12 @@ public interface BasicCorpDao { * @return */ List selectByNameAndCreditNo(@Param("name") String name, @Param("creditNo") String creditNo); + + /** + * 根据erpId查询往来单位信息 + * + * @param erpId + * @return + */ + BasicCorpEntity selectByErpId(@Param("erpId") String erpId); } diff --git a/src/main/java/com/glxp/api/dao/basic/UdiRlSupDao.java b/src/main/java/com/glxp/api/dao/basic/UdiRlSupDao.java index 388aec2af..1d883a022 100644 --- a/src/main/java/com/glxp/api/dao/basic/UdiRlSupDao.java +++ b/src/main/java/com/glxp/api/dao/basic/UdiRlSupDao.java @@ -35,4 +35,12 @@ public interface UdiRlSupDao extends BaseMapperPlus selectUnitFkByRelId(@Param("relId") Long relId); } diff --git a/src/main/java/com/glxp/api/dao/inv/InvCountOrderDetailDao.java b/src/main/java/com/glxp/api/dao/inv/InvCountOrderDetailDao.java index 96b00705e..5c5dc42cb 100644 --- a/src/main/java/com/glxp/api/dao/inv/InvCountOrderDetailDao.java +++ b/src/main/java/com/glxp/api/dao/inv/InvCountOrderDetailDao.java @@ -50,7 +50,7 @@ public interface InvCountOrderDetailDao extends BaseMapper selectSupIdByCode(@Param("code") String code); + } diff --git a/src/main/java/com/glxp/api/entity/basic/BasicBusTypeChangeEntity.java b/src/main/java/com/glxp/api/entity/basic/BasicBusTypeChangeEntity.java index bde4dece0..c0e8beb2a 100644 --- a/src/main/java/com/glxp/api/entity/basic/BasicBusTypeChangeEntity.java +++ b/src/main/java/com/glxp/api/entity/basic/BasicBusTypeChangeEntity.java @@ -40,7 +40,7 @@ public class BasicBusTypeChangeEntity { private String targetAction; /** - * 1:领用单据类型;2.产品申购类型;3.采购计划单据类型 + * 类型 1:领用单据类型;2.产品申购类型;3.采购计划单据类型 4.盘点单据类型 */ @TableField(value = "`type`") private Integer type; diff --git a/src/main/java/com/glxp/api/entity/inv/InvCountCodesEntity.java b/src/main/java/com/glxp/api/entity/inv/InvCountCodesEntity.java index 86895758a..7d9edce79 100644 --- a/src/main/java/com/glxp/api/entity/inv/InvCountCodesEntity.java +++ b/src/main/java/com/glxp/api/entity/inv/InvCountCodesEntity.java @@ -29,7 +29,7 @@ public class InvCountCodesEntity { * 产品ID */ @TableField(value = "relId") - private String relId; + private Long relId; /** * 码 diff --git a/src/main/java/com/glxp/api/entity/inv/InvCountOrderDetailEntity.java b/src/main/java/com/glxp/api/entity/inv/InvCountOrderDetailEntity.java index 5e6e3eadc..45de2a225 100644 --- a/src/main/java/com/glxp/api/entity/inv/InvCountOrderDetailEntity.java +++ b/src/main/java/com/glxp/api/entity/inv/InvCountOrderDetailEntity.java @@ -29,7 +29,7 @@ public class InvCountOrderDetailEntity { * 产品ID */ @TableField(value = "relId") - private String relId; + private Long relId; /** * 产品DI diff --git a/src/main/java/com/glxp/api/res/inv/InvCountOrderDetailResponse.java b/src/main/java/com/glxp/api/res/inv/InvCountOrderDetailResponse.java index 848021e61..62ce833f8 100644 --- a/src/main/java/com/glxp/api/res/inv/InvCountOrderDetailResponse.java +++ b/src/main/java/com/glxp/api/res/inv/InvCountOrderDetailResponse.java @@ -21,7 +21,7 @@ public class InvCountOrderDetailResponse { /** * 产品ID */ - private String relId; + private Long relId; /** * 产品DI diff --git a/src/main/java/com/glxp/api/service/inv/impl/InvCountOrderServiceImpl.java b/src/main/java/com/glxp/api/service/inv/impl/InvCountOrderServiceImpl.java index f2c3c8a9b..ff92468c9 100644 --- a/src/main/java/com/glxp/api/service/inv/impl/InvCountOrderServiceImpl.java +++ b/src/main/java/com/glxp/api/service/inv/impl/InvCountOrderServiceImpl.java @@ -1,16 +1,21 @@ package com.glxp.api.service.inv.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.BasicBusTypeChangeDao; import com.glxp.api.dao.basic.BasicBussinessTypeDao; import com.glxp.api.dao.basic.BasicCorpDao; +import com.glxp.api.dao.basic.UdiRlSupDao; import com.glxp.api.dao.inout.IoCodeDao; import com.glxp.api.dao.inout.IoCodeTempDao; import com.glxp.api.dao.inout.IoOrderDao; @@ -19,26 +24,36 @@ import com.glxp.api.dao.inv.InvCountOrderDao; import com.glxp.api.dao.inv.InvCountOrderDetailDao; import com.glxp.api.dao.inv.InvProductDetailDao; import com.glxp.api.entity.auth.AuthAdmin; +import com.glxp.api.entity.basic.BasicBusTypeChangeEntity; +import com.glxp.api.entity.basic.BasicBussinessTypeEntity; +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.InvCountCodesEntity; import com.glxp.api.entity.inv.InvCountOrderDetailEntity; import com.glxp.api.entity.inv.InvCountOrderEntity; -import com.glxp.api.req.inv.AddInvCountOrderSaveRequest; -import com.glxp.api.req.inv.FilterInvCountOrderRequest; +import com.glxp.api.entity.inv.InvProductDetailEntity; +import com.glxp.api.req.inv.*; import com.glxp.api.res.inv.InvCountOrderResponse; import com.glxp.api.service.auth.CustomerService; -import com.glxp.api.service.basic.CompanyProductsRelService; import com.glxp.api.service.inv.InvCountCodesService; import com.glxp.api.service.inv.InvCountOrderService; +import com.glxp.api.util.CustomUtil; +import com.glxp.api.util.DateUtil; import com.glxp.api.util.GennerOrderUtils; import com.glxp.api.util.OrderNoTypeBean; +import com.glxp.api.util.udi.FilterUdiUtils; +import com.glxp.api.util.udi.UdiCalCountUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; 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 @@ -72,7 +87,9 @@ public class InvCountOrderServiceImpl implements InvCountOrderService { @Resource private IoCodeDao codesDao; @Resource - private CompanyProductsRelService companyProductsRelService; + private UdiRlSupDao udiRlSupDao; + @Resource + private UdiCalCountUtil udiCalCountUtil; @Override public List filterList(FilterInvCountOrderRequest filterInvCountOrderRequest) { @@ -101,15 +118,14 @@ public class InvCountOrderServiceImpl implements InvCountOrderService { @Override public BaseResponse saveCountOrder(InvCountOrderEntity invCountOrder) { - //TODO 确认一下盘点单据的部门是由前端选入还是后端获取 if (invCountOrder.getCountType() == 0 || invCountOrder.getCountType() == 2) { //整库盘点 - if (StrUtil.isBlank(invCountOrder.getInvCode())) { + if (StrUtil.isNotBlank(invCountOrder.getDeptCode()) || StrUtil.isBlank(invCountOrder.getInvCode())) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "请选择仓库信息!"); } } else if (invCountOrder.getCountType() == 1) { //货位盘点 - if (StrUtil.isBlank(invCountOrder.getInvCode()) || StrUtil.isBlank(invCountOrder.getInvCode()) || StrUtil.isBlank(invCountOrder.getInvSpaceCode())) { + if (StrUtil.isBlank(invCountOrder.getDeptCode()) || StrUtil.isBlank(invCountOrder.getInvCode()) || StrUtil.isBlank(invCountOrder.getInvSpaceCode())) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "请选择仓库和货位信息!"); } } @@ -183,6 +199,26 @@ public class InvCountOrderServiceImpl implements InvCountOrderService { return ResultVOUtils.success(); } + @Override + public BaseResponse saveCountOrderForPDA(AddInvCountOrderSaveRequest addInvCountOrderSaveRequest) { + InvCountOrderEntity invCountOrder = invCountOrderDao.selectByOrderId(addInvCountOrderSaveRequest.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()); + List countCodeList = addInvCountOrderSaveRequest.getCountCodeList(); + for (InvCountCodesEntity invCountCodes : countCodeList) { + invCountCodesService.addCode(invCountCodes); + } + submitAudit(invCountOrder.getId().toString()); + return ResultVOUtils.success(); + } + @Override public BaseResponse updateCountOrderStatus(String id, Integer status) { InvCountOrderEntity invCountOrder = invCountOrderDao.selectById(Integer.valueOf(id)); @@ -206,28 +242,318 @@ public class InvCountOrderServiceImpl implements InvCountOrderService { return ResultVOUtils.success(); } - //TODO 盘点单据转单逻辑,待完善 + /** + * 盘点单据转扫码单据 + * + * @param invCountOrder 盘点单据 + */ private void countOrderTransfer(InvCountOrderEntity invCountOrder) { + //查询单据生成设置,是否已经配置对应单据类型,若未配置则结束转单流程 + List transferOrderSettings = getOrderSettings(); + if (CollUtil.isEmpty(transferOrderSettings)) { + log.error("未配置盘点转单设置,无法转单!"); + return; + } + + /** + * 生成盘盈和盘亏单据逻辑 + * 盘盈单据:1、找出盘点单据码详情比库存码详情多的产品 + * 2、判断条码是否包含批次号和序列号,如果不包含,根据 盘盈数量 / 实际数量 = 多出的条码数量 ,计算出盘盈单据此条码的扫码数量 + * 3、生成条码,保存单据 + * + * 盘亏单据:1、找出库存有,而盘点不存在的条码 + * 2、判断此库存详情是否包含批次号,如果不包含,盘亏数量 / 实际数量 = 少的条码数量,计算出盘亏单据扫码数量 + * 3、生成条码,保存单据 + */ + + //获取出入库码明细 + List inCodes = getOrderCodes(invCountOrder, "in"); + List outCodes = getOrderCodes(invCountOrder, "out"); + //生成盘盈/盘亏单据 + createNewOrder(invCountOrder, inCodes, outCodes, transferOrderSettings); + log.info("盘点转单完成"); } - @Override - public BaseResponse saveCountOrderForPDA(AddInvCountOrderSaveRequest addInvCountOrderSaveRequest) { - InvCountOrderEntity invCountOrder = invCountOrderDao.selectByOrderId(addInvCountOrderSaveRequest.getOrderId()); - if (null == invCountOrder) { - return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此单据不存在"); + /** + * 生成盘盈/盘亏单据 + * + * @param invCountOrder 盘点单据 + * @param inCodes 盘盈单据码明细 + * @param outCodes 盘亏单据码明细 + * @param transferOrderSettings 单据转换单据类型 + */ + private void createNewOrder(InvCountOrderEntity invCountOrder, List inCodes, List outCodes, List transferOrderSettings) { + BasicBussinessTypeEntity inBusType = new BasicBussinessTypeEntity(); + BasicBussinessTypeEntity outBusType = new BasicBussinessTypeEntity(); + for (BasicBussinessTypeEntity basicBussinessTypeEntity : transferOrderSettings) { + if (basicBussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_PUT)) { + inBusType = basicBussinessTypeEntity; + } else if (basicBussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_OUT)) { + outBusType = basicBussinessTypeEntity; + } } - if (invCountOrder.getStatus() != 0) { - return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此单据不可编辑"); + + log.info("开始生成盘盈单据"); + //开始生成盘盈单据 + String inOrderId = buildOrder(invCountOrder, inCodes, inBusType); + invCountOrder.setInOrderIds(inOrderId); + log.info("盘盈单据生成成功"); + + //开始生成盘亏单据 + log.info("开始生成盘亏单据"); + String outOrderId = buildOrder(invCountOrder, outCodes, outBusType); + invCountOrder.setOrderId(outOrderId); + log.info("盘亏单据生成成功"); + + //更新盘点单据的出入库单据信息 + invCountOrderDao.updateById(invCountOrder); + } + + /** + * 生成单据逻辑 + * + * @param invCountOrder 盘点单据 + * @param codeTempList 单据码明细 + * @param inBusType 单据类型 + */ + private String buildOrder(InvCountOrderEntity invCountOrder, List codeTempList, BasicBussinessTypeEntity inBusType) { + if (CollUtil.isNotEmpty(codeTempList)) { + //构造单据数据 + IoOrderEntity order = new IoOrderEntity(); + order.setMainAction(inBusType.getMainAction()); + order.setAction(inBusType.getAction()); + Date date = new Date(); + order.setCreateTime(date); + order.setUpdateTime(date); + order.setDeptCode(invCountOrder.getDeptCode()); + order.setInvCode(invCountOrder.getInvCode()); + //查询单据往来单位信息 + order.setFromCorp(inBusType.getDefaultUnit()); + order.setFromType(ConstantStatus.FROM_COUNT); + order.setCorpOrderId(CustomUtil.getId() + "x"); + //设置为草稿状态 + order.setStatus(1); + order.setDealStatus(1); + //生成单据号 + String orderNo = gennerOrderUtils.createScOrderNo(new OrderNoTypeBean(Constant.SCAN_ORDER + StrUtil.trim(inBusType.getPrefix()), "yyyyMMdd")); + order.setBillNo(orderNo); + //对条码统一设置创建时间,单号等信息 + codeTempList.forEach(codeTemp -> { + codeTemp.setCreateTime(date); + codeTemp.setOrderId(orderNo); + codeTemp.setAction(order.getAction()); + codeTemp.setCorpOrderId(order.getCorpOrderId()); + }); + + orderDao.insert(order); + codesTempDao.insertBatch(codeTempList); + return orderNo; } - //解析条码,修改单据详情,修改单据状态为待审核 - invCountOrder.setStatus(1); - invCountOrder.setUpdateTime(new Date()); - List countCodeList = addInvCountOrderSaveRequest.getCountCodeList(); - for (InvCountCodesEntity invCountCodes : countCodeList) { - invCountCodesService.addCode(invCountCodes); + return null; + } + + /** + * 获取入库或出库的条码列表 + * + * @param invCountOrder 盘点单据 + * @param type 出入库类型 in/out + * @return + */ + private List getOrderCodes(InvCountOrderEntity invCountOrder, String type) { + //构造库存详情查询参数 + FilterInvProductDetailRequest invProductDetailRequest = new FilterInvProductDetailRequest(); + invProductDetailRequest.setDeptCode(invCountOrder.getDeptCode()); + invProductDetailRequest.setInvCode(invCountOrder.getInvCode()); + //锁库存,查询库存更新时间早于或等于盘点单创建时间的数据 + invProductDetailRequest.setUpdateTime(DateUtil.toDateStr(invCountOrder.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + //判断是否是按货位盘点的单据,如果是,则查询库存详情的参数需要添加货位 + invProductDetailRequest.setInvSpaceCode(invCountOrder.getInvSpaceCode()); + + //查询盘点单据详情 + FilterInvCountOrderDetailRequest countOrderDetailRequest = new FilterInvCountOrderDetailRequest(); + countOrderDetailRequest.setOrderIdFk(invCountOrder.getOrderId()); + countOrderDetailRequest.setStatus(type.equals("in") ? 1 : 0); + List detailList = invCountOrderDetailDao.filterList(countOrderDetailRequest); + + List codeList = new ArrayList<>(); + //查找条码列表 + if (type.equals("in")) { + log.info("开始生成盘盈单据码明细"); + //查找盘盈条码列表 + detailList.forEach(invCountOrderDetailEntity -> { + invProductDetailRequest.setRelId(String.valueOf(invCountOrderDetailEntity.getRelId())); + invProductDetailRequest.setBatchNo(invProductDetailRequest.getBatchNo()); + List invProductDetailEntities = invProductDetailDao.filterInvProductDetailList(invProductDetailRequest); + //查询盘点码明细 + FilterInvCountCodesRequest countCodesRequest = new FilterInvCountCodesRequest(); + countCodesRequest.setOrderIdFk(invCountOrder.getOrderId()); + countCodesRequest.setRelId(String.valueOf(invCountOrderDetailEntity.getRelId())); + countCodesRequest.setBatchNo(invCountOrderDetailEntity.getBatchNo()); + List countCodeList = invCountCodesDao.selectCodes(countCodesRequest); + List invProductDetailCodes = invProductDetailEntities.stream().map(InvProductDetailEntity::getCode).collect(Collectors.toList()); + List profitCodes = CollUtil.subtractToList(countCodeList, invProductDetailCodes); + if (CollUtil.isNotEmpty(invProductDetailCodes) && CollUtil.isEmpty(profitCodes)) { + /** + * 盘点条码不为空,且库存条码也不为空,但是计算的条码差集为空 + * 说明盘点的条码和库存的条码是相同的条码,直接根据盘盈数量计算出扫码数量,生成一个条码即可 + */ + IoCodeTempEntity codeTempEntity = buildCodeTempEntity(invCountOrder, countCodeList.get(0), invCountOrderDetailEntity); + codeList.add(codeTempEntity); + } else { + for (String code : profitCodes) { + if (!verifyCodeExist(codeList, code)) { + //生成码明细 + IoCodeTempEntity codeTempEntity = buildCodeTempEntity(invCountOrder, code, invCountOrderDetailEntity); + codeList.add(codeTempEntity); + } + } + } + }); + log.info("盘盈单据码明细生成成功"); + } else { + log.info("开始生成盘亏单据码明细"); + + detailList.forEach(invCountOrderDetailEntity -> { + invProductDetailRequest.setRelId(String.valueOf(invCountOrderDetailEntity.getRelId())); + invProductDetailRequest.setBatchNo(invCountOrderDetailEntity.getBatchNo()); + //查询库存详情 + List invProductDetailEntities = invProductDetailDao.filterInvProductDetailList(invProductDetailRequest); + //查询盘点码明细 + FilterInvCountCodesRequest countCodesRequest = new FilterInvCountCodesRequest(); + countCodesRequest.setOrderIdFk(invCountOrder.getOrderId()); + countCodesRequest.setRelId(String.valueOf(invCountOrderDetailEntity.getRelId())); + countCodesRequest.setBatchNo(invCountOrderDetailEntity.getBatchNo()); + List countCodeList = invCountCodesDao.selectCodes(countCodesRequest); + List invProductDetailCodes = invProductDetailEntities.stream().map(InvProductDetailEntity::getCode).collect(Collectors.toList()); + List lossCodes = CollUtil.subtractToList(invProductDetailCodes, countCodeList); + if (CollUtil.isNotEmpty(countCodeList) && CollUtil.isEmpty(lossCodes)) { + //盘点的码不为空,但是盘点数量和库存数量不一样,比对差集结果为空,说明是同一个条码,数量不同,直接根据盘亏数量计算生成一个扫码单据的码明细 + //生成码详情 + IoCodeTempEntity codeTempEntity = buildCodeTempEntity(invCountOrder, countCodeList.get(0), invCountOrderDetailEntity); + codeList.add(codeTempEntity); + } else { + for (InvProductDetailEntity invProductDetailEntity : invProductDetailEntities) { + if (!countCodeList.contains(invProductDetailEntity.getCode()) && !verifyCodeExist(codeList, invProductDetailEntity.getCode())) { + InvCountOrderDetailEntity orderDetailEntity = new InvCountOrderDetailEntity(); + orderDetailEntity.setRelId(invCountOrderDetailEntity.getRelId()); + orderDetailEntity.setStatus(0); + IoCodeTempEntity codeTempEntity = buildCodeTempEntity(invCountOrder, invProductDetailEntity.getCode(), orderDetailEntity); + codeList.add(codeTempEntity); + } + } + } + }); + log.info("盘亏单据码名称生成成功"); } - submitAudit(invCountOrder.getId().toString()); - return ResultVOUtils.success(); + return codeList; } + + /** + * 比对码在集合中是否存在 + * + * @param codeList + * @param code + * @return + */ + private boolean verifyCodeExist(List codeList, String code) { + for (IoCodeTempEntity codeTempEntity : codeList) { + if (codeTempEntity.getCode().equals(code)) { + return true; + } + } + return false; + } + + /** + * 构造扫码单据码明细数据 + * + * @param invCountOrder 盘点单据 + * @param code 码 + * @param invCountOrderDetailEntity 盘点单据详情 + * @return + */ + private IoCodeTempEntity buildCodeTempEntity(InvCountOrderEntity invCountOrder, String code, InvCountOrderDetailEntity invCountOrderDetailEntity) { + IoCodeTempEntity codeTemp = new IoCodeTempEntity(); + codeTemp.setCode(code); + codeTemp.setRelId(invCountOrderDetailEntity.getRelId()); + codeTemp.setMainAction(invCountOrderDetailEntity.getStatus() == 0 ? ConstantType.TYPE_OUT : ConstantType.TYPE_PUT); + codeTemp.setDeptCode(invCountOrder.getDeptCode()); + codeTemp.setInvCode(invCountOrder.getInvCode()); + UdiEntity udi = FilterUdiUtils.getUdi(code); + codeTemp.setBatchNo(udi.getBatchNo()); + codeTemp.setNameCode(udi.getUdi()); + codeTemp.setProduceDate(udi.getProduceDate()); + codeTemp.setExpireDate(udi.getExpireDate()); + codeTemp.setSerialNo(udi.getSerialNo()); + //计算码数量 + int actCount = udiCalCountUtil.getActCount(codeTemp.getNameCode()); + //判断此码有无批次号和序列号 + if ((StrUtil.isBlank(codeTemp.getBatchNo()) && StrUtil.isBlank(codeTemp.getSerialNo())) || (StrUtil.isBlank(codeTemp.getSerialNo()) && StrUtil.isNotBlank(codeTemp.getBatchNo()))) { + //根据盘点盈亏状态取盘点数量值 + int countNum = invCountOrderDetailEntity.getStatus() == 0 ? invCountOrderDetailEntity.getLossNum() : invCountOrderDetailEntity.getProfitNum(); + int codeNum = countNum / actCount; + codeTemp.setCount(codeNum); + codeTemp.setReCount(codeNum); + } else { + codeTemp.setCount(actCount); + codeTemp.setReCount(actCount); + } + //获取盘点盈亏状态值 + String countStatus = invCountOrderDetailEntity.getStatus() == 0 ? "loss" : "profit"; + //设置供应商信息 + setSupInfo(codeTemp, countStatus); + return codeTemp; + } + + /** + * 设置条码供应商信息 + * + * @param codeTemp 条码数据 + * @param countStatus 盈亏状态 + */ + private void setSupInfo(IoCodeTempEntity codeTemp, String countStatus) { + /** + * 根据此码明细的盈亏状态,使用不同的逻辑生成供应商信息 + * 盘盈:此条码不存在于库存详情中,需要从供应商产品信息表查询供应商信息 + * 盘亏:此条码在库存中存在,但是盘点中没有此条码,直接查询库存详情表中的供应商ID + * + * 若查询出的供应商信息多余1条,则表明此产品被多个供应商绑定,在此处不进行绑定,单据生成之后会进入异常单据页面,在异常单据页面手动指定供应商 + */ + if (countStatus.equals("loss")) { + log.info("生成盘亏单据条码供应商信息,条码信息:{}", codeTemp.getCode()); + List supIds = invProductDetailDao.selectSupIdByCode(codeTemp.getCode()); + if (CollUtil.isNotEmpty(supIds) && supIds.size() == 1) { + //此产品在库存中存在且只绑定了一个供应商,若绑定了多个供应商,则不填供应商ID字段,生成单据之后会进入异常单据页面,由操作人员手动指定供应商 + codeTemp.setSupId(supIds.get(0)); + } + } else { + log.info("生成盘盈单据条码供应商详情,条码信息:{}", codeTemp.getCode()); + List unitFkList = udiRlSupDao.selectUnitFkByRelId(codeTemp.getRelId()); + if (CollUtil.isNotEmpty(unitFkList) && unitFkList.size() == 1) { + //此产品只绑定了一个供应商,若绑定了多个供应商,则不填供应商ID字段,生成单据之后会进入异常单据页面,手动指定供应商 + codeTemp.setSupId(unitFkList.get(0)); + } + } + } + + /** + * 查询单据生成中配置的关联扫码单据类型 + * + * @return + */ + private List getOrderSettings() { + //查询类型为盘点转单的配置 + List list = busTypeChangeDao.selectList(new QueryWrapper().eq("type", 4)); + if (CollUtil.isNotEmpty(list)) { + List busTypes = new ArrayList<>(2); + for (BasicBusTypeChangeEntity basicBusTypeChangeEntity : list) { + if ("PDRK".equals(basicBusTypeChangeEntity.getOriginAction()) || "PDCK".equals(basicBusTypeChangeEntity.getOriginAction())) { + busTypes.add(bussinessTypeDao.selectOne(new QueryWrapper().eq("action", basicBusTypeChangeEntity.getTargetAction()))); + } + } + } + return null; + } + } diff --git a/src/main/resources/mybatis/mapper/basic/BasicCorpDao.xml b/src/main/resources/mybatis/mapper/basic/BasicCorpDao.xml index 2b71f50d7..d7812c10e 100644 --- a/src/main/resources/mybatis/mapper/basic/BasicCorpDao.xml +++ b/src/main/resources/mybatis/mapper/basic/BasicCorpDao.xml @@ -304,4 +304,8 @@ + + diff --git a/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml b/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml index ea513741d..faa4d3c10 100644 --- a/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml +++ b/src/main/resources/mybatis/mapper/basic/UdiRlSupDao.xml @@ -335,4 +335,8 @@ from company_product_relevance where udiRlIdFk = #{udiRlIdFk} + + \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/inv/invProductDetailDao.xml b/src/main/resources/mybatis/mapper/inv/invProductDetailDao.xml index 42e9873b2..57f8a611c 100644 --- a/src/main/resources/mybatis/mapper/inv/invProductDetailDao.xml +++ b/src/main/resources/mybatis/mapper/inv/invProductDetailDao.xml @@ -136,4 +136,10 @@ and code = #{code} limit 1 + +