diff --git a/nladmin-system/wms-server/pom.xml b/nladmin-system/wms-server/pom.xml index e8e8d07..538fd7e 100644 --- a/nladmin-system/wms-server/pom.xml +++ b/nladmin-system/wms-server/pom.xml @@ -236,6 +236,11 @@ mybatis-plus-boot-starter 3.4.0 + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.1 + com.baomidou mybatis-plus-generator diff --git a/nladmin-system/wms-server/src/main/java/org/nl/config/DynamicDataSourceConfig.java b/nladmin-system/wms-server/src/main/java/org/nl/config/DynamicDataSourceConfig.java new file mode 100644 index 0000000..659d5e9 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/config/DynamicDataSourceConfig.java @@ -0,0 +1,10 @@ +package org.nl.config; + +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import(DynamicDataSourceAutoConfiguration.class) +public class DynamicDataSourceConfig { +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java b/nladmin-system/wms-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java index 9aef26c..4a08031 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/config/mybatis/MybatisPlusConfig.java @@ -1,6 +1,9 @@ package org.nl.config.mybatis; import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.ds.ItemDataSource; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; @@ -15,6 +18,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.annotation.PostConstruct; import javax.sql.DataSource; +import java.util.Map; /** *

@@ -53,7 +57,27 @@ public class MybatisPlusConfig { } @PostConstruct public void datainnit() { - String url = ((DruidDataSource) dataSource).getUrl(); +// String url = ((DruidDataSource) dataSource).getUrl(); + String url = null; + if (dataSource instanceof DynamicRoutingDataSource) { + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; + Map dataSources = ds.getDataSources(); + for (Map.Entry entry : dataSources.entrySet()) { + if (entry != null){ + DataSource realDs = ((ItemDataSource) dataSources.get(entry.getKey())).getRealDataSource(); + if (realDs instanceof DruidDataSource) { + url = ((DruidDataSource) realDs).getUrl(); + System.out.println("项目数据库地址:" + entry.getKey() + url); + } + } + } +// if (dataSources != null && dataSources.containsKey("master")) { +// DataSource realDs = ((ItemDataSource) dataSources.get("master")).getRealDataSource(); +// if (realDs instanceof DruidDataSource) { +// url = ((DruidDataSource) realDs).getUrl(); +// } +// } + } System.out.println("项目数据库地址:" + url); log.debug("项目数据库地址:{}", url); } diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java index f4683df..8c5b751 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java @@ -361,7 +361,10 @@ public class StructattrServiceImpl extends ServiceImpl list = this.list(query); for (String decisionerType : strategy) { Decisioner decisioner = decisionerMap.get(decisionerType); diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/EasToWmsController.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/EasToWmsController.java new file mode 100644 index 0000000..02ed215 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/EasToWmsController.java @@ -0,0 +1,34 @@ +package org.nl.wms.ext_manage.purchase.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.ext_manage.purchase.service.EasToWmsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/wms/inbound") +@Slf4j +public class EasToWmsController { + + private final EasToWmsService easToWmsService; + + + + @PostMapping("/pushPurchase") + @Log("EAS推送采购单") + @SaIgnore + public ResponseEntity pushPurchase(@RequestBody JSONObject body) { + String billId = body.getString("billid"); + log.info("EAS推送采购单, billId: {}", billId); + JSONObject result = easToWmsService.receivePurchaseBill(billId); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/ZDwmsCallbackController.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/ZDwmsCallbackController.java new file mode 100644 index 0000000..0c5aa2d --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/controller/ZDwmsCallbackController.java @@ -0,0 +1,36 @@ +package org.nl.wms.ext_manage.purchase.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.ext_manage.purchase.service.InboundZDwmsService; +import org.nl.wms.ext_manage.purchase.service.dto.ZDwmsCallbackDto; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/wms") +@Slf4j +public class ZDwmsCallbackController { + + private final InboundZDwmsService inboundZDwmsService; + + @PostMapping("/zdwmsCallback") + @Log("中鼎立库回调") + @SaIgnore + public ResponseEntity zdwmsCallback(@RequestBody ZDwmsCallbackDto dto) { + log.info("中鼎立库回调, billId: {}, status: {}", dto.getBill_id(), dto.getStatus()); + inboundZDwmsService.handleZDwmsCallback(dto); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "回调处理成功"); + return new ResponseEntity<>(result, HttpStatus.OK); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/EasToWmsService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/EasToWmsService.java new file mode 100644 index 0000000..89c79b6 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/EasToWmsService.java @@ -0,0 +1,8 @@ +package org.nl.wms.ext_manage.purchase.service; + +import com.alibaba.fastjson.JSONObject; + +public interface EasToWmsService { + + JSONObject receivePurchaseBill(String billId); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasAuditService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasAuditService.java new file mode 100644 index 0000000..9515a18 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasAuditService.java @@ -0,0 +1,10 @@ +package org.nl.wms.ext_manage.purchase.service; + +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; + +public interface InboundEasAuditService { + + void auditCompletedBills(); + + void auditSingleBill(Purchasemst mst); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasSyncService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasSyncService.java new file mode 100644 index 0000000..8571f06 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundEasSyncService.java @@ -0,0 +1,8 @@ +package org.nl.wms.ext_manage.purchase.service; + +import com.alibaba.fastjson.JSONObject; + +public interface InboundEasSyncService { + + JSONObject syncPurchaseBill(String billId); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundZDwmsService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundZDwmsService.java new file mode 100644 index 0000000..4d92e87 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/InboundZDwmsService.java @@ -0,0 +1,11 @@ +package org.nl.wms.ext_manage.purchase.service; + +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.ext_manage.purchase.service.dto.ZDwmsCallbackDto; + +public interface InboundZDwmsService { + + void forwardToZDwms(Purchasemst mst); + + void handleZDwmsCallback(ZDwmsCallbackDto dto); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/EasAuditRequestDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/EasAuditRequestDto.java new file mode 100644 index 0000000..2a0ddd6 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/EasAuditRequestDto.java @@ -0,0 +1,37 @@ +package org.nl.wms.ext_manage.purchase.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class EasAuditRequestDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String type; + private String method; + private EasAuditDataDto data; + + @Data + public static class EasAuditDataDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String billNo; + private String billType; + private List entrys; + } + + @Data + public static class EasAuditEntryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer seq; + private BigDecimal qty; + private String entryId; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/ZDwmsCallbackDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/ZDwmsCallbackDto.java new file mode 100644 index 0000000..39ee88c --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/dto/ZDwmsCallbackDto.java @@ -0,0 +1,15 @@ +package org.nl.wms.ext_manage.purchase.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ZDwmsCallbackDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String bill_id; + private String status; + private String message; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/EasToWmsServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/EasToWmsServiceImpl.java new file mode 100644 index 0000000..b918499 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/EasToWmsServiceImpl.java @@ -0,0 +1,26 @@ +package org.nl.wms.ext_manage.purchase.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext_manage.purchase.service.EasToWmsService; +import org.nl.wms.ext_manage.purchase.service.InboundEasSyncService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class EasToWmsServiceImpl implements EasToWmsService { + + @Autowired + private InboundEasSyncService inboundEasSyncService; + + @Override + public JSONObject receivePurchaseBill(String billId) { + if (StrUtil.isEmptyIfStr(billId)){ + throw new BadRequestException("EAS采购单同步失败:billid为空"); + } + return inboundEasSyncService.syncPurchaseBill(billId); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasAuditServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasAuditServiceImpl.java new file mode 100644 index 0000000..e083c88 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasAuditServiceImpl.java @@ -0,0 +1,125 @@ +package org.nl.wms.ext_manage.purchase.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus; +import org.nl.wms.ext_manage.purchase.service.InboundEasAuditService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper; +import org.nl.wms.ext_manage.purchase.service.dto.EasAuditRequestDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +public class InboundEasAuditServiceImpl implements InboundEasAuditService { + + @Value("${eas.webservice.wsdl:http://192.168.100.100:8080/ormrpc/services/WSNLWQFacade?wsdl}") + private String easWsdlUrl; + + @Autowired + private PurchasemstMapper purchasemstMapper; + + @Autowired + private PurchasedtlMapper purchasedtlMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditCompletedBills() { + log.info("开始扫描已完成未审核的采购入库单..."); + + List billList = purchasemstMapper.selectList( + new QueryWrapper() + .eq("bill_status", PurchaseBillStatus.COMPLETED.getCode()) + ); + + if (ObjectUtil.isEmpty(billList)) { + log.info("没有需要审核的采购入库单"); + return; + } + + log.info("找到{}个需要审核的采购入库单", billList.size()); + + for (Purchasemst mst : billList) { + try { + auditSingleBill(mst); + } catch (Exception e) { + log.error("审核采购入库单失败, billId: {}", mst.getBill_id(), e); + purchasemstMapper.update(null, new LambdaUpdateWrapper() + .eq(Purchasemst::getBill_id, mst.getBill_id()) + .set(Purchasemst::getAudit_msg, e.getMessage())); + } + } + } + + @Override + public void auditSingleBill(Purchasemst mst) { + log.info("开始审核采购入库单, billId: {}, orderNo: {}", mst.getBill_id(), mst.getOrder_no()); + + List dtlList = purchasedtlMapper.selectList( + new QueryWrapper().eq("bill_id", mst.getBill_id()) + ); + + EasAuditRequestDto requestDto = new EasAuditRequestDto(); + requestDto.setType("WMS"); + requestDto.setMethod("DealBill"); + + EasAuditRequestDto.EasAuditDataDto dataDto = new EasAuditRequestDto.EasAuditDataDto(); + dataDto.setBillNo(mst.getOrder_no()); + + List entrys = new ArrayList<>(); + for (Purchasedtl dtl : dtlList) { + EasAuditRequestDto.EasAuditEntryDto entry = new EasAuditRequestDto.EasAuditEntryDto(); + entry.setSeq(Integer.valueOf(dtl.getItem_no())); + entrys.add(entry); + } + dataDto.setEntrys(entrys); + requestDto.setData(dataDto); + + String requestJson = JSON.toJSONString(requestDto); + log.info("审核请求参数: {}", requestJson); + + try { + String responseMsg = HttpRequest.post(easWsdlUrl) + .body(requestJson) + .execute().body(); + + log.info("审核响应结果: {}", responseMsg); + + JSONObject response = JSONObject.parseObject(responseMsg); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(Purchasemst::getBill_id, mst.getBill_id()); + + Integer status = response.getInteger("status"); + if (status != null && status == 200) { + updateWrapper.set(Purchasemst::getBill_status, PurchaseBillStatus.AUDIT_SUCCESS.getCode()) + .set(Purchasemst::getAudit_msg, "审核成功"); + log.info("采购入库单审核成功, billId: {}", mst.getBill_id()); + } else { + updateWrapper.set(Purchasemst::getBill_status, PurchaseBillStatus.AUDIT_FAIL.getCode()) + .set(Purchasemst::getAudit_msg, response.getString("message")); + log.warn("采购入库单审核失败, billId: {}, message: {}", mst.getBill_id(), response.getString("message")); + } + + purchasemstMapper.update(null, updateWrapper); + } catch (Exception e) { + log.error("调用EAS审核接口异常, billId: {}", mst.getBill_id(), e); + purchasemstMapper.update(null, new LambdaUpdateWrapper() + .eq(Purchasemst::getBill_id, mst.getBill_id()) + .set(Purchasemst::getBill_status, PurchaseBillStatus.AUDIT_FAIL.getCode()) + .set(Purchasemst::getAudit_msg, "调用EAS审核接口异常: ")); + } + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasQueryService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasQueryService.java new file mode 100644 index 0000000..243fef9 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasQueryService.java @@ -0,0 +1,39 @@ +package org.nl.wms.ext_manage.purchase.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.ext_manage.purchase.service.mapper.EasPurchasedtlMapper; +import org.nl.wms.ext_manage.purchase.service.mapper.EasPurchasemstMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@DS("eas") +@Service +public class InboundEasQueryService { + + @Autowired + private EasPurchasemstMapper easPurchasemstMapper; + + @Autowired + private EasPurchasedtlMapper easPurchasedtlMapper; + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public Purchasemst queryMst(String billId) { + log.info("从EAS数据源查询采购入库主表, billId: {}", billId); + List list = easPurchasemstMapper.selectByBillId(billId); + return list != null && !list.isEmpty() ? list.get(0) : null; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public List queryDtlList(String billId) { + log.info("从EAS数据源查询采购入库明细, billId: {}", billId); + return easPurchasedtlMapper.selectByBillId(billId); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasSyncServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasSyncServiceImpl.java new file mode 100644 index 0000000..7e383f5 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundEasSyncServiceImpl.java @@ -0,0 +1,77 @@ +package org.nl.wms.ext_manage.purchase.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext_manage.service.WmsToZDWmdService; +import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus; +import org.nl.wms.ext_manage.purchase.service.InboundEasSyncService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +public class InboundEasSyncServiceImpl implements InboundEasSyncService { + + @Autowired + private InboundEasQueryService easQueryService; + + @Autowired + private PurchasemstMapper purchasemstMapper; + + @Autowired + private PurchasedtlMapper purchasedtlMapper; + + @Autowired + private WmsToZDWmdService wmsToZDWmdService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject syncPurchaseBill(String billId) { + log.info("开始同步EAS采购入库单, billId: {}", billId); + + Purchasemst easMst = easQueryService.queryMst(billId); + if (easMst == null) { + throw new BadRequestException("EAS采购单同步失败:EAS系统中未找到单据: " + billId); + } + + Purchasemst existing = purchasemstMapper.selectById(billId); + if (existing != null) { + throw new BadRequestException("EAS采购单同步失败:单据已存在: " + billId); + } + + List easDtlList = easQueryService.queryDtlList(billId); + + easMst.setBill_status(PurchaseBillStatus.CREATED.getCode()); + easMst.setModify_date(DateUtil.now()); + purchasemstMapper.insert(easMst); + + for (Purchasedtl dtl : easDtlList) { + purchasedtlMapper.insert(dtl); + if (dtl.getHouse_code().contains("ZDLK")){ + //中鼎立库 + //TODO 转发中鼎参数待确定 + wmsToZDWmdService.syncPurchaseReceiving(new JSONObject()); + } + } + + log.info("EAS采购入库单同步完成, billId: {}, 明细数: {}", billId, easDtlList.size()); + + + + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "同步成功"); + result.put("bill_id", billId); + return result; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundZDwmsServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundZDwmsServiceImpl.java new file mode 100644 index 0000000..4ea669e --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/impl/InboundZDwmsServiceImpl.java @@ -0,0 +1,92 @@ +package org.nl.wms.ext_manage.purchase.service.impl; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus; +import org.nl.wms.ext_manage.purchase.service.InboundZDwmsService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper; +import org.nl.wms.ext_manage.purchase.service.dto.ZDwmsCallbackDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +public class InboundZDwmsServiceImpl implements InboundZDwmsService { + + @Value("${inbound.zdwms-url:http://192.168.100.200:8080/api/wms/purchaseInbound}") + private String zdwmsUrl; + + @Autowired + private PurchasemstMapper purchasemstMapper; + + @Autowired + private PurchasedtlMapper purchasedtlMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void forwardToZDwms(Purchasemst mst) { + log.info("转发采购入库单到中鼎立库, billId: {}", mst.getBill_id()); + + JSONObject param = new JSONObject(); + param.put("bill_id", mst.getBill_id()); + param.put("order_no", mst.getOrder_no()); + param.put("order_type", mst.getOrder_type()); + param.put("supplier_code", mst.getSupplier_code()); + param.put("supplier_name", mst.getSupplier_name()); + + List dtlList = purchasedtlMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() + .eq("bill_id", mst.getBill_id()) + ); + + param.put("detailList", dtlList); + + try { + String resultMsg = HttpRequest.post(zdwmsUrl) + .body(param.toJSONString()) + .execute().body(); + JSONObject result = JSONObject.parseObject(resultMsg); + Integer status = result.getInteger("status"); + + if (status != null && status == 200) { + updateBillStatus(mst.getBill_id(), PurchaseBillStatus.EXECUTING); + log.info("转发中鼎立库成功, billId: {}", mst.getBill_id()); + } else { + log.error("转发中鼎立库失败, billId: {}, response: {}", mst.getBill_id(), resultMsg); + throw new RuntimeException("转发中鼎立库失败: " + result.getString("message")); + } + } catch (Exception e) { + log.error("转发中鼎立库异常, billId: {}", mst.getBill_id(), e); + throw new RuntimeException("转发中鼎立库异常: " + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleZDwmsCallback(ZDwmsCallbackDto dto) { + log.info("接收中鼎立库回调, billId: {}, status: {}", dto.getBill_id(), dto.getStatus()); + + if ("completed".equals(dto.getStatus()) || "2".equals(dto.getStatus())) { + updateBillStatus(dto.getBill_id(), PurchaseBillStatus.COMPLETED); + log.info("中鼎立库执行完成, billId: {}", dto.getBill_id()); + } else { + log.warn("中鼎立库回调状态未识别, billId: {}, status: {}", dto.getBill_id(), dto.getStatus()); + } + } + + private void updateBillStatus(String billId, PurchaseBillStatus status) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() + .eq(Purchasemst::getBill_id, billId) + .set(Purchasemst::getBill_status, status.getCode()); + purchasemstMapper.update(null, wrapper); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.java new file mode 100644 index 0000000..8b60648 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.java @@ -0,0 +1,14 @@ +package org.nl.wms.ext_manage.purchase.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; + +import java.util.List; + +@Mapper +public interface EasPurchasedtlMapper extends BaseMapper { + + List selectByBillId(@Param("bill_id") String billId); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.xml b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.xml new file mode 100644 index 0000000..4d35f9d --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasedtlMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.java new file mode 100644 index 0000000..252d78a --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.java @@ -0,0 +1,14 @@ +package org.nl.wms.ext_manage.purchase.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; + +import java.util.List; + +@Mapper +public interface EasPurchasemstMapper extends BaseMapper { + + List selectByBillId(@Param("bill_id") String billId); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.xml b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.xml new file mode 100644 index 0000000..9499bd0 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/ext_manage/purchase/service/mapper/EasPurchasemstMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/controller/InboundPdaController.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/controller/InboundPdaController.java new file mode 100644 index 0000000..0c555e2 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/controller/InboundPdaController.java @@ -0,0 +1,74 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pda_manage.ios_manage.purchase.service.InboundPdaService; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.GroupPlateInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.ManualInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.PdaGroupPlateDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.UsualInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; +import org.nl.wms.pda_manage.util.PdaResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/pda/inbound") +@Slf4j +public class InboundPdaController { + + private final InboundPdaService inboundPdaService; + + @GetMapping("/getInfoByCode") + @Log("PDA根据条码查询采购入库单的物料信息") + @SaIgnore + public PdaResponse getInfoByCode(@RequestParam String code) { + List list = inboundPdaService.getInfoByCode(code); + return PdaResponse.requestParamOk(list); + } + + @PostMapping("/groupPlate") + @Log("PDA提交组盘") + @SaIgnore + public PdaResponse submitGroupPlate(@RequestBody PdaGroupPlateDto dto) { + JSONObject result = inboundPdaService.submitGroupPlate(dto); + return PdaResponse.requestParamOk(result); + } + @PostMapping("/groupPlateInbound") + @Log("PDA提交AGV组盘入库") + @SaIgnore + public PdaResponse submitGroupPlateInbound(@RequestBody GroupPlateInboundDto dto) { + inboundPdaService.submitGroupPlateInbound(dto,true); + return PdaResponse.requestOk(); + } + @PostMapping("/manualInbound") + @Log("PDA提交手工入库") + @SaIgnore + public PdaResponse submitManualInbound(@RequestBody ManualInboundDto dto) { + inboundPdaService.submitManualInbound(dto); + return PdaResponse.requestOk(); + } + + @PostMapping("/usualInbound") + @Log("平库入库") + @SaIgnore + public PdaResponse usualInbound(@RequestBody UsualInboundDto usualInboundDto) { + inboundPdaService.usualInbound(usualInboundDto); + return PdaResponse.requestOk(); + } + + @GetMapping("/unfinishedBills") + @Log("PDA查询未完成采购入库单") + @SaIgnore + public ResponseEntity queryUnfinishedBills() { + List list = inboundPdaService.queryUnfinishedBills(); + return new ResponseEntity<>(list, HttpStatus.OK); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/InboundPdaService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/InboundPdaService.java new file mode 100644 index 0000000..839d62a --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/InboundPdaService.java @@ -0,0 +1,25 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.GroupPlateInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.ManualInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.PdaGroupPlateDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.UsualInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; + +import java.util.List; + +public interface InboundPdaService { + + List queryUnfinishedBills(); + + JSONObject submitGroupPlate(PdaGroupPlateDto dto); + + List getInfoByCode(String code); + + void usualInbound(UsualInboundDto usualInboundDto); + + void submitGroupPlateInbound(GroupPlateInboundDto dto, Boolean subTask); + + void submitManualInbound(ManualInboundDto dto); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/GroupPlateInboundDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/GroupPlateInboundDto.java new file mode 100644 index 0000000..0cc98f1 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/GroupPlateInboundDto.java @@ -0,0 +1,10 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.dto; + +import lombok.Data; + +@Data +public class GroupPlateInboundDto { + private String vehicle_code; + private String sect_code; + private String point_code; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/ManualInboundDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/ManualInboundDto.java new file mode 100644 index 0000000..c0ee0b0 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/ManualInboundDto.java @@ -0,0 +1,9 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.dto; + +import lombok.Data; + +@Data +public class ManualInboundDto { + private String vehicle_code; + private String struct_code; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/PdaGroupPlateDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/PdaGroupPlateDto.java new file mode 100644 index 0000000..c8f61fc --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/PdaGroupPlateDto.java @@ -0,0 +1,29 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.dto; + +import lombok.Data; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class PdaGroupPlateDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String bill_id; + private String vehicle_code; + private String sect_code; + private List detailList; + + @Data + public static class GroupPlateDtlDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String order_no; + private String item_no; + private String sku_code; + private String batch_no; + private BigDecimal qty; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/UsualInboundDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/UsualInboundDto.java new file mode 100644 index 0000000..a7ee2d2 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/dto/UsualInboundDto.java @@ -0,0 +1,28 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class UsualInboundDto { + + private String bill_id; + private String vehicle_code; + private String sect_code; + private List detailList; + + @Data + public static class UsualInboundDtlDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String order_no; + private String item_no; + private String sku_code; + private String batch_no; + private BigDecimal qty; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/impl/InboundPdaServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/impl/InboundPdaServiceImpl.java new file mode 100644 index 0000000..7307d8c --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/impl/InboundPdaServiceImpl.java @@ -0,0 +1,531 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.MapOf; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.SpringContextHolder; +import org.nl.wms.basedata_manage.service.*; +import org.nl.wms.basedata_manage.service.dao.*; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.GroupPlateInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.ManualInboundDto; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.UsualInboundDto; +import org.nl.wms.pm_manage.SourceBillTypeEnum; +import org.nl.wms.pm_manage.listener.PmManageEvent; +import org.nl.wms.pm_manage.purchase.ListenerHandler.PurchaseListenerParams; +import org.nl.wms.pm_manage.purchase.service.PurchaseService; +import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus; +import org.nl.wms.pda_manage.ios_manage.purchase.service.InboundPdaService; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper; +import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.PdaGroupPlateDto; +import org.nl.wms.sch_manage.enums.StatusEnum; +import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; +import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper; +import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDisDto; +import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService; +import org.nl.wms.warehouse_manage.service.dao.GroupPlate; +import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS; +import static org.nl.wms.warehouse_manage.enums.IOSEnum.LOCK_TYPE; + +@Slf4j +@Service +public class InboundPdaServiceImpl implements InboundPdaService { + + + + @Autowired + private ApplicationEventPublisher eventPublisher; + @Autowired + private PurchaseService purchaseService; + + /** + * 组盘记录服务 + */ + @Autowired + private IMdPbGroupplateService iMdPbGroupplateService; + + @Resource + private IStructattrService iStructattrService; + + /** + * 基础物料服务 + */ + @Autowired + private IMdMeMaterialbaseService iMdMeMaterialbaseService; + + /** + * 计量单位服务 + */ + @Autowired + private IMdPbMeasureunitService iMdPbMeasureunitService; + /** + * 入库服务 + */ + @Autowired + private IInBillService iRawAssistIStorService; + /** + * 库区服务 + */ + @Autowired + private ISectattrService iSectattrService; + /** + * 仓库服务 + */ + @Autowired + private IBsrealStorattrService iSrealStorattrService; + /** + * 入库明细服务 + */ + @Autowired + private IOStorInvDtlMapper ioStorInvDtlMapper; + + @Resource + private IOStorInvDisMapper ioStorInvDisMapper; + + + + + @Override + public List queryUnfinishedBills() { + List list = purchaseService.list( + new QueryWrapper() + .ne("bill_status", PurchaseBillStatus.COMPLETED.getCode()) + .ne("bill_status", PurchaseBillStatus.AUDIT_SUCCESS.getCode()) + .ne("bill_status", PurchaseBillStatus.AUDIT_FAIL.getCode()) + ); + + List resultList = new ArrayList<>(); + for (Purchasemst mst : list) { + JSONObject json = new JSONObject(); + json.put("bill_id", mst.getBill_id()); + json.put("order_no", mst.getOrder_no()); + json.put("order_type", mst.getOrder_type()); + json.put("supplier_code", mst.getSupplier_code()); + json.put("supplier_name", mst.getSupplier_name()); + json.put("status", mst.getStatus()); + json.put("bill_status", mst.getBill_status()); + + List dtlList = purchaseService.selectListByBillId(mst.getBill_id()); + json.put("detailList", dtlList); + resultList.add(json); + } + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject submitGroupPlate(PdaGroupPlateDto dto) { + log.info("PDA提交组盘, vehicleCode: {}", dto.getVehicle_code()); + + List detailList = dto.getDetailList(); + detailList.forEach((item)->{ + List purchaseMatInfoVos = purchaseService.selectPdaInMat(MapOf.of("orderNo", item.getOrder_no(), + "materialCode", item.getSku_code())); + if (purchaseMatInfoVos.isEmpty()){ + throw new BadRequestException("组盘失败:单据:"+item.getOrder_no()+"物料:"+item.getSku_code()+"不存在"); + } + PurchaseMatInfoVo purchaseMatInfoVo = purchaseMatInfoVos.get(0); + if (item.getQty().add(purchaseMatInfoVo.getInstock_qty()).compareTo(purchaseMatInfoVo.getQty()) > 0){ + throw new BadRequestException("组盘失败:"+item.getSku_code() + "组盘数量超过单据数量"); + } + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(item.getSku_code()); + MdPbMeasureunit unitDao = iMdPbMeasureunitService.getById(materDao.getQty_unit_id()); + //判断该载具是否存在组盘信息 + long statusCount = iMdPbGroupplateService.count( + new LambdaQueryWrapper() + .eq(GroupPlate::getStoragevehicle_code, dto.getVehicle_code()) + .lt(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("出库")) + ); + if (statusCount > 0) { + throw new BadRequestException("组盘失败:载具编码:" + dto.getVehicle_code() + "已存在组盘信息,请对数据进行核实!"); + } + //判断该载具编号是否已经存在库内 + long count = iStructattrService.count( + new LambdaQueryWrapper() + .eq(Structattr::getStoragevehicle_code, dto.getVehicle_code()) + ); + if (count > 0) { + throw new BadRequestException("组盘失败:载具编码:" + dto.getVehicle_code() + "已存在库内,请对数据进行核实!"); + } + GroupPlate groupDao = GroupPlate.builder() + .group_id(IdUtil.getStringId()) + .material_code(item.getSku_code()) + .storagevehicle_code(dto.getVehicle_code()) + .pcsn(item.getBatch_no()) + .qty_unit_id(unitDao.getMeasure_unit_id()) + .qty_unit_name(unitDao.getUnit_name()) + .qty(item.getQty()) + .status(GROUP_PLATE_STATUS.code("组盘")) + .ext_code(dto.getBill_id()) + .ext_type(SourceBillTypeEnum.PM_PURCHASE.getBillType()) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentNickName()) + .create_time(DateUtil.now()) + .build(); + iMdPbGroupplateService.save(groupDao); + + }); + //更新单据状态已创建 + purchaseService.lambdaUpdate().eq(Purchasemst::getBill_id, dto.getBill_id()) + .set(Purchasemst::getBill_status, PurchaseBillStatus.EXECUTING.getCode()); + + + JSONObject result = new JSONObject(); + result.put("success", true); + result.put("message", "组盘提交成功"); + return result; + } + + + @Override + public List getInfoByCode(String code) { + if (StrUtil.isEmptyIfStr(code)){ + throw new BadRequestException("获取单据失败:参数为空"); + } + Map parseMap = parseCode(code); + List purchaseMatInfoVos = purchaseService.selectPdaInMat(MapOf.of("orderNo", parseMap.get("orderNo"), + "materialCode", parseMap.get("materialCode"))); + if (purchaseMatInfoVos.size() > 1){ + throw new BadRequestException("同一个采购单有重复物料"); + } + PurchaseMatInfoVo purchaseMatInfoVo = purchaseMatInfoVos.get(0); +// if (purchaseMatInfoVo.getQty() != Integer.parseInt(parseMap.get("quantityStr").toString())){ +// throw new BadRequestException(String.format("(物料%s)条码数量与采购单数量不一致",parseMap.get("materialName")) ); +// } + purchaseMatInfoVo.setQty(new BigDecimal(parseMap.get("quantityStr").toString())); + return purchaseMatInfoVos; + } + + @Transactional + @Override + public void usualInbound(UsualInboundDto usualInboundDto) { + log.info("PDA提交平库入库 参数:{}", JSON.toJSONString(usualInboundDto)); + + // 查询库区 + Sectattr sectDao = iSectattrService.findByCode(usualInboundDto.getSect_code()); + //获取库位 + List structList = iStructattrService.lambdaQuery() + .eq(Structattr::getSect_id, sectDao.getSect_id()) + .eq(Structattr::getLock_type, LOCK_TYPE.code("未锁定")) + .eq(Structattr::getIs_used, 1) + .isNotNull(Structattr::getStoragevehicle_code) + .orderByAsc(Structattr::getCreate_time).list(); + if (structList.isEmpty()){ + throw new BadRequestException("入库失败:未找到可用虚拟货位"); + } + Structattr struct = structList.get(0); + log.info("平库入库:找到虚拟库位{}",JSON.toJSONString(struct)); + String storagevehicleCode = struct.getStoragevehicle_code();//载具编码 + List items = new ArrayList<>(); + for (UsualInboundDto.UsualInboundDtlDto item : usualInboundDto.getDetailList()) { + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(item.getSku_code()); + MdPbMeasureunit unitDao = iMdPbMeasureunitService.getById(materDao.getQty_unit_id()); + //组盘 + GroupPlate plateDao = GroupPlate.builder() + .group_id(IdUtil.getStringId()) + .material_code(item.getSku_code()) + .storagevehicle_code(storagevehicleCode) + .pcsn(item.getBatch_no()) + .qty_unit_id(unitDao.getMeasure_unit_id()) + .qty_unit_name(unitDao.getUnit_name()) + .qty(item.getQty()) + .status(GROUP_PLATE_STATUS.code("组盘")) + .ext_code(usualInboundDto.getBill_id()) + .ext_type(SourceBillTypeEnum.PM_PURCHASE.getBillType()) + .create_id(SecurityUtils.getCurrentUserId()) + .create_name(SecurityUtils.getCurrentNickName()) + .create_time(DateUtil.now()) + .build(); + iMdPbGroupplateService.save(plateDao); + PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem(); + detailItem.setItem_no(item.getItem_no()); + detailItem.setQty(item.getQty()); + items.add(detailItem); + } + GroupPlateInboundDto groupPlateInboundDto = new GroupPlateInboundDto(); + groupPlateInboundDto.setSect_code(sectDao.getSect_code()); + groupPlateInboundDto.setVehicle_code(storagevehicleCode); + InboundPdaServiceImpl thisBean = SpringContextHolder.getBean(this.getClass()); + thisBean.submitGroupPlateInbound(groupPlateInboundDto, false); + + PurchaseListenerParams purchaseListenerParams = new PurchaseListenerParams(); + purchaseListenerParams.setBillId(usualInboundDto.getBill_id()); + purchaseListenerParams.setDetailItem(items); + pushEvent(purchaseListenerParams); + } + + @Override + @Transactional + public void submitGroupPlateInbound(GroupPlateInboundDto groupPlateInboundDto, Boolean subTask) { + // 查询组盘明细 + List plateDaoList = iMdPbGroupplateService.list( + new QueryWrapper().lambda() + .eq(GroupPlate::getStoragevehicle_code, groupPlateInboundDto.getVehicle_code()) + .eq(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("组盘")) + ); + if (ObjectUtil.isEmpty(plateDaoList)) { + throw new BadRequestException("当前没有可入库的物料!"); + } + // 总数量 + Double total_qty = plateDaoList.stream() + .map(row -> row.getQty().doubleValue()) + .reduce(Double::sum).orElse(0.0); + + // 查询库区 + Sectattr sectDao = iSectattrService.findByCode(groupPlateInboundDto.getSect_code()); + // 组织主表数据 + Map jsonMst = new HashMap<>(); + jsonMst.put("stor_id", sectDao.getStor_id()); + jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("生成")); + jsonMst.put("total_qty", total_qty); + jsonMst.put("detail_count", 1); + jsonMst.put("bill_type", IOSEnum.BILL_TYPE.code("采购入库")); + jsonMst.put("biz_date", DateUtil.now()); + // 组织明细数据 + ArrayList tableData = new ArrayList<>(); + HashMap dtl = new HashMap<>(); + GroupPlate plateDao = plateDaoList.get(0); + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code()); + dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code()); + dtl.put("material_id", materDao.getMaterial_id()); + dtl.put("material_code", materDao.getMaterial_code()); + dtl.put("material_name", materDao.getMaterial_name()); + dtl.put("pcsn", plateDao.getPcsn()); + dtl.put("qty_unit_id", plateDao.getQty_unit_id()); + dtl.put("qty_unit_name", plateDao.getQty_unit_name()); + dtl.put("qty", String.valueOf(total_qty)); + dtl.put("plan_qty", String.valueOf(total_qty)); + dtl.put("ext_code", plateDao.getExt_code()); + dtl.put("ext_type", plateDao.getExt_type()); + // 调用新增 + tableData.add(dtl); + jsonMst.put("tableData",tableData); + String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst); + // 查询仓库 + BsrealStorattr storeDao = iSrealStorattrService.getById(sectDao.getStor_id()); + // 组织主数据 + Map jsonMst1 = new HashMap<>(); + jsonMst1.put("checked", true); + jsonMst1.put("sect_id", sectDao.getSect_id()); + jsonMst1.put("stor_id", sectDao.getStor_id()); + jsonMst1.put("sect_code", sectDao.getSect_code()); + jsonMst1.put("stor_code", storeDao.getStor_code()); + jsonMst1.put("storagevehicle_code", groupPlateInboundDto.getVehicle_code()); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, iostorinv_id) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + disDtl.forEach(item -> { + jsonMst1.put("dis_row", JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + // 调用分配,默认自动分配库位 + iRawAssistIStorService.divStruct(new JSONObject(jsonMst1)); + // 下发任务 + if (subTask){ + JSONObject whereJsonTask = new JSONObject(); + whereJsonTask.put("iostorinv_id",iostorinv_id); + whereJsonTask.put("point_code", groupPlateInboundDto.getPoint_code()); + sendTask(whereJsonTask); + } else { + // 单据直接完成 + JSONObject confirmJson = new JSONObject(); + confirmJson.put("iostorinv_id", iostorinv_id); + iRawAssistIStorService.confirm(confirmJson); + } + PurchaseListenerParams listenerParams = new PurchaseListenerParams(); + listenerParams.setBillId(plateDao.getExt_code()); + PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem(); + detailItem.setQty(plateDao.getQty()); + detailItem.setMaterialCode(plateDao.getMaterial_code()); + List detailItemList = new ArrayList<>(); + detailItemList.add(detailItem); + listenerParams.setDetailItem(detailItemList); + pushEvent(listenerParams); + + } + + @Override + public void submitManualInbound(ManualInboundDto dto) { + // 查询组盘明细 + List plateDaoList = iMdPbGroupplateService.list( + new QueryWrapper().lambda() + .eq(GroupPlate::getStoragevehicle_code, dto.getVehicle_code()) + .eq(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("组盘")) + ); + if (ObjectUtil.isEmpty(plateDaoList)) { + throw new BadRequestException("当前没有可入库的物料!"); + } + // 总数量 + Double total_qty = plateDaoList.stream() + .map(row -> row.getQty().doubleValue()) + .reduce(Double::sum).orElse(0.0); + // 查询库位 + Structattr struct = iStructattrService.findByCode(dto.getStruct_code()); + // 查询库区 + Sectattr sectDao = iSectattrService.findByCode(struct.getSect_code()); + // 组织主表数据 + Map jsonMst = new HashMap<>(); + jsonMst.put("stor_id", sectDao.getStor_id()); + jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("完成")); + jsonMst.put("total_qty", total_qty); + jsonMst.put("detail_count", 1); + jsonMst.put("bill_type", IOSEnum.BILL_TYPE.code("采购入库")); + jsonMst.put("biz_date", DateUtil.now()); + // 组织明细数据 + ArrayList tableData = new ArrayList<>(); + HashMap dtl = new HashMap<>(); + GroupPlate plateDao = plateDaoList.get(0); + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code()); + dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code()); + dtl.put("material_id", materDao.getMaterial_id()); + dtl.put("material_code", materDao.getMaterial_code()); + dtl.put("material_name", materDao.getMaterial_name()); + dtl.put("pcsn", plateDao.getPcsn()); + dtl.put("qty_unit_id", plateDao.getQty_unit_id()); + dtl.put("qty_unit_name", plateDao.getQty_unit_name()); + dtl.put("qty", String.valueOf(total_qty)); + dtl.put("plan_qty", String.valueOf(total_qty)); + dtl.put("ext_code", plateDao.getExt_code()); + dtl.put("ext_type", plateDao.getExt_type()); + // 调用新增入库单 + tableData.add(dtl); + jsonMst.put("tableData",tableData); + String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst); + // 查询仓库 + BsrealStorattr storeDao = iSrealStorattrService.getById(sectDao.getStor_id()); + // 组织主数据 + Map jsonMst1 = new HashMap<>(); + jsonMst1.put("checked", false); + jsonMst1.put("sect_id", sectDao.getSect_id()); + jsonMst1.put("stor_id", sectDao.getStor_id()); + jsonMst1.put("sect_code", sectDao.getSect_code()); + jsonMst1.put("stor_code", storeDao.getStor_code()); + jsonMst1.put("storagevehicle_code", dto.getVehicle_code()); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, iostorinv_id) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + disDtl.forEach(item -> { + item.setStruct_code(struct.getStruct_code()); + item.setStruct_id(struct.getStruct_id()); + item.setStruct_name(struct.getStruct_name()); + item.setSect_code(sectDao.getSect_code()); + item.setSect_id(sectDao.getSect_id()); + item.setSect_name(sectDao.getSect_name()); + jsonMst1.put("dis_row", JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + // 调用分配,分配库位 + iRawAssistIStorService.divStruct(new JSONObject(jsonMst1)); + // 手工入库单据直接完成 + JSONObject confirmJson = new JSONObject(); + confirmJson.put("iostorinv_id", iostorinv_id); + iRawAssistIStorService.confirm(confirmJson); + + PurchaseListenerParams purchaseListenerParams = new PurchaseListenerParams(); + purchaseListenerParams.setBillId(plateDao.getExt_code()); + PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem(); + detailItem.setMaterialCode(plateDao.getMaterial_code()); + detailItem.setQty(plateDao.getQty()); + pushEvent(purchaseListenerParams); + } + + private Map parseCode(String code){ + String[] parts = code.split("#", -1); + log.info("采购单入库条码解析结果:{}", Arrays.toString(parts)); + + if (parts.length < 5) { + throw new BadRequestException("解析物料码失败:物料码格式错误,字段数不足"); + } + + String orderNo = parts[0];//单据号 + String itemNo = parts[1];//单据行号 + String materialCode = parts[2];//物料编码 + String materialName = parts[3];//物料名称 + String quantityStr = parts[5];//数量 + + return MapOf.of("orderNo",orderNo, + "itemNo",itemNo, + "materialCode",materialCode, + "materialName",materialName, + "quantityStr",quantityStr); + } + + /** + * 下发任务 + * @param whereJson { + * storagevehicle_code:载具编码 + * point_code:点位编码 + * sect_code:库区 + * iostorinv_id: id + * } + */ + private void sendTask(JSONObject whereJson) { + // 组织主数据 + Map jsonMst = new HashMap<>(); + jsonMst.put("point_code", whereJson.getString("point_code")); + // 组织明细数据 + IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne( + new QueryWrapper().lambda() + .eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id")) + ); + // 查找分配明细 + Map map = new HashMap<>(); + map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id()); + List disDtl = iRawAssistIStorService.getDisDtl(map); + // 类型转换 + ArrayList tableMater = new ArrayList<>(); + disDtl.forEach(item -> { + tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)); + }); + jsonMst.put("tableMater", tableMater); + + iRawAssistIStorService.divPoint(jsonMst); + } + + private void pushEvent(PurchaseListenerParams params){ + if (!StrUtil.isEmptyIfStr(params.getBillId())){ + PmManageEvent pmManageEvent = new PmManageEvent(SourceBillTypeEnum.PM_PURCHASE.getBillType(), params); + eventPublisher.publishEvent(pmManageEvent); + } + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/vo/PurchaseMatInfoVo.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/vo/PurchaseMatInfoVo.java new file mode 100644 index 0000000..850470e --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pda_manage/ios_manage/purchase/service/vo/PurchaseMatInfoVo.java @@ -0,0 +1,21 @@ +package org.nl.wms.pda_manage.ios_manage.purchase.service.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class PurchaseMatInfoVo { + + private String bill_id; + private String order_no; + private String item_no; + private String sect_code; + private String category_code; + private String category_name; + private String batch_no; + private String sku_code; + private String sku_name; + private BigDecimal qty; + private BigDecimal instock_qty; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java index 81030ca..9cc22a1 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/SourceBillTypeEnum.java @@ -12,6 +12,7 @@ import org.nl.common.exception.BadRequestException; @Getter public enum SourceBillTypeEnum { PM_DEMADN("pm_demand","出库需求单"), + PM_PURCHASE("pm_purchase","采购入库单"), UNDEFINE("","未定义"), ; /** diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseFormListenerHandler.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseFormListenerHandler.java new file mode 100644 index 0000000..d0a5795 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseFormListenerHandler.java @@ -0,0 +1,106 @@ +package org.nl.wms.pm_manage.purchase.ListenerHandler; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.time.DateFormatUtils; +import org.nl.common.utils.IdUtil; +import org.nl.wms.ext_manage.purchase.service.dto.EasAuditRequestDto; +import org.nl.wms.ext_manage.service.WmsToErpService; +import org.nl.wms.pm_manage.listener.core.BaseFormListenerHandler; +import org.nl.wms.pm_manage.purchase.service.PurchaseService; +import org.nl.wms.pm_manage.purchase.service.PurchasedtlService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus; +import org.nl.wms.warehouse_manage.enums.IOSEnum; +import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService; +import org.nl.wms.warehouse_manage.stockReturn.service.dao.PmStockReturn; +import org.nl.wms.warehouse_manage.stockReturn.service.enums.StockReturnStatusEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Component("pm_purchase") +@Slf4j +public class PurchaseFormListenerHandler extends BaseFormListenerHandler { + + @Autowired + private PurchaseService purchaseService; + @Autowired + private PurchasedtlService purchasedtlService; + /** + * 回传ERP单据服务 + */ + @Autowired + private IPmStockReturnService pmStockReturnService; + @Autowired + private WmsToErpService wmsToErpService; + @Override + public void onApplicationEvent(PurchaseListenerParams params) { + log.info("触发更新采购单事件 eventParams:{}", JSON.toJSONString(params)); + List entryList = new ArrayList<>(); + Purchasemst purchasemst = purchaseService.getOne(new LambdaQueryWrapper() + .eq(Purchasemst::getBill_id, params.getBillId())); + for (PurchaseListenerParams.DetailItem item : params.getDetailItem()) { + Purchasedtl purchasedtl = purchasedtlService.getOne(new LambdaQueryWrapper() + .eq(Purchasedtl::getBill_id, params.getBillId()) + .eq(item.getMaterialCode() != null, Purchasedtl::getSku_code, item.getMaterialCode()) + .eq(item.getItem_no() != null, Purchasedtl::getItem_no, item.getItem_no())); + + purchasedtl.setInstock_qty(item.getQty().add(purchasedtl.getInstock_qty())); + purchasedtlService.updateById(purchasedtl); + + EasAuditRequestDto.EasAuditEntryDto easAuditEntryDto = new EasAuditRequestDto.EasAuditEntryDto(); + easAuditEntryDto.setSeq(Integer.parseInt(purchasedtl.getItem_no())); + easAuditEntryDto.setQty(item.getQty()); + easAuditEntryDto.setEntryId(purchasedtl.getEntry_id()); + entryList.add(easAuditEntryDto); + } + List list = purchasedtlService.list(new LambdaQueryWrapper() + .eq(Purchasedtl::getBill_id, params.getBillId())); + boolean flag = list.stream().anyMatch(i -> i.getQty().compareTo(i.getInstock_qty()) != 0); + if (!flag){ + //全部相等则单据完成 + purchaseService.lambdaUpdate() + .set(Purchasemst::getBill_status, PurchaseBillStatus.COMPLETED.getCode()) + .set(Purchasemst::getModify_date, DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")) + .eq(Purchasemst::getBill_id, params.getBillId()); + } + // 保存回传单 + EasAuditRequestDto easAuditRequestDto = new EasAuditRequestDto(); + easAuditRequestDto.setType("WMS"); + easAuditRequestDto.setMethod("DealBill"); + EasAuditRequestDto.EasAuditDataDto easAuditDataDto = new EasAuditRequestDto.EasAuditDataDto(); + easAuditDataDto.setBillType(purchasemst.getOrder_type()); + easAuditDataDto.setBillNo(purchasemst.getOrder_no()); + easAuditDataDto.setEntrys(entryList); + easAuditRequestDto.setData(easAuditDataDto); + + final PmStockReturn stockReturn = new PmStockReturn(); + String stringId = IdUtil.getStringId(); + stockReturn.setRequest_Id(stringId); + stockReturn.setCreate_time(DateUtil.now()); + stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("采购入库")); + stockReturn.setStatus(StockReturnStatusEnum.TODO.getCode()); + stockReturn.setRequest_data(JSON.toJSONString(easAuditRequestDto)); + pmStockReturnService.save(stockReturn); + //回传 + try { + wmsToErpService.uploadErp(new JSONObject((JSONObject)JSON.toJSON(easAuditRequestDto))); + pmStockReturnService.lambdaUpdate() + .set(PmStockReturn::getStatus,StockReturnStatusEnum.SUCESS.getCode()) + .eq(PmStockReturn::getRequest_Id, stringId); + } catch (Exception e) { + pmStockReturnService.lambdaUpdate() + .set(PmStockReturn::getStatus,StockReturnStatusEnum.FAIL.getCode()) + .eq(PmStockReturn::getRequest_Id, stringId); + } + + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseListenerParams.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseListenerParams.java new file mode 100644 index 0000000..294f1c7 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/ListenerHandler/PurchaseListenerParams.java @@ -0,0 +1,19 @@ +package org.nl.wms.pm_manage.purchase.ListenerHandler; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class PurchaseListenerParams { + private String billId; + private List detailItem; + + @Data + public static class DetailItem { + private String item_no; + private BigDecimal qty; + private String materialCode; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/controller/PurchaseController.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/controller/PurchaseController.java new file mode 100644 index 0000000..c9ebedf --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/controller/PurchaseController.java @@ -0,0 +1,66 @@ +package org.nl.wms.pm_manage.purchase.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.pm_manage.purchase.service.PurchaseService; +import org.nl.wms.pm_manage.purchase.service.dto.PurchaseDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +@Slf4j +@RestController +@RequestMapping("/api/purchasemst") +public class PurchaseController { + + @Autowired + private PurchaseService purchaseService; + + @GetMapping + @Log("查询采购入库单") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(purchaseService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @GetMapping("/{id}") + @Log("查询采购入库单详情") + public ResponseEntity getById(@PathVariable String id) { + PurchaseDto dto = purchaseService.getDetailById(id); + return new ResponseEntity<>(dto, HttpStatus.OK); + } + + @PostMapping + @Log("新增采购入库单") + public ResponseEntity create(@Validated @RequestBody PurchaseDto dto) { + purchaseService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改采购入库单") + public ResponseEntity update(@Validated @RequestBody PurchaseDto dto) { + purchaseService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @DeleteMapping + @Log("删除采购入库单") + public ResponseEntity delete(@RequestBody Set ids) { + purchaseService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/forceAudit") + @Log("强制回传EAS审核") + public ResponseEntity forceAudit(@RequestBody Set ids) { + purchaseService.forceAudit(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchaseService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchaseService.java new file mode 100644 index 0000000..7f353e3 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchaseService.java @@ -0,0 +1,36 @@ +package org.nl.wms.pm_manage.purchase.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dto.PurchaseDto; +import org.nl.wms.pm_manage.purchase.service.vo.PurchasemstListVo; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface PurchaseService extends IService { + + IPage queryAll(Map whereJson, PageQuery page); + + PurchaseDto getDetailById(String id); + + void create(PurchaseDto dto); + + void update(PurchaseDto dto); + + void deleteAll(Set ids); + + void forceAudit(Set ids); + + List pdaInboundSelectMatInfo(Map whereJson); + + List selectListByBillId(String billId); + + List selectPdaInMat(HashMap of); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchasedtlService.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchasedtlService.java new file mode 100644 index 0000000..186947f --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/PurchasedtlService.java @@ -0,0 +1,7 @@ +package org.nl.wms.pm_manage.purchase.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; + +public interface PurchasedtlService extends IService { +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasedtl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasedtl.java new file mode 100644 index 0000000..8cacb88 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasedtl.java @@ -0,0 +1,50 @@ +package org.nl.wms.pm_manage.purchase.service.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_purchasedtl") +public class Purchasedtl implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + + private String entry_id; + + private String bill_id; + + private String item_no; + + private String category_code; + + private String category_name; + + private String sku_code; + + private String sku_name; + + private String model; + + private String house_code; + + private String batch_no; + + private BigDecimal qty; + + private String unit_code; + + private String unit; + + private String track_no; + + private BigDecimal instock_qty; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasemst.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasemst.java new file mode 100644 index 0000000..358cbe0 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/Purchasemst.java @@ -0,0 +1,43 @@ +package org.nl.wms.pm_manage.purchase.service.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_purchasemst") +public class Purchasemst implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + + private String bill_id; + + private String order_no; + + private String order_type; + + private String supplier_code; + + private String supplier_name; + + private String creator; + + private String create_time; + + private String modify_date; + + private Integer status; + + private Integer red; + + private String bill_status; + + private String audit_msg; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasedtlMapper.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasedtlMapper.java new file mode 100644 index 0000000..667f109 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasedtlMapper.java @@ -0,0 +1,9 @@ +package org.nl.wms.pm_manage.purchase.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; + +@Mapper +public interface PurchasedtlMapper extends BaseMapper { +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasemstMapper.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasemstMapper.java new file mode 100644 index 0000000..d01a8f7 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/PurchasemstMapper.java @@ -0,0 +1,21 @@ +package org.nl.wms.pm_manage.purchase.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.vo.PurchasemstListVo; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface PurchasemstMapper extends BaseMapper { + + IPage queryAllByPage(Page page, @Param("params") Map params); + + List selectPdaInMat(@Param("param") Map whereJson); +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasedtlMapper.xml b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasedtlMapper.xml new file mode 100644 index 0000000..240a40b --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasedtlMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasemstMapper.xml b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasemstMapper.xml new file mode 100644 index 0000000..3971c83 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dao/mapper/xml/PurchasemstMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dto/PurchaseDto.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dto/PurchaseDto.java new file mode 100644 index 0000000..d4c5544 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/dto/PurchaseDto.java @@ -0,0 +1,78 @@ +package org.nl.wms.pm_manage.purchase.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +public class PurchaseDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + + private String bill_id; + + private String order_no; + + private String order_type; + + private String supplier_code; + + private String supplier_name; + + private String creator; + + private Date create_time; + + private Date modify_date; + + private Integer status; + + private Integer red; + + private String bill_status; + + + private String audit_msg; + + private List tableData; + + @Data + public static class Purchasedtl implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + + private String entry_id; + + private String bill_id; + + private String item_no; + + private String category_code; + + private String category_name; + + private String sku_code; + + private String sku_name; + + private String model; + + private String house_code; + + private String batch_no; + + private Integer qty; + + private String unit_code; + + private String unit; + + private String track_no; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/enums/PurchaseBillStatus.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/enums/PurchaseBillStatus.java new file mode 100644 index 0000000..c56726f --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/enums/PurchaseBillStatus.java @@ -0,0 +1,26 @@ +package org.nl.wms.pm_manage.purchase.service.enums; + +public enum PurchaseBillStatus { + + CREATED("0", "已创建"), + EXECUTING("1", "执行中"), + COMPLETED("2", "已完成"), + AUDIT_SUCCESS("3", "审核成功"), + AUDIT_FAIL("4", "审核失败"); + + private final String code; + private final String name; + + PurchaseBillStatus(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchaseServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchaseServiceImpl.java new file mode 100644 index 0000000..5abdee6 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchaseServiceImpl.java @@ -0,0 +1,160 @@ +package org.nl.wms.pm_manage.purchase.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo; +import org.nl.wms.ext_manage.purchase.service.InboundEasAuditService; +import org.nl.wms.pm_manage.purchase.service.PurchaseService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper; +import org.nl.wms.pm_manage.purchase.service.dto.PurchaseDto; +import org.nl.wms.pm_manage.purchase.service.vo.PurchasemstListVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +@Slf4j +@Service +public class PurchaseServiceImpl extends ServiceImpl implements PurchaseService { + + @Autowired + private PurchasemstMapper purchasemstMapper; + + @Autowired + private PurchasedtlMapper purchasedtlMapper; + + @Autowired + private InboundEasAuditService inboundEasAuditService; + + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + return purchasemstMapper.queryAllByPage( + new Page<>(page.getPage() + 1, page.getSize()), whereJson); + } + + @Override + public PurchaseDto getDetailById(String id) { + Purchasemst mst = purchasemstMapper.selectById(id); + if (ObjectUtil.isEmpty(mst)) { + return null; + } + PurchaseDto dto = BeanUtil.copyProperties(mst, PurchaseDto.class); + List dtlList = purchasedtlMapper.selectList( + new LambdaQueryWrapper() + .eq(Purchasedtl::getBill_id, mst.getBill_id())); + List dtlDtoList = BeanUtil.copyToList(dtlList, PurchaseDto.Purchasedtl.class); + dto.setTableData(dtlDtoList); + return dto; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(PurchaseDto dto) { + Purchasemst existing = purchasemstMapper.selectOne( + new LambdaQueryWrapper() + .eq(Purchasemst::getBill_id, dto.getBill_id())); + if (ObjectUtil.isNotEmpty(existing)) { + throw new BadRequestException("单据编号已存在: " + dto.getBill_id()); + } + + dto.setCreator(SecurityUtils.getCurrentNickName()); + dto.setCreate_time(new Date()); + dto.setModify_date(new Date()); + + Purchasemst mst = BeanUtil.copyProperties(dto, Purchasemst.class); + purchasemstMapper.insert(mst); + + List dtlList = dto.getTableData(); + if (ObjectUtil.isNotEmpty(dtlList)) { + for (PurchaseDto.Purchasedtl dtlDto : dtlList) { + Purchasedtl dtl = BeanUtil.copyProperties(dtlDto, Purchasedtl.class); + dtl.setBill_id(dto.getBill_id()); + purchasedtlMapper.insert(dtl); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(PurchaseDto dto) { + Purchasemst existing = purchasemstMapper.selectById(dto.getId()); + if (ObjectUtil.isEmpty(existing)) { + throw new BadRequestException("单据不存在或已被删除"); + } + + dto.setModify_date(new Date()); + Purchasemst mst = BeanUtil.copyProperties(dto, Purchasemst.class); + purchasemstMapper.updateById(mst); + + purchasedtlMapper.delete( + new LambdaQueryWrapper() + .eq(Purchasedtl::getBill_id, existing.getBill_id())); + + List dtlList = dto.getTableData(); + if (ObjectUtil.isNotEmpty(dtlList)) { + for (PurchaseDto.Purchasedtl dtlDto : dtlList) { + Purchasedtl dtl = BeanUtil.copyProperties(dtlDto, Purchasedtl.class); + dtl.setBill_id(existing.getBill_id()); + purchasedtlMapper.insert(dtl); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Set ids) { + List mstList = purchasemstMapper.selectBatchIds(ids); + for (Purchasemst mst : mstList) { + purchasedtlMapper.delete( + new LambdaQueryWrapper() + .eq(Purchasedtl::getBill_id, mst.getBill_id())); + } + purchasemstMapper.deleteBatchIds(ids); + } + + @Override + public void forceAudit(Set ids) { + List mstList = purchasemstMapper.selectBatchIds(ids); + if (ObjectUtil.isEmpty(mstList)) { + throw new BadRequestException("未找到选中的单据"); + } + for (Purchasemst mst : mstList) { + log.info("强制回传EAS审核, billId: {}, 当前状态: {}", mst.getBill_id(), mst.getBill_status()); + try { + inboundEasAuditService.auditSingleBill(mst); + } catch (Exception e) { + log.error("强制回传EAS审核失败, billId: {}", mst.getBill_id(), e); + } + } + } + + @Override + public List pdaInboundSelectMatInfo(Map whereJson) { + return purchasemstMapper.selectPdaInMat(whereJson); + } + + @Override + public List selectListByBillId(String billId) { + return purchasedtlMapper.selectList( + new QueryWrapper().eq("bill_id", billId) + ); + } + + @Override + public List selectPdaInMat(HashMap of) { + return purchasemstMapper.selectPdaInMat(of); + } +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchasedtlServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchasedtlServiceImpl.java new file mode 100644 index 0000000..0ff9744 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/impl/PurchasedtlServiceImpl.java @@ -0,0 +1,11 @@ +package org.nl.wms.pm_manage.purchase.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.wms.pm_manage.purchase.service.PurchasedtlService; +import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl; +import org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper; +import org.springframework.stereotype.Service; + +@Service +public class PurchasedtlServiceImpl extends ServiceImpl implements PurchasedtlService { +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/vo/PurchasemstListVo.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/vo/PurchasemstListVo.java new file mode 100644 index 0000000..d4d3c24 --- /dev/null +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/pm_manage/purchase/service/vo/PurchasemstListVo.java @@ -0,0 +1,39 @@ +package org.nl.wms.pm_manage.purchase.service.vo; + +import lombok.Data; + +@Data +public class PurchasemstListVo { + + private Long id; + + private String bill_id; + + private String order_no; + + private String order_type; + + private String supplier_code; + + private String supplier_name; + + private String creator; + + private String create_time; + + private String modify_date; + + private Integer status; + + private Integer red; + + private String bill_status; + + private String audit_msg; + + private Integer total_qty; + + private Integer instock_qty; + + private Integer dtl_count; +} diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSEnum.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSEnum.java index f80b110..8e164f1 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSEnum.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/enums/IOSEnum.java @@ -28,7 +28,7 @@ public enum IOSEnum { BILL_STATUS(MapOf.of("生成","10", "分配中", "20", "分配完", "30", "完成", "99")), // 入库业务类型 - BILL_TYPE(MapOf.of("生产入库","0001", "采购入库入库", "0005", "手工入库", "0009","销售出库","1001","生产出库","1005", "手工出库", "1009")), + BILL_TYPE(MapOf.of("生产入库","0001", "采购入库", "0005", "手工入库", "0009","销售出库","1001","生产出库","1005", "手工出库", "1009")), //入库分配明细状态 INBILL_DIS_STATUS(MapOf.of("未生成", "00", "生成", "01", "执行中", "02", "完成", "99")), diff --git a/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java b/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java index c0bad61..7e0b24a 100644 --- a/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java +++ b/nladmin-system/wms-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java @@ -198,10 +198,14 @@ public class InBillServiceImpl extends ServiceImpl i total_qty = total_qty.add(new BigDecimal(qty)); //判断该载具编号是否已经存在库内 - Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, row.get("storagevehicle_code"))); - if (ObjectUtil.isNotEmpty(structattr)) { - throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!"); + String storagevehicleCode = row.get("storagevehicle_code").toString(); + if (!storagevehicleCode.startsWith("VTP")){ + Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, storagevehicleCode)); + if (ObjectUtil.isNotEmpty(structattr)) { + throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!"); + } } + IOStorInvDtl invDtl = ioStorInvDtl.toJavaObject(IOStorInvDtl.class); ioStorInvDtlMapper.insert(invDtl); row_size++; diff --git a/nladmin-system/wms-server/src/main/resources/config/application-dev.yml b/nladmin-system/wms-server/src/main/resources/config/application-dev.yml index ff95e50..5380bf1 100644 --- a/nladmin-system/wms-server/src/main/resources/config/application-dev.yml +++ b/nladmin-system/wms-server/src/main/resources/config/application-dev.yml @@ -7,53 +7,71 @@ spring: allow-circular-references: true datasource: druid: - db-type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:wms_standardv2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false - # url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_oulun}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false - username: ${DB_USER:root} - - password: ${DB_PWD:5XXX/3GEgdUnRZd4cbVnDL6BA6P9YToc} - # 初始连接数 - initial-size: 15 - # 最小连接数 - min-idle: 25 - # 最大连接数 - max-active: 40 - # 是否自动回收超时连接 - remove-abandoned: true - # 超时时间(以秒数为单位) - remove-abandoned-timeout: 180 - # 获取连接超时时间 max-wait: 9000 - # 连接有效性检测时间 - time-between-eviction-runs-millis: 20000 - # 连接在池中最小生存的时间 - min-evictable-idle-time-millis: 300000 - # 连接在池中最大生存的时间 - max-evictable-idle-time-millis: 900000 - # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除 - test-while-idle: true - # 指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个 - test-on-borrow: false - # 是否在归还到池中前进行检验 - test-on-return: false - # 检测连接是否有效 - validation-query: select 1 from dual - # 配置监控统计 - webStatFilter: + web-stat-filter: enabled: true + url-pattern: /* + exclusions: /druid/*,*.js,*.css,*.html + session-stat-enable: true stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: false + login-username: admin # 建议配置登录密码 + login-password: 123456 allow: 127.0.0.1 - filters: - DruidFilter,stat - log-abandoned: false + deny: # 可选:黑名单 keep-alive: true keep-alive-between-time-millis: 20000 + # 连接回收配置 + remove-abandoned: false # ⚠️ 生产环境建议改为 false,你之前的日志也警告了 + remove-abandoned-timeout-millis: 180000 + dynamic: + primary: master + strict: true + datasource: + master: + driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_nlwq}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_standardv2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + username: ${DB_USER:root} + password: ${DB_PWD:123456} + druid: + # 基础连接池配置 + initial-size: 15 + min-idle: 25 + max-active: 40 + max-wait: 9000 + # 连接回收配置 + remove-abandoned: false # ⚠️ 生产环境建议改为 false,你之前的日志也警告了 + remove-abandoned-timeout-millis: 180000 + # 连接检测配置 + time-between-eviction-runs-millis: 20000 + min-evictable-idle-time-millis: 300000 + max-evictable-idle-time-millis: 900000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + validation-query: SELECT 1 # MySQL 用 SELECT 1,Oracle 才用 select 1 from dual + + # 监控统计(连接池层面的监控) + filters: stat,wall # 修正:stat是监控统计,wall是SQL防火墙 + log-abandoned: false + eas: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${EAS_DB_HOST:localhost}:${EAS_DB_PORT:3306}/${EAS_DB_NAME:eas_db}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true + username: ${EAS_DB_USER:root} + password: ${EAS_DB_PWD:123456} + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + test-while-idle: true + validation-query: SELECT 1 # 修正:MySQL 用 SELECT 1 + # 如果 eas 也需要监控,添加下面两行(可选) + filters: stat,wall + log-abandoned: false redis: #数据库索引 database: ${REDIS_DB:1} @@ -138,3 +156,9 @@ sa-token: lucene: index: path: D:\lms\lucene\index +eas: + webservice: + wsdl: http://192.168.100.100:8080/ormrpc/services/WSNLWQFacade?wsdl + namespace: http://ws.eas.kingdee.com/ +inbound: + liku-codes: LK01 \ No newline at end of file diff --git a/nladmin-ui/src/views/wms/st/purchase/AddDialog.vue b/nladmin-ui/src/views/wms/st/purchase/AddDialog.vue new file mode 100644 index 0000000..481cd8d --- /dev/null +++ b/nladmin-ui/src/views/wms/st/purchase/AddDialog.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/purchase/ViewDialog.vue b/nladmin-ui/src/views/wms/st/purchase/ViewDialog.vue new file mode 100644 index 0000000..a4827b7 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/purchase/ViewDialog.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/purchase/index.vue b/nladmin-ui/src/views/wms/st/purchase/index.vue new file mode 100644 index 0000000..9e2703f --- /dev/null +++ b/nladmin-ui/src/views/wms/st/purchase/index.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/purchase/purchase.js b/nladmin-ui/src/views/wms/st/purchase/purchase.js new file mode 100644 index 0000000..42df952 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/purchase/purchase.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/purchasemst', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/purchasemst', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: '/api/purchasemst', + method: 'put', + data + }) +} + +export function get(id) { + return request({ + url: '/api/purchasemst/' + id, + method: 'get' + }) +} + +export function forceAudit(data) { + return request({ + url: '/api/purchasemst/forceAudit', + method: 'put', + data + }) +} + +export default { add, edit, del, get, forceAudit } diff --git a/pda/pda/src/utils/request.js b/pda/pda/src/utils/request.js index a500101..282e7cb 100644 --- a/pda/pda/src/utils/request.js +++ b/pda/pda/src/utils/request.js @@ -1,5 +1,26 @@ import axios from 'axios' -import { showToast } from 'vant' +import { showToast, showLoadingToast, closeToast } from 'vant' + +let loadingCount = 0 + +function showLoading() { + if (loadingCount === 0) { + showLoadingToast({ + message: '加载中...', + forbidClick: true, + duration: 0, + }) + } + loadingCount++ +} + +function hideLoading() { + loadingCount-- + if (loadingCount <= 0) { + loadingCount = 0 + closeToast() + } +} const request = axios.create({ baseURL: '', @@ -8,17 +29,22 @@ const request = axios.create({ request.interceptors.request.use( (config) => { + showLoading() const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = `Bearer ${token}` } return config }, - (error) => Promise.reject(error), + (error) => { + hideLoading() + return Promise.reject(error) + }, ) request.interceptors.response.use( (response) => { + hideLoading() const res = response.data if (res.success === false) { showToast({ message: res.message || '请求失败', type: 'fail' }) @@ -27,6 +53,7 @@ request.interceptors.response.use( return res }, (error) => { + hideLoading() const msg = error.response?.data?.message || error.message || '网络异常' showToast({ message: msg, type: 'fail' }) if (error.response?.status === 401) { diff --git a/sql/eas_db.sql b/sql/eas_db.sql new file mode 100644 index 0000000..2a7829d --- /dev/null +++ b/sql/eas_db.sql @@ -0,0 +1,68 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 + Source Server Type : MySQL + Source Server Version : 80012 + Source Host : localhost:3306 + Source Schema : eas_db + + Target Server Type : MySQL + Target Server Version : 80012 + File Encoding : 65001 + + Date: 13/06/2026 13:25:09 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for v_uc_cgrk06 +-- ---------------------------- +DROP TABLE IF EXISTS `v_uc_cgrk06`; +CREATE TABLE `v_uc_cgrk06` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `orderNo` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单号', + `orderType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '单据类型', + `supplierCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '供应商编码', + `supplierName` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '供应商名称', + `creator` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '操作人', + `createTime` datetime(0) NOT NULL COMMENT '单据日期', + `modifyDate` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '修改时间', + `billid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '单据id', + `status` int(11) NOT NULL DEFAULT 0 COMMENT '单据状态 (0-草稿,1-已提交,2-已审核,3-已作废)', + `red` int(11) NOT NULL DEFAULT 0 COMMENT '红蓝字 (0-蓝字,1-红字)', + `entryid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分录id', + `itemNo` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '行号', + `categoryCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '品类编码', + `categoryName` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '品类名称', + `skuCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '物料编码', + `skuName` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '物料名称', + `model` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物料规格', + `houseCode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '仓库号', + `batchNo` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '批次号', + `qty` decimal(18, 4) NOT NULL DEFAULT 0.0000 COMMENT '数量', + `unitCode` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '单位编码', + `unit` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '单位', + `trackNo` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跟踪号', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_bill_entry`(`billid`, `entryid`) USING BTREE, + INDEX `idx_orderNo`(`orderNo`) USING BTREE, + INDEX `idx_supplierCode`(`supplierCode`) USING BTREE, + INDEX `idx_skuCode`(`skuCode`) USING BTREE, + INDEX `idx_createTime`(`createTime`) USING BTREE, + INDEX `idx_batchNo`(`batchNo`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单明细表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of v_uc_cgrk06 +-- ---------------------------- +INSERT INTO `v_uc_cgrk06` VALUES (1, 'PO20240001', '采购订单', 'SUP001', '宏达电子有限公司', '张三', '2024-03-15 09:30:00', '2024-03-15 14:20:00', 'BILL20240001', 0, 0, 'ENT001', '1', 'CAT01', '电子元件', 'SKU1001', '贴片电阻', '10kΩ ±1% 0603', 'WH001', 'B202403001', 5000.0000, 'PCS', '个', 'TRK240315001'); +INSERT INTO `v_uc_cgrk06` VALUES (2, 'PO20240001', '采购订单', 'SUP001', '宏达电子有限公司', '张三', '2024-03-15 09:30:00', '2024-03-15 14:20:00', 'BILL20240001', 0, 0, 'ENT002', '2', 'CAT01', '电子元件', 'SKU1002', '贴片电容', '10µF 16V X5R 0805', 'WH001', 'B202403002', 3000.0000, 'PCS', '个', 'TRK240315001'); +INSERT INTO `v_uc_cgrk06` VALUES (3, 'PO20240002', '采购订单', 'SUP002', '宏达电子有限公司', '李四', '2024-03-16 10:15:00', '2024-03-16 16:45:00', 'BILL20240002', 0, 0, 'ENT003', '1', 'CAT02', '五金工具', 'SKU2001', '十字螺丝刀', 'PH2 × 100mm', 'WH002', 'B202403005', 100.0000, 'PC', '把', 'TRK240316002'); +INSERT INTO `v_uc_cgrk06` VALUES (4, 'PO20240003', '采购退单', 'SUP003', '华威精密机械', '王芳', '2024-03-18 14:00:00', '2024-03-19 09:10:00', 'BILL20240003', 0, 1, 'ENT004', '1', 'CAT03', '机械配件', 'SKU3001', '轴承', '6204ZZ', 'WH003', 'B202402100', -50.0000, 'PCS', '个', 'TRK240318003'); +INSERT INTO `v_uc_cgrk06` VALUES (5, 'PO20240004', '采购订单', 'SUP004', '宏达电子有限公司', '赵明', '2024-03-20 11:20:00', '2024-03-20 11:20:00', 'BILL20240004', 0, 0, 'ENT005', '1', 'CAT04', '包装材料', 'SKU4001', '瓦楞纸箱', '400×300×200mm', 'WH004', NULL, 200.0000, 'PCS', '个', NULL); +INSERT INTO `v_uc_cgrk06` VALUES (6, 'PO20240005', '采购订单', 'SUP005', '长江化工', '孙丽', '2024-03-22 08:45:00', '2024-03-23 10:30:00', 'BILL20240005', 0, 0, 'ENT006', '1', 'CAT05', '化工原料', 'SKU5001', '工业酒精', '95% 工业级', 'WH005', 'B202403010', 150.0000, 'L', '升', 'TRK240322005'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/zyf.sql b/sql/zyf.sql index 7f58e1f..92216c8 100644 --- a/sql/zyf.sql +++ b/sql/zyf.sql @@ -27,10 +27,10 @@ CREATE TABLE IF NOT EXISTS `st_ivt_purchasedtl` ( `model` VARCHAR(255) DEFAULT NULL COMMENT '物料规格', `house_code` VARCHAR(64) NOT NULL COMMENT '仓库号', `batch_no` VARCHAR(64) DEFAULT NULL COMMENT '批次号', - `qty` INT NOT NULL COMMENT '数量', + `qty` DECIMAL(18,6) NOT NULL COMMENT '数量', `unit_code` VARCHAR(32) NOT NULL COMMENT '单位编码', `unit` VARCHAR(32) NOT NULL COMMENT '单位', `track_no` VARCHAR(64) DEFAULT NULL COMMENT '跟踪号', - `instock_qty` INT DEFAULT 0 COMMENT '已入库数量' + `instock_qty` DECIMAL(18,6) DEFAULT 0 COMMENT '已入库数量' )COMMENT='采购入库单分录信息表';