From 40ac0fd62faca6b81b8708b5a7b222e29029a35c Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Fri, 23 Jan 2026 09:48:32 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8E=92=E4=BA=A7=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BF=AE=E6=94=B9-sjx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blade-ops/blade-job/pom.xml | 4 +++ .../scheduling/InitResourceProcessor.java | 32 +++++++++++++++++++ .../scheduling/SchedulingProcessor.java | 32 +++++++++++++++++++ .../scheduling/feign/IWorkOrderClient.java | 4 +++ .../feign/IWorkOrderClientFallback.java | 5 +++ .../scheduling/feign/WorkOrderClient.java | 23 +++++++++++++ .../scheduling/mapper/WorkOrderMapper.xml | 2 +- .../impl/EquipResourceServiceImpl.java | 4 +++ .../impl/PersonResourceServiceImpl.java | 2 ++ .../service/impl/WorkOrderServiceImpl.java | 16 ++++++---- .../scheduling/task/InitResourceJob.java | 2 +- .../scheduling/task/SchedulingJob.java | 2 +- 12 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java diff --git a/blade-ops/blade-job/pom.xml b/blade-ops/blade-job/pom.xml index 8d7b5745f..afa588a59 100644 --- a/blade-ops/blade-job/pom.xml +++ b/blade-ops/blade-job/pom.xml @@ -52,6 +52,10 @@ 4.6.0.RELEASE compile + + org.springblade + blade-scheduling-api + diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java new file mode 100644 index 000000000..1ab224301 --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java @@ -0,0 +1,32 @@ +package org.springblade.job.processor.scheduling; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.scheduling.feign.IWorkOrderClient; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +import java.util.concurrent.CompletableFuture; + +/** + * 排产-定期生成设备和人力资源 + */ +@Component +@Data +@Slf4j +public class InitResourceProcessor implements BasicProcessor { + + @Resource + private IWorkOrderClient client; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + log.info("初始化资源定时任务开始"); + CompletableFuture runFuture = CompletableFuture.runAsync(()->client.initResource()); + log.info("初始化资源定时任务结束"); + return new ProcessResult(true); + } +} diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java new file mode 100644 index 000000000..334adac8b --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java @@ -0,0 +1,32 @@ +package org.springblade.job.processor.scheduling; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.scheduling.feign.IWorkOrderClient; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +import java.util.concurrent.CompletableFuture; + +/** + * 排产-排产定时任务 + */ +@Component +@Data +@Slf4j +public class SchedulingProcessor implements BasicProcessor { + + @Resource + private IWorkOrderClient client; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + log.info("排产定时任务开始"); + CompletableFuture runFuture = CompletableFuture.runAsync(()->client.scheduling()); + log.info("排产定时任务结束"); + return new ProcessResult(true); + } +} diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java index 0f0af6143..896306a69 100644 --- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java +++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java @@ -21,6 +21,7 @@ public interface IWorkOrderClient { String API_PREFIX = "/feign/client/workOrder"; String SCHEDULING = API_PREFIX + "/scheduling"; + String INIT_RESOURCE = API_PREFIX + "/initResource"; /** * 排产 @@ -28,4 +29,7 @@ public interface IWorkOrderClient { */ @GetMapping(SCHEDULING) R scheduling(); + + @GetMapping(INIT_RESOURCE) + R initResource(); } diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java index 076be6dc8..107560769 100644 --- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java +++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java @@ -40,4 +40,9 @@ public class IWorkOrderClientFallback implements IWorkOrderClient { public R scheduling() { return R.fail("获取数据失败"); } + + @Override + public R initResource() { + return R.fail("初始化资源失败"); + } } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java index 980e90bec..10a8bb4c6 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java @@ -28,12 +28,19 @@ package org.springblade.scheduling.scheduling.feign; import io.swagger.v3.oas.annotations.Hidden; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateFormatUtils; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; import org.springblade.scheduling.feign.IWorkOrderClient; +import org.springblade.scheduling.scheduling.service.IEquipResourceService; +import org.springblade.scheduling.scheduling.service.IPersonResourceService; import org.springblade.scheduling.scheduling.service.IWorkOrderService; import org.springframework.web.bind.annotation.RestController; +import java.util.Date; + /** * 字典服务Feign实现类 @@ -44,14 +51,30 @@ import org.springframework.web.bind.annotation.RestController; @Hidden @RestController @AllArgsConstructor +@Slf4j public class WorkOrderClient implements IWorkOrderClient { private final IWorkOrderService workOrderService; + private final IPersonResourceService personResourceService; + + private final IEquipResourceService equipResourceService; + @Override public R scheduling() { + log.info("排产任务开始:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); workOrderService.scheduling(); + log.info("排查任务结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); + return R.success(); + } + + @Override + public R initResource() { + log.info("初始化资源开始:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); + equipResourceService.initEquipResource(); + personResourceService.initPersonResource(); + log.info("初始化资源结束:" + DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); return R.success(); } } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml index 665327133..cc8571901 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml @@ -94,7 +94,7 @@ a.card_no AS "cardNO", g.priority_aps AS "priorityAps", g.product_ident AS "productIdent", - to_char(g.release_date,'YYYY-MM-DD') AS "releaseDate", + to_char(g.receive_time,'YYYY-MM-DD') AS "receiveTime", f.name AS "currentProcessName", d.name AS "processName", to_char(b.start_time,'YYYY-MM-DD HH24:MI') AS "startTime", diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java index bf7323a25..74d77890c 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java @@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; @@ -61,6 +62,7 @@ import java.util.Map; */ @Service @AllArgsConstructor +@Slf4j public class EquipResourceServiceImpl extends BaseServiceImpl implements IEquipResourceService { private final IEquipAbilityService equipAbilityService; @@ -78,6 +80,7 @@ public class EquipResourceServiceImpl extends BaseServiceImpl equipAbilityList = equipAbilityService.list(Wrappers.lambdaQuery().isNotNull(EquipAbilityEntity::getWorkCenterId).isNotNull(EquipAbilityEntity::getCraftId).isNotNull(EquipAbilityEntity::getEquipCode)); @@ -98,6 +101,7 @@ public class EquipResourceServiceImpl extends BaseServiceImpl deleteList = this.list(Wrappers.lambdaQuery().le(EquipResourceEntity::getDateTime,DateFormatUtils.format(DateUtils.addDays(date,-3),"yyyy-MM-dd"))); deleteList.forEach(item -> baseMapper.deleteById(item.getId())); + log.info("初始化设备资源结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")); } public void initSingleEquipResource(EquipAbilityEntity entity){ diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java index e58133e30..b7547a405 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java @@ -74,6 +74,7 @@ public class PersonResourceServiceImpl extends BaseServiceImpl sameFurnaceMap = new HashMap<>(); //烧结同炉 if(sintMap.containsKey(craft.getPpsId())){ - Boolean isSameFurnace = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap); + sameFurnaceMap = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap); //同炉的话就不用走下面的匹配了,直接下一工序 - if(isSameFurnace){ + if(sameFurnaceMap.get("isSameFurnace").toString() == "true"){ continue; } } @@ -532,8 +533,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map> sintMap){ + public Map sameFurnace(YieldOrderEntity order,YieldOrderCraftEntity craft,List workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map> sintMap){ + Map map = new HashMap<>(); Boolean isSameFurnace = false; if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单 //获取当前工序的所有温度曲线 @@ -1325,6 +1327,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl Date: Fri, 23 Jan 2026 11:15:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E9=87=8F=E5=85=B7=E5=BA=93=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StRealtimeStockController.java | 267 +++++++++ .../wms/excel/StRealtimeStockExcel.java | 231 ++++++++ .../wms/mapper/StRealtimeStockMapper.java | 73 +++ .../wms/mapper/StRealtimeStockMapper.xml | 352 ++++++++++++ .../wms/pojo/dto/StRealtimeStockDTO.java | 25 + .../wms/pojo/entity/StRealtimeStock.java | 196 +++++++ .../wms/pojo/entity/StStorehouse.java | 91 +++ .../wms/pojo/vo/PrintParentWoLabel.java | 21 + .../wms/pojo/vo/PrintStoresList.java | 86 +++ .../springblade/wms/pojo/vo/PrintWoLabel.java | 41 ++ .../wms/pojo/vo/StRealtimeStockVO.java | 54 ++ .../wms/service/IStRealtimeStockService.java | 82 +++ .../impl/StRealtimeStockServiceImpl.java | 539 ++++++++++++++++++ .../wms/wrapper/StRealtimeStockWrapper.java | 39 ++ 14 files changed, 2097 insertions(+) create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java new file mode 100644 index 000000000..98ca023d5 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java @@ -0,0 +1,267 @@ +package org.springblade.wms.controller; + + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.write.handler.WriteHandler; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import jakarta.validation.Valid; + +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.annotation.IsAdmin; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.TemplateUtil; +import org.springblade.wms.pojo.entity.StRealtimeStock; +import org.springblade.wms.pojo.entity.StStorehouse; +import org.springblade.wms.pojo.vo.PrintParentWoLabel; +import org.springblade.wms.pojo.vo.PrintStoresList; +import org.springblade.wms.pojo.vo.PrintWoLabel; +import org.springframework.web.bind.annotation.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.wms.pojo.vo.StRealtimeStockVO; +import org.springblade.wms.excel.StRealtimeStockExcel; +import org.springblade.wms.wrapper.StRealtimeStockWrapper; +import org.springblade.wms.service.IStRealtimeStockService; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.tool.constant.BladeConstant; + +import java.util.HashMap; +import java.util.Map; +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; + +import static org.springblade.core.excel.util.ExcelUtil.export; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockController + * @description: 仓库实时结余表 控制器 + * @autor: WuSiYu + * @create 2025-12-15 15:04 + **/ + + +/** + * 仓库实时结余表 控制器 + * + * @author BladeX + * @since 2025-12-15 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/stRealtimeStock") +@Tag(name = "仓库实时结余表", description = "仓库实时结余表接口") +@Slf4j +public class StRealtimeStockController extends BladeController { + + private final IStRealtimeStockService stRealtimeStockService; + + /** + * 仓库实时结余表 详情 + */ + @GetMapping("/detail") + @ApiOperationSupport(order = 1) + @Operation(summary = "详情", description = "传入stRealtimeStock") + public R detail(StRealtimeStock stRealtimeStock) { + StRealtimeStock detail = stRealtimeStockService.getOne(Condition.getQueryWrapper(stRealtimeStock)); + return R.data(StRealtimeStockWrapper.build().entityVO(detail)); + } + /** + * 仓库实时结余表 分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 2) + @Operation(summary = "分页", description = "传入stRealtimeStock") + public R> list(@Parameter(hidden = true) @RequestParam Map stRealtimeStock, Query query) { + IPage pages = stRealtimeStockService.page(Condition.getPage(query), Condition.getQueryWrapper(stRealtimeStock, StRealtimeStock.class)); + return R.data(StRealtimeStockWrapper.build().pageVO(pages)); + } + + /** + * 仓库实时结余表 自定义分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入stRealtimeStock") + public R> page(StRealtimeStockVO stRealtimeStock, Query query) { + IPage pages = stRealtimeStockService.selectStRealtimeStockPage(Condition.getPage(query), stRealtimeStock); + return R.data(pages); + } + + /** + * 量具库存表 分页 + */ + @GetMapping("/pageToolsData") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页加载量具库存数据", description = "传入stRealtimeStock,默认过滤量具类型仓库,按sumNum排序") + public R> pageToolsData(StRealtimeStockVO stRealtimeStock, Query query) { + + if (StrUtil.isBlank(query.getAscs()) && StrUtil.isBlank(query.getDescs())) { + query.setDescs("sumNum"); // 默认按sumNum降序排序 + } + IPage pages = stRealtimeStockService.selectToolsStockPage(Condition.getPage(query), stRealtimeStock); + + return R.data(pages); + } + + /** + * 仓库实时结余表 新增 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 4) + @Operation(summary = "新增", description = "传入stRealtimeStock") + public R save(@Valid @RequestBody StRealtimeStock stRealtimeStock) { + return R.status(stRealtimeStockService.save(stRealtimeStock)); + } + + /** + * 仓库实时结余表 修改 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 5) + @Operation(summary = "修改", description = "传入stRealtimeStock") + public R update(@Valid @RequestBody StRealtimeStock stRealtimeStock) { + return R.status(stRealtimeStockService.updateById(stRealtimeStock)); + } + + /** + * 仓库实时结余表 新增或修改 + */ + @PostMapping("/submit") + @ApiOperationSupport(order = 6) + @Operation(summary = "新增或修改", description = "传入stRealtimeStock") + public R submit(@Valid @RequestBody StRealtimeStock stRealtimeStock) { + return R.status(stRealtimeStockService.saveOrUpdate(stRealtimeStock)); + } + + /** + * 仓库实时结余表 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 7) + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(stRealtimeStockService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 仓库实时结余表 打印标签 + */ + @PostMapping("/printWoLabel") + @ApiOperationSupport(order = 8) + @Operation(summary = "打印标签", description = "传入rlsIdList(主键集合)、quantity(打印数量)、exportType(导出类型)") + public void printLabel( + @Parameter(hidden = true) @RequestBody JSONObject data, + @Parameter(hidden = true) HttpServletRequest request, + @Parameter(hidden = true) HttpServletResponse response + ) throws Exception { + // 解析请求参数 + List rlsIdList = JSONArray.parseArray(data.getString("rlsIdList"), Long.class); + Short quantity = data.getShort("quantity"); + Short exportType = data.getShort("exportType"); + + // 调用服务层获取打印数据 + List list = stRealtimeStockService.printPrintWoLabel(rlsIdList, quantity); + + // 构建导出参数 + Map map = new HashMap<>(1); + + // 调用导出方法 + export(response, "打印标签" + DateUtil.time(), "打印标签数据表", list, PrintParentWoLabel.class); + } + + + /** + * 仓库实时结余表 打印 + */ + @PostMapping("/print") + @ApiOperationSupport(order = 9) + @Operation(summary = "打印流程卡", description = "传入idArr(主键集合)、exportType(导出类型)、reportId(报表ID)") + public void print( + @Parameter(description = "打印参数(idArr:主键集合, exportType:导出类型, reportId:报表ID)", required = true) + @RequestBody JSONObject data, + @Parameter(hidden = true) HttpServletRequest request, + @Parameter(hidden = true) HttpServletResponse response + ) { + try { + // 解析主键集合 + List idArr = JSONArray.parseArray(data.getString("idArr"), Long.class); + // 解析导出类型 + Short exportType = data.getShort("exportType"); + + // 校验主键集合非空 + if (Func.isNotEmpty(idArr)) { + // 解析报表ID + String reportId = data.getString("reportId"); + // 校验报表ID非空 + if (Func.isNotBlank(reportId)) { + // 调用服务层获取打印数据 + List list = stRealtimeStockService.printStRealtimeStockList(idArr); + // 执行导出打印 + export(response, "流程卡打印","reportId", list, PrintStoresList.class); + } + } + } catch (Exception e) { + log.error("仓库实时结余表打印异常", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + + @RequestMapping( + value = {"/listprintData"}, + method = {RequestMethod.POST} + ) + @ApiOperationSupport(order = 10) + @Operation(summary = "获取打印数据列表", description = "传入idArr(主键集合)获取打印数据") + public R> listprintData( + @Parameter(description = "请求参数(idArr:主键集合)", required = true) + @RequestBody JSONObject data + ) { + try { + List idArr = JSONArray.parseArray(Func.toStr(data.get("idArr")), Long.class); + if (Func.isEmpty(idArr)) { + return R.fail("主键集合idArr不能为空"); + } + List list = stRealtimeStockService.printStRealtimeStockList(idArr); + return R.data(list); + } catch (Exception e) { + log.error("获取打印数据异常", e); + return R.fail("获取打印数据失败:" + e.getMessage()); + } + } + + + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-stRealtimeStock") + @ApiOperationSupport(order = 11) + @Operation(summary = "导出数据", description = "传入stRealtimeStock") + public void exportStRealtimeStock(@Parameter(hidden = true) @RequestParam Map stRealtimeStock, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper queryWrapper = Condition.getQueryWrapper(stRealtimeStock, StRealtimeStock.class); + //if (!AuthUtil.isAdministrator()) { + // queryWrapper.lambda().eq(StRealtimeStock::getTenantId, bladeUser.getTenantId()); + //} + //queryWrapper.lambda().eq(StRealtimeStockEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED); + List list = stRealtimeStockService.exportStRealtimeStock(queryWrapper); + export(response, "仓库实时结余表数据" + DateUtil.time(), "仓库实时结余表数据表", list, StRealtimeStockExcel.class); + } + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java new file mode 100644 index 000000000..6b29091df --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java @@ -0,0 +1,231 @@ +package org.springblade.wms.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockExcel + * @description: 仓库实时结余表 Excel实体类 + * @autor: WuSiYu + * @create 2025-12-15 14:51 + **/ + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class StRealtimeStockExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ColumnWidth(20) + @ExcelProperty("主键") + private Long id; + /** + * 租户ID(默认值:000000) + */ + @ColumnWidth(20) + @ExcelProperty("租户ID(默认值:000000)") + private String tenantId; + /** + * 是否已删除(默认值:0) + */ + @ColumnWidth(20) + @ExcelProperty("是否已删除(默认值:0)") + private Long isDeleted; + /** + * 库房ID + */ + @ColumnWidth(20) + @ExcelProperty("库房ID") + private Long shId; + /** + * 物料ID(关联st_goods表) + */ + @ColumnWidth(20) + @ExcelProperty("物料ID(关联st_goods表)") + private Long goodsId; + /** + * 库位ID + */ + @ColumnWidth(20) + @ExcelProperty("库位ID") + private Long slId; + /** + * 批次号 + */ + @ColumnWidth(20) + @ExcelProperty("批次号") + private String piNo; + /** + * 库存数量 + */ + @ColumnWidth(20) + @ExcelProperty("库存数量") + private Double quantity; + /** + * 金额-单价 + */ + @ColumnWidth(20) + @ExcelProperty("金额-单价") + private Double balanceMoney; + /** + * 质量等级 + */ + @ColumnWidth(20) + @ExcelProperty("质量等级") + private String quantityLevel; + /** + * 过期/报废日期 + */ + @ColumnWidth(20) + @ExcelProperty("过期/报废日期") + private Date scrapCycle; + /** + * 质量编号 + */ + @ColumnWidth(20) + @ExcelProperty("质量编号") + private String checkCode; + /** + * 是否模架物料(1=是/0=否) + */ + @ColumnWidth(20) + @ExcelProperty("是否模架物料(1=是/0=否)") + private Boolean moldBaseMaterial; + /** + * 模架物料库存对应模架库存ID + */ + @ColumnWidth(20) + @ExcelProperty("模架物料库存对应模架库存ID") + private Long moldRlsId; + /** + * 是否停用(1=是/0=否) + */ + @ColumnWidth(20) + @ExcelProperty("是否停用(1=是/0=否)") + private Boolean stopUse; + /** + * 累计次数 + */ + @ColumnWidth(20) + @ExcelProperty("累计次数") + private Long sumNum; + /** + * 库存来源(1=采购/2=生产/3=调拨等) + */ + @ColumnWidth(20) + @ExcelProperty("库存来源(1=采购/2=生产/3=调拨等)") + private Long stockSource; + /** + * 待保养次数 + */ + @ColumnWidth(20) + @ExcelProperty("待保养次数") + private Long stayMaintainNum; + /** + * 物料状态 + */ + @ColumnWidth(20) + @ExcelProperty("物料状态") + private Long goodsStatus; + /** + * 分厂类型 + */ + @ColumnWidth(20) + @ExcelProperty("分厂类型") + private Long facilityType; + /** + * 分厂ID + */ + @ColumnWidth(20) + @ExcelProperty("分厂ID") + private Long deptId; + /** + * 条码号 + */ + @ColumnWidth(20) + @ExcelProperty("条码号") + private String barCode; + /** + * 占用数量 + */ + @ColumnWidth(20) + @ExcelProperty("占用数量") + private Double occupyQuantity; + /** + * 炉批号 + */ + @ColumnWidth(20) + @ExcelProperty("炉批号") + private String stovePiNo; + /** + * 到期送检是否申请 + */ + @ColumnWidth(20) + @ExcelProperty("到期送检是否申请") + private Boolean applyFor; + /** + * 供方代码 + */ + @ColumnWidth(20) + @ExcelProperty("供方代码") + private String splyCode; + /** + * 限用标记 + */ + @ColumnWidth(20) + @ExcelProperty("限用标记") + private Long limitUseFlag; + /** + * ERP入库时间 + */ + @ColumnWidth(20) + @ExcelProperty("ERP入库时间") + private Date erpStorageTime; + /** + * 是否印字 + */ + @ColumnWidth(20) + @ExcelProperty("是否印字") + private Boolean printMark; + /** + * 粉重 + */ + @ColumnWidth(20) + @ExcelProperty("粉重") + private String powderWeight; + /** + * 材料号 + */ + @ColumnWidth(20) + @ExcelProperty("材料号") + private String materialNo; + /** + * 厚度 + */ + @ColumnWidth(20) + @ExcelProperty("厚度") + private String thickness; + /** + * 备注 + */ + @ColumnWidth(20) + @ExcelProperty("备注") + private String memo; + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java new file mode 100644 index 000000000..e33c7c5b8 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java @@ -0,0 +1,73 @@ +package org.springblade.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springblade.wms.excel.StRealtimeStockExcel; +import org.springblade.wms.pojo.entity.StRealtimeStock; +import org.springblade.wms.pojo.vo.StRealtimeStockVO; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockMapper + * @description: 仓库实时结余表 Mapper 接口 + * @autor: WuSiYu + * @create 2025-12-15 15:00 + **/ + +public interface StRealtimeStockMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stRealtimeStock 查询参数 + * @return List + */ + List selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock); + + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStRealtimeStock(@Param("ew") Wrapper queryWrapper); + + Double getByShId(@Param("shId") Long shId); + + Double getQuantityBySlId(@Param("slId") Long slId); + + StRealtimeStock getBySlId(@Param("slId") Long slId); + + Boolean findBySlId(@Param("slId") Long slId); + + Double findPriceByParams(Long goodsId, String checkNo); + + IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId); + + IPage selectGoodsOut(IPage page, String filterValue, Long shId, Long goodsId); + + StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId); + + StRealtimeStock getByBarCode(String barCode); + + StRealtimeStock getByGoodsCode(String barCode); + + StRealtimeStock getSynchById(Long rlsId); + + List selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock); + + boolean checkRealTimeLock(String woCode, String rlsId); + + void updateRealTimeLock(String woCode, String string, double doubleValue); + + List selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock); + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml new file mode 100644 index 000000000..ce83840a7 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE ST_REALTIME_STOCK_LOCK + SET OCCUPY_QUANTITY = OCCUPY_QUANTITY + #{doubleValue}, + STATUS = CASE + WHEN ZY_QUANTITY + #{doubleValue} = 0 THEN 1 + ELSE 0 + END + WHERE WO_NO = #{woNo} + AND ID = #{id} + + + + + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java new file mode 100644 index 000000000..ad545dfd7 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java @@ -0,0 +1,25 @@ +package org.springblade.wms.pojo.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StRealtimeStock; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockDTO + * @description: 仓库实时结余表 数据传输对象实体类 + * @autor: WuSiYu + * @create 2025-12-15 14:48 + **/ + +@Data +@EqualsAndHashCode(callSuper = true) +public class StRealtimeStockDTO extends StRealtimeStock { + @Serial + private static final long serialVersionUID = 1L; + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java new file mode 100644 index 000000000..bf7ed108d --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java @@ -0,0 +1,196 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; +import org.springblade.wms.mapper.StGoodsMapper; +import org.springframework.data.annotation.Transient; + +import java.io.Serial; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStock + * @description: 仓库实时结余表 实体类 + * @autor: WuSiYu + * @create 2025-12-15 14:45 + **/ + +@Data +@TableName("ST_REALTIME_STOCK") +@Schema(description = "StRealtimeStock对象") +@EqualsAndHashCode(callSuper = true) +public class StRealtimeStock extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 库房ID + */ + @Schema(description = "库房ID") + private Long shId; + /** + * 物料ID(关联st_goods表) + */ + @Schema(description = "物料ID(关联st_goods表)") + @TableField("goods_id") + private Long goodsId; + /** + * 库位ID + */ + @Schema(description = "库位ID") + private Long slId; + /** + * 批次号 + */ + @Schema(description = "批次号") + private String piNo; + /** + * 库存数量 + */ + @Schema(description = "库存数量") + private Double quantity; + /** + * 金额-单价 + */ + @Schema(description = "金额-单价") + private Double balanceMoney; + /** + * 质量等级 + */ + @Schema(description = "质量等级") + private String quantityLevel; + /** + * 过期/报废日期 + */ + @Schema(description = "过期/报废日期") + private Date scrapCycle; + /** + * 质量编号 + */ + @Schema(description = "质量编号") + private String checkCode; + /** + * 是否模架物料(1=是/0=否) + */ + @Schema(description = "是否模架物料(1=是/0=否)") + private Boolean moldBaseMaterial; + /** + * 模架物料库存对应模架库存ID + */ + @Schema(description = "模架物料库存对应模架库存ID") + private Long moldRlsId; + /** + * 是否停用(1=是/0=否) + */ + @Schema(description = "是否停用(1=是/0=否)") + private Boolean stopUse; + /** + * 累计次数 + */ + @Schema(description = "累计次数") + private Long sumNum; + /** + * 库存来源(1=采购/2=生产/3=调拨等) + */ + @Schema(description = "库存来源(1=采购/2=生产/3=调拨等)") + private Long stockSource; + /** + * 待保养次数 + */ + @Schema(description = "待保养次数") + private Long stayMaintainNum; + /** + * 物料状态 + */ + @Schema(description = "物料状态") + private Long goodsStatus; + /** + * 分厂类型 + */ + @Schema(description = "分厂类型") + private Long facilityType; + /** + * 分厂ID + */ + @Schema(description = "分厂ID") + private String deptId; + /** + * 条码号 + */ + @Schema(description = "条码号") + private String barCode; + /** + * 占用数量 + */ + @Schema(description = "占用数量") + private Double occupyQuantity; + /** + * 炉批号 + */ + @Schema(description = "炉批号") + private String stovePiNo; + /** + * 到期送检是否申请 + */ + @Schema(description = "到期送检是否申请") + private Boolean applyFor; + /** + * 供方代码 + */ + @Schema(description = "供方代码") + private String splyCode; + /** + * 限用标记 + */ + @Schema(description = "限用标记") + private Long limitUseFlag; + /** + * ERP入库时间 + */ + @Schema(description = "ERP入库时间") + private Date erpStorageTime; + /** + * 是否印字 + */ + @Schema(description = "是否印字") + private Boolean printMark; + /** + * 粉重 + */ + @Schema(description = "粉重") + private String powderWeight; + /** + * 材料号 + */ + @Schema(description = "材料号") + private String materialNo; + /** + * 厚度 + */ + @Schema(description = "厚度") + private String thickness; + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + + /** + * 保管员 + */ +// @Transient +// private String keeper; + +// @Transient + private Double outQuantity; + + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java new file mode 100644 index 000000000..153eb9f42 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java @@ -0,0 +1,91 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StStorehouse + * @description: 库房维护表 实体类 + * @autor: WuSiYu + * @create 2025-12-18 14:16 + **/ + +@Data +@TableName("ST_STOREHOUSE") +@Schema(description = "StStorehouse对象") +@EqualsAndHashCode(callSuper = true) +public class StStorehouse extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 库房编号 + */ + @Schema(description = "库房编号") + private String shCode; + /** + * 库房名称 + */ + @Schema(description = "库房名称") + private String shName; + /** + * 所属分类 + */ + @Schema(description = "所属分类") + private Short type; + /** + * 工装分类 + */ + @Schema(description = "工装分类") + private Short toolingType; + /** + * 库房层级 + */ + @Schema(description = "库房层级") + private String shLevel; + /** + * 部门ID + */ + @Schema(description = "部门ID") + private String deptId; + /** + * 保管员ID + */ + @Schema(description = "保管员ID") + private Long saveUser; + /** + * 类别说明 + */ + @Schema(description = "类别说明") + private String memo; + + // 模具库 + public static final Short TYPE_MOLD = 0; + // 材料库 + public static final Short TYPE_PART = 1; + // 刀具库 + public static final Short TYPE_TOOL = 2; + // 工装库 + public static final Short TYPE_WORK = 3; + // 电极库 + public static final Short TYPE_ELECTRODE = 4; + // 量具库 + public static final Short TYPE_RULE = 5; + // 夹具库 + public static final Short TYPE_JIA_JU = 6; + + public static Short TOOLING_TYPE_MOLD = 0;//模具 + public static Short TOOLING_TYPE_TOOL = 1;//工装 + public static Short TOOLING_TYPE_RULE = 2;//量具 + + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java new file mode 100644 index 000000000..c82672d56 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java @@ -0,0 +1,21 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName PrintParentWoLabel + * @description: 库存打印标签数据模型(父) + * @autor: WuSiYu + * @create 2025-12-17 09:50 + **/ + +@Data +public class PrintParentWoLabel { + + private PrintWoLabel plOne; + private PrintWoLabel plTwo; + private PrintWoLabel plThree; + private PrintWoLabel plFour; +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java new file mode 100644 index 000000000..b11a1e2cf --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java @@ -0,0 +1,86 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName PrintStoresList + * @description: + * @autor: WuSiYu + * @create 2025-12-17 18:01 + **/ +@Data +public class PrintStoresList implements java.io.Serializable { + /** + * 供货单位 + */ + private String supplier; + /** + * 物料信息 + */ + private String materialMess; + /** + * 物料编码 + */ + private String materialCode; + /** + * 入库日期 + */ + private String inStore; + /** + * 库位号 + */ + private String locator; + /** + * 单位 + */ + private String unit; + /** + * 检验编号 + */ + private String testCode; + /** + * 到期日期 + */ + private String matureDate; + /** + * 批次号 + */ + private String batchNo; + /** + * 生产标识 + */ + private String identification; + /** + * 炉批号 + */ + private String heatNo; + /** + * 日期 + */ + private String date; + /** + * 摘要 + */ + private String memo; + /** + * 收入数 + */ + private String income; + /** + * 发出数 + */ + private String issueNum; + /** + * 结存数 + */ + private String balance; + /** + * 经手人 + */ + private String handledBy; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java new file mode 100644 index 000000000..e8198fd89 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java @@ -0,0 +1,41 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName PrintWoLabel + * @description: 库存打印标签数据模型(子) + * @autor: WuSiYu + * @create 2025-12-17 10:00 + **/ + + +@Data +public class PrintWoLabel implements Serializable { + + /** + * 条码号 + */ + private String rsId; + /** + * 编码 + */ + private String code; + /** + * 名称 + */ + private String name; + /** + * 检验编号 + */ + private String checkCode; + /** + * 日期 + */ + private String date; +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java new file mode 100644 index 000000000..5c2cbd257 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java @@ -0,0 +1,54 @@ +package org.springblade.wms.pojo.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StRealtimeStock; + +import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockVO + * @description: 仓库实时结余表 视图实体类 + * @autor: WuSiYu + * @create 2025-12-15 14:49 + **/ + +@Data +@EqualsAndHashCode(callSuper = true) +public class StRealtimeStockVO extends StRealtimeStock { + @Serial + private static final long serialVersionUID = 1L; + + private Long id; // 主键ID + private Long goodsId; // 物料ID + private Double quantity; // 库存数量 + private Double lockQuantity; + private Double onthewayQuantity; + private Double currentQuantity; + private String piNo; // 批号 + private Long slId; // 库位ID + private String barCode; // 条形码 + private Date scrapCycle; // 报废周期 + private String checkCode; // 检验码 + private String splyCode; // 供应商编码 + private String goodsName; + private String shName; + private Long shId; + private String location; + private String specifications; + @TableField(exist = false) + private String filterValue; + private Boolean special; // 特殊标识 + private Double syQuantity; + + @TableField(exist = false) + private String goodsCodeAndGoodsName; + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java new file mode 100644 index 000000000..86b003628 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java @@ -0,0 +1,82 @@ +package org.springblade.wms.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.secure.BladeUser; +import org.springblade.wms.excel.StRealtimeStockExcel; +import org.springblade.wms.pojo.entity.StRealtimeStock; +import org.springblade.wms.pojo.entity.StStockInoutRecord; +import org.springblade.wms.pojo.entity.StStorageLocation; +import org.springblade.wms.pojo.entity.StStoreBill; +import org.springblade.wms.pojo.vo.PrintParentWoLabel; +import org.springblade.wms.pojo.vo.PrintStoresList; +import org.springblade.wms.pojo.vo.StRealtimeStockVO; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName IStRealtimeStockService + * @description: 仓库实时结余表 服务类 + * @autor: WuSiYu + * @create 2025-12-15 14:56 + **/ + +public interface IStRealtimeStockService extends BaseService { + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stRealtimeStock 查询参数 + * @return IPage + */ + IPage selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock); + + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStRealtimeStock(Wrapper queryWrapper); + + List printPrintWoLabel(List rlsIdList, Short quantity); + + List printStRealtimeStockList(List idArr); + + Double getByShId(Long keyId); + + Double getQuantityBySlId(Long slId); + + StRealtimeStock getBySlId(Long slId); + + boolean findBySlId(Long slId); + + void updateLocation(Long id, StStorageLocation lo); + + List reviseRealTimeStock(List inoutList, List stockList, List splyCodeList); + + Double findPriceByParams(Long goodsId, String checkNo); + + IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId); + +// IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, String deptId, Integer current, Integer size); + + StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId); + + StRealtimeStock getByBarCode(String barCode); + + StRealtimeStock getByGoodsCode(String barCode); + + IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, IPage page); + + void stockProcessing(List storeBillList, Short billsourceBorrow, BladeUser user) throws Exception ; + + IPage selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock); + + IPage selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock); +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java new file mode 100644 index 000000000..31418a201 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java @@ -0,0 +1,539 @@ +package org.springblade.wms.service.impl; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springblade.common.exception.BusinessException; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.secure.BladeUser; +import org.springblade.wms.excel.StRealtimeStockExcel; +import org.springblade.wms.mapper.StGoodsMapper; +import org.springblade.wms.mapper.StRealtimeStockMapper; +import org.springblade.wms.mapper.StStorageLocationMapper; +import org.springblade.wms.pojo.entity.*; +import org.springblade.wms.pojo.vo.PrintParentWoLabel; +import org.springblade.wms.pojo.vo.PrintStoresList; +import org.springblade.wms.pojo.vo.PrintWoLabel; +import org.springblade.wms.pojo.vo.StRealtimeStockVO; +import org.springblade.wms.service.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockServiceImpl + * @description: 仓库实时结余表 服务实现类 + * @autor: WuSiYu + * @create 2025-12-15 14:58 + **/ + +@Service +public class StRealtimeStockServiceImpl extends BaseServiceImpl implements IStRealtimeStockService { + + @Resource + private StRealtimeStockMapper stRealtimeStockMapper; + @Resource + private StGoodsMapper stGoodsMapper; + @Resource + private StStorageLocationMapper stStorageLocationMapper; + @Resource + private IStGoodsService stGoodsService; + @Resource + private IStStoreBillService stStoreBillService; + @Resource + private IStLockGoodsService stLockGoodsService; + @Resource + private IStOtherOutRecordService stOtherOutRecordService; + + + @Override + public IPage selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock) { + return page.setRecords(baseMapper.selectStRealtimeStockPage(page, stRealtimeStock)); + } + + @Override + public IPage selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock) { + return page.setRecords(baseMapper.selectStockGoodsPage(page, stRealtimeStock)); + } + + @Override + public IPage selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock) { + return page.setRecords(baseMapper.selectToolsStockPage(page, stRealtimeStock)); + } + + @Override + public List printPrintWoLabel(List rlsIdList, Short quantity) { + if (rlsIdList == null || rlsIdList.size() == 0) { + return null; + } + List rlsIdListAll = new ArrayList<>(); + for (int i = 0; i < quantity; i++) { + rlsIdListAll.addAll(rlsIdList); + } + rlsIdListAll = rlsIdListAll.stream().sorted(Long::compareTo).collect(Collectors.toList()); + Map> map = new HashMap<>(1); + List list = null; + Integer num = 0; + int i = 1; + PrintWoLabel printWoLabel; + PrintParentWoLabel printParentWoLabel = null; + StRealtimeStock stRealtimeStock; + List plList = new ArrayList<>(); + for (Long id : rlsIdListAll) { + if (!map.containsKey(num)) { + list = new ArrayList<>(); + map.put(num, list); + printParentWoLabel = new PrintParentWoLabel(); + } + list.add(id); + printWoLabel = new PrintWoLabel(); + stRealtimeStock = stRealtimeStockMapper.selectById(id); + printWoLabel.setRsId(String.valueOf(id)); + StGoods goods = stGoodsMapper.selectById(stRealtimeStock.getGoodsId()); + printWoLabel.setCode(goods.getGoodsCode()); + printWoLabel.setName(goods.getGoodsName()); + printWoLabel.setCheckCode(stRealtimeStock.getCheckCode()); + Date scrapCycle = stRealtimeStock.getScrapCycle(); + if (scrapCycle != null) { + printWoLabel.setDate(scrapCycle.toString()); + } else { + printWoLabel.setDate(""); + } + if (list.size() == 1) { + printParentWoLabel.setPlOne(printWoLabel); + } + if (list.size() == 2) { + printParentWoLabel.setPlTwo(printWoLabel); + } + if (list.size() == 3) { + printParentWoLabel.setPlThree(printWoLabel); + } + if (list.size() == 4) { + printParentWoLabel.setPlFour(printWoLabel); + plList.add(printParentWoLabel); + num++; + } else if (i == rlsIdListAll.size()) { + plList.add(printParentWoLabel); + } + i++; + } + return plList; + } + + @Override + public List printStRealtimeStockList(List idArr) { + List pcdLst = new ArrayList<>(); + for (Long rlsId : idArr) { + PrintStoresList psl = new PrintStoresList(); + // 组装头 + this.makeHead(psl, rlsId); + pcdLst.add(psl); + } + return pcdLst; + } + + private void makeHead(PrintStoresList psl, Long rlsId) { + StRealtimeStock sts = this.getById(rlsId); + StGoods goods = stGoodsMapper.selectById(sts.getGoodsId()); + psl.setMaterialMess(goods.getGoodsCode() + goods.getGoodsName()); + psl.setMaterialCode(goods.getGoodsCode()); + psl.setInStore(sts.getCreateTime().toString()); + StStorageLocation stStorageLocation = stStorageLocationMapper.selectById(sts.getSlId()); + psl.setLocator(stStorageLocation.getLocation()); + psl.setUnit(goods.getUnitName()); + psl.setTestCode(sts.getCheckCode() != null ? sts.getCheckCode() : ""); + psl.setMatureDate(sts.getScrapCycle() != null ? sts.getScrapCycle().toString() : ""); + psl.setBatchNo(sts.getPiNo()); + psl.setIdentification(goods.getMaterialModel()); + psl.setSupplier(""); + psl.setHeatNo(sts.getStovePiNo() != null ? sts.getStovePiNo() : ""); + psl.setDate(sts.getCreateTime().toString()); + psl.setMemo(""); + psl.setIncome(goods.getPurchaseQuantity() != null ? goods.getPurchaseQuantity().toString() : ""); + DecimalFormat df = new DecimalFormat("#"); + psl.setBalance(df.format(sts.getQuantity())); +// psl.setHandledBy(sts.getKeeper()); + } + + @Override + public Double getByShId(Long shId) { + return stRealtimeStockMapper.getByShId(shId); + } + + @Override + public Double getQuantityBySlId(Long slId) { + return stRealtimeStockMapper.getQuantityBySlId(slId); + } + + @Override + public StRealtimeStock getBySlId(Long slId) { + return stRealtimeStockMapper.getBySlId(slId); + } + + @Override + public boolean findBySlId(Long slId) { + return stRealtimeStockMapper.findBySlId(slId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateLocation(Long id, StStorageLocation newStorageLocation) { + StRealtimeStock stock = stRealtimeStockMapper.selectById(id); + if (stock == null) { + throw new ServiceException("实时库存不存在,rlsId=" + id); + } + if (newStorageLocation == null || newStorageLocation.getShId() == null) { + throw new ServiceException("目标库位信息不完整"); + } + stock.setShId(newStorageLocation.getShId()); + stock.setSlId(newStorageLocation.getId()); + stRealtimeStockMapper.updateById(stock); + } + + @Override + public List reviseRealTimeStock(List inoutList, List stockList, List splyCodeList) { + // 前置校验:避免空列表和索引越界 + if (inoutList == null || inoutList.isEmpty()) { + throw new IllegalArgumentException("StStockInoutRecord出入库记录列表不能为空!"); + } + // 校验前两个List长度一致性(保证明细与库存对象一一对应) + if (stockList != null && stockList.size() != inoutList.size()) { + throw new IllegalArgumentException("StStockInoutRecord与StRealtimeStock两个列表长度不一致,无法批量处理!"); + } + + // 初始化返回集合,收集批量处理的rlsId + List rlsIdList = new ArrayList<>(); + + // 遍历出入库记录列表,批量执行核心业务逻辑 + for (int i = 0; i < inoutList.size(); i++) { + // 3.1 获取当前索引对应的单个对象 + StStockInoutRecord inout = inoutList.get(i); + // 兼容stockList为null的情况,避免空指针 + StRealtimeStock stock = (stockList != null && stockList.size() > i) ? stockList.get(i) : null; + + // 核心业务逻辑 + Double quantity = inout.getQuantity(); + Double balanceMoney = inout.getSirMoney() == null ? 0.0 : inout.getSirMoney(); // 字段名若变更需同步调整 + + + if (inout.getInOutSource() < StStockInoutRecord.INOUT_SOURCE_QUOTA_OUT) { + //入库逻辑 + if (StStockInoutRecord.INOUT_SOURCE_PURCHASE_RECEIPT.equals(inout.getInOutSource())) { + // 1.减在途 + if (!inout.getMoldBaseMaterial()) { + stGoodsService.addOnthewayQuantity(inout.getGoodsId(), + BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); + } + // 2.增当前库存 + stGoodsService.addCurQuantity(inout.getGoodsId(), quantity); + +// } else if (StStockInoutRecord.INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT.equals(inout.getBillFlag())) { +// //生产入库:增库存 +// stGoodsService.addCurQuantity(inout.getGoods().getGoodsId(), quantity); + } else if (StStockInoutRecord.INOUT_SOURCE_OTHER_PURCHASE_RECEIPT.equals(inout.getInOutSource()) + || StStockInoutRecord.INOUT_SOURCE_PRODUCTION_MATERIAL_RETURN.equals(inout.getInOutSource())) { + //其他入库/生产退料:增库存 + stGoodsService.addCurQuantity(inout.getGoodsId(), quantity); + } else if (StStockInoutRecord.INOUT_SOURCE_TRANSFER_RECEIPT.equals(inout.getInOutSource())) { + //调拨入库 + // 1.减在途 + stGoodsService.addOnthewayQuantity(inout.getGoodsId(), + BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); + // 2.增当前库存 + stGoodsService.addCurQuantity(inout.getGoodsId(), quantity); + } else if (StStockInoutRecord.INOUT_SOURCE_WAREHOUSE_TRANSFER.equals(inout.getInOutSource())) { + //库转移入库 + // 1.减在途 + if (!inout.getMoldBaseMaterial()) { + stGoodsService.addOnthewayQuantity(inout.getGoodsId(), + BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); + } + // 2.增当前库存 + stGoodsService.addCurQuantity(inout.getGoodsId(), quantity); + } +// } else { +// //出库逻辑 +// if (stock == null) { +// throw new RuntimeException("第" + (i+1) + "条出入库记录对应的出库物料为空,请选择出库物料!"); +// } +// stock = stRealtimeStockMapper.getSynchById(stock.getId()); +// //当前库位库存小于出库数量 +// if (stock.getQuantity() < quantity) { +// throw new RuntimeException("第" + (i+1) + "条出入库记录当前库位库存不足,出库失败!"); +// } +// // 获取物料信息 +// StGoods stGoods = stGoodsService.getById(inout.getGoodsId()); +// +// if (StStockInoutRecord.INOUT_SOURCE_QUOTA_OUT.equals(inout.getInOutSource())) { +// //配额出库 +// //1.减锁料 +// PvBomRequest pvBomRequest = inout.getBrId(); +// if (pvBomRequest != null) { +// +// StLockGoods lockGoods = stLockGoodsService.getByBrId(pvBomRequest.getId()); +// //锁料中数量 +// Double lockingQuantity = null; +// if (lockGoods != null) { +// lockingQuantity = +// BigDecimal.valueOf(lockGoods.getLockQuantity()).subtract(BigDecimal.valueOf(lockGoods.getOutQuantity())).doubleValue(); +// } else { +// lockingQuantity = 0.0; +// } +// if (lockingQuantity < 0) { +// lockingQuantity = 0.0; +// } +// // 判断可用库存是否充足 +// Double surplusQuantity = +// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity(); +// if (surplusQuantity < quantity - lockingQuantity) { +// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败"); +// } +// if (lockGoods != null) { +// stLockGoodsService.addOutQuantity(quantity, lockGoods.getId()); +// } +// if (quantity < lockingQuantity) { +// stGoodsService.addLockQuantity(inout.getGoodsId(), +// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); +// } else { +// stGoodsService.addLockQuantity(inout.getGoodsId(), +// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(lockingQuantity)).doubleValue()); +// } +// +// //2 减库存 +// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); +// } +// +// } else if (StStockInoutRecord.INOUT_SOURCE_OTHER_OUT.equals(inout.getInOutSource()) +// || StStockInoutRecord.INOUT_SOURCE_TOOl_OUT.equals(inout.getInOutSource())) { +// if (StringUtils.isNotBlank(inout.getWoCode()) && stock.getId() != null) { +//// if (!this.checkRealTimeLock(inout.getWoCode(),stock.getId().toString()) && !(inout.getMemo().indexOf("补")!=-1)) { +//// throw new RuntimeException("第" + (i+1) + "条出入库记录热表玻璃饼出库需匹配预占用,此工作订单无预占用!"); +//// } +// if (!this.checkRealTimeLock(inout.getWoCode(), stock.getId().toString())) { +// StOtherOutRecord stOtherOutRecord = stOtherOutRecordService.getBySirId(inout.getId()); +// if (StringUtils.isNotBlank(stOtherOutRecord.getMemo())) { +// if (!(stOtherOutRecord.getMemo().indexOf("补") != -1)) { +// throw new ServiceException("热表玻璃饼出库需匹配预占用,此工作订单无预占用!"); +// } +// } else { +// throw new ServiceException("热表玻璃饼出库需匹配预占用,此工作订单无预占用!"); +// } +// } +// } +// //其他出库/刀具出库:校验可用库存并减库存 +// Double surplusQuantity = +// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity(); +// if (surplusQuantity < quantity) { +// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败"); +// } +// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); +// } else if (StStockInoutRecord.INOUT_SOURCE_ASSIGN_OUT.equals(inout.getInOutSource())) { +// if (!stock.getMoldBaseMaterial()) { +// //生产领料出库 +//// StUseGoodsDetail detail = stUseGoodsDetailService.queryByAbdId(inout.getAbdId()); // 字段名若变更需调整 +//// PvBomRequest pvBomRequest = null; +//// if (detail != null) { +//// pvBomRequest = detail.getPrWorkpiece().getDsSelfParts().getPvBomRequest(); +//// } +// +// //1.减锁料 +//// if (pvBomRequest != null) { +//// StLockGoods lockGoods = stLockGoodsService.getByBrId(pvBomRequest.getId()); +// Double lockingQuantity = null; +// if (lockGoods != null) { +// lockingQuantity = +// BigDecimal.valueOf(lockGoods.getLockQuantity()).subtract(BigDecimal.valueOf(lockGoods.getOutQuantity())).doubleValue(); +// } else { +// lockingQuantity = 0.0; +// } +// if (lockingQuantity < 0) { +// lockingQuantity = 0.0; +// } +// // 校验可用库存 +// Double surplusQuantity = +// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity(); +// if (surplusQuantity < quantity - lockingQuantity) { +// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败"); +// } +// if (lockGoods != null) { +// stLockGoodsService.addOutQuantity(quantity, lockGoods.getId()); +// } +// if (quantity < lockingQuantity) { +// stGoodsService.addLockQuantity(inout.getGoodsId(), +// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); +// } else { +// stGoodsService.addLockQuantity(inout.getGoodsId(), +// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(lockingQuantity)).doubleValue()); +// } +// //2.减库存 +// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue()); +// } +// } +// } +// +// quantity = BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue(); + } + + // 调用底层方法,获取单个rlsId并添加到返回集合 +// Long rlsId = this.reviseRealTimeStock(stock, inout, quantity, balanceMoney, splyCode); +// rlsIdList.add(rlsId); + } +// +// // 返回批量处理后的rlsId列表 + return rlsIdList; + } + + @Transactional(rollbackFor = Exception.class) + public Long reviseRealTimeStock(StRealtimeStock stock, + StStockInoutRecord inout, + Double quantity, + Double balanceMoney, + String splyCode) { + + /* 1. 无记录 → 新增 */ + if (stock == null) { + StRealtimeStock entity = new StRealtimeStock(); + entity.setGoodsId(inout.getGoodsId()); + entity.setShId(inout.getShId()); + entity.setSlId(inout.getSlId()); + entity.setPiNo(inout.getPiNo()); + entity.setStovePiNo(inout.getStovePiNo()); + entity.setThickness(inout.getThickness()); + entity.setQuantity(quantity); + entity.setOccupyQuantity(0D); + entity.setBalanceMoney(balanceMoney); + entity.setCreateTime(Optional.ofNullable(inout.getInOutDate()).orElse(new Date())); + entity.setQuantityLevel(inout.getQuantityLevel()); + entity.setScrapCycle(inout.getScrapCycle()); + entity.setCheckCode(inout.getCheckNo()); + entity.setMoldBaseMaterial(inout.getMoldBaseMaterial()); + entity.setBarCode(inout.getBarCode()); + entity.setSplyCode(splyCode); + entity.setDeptId(inout.getDeptId()); + this.save(entity); + return entity.getId(); + } + + /* 2. 有记录 → 累加数量 & 更新 */ + StRealtimeStock db = baseMapper.getSynchById(stock.getId()); + double newQty = NumberUtil.add(BigDecimal.valueOf(db.getQuantity()), + BigDecimal.valueOf(quantity)) + .doubleValue(); + db.setQuantity(newQty); + db.setBalanceMoney(balanceMoney); + db.setSplyCode(splyCode); + + /* 车间订单锁料 */ + double newOccupy = NumberUtil + .add(BigDecimal.valueOf(db.getOccupyQuantity()), + BigDecimal.valueOf(quantity)) + .doubleValue(); + + if (StrUtil.isNotBlank(inout.getWoCode()) && newOccupy >= 0) { + db.setOccupyQuantity(newOccupy); + this.updateRealTimeLock(inout.getWoCode(), db.getId(), newOccupy); + } + this.updateById(db); + return db.getId(); + } + + private void updateRealTimeLock(String woCode, Long id, double doubleValue) { + baseMapper.updateRealTimeLock(woCode, id.toString(), doubleValue); + } + + private boolean checkRealTimeLock(String woCode, String rlsId) { + return baseMapper.checkRealTimeLock(woCode, rlsId); + } + + @Override + public Double findPriceByParams(Long goodsId, String checkNo) { + return baseMapper.findPriceByParams(goodsId, checkNo); + } + + @Override + public IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId) { + return baseMapper.selectByGoodsIdShId(goodsId, shId, deptId); + } + +// @Override +// public IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, String deptId, Integer current, Integer size) { +// int curr = current == null || current < 1 ? 1 : current; +// int sz = size == null || size < 1 ? 10 : size; +// IPage page = new Page<>(curr, sz); +// return baseMapper.selectGoodsOut(page, filterValue, shId, goodsId, deptId); +// } + + + @Override + public void stockProcessing(List sbList, Short status, BladeUser curUserInfo) throws Exception { + StRealtimeStock rs = null; + for (StStoreBill sb : sbList) { + rs = this.getById(sb.getGoodsId()); + if(rs == null){ + throw new BusinessException("当前物料无可用库存,无法借出!"); + } + if (status.equals(StStoreBill.BILLSOURCE_BORROW)) { + Double surplusQuantity = rs.getQuantity() - rs.getOccupyQuantity(); + if (sb.getQuantity() > surplusQuantity) { + throw new BusinessException("库存剩余数量不足!"); + } + rs.setOccupyQuantity(rs.getOccupyQuantity() + sb.getQuantity()); + this.updateById(rs); + } else if (status.equals(StStoreBill.BILLSOURCE_RETURN)) { + if (sb.getBillSource().equals(StStoreBill.BILLSOURCE_RETURN)) { + rs.setSumNum(rs.getSumNum() + sb.getUseNum()); + this.updateById(rs); + } + } + sb = stStoreBillService.getById(sb.getId()); + sb.setCurStatus(StStoreBill.CURSTATUS_COMPLETE); + stStoreBillService.updateById(sb); + } + } + + @Override + public IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, IPage page) { + return this.baseMapper.selectGoodsOut(page, filterValue, shId, goodsId); + } + + @Override + public StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId) { + return baseMapper.getFirstByGoodsCodeAndDeptId(goodsCode, deptId); + } + + @Override + public StRealtimeStock getByBarCode(String barCode) { + return baseMapper.getByBarCode(barCode); + } + + @Override + public StRealtimeStock getByGoodsCode(String barCode) { + return baseMapper.getByGoodsCode(barCode); + } + + @Override + public List exportStRealtimeStock (Wrapper < StRealtimeStock > queryWrapper) { + List stRealtimeStockList = baseMapper.exportStRealtimeStock(queryWrapper); + //stRealtimeStockList.forEach(stRealtimeStock -> { + // stRealtimeStock.setTypeName(DictCache.getValue(DictEnum.YES_NO, StRealtimeStock.getType())); + //}); + return stRealtimeStockList; + } + + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java new file mode 100644 index 000000000..d980f5e78 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java @@ -0,0 +1,39 @@ +package org.springblade.wms.wrapper; + +import org.springblade.core.mp.support.BaseEntityWrapper; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.wms.pojo.entity.StRealtimeStock; +import org.springblade.wms.pojo.vo.StRealtimeStockVO; + +import java.util.Objects; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StRealtimeStockWrapper + * @description: 仓库实时结余表 包装类,返回视图层所需的字段 + * @autor: WuSiYu + * @create 2025-12-15 14:54 + **/ + +public class StRealtimeStockWrapper extends BaseEntityWrapper { + + public static StRealtimeStockWrapper build() { + return new StRealtimeStockWrapper(); + } + + @Override + public StRealtimeStockVO entityVO(StRealtimeStock stRealtimeStock) { + StRealtimeStockVO stRealtimeStockVO = Objects.requireNonNull(BeanUtil.copyProperties(stRealtimeStock, StRealtimeStockVO.class)); + + //User createUser = UserCache.getUser(stRealtimeStock.getCreateUser()); + //User updateUser = UserCache.getUser(stRealtimeStock.getUpdateUser()); + //stRealtimeStockVO.setCreateUserName(createUser.getName()); + //stRealtimeStockVO.setUpdateUserName(updateUser.getName()); + + return stRealtimeStockVO; + } + + +} + From 06855268a35add6eafe2f556c9e8ecd4ac23cdbf Mon Sep 17 00:00:00 2001 From: wusiyu <2015098864@qq.com> Date: Fri, 23 Jan 2026 11:45:14 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/controller/StGoodsController.java | 167 +++++++++ .../springblade/wms/excel/StGoodsExcel.java | 326 ++++++++++++++++++ .../springblade/wms/mapper/StGoodsMapper.java | 47 +++ .../springblade/wms/mapper/StGoodsMapper.xml | 109 ++++++ .../springblade/wms/pojo/dto/StGoodsDTO.java | 24 ++ .../springblade/wms/pojo/entity/StGoods.java | 277 +++++++++++++++ .../springblade/wms/pojo/vo/StGoodsVO.java | 24 ++ .../wms/service/IStGoodsService.java | 55 +++ .../wms/service/impl/StGoodsServiceImpl.java | 200 +++++++++++ .../wms/wrapper/StGoodsWrapper.java | 39 +++ 10 files changed, 1268 insertions(+) create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java new file mode 100644 index 000000000..3a8d702d6 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java @@ -0,0 +1,167 @@ +package org.springblade.wms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.annotation.IsAdmin; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.wms.excel.StGoodsExcel; +import org.springblade.wms.pojo.entity.StGoods; +import org.springblade.wms.pojo.vo.StGoodsVO; +import org.springblade.wms.service.IStGoodsService; +import org.springblade.wms.wrapper.StGoodsWrapper; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsController + * @description: + * @autor: WuSiYu + * @create 2025-12-10 11:39 + **/ + +@RestController +@AllArgsConstructor +@RequestMapping("/stGoods") +@Tag(name = "物料信息表", description = "物料信息表接口") +public class StGoodsController extends BladeController { + + private final IStGoodsService stGoodsService; + + /** + * 物料信息表 详情 + */ + @GetMapping("/detail") + @ApiOperationSupport(order = 1) + @Operation(summary = "详情", description = "传入stGoods") + public R detail(StGoods stGoods) { + StGoods detail = stGoodsService.getOne(Condition.getQueryWrapper(stGoods)); + return R.data(StGoodsWrapper.build().entityVO(detail)); + } + /** + * 物料信息表 分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 2) + @Operation(summary = "分页", description = "传入stGoods") + public R> list(@Parameter(hidden = true) @RequestParam Map stGoods, Query query) { + QueryWrapper wrapper = Condition.getQueryWrapper(stGoods, StGoods.class); + wrapper.eq("is_deleted", 0); + IPage pages = stGoodsService.page(Condition.getPage(query), Condition.getQueryWrapper(stGoods, StGoods.class)); + return R.data(StGoodsWrapper.build().pageVO(pages)); + } + + /** + * 物料信息表 自定义分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入stGoods") + public R> page(StGoodsVO stGoods, Query query) { + stGoods.setIsDeleted(0); + IPage pages = stGoodsService.selectStGoodsPage(Condition.getPage(query), stGoods); + return R.data(pages); + } + + /** + * 物料信息表 新增 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 4) + @Operation(summary = "新增", description = "传入stGoods") + public R save(@Valid @RequestBody String goodsCode) throws Exception{ + stGoodsService.saveGoods(goodsCode); + return R.success(); + } + + /** + * 物料信息表 修改 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 5) + @Operation(summary = "修改", description = "传入stGoods") + public R update(@Valid @RequestBody StGoods stGoods) { + return R.status(stGoodsService.updateById(stGoods)); + } + + /** + * 物料信息表 新增或修改 + */ + @PostMapping("/submit") + @ApiOperationSupport(order = 6) + @Operation(summary = "新增或修改", description = "传入stGoods") + public R submit(@Valid @RequestBody StGoods stGoods) { + return R.status(stGoodsService.saveOrUpdate(stGoods)); + } + + /** + * 物料信息表 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 7) + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(stGoodsService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 设置物料状态 + */ + @PostMapping("/setUsed") + @ApiOperationSupport(order = 8) + @Operation(summary = "设置物料状态", description = "传入goodsId(物料ID)和used(状态:true=启用,false=禁用)") + public R setUsed(@Validated @RequestBody StGoods stGoods) throws Exception { + stGoodsService.changeUsed(stGoods.getId(), stGoods.getUsed()); + return R.success(); + } + + /** + * 根据物料编码查询物料 + */ + @GetMapping("/getGoodsByGoodsCode") + @ApiOperationSupport(order = 9) + @Operation(summary = "根据物料编码查询物料", description = "传入物料编码goodsCode(路径参数)") + public R getGoodsByGoodsCode( + @Validated + @PathVariable(value = "goodsCode") String goodsCode + ) throws Exception { + Object goods = stGoodsService.queryByCode(goodsCode); + return R.data(goods); + } + + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-stGoods") + @ApiOperationSupport(order = 10) + @Operation(summary = "导出数据", description = "传入stGoods") + public void exportStGoods(@Parameter(hidden = true) @RequestParam Map stGoods, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper queryWrapper = Condition.getQueryWrapper(stGoods, StGoods.class); + //if (!AuthUtil.isAdministrator()) { + // queryWrapper.lambda().eq(StGoods::getTenantId, bladeUser.getTenantId()); + //} + //queryWrapper.lambda().eq(StGoodsEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED); + List list = stGoodsService.exportStGoods(queryWrapper); + ExcelUtil.export(response, "物料信息表数据" + DateUtil.time(), "物料信息表数据表", list, StGoodsExcel.class); + } + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java new file mode 100644 index 000000000..77428609e --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java @@ -0,0 +1,326 @@ +package org.springblade.wms.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsExcel + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:26 + **/ + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class StGoodsExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ColumnWidth(20) + @ExcelProperty("主键") + private Long id; + /** + * 租户ID(默认值:000000) + */ + @ColumnWidth(20) + @ExcelProperty("租户ID(默认值:000000)") + private String tenantId; + /** + * 是否已删除(默认值:0) + */ + @ColumnWidth(20) + @ExcelProperty("是否已删除(默认值:0)") + private Long isDeleted; + /** + * 物料编码 + */ + @ColumnWidth(20) + @ExcelProperty("物料编码") + private String goodsCode; + /** + * 物料名称 + */ + @ColumnWidth(20) + @ExcelProperty("物料名称") + private String goodsName; + /** + * 最高库存 + */ + @ColumnWidth(20) + @ExcelProperty("最高库存") + private Double maxNum; + /** + * 最低库存 + */ + @ColumnWidth(20) + @ExcelProperty("最低库存") + private Double minNum; + /** + * 采购数量 + */ + @ColumnWidth(20) + @ExcelProperty("采购数量") + private Double purchaseQuantity; + /** + * 必检标识 + */ + @ColumnWidth(20) + @ExcelProperty("必检标识") + private Short mustCheck; + /** + * 是否停用(默认值:0) + */ + @ColumnWidth(20) + @ExcelProperty("是否停用(默认值:0)") + private Boolean used; + /** + * 使用件数核算 + */ + @ColumnWidth(20) + @ExcelProperty("使用件数核算") + private Short numAcc; + /** + * 产地 + */ + @ColumnWidth(20) + @ExcelProperty("产地") + private String madeIn; + /** + * 单价 + */ + @ColumnWidth(20) + @ExcelProperty("单价") + private Double price; + /** + * 等级 + */ + @ColumnWidth(20) + @ExcelProperty("等级") + private String grade; + /** + * 来源 1=自制 2=外购 + */ + @ColumnWidth(20) + @ExcelProperty("来源 1=自制 2=外购") + private Short source; + /** + * 组件模式 + */ + @ColumnWidth(20) + @ExcelProperty("组件模式") + private String prtType; + /** + * 版本 + */ + @ColumnWidth(20) + @ExcelProperty("版本") + private String releaseNo; + /** + * 版本时间 + */ + @ColumnWidth(20) + @ExcelProperty("版本时间") + private Date releaseNoTime; + /** + * 型号 + */ + @ColumnWidth(20) + @ExcelProperty("型号") + private String materialModel; + /** + * 重量 + */ + @ColumnWidth(20) + @ExcelProperty("重量") + private Double weight; + /** + * 计量单位 + */ + @ColumnWidth(20) + @ExcelProperty("计量单位") + private String unitName; + /** + * 产品类别 + */ + @ColumnWidth(20) + @ExcelProperty("产品类别") + private String productCategory; + /** + * 规格型号 + */ + @ColumnWidth(20) + @ExcelProperty("规格型号") + private String specifications; + /** + * 技术条件 + */ + @ColumnWidth(20) + @ExcelProperty("技术条件") + private String productTechSpec; + /** + * 密度 + */ + @ColumnWidth(20) + @ExcelProperty("密度") + private Double density; + /** + * 图号 + */ + @ColumnWidth(20) + @ExcelProperty("图号") + private String drawingNo; + /** + * 变更通告编号 + */ + @ColumnWidth(20) + @ExcelProperty("变更通告编号") + private String ecnNo; + /** + * 是否成品(默认值:0) + */ + @ColumnWidth(20) + @ExcelProperty("是否成品(默认值:0)") + private Short endItem; + /** + * 优选等级 + */ + @ColumnWidth(20) + @ExcelProperty("优选等级") + private String priority; + /** + * 超级链接 + */ + @ColumnWidth(20) + @ExcelProperty("超级链接") + private String partLink; + /** + * 腔数 + */ + @ColumnWidth(20) + @ExcelProperty("腔数") + private String cavityNo; + /** + * 采购部门 + */ + @ColumnWidth(20) + @ExcelProperty("采购部门") + private Long deptId; + /** + * 物料类别 + */ + @ColumnWidth(20) + @ExcelProperty("物料类别") + private Long gcId; + /** + * 生命周期状态 + */ + @ColumnWidth(20) + @ExcelProperty("生命周期状态") + private String partRevisionStatus; + /** + * 牌号 + */ + @ColumnWidth(20) + @ExcelProperty("牌号") + private String tradeMark; + /** + * 备注 + */ + @ColumnWidth(20) + @ExcelProperty("备注") + private String remark; + /** + * 锁料数量 + */ + @ColumnWidth(20) + @ExcelProperty("锁料数量") + private Double lockQuantity; + /** + * 在途数量 + */ + @ColumnWidth(20) + @ExcelProperty("在途数量") + private Double onthewayQuantity; + /** + * 当前库存 + */ + @ColumnWidth(20) + @ExcelProperty("当前库存") + private Double currentQuantity; + /** + * 物料类型 + */ + @ColumnWidth(20) + @ExcelProperty("物料类型") + private Long goodsType; + /** + * 大类 + */ + @ColumnWidth(20) + @ExcelProperty("大类") + private String matBigClassify; + /** + * 小类 + */ + @ColumnWidth(20) + @ExcelProperty("小类") + private String matSmallClassify; + /** + * 检验编号 + */ + @ColumnWidth(20) + @ExcelProperty("检验编号") + private String checkCode; + /** + * 批次号 + */ + @ColumnWidth(20) + @ExcelProperty("批次号") + private String batch; + /** + * 表面积 + */ + @ColumnWidth(20) + @ExcelProperty("表面积") + private Double sectionArea; + /** + * 物料属性 + */ + @ColumnWidth(20) + @ExcelProperty("物料属性") + private Long materialProperty; + /** + * PDM单位 + */ + @ColumnWidth(20) + @ExcelProperty("PDM单位") + private String pdmUnit; + /** + * 是否工艺审批 + */ + @ColumnWidth(20) + @ExcelProperty("是否工艺审批") + private String processApproval; + /** + * 是否最低库存预警 + */ + @ColumnWidth(20) + @ExcelProperty("是否最低库存预警") + private String minWarning; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java new file mode 100644 index 000000000..bf5e2c61e --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java @@ -0,0 +1,47 @@ +package org.springblade.wms.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springblade.wms.excel.StGoodsExcel; +import org.springblade.wms.pojo.entity.StGoods; +import org.springblade.wms.pojo.vo.StGoodsVO; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsMapper + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:23 + **/ + +public interface StGoodsMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stGoods 查询参数 + * @return List + */ + List selectStGoodsPage(IPage page, StGoodsVO stGoods); + + StGoods queryByCode(@Param("goodsCode") String goodsCode); + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStGoods(@Param("ew") Wrapper queryWrapper); + + StGoods queryByCodeAndVersion(@Param("patno") String prtno, @Param("releaseNo") String releaseNo); + + List selectFindAllGoodsPage(IPage page, StGoodsVO stGoods); +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml new file mode 100644 index 000000000..bc025cc0b --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java new file mode 100644 index 000000000..cdb58eee0 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java @@ -0,0 +1,24 @@ +package org.springblade.wms.pojo.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StGoods; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsDTO + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:14 + **/ + +@Data +@EqualsAndHashCode(callSuper = true) +public class StGoodsDTO extends StGoods { + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java new file mode 100644 index 000000000..272627f73 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java @@ -0,0 +1,277 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoods + * @description: + * @autor: WuSiYu + * @create 2025-12-09 18:11 + **/ + +@Data +@TableName("ST_GOODS") +@Schema(description = "StGoods对象") +@EqualsAndHashCode(callSuper = true) +public class StGoods extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 物料编码 + */ + @Schema(description = "物料编码") + private String goodsCode; + /** + * 物料名称 + */ + @Schema(description = "物料名称") + private String goodsName; + /** + * 最高库存 + */ + @Schema(description = "最高库存") + private Double maxNum; + /** + * 最低库存 + */ + @Schema(description = "最低库存") + private Double minNum; + /** + * 采购数量 + */ + @Schema(description = "采购数量") + private Double purchaseQuantity; + /** + * 必检标识 + */ + @Schema(description = "必检标识") + private Short mustCheck; + /** + * 是否停用(默认值:0) + */ + @Schema(description = "是否停用(默认值:0)") + private Boolean used; + /** + * 使用件数核算 + */ + @Schema(description = "使用件数核算") + private Short numAcc; + /** + * 产地 + */ + @Schema(description = "产地") + private String madeIn; + /** + * 单价 + */ + @Schema(description = "单价") + private Double price; + /** + * 等级 + */ + @Schema(description = "等级") + private String grade; + /** + * 来源 1=自制 2=外购 + */ + @Schema(description = "来源 1=自制 2=外购") + private Short source; + /** + * 组件模式 + */ + @Schema(description = "组件模式") + private String prtType; + /** + * 版本 + */ + @Schema(description = "版本") + private String releaseNo; + /** + * 版本时间 + */ + @Schema(description = "版本时间") + private Date releaseNoTime; + /** + * 型号 + */ + @Schema(description = "型号") + private String materialModel; + /** + * 重量 + */ + @Schema(description = "重量") + private Double weight; + /** + * 计量单位 + */ + @Schema(description = "计量单位") + private String unitName; + /** + * 产品类别 + */ + @Schema(description = "产品类别") + private String productCategory; + /** + * 规格型号 + */ + @Schema(description = "规格型号") + private String specifications; + /** + * 技术条件 + */ + @Schema(description = "技术条件") + private String productTechSpec; + /** + * 密度 + */ + @Schema(description = "密度") + private Double density; + /** + * 图号 + */ + @Schema(description = "图号") + private String drawingNo; + /** + * 变更通告编号 + */ + @Schema(description = "变更通告编号") + private String ecnNo; + /** + * 是否成品(默认值:0) + */ + @Schema(description = "是否成品(默认值:0)") + private Short endItem; + /** + * 优选等级 + */ + @Schema(description = "优选等级") + private String priority; + /** + * 超级链接 + */ + @Schema(description = "超级链接") + private String partLink; + /** + * 腔数 + */ + @Schema(description = "腔数") + private String cavityNo; + /** + * 采购部门 + */ + @Schema(description = "采购部门") + private Long deptId; + /** + * 物料类别 + */ + @Schema(description = "物料类别") + private Long gcId; + /** + * 生命周期状态 + */ + @Schema(description = "生命周期状态") + private String partRevisionStatus; + /** + * 牌号 + */ + @Schema(description = "牌号") + private String tradeMark; + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + /** + * 锁料数量 + */ + @Schema(description = "锁料数量") + private Double lockQuantity; + /** + * 在途数量 + */ + @Schema(description = "在途数量") + private Double onthewayQuantity; + /** + * 当前库存 + */ + @Schema(description = "当前库存") + private Double currentQuantity; + /** + * 物料类型 + */ + @Schema(description = "物料类型") + private Long goodsType; + /** + * 大类 + */ + @Schema(description = "大类") + private String matBigClassify; + /** + * 小类 + */ + @Schema(description = "小类") + private String matSmallClassify; + /** + * 检验编号 + */ + @Schema(description = "检验编号") + private String checkCode; + /** + * 批次号 + */ + @Schema(description = "批次号") + private String batch; + /** + * 表面积 + */ + @Schema(description = "表面积") + private Double sectionArea; + /** + * 物料属性 + */ + @Schema(description = "物料属性") + private Long materialProperty; + /** + * PDM单位 + */ + @Schema(description = "PDM单位") + private String pdmUnit; + /** + * 是否工艺审批 + */ + @Schema(description = "是否工艺审批") + private String processApproval; + /** + * 是否最低库存预警 + */ + @Schema(description = "是否最低库存预警") + private String minWarning; + + /** + * 自制 + */ + public static Short MAKE_PROPERTIES_SELF = 1; + /** + * 外购 + */ + public static Short MAKE_PROPERTIES_OUT = 2; + + public void setSourceByStr(String str) { + if ("自制".equals(str)) { + this.source = MAKE_PROPERTIES_SELF; + } else if ("外购".equals(str)) { + this.source = MAKE_PROPERTIES_OUT; + } + } +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java new file mode 100644 index 000000000..6b1cbbb24 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java @@ -0,0 +1,24 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StGoods; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsVO + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:15 + **/ + +@Data +@EqualsAndHashCode(callSuper = true) +public class StGoodsVO extends StGoods { + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java new file mode 100644 index 000000000..d89002be6 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java @@ -0,0 +1,55 @@ +package org.springblade.wms.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.wms.excel.StGoodsExcel; +import org.springblade.wms.pojo.entity.StGoods; +import org.springblade.wms.pojo.vo.StGoodsVO; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName IStGoodsService + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:18 + **/ + +public interface IStGoodsService extends BaseService { + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stGoods 查询参数 + * @return IPage + */ + IPage selectStGoodsPage(IPage page, StGoodsVO stGoods); + + void changeUsed(Long id, Boolean used) throws Exception; + + StGoods queryByCode(String goodsCode); + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStGoods(Wrapper queryWrapper); + + void saveGoods(String goodsCode) throws Exception; + + StGoods queryByCodeAndVersion(String prtno, String releaseNo); + + void addOnthewayQuantity(Long goodsId, Double num); + + void addCurQuantity(Long goodsId, Double quantity); + + IPage selectFindAllGoodsPage(IPage page, StGoodsVO stGoods); + + void addLockQuantity(Long goodsId, double v); +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java new file mode 100644 index 000000000..f2d6c4bd4 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java @@ -0,0 +1,200 @@ +package org.springblade.wms.service.impl; + +import cn.hutool.core.util.NumberUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.wms.excel.StGoodsExcel; +import org.springblade.wms.mapper.StGoodsClassMapper; +import org.springblade.wms.mapper.StGoodsMapper; +import org.springblade.wms.pojo.dto.StPdmPartDTO; +import org.springblade.wms.pojo.entity.StGoods; +import org.springblade.wms.pojo.entity.StGoodsExt; +import org.springblade.wms.pojo.vo.StGoodsVO; +import org.springblade.wms.service.IStGoodsExtService; +import org.springblade.wms.service.IStGoodsService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsServiceImpl + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:21 + **/ + +@Service +@Slf4j +public class StGoodsServiceImpl extends BaseServiceImpl implements IStGoodsService { + @Resource + private StHttpRequestService stHttpRequestService; + @Resource + private IStGoodsExtService stGoodsExtService; + + @Override + public IPage selectStGoodsPage(IPage page, StGoodsVO stGoods) { + return page.setRecords(baseMapper.selectStGoodsPage(page, stGoods)); + } + + @Override + public IPage selectFindAllGoodsPage(IPage page, StGoodsVO stGoods) { + return page.setRecords(baseMapper.selectFindAllGoodsPage(page, stGoods)); + } + + @Override + public void saveGoods(String goodsCode) throws Exception { + StGoods stGoods = baseMapper.queryByCode(goodsCode); + if (stGoods != null) { + throw new Exception("该物料已存在!"); + } else { + List prtnoList = new ArrayList<>(); + prtnoList.add(goodsCode); +// saveGoodsInfo(prtnoList); + + } + } + + /*public void saveGoodsInfo(List prtnoList) throws Exception { + StGoods goods = null; + //查询物料信息 + List pdmPartInfo = stHttpRequestService.getPdmPartInfo(prtnoList); + log.debug("pdmPartInfo:{}", pdmPartInfo); + + if (pdmPartInfo != null) { + for (StPdmPartDTO dto : pdmPartInfo) { + //保存物料信息 + goods = this.queryByCodeAndVersion(dto.getPrtno(), dto.getReleaseNo()); + if (goods == null) { + goods = new StGoods(); + // goods.setDept(); + goods.setDrawingNo(dto.getDrwpartno()); + goods.setGoodsCode(dto.getPrtno()); + goods.setGoodsName(dto.getPrtdesc()); + goods.setDensity(dto.getDensity()); + goods.setPrtType(dto.getPrtType()); + goods.setSourceByStr(dto.getSource()); + goods.setSpecifications(dto.getMtlspcf()); + goods.setUnitName(dto.getPrtum()); + goods.setCavityNo(dto.getCavityNo()); + goods.setProductCategory(dto.getProductCategory()); + goods.setEcnNo(dto.getEcnNo()); + goods.setEndItem(dto.getEndItem()); + goods.setMaterialModel(dto.getMaterialModel()); + goods.setPartLink(dto.getPartLink()); + goods.setPriority(dto.getPriority()); + goods.setPartRevisionStatus(dto.getPartRevisionStatus()); + goods.setProductTechSpec(dto.getProductTechSpec()); + goods.setWeight(dto.getWeight()); + goods.setReleaseNo(dto.getReleaseNo()); + goods.setRemark(dto.getRemark()); + goods.setTradeMark(dto.getTradeMark()); + goods.setUsed(Boolean.TRUE); + goods.setIsDeleted(0); + goods.setCreateTime(new Date()); + goods.setReleaseNoTime(dto.getRcdchgdatd()); + this.save(goods); + } + } + } + }*/ + + @Override + public StGoods queryByCodeAndVersion(String prtno, String releaseNo) { + return baseMapper.queryByCodeAndVersion(prtno, releaseNo); + } + + @Override + public void changeUsed(Long id, Boolean used) throws Exception { + StGoods stGoods = this.getById(id); + if (stGoods == null) { + return; + } + stGoods.setUsed(used); + this.updateById(stGoods); + + } + + @Override + public StGoods queryByCode(String goodsCode) { + return baseMapper.queryByCode(goodsCode); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addOnthewayQuantity(Long goodsId, Double num) { + StGoods coGoods = baseMapper.selectById(goodsId); + if (coGoods == null) { + throw new ServiceException("物料不存在或已停用:ID=" + goodsId); + } + + // 累加在途数量(负值自动归零) + double ontheway = NumberUtil.add( + BigDecimal.valueOf(coGoods.getOnthewayQuantity()), + BigDecimal.valueOf(num) + ).doubleValue(); + if (ontheway < 0) { + ontheway = 0D; + } + coGoods.setOnthewayQuantity(ontheway); + baseMapper.updateById(coGoods); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addCurQuantity(Long goodsId, Double num) { + StGoods stGoods = baseMapper.selectById(goodsId); + if (stGoods == null) { + throw new ServiceException("物料不存在:ID=" + goodsId); + } + + // 累加当前库存(负值自动归零) + double curQuantity = NumberUtil.add( + BigDecimal.valueOf(stGoods.getCurrentQuantity()), + BigDecimal.valueOf(num) + ).doubleValue(); + if (curQuantity < 0) { + curQuantity = 0D; + } + stGoods.setCurrentQuantity(curQuantity); + baseMapper.updateById(stGoods); + + // 同步更新物料扩展表二级库存 + StGoodsExt stGoodsExt = stGoodsExtService.getById(stGoods.getId()); + if (stGoodsExt != null) { + stGoodsExt.setLastStore(curQuantity); + stGoodsExtService.updateById(stGoodsExt); + } + } + + @Override + public void addLockQuantity(Long goodsId, double num) { + StGoods stGoods = this.getById(goodsId); + Double lockQuantity = + BigDecimal.valueOf(stGoods.getLockQuantity()).add(BigDecimal.valueOf(num)).doubleValue(); + if (lockQuantity < 0) { + lockQuantity = 0d; + } + stGoods.setLockQuantity(lockQuantity); + } + + @Override + public List exportStGoods(Wrapper queryWrapper) { + List stGoodsList = baseMapper.exportStGoods(queryWrapper); + //stGoodsList.forEach(stGoods -> { + // stGoods.setTypeName(DictCache.getValue(DictEnum.YES_NO, StGoods.getType())); + //}); + return stGoodsList; + } + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java new file mode 100644 index 000000000..9a07a8788 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java @@ -0,0 +1,39 @@ +package org.springblade.wms.wrapper; + +import org.springblade.core.mp.support.BaseEntityWrapper; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.wms.pojo.entity.StGoods; +import org.springblade.wms.pojo.vo.StGoodsVO; + +import java.util.Objects; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGoodsWrapper + * @description: + * @autor: WuSiYu + * @create 2025-12-12 14:30 + **/ + +public class StGoodsWrapper extends BaseEntityWrapper { + + public static StGoodsWrapper build() { + return new StGoodsWrapper(); + } + + @Override + public StGoodsVO entityVO(StGoods stGoods) { + StGoodsVO stGoodsVO = Objects.requireNonNull(BeanUtil.copyProperties(stGoods, StGoodsVO.class)); + + //User createUser = UserCache.getUser(stGoods.getCreateUser()); + //User updateUser = UserCache.getUser(stGoods.getUpdateUser()); + //stGoodsVO.setCreateUserName(createUser.getName()); + //stGoodsVO.setUpdateUserName(updateUser.getName()); + + return stGoodsVO; + } + + +} + From 046942137bb0a49241d215410daba7ff9f151797 Mon Sep 17 00:00:00 2001 From: wusiyu <2015098864@qq.com> Date: Fri, 23 Jan 2026 14:11:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=AE=9E=E4=BD=93=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/pojo/entity/StStockInoutRecord.java | 172 ++++++++++++++++++ .../wms/pojo/entity/StStorageLocation.java | 67 +++++++ .../wms/pojo/entity/StStoreBill.java | 150 +++++++++++++++ 3 files changed, 389 insertions(+) create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java new file mode 100644 index 000000000..652a0763c --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java @@ -0,0 +1,172 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; +import org.springframework.data.annotation.Transient; + +import java.io.Serial; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StStockInoutRecord + * @description: 出入库记录表 实体类 + * @autor: WuSiYu + * @create 2026-01-04 11:08 + **/ + +@Data +@TableName("ST_STOCK_INOUT_RECORD") +@Schema(description = "StStockInoutRecord对象") +@EqualsAndHashCode(callSuper = true) +public class StStockInoutRecord extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 库位ID(关联st_storage_location表主键) + */ + @Schema(description = "库位ID(关联st_storage_location表主键)") + private Long slId; + /** + * 库存ID(关联st_realtime_stock表主键) + */ + @Schema(description = "库存ID(关联st_realtime_stock表主键)") + private Long rlsId; + /** + * 仓库ID(关联st_storehouse表主键) + */ + @Schema(description = "仓库ID(关联st_storehouse表主键)") + private Long shId; + /** + * 批号 + */ + @Schema(description = "批号") + private String piNo; + /** + * 出入库数量 + */ + @Schema(description = "出入库数量") + private Double quantity; + /** + * 金额 + */ + @Schema(description = "金额") + private Double sirMoney; + /** + * 采购单号 + */ + @Schema(description = "采购单号") + private String buyCode; + /** + * 检验单号 + */ + @Schema(description = "检验单号") + private String checkNo; + /** + * 生产标识 + */ + @Schema(description = "生产标识") + private String quantityLevel; + /** + * 是否模架物料 1=是/0=否(默认值:0) + */ + @Schema(description = "是否模架物料 1=是/0=否(默认值:0)") + private Boolean moldBaseMaterial; + /** + * 过期/报废日期 + */ + @Schema(description = "过期/报废日期") + private Date scrapCycle; + /** + * 炉批号 + */ + @Schema(description = "炉批号") + private String stovePiNo; + /** + * 分厂id + */ + @Schema(description = "分厂id") + private String deptId; + /** + * 车间订单号 + */ + @Schema(description = "车间订单号") + private String woCode; + /** + * 出入库类型/出库或入库 + */ + @Schema(description = "出入库类型/出库或入库") + private String inOutType; + /** + * 出入库原因 + */ + @Schema(description = "出入库原因") + private String inOutReason; + /** + * 出入库日期 + */ + @Schema(description = "出入库日期") + private Date inOutDate; + /** + * 出入库来源 + */ + @Schema(description = "出入库来源") + private Short inOutSource; + /** + * 业务人员/领用人ID + */ + @Schema(description = "业务人员/领用人ID") + private Long userId; + /** + * 出入库单号 + */ + @Schema(description = "出入库单号") + private String sirCode; + /** + * 物料ID(关联st_goods表主键) + */ + @Schema(description = "物料ID(关联st_goods表主键)") + private Long goodsId; + /** + * 总金额 + */ + private Double allMoney; + /** + * 保管员 + */ + private String keeper; + /** + * 厚度 + */ + private String thickness; + /** + * 物料需求ID + */ + @Schema(description = "物料需求ID关联PvBomRequest") + private Long brId; + + private Date warehousingDate; + + private String barCode; + + /*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料 + 11:配额出库,12:其他出库,13:领料出库 15刀具出库*/ + public static final Short INOUT_SOURCE_PURCHASE_RECEIPT = 1; + public static final Short INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT = 2; + public static final Short INOUT_SOURCE_OTHER_PURCHASE_RECEIPT = 3; + public static final Short INOUT_SOURCE_TRANSFER_RECEIPT = 4; + public static final Short INOUT_SOURCE_WAREHOUSE_TRANSFER = 5; + public static final Short INOUT_SOURCE_PRODUCTION_MATERIAL_RETURN = 7; + public static final Short INOUT_SOURCE_QUOTA_OUT = 11; + public static final Short INOUT_SOURCE_OTHER_OUT = 12; + public static final Short INOUT_SOURCE_ASSIGN_OUT = 13; + public static final Short INOUT_SOURCE_TOOl_OUT = 15; + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java new file mode 100644 index 000000000..a8421aa04 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java @@ -0,0 +1,67 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StStorageLocation + * @description: 库位维护表 实体类 + * @autor: WuSiYu + * @create 2025-12-18 14:33 + **/ + +@Data +@TableName("ST_STORAGE_LOCATION") +@Schema(description = "StStorageLocation对象") +@EqualsAndHashCode(callSuper = true) +public class StStorageLocation extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 库房ID(关联st_storehouse表) + */ + @Schema(description = "库房ID(关联st_storehouse表)") + private Long shId; + /** + * 库位号 + */ + @Schema(description = "库位号") + private String location; + /** + * 物料编号(关联st_goods表goods_code字段) + */ + @Schema(description = "物料编号(关联st_goods表goods_code字段)") + private String goodsCode; + /** + * 物料名称 + */ + @Schema(description = "物料名称") + private String goodsName; + /** + * 物料规格 + */ + @Schema(description = "物料规格") + private String specifications; + /** + * 型号/牌号 + */ + @Schema(description = "型号/牌号") + private String materialModel; + /** + * 部门ID + */ + @Schema(description = "部门ID") + private Long deptId; + +} + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java new file mode 100644 index 000000000..56de0942e --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java @@ -0,0 +1,150 @@ +package org.springblade.wms.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StStoreBill + * @description: 仓库凭证 实体类 + * @autor: WuSiYu + * @create 2026-01-15 13:21 + **/ + +@Data +@TableName("ST_STORE_BILL") +@Schema(description = "StStoreBill对象") +@EqualsAndHashCode(callSuper = true) +public class StStoreBill extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 凭证分类;1,物料入库;2,物料出库;3,借用;4,归还;5,调出;6,调入;7,提请 ; + */ + @Schema(description = "凭证分类;1,物料入库;2,物料出库;3,借用;4,归还;5,调出;6,调入;7,提请 ;") + private Short billFlag; + /** + * 收发标志;true:入库,false:出库 + */ + @Schema(description = "收发标志;true:入库,false:出库") + private String reCeOrSend; + /** + * 物料信息 + */ + @Schema(description = "物料信息") + private Long goodsId; + /** + * 数量 + */ + @Schema(description = "数量") + private Double quantity; + /** + * 批号 + */ + @Schema(description = "批号") + private String piNo; + /** + * 金额 + */ + @Schema(description = "金额") + private Double money; + /** + * 使用次数 + */ + @Schema(description = "使用次数") + private Long useNum; + /** + * 检验编码 + */ + @Schema(description = "检验编码") + private String checkCode; + /** + * 凭证单号 + */ + @Schema(description = "凭证单号") + private String billCode; + /** + * 凭证日期 + */ + @Schema(description = "凭证日期") + private Date billDate; + /** + * 部门;外键(部门) + */ + @Schema(description = "部门;外键(部门)") + private String deptId; + /** + * 人员;外键(人员) + */ + @Schema(description = "人员;外键(人员)") + private Long billMan; + /** + * 原因;外键(原因) + */ + @Schema(description = "原因;外键(原因)") + private String bcId; + /** + * 来源;0:正常;1:采购;2:生产; + */ + @Schema(description = "来源;0:正常;1:采购;2:生产;") + private Short billSource; + /** + * 备注 + */ + @Schema(description = "备注") + private String memo; + /** + * 仓库;外键(仓库) + */ + @Schema(description = "仓库;外键(仓库)") + private Long stoId; + /** + * 状态;1:新建,20:完成 + */ + @Schema(description = "状态;1:新建,20:完成") + private Short curStatus; + /** + * 到期日期 + */ + @Schema(description = "到期日期") + private Date expirationDate; + /** + * 库位ID + */ + @Schema(description = "库位ID") + private Long slId; + /** + * 库房ID + */ + @Schema(description = "库房ID") + private Long shId; + + /** + * 借用 + */ + public static Short BILLSOURCE_BORROW = 4; + /** + * 归还 + */ + public static Short BILLSOURCE_RETURN = 5; + + /** + * 新建 + */ + public static Short CURSTATUS_NEW = 1; + /** + * 完成 + */ + public static Short CURSTATUS_COMPLETE = 20; + +} +