add:PDA组盘、PDA入库、采购入库单
add:多数据源配置
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package org.nl.wms.ext_manage.purchase.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface EasToWmsService {
|
||||
|
||||
JSONObject receivePurchaseBill(String billId);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package org.nl.wms.ext_manage.purchase.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
public interface InboundEasSyncService {
|
||||
|
||||
JSONObject syncPurchaseBill(String billId);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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审核接口异常: "));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import org.nl.common.exception.BadRequestException;
|
||||
@Getter
|
||||
public enum SourceBillTypeEnum {
|
||||
PM_DEMADN("pm_demand","出库需求单"),
|
||||
PM_PURCHASE("pm_purchase","采购入库单"),
|
||||
UNDEFINE("","未定义"),
|
||||
;
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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> {
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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> {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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 >= #{params.createTime[0]}
|
||||
AND m.create_time <= #{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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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")),
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user