Compare commits

...

3 Commits

Author SHA1 Message Date
zgw
e004148f19 同步 2026-07-10 16:07:21 +08:00
zgw
a854f24ac4 同步 2026-06-17 17:41:06 +08:00
zgw
fffc968134 优化页面 2026-01-08 11:00:21 +08:00
56 changed files with 3001 additions and 389 deletions

6
package-lock.json generated Normal file
View File

@@ -0,0 +1,6 @@
{
"name": "FT542-WMS",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}

17
pom.xml
View File

@@ -13,6 +13,7 @@
<description>若依管理系统</description>
<properties>
<lombok.version>1.18.36</lombok.version>
<ruoyi.version>3.9.0</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -46,6 +47,13 @@
<dependencyManagement>
<dependencies>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -251,12 +259,19 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<version>3.11.0</version>
<configuration>
<parameters>true</parameters>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>

View File

@@ -19,4 +19,36 @@ public class CustomMessage {
private String type;
private List<HashMap<String, String>> files;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getConversationId() {
return conversationId;
}
public void setConversationId(String conversationId) {
this.conversationId = conversationId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<HashMap<String, String>> getFiles() {
return files;
}
public void setFiles(List<HashMap<String, String>> files) {
this.files = files;
}
}

View File

@@ -17,7 +17,6 @@ public class BasStockToolService {
@Autowired
private IBasStockService basStockService;
@Tool(description = "根据仓库id查询库存信息")
public List<BasStock> getStockInfo(@ToolParam(required = true, description = "仓库id") String warehouseId) {
BasStock basStock = new BasStock();
@@ -28,13 +27,11 @@ public class BasStockToolService {
@Tool(description = "根据库存id生成作业")
public String createMydoJob(@ToolParam(required = true, description = "库存id") String stockId) {
log.info("库存:{},已生成作业",stockId);
return null;
}
@Tool(description = "根据单据状态查询单据")
public String selectInStockInfo(@ToolParam(required = true, description = "单据状态") String status) {
log.info("根据单据状态查询单据:{},已生成作业",status);
return null;
}

View File

@@ -7,6 +7,7 @@ import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
/**
@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.*;
*/
@RestController
@RequestMapping("/api2erp")
@Component("erpTask")
public class ToErpApiController {
@Autowired

View File

@@ -17,4 +17,56 @@ public class RequestEnter {
private String warehouseId;
private String roadwayId;
//小车所在层
private Integer[] assignableLayer;
public String getTrayCode() {
return trayCode;
}
public void setTrayCode(String trayCode) {
this.trayCode = trayCode;
}
public String getEntranceId() {
return entranceId;
}
public void setEntranceId(String entranceId) {
this.entranceId = entranceId;
}
public String getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(String warehouseId) {
this.warehouseId = warehouseId;
}
public String getRoadwayId() {
return roadwayId;
}
public void setRoadwayId(String roadwayId) {
this.roadwayId = roadwayId;
}
public Integer[] getAssignableLayer() {
return assignableLayer;
}
public void setAssignableLayer(Integer[] assignableLayer) {
this.assignableLayer = assignableLayer;
}
@Override
public String toString() {
return "RequestEnter{" +
"trayCode='" + trayCode + '\'' +
", entranceId='" + entranceId + '\'' +
", warehouseId='" + warehouseId + '\'' +
", roadwayId='" + roadwayId + '\'' +
'}';
}
}

View File

@@ -16,13 +16,56 @@ public class AspRequestParam {
private List<DataInfo> datas;
public String getSession() {
return session;
}
public void setSession(String session) {
this.session = session;
}
public String getCmdkey() {
return cmdkey;
}
public void setCmdkey(String cmdkey) {
this.cmdkey = cmdkey;
}
public List<DataInfo> getDatas() {
return datas;
}
public void setDatas(List<DataInfo> datas) {
this.datas = datas;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class DataInfo{
private String id;
private Object val;
public DataInfo(String id, Object val) {
this.id = id;
this.val = val;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object getVal() {
return val;
}
public void setVal(Object val) {
this.val = val;
}
}
}

View File

@@ -5,4 +5,12 @@ import lombok.Data;
@Data
public class AspResponse {
private Body body;
public Body getBody() {
return body;
}
public void setBody(Body body) {
this.body = body;
}
}

View File

@@ -3,9 +3,6 @@ package com.ruoyi.api.domain.erp;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* ERP入库回传请求参数
*/
@@ -40,7 +37,7 @@ public class ErpInStockinConfirmRequest {
* 入库明细
*/
@JsonProperty("KuinList")
private List<ErpInStockinDetailConfirmRequest> kuinList;
private String kuinList;
/**
* 客户名称

View File

@@ -18,4 +18,84 @@ public class ErpSupplierParam {
private String url;
private int page_size;
private int page_index;
public String getMyuserid() {
return myuserid;
}
public void setMyuserid(String myuserid) {
this.myuserid = myuserid;
}
public String getFl() {
return fl;
}
public void setFl(String fl) {
this.fl = fl;
}
public String getJb() {
return jb;
}
public void setJb(String jb) {
this.jb = jb;
}
public String getHy() {
return hy;
}
public void setHy(String hy) {
this.hy = hy;
}
public String getGysname() {
return gysname;
}
public void setGysname(String gysname) {
this.gysname = gysname;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getPage_size() {
return page_size;
}
public void setPage_size(int page_size) {
this.page_size = page_size;
}
public int getPage_index() {
return page_index;
}
public void setPage_index(int page_index) {
this.page_index = page_index;
}
}

View File

@@ -13,12 +13,39 @@ public class LoginParam {
private List<ErpUserDataInfo> datas;
public List<ErpUserDataInfo> getDatas() {
return datas;
}
public void setDatas(List<ErpUserDataInfo> datas) {
this.datas = datas;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ErpUserDataInfo {
private String id;
private String val;
public ErpUserDataInfo(String id, String val) {
this.id = id;
this.val = val;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
}
}

View File

@@ -7,7 +7,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
@@ -21,7 +20,7 @@ public class ReceiveOutStockConfirm {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date5;
private List<Kuout> kuoutList;
private String kuoutList;
@JsonProperty("!B__SysCusmf_0_62001_511_0")
private String sysCusmfField511;

View File

@@ -35,4 +35,21 @@ public interface JobStatisticsMapper {
*/
public List<Map<String, Object>> selectMonthlyStatistics(@Param("year") int year, @Param("month") int month);
/**
* 查询指定日期范围内的每日入库出库统计
*
* @param startDate 开始日期 (yyyy-MM-dd)
* @param endDate 结束日期 (yyyy-MM-dd)
* @return 统计列表
*/
public List<Map<String, Object>> selectDateRangeStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);
/**
* 查询当成年每月入库出库统计
*
* @param year 年份
* @return 每月统计列表
*/
public List<Map<String, Object>> selectYearlyStatistics(@Param("year") int year);
}

View File

@@ -4,8 +4,8 @@ import com.ruoyi.api.service.IStockScreenService;
import com.ruoyi.bas.cargoSpace.mapper.BasCargoSpaceMapper;
import com.ruoyi.stock.stock.domain.BasStock;
import com.ruoyi.stock.stock.service.IBasStockService;
import com.ruoyi.api.mapper.JobStatisticsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@@ -13,6 +13,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class StockScreenServiceImpl implements IStockScreenService {
@@ -22,7 +23,7 @@ public class StockScreenServiceImpl implements IStockScreenService {
@Autowired
private BasCargoSpaceMapper basCargoSpaceMapper;
@Autowired
private JdbcTemplate jdbcTemplate;
private JobStatisticsMapper jobStatisticsMapper;
@Override
public Map<String, Object> getAllStocksWithTotal() {
@@ -79,28 +80,54 @@ public class StockScreenServiceImpl implements IStockScreenService {
public Map<String, Object> getInOutSummary() {
java.time.LocalDate now = java.time.LocalDate.now();
java.time.format.DateTimeFormatter dFmt = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd");
java.time.format.DateTimeFormatter mFmt = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM");
String todayPrefix = now.format(dFmt);
int dIn = countLike("in_stockin_finish", todayPrefix);
int dOut = countLike("out_stockout_finish", todayPrefix);
int dIn = jobStatisticsMapper.selectDailyInCount(todayPrefix);
int dOut = jobStatisticsMapper.selectDailyOutCount(todayPrefix);
java.time.LocalDate monday = now.with(java.time.DayOfWeek.MONDAY);
java.time.LocalDate sunday = monday.plusDays(6);
String startWeek = monday.format(dFmt);
String endWeek = sunday.format(dFmt);
List<Map<String, Object>> rangeStats = jobStatisticsMapper.selectDateRangeStatistics(startWeek, endWeek);
Map<String, Map<String, Object>> statsMap = rangeStats.stream()
.collect(Collectors.toMap(m -> String.valueOf(m.get("date")), m -> m, (k1, k2) -> k1));
List<Integer> wkIn = new ArrayList<>();
List<Integer> wkOut = new ArrayList<>();
for (int i = 0; i < 7; i++) {
java.time.LocalDate day = monday.plusDays(i);
String p = day.format(dFmt);
wkIn.add(countLike("in_stockin_finish", p));
wkOut.add(countLike("out_stockout_finish", p));
Map<String, Object> stat = statsMap.get(p);
if (stat != null) {
wkIn.add(parseInt(stat.get("inCount")));
wkOut.add(parseInt(stat.get("outCount")));
} else {
wkIn.add(0);
wkOut.add(0);
}
}
int year = now.getYear();
List<Map<String, Object>> yearStats = jobStatisticsMapper.selectYearlyStatistics(year);
Map<Integer, Map<String, Object>> yearStatsMap = new HashMap<>();
for (Map<String, Object> m : yearStats) {
Object monthObj = m.get("month");
if (monthObj != null) {
yearStatsMap.put(Integer.parseInt(String.valueOf(monthObj)), m);
}
}
List<Map<String, Object>> monthStat = new ArrayList<>();
for (int m = 1; m <= 12; m++) {
java.time.LocalDate mm = java.time.LocalDate.of(year, m, 1);
String mp = mm.format(mFmt);
int mi = countLikeMonth("in_stockin_finish", mp);
int mo = countLikeMonth("out_stockout_finish", mp);
Map<String, Object> stat = yearStatsMap.get(m);
int mi = 0;
int mo = 0;
if (stat != null) {
mi = parseInt(stat.get("inCount"));
mo = parseInt(stat.get("outCount"));
}
Map<String, Object> item = new HashMap<>();
item.put("mouth", String.valueOf(m));
item.put("入库", mi);
@@ -117,20 +144,12 @@ public class StockScreenServiceImpl implements IStockScreenService {
return res;
}
private int countLike(String table, String dayPrefix) {
private int parseInt(Object obj) {
if (obj == null) return 0;
if (obj instanceof Number) return ((Number) obj).intValue();
try {
Integer c = jdbcTemplate.queryForObject("SELECT COUNT(1) FROM " + table + " WHERE create_date LIKE ?", Integer.class, dayPrefix + "%");
return c == null ? 0 : c;
} catch (Exception e) {
return 0;
}
}
private int countLikeMonth(String table, String monthPrefix) {
try {
Integer c = jdbcTemplate.queryForObject("SELECT COUNT(1) FROM " + table + " WHERE create_date LIKE ?", Integer.class, monthPrefix + "%");
return c == null ? 0 : c;
} catch (Exception e) {
return Integer.parseInt(obj.toString());
} catch (NumberFormatException e) {
return 0;
}
}

View File

@@ -174,7 +174,7 @@ public class ToErpServiceImpl implements IToErpService {
erpCustomerParam.setSession(login());
erpCustomerParam.setCmdkey("refresh");
List<AspRequestParam.DataInfo> dataInfoList = new ArrayList<>();
dataInfoList.add(new AspRequestParam.DataInfo("pagesize", 100000));
dataInfoList.add(new AspRequestParam.DataInfo("pagesize", 10000000));
dataInfoList.add(new AspRequestParam.DataInfo("pageindex", 1));
dataInfoList.add(new AspRequestParam.DataInfo("idProductClass", "532"));
erpCustomerParam.setDatas(dataInfoList);
@@ -279,20 +279,26 @@ public class ToErpServiceImpl implements IToErpService {
@Override
public AjaxResult receiveOutStockList() {
ErpOutStockListParam erpOutStockListParam = new ErpOutStockListParam();
OutStockMiddle outStockMiddle = new OutStockMiddle();
OutStockMiddle outStockMiddle1 = outStockMiddleService.selectOutStockMiddleByStockoutId("1");
erpOutStockListParam.setDate3_end(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 判断是否有上次访问时间
if (ObjUtil.isNotNull(outStockMiddle1)){
erpOutStockListParam.setDate3_start(outStockMiddle1.getCreateDate());
outStockMiddle1.setCreateDate(erpOutStockListParam.getDate3_end());
outStockMiddleService.updateOutStockMiddle(outStockMiddle1);
}else {
erpOutStockListParam.setDate3_start("");
outStockMiddle.setStockoutId("1");
outStockMiddle.setCreateDate(erpOutStockListParam.getDate3_end());
outStockMiddleService.insertOutStockMiddle(outStockMiddle);
}
// OutStockMiddle outStockMiddle = new OutStockMiddle();
// OutStockMiddle outStockMiddle1 = outStockMiddleService.selectOutStockMiddleByStockoutId("1");
// erpOutStockListParam.setDate3_end(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//// 判断是否有上次访问时间
// if (ObjUtil.isNotNull(outStockMiddle1)){
// erpOutStockListParam.setDate3_start(outStockMiddle1.getCreateDate());
// outStockMiddle1.setCreateDate(erpOutStockListParam.getDate3_end());
// outStockMiddleService.updateOutStockMiddle(outStockMiddle1);
// }else {
// erpOutStockListParam.setDate3_start("");
// outStockMiddle.setStockoutId("1");
// outStockMiddle.setCreateDate(erpOutStockListParam.getDate3_end());
// outStockMiddleService.insertOutStockMiddle(outStockMiddle);
// }
String today = DateUtil.today();
erpOutStockListParam.setDate3_start(today + " 00:00:00");
erpOutStockListParam.setDate3_end(today + " 23:59:59");
erpOutStockListParam.setDate5_start(today + " 00:00:00");
erpOutStockListParam.setDate5_end(today + " 23:59:59");
erpOutStockListParam.setTitle("打冷");
erpOutStockListParam.setPage_index(0);
erpOutStockListParam.setPage_size(0);
erpOutStockListParam.setNeedList(1);
@@ -332,6 +338,7 @@ public class ToErpServiceImpl implements IToErpService {
erpOutStock.setSpare4(Convert.toStr(row.get(27)));
String stockOutId = basJobIdService.getJobId("CKD");
outStockout.setStockoutId(stockOutId);
outStockout.setClassNowId(erpOutStock.getStockoutId());
outStockout.setWarehouseId(Convert.toStr(row.get(2)));
outStockout.setErpStockoutId(Convert.toStr(row.get(0)));
outStockout.setStockoutGuid(stockOutId);
@@ -416,8 +423,6 @@ public class ToErpServiceImpl implements IToErpService {
outStockoutDetailService.insertOutStockoutDetail(outStockoutDetail);
}
}
}
return AjaxResult.success();
}
@@ -686,7 +691,6 @@ public class ToErpServiceImpl implements IToErpService {
private ObjectMapper objectMapper;
//获取入库单据
public AjaxResult getInStock(){
//创建请求体
InStockinNQueryRequest inStockinNQueryRequest = new InStockinNQueryRequest();
@@ -694,12 +698,10 @@ public class ToErpServiceImpl implements IToErpService {
inStockinNQueryRequest.setSort1(0);
// 设置日期范围为当天
String today = DateUtil.today();
// inStockinNQueryRequest.setDate3Start(today + " 00:00:00");
// inStockinNQueryRequest.setDate3End(today + " 23:59:59");
inStockinNQueryRequest.setDate3Start("2025-11-03" + " 00:00:00");
inStockinNQueryRequest.setDate3End("2025-11-03" + " 23:59:59");
inStockinNQueryRequest.setDate5Start("2025-11-03" + " 00:00:00");
inStockinNQueryRequest.setDate5End("2025-11-03" + " 23:59:59");
inStockinNQueryRequest.setDate3Start(today + " 00:00:00");
inStockinNQueryRequest.setDate3End(today + " 23:59:59");
inStockinNQueryRequest.setDate5Start(today + " 00:00:00");
inStockinNQueryRequest.setDate5End(today + " 23:59:59");
inStockinNQueryRequest.setTitle("打冷");
inStockinNQueryRequest.setNeedList(1);
inStockinNQueryRequest.setPageIndex(1);
@@ -753,7 +755,7 @@ public class ToErpServiceImpl implements IToErpService {
newStockin.setProductDetails(Convert.toStr(row.get(15)));
newStockin.setCustomerName(Convert.toStr(row.get(16)));
newStockin.setWeighbillNo(Convert.toStr(row.get(17)));
newStockin.setVehicleNo(Convert.toStr(row.get(18)));
newStockin.setVehicleNo(Convert.toStr(row.get(1)));
newStockin.setOrderSrc("ERP");
try {
java.math.BigDecimal orderSum = new java.math.BigDecimal("0");
@@ -850,15 +852,15 @@ public class ToErpServiceImpl implements IToErpService {
//回传ERP
try {
ErpInStockinConfirmRequest request = new ErpInStockinConfirmRequest();
request.setOrd(inStockinN.getErpStockinId());
request.setOrd(inStockinN.getVehicleNo());
request.setDate5(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
request.setComplete1(1);
request.setComplete1(3);
request.setIntro2(inStockinN.getRemark());
request.setCustomerName(inStockinN.getCustomerName());
request.setWeighbillNo(inStockinN.getWeighbillNo());
request.setVehicleNo(inStockinN.getVehicleNo());
List<ErpInStockinDetailConfirmRequest> detailList = getErp(stockinDetailNs);
request.setKuinList(detailList);
request.setKuinList(JSONUtil.toJsonStr(detailList));
String json = objectMapper.writeValueAsString(request);
if (!post(stockinConfirmUrl,json,"入库确认").getSuccess()) {
throw new RuntimeException("回传ERP失败");
@@ -920,7 +922,6 @@ public class ToErpServiceImpl implements IToErpService {
requestLog.setRequestBody(jsonStr);
requestLog.setResponseBody(body);
requestLog.setEndpoint(endpoint);
boolean isSuccess = false;
try {
if (JSONUtil.isTypeJSON(body)) {

View File

@@ -40,7 +40,7 @@ public class ToWcsServiceImpl implements IToWcsService {
@Override
// @Scheduled(fixedDelay=1500)
@Scheduled(fixedDelay=1500)
public void pushOutMydoJob() {
//查询所有未推送的料箱出库作业
MydoJob mydoJobParam = new MydoJob();

View File

@@ -23,7 +23,6 @@ import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.device.agv.service.IAgvContainerTaskService;
import com.ruoyi.in.erp.service.ITransferBillCallbackService;
import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import com.ruoyi.job.mydojob.domain.MydoJob;
import com.ruoyi.job.mydojob.service.IMydoJobService;
@@ -32,7 +31,6 @@ import com.ruoyi.job.mydojobdetail.service.IMydoJobDetailService;
import com.ruoyi.out.outStockout.service.IOutStockoutService;
import com.ruoyi.pda.trayMsg.domain.TrayMsg;
import com.ruoyi.pda.trayMsg.service.ITrayMsgService;
import com.ruoyi.stock.stock.domain.BasStock;
import com.ruoyi.stock.stock.service.IBasStockService;
import com.ruoyi.system.domain.InStockinDetailN;
import com.ruoyi.system.service.IInStockinDetailNService;
@@ -42,11 +40,16 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.LinkedHashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
/**
* 作业统计 Service 实现
@@ -54,6 +57,8 @@ import java.util.stream.Collectors;
@Service
@Slf4j
public class ToWmsServiceImpl implements IToWmsService {
private static final List<Integer> SUPPORTED_LAYERS = Arrays.asList(1, 2, 3);
@Autowired
private IMydoJobService mydoJobService;
@Autowired
@@ -112,7 +117,13 @@ public class ToWmsServiceImpl implements IToWmsService {
//空托盘处理
if (mydoJob1.getCargoSpaceId()==null){
String productId = "KTP0001";
String cargoSpaceId = getCargoSpaceByProductInfo(productId);
Map<String, Object> allocResult = getCargoSpaceByProductInfo(productId, requestEnter.getAssignableLayer());
if (allocResult.containsKey("wait")) {
MydoJob waitJob=new MydoJob();
waitJob.setCargoSpaceId("1");
return AjaxResult.success(waitJob);
}
String cargoSpaceId = (String) allocResult.get("cargoSpaceId");
if (!StringUtils.isNotBlank(cargoSpaceId)) {
return AjaxResult.error("无符合条件的货位用于分配,请检查库存区占用情况,物料号:" + productId);
}
@@ -123,7 +134,11 @@ public class ToWmsServiceImpl implements IToWmsService {
mydoJobService.updateMydoJob(mydoJob1);
return AjaxResult.success(mydoJob1);
}else {
return AjaxResult.success(mydoJob1);
if (mydoJob1.getInOrOut().equals("3")) {
return AjaxResult.success(mydoJob1);
}else {
return AjaxResult.error("当前托盘存在其他类型作业");
}
}
}
//校验 - 条码已经有作业
@@ -152,8 +167,14 @@ public class ToWmsServiceImpl implements IToWmsService {
mydoJob.setCreateTime(new Date());
String stockinDetailId = trayMsg.getStockinDetailId();
InStockinDetailN inStockinDetail = inStockinDetailNService.selectInStockinDetailNByStockinDetailId(stockinDetailId);
String cargoSpaceId = getCargoSpaceByProductInfo(inStockinDetail.getProductModel());
Map<String, Object> allocResult = getCargoSpaceByProductInfo(inStockinDetail.getProductModel(),requestEnter.getAssignableLayer());
//是否有符合条件的货位
if (allocResult.containsKey("wait")) {
MydoJob waitJob=new MydoJob();
waitJob.setCargoSpaceId("1");
return AjaxResult.success(waitJob);
}
String cargoSpaceId = (String) allocResult.get("cargoSpaceId");
if (!StringUtils.isNotBlank(cargoSpaceId)) {
return AjaxResult.error("无符合条件的货位用于分配,请检查库存区占用情况,物料号:" + inStockinDetail.getProductModel());
}
@@ -182,69 +203,127 @@ public class ToWmsServiceImpl implements IToWmsService {
* 入库任务请求根据托盘码 -> 向子单明细分配入库货位
* 获取库存物料号 -> 货位id -> 存储区组group -> 状态:未占用 -> 按规则获取货位
*
* @param productId 物料号
* @param productId 物料号
* @param assignableLayer
* @return
*/
public String getCargoSpaceByProductInfo(String productId) {
//>>>>>>>>>>>>>>获取物料库存信息 -> 有库存 -> 货位(cargospace) -> 存储区组(groupCodingNo) -> 根据groupCoding(由高到低) -> 获取状态1的货位分配
//>>>>>>>>>>>>>>获取物料库存信息 -> 无库存 -> 遍历存储区组(groupCodingNo) -> 查找全部货位空的区组 -> 根据groupCoding(由高到低) -> 获取状态1的货位分配
public Map<String, Object> getCargoSpaceByProductInfo(String productId, Integer[] assignableLayer) {
Map<String, Object> result = new HashMap<>();
try {
//获取物料的货位集合 - 首先查找已经存放该物料的存储区
List<BasStock> stocks = basStockService.selectBasStockListByProductId(productId);
//如果集合空 - 寻找未被占用的存储区组放货
if (!stocks.isEmpty()) {
//如果物料已经存放在多个货位(区域) - 去重
List<BasStock> stocksNew = stocks.stream().distinct().collect(Collectors.toList());
//查询对应货位的区域在【BasCargoSpace】是否有空位 - 在groupCodingNo的分组中是否仍然有状态【1】的货位
for (BasStock stock : stocksNew) {
//获取每种物料的存放货位信息
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId());
//获取每种物料的存放货位信息 - 存储区
String group = cargoSpace.getGroupCodingNo();
//获取该存储区组的所有货位
List<BasCargoSpace> cargoSpaces = basCargoSpaceService.selectBasCargoSpaceListByGroupCodingNo(group);
//在集合中获取状态为【1】的货位
for (BasCargoSpace cs : cargoSpaces) {
//货位状态:1(未占用) -> 返回该货位结果
if ("1".equals(cs.getStatus())) {
return cs.getCargoSpaceId();
}
}
}
}
for (int i = 1; i <= 45; i++) {
BasCargoSpace cargospace = new BasCargoSpace();
//存储区
String groupCodingNo = String.format("%03d", i);
cargospace.setGroupCodingNo(groupCodingNo);
//获取【groupCodingNo】所有货位
List<BasCargoSpace> cargoSpaces = basCargoSpaceService.selectBasCargoSpaceList(cargospace);
//判断是否全部未占用,即某存储区全部为空位 - 避免物料混放
boolean isAllEmpty = cargoSpaces.stream().allMatch(c -> "1".equals(c.getStatus()));
//区域未占用 - 则分配最内侧货位
if (isAllEmpty && cargoSpaces.size() > 0) {
cargoSpaces.sort(Comparator.comparing(BasCargoSpace::getGroupCoding).reversed());
return cargoSpaces.get(0).getCargoSpaceId();
}
// 0. Check wait status
int status3Count = basCargoSpaceService.selectCountByStatus("3");
if (status3Count >= 2) {
result.put("wait", 1);
return result;
}
// 1. 查找已存放该物料的存储区组(一次性获取去重后的组列表)
List<String> existingGroups = basStockService.selectGroupCodingNosByProductId(productId);
// 2. 按层级搜索策略依次分配
List<Integer[]> layerSearchPlan = buildLayerSearchPlan(assignableLayer);
for (Integer[] layers : layerSearchPlan) {
BasCargoSpace allocatedSpace = tryAllocateByLayers(existingGroups, layers);
if (allocatedSpace != null) {
allocatedSpace.setStatus("3");
basCargoSpaceService.updateBasCargoSpace(allocatedSpace);
result.put("cargoSpaceId", allocatedSpace.getCargoSpaceId());
return result;
}
}
} catch (Exception e) {
log.error("入库子单获取目标货位失败,异常信息:" + e.getMessage());
}
return result;
}
private BasCargoSpace tryAllocateByLayers(List<String> existingGroups, Integer[] layers) {
if (layers == null || layers.length == 0) {
return null;
}
if (CollUtil.isNotEmpty(existingGroups)) {
// 优先在同物料已存在的组里找
BasCargoSpace availableSpace = basCargoSpaceService.selectEmptyCargoSpaceInGroupsAndLayers(existingGroups, layers);
if (availableSpace != null) {
return availableSpace;
}
}
// 再找一个完全空闲组
String emptyGroupNo = basCargoSpaceService.selectFirstEmptyGroupCodingNoWithLayer(layers);
if (emptyGroupNo != null) {
List<String> groups = new ArrayList<>();
groups.add(emptyGroupNo);
BasCargoSpace bestSpace = basCargoSpaceService.selectEmptyCargoSpaceInGroupsAndLayers(groups, layers);
if (bestSpace != null && "1".equals(bestSpace.getStatus())) {
return bestSpace;
}
}
return null;
}
/**
* 层级搜索策略:
* 1) 传 1 个层:按就近层依次补位(1->2->3,2->1->3,3->2->1)
* 2) 传 2 个层:先在这两层分配,再尝试“中间层补位”(如 1、3 -> 2)
* 3) 传 3 个及以上层:按传入层集合分配
*/
private List<Integer[]> buildLayerSearchPlan(Integer[] assignableLayer) {
List<Integer[]> plan = new ArrayList<>();
if (assignableLayer == null || assignableLayer.length == 0) {
plan.add(SUPPORTED_LAYERS.toArray(new Integer[0]));
return plan;
}
List<Integer> normalized = Arrays.stream(assignableLayer)
.filter(item -> item != null && item > 0)
.distinct()
.sorted()
.collect(java.util.stream.Collectors.toList());
if (normalized.isEmpty()) {
plan.add(SUPPORTED_LAYERS.toArray(new Integer[0]));
return plan;
}
if (normalized.size() == 1) {
Integer currentLayer = normalized.get(0);
List<Integer> ordered = new ArrayList<>(SUPPORTED_LAYERS);
ordered.sort((a, b) -> {
int da = Math.abs(a - currentLayer);
int db = Math.abs(b - currentLayer);
if (da != db) {
return Integer.compare(da, db);
}
return Integer.compare(a, b);
});
for (Integer layer : ordered) {
plan.add(new Integer[]{layer});
}
return plan;
}
if (normalized.size() == 2) {
// 先尝试传入的两层
plan.add(normalized.toArray(new Integer[0]));
// 再尝试未传入的剩余层(如 1、2 -> 3,2、3 -> 1,1、3 -> 2)
List<Integer> remaining = SUPPORTED_LAYERS.stream()
.filter(layer -> !normalized.contains(layer))
.collect(java.util.stream.Collectors.toList());
if (!remaining.isEmpty()) {
plan.add(remaining.toArray(new Integer[0]));
}
return plan;
}
// 传入3层及以上时,按传入层集合分配
plan.add(normalized.toArray(new Integer[0]));
return plan;
}
@Override
public AjaxResult selectMydoJobByEntranceId(RequestEnter requestEnter) {
@@ -299,8 +378,15 @@ public class ToWmsServiceImpl implements IToWmsService {
outJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(outJob);
BasCargoSpace basCargoSpace =basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(outJob.getCargoSpaceId());
basCargoSpace.setStatus("1");
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
if (basCargoSpace != null && outJob.getTrayCode().equals(basCargoSpace.getTrayCode())) {
basCargoSpace.setStatus("1");
basCargoSpace.setTrayCode(null);
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
} else {
log.warn("出库完成不清空货位,货位已被其他托盘占用: taskNo={}, jobId={}, cargoSpaceId={}, outTray={}, currTray={}",
outJob.getTaskNo(), outJob.getJobId(), outJob.getCargoSpaceId(), outJob.getTrayCode(),
basCargoSpace == null ? null : basCargoSpace.getTrayCode());
}
break;
default:

View File

@@ -220,5 +220,411 @@ public class BasProduct extends BaseEntity
private String supplierId;
public String getProductGuid() {
return productGuid;
}
public void setProductGuid(String productGuid) {
this.productGuid = productGuid;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getCargoNo() {
return cargoNo;
}
public void setCargoNo(String cargoNo) {
this.cargoNo = cargoNo;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public String getSpare1() {
return spare1;
}
public void setSpare1(String spare1) {
this.spare1 = spare1;
}
public String getSpare2() {
return spare2;
}
public void setSpare2(String spare2) {
this.spare2 = spare2;
}
public String getSpare3() {
return spare3;
}
public void setSpare3(String spare3) {
this.spare3 = spare3;
}
public String getSpare4() {
return spare4;
}
public void setSpare4(String spare4) {
this.spare4 = spare4;
}
public String getSpare5() {
return spare5;
}
public void setSpare5(String spare5) {
this.spare5 = spare5;
}
public String getSpare6() {
return spare6;
}
public void setSpare6(String spare6) {
this.spare6 = spare6;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getSpare7() {
return spare7;
}
public void setSpare7(String spare7) {
this.spare7 = spare7;
}
public String getSpare8() {
return spare8;
}
public void setSpare8(String spare8) {
this.spare8 = spare8;
}
public String getSpare9() {
return spare9;
}
public void setSpare9(String spare9) {
this.spare9 = spare9;
}
public String getSpare10() {
return spare10;
}
public void setSpare10(String spare10) {
this.spare10 = spare10;
}
public String getSpare11() {
return spare11;
}
public void setSpare11(String spare11) {
this.spare11 = spare11;
}
public String getSpare12() {
return spare12;
}
public void setSpare12(String spare12) {
this.spare12 = spare12;
}
public String getSpare13() {
return spare13;
}
public void setSpare13(String spare13) {
this.spare13 = spare13;
}
public String getSpare14() {
return spare14;
}
public void setSpare14(String spare14) {
this.spare14 = spare14;
}
public String getSpare15() {
return spare15;
}
public void setSpare15(String spare15) {
this.spare15 = spare15;
}
public String getSpare16() {
return spare16;
}
public void setSpare16(String spare16) {
this.spare16 = spare16;
}
public String getSpare17() {
return spare17;
}
public void setSpare17(String spare17) {
this.spare17 = spare17;
}
public String getSpare18() {
return spare18;
}
public void setSpare18(String spare18) {
this.spare18 = spare18;
}
public String getSpare19() {
return spare19;
}
public void setSpare19(String spare19) {
this.spare19 = spare19;
}
public String getSpare20() {
return spare20;
}
public void setSpare20(String spare20) {
this.spare20 = spare20;
}
public String getSpare21() {
return spare21;
}
public void setSpare21(String spare21) {
this.spare21 = spare21;
}
public String getSpare22() {
return spare22;
}
public void setSpare22(String spare22) {
this.spare22 = spare22;
}
public String getSpare23() {
return spare23;
}
public void setSpare23(String spare23) {
this.spare23 = spare23;
}
public String getSpare24() {
return spare24;
}
public void setSpare24(String spare24) {
this.spare24 = spare24;
}
public String getSpare25() {
return spare25;
}
public void setSpare25(String spare25) {
this.spare25 = spare25;
}
public String getSpare26() {
return spare26;
}
public void setSpare26(String spare26) {
this.spare26 = spare26;
}
public String getSpare27() {
return spare27;
}
public void setSpare27(String spare27) {
this.spare27 = spare27;
}
public String getSpare28() {
return spare28;
}
public void setSpare28(String spare28) {
this.spare28 = spare28;
}
public String getSpare29() {
return spare29;
}
public void setSpare29(String spare29) {
this.spare29 = spare29;
}
public String getSpare30() {
return spare30;
}
public void setSpare30(String spare30) {
this.spare30 = spare30;
}
public String getSpare31() {
return spare31;
}
public void setSpare31(String spare31) {
this.spare31 = spare31;
}
public String getSpare32() {
return spare32;
}
public void setSpare32(String spare32) {
this.spare32 = spare32;
}
public String getSpare33() {
return spare33;
}
public void setSpare33(String spare33) {
this.spare33 = spare33;
}
public String getSpare34() {
return spare34;
}
public void setSpare34(String spare34) {
this.spare34 = spare34;
}
public String getSpare35() {
return spare35;
}
public void setSpare35(String spare35) {
this.spare35 = spare35;
}
public String getSpare36() {
return spare36;
}
public void setSpare36(String spare36) {
this.spare36 = spare36;
}
public String getSpare37() {
return spare37;
}
public void setSpare37(String spare37) {
this.spare37 = spare37;
}
public String getSpare38() {
return spare38;
}
public void setSpare38(String spare38) {
this.spare38 = spare38;
}
public String getSpare39() {
return spare39;
}
public void setSpare39(String spare39) {
this.spare39 = spare39;
}
public String getLotNo() {
return lotNo;
}
public void setLotNo(String lotNo) {
this.lotNo = lotNo;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public String getUpdateId() {
return updateId;
}
public void setUpdateId(String updateId) {
this.updateId = updateId;
}
public String getSupplierId() {
return supplierId;
}
public void setSupplierId(String supplierId) {
this.supplierId = supplierId;
}
}

View File

@@ -100,5 +100,26 @@ public interface BasCargoSpaceMapper extends BaseMapper<BasCargoSpace>
*/
public List<BasCargoSpace> selectCargoSpaceWithStock();
/**
* 在指定存储区组中查找首个空闲货位
* @param groups 存储区组列表
* @return 空闲货位
*/
public BasCargoSpace selectEmptyCargoSpaceInGroups(@Param("groups") List<String> groups);
/**
* 查找第一个完全空闲(无占用)的存储区组编号(范围001-045)
* @return 存储区组编号
*/
public String selectFirstEmptyGroupCodingNo();
void lockedCargoSpace(BasCargoSpace basCargoSpace);
int selectCountByStatus(@Param("status") String status);
BasCargoSpace selectEmptyCargoSpaceInGroupsAndLayers(@Param("groups") List<String> groups, @Param("layers") Integer[] layers);
String selectFirstEmptyGroupCodingNoWithLayer(@Param("layers") Integer[] layers);
BasCargoSpace selectEmptyCargoSpaceExcludeLayers(@Param("layers") Integer[] layers);
}

View File

@@ -38,6 +38,48 @@ public interface IBasCargoSpaceService extends IService<BasCargoSpace>
*/
public List<BasCargoSpace> selectBasCargoSpaceListByGroupCodingNo(String groupCodingNo);
/**
* 在指定存储区组中查找首个空闲货位
* @param groups 存储区组列表
* @return 空闲货位
*/
public BasCargoSpace selectEmptyCargoSpaceInGroups(List<String> groups);
/**
* 查找第一个完全空闲(无占用)的存储区组编号
* @return 存储区组编号
*/
public String selectFirstEmptyGroupCodingNo();
/**
* 根据状态查询货位数量
* @param status 状态
* @return 数量
*/
public int selectCountByStatus(String status);
/**
* 在指定存储区组和层中查找空闲货位
* @param groups 存储区组列表
* @param layers 指定层列表
* @return 空闲货位
*/
public BasCargoSpace selectEmptyCargoSpaceInGroupsAndLayers(List<String> groups, Integer[] layers);
/**
* 查找第一个完全空闲且包含指定层的存储区组编号
* @param layers 指定层列表
* @return 存储区组编号
*/
public String selectFirstEmptyGroupCodingNoWithLayer(Integer[] layers);
/**
* 查找不在指定层列表中的空闲货位
* @param layers 排除的层列表
* @return 空闲货位
*/
public BasCargoSpace selectEmptyCargoSpaceExcludeLayers(Integer[] layers);
/**
* 新增库存信息
*

View File

@@ -58,6 +58,35 @@ public class BasCargoSpaceServiceImpl extends ServiceImpl<BasCargoSpaceMapper,Ba
return basCargoSpaceMapper.selectBasCargoSpaceListByGroupCodingNo(groupCodingNo);
}
@Override
public BasCargoSpace selectEmptyCargoSpaceInGroups(List<String> groups) {
return basCargoSpaceMapper.selectEmptyCargoSpaceInGroups(groups);
}
@Override
public String selectFirstEmptyGroupCodingNo() {
return basCargoSpaceMapper.selectFirstEmptyGroupCodingNo();
}
@Override
public int selectCountByStatus(String status) {
return basCargoSpaceMapper.selectCountByStatus(status);
}
@Override
public BasCargoSpace selectEmptyCargoSpaceInGroupsAndLayers(List<String> groups, Integer[] layers) {
return basCargoSpaceMapper.selectEmptyCargoSpaceInGroupsAndLayers(groups, layers);
}
@Override
public String selectFirstEmptyGroupCodingNoWithLayer(Integer[] layers) {
return basCargoSpaceMapper.selectFirstEmptyGroupCodingNoWithLayer(layers);
}
@Override
public BasCargoSpace selectEmptyCargoSpaceExcludeLayers(Integer[] layers) {
return basCargoSpaceMapper.selectEmptyCargoSpaceExcludeLayers(layers);
}
/**
* 新增库存信息

View File

@@ -82,7 +82,6 @@ public class CheckDifferenceRecordServiceImpl implements ICheckDifferenceRecordS
String stockId = checkDifferenceRecord.getStockId();
BasStock basStock = basStockService.selectBasStockByStockId(stockId);
if (!"1".equals(basStock.getProductStatus())){
log.warn("库存非正常状态{}",basStock.getStockId());
return AjaxResult.error(MessageUtils.message("error.message10"));
}
if (basStock.getQuantity().equals(checkDifferenceRecord.getNewQuantity())){
@@ -102,14 +101,12 @@ public class CheckDifferenceRecordServiceImpl implements ICheckDifferenceRecordS
queryStock.setWarehouseId(checkDifferenceRecord.getWarehouseId());
List<BasStock> stocks = basStockService.selectBasStockList(queryStock);
if (!stocks.isEmpty()) {
log.warn("该物料已存在{}",checkDifferenceRecord.getProductId());
return AjaxResult.error(MessageUtils.message("error.message8"));
}
BasCargoSpace queryCargoSpace = new BasCargoSpace();
queryCargoSpace.setWarehouseId(checkDifferenceRecord.getWarehouseId());
List<BasCargoSpace> cargoSpaces = basCargoSpaceService.selectBasCargoSpaceList(queryCargoSpace);
if (cargoSpaces.isEmpty()){
log.warn("没有货位");
return AjaxResult.error(MessageUtils.message("error.message9"));
}
checkDifferenceRecord.setCargoSpaceId(cargoSpaces.get(0).getCargoSpaceId());

View File

@@ -100,8 +100,173 @@ public class CheckStockin extends BaseEntity
@Excel(name = "备用字段5")
private String spare5;
public String getStockGuid() {
return stockGuid;
}
public void setStockGuid(String stockGuid) {
this.stockGuid = stockGuid;
}
public String getStockCheckId() {
return stockCheckId;
}
public void setStockCheckId(String stockCheckId) {
this.stockCheckId = stockCheckId;
}
public String getCheckType() {
return checkType;
}
public void setCheckType(String checkType) {
this.checkType = checkType;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public String getCreateManId() {
return createManId;
}
public void setCreateManId(String createManId) {
this.createManId = createManId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(String warehouseId) {
this.warehouseId = warehouseId;
}
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getFinishDate() {
return finishDate;
}
public void setFinishDate(String finishDate) {
this.finishDate = finishDate;
}
public String getErpBill() {
return erpBill;
}
public void setErpBill(String erpBill) {
this.erpBill = erpBill;
}
public String getStockSource() {
return stockSource;
}
public void setStockSource(String stockSource) {
this.stockSource = stockSource;
}
public String getDepartmentNo() {
return departmentNo;
}
public void setDepartmentNo(String departmentNo) {
this.departmentNo = departmentNo;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public String getCustomerNo() {
return customerNo;
}
public void setCustomerNo(String customerNo) {
this.customerNo = customerNo;
}
public String getClassNo() {
return classNo;
}
public void setClassNo(String classNo) {
this.classNo = classNo;
}
public String getSupplierNo() {
return supplierNo;
}
public void setSupplierNo(String supplierNo) {
this.supplierNo = supplierNo;
}
public String getSpare1() {
return spare1;
}
public void setSpare1(String spare1) {
this.spare1 = spare1;
}
public String getSpare2() {
return spare2;
}
public void setSpare2(String spare2) {
this.spare2 = spare2;
}
public String getSpare3() {
return spare3;
}
public void setSpare3(String spare3) {
this.spare3 = spare3;
}
public String getSpare4() {
return spare4;
}
public void setSpare4(String spare4) {
this.spare4 = spare4;
}
public String getSpare5() {
return spare5;
}
public void setSpare5(String spare5) {
this.spare5 = spare5;
}
@Override
public String toString() {

View File

@@ -16,4 +16,28 @@ public class BillStatusCount extends BaseEntity {
/** 单据类型(1:入库,2:出库,3:盘点) */
private String type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

View File

@@ -142,6 +142,7 @@ public class MydoJob extends BaseEntity
private String orderByColumn;
public String getProductId() {
return productId;
}

View File

@@ -336,7 +336,7 @@ public class MydoJobServiceImpl implements IMydoJobService {
//修改单据实际数量
String inOrOutDId = mydoJobDetail.getInOrOutDId();
InStockinDetailN inStockinDetail = inStockinDetailNService.selectInStockinDetailNByStockinDetailId(inOrOutDId);
inStockinDetail.setFinishNum(Convert.toBigDecimal(inStockinDetail.getFinishNum()).add(Convert.toBigDecimal(mydoJobDetail.getInQuantity())));
inStockinDetail.setFinishNum(Convert.toBigDecimal(inStockinDetail.getFinishNum(), BigDecimal.ZERO).add(Convert.toBigDecimal(mydoJobDetail.getInQuantity(), BigDecimal.ZERO)));
inStockinDetailNService.updateInStockinDetailN(inStockinDetail);
}
//正常库存

View File

@@ -142,6 +142,347 @@ public class MydoJobDetail extends BaseEntity
private String cargoNo;
private String warehouseId;
public String getJobDetailId() {
return jobDetailId;
}
public void setJobDetailId(String jobDetailId) {
this.jobDetailId = jobDetailId;
}
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getStockId() {
return stockId;
}
public void setStockId(String stockId) {
this.stockId = stockId;
}
public String getLotNo() {
return lotNo;
}
public void setLotNo(String lotNo) {
this.lotNo = lotNo;
}
public String getInDate() {
return inDate;
}
public void setInDate(String inDate) {
this.inDate = inDate;
}
public String getInOrOutId() {
return inOrOutId;
}
public void setInOrOutId(String inOrOutId) {
this.inOrOutId = inOrOutId;
}
public String getInOrOutDId() {
return inOrOutDId;
}
public void setInOrOutDId(String inOrOutDId) {
this.inOrOutDId = inOrOutDId;
}
public String getProductGuid() {
return productGuid;
}
public void setProductGuid(String productGuid) {
this.productGuid = productGuid;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getStockStatus() {
return stockStatus;
}
public void setStockStatus(String stockStatus) {
this.stockStatus = stockStatus;
}
public String getInQuantity() {
return inQuantity;
}
public void setInQuantity(String inQuantity) {
this.inQuantity = inQuantity;
}
public String getStockQuantity() {
return stockQuantity;
}
public void setStockQuantity(String stockQuantity) {
this.stockQuantity = stockQuantity;
}
public String getOutQuantity() {
return outQuantity;
}
public void setOutQuantity(String outQuantity) {
this.outQuantity = outQuantity;
}
public String getLayerQuantity() {
return layerQuantity;
}
public void setLayerQuantity(String layerQuantity) {
this.layerQuantity = layerQuantity;
}
public String getOutLayerQuantity() {
return outLayerQuantity;
}
public void setOutLayerQuantity(String outLayerQuantity) {
this.outLayerQuantity = outLayerQuantity;
}
public String getGiveNum() {
return giveNum;
}
public void setGiveNum(String giveNum) {
this.giveNum = giveNum;
}
public String getStockinId() {
return stockinId;
}
public void setStockinId(String stockinId) {
this.stockinId = stockinId;
}
public String getStackingId() {
return stackingId;
}
public void setStackingId(String stackingId) {
this.stackingId = stackingId;
}
public String getExitId() {
return exitId;
}
public void setExitId(String exitId) {
this.exitId = exitId;
}
public String getPrintDate() {
return printDate;
}
public void setPrintDate(String printDate) {
this.printDate = printDate;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getSupplierId() {
return supplierId;
}
public void setSupplierId(String supplierId) {
this.supplierId = supplierId;
}
public String getSupplierName() {
return supplierName;
}
public void setSupplierName(String supplierName) {
this.supplierName = supplierName;
}
public String getSpare1() {
return spare1;
}
public void setSpare1(String spare1) {
this.spare1 = spare1;
}
public String getSpare2() {
return spare2;
}
public void setSpare2(String spare2) {
this.spare2 = spare2;
}
public String getSpare3() {
return spare3;
}
public void setSpare3(String spare3) {
this.spare3 = spare3;
}
public String getSpare4() {
return spare4;
}
public void setSpare4(String spare4) {
this.spare4 = spare4;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getPickQuantity() {
return pickQuantity;
}
public void setPickQuantity(String pickQuantity) {
this.pickQuantity = pickQuantity;
}
public ExtraField getExtraField() {
return extraField;
}
public void setExtraField(ExtraField extraField) {
this.extraField = extraField;
}
public String getPickQuantityReal() {
return pickQuantityReal;
}
public void setPickQuantityReal(String pickQuantityReal) {
this.pickQuantityReal = pickQuantityReal;
}
public String getPickBindQuantity() {
return pickBindQuantity;
}
public void setPickBindQuantity(String pickBindQuantity) {
this.pickBindQuantity = pickBindQuantity;
}
public String getSpare5() {
return spare5;
}
public void setSpare5(String spare5) {
this.spare5 = spare5;
}
public String getSpare6() {
return spare6;
}
public void setSpare6(String spare6) {
this.spare6 = spare6;
}
public String getSpare7() {
return spare7;
}
public void setSpare7(String spare7) {
this.spare7 = spare7;
}
public String getSpare8() {
return spare8;
}
public void setSpare8(String spare8) {
this.spare8 = spare8;
}
public String getSpare9() {
return spare9;
}
public void setSpare9(String spare9) {
this.spare9 = spare9;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getTrayCode() {
return trayCode;
}
public void setTrayCode(String trayCode) {
this.trayCode = trayCode;
}
public String getCargoNo() {
return cargoNo;
}
public void setCargoNo(String cargoNo) {
this.cargoNo = cargoNo;
}
public String getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(String warehouseId) {
this.warehouseId = warehouseId;
}
}

View File

@@ -43,6 +43,10 @@ public class ViewHandAllotStock extends BaseEntity
@Excel(name = "库存数量")
private String quantity;
/** 最近入库时间 */
@Excel(name = "最近入库时间")
private String inDate;
public void setOnlyIdentity(Long onlyIdentity)
{
this.onlyIdentity = onlyIdentity;
@@ -113,6 +117,16 @@ public class ViewHandAllotStock extends BaseEntity
return quantity;
}
public void setInDate(String inDate)
{
this.inDate = inDate;
}
public String getInDate()
{
return inDate;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -123,6 +137,7 @@ public class ViewHandAllotStock extends BaseEntity
.append("productName", getProductName())
.append("groupCodingNo", getGroupCodingNo())
.append("quantity", getQuantity())
.append("inDate", getInDate())
.toString();
}
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.out.outStockout.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.api.domain.erp.ReceiveOutStockConfirm;
import com.ruoyi.api.service.IToWcsService;
import com.ruoyi.api.service.impl.ToErpServiceImpl;
@@ -160,7 +161,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService
ReceiveOutStockConfirm receiveOutStockConfirm = new ReceiveOutStockConfirm();
OutStockout outStockout = selectOutStockoutByStockoutGuid(stockoutId);
List<OutStockoutDetail> outStockoutDetails = outStockoutDetailService.selectOutStockoutDetailByStockoutGuid(stockoutId);
receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getErpStockoutId()));
receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getClassNowId()));
receiveOutStockConfirm.setComplete1(3);
receiveOutStockConfirm.setIntro2("出库确认完成,货物已全部发出");
receiveOutStockConfirm.setDate5(new Date());
@@ -172,7 +173,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService
kuout.setCk(Convert.toInt(outStockout.getWarehouseId()));
kuouts.add(kuout);
}
receiveOutStockConfirm.setKuoutList(kuouts);
receiveOutStockConfirm.setKuoutList(JSONUtil.toJsonStr(kuouts));
AjaxResult ajaxResult = toErpService.callErp(receiveOutStockConfirm);
if (!ajaxResult.isSuccess()){
stringBuilder.append(",").append(stockoutId).append(ajaxResult.get("msg"));

View File

@@ -27,4 +27,60 @@ public class TrayCodeMakeSure {
private List<MydoJobDetail> materials;
//异常详情列表
private List<MydoJobDetail> materialDetails;
public String getTrayCode() {
return trayCode;
}
public void setTrayCode(String trayCode) {
this.trayCode = trayCode;
}
public String getContainerCode() {
return containerCode;
}
public void setContainerCode(String containerCode) {
this.containerCode = containerCode;
}
public String getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(String warehouseId) {
this.warehouseId = warehouseId;
}
public String getExitId() {
return exitId;
}
public void setExitId(String exitId) {
this.exitId = exitId;
}
public List<MydoJobDetail> getMydoJobDetailList() {
return mydoJobDetailList;
}
public void setMydoJobDetailList(List<MydoJobDetail> mydoJobDetailList) {
this.mydoJobDetailList = mydoJobDetailList;
}
public List<MydoJobDetail> getMaterials() {
return materials;
}
public void setMaterials(List<MydoJobDetail> materials) {
this.materials = materials;
}
public List<MydoJobDetail> getMaterialDetails() {
return materialDetails;
}
public void setMaterialDetails(List<MydoJobDetail> materialDetails) {
this.materialDetails = materialDetails;
}
}

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.api.domain.RequestEnter;
import com.ruoyi.api.service.IToWmsService;
import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace;
import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService;
import com.ruoyi.bas.warehouse.domain.BasWarehouse;
import com.ruoyi.bas.warehouse.mapper.BasWarehouseMapper;
import com.ruoyi.check.commit.domain.CheckCommitRecord;
@@ -57,6 +59,8 @@ public class PdaServiceImp implements PdaService {
private BasWarehouseMapper basWarehouseMapper;
@Autowired
private BasStockMapper basStockMapper;
@Autowired
private IBasCargoSpaceService basCargoSpaceService;
@Override
@@ -111,17 +115,44 @@ public class PdaServiceImp implements PdaService {
if(mydoJobDetails.isEmpty() ){
return AjaxResult.error("该物料没有出库作业,请检查");
}
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJobParam);
String cargoSpaceId = CollUtil.isEmpty(mydoJobs) ? null : mydoJobs.get(0).getCargoSpaceId();
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
pdaMapper.outMakeSure(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
restoreCargoSpaceIfOccupied(trayCodeMakeSure.getTrayCode(), cargoSpaceId);
return AjaxResult.success();
} else {
return AjaxResult.error( map.get("v_resultmsg").toString());
}
}
private void restoreCargoSpaceIfOccupied(String trayCode, String cargoSpaceId) {
if (StrUtil.isEmpty(cargoSpaceId)) {
return;
}
BasStock stockQuery = new BasStock();
stockQuery.setCargoSpaceId(cargoSpaceId);
List<BasStock> stockList = basStockMapper.selectBasStockList(stockQuery);
if (CollUtil.isEmpty(stockList)) {
return;
}
BasStock stock = stockList.get(0);
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
if (cargoSpace == null) {
return;
}
cargoSpace.setStatus("2");
cargoSpace.setTrayCode(stock.getTrayCode());
basCargoSpaceService.updateBasCargoSpace(cargoSpace);
log.warn("PDA出库确认后发现货位仍有库存,已恢复货位状态: outTray={}, cargoSpaceId={}, stockTray={}",
trayCode, cargoSpaceId, stock.getTrayCode());
}
@Override
//@Transactional(rollbackFor = Exception.class)

View File

@@ -4,9 +4,13 @@ import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.pda.trayMsg.domain.TrayMsg;
import com.ruoyi.pda.trayMsg.mapper.TrayMsgMapper;
import com.ruoyi.pda.trayMsg.service.ITrayMsgService;
import com.ruoyi.system.domain.InStockinDetailN;
import com.ruoyi.system.service.IInStockinDetailNService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -21,6 +25,9 @@ public class TrayMsgServiceImpl implements ITrayMsgService
@Autowired
private TrayMsgMapper trayMsgMapper;
@Autowired
private IInStockinDetailNService stockinDetailNService;
/**
* 查询trayMsg
*
@@ -76,9 +83,49 @@ public class TrayMsgServiceImpl implements ITrayMsgService
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteTrayMsgByIds(String[] ids)
{
return trayMsgMapper.deleteTrayMsgByIds(ids);
for (String id : ids)
{
TrayMsg trayMsg = trayMsgMapper.selectTrayMsgById(id);
if (trayMsg == null || trayMsg.getStockinDetailId() == null)
{
throw new IllegalStateException("托盘记录不存在或入库子单编码为空,id=" + id);
}
String stockInDetailId = trayMsg.getStockinDetailId();
InStockinDetailN inStockinDetailN = stockinDetailNService.selectInStockinDetailNByStockinDetailId(stockInDetailId);
if (inStockinDetailN == null)
{
throw new IllegalStateException("未找到对应的入库子单,stockinDetailId=" + stockInDetailId);
}
BigDecimal smNum = inStockinDetailN.getSmNum() == null ? BigDecimal.ZERO : inStockinDetailN.getSmNum();
BigDecimal trayQuantity = toBigDecimal(trayMsg.getQuantity());
inStockinDetailN.setSmNum(smNum.subtract(trayQuantity));
int updateRows = stockinDetailNService.updateInStockinDetailN(inStockinDetailN);
if (updateRows <= 0)
{
throw new IllegalStateException("更新入库子单失败,stockinDetailId=" + stockInDetailId);
}
}
int deleteRows = trayMsgMapper.deleteTrayMsgByIds(ids);
if (deleteRows != ids.length)
{
throw new IllegalStateException("删除托盘记录失败,期望删除 " + ids.length + " 条,实际删除 " + deleteRows + " 条");
}
return deleteRows;
}
private BigDecimal toBigDecimal(String value)
{
if (value == null || value.trim().isEmpty())
{
return BigDecimal.ZERO;
}
return new BigDecimal(value.trim());
}
/**

View File

@@ -325,4 +325,868 @@ public class BasStock extends BaseEntity {
private String sysIcusIInheritIdIidI414;
/** 入库车号 */
private String sysIcusIInheritIdIidI415;
public String getStockId() {
return stockId;
}
public void setStockId(String stockId) {
this.stockId = stockId;
}
public String getCargoSpaceId() {
return cargoSpaceId;
}
public void setCargoSpaceId(String cargoSpaceId) {
this.cargoSpaceId = cargoSpaceId;
}
public String getCargoSpaceName() {
return cargoSpaceName;
}
public void setCargoSpaceName(String cargoSpaceName) {
this.cargoSpaceName = cargoSpaceName;
}
public String getStockStatus() {
return stockStatus;
}
public void setStockStatus(String stockStatus) {
this.stockStatus = stockStatus;
}
public String getCargoSpaceStockStatus() {
return cargoSpaceStockStatus;
}
public void setCargoSpaceStockStatus(String cargoSpaceStockStatus) {
this.cargoSpaceStockStatus = cargoSpaceStockStatus;
}
public String getCargoSpaceStatus() {
return cargoSpaceStatus;
}
public void setCargoSpaceStatus(String cargoSpaceStatus) {
this.cargoSpaceStatus = cargoSpaceStatus;
}
public String getProductStatus() {
return productStatus;
}
public void setProductStatus(String productStatus) {
this.productStatus = productStatus;
}
public ExtraField getExtraField() {
return extraField;
}
public void setExtraField(ExtraField extraField) {
this.extraField = extraField;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getSpare1() {
return spare1;
}
public void setSpare1(String spare1) {
this.spare1 = spare1;
}
public String getSpare2() {
return spare2;
}
public void setSpare2(String spare2) {
this.spare2 = spare2;
}
public String getSpare5() {
return spare5;
}
public void setSpare5(String spare5) {
this.spare5 = spare5;
}
public String getSpare6() {
return spare6;
}
public void setSpare6(String spare6) {
this.spare6 = spare6;
}
public String getSpare7() {
return spare7;
}
public void setSpare7(String spare7) {
this.spare7 = spare7;
}
public String getSpare8() {
return spare8;
}
public void setSpare8(String spare8) {
this.spare8 = spare8;
}
public String getVoltage() {
return voltage;
}
public void setVoltage(String voltage) {
this.voltage = voltage;
}
public String getPhase() {
return phase;
}
public void setPhase(String phase) {
this.phase = phase;
}
public String getNetWeight() {
return netWeight;
}
public void setNetWeight(String netWeight) {
this.netWeight = netWeight;
}
public String getGrossWeight() {
return grossWeight;
}
public void setGrossWeight(String grossWeight) {
this.grossWeight = grossWeight;
}
public String getDistribution() {
return distribution;
}
public void setDistribution(String distribution) {
this.distribution = distribution;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getTrayCode() {
return trayCode;
}
public void setTrayCode(String trayCode) {
this.trayCode = trayCode;
}
public String getStockinId() {
return stockinId;
}
public void setStockinId(String stockinId) {
this.stockinId = stockinId;
}
public String getStockinDetailId() {
return stockinDetailId;
}
public void setStockinDetailId(String stockinDetailId) {
this.stockinDetailId = stockinDetailId;
}
public String getInType() {
return inType;
}
public void setInType(String inType) {
this.inType = inType;
}
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getInDate() {
return inDate;
}
public void setInDate(String inDate) {
this.inDate = inDate;
}
public String getInDateStart() {
return inDateStart;
}
public void setInDateStart(String inDateStart) {
this.inDateStart = inDateStart;
}
public String getInDateEnd() {
return inDateEnd;
}
public void setInDateEnd(String inDateEnd) {
this.inDateEnd = inDateEnd;
}
public String getLotNo() {
return lotNo;
}
public void setLotNo(String lotNo) {
this.lotNo = lotNo;
}
public String getBackDate() {
return backDate;
}
public void setBackDate(String backDate) {
this.backDate = backDate;
}
public String getProductGuid() {
return productGuid;
}
public void setProductGuid(String productGuid) {
this.productGuid = productGuid;
}
public BigDecimal getOutQuantity() {
return outQuantity;
}
public void setOutQuantity(BigDecimal outQuantity) {
this.outQuantity = outQuantity;
}
public String getInClassId() {
return inClassId;
}
public void setInClassId(String inClassId) {
this.inClassId = inClassId;
}
public String getWarehouseId() {
return warehouseId;
}
public void setWarehouseId(String warehouseId) {
this.warehouseId = warehouseId;
}
public String getRoadwayId() {
return roadwayId;
}
public void setRoadwayId(String roadwayId) {
this.roadwayId = roadwayId;
}
public String getTheFloor() {
return theFloor;
}
public void setTheFloor(String theFloor) {
this.theFloor = theFloor;
}
public String getThePlatoon() {
return thePlatoon;
}
public void setThePlatoon(String thePlatoon) {
this.thePlatoon = thePlatoon;
}
public String getTheColumn() {
return theColumn;
}
public void setTheColumn(String theColumn) {
this.theColumn = theColumn;
}
public String getStackingId() {
return stackingId;
}
public void setStackingId(String stackingId) {
this.stackingId = stackingId;
}
public String getSpare3() {
return spare3;
}
public void setSpare3(String spare3) {
this.spare3 = spare3;
}
public String getSpare4() {
return spare4;
}
public void setSpare4(String spare4) {
this.spare4 = spare4;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getSupplierId() {
return supplierId;
}
public void setSupplierId(String supplierId) {
this.supplierId = supplierId;
}
public String getSupplierName() {
return supplierName;
}
public void setSupplierName(String supplierName) {
this.supplierName = supplierName;
}
public String getProductType() {
return productType;
}
public void setProductType(String productType) {
this.productType = productType;
}
public String getOutside() {
return outside;
}
public void setOutside(String outside) {
this.outside = outside;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getCargoNo() {
return cargoNo;
}
public void setCargoNo(String cargoNo) {
this.cargoNo = cargoNo;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public String getProductModel() {
return productModel;
}
public void setProductModel(String productModel) {
this.productModel = productModel;
}
public String getPdDetailId() {
return pdDetailId;
}
public void setPdDetailId(String pdDetailId) {
this.pdDetailId = pdDetailId;
}
public String getPdProductName() {
return pdProductName;
}
public void setPdProductName(String pdProductName) {
this.pdProductName = pdProductName;
}
public String getPdModel() {
return pdModel;
}
public void setPdModel(String pdModel) {
this.pdModel = pdModel;
}
public String getPdUnit() {
return pdUnit;
}
public void setPdUnit(String pdUnit) {
this.pdUnit = pdUnit;
}
public String getPdUnitPrice() {
return pdUnitPrice;
}
public void setPdUnitPrice(String pdUnitPrice) {
this.pdUnitPrice = pdUnitPrice;
}
public String getPdAuxUnit() {
return pdAuxUnit;
}
public void setPdAuxUnit(String pdAuxUnit) {
this.pdAuxUnit = pdAuxUnit;
}
public String getPdAttr1() {
return pdAttr1;
}
public void setPdAttr1(String pdAttr1) {
this.pdAttr1 = pdAttr1;
}
public String getPdAttr2() {
return pdAttr2;
}
public void setPdAttr2(String pdAttr2) {
this.pdAttr2 = pdAttr2;
}
public String getPdQuantity() {
return pdQuantity;
}
public void setPdQuantity(String pdQuantity) {
this.pdQuantity = pdQuantity;
}
public String getPdInQty() {
return pdInQty;
}
public void setPdInQty(String pdInQty) {
this.pdInQty = pdInQty;
}
public String getPdAuxQuantity() {
return pdAuxQuantity;
}
public void setPdAuxQuantity(String pdAuxQuantity) {
this.pdAuxQuantity = pdAuxQuantity;
}
public String getPdTotalPrice() {
return pdTotalPrice;
}
public void setPdTotalPrice(String pdTotalPrice) {
this.pdTotalPrice = pdTotalPrice;
}
public String getPdCostUnitPrice() {
return pdCostUnitPrice;
}
public void setPdCostUnitPrice(String pdCostUnitPrice) {
this.pdCostUnitPrice = pdCostUnitPrice;
}
public String getPdTotalPrice2() {
return pdTotalPrice2;
}
public void setPdTotalPrice2(String pdTotalPrice2) {
this.pdTotalPrice2 = pdTotalPrice2;
}
public String getPdAccountCostTotal() {
return pdAccountCostTotal;
}
public void setPdAccountCostTotal(String pdAccountCostTotal) {
this.pdAccountCostTotal = pdAccountCostTotal;
}
public String getPdAccountQuantity() {
return pdAccountQuantity;
}
public void setPdAccountQuantity(String pdAccountQuantity) {
this.pdAccountQuantity = pdAccountQuantity;
}
public String getPdAccountStatus() {
return pdAccountStatus;
}
public void setPdAccountStatus(String pdAccountStatus) {
this.pdAccountStatus = pdAccountStatus;
}
public String getPdBatchNo() {
return pdBatchNo;
}
public void setPdBatchNo(String pdBatchNo) {
this.pdBatchNo = pdBatchNo;
}
public String getPdSerialNo() {
return pdSerialNo;
}
public void setPdSerialNo(String pdSerialNo) {
this.pdSerialNo = pdSerialNo;
}
public String getPdProdDate() {
return pdProdDate;
}
public void setPdProdDate(String pdProdDate) {
this.pdProdDate = pdProdDate;
}
public String getPdValidDate() {
return pdValidDate;
}
public void setPdValidDate(String pdValidDate) {
this.pdValidDate = pdValidDate;
}
public String getPdArrivalDate() {
return pdArrivalDate;
}
public void setPdArrivalDate(String pdArrivalDate) {
this.pdArrivalDate = pdArrivalDate;
}
public String getPdRemark() {
return pdRemark;
}
public void setPdRemark(String pdRemark) {
this.pdRemark = pdRemark;
}
public String getPdCustom1() {
return pdCustom1;
}
public void setPdCustom1(String pdCustom1) {
this.pdCustom1 = pdCustom1;
}
public String getPdCustom2() {
return pdCustom2;
}
public void setPdCustom2(String pdCustom2) {
this.pdCustom2 = pdCustom2;
}
public String getPdCustom3() {
return pdCustom3;
}
public void setPdCustom3(String pdCustom3) {
this.pdCustom3 = pdCustom3;
}
public String getPdCustom4() {
return pdCustom4;
}
public void setPdCustom4(String pdCustom4) {
this.pdCustom4 = pdCustom4;
}
public String getPdCustom5() {
return pdCustom5;
}
public void setPdCustom5(String pdCustom5) {
this.pdCustom5 = pdCustom5;
}
public String getPdCustom6() {
return pdCustom6;
}
public void setPdCustom6(String pdCustom6) {
this.pdCustom6 = pdCustom6;
}
public String getPdLoader() {
return pdLoader;
}
public void setPdLoader(String pdLoader) {
this.pdLoader = pdLoader;
}
public String getRows() {
return Rows;
}
public void setRows(String rows) {
Rows = rows;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getKuin() {
return Kuin;
}
public void setKuin(String kuin) {
Kuin = kuin;
}
public String getComplete1() {
return Complete1;
}
public void setComplete1(String complete1) {
Complete1 = complete1;
}
public String getCateid() {
return Cateid;
}
public void setCateid(String cateid) {
Cateid = cateid;
}
public String getDate3() {
return Date3;
}
public void setDate3(String date3) {
Date3 = date3;
}
public String getDate5() {
return Date5;
}
public void setDate5(String date5) {
Date5 = date5;
}
public String getCatein() {
return Catein;
}
public void setCatein(String catein) {
Catein = catein;
}
public String getIntro2() {
return Intro2;
}
public void setIntro2(String intro2) {
Intro2 = intro2;
}
public String getIntro() {
return Intro;
}
public void setIntro(String intro) {
Intro = intro;
}
public String getCaigou() {
return Caigou;
}
public void setCaigou(String caigou) {
Caigou = caigou;
}
public String getDate7() {
return Date7;
}
public void setDate7(String date7) {
Date7 = date7;
}
public String getKg() {
return Kg;
}
public void setKg(String kg) {
Kg = kg;
}
public String getSort1() {
return Sort1;
}
public void setSort1(String sort1) {
Sort1 = sort1;
}
public String getRkbh() {
return Rkbh;
}
public void setRkbh(String rkbh) {
Rkbh = rkbh;
}
public String getStatus() {
return Status;
}
public void setStatus(String status) {
Status = status;
}
public String getKuinList() {
return KuinList;
}
public void setKuinList(String kuinList) {
KuinList = kuinList;
}
public String getSysIcusIInheritIdIidI413() {
return sysIcusIInheritIdIidI413;
}
public void setSysIcusIInheritIdIidI413(String sysIcusIInheritIdIidI413) {
this.sysIcusIInheritIdIidI413 = sysIcusIInheritIdIidI413;
}
public String getSysIcusIInheritIdIidI414() {
return sysIcusIInheritIdIidI414;
}
public void setSysIcusIInheritIdIidI414(String sysIcusIInheritIdIidI414) {
this.sysIcusIInheritIdIidI414 = sysIcusIInheritIdIidI414;
}
public String getSysIcusIInheritIdIidI415() {
return sysIcusIInheritIdIidI415;
}
public void setSysIcusIInheritIdIidI415(String sysIcusIInheritIdIidI415) {
this.sysIcusIInheritIdIidI415 = sysIcusIInheritIdIidI415;
}
}

View File

@@ -29,6 +29,13 @@ public interface BasStockMapper
*/
public List<BasStock> selectBasStockListByProductId(String productId);
/**
* 查询指定物料所在的存储区组列表(去重)
* @param productId 物料ID
* @return 存储区组列表
*/
public List<String> selectGroupCodingNosByProductId(String productId);
/**
* 查询库存信息列表

View File

@@ -29,6 +29,13 @@ public interface IBasStockService
*/
public List<BasStock> selectBasStockListByProductId(String productId);
/**
* 查询指定物料所在的存储区组列表(去重)
* @param productId 物料ID
* @return 存储区组列表
*/
public List<String> selectGroupCodingNosByProductId(String productId);
/**
* 查询库存信息列表
*

View File

@@ -62,6 +62,11 @@ public class BasStockServiceImpl implements IBasStockService
return basStockMapper.selectBasStockListByProductId(productId);
}
@Override
public List<String> selectGroupCodingNosByProductId(String productId) {
return basStockMapper.selectGroupCodingNosByProductId(productId);
}
/**
* 查询库存信息列表
*

View File

@@ -158,336 +158,286 @@ public class InStockinDetailN extends BaseEntity
/** $column.columnComment */
private String stockinDetailId;
public void setErpDetailId(int erpDetailId)
{
this.erpDetailId = erpDetailId;
}
public int getErpDetailId()
{
public int getErpDetailId() {
return erpDetailId;
}
public void setStockinGuid(String stockinGuid)
{
this.stockinGuid = stockinGuid;
public void setErpDetailId(int erpDetailId) {
this.erpDetailId = erpDetailId;
}
public String getStockinGuid()
{
public String getStockinGuid() {
return stockinGuid;
}
public void setStockinId(String stockinId)
{
this.stockinId = stockinId;
public void setStockinGuid(String stockinGuid) {
this.stockinGuid = stockinGuid;
}
public String getStockinId()
{
public String getStockinId() {
return stockinId;
}
public void setProductName(String productName)
{
this.productName = productName;
public void setStockinId(String stockinId) {
this.stockinId = stockinId;
}
public String getProductName()
{
public String getProductName() {
return productName;
}
public void setProductModel(String productModel)
{
this.productModel = productModel;
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductModel()
{
public String getProductModel() {
return productModel;
}
public void setUnit(String unit)
{
this.unit = unit;
public void setProductModel(String productModel) {
this.productModel = productModel;
}
public String getUnit()
{
public String getUnit() {
return unit;
}
public void setUnitPrice(BigDecimal unitPrice)
{
this.unitPrice = unitPrice;
public void setUnit(String unit) {
this.unit = unit;
}
public BigDecimal getUnitPrice()
{
public BigDecimal getUnitPrice() {
return unitPrice;
}
public void setAuxUnit(String auxUnit)
{
this.auxUnit = auxUnit;
public void setUnitPrice(BigDecimal unitPrice) {
this.unitPrice = unitPrice;
}
public String getAuxUnit()
{
public String getAuxUnit() {
return auxUnit;
}
public void setAttr1(String attr1)
{
this.attr1 = attr1;
public void setAuxUnit(String auxUnit) {
this.auxUnit = auxUnit;
}
public String getAttr1()
{
public String getAttr1() {
return attr1;
}
public void setAttr2(String attr2)
{
this.attr2 = attr2;
public void setAttr1(String attr1) {
this.attr1 = attr1;
}
public String getAttr2()
{
public String getAttr2() {
return attr2;
}
public void setQuantity(BigDecimal quantity)
{
this.quantity = quantity;
public void setAttr2(String attr2) {
this.attr2 = attr2;
}
public BigDecimal getQuantity()
{
public BigDecimal getQuantity() {
return quantity;
}
public void setInQuantity(BigDecimal inQuantity)
{
this.inQuantity = inQuantity;
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public BigDecimal getInQuantity()
{
public BigDecimal getInQuantity() {
return inQuantity;
}
public void setAuxQuantity(BigDecimal auxQuantity)
{
this.auxQuantity = auxQuantity;
public void setInQuantity(BigDecimal inQuantity) {
this.inQuantity = inQuantity;
}
public BigDecimal getAuxQuantity()
{
public BigDecimal getAuxQuantity() {
return auxQuantity;
}
public void setTotalPrice(BigDecimal totalPrice)
{
this.totalPrice = totalPrice;
public void setAuxQuantity(BigDecimal auxQuantity) {
this.auxQuantity = auxQuantity;
}
public BigDecimal getTotalPrice()
{
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setCostUnitPrice(BigDecimal costUnitPrice)
{
this.costUnitPrice = costUnitPrice;
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public BigDecimal getCostUnitPrice()
{
public BigDecimal getCostUnitPrice() {
return costUnitPrice;
}
public void setCostTotalPrice(BigDecimal costTotalPrice)
{
this.costTotalPrice = costTotalPrice;
public void setCostUnitPrice(BigDecimal costUnitPrice) {
this.costUnitPrice = costUnitPrice;
}
public BigDecimal getCostTotalPrice()
{
public BigDecimal getCostTotalPrice() {
return costTotalPrice;
}
public void setAccountingCostTotal(BigDecimal accountingCostTotal)
{
this.accountingCostTotal = accountingCostTotal;
public void setCostTotalPrice(BigDecimal costTotalPrice) {
this.costTotalPrice = costTotalPrice;
}
public BigDecimal getAccountingCostTotal()
{
public BigDecimal getAccountingCostTotal() {
return accountingCostTotal;
}
public void setAccountingQuantity(BigDecimal accountingQuantity)
{
this.accountingQuantity = accountingQuantity;
public void setAccountingCostTotal(BigDecimal accountingCostTotal) {
this.accountingCostTotal = accountingCostTotal;
}
public BigDecimal getAccountingQuantity()
{
public BigDecimal getAccountingQuantity() {
return accountingQuantity;
}
public void setAccountingStatus(Long accountingStatus)
{
this.accountingStatus = accountingStatus;
public void setAccountingQuantity(BigDecimal accountingQuantity) {
this.accountingQuantity = accountingQuantity;
}
public Long getAccountingStatus()
{
public Long getAccountingStatus() {
return accountingStatus;
}
public void setBatchNo(String batchNo)
{
this.batchNo = batchNo;
public void setAccountingStatus(Long accountingStatus) {
this.accountingStatus = accountingStatus;
}
public String getBatchNo()
{
public String getBatchNo() {
return batchNo;
}
public void setSerialNo(String serialNo)
{
this.serialNo = serialNo;
public void setBatchNo(String batchNo) {
this.batchNo = batchNo;
}
public String getSerialNo()
{
public String getSerialNo() {
return serialNo;
}
public void setProductionDate(String productionDate)
{
this.productionDate = productionDate;
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
public String getProductionDate()
{
public String getProductionDate() {
return productionDate;
}
public void setExpiryDate(String expiryDate)
{
this.expiryDate = expiryDate;
public void setProductionDate(String productionDate) {
this.productionDate = productionDate;
}
public String getExpiryDate()
{
public String getExpiryDate() {
return expiryDate;
}
public void setArrivalDate(String arrivalDate)
{
this.arrivalDate = arrivalDate;
public void setExpiryDate(String expiryDate) {
this.expiryDate = expiryDate;
}
public String getArrivalDate()
{
public String getArrivalDate() {
return arrivalDate;
}
public void setCustom1(String custom1)
{
this.custom1 = custom1;
public void setArrivalDate(String arrivalDate) {
this.arrivalDate = arrivalDate;
}
public String getCustom1()
{
public String getCustom1() {
return custom1;
}
public void setCustom2(String custom2)
{
this.custom2 = custom2;
public void setCustom1(String custom1) {
this.custom1 = custom1;
}
public String getCustom2()
{
public String getCustom2() {
return custom2;
}
public void setCustom3(String custom3)
{
this.custom3 = custom3;
public void setCustom2(String custom2) {
this.custom2 = custom2;
}
public String getCustom3()
{
public String getCustom3() {
return custom3;
}
public void setCustom4(String custom4)
{
this.custom4 = custom4;
public void setCustom3(String custom3) {
this.custom3 = custom3;
}
public String getCustom4()
{
public String getCustom4() {
return custom4;
}
public void setCustom5(String custom5)
{
this.custom5 = custom5;
public void setCustom4(String custom4) {
this.custom4 = custom4;
}
public String getCustom5()
{
public String getCustom5() {
return custom5;
}
public void setCustom6(String custom6)
{
this.custom6 = custom6;
public void setCustom5(String custom5) {
this.custom5 = custom5;
}
public String getCustom6()
{
public String getCustom6() {
return custom6;
}
public void setStevedore(String stevedore)
{
this.stevedore = stevedore;
public void setCustom6(String custom6) {
this.custom6 = custom6;
}
public String getStevedore()
{
public BigDecimal getSmNum() {
return smNum;
}
public void setSmNum(BigDecimal smNum) {
this.smNum = smNum;
}
public BigDecimal getFinishNum() {
return finishNum;
}
public void setFinishNum(BigDecimal finishNum) {
this.finishNum = finishNum;
}
public String getStevedore() {
return stevedore;
}
public void setOrderSrc(String orderSrc)
{
this.orderSrc = orderSrc;
public void setStevedore(String stevedore) {
this.stevedore = stevedore;
}
public String getOrderSrc()
{
public String getOrderSrc() {
return orderSrc;
}
public void setStockinDetailId(String stockinDetailId)
{
this.stockinDetailId = stockinDetailId;
public void setOrderSrc(String orderSrc) {
this.orderSrc = orderSrc;
}
public String getStockinDetailId()
{
public String getStockinDetailId() {
return stockinDetailId;
}
public void setStockinDetailId(String stockinDetailId) {
this.stockinDetailId = stockinDetailId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@@ -0,0 +1,22 @@
package com.ruoyi.task;
import com.ruoyi.api.service.impl.ToErpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("ErpTask")
public class ErpTask {
@Autowired
private ToErpServiceImpl toErpServiceImpl;
public void getInStock(){
toErpServiceImpl.getInStock();
}
public void getOutStock(){
toErpServiceImpl.receiveOutStockList();
}
public void getProductList(){
toErpServiceImpl.receiveProduct();
}
}

View File

@@ -2,18 +2,18 @@
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
druid:
# 主库数据源
master:
url: jdbc:sqlserver://172.16.2.170:1433;databaseName=FT542-wms;encrypt=true;trustServerCertificate=true;
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT542-wms;encrypt=true;trustServerCertificate=true
username: sa
password: Flrd0914.
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url: jdbc:mariadb://172.16.2.170:3307/mydb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mariadb://127.0.0.1:3307/mydb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Flrd0914.
# 初始连接数
@@ -35,7 +35,7 @@ spring:
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM sys_oper_log
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false

View File

@@ -71,7 +71,7 @@ spring:
# redis 配置
redis:
# 地址
host: 172.16.2.170
host: 127.0.0.1
# 端口,默认为6379
port: 6379
# 数据库索引
@@ -131,7 +131,7 @@ token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
secret: ft542wms
# 令牌有效期(默认30分钟)
expireTime: 30

View File

@@ -17,7 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT COUNT(1)
FROM mydo_job_finish
WHERE CONVERT(varchar(10), create_time, 120) = #{createTime}
AND in_or_out >= 20
AND in_or_out > 20
</select>
<!-- 查询当月每日入库出库统计 -->
@@ -25,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT
DAY(create_time) as date,
SUM(CASE WHEN in_or_out &lt; 20 THEN 1 ELSE 0 END) as '入库',
SUM(CASE WHEN in_or_out >= 20 THEN 1 ELSE 0 END) as '出库'
SUM(CASE WHEN in_or_out > 20 THEN 1 ELSE 0 END) as '出库'
FROM mydo_job_finish
WHERE YEAR(create_time) = #{year}
AND MONTH(create_time) = #{month}
@@ -33,4 +33,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ORDER BY date
</select>
<!-- 查询指定日期范围内的每日入库出库统计 -->
<select id="selectDateRangeStatistics" resultType="java.util.Map">
SELECT
CONVERT(varchar(10), create_time, 120) as date,
SUM(CASE WHEN in_or_out &lt; 20 THEN 1 ELSE 0 END) as inCount,
SUM(CASE WHEN in_or_out > 20 THEN 1 ELSE 0 END) as outCount
FROM mydo_job_finish
WHERE CONVERT(varchar(10), create_time, 120) >= #{startDate}
AND CONVERT(varchar(10), create_time, 120) &lt;= #{endDate}
GROUP BY CONVERT(varchar(10), create_time, 120)
</select>
<!-- 查询当年每月入库出库统计 -->
<select id="selectYearlyStatistics" resultType="java.util.Map">
SELECT
MONTH(create_time) as month,
SUM(CASE WHEN in_or_out &lt; 20 THEN 1 ELSE 0 END) as inCount,
SUM(CASE WHEN in_or_out > 20 THEN 1 ELSE 0 END) as outCount
FROM mydo_job_finish
WHERE YEAR(create_time) = #{year}
GROUP BY MONTH(create_time)
ORDER BY month
</select>
</mapper>

View File

@@ -263,4 +263,82 @@
<if test="spare7 != null and spare7 != ''">and bs.spare7 = #{spare7}</if>
<if test="stockStatus != null and stockStatus != ''">and bs.stock_status = #{stockStatus}</if>
</select>
<select id="selectEmptyCargoSpaceInGroups" resultMap="BasCargoSpaceResult">
SELECT TOP 1 bcs.cargo_space_id, bcs.group_coding_no, bcs.status
FROM bas_cargo_space bcs
WHERE bcs.status = '1'
AND bcs.locked = 'N'
AND bcs.group_coding_no IN
<foreach item="group" collection="groups" open="(" separator="," close=")">
#{group}
</foreach>
ORDER BY bcs.group_coding DESC
</select>
<select id="selectFirstEmptyGroupCodingNo" resultType="String">
SELECT TOP 1 group_coding_no
FROM bas_cargo_space
WHERE group_coding_no BETWEEN '001' AND '048'
GROUP BY group_coding_no
HAVING SUM(CASE WHEN status != '1' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN locked != 'N' THEN 1 ELSE 0 END) = 0
ORDER BY group_coding_no ASC
</select>
<select id="selectCountByStatus" resultType="int">
SELECT COUNT(*) FROM bas_cargo_space WHERE status = #{status}
</select>
<select id="selectEmptyCargoSpaceInGroupsAndLayers" resultMap="BasCargoSpaceResult">
SELECT TOP 1 bcs.cargo_space_id, bcs.group_coding_no, bcs.status
FROM bas_cargo_space bcs
WHERE bcs.status = '1'
AND bcs.locked = 'N'
AND bcs.group_coding_no IN
<foreach item="group" collection="groups" open="(" separator="," close=")">
#{group}
</foreach>
AND bcs.the_floor IN
<foreach item="layer" collection="layers" open="(" separator="," close=")">
#{layer}
</foreach>
ORDER BY bcs.group_coding DESC
</select>
<select id="selectFirstEmptyGroupCodingNoWithLayer" resultType="String">
SELECT TOP 1 group_coding_no
FROM bas_cargo_space
WHERE group_coding_no BETWEEN '001' AND '048'
GROUP BY group_coding_no
HAVING SUM(CASE WHEN status != '1' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN locked != 'N' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN the_floor IN
<foreach item="layer" collection="layers" open="(" separator="," close=")">
#{layer}
</foreach>
THEN 1 ELSE 0 END) > 0
AND group_coding_no NOT IN (
SELECT DISTINCT group_coding_no
FROM bas_cargo_space
WHERE the_floor IN (
SELECT DISTINCT the_floor
FROM bas_cargo_space
WHERE status IN ('3', '4')
)
)
ORDER BY group_coding_no ASC
</select>
<select id="selectEmptyCargoSpaceExcludeLayers" resultMap="BasCargoSpaceResult">
SELECT TOP 1 bcs.*
FROM bas_cargo_space bcs
WHERE bcs.status = '1'
AND bcs.locked = 'N'
AND bcs.the_floor NOT IN
<foreach item="layer" collection="layers" open="(" separator="," close=")">
#{layer}
</foreach>
ORDER BY bcs.group_coding_no ASC, bcs.group_coding DESC
</select>
</mapper>

View File

@@ -12,10 +12,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productName" column="product_name" />
<result property="groupCodingNo" column="group_coding_no" />
<result property="quantity" column="quantity" />
<result property="inDate" column="in_date" />
</resultMap>
<sql id="selectViewHandAllotStockVo">
select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity from view_hand_allot_stock
select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity, in_date from view_hand_allot_stock
</sql>
<select id="selectViewHandAllotStockList" parameterType="ViewHandAllotStock" resultMap="ViewHandAllotStockResult">
@@ -28,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
<if test="groupCodingNo != null and groupCodingNo != ''"> and group_coding_no = #{groupCodingNo}</if>
<if test="quantity != null and quantity != ''"> and quantity = #{quantity}</if>
<if test="inDate != null and inDate != ''"> and in_date = #{inDate}</if>
</where>
</select>
@@ -46,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">product_name,</if>
<if test="groupCodingNo != null">group_coding_no,</if>
<if test="quantity != null">quantity,</if>
<if test="inDate != null">in_date,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="onlyIdentity != null">#{onlyIdentity},</if>
@@ -55,6 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">#{productName},</if>
<if test="groupCodingNo != null">#{groupCodingNo},</if>
<if test="quantity != null">#{quantity},</if>
<if test="inDate != null">#{inDate},</if>
</trim>
</insert>
@@ -67,6 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">product_name = #{productName},</if>
<if test="groupCodingNo != null">group_coding_no = #{groupCodingNo},</if>
<if test="quantity != null">quantity = #{quantity},</if>
<if test="inDate != null">in_date = #{inDate},</if>
</trim>
where only_identity = #{onlyIdentity}
</update>
@@ -81,4 +86,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{onlyIdentity}
</foreach>
</delete>
</mapper>
</mapper>

View File

@@ -20,9 +20,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</sql>
<select id="selectTrayMsgList" parameterType="TrayMsg" resultMap="TrayMsgResult">
select t.id, t.tray_code, t.stockin_detail_id, t.quantity,p.product_name,t.warehouse_id,w.warehouse_name,w.warehouse_type from tray_msg t
left join in_stockin_detail d on t.stockin_detail_id = d.stockin_detail_id
left join bas_product p on d.product_id=p.product_id
select t.id, t.tray_code, t.stockin_detail_id, t.quantity,d.product_name,t.warehouse_id,w.warehouse_name,w.warehouse_type from tray_msg t
left join in_stockin_detail_n d on t.stockin_detail_id = d.stockin_detail_id
left join bas_product p on d.product_model=p.product_id
left join bas_warehouse w on t.warehouse_id=w.warehouse_id
<where>
<if test="trayCode != null and trayCode != ''"> and t.tray_code = #{trayCode}</if>

View File

@@ -225,6 +225,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where bs.product_id = #{productId}
</select>
<select id="selectGroupCodingNosByProductId" parameterType="string" resultType="java.lang.String">
SELECT DISTINCT bcs.group_coding_no
FROM bas_stock bs
JOIN bas_cargo_space bcs ON bs.cargo_space_id = bcs.cargo_space_id
WHERE bs.product_id = #{productId}
AND bcs.group_coding_no IS NOT NULL
<!-- 1.查询的group_coding_no必须保证所有货位都必须满足 status='1' 且 locked='N' -->
AND NOT EXISTS (
SELECT 1
FROM bas_cargo_space sub_bcs
WHERE sub_bcs.group_coding_no = bcs.group_coding_no
AND sub_bcs.locked != 'N'
)
<!-- 2.group_coding_no的thefloor必须在全部的记录都没有status=3/4的the_floor中 -->
AND bcs.the_floor NOT IN (
SELECT the_floor
FROM bas_cargo_space
WHERE status IN ('3', '4')
AND the_floor IS NOT NULL
)
</select>
<insert id="insertBasStock" parameterType="BasStock">
insert into bas_stock
<trim prefix="(" suffix=")" suffixOverrides=",">
@@ -417,8 +439,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 已移除 update set for stacking_id -->
<if test="productId != null">product_id = #{productId},</if>
<if test="productName != null">product_name = #{productName},</if>
<!-- 以下为非 bas_stock 字段,注释保留 -->
<!-- <if test="productName != null">product_name = #{productName},</if> -->
<!-- <if test="voltage != null">voltage = #{voltage},</if> -->
<!-- power 字段已移除 -->
<!-- <if test="netWeight != null">net_weight = #{netWeight},</if> -->

View File

@@ -176,7 +176,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<select id="selectInStockinNByStockinIdAndDate" resultMap="InStockinNResult">
<include refid="selectInStockinNVo"/>
where erp_stockin_id = #{stockinId} and created_at like concat(#{date}, '%')
where erp_stockin_id = #{stockinId}
</select>
<select id="selectInStockinNByStockinId" parameterType="String" resultMap="InStockinNResult">
<include refid="selectInStockinNVo"/>

View File

@@ -163,7 +163,7 @@ public class Constants
/**
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
*/
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" };
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" ,"com.ruoyi.task"};
/**
* 定时任务违规的字符

View File

@@ -35,6 +35,7 @@
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -36,11 +36,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND invoke_target like concat('%', #{invokeTarget}, '%')
</if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
and date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
</if>
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
and date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
</if>
and convert(varchar(8), create_time, 112) &gt;= convert(varchar(8), cast(#{params.beginTime} as datetime), 112)
</if>
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
and convert(varchar(8), create_time, 112) &lt;= convert(varchar(8), cast(#{params.endTime} as datetime), 112)
</if>
</where>
order by create_time desc
</select>
@@ -87,7 +87,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>
sysdate()
GETDATE()
)
</insert>

View File

@@ -75,7 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status !=null">status = #{status},</if>
<if test="remark != null and remark != ''">remark = #{remark},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
update_time = sysdate()
update_time = GETDATE()
</set>
where job_id = #{jobId}
</update>
@@ -104,7 +104,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null and status != ''">#{status},</if>
<if test="remark != null and remark != ''">#{remark},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
GETDATE()
)
</insert>

View File

@@ -35,13 +35,10 @@ export function hangInvalidCheckJob(data) {
})
}
export function pointOut(groupCodingNo, outQuantity) {
export function pointOut(params) {
return request({
url: '/job/outmydoJob/pointOut',
method: 'get',
params: {
groupCodingNo: groupCodingNo,
outQuantity: outQuantity
}
params: params
})
}

View File

@@ -45,6 +45,15 @@ export function getOutStockoutDetail(query) {
data: data
})
}
// 删除出库单据
export function delOutStockout(stockoutGuids) {
return request({
url: '/out/outStockout/' + stockoutGuids,
method: 'delete'
})
}
//修改单据状态
export function updateOutStockStatus(params)
{

View File

@@ -194,7 +194,8 @@
format="CODE39"
width="2"
height="100"
display-value
font-options="bold"
font-size="28"
/>
</div>
</vue-easy-print>

View File

@@ -97,6 +97,16 @@
v-hasPermi="['out:outStockout:changeStatus']"
>{{'单据作废'}}</el-button> <!-- 单据作废 -->
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
size="mini"
:disabled="selectedRows.length === 0"
@click="handleDelete"
v-hasPermi="['out:outStockout:remove']"
>强制删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
@@ -238,7 +248,21 @@
<!-- <el-table-column label="出库子单编号" align="center" prop="stockoutDetailId" width="160" /> -->
<el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="计划数量" align="center" prop="quantity" />
<el-table-column label="计划数量" align="center" prop="quantity" width="160">
<template slot-scope="scope">
<el-input-number
v-if="isAddMode && !isView"
v-model="scope.row.quantity"
:min="0"
:step="1"
:controls="false"
size="mini"
style="width: 120px"
@change="handleDetailQuantityChange(scope.row)"
/>
<span v-else>{{ scope.row.quantity }}</span>
</template>
</el-table-column>
<el-table-column label="分配数量" align="center" prop="allotQuantity" />
<el-table-column label="实际数量" align="center" prop="assignNum" />
</el-table>
@@ -246,6 +270,7 @@
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" plain @click="handleAutoAllot" v-if="!isAddMode" v-hasPermi="['out:outStockout:autoAllot']">自动分配</el-button>
<!-- <el-button type="primary" plain @click="handleManualAllot" v-if="!isAddMode" v-hasPermi="['out:outStockout:manualAllot']">手动分配</el-button>-->
<el-button type="primary" @click="submitForm" v-if="!isView">确 定</el-button>
<el-button @click="open = false">关 闭</el-button>
</div>
@@ -356,52 +381,55 @@
<!-- 库存明细表格 -->
<el-table ref="stockTable" v-loading="stockLoading" :data="stockList" @selection-change="handleStockSelectionChange" max-height="400">
<el-table-column type="selection" width="55" align="center" :selectable="stockSelectable" />
<el-table-column label="库存编码" align="center" prop="stockId" />
<el-table-column label="货位名称" align="center" prop="cargoSpaceName" />
<el-table-column label="仓库" align="center" prop="warehouseId" >
<template slot-scope="scope">
<dict-tag :options="dict.type.warehouse" :value="scope.row.warehouseId"/>
</template>
</el-table-column>
<el-table-column label="批次号" align="center" prop="lotNo" />
<el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="规格型号" align="center" prop="netWeight" />
<el-table-column label="图号" align="center" prop="grossWeight" />
<el-table-column label="库存数量" align="center" prop="quantity" width="80" />
<el-table-column label="来源" align="center" prop="spare1" >
<template slot-scope="scope">
<dict-tag :options="dict.type.origin_type" :value="scope.row.spare1"/>
</template>
<!-- <el-table-column label="库存编码" align="center" prop="stockId" />-->
<!-- <el-table-column label="货位名称" align="center" prop="cargoSpaceName" />-->
<el-table-column label="通道编号" align="center" prop="groupCodingNo" width="80" />
<!-- <el-table-column label="仓库" align="center" prop="warehouseId" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.warehouse" :value="scope.row.warehouseId"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="批次号" align="center" prop="lotNo" />-->
<el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="最近入库时间" align="center" prop="inDate" width="160" />
<!-- <el-table-column label="规格型号" align="center" prop="netWeight" />-->
<!-- <el-table-column label="图号" align="center" prop="grossWeight" />-->
<el-table-column label="库存数量" align="center" prop="quantity" />
</el-table-column>
<el-table-column label="套账" align="center" prop="spare3" >
<template slot-scope="scope">
<dict-tag :options="dict.type.account_type" :value="scope.row.spare3"/>
</template>
</el-table-column>
<el-table-column label="用途" align="center" prop="spare4" >
<template slot-scope="scope">
<dict-tag :options="dict.type.purpose_type" :value="scope.row.model"/>
</template>
</el-table-column>
<el-table-column label="台次" align="center" prop="spare5" />
<el-table-column label="入库单价" align="center" prop="spare6" />
<el-table-column label="状态" align="center" prop="voltage" >
<template slot-scope="scope">
<dict-tag :options="dict.type.turnover_type" :value="scope.row.voltage"/>
</template>
</el-table-column>
<el-table-column label="件次" align="center" prop="power" />
<!-- <el-table-column label="供应商" align="center" prop="phase" />-->
<el-table-column label="供应商" align="center" prop="inClassId" />
<el-table-column label="管理号" align="center" prop="distribution" />
<el-table-column label="产品质量" align="center" prop="spare8" >
<template slot-scope="scope">
<dict-tag :options="dict.type.quality_type" :value="scope.row.spare8"/>
</template>
</el-table-column>
<el-table-column label="合同号" align="center" prop="orderId" />
<!-- <el-table-column label="来源" align="center" prop="spare1" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.origin_type" :value="scope.row.spare1"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="套账" align="center" prop="spare3" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.account_type" :value="scope.row.spare3"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="用途" align="center" prop="spare4" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.purpose_type" :value="scope.row.model"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="台次" align="center" prop="spare5" />-->
<!-- <el-table-column label="入库单价" align="center" prop="spare6" />-->
<!-- <el-table-column label="状态" align="center" prop="voltage" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.turnover_type" :value="scope.row.voltage"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="件次" align="center" prop="power" />-->
<!--&lt;!&ndash; <el-table-column label="供应商" align="center" prop="phase" />&ndash;&gt;-->
<!-- <el-table-column label="供应商" align="center" prop="inClassId" />-->
<!-- <el-table-column label="管理号" align="center" prop="distribution" />-->
<!-- <el-table-column label="产品质量" align="center" prop="spare8" >-->
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.quality_type" :value="scope.row.spare8"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="合同号" align="center" prop="orderId" />-->
</el-table>
@@ -422,7 +450,7 @@
</template>
<script>
import { listOutStockout,autoAllot,listOut,manualAllot, saveOutStock, listProductAndStock, getOutStockList} from "@/api/out/outStockout"
import { listOutStockout,autoAllot,listOut,manualAllot, saveOutStock, listProductAndStock, getOutStockList, delOutStockout} from "@/api/out/outStockout"
import { getOutStockoutDetail,updateOutStockStatus } from "@/api/out/outStockout"
import {listWarehouse} from "@/api/bas/warehouse";
@@ -613,6 +641,10 @@ export default {
this.selectedProducts = selection
},
confirmSelectProduct() {
if (this.selectedProducts.length === 0) {
this.$modal.msgWarning("请选择物料")
return
}
const duplicate = this.selectedProducts.filter(sel =>
this.outStockDetailList.some(ex => ex.productId === sel.productId)
)
@@ -628,8 +660,13 @@ export default {
assignNum: 0
}))
this.outStockDetailList.push(...items)
this.selectedProducts = []
this.productSelectVisible = false
},
handleDetailQuantityChange(row) {
const quantity = Number(row.quantity)
row.quantity = Number.isNaN(quantity) ? 0 : quantity
},
handleDeleteDetails() {
if (this.selectedDetailRows.length === 0) {
this.$modal.msgWarning("请选择要删除的物料")
@@ -751,6 +788,21 @@ export default {
handleSelectionChange(selection) {
this.selectedRows = selection
},
/** 强制删除按钮操作 */
handleDelete() {
if (this.selectedRows.length === 0) {
this.$modal.msgError('请选择数据')
return
}
const stockoutGuids = this.selectedRows.map(row => row.stockoutGuid)
this.$modal.confirm('是否确认删除选中的出库单据?').then(function () {
return delOutStockout(stockoutGuids)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 子表多选框选中数据 */
handleDetailSelectionChange(selection) {
this.selectedDetailRows = selection
@@ -867,6 +919,7 @@ export default {
}
// 显示库存明细弹窗
this.selectedStockRows = []
this.stockDialogVisible = true
this.resetStockQuery()
this.getStockList()

View File

@@ -118,12 +118,12 @@
<el-form-item label="托盘编码" prop="trayCode">
<el-input v-model="form.trayCode" placeholder="请输入托盘编码" />
</el-form-item>
<el-form-item label="入库子单ID" prop="stockinDetailId">
<el-input v-model="form.stockinDetailId" placeholder="请输入入库子单ID" />
</el-form-item>
<el-form-item label="仓库ID" prop="warehouseId">
<el-input v-model="form.warehouseId" placeholder="请输入仓库ID" />
</el-form-item>
<!-- <el-form-item label="入库子单ID" prop="stockinDetailId">-->
<!-- <el-input v-model="form.stockinDetailId" placeholder="请输入入库子单ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库ID" prop="warehouseId">-->
<!-- <el-input v-model="form.warehouseId" placeholder="请输入仓库ID" />-->
<!-- </el-form-item>-->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>

View File

@@ -64,6 +64,7 @@
<el-table-column label="产品编码" align="center" prop="productId" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="通道组编码" align="center" prop="groupCodingNo" />
<el-table-column label="最近入库时间" align="center" prop="inDate" width="160" />
<el-table-column label="库存数量" align="center" prop="quantity" />
</el-table>
@@ -198,7 +199,8 @@ export default {
// 选中的库存数据
selectedStockData: [],
selectedTotalQuantity: 0
selectedTotalQuantity: 0,
selectedRows: []
}
},
created() {
@@ -283,6 +285,7 @@ export default {
},
// 多选框选中数据
handleSelectionChange(selection) {
this.selectedRows = selection
this.ids = selection.map(item => item.stockId)
this.single = selection.length!==1
this.multiple = !selection.length
@@ -340,8 +343,10 @@ export default {
return;
}
// 获取选中的完整数据
const selectedData = this.managementList.filter(item => this.ids.includes(item.stockId));
// 获取选中的完整数据(优先使用表格当前选中行,避免被全量数据干扰)
const selectedData = this.selectedRows && this.selectedRows.length
? this.selectedRows
: this.managementList.filter(item => this.ids.map(id => String(id)).includes(String(item.stockId)))
this.selectedStockData = selectedData;
this.selectedTotalQuantity = selectedData.reduce((sum, row) => {
const q = parseFloat(row.quantity)
@@ -365,7 +370,9 @@ export default {
this.$modal.msgError('请选择一条库存进行出库')
return
}
const selectedRow = this.managementList.find(item => item.stockId === this.ids[0])
const selectedRow = (this.selectedStockData && this.selectedStockData.length)
? this.selectedStockData[0]
: this.managementList.find(item => String(item.stockId) === String(this.ids[0]))
if (!selectedRow) {
this.$modal.msgError('未找到选中库存数据')
return
@@ -381,8 +388,11 @@ export default {
return
}
const groupCodingNo = selectedRow.groupCodingNo
console.log('指定货位出库:', groupCodingNo, outQty)
pointOut(groupCodingNo, outQty).then(response => {
if (!groupCodingNo) {
this.$modal.msgError('选中数据缺少通道编码,无法出库')
return
}
pointOut({ groupCodingNo: groupCodingNo, outQuantity: outQty }).then(response => {
this.$modal.msgSuccess(response.msg)
this.getList()
this.exitDialogVisible = false