add:PDA组盘、PDA入库、采购入库单

add:多数据源配置
This commit is contained in:
zhaoyf
2026-06-13 13:33:52 +08:00
parent bf66aae879
commit 20aebd4888
56 changed files with 2989 additions and 47 deletions

View File

@@ -236,6 +236,11 @@
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>

View File

@@ -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 {
}

View File

@@ -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;
/**
* <p>
@@ -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<String, DataSource> dataSources = ds.getDataSources();
for (Map.Entry<String, DataSource> 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);
}

View File

@@ -361,7 +361,10 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
.eq("is_used", true)
.eq("lock_type",IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("sect_code", param.getSect_code())
.isNull("storagevehicle_code");
;
if(!param.getStoragevehicle_code().startsWith("VTP")){//虚拟托盘不验证空位
query.isNull("storagevehicle_code");
}
List<Structattr> list = this.list(query);
for (String decisionerType : strategy) {
Decisioner decisioner = decisionerMap.get(decisionerType);

View File

@@ -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<Object> 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);
}
}

View File

@@ -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<Object> 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);
}
}

View File

@@ -0,0 +1,8 @@
package org.nl.wms.ext_manage.purchase.service;
import com.alibaba.fastjson.JSONObject;
public interface EasToWmsService {
JSONObject receivePurchaseBill(String billId);
}

View File

@@ -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);
}

View File

@@ -0,0 +1,8 @@
package org.nl.wms.ext_manage.purchase.service;
import com.alibaba.fastjson.JSONObject;
public interface InboundEasSyncService {
JSONObject syncPurchaseBill(String billId);
}

View File

@@ -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);
}

View File

@@ -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<EasAuditEntryDto> entrys;
}
@Data
public static class EasAuditEntryDto implements Serializable {
private static final long serialVersionUID = 1L;
private Integer seq;
private BigDecimal qty;
private String entryId;
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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<Purchasemst> billList = purchasemstMapper.selectList(
new QueryWrapper<Purchasemst>()
.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<Purchasemst>()
.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<Purchasedtl> dtlList = purchasedtlMapper.selectList(
new QueryWrapper<Purchasedtl>().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<EasAuditRequestDto.EasAuditEntryDto> 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<Purchasemst> updateWrapper = new LambdaUpdateWrapper<Purchasemst>()
.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<Purchasemst>()
.eq(Purchasemst::getBill_id, mst.getBill_id())
.set(Purchasemst::getBill_status, PurchaseBillStatus.AUDIT_FAIL.getCode())
.set(Purchasemst::getAudit_msg, "调用EAS审核接口异常: "));
}
}
}

View File

@@ -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<Purchasemst> list = easPurchasemstMapper.selectByBillId(billId);
return list != null && !list.isEmpty() ? list.get(0) : null;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public List<Purchasedtl> queryDtlList(String billId) {
log.info("从EAS数据源查询采购入库明细, billId: {}", billId);
return easPurchasedtlMapper.selectByBillId(billId);
}
}

View File

@@ -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<Purchasedtl> 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;
}
}

View File

@@ -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<Purchasedtl> dtlList = purchasedtlMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<Purchasedtl>()
.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<Purchasemst> wrapper = new LambdaUpdateWrapper<Purchasemst>()
.eq(Purchasemst::getBill_id, billId)
.set(Purchasemst::getBill_status, status.getCode());
purchasemstMapper.update(null, wrapper);
}
}

View File

@@ -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<Purchasedtl> {
List<Purchasedtl> selectByBillId(@Param("bill_id") String billId);
}

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.ext_manage.purchase.service.mapper.EasPurchasedtlMapper">
<resultMap id="BaseResultMap" type="org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl">
<id column="entryid" property="entry_id" />
<result column="billid" property="bill_id" />
<result column="itemNo" property="item_no" />
<result column="categoryCode" property="category_code" />
<result column="categoryName" property="category_name" />
<result column="skuCode" property="sku_code" />
<result column="skuName" property="sku_name" />
<result column="model" property="model" />
<result column="houseCode" property="house_code" />
<result column="batchNo" property="batch_no" />
<result column="qty" property="qty" />
<result column="unitCode" property="unit_code" />
<result column="unit" property="unit" />
<result column="trackNo" property="track_no" />
</resultMap>
<select id="selectByBillId" resultType="org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl" resultMap="BaseResultMap">
SELECT
entryid,
billid,
itemNo,
categoryCode,
categoryName,
skuCode,
skuName,
model,
houseCode,
batchNo,
qty,
unitCode,
unit,
trackNo
FROM V_UC_CGRK06
WHERE billid = #{bill_id}
</select>
</mapper>

View File

@@ -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<Purchasemst> {
List<Purchasemst> selectByBillId(@Param("bill_id") String billId);
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.ext_manage.purchase.service.mapper.EasPurchasemstMapper">
<resultMap id="BaseResultMap" type="org.nl.wms.pm_manage.purchase.service.dao.Purchasemst">
<result column="billid" property="bill_id" />
<result column="orderNo" property="order_no" />
<result column="orderType" property="order_type" />
<result column="supplierCode" property="supplier_code" />
<result column="supplierName" property="supplier_name" />
<result column="creator" property="creator" />
<result column="createTime" property="create_time" />
<result column="modifyDate" property="modify_date" />
<result column="status" property="status" />
<result column="red" property="red" />
</resultMap>
<select id="selectByBillId" resultType="org.nl.wms.pm_manage.purchase.service.dao.Purchasemst" resultMap="BaseResultMap">
SELECT
billid,
orderNo,
orderType,
supplierCode,
supplierName,
creator,
createTime,
modifyDate,
status,
red
FROM V_UC_CGRK06
WHERE billid = #{bill_id}
GROUP BY billid
</select>
</mapper>

View File

@@ -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<PurchaseMatInfoVo> 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<Object> queryUnfinishedBills() {
List<JSONObject> list = inboundPdaService.queryUnfinishedBills();
return new ResponseEntity<>(list, HttpStatus.OK);
}
}

View File

@@ -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<JSONObject> queryUnfinishedBills();
JSONObject submitGroupPlate(PdaGroupPlateDto dto);
List<PurchaseMatInfoVo> getInfoByCode(String code);
void usualInbound(UsualInboundDto usualInboundDto);
void submitGroupPlateInbound(GroupPlateInboundDto dto, Boolean subTask);
void submitManualInbound(ManualInboundDto dto);
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<GroupPlateDtlDto> 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;
}
}

View File

@@ -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<UsualInboundDto.UsualInboundDtlDto> 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;
}
}

View File

@@ -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<JSONObject> queryUnfinishedBills() {
List<Purchasemst> list = purchaseService.list(
new QueryWrapper<Purchasemst>()
.ne("bill_status", PurchaseBillStatus.COMPLETED.getCode())
.ne("bill_status", PurchaseBillStatus.AUDIT_SUCCESS.getCode())
.ne("bill_status", PurchaseBillStatus.AUDIT_FAIL.getCode())
);
List<JSONObject> 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<Purchasedtl> 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<PdaGroupPlateDto.GroupPlateDtlDto> detailList = dto.getDetailList();
detailList.forEach((item)->{
List<PurchaseMatInfoVo> 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<GroupPlate>()
.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<Structattr>()
.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<PurchaseMatInfoVo> getInfoByCode(String code) {
if (StrUtil.isEmptyIfStr(code)){
throw new BadRequestException("获取单据失败:参数为空");
}
Map<String, Object> parseMap = parseCode(code);
List<PurchaseMatInfoVo> 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<Structattr> 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<PurchaseListenerParams.DetailItem> 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<GroupPlate> plateDaoList = iMdPbGroupplateService.list(
new QueryWrapper<GroupPlate>().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<String, Object> 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<HashMap> tableData = new ArrayList<>();
HashMap<String, String> 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<String, Object> 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<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, iostorinv_id)
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> 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<PurchaseListenerParams.DetailItem> detailItemList = new ArrayList<>();
detailItemList.add(detailItem);
listenerParams.setDetailItem(detailItemList);
pushEvent(listenerParams);
}
@Override
public void submitManualInbound(ManualInboundDto dto) {
// 查询组盘明细
List<GroupPlate> plateDaoList = iMdPbGroupplateService.list(
new QueryWrapper<GroupPlate>().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<String, Object> 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<HashMap> tableData = new ArrayList<>();
HashMap<String, String> 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<String, Object> 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<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, iostorinv_id)
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id", dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> 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<String,Object> 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<String, Object> jsonMst = new HashMap<>();
jsonMst.put("point_code", whereJson.getString("point_code"));
// 组织明细数据
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
new QueryWrapper<IOStorInvDtl>().lambda()
.eq(IOStorInvDtl::getIostorinv_id, whereJson.getString("iostorinv_id"))
);
// 查找分配明细
Map<String, Object> map = new HashMap<>();
map.put("iostorinvdtl_id",dtlDao.getIostorinvdtl_id());
List<IOStorInvDisDto> disDtl = iRawAssistIStorService.getDisDtl(map);
// 类型转换
ArrayList<LinkedHashMap> 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);
}
}
}

View File

@@ -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;
}

View File

@@ -12,6 +12,7 @@ import org.nl.common.exception.BadRequestException;
@Getter
public enum SourceBillTypeEnum {
PM_DEMADN("pm_demand","出库需求单"),
PM_PURCHASE("pm_purchase","采购入库单"),
UNDEFINE("","未定义"),
;
/**

View File

@@ -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<PurchaseListenerParams> {
@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<EasAuditRequestDto.EasAuditEntryDto> entryList = new ArrayList<>();
Purchasemst purchasemst = purchaseService.getOne(new LambdaQueryWrapper<Purchasemst>()
.eq(Purchasemst::getBill_id, params.getBillId()));
for (PurchaseListenerParams.DetailItem item : params.getDetailItem()) {
Purchasedtl purchasedtl = purchasedtlService.getOne(new LambdaQueryWrapper<Purchasedtl>()
.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<Purchasedtl> list = purchasedtlService.list(new LambdaQueryWrapper<Purchasedtl>()
.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);
}
}
}

View File

@@ -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> detailItem;
@Data
public static class DetailItem {
private String item_no;
private BigDecimal qty;
private String materialCode;
}
}

View File

@@ -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<Object> query(@RequestParam Map whereJson, PageQuery page) {
return new ResponseEntity<>(TableDataInfo.build(purchaseService.queryAll(whereJson, page)), HttpStatus.OK);
}
@GetMapping("/{id}")
@Log("查询采购入库单详情")
public ResponseEntity<Object> getById(@PathVariable String id) {
PurchaseDto dto = purchaseService.getDetailById(id);
return new ResponseEntity<>(dto, HttpStatus.OK);
}
@PostMapping
@Log("新增采购入库单")
public ResponseEntity<Object> create(@Validated @RequestBody PurchaseDto dto) {
purchaseService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改采购入库单")
public ResponseEntity<Object> update(@Validated @RequestBody PurchaseDto dto) {
purchaseService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@DeleteMapping
@Log("删除采购入库单")
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
purchaseService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PutMapping("/forceAudit")
@Log("强制回传EAS审核")
public ResponseEntity<Object> forceAudit(@RequestBody Set<String> ids) {
purchaseService.forceAudit(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -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<Purchasemst> {
IPage<PurchasemstListVo> queryAll(Map whereJson, PageQuery page);
PurchaseDto getDetailById(String id);
void create(PurchaseDto dto);
void update(PurchaseDto dto);
void deleteAll(Set<String> ids);
void forceAudit(Set<String> ids);
List<PurchaseMatInfoVo> pdaInboundSelectMatInfo(Map whereJson);
List<Purchasedtl> selectListByBillId(String billId);
List<PurchaseMatInfoVo> selectPdaInMat(HashMap of);
}

View File

@@ -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<Purchasedtl> {
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<Purchasedtl> {
}

View File

@@ -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<Purchasemst> {
IPage<PurchasemstListVo> queryAllByPage(Page<PurchasemstListVo> page, @Param("params") Map params);
List<PurchaseMatInfoVo> selectPdaInMat(@Param("param") Map whereJson);
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasedtlMapper">
</mapper>

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.pm_manage.purchase.service.dao.mapper.PurchasemstMapper">
<select id="queryAllByPage" resultType="org.nl.wms.pm_manage.purchase.service.vo.PurchasemstListVo">
SELECT
m.id,
m.bill_id,
m.order_no,
m.order_type,
m.supplier_code,
m.supplier_name,
m.creator,
m.create_time,
m.modify_date,
m.status,
m.red,
m.bill_status,
m.audit_msg,
(SELECT COUNT(1) FROM st_ivt_purchasedtl d WHERE d.bill_id = m.bill_id) AS dtl_count,
sum(d.qty) AS total_qty,
sum(d.instock_qty) AS instock_qty
FROM st_ivt_purchasemst m
LEFT JOIN st_ivt_purchasedtl d on d.bill_id = m.bill_id
<where>
1=1
<if test="params.bill_id != null and params.bill_id != ''">
AND m.bill_id LIKE CONCAT('%', #{params.bill_id}, '%')
</if>
<if test="params.order_no != null and params.order_no != ''">
AND m.order_no LIKE CONCAT('%', #{params.order_no}, '%')
</if>
<if test="params.order_type != null and params.order_type != ''">
AND m.order_type = #{params.order_type}
</if>
<if test="params.supplier_code != null and params.supplier_code != ''">
AND m.supplier_code LIKE CONCAT('%', #{params.supplier_code}, '%')
</if>
<if test="params.supplier_name != null and params.supplier_name != ''">
AND m.supplier_name LIKE CONCAT('%', #{params.supplier_name}, '%')
</if>
<if test="params.bill_status != null and params.bill_status != ''">
AND m.bill_status = #{params.bill_status}
</if>
<if test="params.status != null">
AND m.status = #{params.status}
</if>
<if test="params.blurry != null and params.blurry != ''">
AND (m.bill_id LIKE CONCAT('%', #{params.blurry}, '%')
OR m.order_no LIKE CONCAT('%', #{params.blurry}, '%')
OR m.supplier_name LIKE CONCAT('%', #{params.blurry}, '%'))
</if>
<if test="params.createTime != null and params.createTime.length == 2">
AND m.create_time &gt;= #{params.createTime[0]}
AND m.create_time &lt;= #{params.createTime[1]}
</if>
</where>
GROUP BY m.bill_id
ORDER BY m.create_time DESC
</select>
<select id="selectPdaInMat" resultType="org.nl.wms.pda_manage.ios_manage.purchase.service.vo.PurchaseMatInfoVo">
SELECT
m.bill_id,
m.order_no,
d.item_no,
d.category_code,
d.category_name,
d.house_code sect_code,
d.batch_no,
d.sku_code,
d.sku_name,
d.qty,
d.instock_qty
FROM st_ivt_purchasemst m
LEFT JOIN st_ivt_purchasedtl d ON m.bill_id = d.bill_id
WHERE 1=1
AND m.order_no = #{param.orderNo}
AND d.sku_code = #{param.materialCode}
AND m.status = 0
ORDER BY m.create_time DESC, d.item_no ASC
</select>
</mapper>

View File

@@ -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<Purchasedtl> 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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<PurchasemstMapper, Purchasemst> implements PurchaseService {
@Autowired
private PurchasemstMapper purchasemstMapper;
@Autowired
private PurchasedtlMapper purchasedtlMapper;
@Autowired
private InboundEasAuditService inboundEasAuditService;
@Override
public IPage<PurchasemstListVo> 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<Purchasedtl> dtlList = purchasedtlMapper.selectList(
new LambdaQueryWrapper<Purchasedtl>()
.eq(Purchasedtl::getBill_id, mst.getBill_id()));
List<PurchaseDto.Purchasedtl> 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<Purchasemst>()
.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<PurchaseDto.Purchasedtl> 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<Purchasedtl>()
.eq(Purchasedtl::getBill_id, existing.getBill_id()));
List<PurchaseDto.Purchasedtl> 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<String> ids) {
List<Purchasemst> mstList = purchasemstMapper.selectBatchIds(ids);
for (Purchasemst mst : mstList) {
purchasedtlMapper.delete(
new LambdaQueryWrapper<Purchasedtl>()
.eq(Purchasedtl::getBill_id, mst.getBill_id()));
}
purchasemstMapper.deleteBatchIds(ids);
}
@Override
public void forceAudit(Set<String> ids) {
List<Purchasemst> 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<PurchaseMatInfoVo> pdaInboundSelectMatInfo(Map whereJson) {
return purchasemstMapper.selectPdaInMat(whereJson);
}
@Override
public List<Purchasedtl> selectListByBillId(String billId) {
return purchasedtlMapper.selectList(
new QueryWrapper<Purchasedtl>().eq("bill_id", billId)
);
}
@Override
public List<PurchaseMatInfoVo> selectPdaInMat(HashMap of) {
return purchasemstMapper.selectPdaInMat(of);
}
}

View File

@@ -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<PurchasedtlMapper, Purchasedtl> implements PurchasedtlService {
}

View File

@@ -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;
}

View File

@@ -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")),

View File

@@ -198,10 +198,14 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> 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++;

View File

@@ -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 1Oracle 才用 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