liweidong-hj 2 months ago
commit 78a305e0d2
  1. 33
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/dashboard/DataVerifyProcessor.java
  2. 39
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/wms/ExecuteStGoodsExtUpdateProcessor.java
  3. 83
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/excel/PlatingAssortmentExcel.java
  4. 5
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/feign/IWorkCenterClient.java
  5. 97
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlatingAssortment.java
  6. 36
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlatingAssortmentVO.java
  7. 10
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/feign/IOrderClient.java
  8. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/AssayContent.java
  9. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/MoldApply.java
  10. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHand.java
  11. 17
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClient.java
  12. 6
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClientFallback.java
  13. 11
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataWmsClient.java
  14. 9
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataWmsClientFallback.java
  15. 21
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/vo/StGoodsExtStatusVO.java
  16. 24
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/QualityGradeEntity.java
  17. 29
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java
  18. 2
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StBuyOrder.java
  19. 5
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StOtherOutRecord.java
  20. 290
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingAssortmentController.java
  21. 18
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/WorkCenterClient.java
  22. 39
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingAssortmentMapper.java
  23. 74
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingAssortmentMapper.xml
  24. 51
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlatingAssortmentService.java
  25. 119
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlatingAssortmentServiceImpl.java
  26. 43
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/wrapper/PlatingAssortmentWrapper.java
  27. 24
      blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml
  28. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEpciuInspectionPointController.java
  29. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java
  30. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEpciuInspectionPointService.java
  31. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsSafeInspectionPointService.java
  32. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEpciuInspectionPointServiceImpl.java
  33. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEpciuPatrolInspectionServiceImpl.java
  34. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsSafeInspectionPointServiceImpl.java
  35. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldOrderController.java
  36. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/feign/OrderClient.java
  37. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderMapper.java
  38. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/mapper/YieldOrderMapper.xml
  39. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/IYieldOrderService.java
  40. 24
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/MoldApplyServiceImpl.java
  41. 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/PlateGoodsRecordServiceImpl.java
  42. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java
  43. BIN
      blade-service/blade-desk/src/main/resources/Excel/oem/标准工序代码.xls
  44. 8
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataProduceClient.java
  45. 6
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataWmsClient.java
  46. 19
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataWmsMapper.java
  47. 16
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataWmsMapper.xml
  48. 4
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataProduceService.java
  49. 3
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataWmsService.java
  50. 54
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataProduceServiceImpl.java
  51. 11
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataWmsServiceImpl.java
  52. 123
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java
  53. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  54. 71
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  55. BIN
      blade-service/blade-scheduling/src/main/resources/excel/质量等级表数据导入模板.xlsx
  56. 4
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java
  57. 5
      blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StBuyOrderController.java
  58. 32
      blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java
  59. 3
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StAllotRecordMapper.xml
  60. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StExpireSubmissionMapper.xml
  61. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.java
  62. 27
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.xml
  63. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsExtService.java
  64. 14
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StBuyOrderServiceImpl.java
  65. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireSubmissionServiceImpl.java
  66. 58
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsExtServiceImpl.java
  67. 7
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherOutRecordServiceImpl.java
  68. 35
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java

@ -0,0 +1,33 @@
package org.springblade.job.processor.dashboard;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springblade.desk.order.feign.IOrderClient;
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;
/**
* 工艺模块-返工任务
* @author liweidong
*/
@Component
@Data
@Slf4j
public class DataVerifyProcessor implements BasicProcessor {
@Resource
private IOrderClient client;
@Override
public ProcessResult process(TaskContext context) throws Exception {
log.info("订单合规性校验任务开始");
CompletableFuture<Void> runFuture = CompletableFuture.runAsync(()->client.dataVerify());
log.info("订单合规性校验任务结束");
return new ProcessResult(true);
}
}

@ -0,0 +1,39 @@
package org.springblade.job.processor.wms;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springblade.wms.feign.WmsTaskClient;
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;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName ExecuteStGoodsExtUpdateProcessor
* @description:
* @autor: WuSiYu
* @create 2026-04-30 10:08
**/
@Component
@Data
@Slf4j
public class ExecuteStGoodsExtUpdateProcessor implements BasicProcessor {
@Resource
WmsTaskClient wmsTaskClient;
@Override
public ProcessResult process(TaskContext context) throws Exception {
log.info("开始执行物料状态同步erp");
try {
boolean result = wmsTaskClient.executeGoodsStatusUpdate();
log.info("===== 物料状态定时更新完成 =====");
return new ProcessResult(result);
} catch (Exception e) {
log.error("===== 物料状态定时更新异常 =====", e);
return new ProcessResult(false, e.getMessage());
}
}
}

@ -0,0 +1,83 @@
package org.springblade.desk.basic.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;
/**
* [镀种分类] Excel实体类
*
* @author BladeX
* @since 2026-04-29
*/
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class PlatingAssortmentExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 编码
*/
@ColumnWidth(20)
@ExcelProperty("编码")
private String code;
/**
* 名称
*/
@ColumnWidth(30)
@ExcelProperty("名称")
private String name;
/**
* 备注
*/
@ColumnWidth(40)
@ExcelProperty("备注")
private String memo;
/**
* 排序
*/
@ColumnWidth(10)
@ExcelProperty("排序")
private Long sort;
/**
* 班组成员
*/
@ColumnWidth(30)
@ExcelProperty("班组成员")
private String teamMember;
/**
* 状态
*/
@ColumnWidth(10)
@ExcelProperty("状态")
private String statusName;
/**
* 创建时间
*/
@ColumnWidth(20)
@ExcelProperty("创建时间")
private Date createTime;
/**
* 创建人
*/
@ColumnWidth(15)
@ExcelProperty("创建人")
private String createUserRealName;
}

@ -29,6 +29,7 @@ package org.springblade.desk.basic.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.pojo.entity.BasicClazz;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.entity.TeamSet;
import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springframework.cloud.openfeign.FeignClient;
@ -49,6 +50,7 @@ public interface IWorkCenterClient {
String GET_BY_ID = API_PREFIX + "/getById";
String GET_TeamSet_BY_ID = API_PREFIX + "/getTeamSetById";
String GET_Clazz_BY_ID = API_PREFIX + "/getClazzById";
String PLATING_ASSORTMENT_BY_ID = API_PREFIX + "platingAssortmentByid";
/**
* 根据id获取作业中心
*
@ -63,4 +65,7 @@ public interface IWorkCenterClient {
@GetMapping(GET_Clazz_BY_ID)
R<BasicClazz> getClazzById(@RequestParam("id") Long id);
@GetMapping(PLATING_ASSORTMENT_BY_ID)
R<PlatingAssortment> platingAssortmentByid(@RequestParam("id") Long id);
}

@ -0,0 +1,97 @@
package org.springblade.desk.basic.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.mp.base.BaseEntity;
import java.io.Serial;
import java.util.List;
/**
* [镀种分类] 实体类
* 对应表: BS_PLATING_ASSORTMENT
* 业务类别固定为 5 (TYPE_PLATING_ASSORT)
* 复制于 BS_BASIC_CLAZZ
* @author BladeX
* @since 2026-04-29
*/
@Data
@TableName("BS_PLATING_ASSORTMENT")
@Schema(description = "PlatingAssortment Entity对象")
@EqualsAndHashCode(callSuper = true)
public class PlatingAssortment extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 编码
*/
public static final String COL_CODE = "CODE";
/**
* 名称
*/
public static final String COL_NAME = "NAME";
/**
* 备注
*/
public static final String COL_MEMO = "MEMO";
/**
* 排序
*/
public static final String COL_SORT = "SORT";
/**
* 班组成员
*/
public static final String COL_TEAM_MEMBER = "TEAM_MEMBER";
/**
* 班组成员ID
*/
public static final String COL_TEAM_MEMBER_ID = "TEAM_MEMBER_ID";
/**
* 编码
*/
@Schema(description = "编码")
private String code;
/**
* 名称
*/
@Schema(description = "名称")
private String name;
/**
* 备注
*/
@Schema(description = "备注")
private String memo;
/**
* 排序
*/
@Schema(description = "排序")
private Long sort;
/**
* 班组成员名称
*/
@Schema(description = "班组成员名称")
private String teamMember;
/**
* 班组成员ID
*/
@Schema(description = "班组成员ID")
private String teamMemberId;
/**
* 用户ID列表非数据库字段
*/
@TableField(exist = false)
@Schema(description = "用户ID列表")
private List<Long> userIds;
}

@ -0,0 +1,36 @@
package org.springblade.desk.basic.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
/**
* [镀种分类] VO类
*
* @author BladeX
* @since 2026-04-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "PlatingAssortmentVO对象")
public class PlatingAssortmentVO extends PlatingAssortment {
/**
* 创建用户真实姓名
*/
@Schema(description = "创建用户真实姓名")
private String createUserRealName;
/**
* 创建部门名称
*/
@Schema(description = "创建部门名称")
private String createDeptName;
/**
* 更新用户真实姓名
*/
@Schema(description = "更新用户真实姓名")
private String updateUserRealName;
}

@ -20,6 +20,7 @@ public interface IOrderClient {
String SAVE_GLASS_CAKE = API_PREFIX + "/saveGlassCake";
String CALCULATE_COATING_MATERIAL = API_PREFIX + "/calculateCoatingMaterial";
String INIT_YIELD_ORDER_DAILY_ASSIGN = API_PREFIX + "/initYieldOrderDailyAssign";
String DATA_VERIFY = API_PREFIX + "/dataVerify";
/**
@ -42,4 +43,13 @@ public interface IOrderClient {
@GetMapping(INIT_YIELD_ORDER_DAILY_ASSIGN)
void initYieldOrderDailyAssign() throws Exception;
/**
* 合规性校验
*
* @return
*/
@GetMapping(DATA_VERIFY)
void dataVerify();
}

@ -37,10 +37,10 @@ public class AssayContent extends BaseEntity {
* 化验时间
*/
@DateTimeFormat(
pattern = "yyyy-MM-dd"
pattern = "yyyy-MM-dd HH:mm:ss"
)
@JsonFormat(
pattern = "yyyy-MM-dd"
pattern = "yyyy-MM-dd HH:mm:ss"
)
@TableField(value = "ASSAY_TIME")
private Date assayTime;

@ -104,4 +104,6 @@ public class MoldApply extends BaseEntity {
*/
@TableField(value = "MEMO")
private String memo;
private Long parentId;
}

@ -85,5 +85,6 @@ public class RaiseHand extends BaseEntity {
@Schema(description = "文件路径")
private String fileUrl;
@Schema(description = "文件名称")
private String fileName;
}

@ -1,19 +1,18 @@
package org.springblade.erpdata.feign;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import org.springblade.common.constant.LauncherConstant;
import org.springblade.core.tool.api.R;
import org.springblade.desk.produce.pojo.dto.MesRbRedoRoutDTO;
import org.springblade.erpdata.pojo.vo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
@ -26,7 +25,7 @@ import java.util.Map;
)
public interface IErpDataProduceClient {
String API_PREFIX = "/feign/erpdata/produce";
String API_PREFIX = "/feign/client/erpdata/produce";
String QUERY_BATCH = API_PREFIX + "/queryBatch";
String REWORK_ORDER = API_PREFIX + "/loadReworkOrder";
String REWORK_ORDER_SIZE = API_PREFIX + "/loadReworkOrderSize";
@ -47,6 +46,7 @@ public interface IErpDataProduceClient {
String CHECK_COMPLETE = API_PREFIX + "/checkComplete";
String PRO_RBINVIOGEN = API_PREFIX + "/proRbinviogen";
String PRO_RBTRANSFERLEV = API_PREFIX + "/proRbtransferlev";
String CREATE_MOLD_PLAN = API_PREFIX + "/createMoldPlan";
/**
@ -215,4 +215,15 @@ public interface IErpDataProduceClient {
@RequestParam(value = "recDept", required = false) String recDept, @RequestParam(value = "roamNo", required = false) String roamNo,
@RequestParam(value = "deliverKey", required = false) String deliverKey, @RequestParam(value = "testQty") Integer testQty,
@RequestParam(value = "lossQty") Integer lossQty, @RequestParam(value = "scrapQty") Integer scrapQty);
@GetMapping(CREATE_MOLD_PLAN)
R<String> createMoldPlan(@RequestParam(value = "partCode", required = false)String partCode,
@RequestParam(value = "moCode", required = false)String moCode,
@RequestParam(value = "plantype", required = false)String plantype,
@RequestParam(value = "quantity", required = false)Integer quantity,
@RequestParam(value = "needDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date needDate,
@RequestParam(value = "level", required = false)String level,
@RequestParam(value = "keeper", required = false)String keeper,
@RequestParam(value = "createMan", required = false)String createMan,
@RequestParam(value = "memo", required = false)String memo);
}

@ -2,7 +2,6 @@ package org.springblade.erpdata.feign;
import org.springblade.core.tool.api.R;
import org.springblade.desk.produce.pojo.dto.MesRbRedoRoutDTO;
import org.springblade.desk.produce.pojo.entity.OrderDeclare;
import org.springblade.erpdata.pojo.vo.*;
import org.springframework.stereotype.Component;
@ -119,4 +118,9 @@ public class IErpDataProduceClientFallback implements IErpDataProduceClient {
return R.fail("获取数据失败");
}
@Override
public R<String> createMoldPlan(String partCode, String moCode, String plantype, Integer quantity, Date needDate, String level, String keeper, String createMan, String memo) {
return R.fail("获取数据失败");
}
}

@ -3,6 +3,7 @@ package org.springblade.erpdata.feign;
import org.springblade.common.constant.LauncherConstant;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@ -34,6 +35,8 @@ public interface IErpDataWmsClient {
String DELETE_MOLD_PLAN = API_PREFIX + "/deleteMoldPlan";
String GET_GOODS_EXT_STATUS = API_PREFIX + "/getGoodsExtStatus";
/**
* 到期送检发送erp
*/
@ -50,7 +53,7 @@ public interface IErpDataWmsClient {
* 工装计划申报发送erp
*/
@PostMapping(CREATE_MOLD_PLAN)
R<String> createMoldPlan(@RequestParam("partCode")String partCode, @RequestParam("moCode")String moCode, @RequestParam("plantype")String plantype, @RequestParam("quantity")Double quantity,
R<String> createMoldPlan(@RequestParam(value = "partCode", required = false)String partCode, @RequestParam("moCode")String moCode, @RequestParam("plantype")String plantype, @RequestParam("quantity")Double quantity,
@RequestParam("needDate")Date needDate, @RequestParam("level")String level, @RequestParam("keeper")String keeper, @RequestParam("createMan")String createMan,
@RequestParam("memo")String memo, @RequestParam("urgentType")String urgentType, @RequestParam("erpWoCode")String erpWoCode) throws BusinessException;
@ -60,4 +63,10 @@ public interface IErpDataWmsClient {
@PostMapping(DELETE_MOLD_PLAN)
R<String> deleteMoldPlan(@RequestParam("erpWoCode")String erpWoCode) throws BusinessException;
/**
* 物料状态监控同步
*/
@PostMapping(GET_GOODS_EXT_STATUS)
R<StGoodsExtStatusVO> getGoodsExtStatus(@RequestParam("goodsCode")String goodsCode);
}

@ -1,6 +1,7 @@
package org.springblade.erpdata.feign;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
@ -29,7 +30,7 @@ public class IErpDataWmsClientFallback implements IErpDataWmsClient{
}
@Override
public R<String> createMoldPlan(@RequestParam("partCode")String partCode, @RequestParam("moCode")String moCode, @RequestParam("plantype")String plantype, @RequestParam("quantity")Double quantity,
public R<String> createMoldPlan(@RequestParam(value = "partCode", required = false)String partCode, @RequestParam("moCode")String moCode, @RequestParam("plantype")String plantype, @RequestParam("quantity")Double quantity,
@RequestParam("needDate") Date needDate, @RequestParam("level")String level, @RequestParam("keeper")String keeper, @RequestParam("createMan")String createMan,
@RequestParam("memo")String memo, @RequestParam("urgentType")String urgentType, @RequestParam("erpWoCode")String erpWoCode) {
return R.fail("获取数据失败");
@ -39,4 +40,10 @@ public class IErpDataWmsClientFallback implements IErpDataWmsClient{
public R<String> deleteMoldPlan(@RequestParam("erpWoCode")String erpWoCode) {
return R.fail("获取数据失败");
}
@Override
public R<StGoodsExtStatusVO> getGoodsExtStatus(@RequestParam("goodsCode")String goodsCode) {
return R.fail("获取数据失败");
}
}

@ -0,0 +1,21 @@
package org.springblade.erpdata.pojo.vo;
import lombok.Data;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGoodsExtStatusVO
* @description:
* @autor: WuSiYu
* @create 2026-04-29 17:04
**/
@Data
public class StGoodsExtStatusVO {
private String prtno;
private Double invqty1j;
private Double planqty;
}

@ -36,6 +36,7 @@ import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial;
import java.util.List;
import java.util.Map;
/**
* 质量等级表 实体类
@ -63,6 +64,11 @@ public class QualityGradeEntity extends BaseEntity {
@Schema(description = "类型 1-军品 2-商飞 3-宇航")
private String type;
@Schema(description = "是否局部镀 0-否 1-是")
private String isLocal;
@Schema(description = "是否厚金区固定厚度 0-否 1-是")
private String isThickness;
private String typeNames;
// @TableField(exist = false)
@ -71,9 +77,19 @@ public class QualityGradeEntity extends BaseEntity {
private String types;
@Schema(description = "是否局部镀 0-否 1-是")
private String isLocal;
@Schema(description = "是否厚金区固定厚度 0-否 1-是")
private String isThickness;
public final static Map<String, String> typeMap = Map.of(
"1", "军品",
"2", "商飞",
"3", "宇航"
);
public final static Map<String, String> isLocalMap = Map.of(
"0", "否",
"1", "是"
);
public final static Map<String, String> isThicknessMap = Map.of(
"0", "否",
"1", "是"
);
}

@ -0,0 +1,29 @@
package org.springblade.wms.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName WmsTaskClient
* @description:
* @autor: WuSiYu
* @create 2026-04-30 10:21
**/
@FeignClient(
value = "blade-wms"
)
public interface WmsTaskClient {
String API_PREFIX = "/feign/client/wms";
String EXECUTE_GOODS_STATUS_UPDATE = API_PREFIX + "/executeGoodsStatusUpdate";
/**
* 物料状态监控同步erp
*/
@PostMapping(EXECUTE_GOODS_STATUS_UPDATE)
boolean executeGoodsStatusUpdate();
}

@ -138,7 +138,7 @@ public class StBuyOrder extends TenantEntity {
* 检查人
*/
@Schema(description = "检查人")
private String checkMan;
private Long checkMan;
/**
* 检查时间
*/

@ -115,6 +115,11 @@ public class StOtherOutRecord extends TenantEntity {
*/
@Schema(description = "领料人ID")
private Long picker;
/**
* 借用报废记录ID
*/
@Schema(description = "借用报废记录ID")
private Long rrId;
/*0:报废出库,1:料头出库,2.超额出库,3复检出库,4领用出库,5库转移,6退货出库,11不合格退库*/
public static final Short OUT_TYPE_SCRAP = 0;

@ -0,0 +1,290 @@
package org.springblade.desk.basic.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.log.annotation.ApiLog;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.constant.BAModuleConst;
import org.springblade.desk.basic.excel.PlatingAssortmentExcel;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO;
import org.springblade.desk.basic.service.IPlatingAssortmentService;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.basic.util.QueryUtils;
import org.springblade.desk.basic.wrapper.PlatingAssortmentWrapper;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* [镀种分类] 控制器
* 专门管理镀种分类数据
*
* @author BladeX
* @since 2026-04-29
*/
@RestController
@RequestMapping(BAModuleConst.CONTROLLER_PREFIX + "/PlatingAssortment")
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Slf4j
@Tag(name = "[BA][镀种分类]", description = "[镀种分类]接口")
public class PlatingAssortmentController extends BladeController {
@Resource
private IPlatingAssortmentService service;
@Resource
private IUserClient userClient;
/**
* [镀种分类] 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 10)
@Operation(summary = "详情", description = "传入PlatingAssortment Obj")
public R<PlatingAssortmentVO> detail(PlatingAssortment platingAssortment) {
QueryWrapper<PlatingAssortment> qw = Condition.getQueryWrapper(platingAssortment);
PlatingAssortment detail = service.getOne(qw);
PlatingAssortmentVO detailVO = PlatingAssortmentWrapper.build().entityVO(detail);
service.setVOValue(detailVO);
return R.data(detailVO);
}
/**
* [镀种分类] list分页
*
*
*/
@GetMapping("/list")
@ApiOperationSupport(order = 20)
@Operation(summary = "list分页", description = "传入PlatingAssortment Obj")
public R<IPage<PlatingAssortmentVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> platingAssortment,
Query query) {
// 过滤空值
platingAssortment = platingAssortment.entrySet().stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
QueryWrapper<PlatingAssortment> qw = Condition.getQueryWrapper(platingAssortment, PlatingAssortment.class);
// 添加未删除的条件
qw.eq("IS_DELETED", CommonConstant.DELETE_FALSE);
IPage<PlatingAssortment> pages = service.page(Condition.getPage(query), qw);
IPage<PlatingAssortmentVO> pagesVO = PlatingAssortmentWrapper.build().pageVO(pages);
pagesVO.getRecords().stream()
.peek(service::setVOValue)
.collect(Collectors.toList());
return R.data(pagesVO);
}
/**
* [镀种分类] page分页支持高级查询
*/
@GetMapping("/page")
@ApiOperationSupport(order = 21)
@Operation(summary = "page分页", description = "传入PlatingAssortmentVO Obj")
public R<IPage<PlatingAssortmentVO>> page(PlatingAssortmentVO platingAssortment, Query query) {
// 处理排序字段转换
QueryUtils.convertSortField(query);
IPage<PlatingAssortmentVO> pagesVO = service.selectPlatingAssortmentPage(
Condition.getPage(query), platingAssortment
);
return R.data(pagesVO);
}
/**
* [镀种分类] 设置人员ID保存
*/
@PostMapping("/updateUserId")
@ApiOperationSupport(order = 31)
@ApiLog("更新镀种分类班组成员")
@Operation(summary = "设置人员Id保存", description = "传入PlatingAssortment Obj")
@Transactional(rollbackFor = Exception.class)
public R updateTeamMembers(@Valid @RequestBody PlatingAssortment platingAssortment) {
boolean result = service.updateTeamMembers(platingAssortment);
return R.status(result);
}
/**
* [镀种分类] list下拉选择只返回启用的镀种分类
*/
@GetMapping("/listForSelectPlatingAssort")
@ApiOperationSupport(order = 22)
@Operation(summary = "list下拉选择", description = "返回启用的镀种分类列表")
public R<List<PlatingAssortmentVO>> listForSelect() {
LambdaQueryWrapper<PlatingAssortment> qw = Wrappers.lambdaQuery();
qw.eq(PlatingAssortment::getStatus, 1); // 只返回启用的
qw.eq(PlatingAssortment::getIsDeleted, CommonConstant.DELETE_FALSE);
qw.orderByAsc(PlatingAssortment::getSort, PlatingAssortment::getId);
List<PlatingAssortment> list = service.list(qw);
List<PlatingAssortmentVO> listVO = PlatingAssortmentWrapper.build().listVO(list);
return R.data(listVO);
}
/**
* [镀种分类] 新增一条
*/
@PostMapping("/save")
@ApiOperationSupport(order = 30)
@ApiLog("新增镀种分类")
@Operation(summary = "新增一条", description = "传入PlatingAssortment Obj")
@Transactional(rollbackFor = Exception.class)
public R save(@Valid @RequestBody PlatingAssortment addOne) {
addOne.setId(null);
return R.status(service.save(addOne));
}
/**
* [镀种分类] 新增批量
*/
@PostMapping("/saveBat")
@ApiOperationSupport(order = 31)
@ApiLog("新增镀种分类")
@Operation(summary = "新增批量", description = "传入PlatingAssortment List")
@Transactional(rollbackFor = Exception.class)
public R saveBat(@Valid @RequestBody List<PlatingAssortment> addList) {
addList.forEach(one -> {
one.setId(null);
});
return R.status(service.saveBatch(addList));
}
/**
* [镀种分类] 修改一条
*/
@PostMapping("/update")
@ApiOperationSupport(order = 40)
@ApiLog("修改镀种分类")
@Operation(summary = "修改一条", description = "传入PlatingAssortment Obj")
@Transactional(rollbackFor = Exception.class)
public R update(@Valid @RequestBody PlatingAssortment updateOne) {
return R.status(service.updateById(updateOne));
}
/**
* [镀种分类] 修改批量
*/
@PostMapping("/updateBat")
@ApiOperationSupport(order = 41)
@ApiLog("修改镀种分类")
@Operation(summary = "修改批量", description = "传入PlatingAssortment List")
@Transactional(rollbackFor = Exception.class)
public R updateBat(@Valid @RequestBody List<PlatingAssortment> updateList) {
return R.status(service.updateBatchById(updateList));
}
/**
* [镀种分类] 新增或修改一条
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 50)
@Operation(summary = "新增或修改一条", description = "传入PlatingAssortment Obj")
@Transactional(rollbackFor = Exception.class)
public R submit(@Valid @RequestBody PlatingAssortment mergeOne) {
return R.status(service.saveOrUpdate(mergeOne));
}
/**
* [镀种分类] 新增或修改批量
*/
@PostMapping("/submitBat")
@ApiOperationSupport(order = 51)
@Operation(summary = "新增或修改批量", description = "传入PlatingAssortment List")
@Transactional(rollbackFor = Exception.class)
public R submitBat(@Valid @RequestBody List<PlatingAssortment> mergeList) {
return R.status(service.saveOrUpdateBatch(mergeList));
}
/**
* [镀种分类] 逻辑删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 61)
@ApiLog("删除镀种分类")
@Operation(summary = "逻辑删除", description = "传入ids")
@Transactional(rollbackFor = Exception.class)
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(service.deleteLogic(Func.toLongList(ids)));
}
/**
* [镀种分类] 导出Excel
*/
@GetMapping("/exportExcel")
@ApiOperationSupport(order = 70)
@Operation(summary = "导出Excel", description = "传入PlatingAssortment")
public void exportExcel(@Parameter(hidden = true) @RequestParam Map<String, Object> platingAssortment,
BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<PlatingAssortment> qw = Condition.getQueryWrapper(platingAssortment, PlatingAssortment.class);
// 添加未删除的条件
qw.eq("IS_DELETED", CommonConstant.DELETE_FALSE);
List<PlatingAssortmentExcel> list = service.exportPlatingAssortment(qw);
ExcelUtil.export(response, "[镀种分类]数据" + DateUtil.time(),
"[镀种分类]数据表", list, PlatingAssortmentExcel.class);
}
/**
* [镀种分类] 下载Excel模板
*/
@GetMapping("/downloadExcelTemplate")
@ApiOperationSupport(order = 71)
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/BA/ImportTemplate-PlatingAssortment.xls",
"导入模版-镀种分类.xls");
}
/**
* [镀种分类] 导入Excel
*/
@PostMapping("/importExcel")
@ApiOperationSupport(order = 72)
@ApiLog("导入镀种分类")
@Operation(summary = "导入Excel", description = "MultipartFile")
@Transactional(rollbackFor = Exception.class)
public R importExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<PlatingAssortment> importList = ExcelUtil.read(
file, 0, 1, PlatingAssortment.class
);
return R.status(service.saveBatch(importList));
}
}

@ -7,14 +7,9 @@ import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.pojo.entity.BasicClazz;
import org.springblade.desk.basic.pojo.entity.RelTeamSetUser;
import org.springblade.desk.basic.pojo.entity.TeamSet;
import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springblade.desk.basic.service.IBasicClazzService;
import org.springblade.desk.basic.service.IRelTeamSetUserService;
import org.springblade.desk.basic.service.ITeamSetService;
import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.desk.basic.cache.WorkCenterCache;
import org.springblade.desk.basic.pojo.entity.*;
import org.springblade.desk.basic.service.*;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@ -38,6 +33,8 @@ public class WorkCenterClient implements IWorkCenterClient {
private IBasicClazzService clazzService;
@Resource
private IRelTeamSetUserService relTeamSetUserService;
@Resource
private IPlatingAssortmentService platingAssortmentService;
@Override
public R<WorkCenter> getById(Long workCenterId) {
WorkCenter workCenter = workCenterService.getById(workCenterId);
@ -66,4 +63,9 @@ public class WorkCenterClient implements IWorkCenterClient {
public R<BasicClazz> getClazzById(Long id) {
return R.data(clazzService.getById(id));
}
@Override
public R<PlatingAssortment> platingAssortmentByid(Long id) {
return R.data(platingAssortmentService.getById(id));
}
}

@ -0,0 +1,39 @@
package org.springblade.desk.basic.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.apache.ibatis.annotations.Mapper;
import org.springblade.desk.basic.excel.PlatingAssortmentExcel;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO;
import java.util.List;
/**
* [镀种分类] Mapper 接口
*
* @author BladeX
* @since 2026-04-29
*/
@Mapper
public interface PlatingAssortmentMapper extends BaseMapper<PlatingAssortment> {
/**
* 自定义分页
*
* @param page 分页参数
* @param platingAssortment 查询参数
* @return List<PlatingAssortmentVO>
*/
List<PlatingAssortmentVO> selectPlatingAssortmentPage(IPage page, @Param("platingAssortment") PlatingAssortmentVO platingAssortment);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<PlatingAssortmentExcel>
*/
List<PlatingAssortmentExcel> exportPlatingAssortment(@Param("ew") Wrapper<PlatingAssortment> queryWrapper);
}

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.basic.mapper.PlatingAssortmentMapper">
<!-- 通用查询映射结果 -->
<resultMap id="platingAssortmentResultMap" type="org.springblade.desk.basic.pojo.entity.PlatingAssortment">
<result column="ID" property="id"/>
<result column="CODE" property="code"/>
<result column="NAME" property="name"/>
<result column="MEMO" property="memo"/>
<result column="SORT" property="sort"/>
<result column="TEAM_MEMBER" property="teamMember"/>
<result column="TEAM_MEMBER_ID" property="teamMemberId"/>
<result column="STATUS" property="status"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="IS_DELETED" property="isDeleted"/>
</resultMap>
<!-- 自定义分页查询 -->
<select id="selectPlatingAssortmentPage" resultType="org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO">
SELECT
t.ID,
t.CODE,
t.NAME,
t.MEMO,
t.SORT,
t.TEAM_MEMBER,
t.TEAM_MEMBER_ID,
t.STATUS,
t.CREATE_USER,
t.CREATE_TIME,
t.CREATE_DEPT,
t.UPDATE_USER,
t.UPDATE_TIME,
t.IS_DELETED
FROM BS_PLATING_ASSORTMENT t
WHERE t.IS_DELETED = 0
<if test="platingAssortment.code != null and platingAssortment.code != ''">
AND t.CODE LIKE '%' || #{platingAssortment.code} || '%'
</if>
<if test="platingAssortment.name != null and platingAssortment.name != ''">
AND t.NAME LIKE '%' || #{platingAssortment.name} || '%'
</if>
<if test="platingAssortment.status != null">
AND t.STATUS = #{platingAssortment.status}
</if>
ORDER BY t.SORT ASC, t.CREATE_TIME DESC
</select>
<!-- 导出数据查询 -->
<select id="exportPlatingAssortment" resultType="org.springblade.desk.basic.excel.PlatingAssortmentExcel">
SELECT
t.CODE,
t.NAME,
t.MEMO,
t.SORT,
t.TEAM_MEMBER,
CASE t.STATUS
WHEN 1 THEN '启用'
WHEN 0 THEN '禁用'
ELSE '未知'
END AS statusName,
t.CREATE_TIME,
u.REAL_NAME AS createUserRealName
FROM BS_PLATING_ASSORTMENT t
LEFT JOIN BLADE_USER u ON t.CREATE_USER = u.ID
${ew.customSqlSegment}
</select>
</mapper>

@ -0,0 +1,51 @@
package org.springblade.desk.basic.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.desk.basic.excel.PlatingAssortmentExcel;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO;
import java.util.List;
/**
* [镀种分类] 服务类
*
* @author BladeX
* @since 2026-04-29
*/
public interface IPlatingAssortmentService extends BaseService<PlatingAssortment> {
/**
* 自定义分页
*
* @param page 分页参数
* @param platingAssortment 查询参数
* @return IPage<PlatingAssortmentVO>
*/
IPage<PlatingAssortmentVO> selectPlatingAssortmentPage(IPage<PlatingAssortmentVO> page, PlatingAssortmentVO platingAssortment);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<PlatingAssortmentExcel>
*/
List<PlatingAssortmentExcel> exportPlatingAssortment(Wrapper<PlatingAssortment> queryWrapper);
/**
* 设置VO值填充用户名称等
*
* @param vo VO对象
*/
void setVOValue(PlatingAssortmentVO vo);
/**
* 更新班组成员
*
* @param platingAssortment 包含userIds的实体
* @return 是否成功
*/
boolean updateTeamMembers(PlatingAssortment platingAssortment);
}

@ -0,0 +1,119 @@
package org.springblade.desk.basic.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.basic.mapper.PlatingAssortmentMapper;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO;
import org.springblade.desk.basic.service.IPlatingAssortmentService;
import org.springblade.desk.basic.excel.PlatingAssortmentExcel;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* [镀种分类] 服务实现类
*
* @author BladeX
* @since 2026-04-29
*/
@Slf4j
@Service
public class PlatingAssortmentServiceImpl extends BaseServiceImpl<PlatingAssortmentMapper, PlatingAssortment> implements IPlatingAssortmentService {
@Resource
private IUserClient userClient;
@Override
public IPage<PlatingAssortmentVO> selectPlatingAssortmentPage(IPage<PlatingAssortmentVO> page, PlatingAssortmentVO platingAssortment) {
return page.setRecords(baseMapper.selectPlatingAssortmentPage(page, platingAssortment));
}
@Override
public List<PlatingAssortmentExcel> exportPlatingAssortment(Wrapper<PlatingAssortment> queryWrapper) {
return baseMapper.exportPlatingAssortment(queryWrapper);
}
@Override
public void setVOValue(PlatingAssortmentVO vo) {
if (vo == null) {
return;
}
// 设置创建人名称
if (vo.getCreateUser() != null && vo.getCreateUser() > 0) {
try {
User createUser = userClient.userInfoById(vo.getCreateUser()).getData();
if (createUser != null) {
vo.setCreateUserRealName(createUser.getRealName());
}
} catch (Exception e) {
log.warn("获取创建人信息失败: userId={}", vo.getCreateUser(), e);
}
}
// 设置更新人名称
if (vo.getUpdateUser() != null && vo.getUpdateUser() > 0) {
try {
User updateUser = userClient.userInfoById(vo.getUpdateUser()).getData();
if (updateUser != null) {
vo.setUpdateUserRealName(updateUser.getRealName());
}
} catch (Exception e) {
log.warn("获取更新人信息失败: userId={}", vo.getUpdateUser(), e);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateTeamMembers(PlatingAssortment platingAssortment) {
if (platingAssortment.getId() == null) {
throw new IllegalArgumentException("ID不能为空");
}
PlatingAssortment existing = getById(platingAssortment.getId());
if (existing == null) {
throw new IllegalArgumentException("记录不存在");
}
List<Long> userIds = platingAssortment.getUserIds();
String teamMemberIds = null;
String teamMemberNames = null;
if (userIds != null && !userIds.isEmpty()) {
// 转换为逗号分隔的ID字符串
teamMemberIds = userIds.stream()
.map(Object::toString)
.collect(Collectors.joining(","));
// 查询用户信息获取真实姓名
try {
List<User> users = userClient.userListByIds(teamMemberIds);
if (users != null && !users.isEmpty()) {
teamMemberNames = users.stream()
.map(User::getRealName)
.collect(Collectors.joining(","));
}
} catch (Exception e) {
log.error("获取用户信息失败", e);
throw new RuntimeException("获取用户信息失败");
}
}
existing.setTeamMemberId(teamMemberIds);
existing.setTeamMember(teamMemberNames);
return updateById(existing);
}
}

@ -0,0 +1,43 @@
package org.springblade.desk.basic.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.vo.PlatingAssortmentVO;
import java.util.Objects;
/**
* [镀种分类] Wrapper类
*
* @author BladeX
* @since 2026-04-29
*/
public class PlatingAssortmentWrapper extends BaseEntityWrapper<PlatingAssortment, PlatingAssortmentVO> {
public static PlatingAssortmentWrapper build() {
return new PlatingAssortmentWrapper();
}
@Override
public PlatingAssortmentVO entityVO(PlatingAssortment platingAssortment) {
if (Objects.isNull(platingAssortment)) {
return null;
}
PlatingAssortmentVO platingAssortmentVO = Objects.requireNonNull(new PlatingAssortmentVO());
platingAssortmentVO.setId(platingAssortment.getId());
platingAssortmentVO.setCode(platingAssortment.getCode());
platingAssortmentVO.setName(platingAssortment.getName());
platingAssortmentVO.setMemo(platingAssortment.getMemo());
platingAssortmentVO.setSort(platingAssortment.getSort());
platingAssortmentVO.setTeamMember(platingAssortment.getTeamMember());
platingAssortmentVO.setTeamMemberId(platingAssortment.getTeamMemberId());
platingAssortmentVO.setStatus(platingAssortment.getStatus());
platingAssortmentVO.setCreateUser(platingAssortment.getCreateUser());
platingAssortmentVO.setCreateDept(platingAssortment.getCreateDept());
platingAssortmentVO.setCreateTime(platingAssortment.getCreateTime());
platingAssortmentVO.setUpdateUser(platingAssortment.getUpdateUser());
platingAssortmentVO.setUpdateTime(platingAssortment.getUpdateTime());
platingAssortmentVO.setIsDeleted(platingAssortment.getIsDeleted());
return platingAssortmentVO;
}
}

@ -127,11 +127,31 @@
a.quantity,
a.SIR_MONEY,
a.BUY_CODE,
a.CHECK_NO,
a.CHECK_NO,
a.QUANTITY_LEVEL,
a.SCRAP_CYCLE,
a.STOVE_PI_NO,
a.IN_OUT_REASON,
CASE
a.IN_OUT_REASON
WHEN N'0' THEN
N'报废出库'
WHEN N'1' THEN
N'料头出库'
WHEN N'2' THEN
N'超额出库'
WHEN N'3' THEN
N'复检出库'
WHEN N'4' THEN
N'领用出库'
WHEN N'5' THEN
N'库转译'
WHEN N'6' THEN
N'退货出库'
WHEN N'7' THEN
N'物料出库'
WHEN N'8' THEN
N'班组提请' ELSE N''
END as "inOutReason",
a.IN_OUT_DATE,
c.real_name as "userName",
a.SIR_CODE

@ -117,6 +117,12 @@ public class BsEpciuInspectionPointController extends BladeController {
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入bsEpciuInspectionPoint")
public R save(@Valid @RequestBody BsEpciuInspectionPointEntity bsEpciuInspectionPoint) {
// 校验巡检点编号和类型是否重复
if (bsEpciuInspectionPoint.getInsNum() != null) {
if (bsEpciuInspectionPointService.checkDuplicate(bsEpciuInspectionPoint.getInsNum(), bsEpciuInspectionPoint.getInsType(), null)) {
throw new RuntimeException("巡检点编号【" + bsEpciuInspectionPoint.getInsNum() + "】和巡检点类型的组合已存在,不能重复添加");
}
}
return R.status(bsEpciuInspectionPointService.save(bsEpciuInspectionPoint));
}
@ -127,6 +133,12 @@ public class BsEpciuInspectionPointController extends BladeController {
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入bsEpciuInspectionPoint")
public R update(@Valid @RequestBody BsEpciuInspectionPointEntity bsEpciuInspectionPoint) {
// 校验巡检点编号和类型是否重复(排除当前记录)
if (bsEpciuInspectionPoint.getInsNum() != null) {
if (bsEpciuInspectionPointService.checkDuplicate(bsEpciuInspectionPoint.getInsNum(), bsEpciuInspectionPoint.getInsType(), bsEpciuInspectionPoint.getId())) {
return R.fail("巡检点编号【" + bsEpciuInspectionPoint.getInsNum() + "】和巡检点类型的组合已存在,不能重复");
}
}
return R.status(bsEpciuInspectionPointService.updateById(bsEpciuInspectionPoint));
}
@ -137,6 +149,12 @@ public class BsEpciuInspectionPointController extends BladeController {
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入bsEpciuInspectionPoint")
public R submit(@Valid @RequestBody BsEpciuInspectionPointEntity bsEpciuInspectionPoint) {
// 校验巡检点编号和类型是否重复
if (bsEpciuInspectionPoint.getInsNum() != null) {
if (bsEpciuInspectionPointService.checkDuplicate(bsEpciuInspectionPoint.getInsNum(), bsEpciuInspectionPoint.getInsType(), bsEpciuInspectionPoint.getId())) {
return R.fail("巡检点编号【" + bsEpciuInspectionPoint.getInsNum() + "】和巡检点类型的组合已存在,不能重复");
}
}
return R.status(bsEpciuInspectionPointService.saveOrUpdate(bsEpciuInspectionPoint));
}
@ -207,6 +225,15 @@ public class BsEpciuInspectionPointController extends BladeController {
noticeList.add(notice);
});
// 校验导入数据中是否有重复的巡检点编号和类型组合
for (BsEpciuInspectionPointEntity entity : noticeList) {
if (entity.getInsNum() != null) {
if (bsEpciuInspectionPointService.checkDuplicate(entity.getInsNum(), entity.getInsType(), null)) {
return R.fail("巡检点编号【" + entity.getInsNum() + "】和巡检点类型【" + entity.getInsType() + "】的组合已存在,不能重复导入");
}
}
}
// R checkR = ExcelExtUtil.importExcelCheck(file);
// if (checkR != null) {
// return checkR;
@ -223,6 +250,15 @@ public class BsEpciuInspectionPointController extends BladeController {
@ApiOperationSupport(order = 12)
@Operation(summary = "批量新增", description = "传入bsEpciuInspectionPointList")
public R saveList(@Valid @RequestBody List<BsEpciuInspectionPointEntity> bsEpciuInspectionPointList) {
// 校验批量数据中是否有重复的巡检点编号和类型组合
for (BsEpciuInspectionPointEntity entity : bsEpciuInspectionPointList) {
if (entity.getInsNum() != null) {
if (bsEpciuInspectionPointService.checkDuplicate(entity.getInsNum(), entity.getInsType(), entity.getId())) {
return R.fail("巡检点编号【" + entity.getInsNum() + "】和巡检点类型【" + entity.getInsType() + "】的组合已存在,不能重复添加");
}
}
}
return R.status(bsEpciuInspectionPointService.saveOrUpdateBatch(bsEpciuInspectionPointList));
}

@ -118,6 +118,12 @@ public class BsSafeInspectionPointController {
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入bsSafeInspectionPoint")
public R save(@Valid @RequestBody BsSafeInspectionPointEntity bsSafeInspectionPoint) {
// 校验巡检点编号是否重复
if (bsSafeInspectionPoint.getInsNum() != null) {
if (bsSafeInspectionPointService.checkDuplicate(bsSafeInspectionPoint.getInsNum(), null)) {
throw new RuntimeException("巡检点编号【" + bsSafeInspectionPoint.getInsNum() + "】已存在,不能重复添加");
}
}
return R.status(bsSafeInspectionPointService.save(bsSafeInspectionPoint));
}
@ -128,6 +134,12 @@ public class BsSafeInspectionPointController {
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入bsSafeInspectionPoint")
public R update(@Valid @RequestBody BsSafeInspectionPointEntity bsSafeInspectionPoint) {
// 校验巡检点编号是否重复(排除当前记录)
if (bsSafeInspectionPoint.getInsNum() != null) {
if (bsSafeInspectionPointService.checkDuplicate(bsSafeInspectionPoint.getInsNum(), bsSafeInspectionPoint.getId())) {
return R.fail("巡检点编号【" + bsSafeInspectionPoint.getInsNum() + "】已存在,不能重复");
}
}
return R.status(bsSafeInspectionPointService.updateById(bsSafeInspectionPoint));
}
@ -138,6 +150,12 @@ public class BsSafeInspectionPointController {
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入bsSafeInspectionPoint")
public R submit(@Valid @RequestBody BsSafeInspectionPointEntity bsSafeInspectionPoint) {
// 校验巡检点编号是否重复
if (bsSafeInspectionPoint.getInsNum() != null) {
if (bsSafeInspectionPointService.checkDuplicate(bsSafeInspectionPoint.getInsNum(), bsSafeInspectionPoint.getId())) {
return R.fail("巡检点编号【" + bsSafeInspectionPoint.getInsNum() + "】已存在,不能重复");
}
}
return R.status(bsSafeInspectionPointService.saveOrUpdate(bsSafeInspectionPoint));
}
@ -212,6 +230,15 @@ public class BsSafeInspectionPointController {
&& !item.getInsNum().contains("注"))
.toList();
// 校验导入数据中是否有重复的巡检点编号
for (BsSafeInspectionPointEntity entity : importList) {
if (entity.getInsNum() != null) {
if (bsSafeInspectionPointService.checkDuplicate(entity.getInsNum(), null)) {
return R.fail("巡检点编号【" + entity.getInsNum() + "】已存在,不能重复导入");
}
}
}
return R.status(bsSafeInspectionPointService.saveBatch(importList));
}
/**
@ -221,6 +248,15 @@ public class BsSafeInspectionPointController {
@ApiOperationSupport(order = 12)
@Operation(summary = "批量新增", description = "传入bsSafeInspectionPointList")
public R saveList(@Valid @RequestBody List<BsSafeInspectionPointEntity> bsSafeInspectionPointList) {
// 校验批量数据中是否有重复的巡检点编号
for (BsSafeInspectionPointEntity entity : bsSafeInspectionPointList) {
if (entity.getInsNum() != null) {
if (bsSafeInspectionPointService.checkDuplicate(entity.getInsNum(), entity.getId())) {
return R.fail("巡检点编号【" + entity.getInsNum() + "】已存在,不能重复添加");
}
}
}
return R.status(bsSafeInspectionPointService.saveOrUpdateBatch(bsSafeInspectionPointList));
}
@PostMapping(value = "/print")

@ -62,4 +62,13 @@ public interface IBsEpciuInspectionPointService extends BaseService<BsEpciuInspe
List<BsEpciuInspectionPointEntity> getByCode(String code);
List<BsEpciuInspectionPointEntity> listByCode(String code);
/**
* 校验巡检点是否重复根据巡检点编号和巡检点类型
* @param insNum 巡检点编号
* @param insType 巡检点类型
* @param excludeId 排除的ID修改时使用新增时传null
* @return 是否存在重复
*/
boolean checkDuplicate(String insNum, String insType, Long excludeId);
}

@ -64,6 +64,14 @@ public interface IBsSafeInspectionPointService extends BaseService<BsSafeInspect
BsSafeInspectionPointEntity getByKey(Long ipId);
/**
* 校验巡检点是否重复根据巡检点编号
* @param insNum 巡检点编号
* @param excludeId 排除的ID修改时使用新增时传null
* @return 是否存在重复
*/
boolean checkDuplicate(String insNum, Long excludeId);
/**
* 导出pdf
* @param list

@ -26,6 +26,7 @@
package org.springblade.desk.energy.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.desk.energy.excel.BsEpciuInspectionPointExcel;
import org.springblade.desk.energy.mapper.BsEpciuInspectionPointMapper;
@ -74,4 +75,19 @@ public class BsEpciuInspectionPointServiceImpl extends BaseServiceImpl<BsEpciuIn
return getByCode(code);
}
@Override
public boolean checkDuplicate(String insNum, String insType, Long excludeId) {
if (StrUtil.isEmpty(insNum)) {
return false;
}
long count = count(
Wrappers.lambdaQuery(BsEpciuInspectionPointEntity.class)
.eq(BsEpciuInspectionPointEntity::getInsNum, insNum)
.eq(StrUtil.isNotEmpty(insType), BsEpciuInspectionPointEntity::getInsType, insType)
.ne(excludeId != null, BsEpciuInspectionPointEntity::getId, excludeId)
);
return count > 0;
}
}

@ -131,10 +131,11 @@ public class BsEpciuPatrolInspectionServiceImpl extends BaseServiceImpl<BsEpciuP
epPatrolInspection.setInsSite(epInspectionPoint.getInsSite());
epPatrolInspection.setInsMemo(epPatrolInspection.getInsMemo());
epPatrolInspection.setLaunchTime(new Date());
epPatrolInspection.setInsType(epInspectionPoint.getInsType());
epPatrolInspection.setTaskStatus(BsEpciuPatrolInspectionEntity.PREPARE_TEXT.toString());
baseMapper.insertOrUpdate(epPatrolInspection);
// 保存触发任务的时间
epInspectionPoint.setLastInsCycle(new Date());
//epInspectionPoint.setLastInsCycle(new Date());
bsEpciuInspectionPointService.saveOrUpdate(epInspectionPoint);
} else {
Boolean isAdd = false;
@ -171,10 +172,11 @@ public class BsEpciuPatrolInspectionServiceImpl extends BaseServiceImpl<BsEpciuP
epPatrolInspection.setInsSite(epInspectionPoint.getInsSite());
epPatrolInspection.setInsMemo(epPatrolInspection.getInsMemo());
epPatrolInspection.setLaunchTime(new Date());
epPatrolInspection.setInsType(epInspectionPoint.getInsType());
epPatrolInspection.setTaskStatus(BsEpciuPatrolInspectionEntity.PREPARE_TEXT.toString());
baseMapper.insertOrUpdate(epPatrolInspection);
// 保存触发任务的时间
epInspectionPoint.setLastInsCycle(new Date());
//epInspectionPoint.setLastInsCycle(new Date());
bsEpciuInspectionPointService.saveOrUpdate(epInspectionPoint);
}
}
@ -240,6 +242,9 @@ public class BsEpciuPatrolInspectionServiceImpl extends BaseServiceImpl<BsEpciuP
updateById(bsEpciuPatrolInspection);
// 将其他同类的巡检任务置为未检
List<BsEpciuInspectionPointEntity> safeInspectionPointList = bsEpciuInspectionPointService.listByCode(bsEpciuPatrolInspection.getInsNum());
if (CollUtil.isEmpty(safeInspectionPointList)){
return;
}
Set<Long> pointIds = safeInspectionPointList.stream().map(BsEpciuInspectionPointEntity::getId).collect(Collectors.toSet());
update(Wrappers.lambdaUpdate(BsEpciuPatrolInspectionEntity.class)
.in(BsEpciuPatrolInspectionEntity::getEpcId, pointIds)

@ -26,6 +26,7 @@
package org.springblade.desk.energy.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -178,4 +179,19 @@ public class BsSafeInspectionPointServiceImpl extends BaseServiceImpl<BsSafeInsp
public BsSafeInspectionPointEntity getByKey(Long ipId) {
return getById(ipId);
}
@Override
public boolean checkDuplicate(String insNum, Long excludeId) {
if (StrUtil.isEmpty(insNum)) {
return false;
}
long count = count(
Wrappers.lambdaQuery(BsSafeInspectionPointEntity.class)
.eq(BsSafeInspectionPointEntity::getInsNum, insNum)
.ne(excludeId != null, BsSafeInspectionPointEntity::getId, excludeId)
);
return count > 0;
}
}

@ -124,11 +124,11 @@ public class YieldOrderController extends BladeController {
@Parameter(name = "overHalfMon", description = "使用半月以上的数据,0:否,1:是, 以生产订单的下达时间算", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
})
@Operation(summary = "分页-物料需求申报", description = "")
public R<IPage<YieldOrderVo>> pageMaterialApply(Long wcId, Integer materialType, Integer overHalfMon, Query query) {
public R<IPage<YieldOrderVo>> pageMaterialApply(Long wcId, String plateGoodsCode, Integer overHalfMon, Query query) {
IPage<YieldOrder> page = Condition.getPage(query);
page.setRecords(new ArrayList<>());
page = yieldOrderService.pageMaterialApply(Condition.getPage(query), wcId, materialType, overHalfMon);
page = yieldOrderService.pageMaterialApply(Condition.getPage(query), wcId, plateGoodsCode, overHalfMon);
return R.data(YieldOrderWrapper.build().pageVO(page));
}

@ -25,15 +25,22 @@
*/
package org.springblade.desk.order.feign;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.service.IYieldOrderDailyAssignService;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.order.service.IYieldPlanService;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
/**
* Feign 排产相关定时任务接口
*
@ -64,4 +71,13 @@ public class OrderClient implements IOrderClient {
public void initYieldOrderDailyAssign() throws Exception {
yieldOrderDailyAssignService.init();
}
@Override
public void dataVerify() {
List<YieldOrder> list = orderService.list(Wrappers.<YieldOrder>lambdaQuery().in(YieldOrder::getValidationResult,16001,16003));
if(CollectionUtils.isNotEmpty(list)){
List<Long> idList = list.stream().map(BaseEntity::getId).collect(Collectors.toList());
orderService.dataVerify(idList);
}
}
}

@ -6,7 +6,6 @@ import org.apache.ibatis.annotations.Param;
import org.springblade.desk.order.pojo.dto.YieldOrderDto;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.enums.YieldOrderEnum;
import org.springblade.desk.order.pojo.vo.YieldOrderVo;
import java.util.List;
@ -33,13 +32,13 @@ public interface YieldOrderMapper extends BaseMapper<YieldOrder> {
*
* @param page
* @param wcId 作业中心
* @param materialType 物料类型1金钾2银钾
* @param plateGoodsCode 金钾04-05-023 银钾04-05-024
* @param overHalfMon 使用半月以上的数据01
* @param yieldTypeList 订单类型
* @param yieldStatusList 订单状态
* @return
*/
List<YieldOrder> pageMaterialApply(IPage page, Long wcId, Integer materialType, Integer overHalfMon,
List<YieldOrder> pageMaterialApply(IPage page, Long wcId, String plateGoodsCode, Integer overHalfMon,
List<YieldOrderEnum> yieldTypeList, List<YieldOrderEnum> yieldStatusList);
Long getWcId(Long orderId);

@ -84,22 +84,14 @@
<select id = "pageMaterialApply" resultType = "org.springblade.desk.order.pojo.entity.YieldOrder">
SELECT <include refid="baseCommonFields" />
FROM MES_YIELD_ORDER yo
LEFT JOIN MES_PLATE_GOODS_RECORD_DETAIL grd ON yo.id = grd.YO_ID
INNER JOIN MES_PLATE_GOODS_RECORD_DETAIL grd ON yo.id = grd.YO_ID
WHERE yo.IS_DELETED = 0 AND grd.ID IS NULL
<if test = "wcId != null and wcId != ''">
AND yo.WORK_CENTER_ID = #{wcId}
</if>
<!--
todo 按照工艺,查询金钾相关的订单
<if test = "materialType != null and materialType == 1 ">
AND YP_CODE LIKE CONCAT('%', CONCAT(#{entity.ypCode}, '%'))
</if>
todo 银钾
<if test = "materialType != null and materialType == 2 ">
AND YP_CODE LIKE CONCAT('%', CONCAT(#{entity.ypCode}, '%'))
</if>
-->
<if test = "plateGoodsCode != null and plateGoodsCode != ''">
AND yo.PLATE_GOODS_CODE = #{plateGoodsCode}
</if>
<if test = "overHalfMon != null and overHalfMon == 0 ">
AND yo.RECEIVE_TIME >= SYSDATE - INTERVAL '15' DAY
</if>

@ -11,7 +11,6 @@ import org.springblade.desk.order.pojo.dto.YieldOrderDto;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.pojo.entity.YieldOrderCraft;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.pojo.vo.YieldOrderVo;
import java.util.List;
@ -58,7 +57,7 @@ public interface IYieldOrderService extends BaseService<YieldOrder> {
* @param overHalfMon
* @return
*/
IPage<YieldOrder> pageMaterialApply(IPage<YieldOrder> page, Long wcId, Integer materialType, Integer overHalfMon);
IPage<YieldOrder> pageMaterialApply(IPage<YieldOrder> page, Long wcId, String plateGoodsCode, Integer overHalfMon);
/**
* 查询是否存在玻璃饼生产订单

@ -1,14 +1,20 @@
package org.springblade.desk.order.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.desk.order.mapper.MoldApplyMapper;
import org.springblade.desk.order.mapper.MoldDemandMapper;
import org.springblade.desk.order.pojo.entity.MoldApply;
import org.springblade.desk.order.pojo.entity.MoldDemand;
import org.springblade.desk.order.pojo.enums.MoldApplyEnum;
import org.springblade.desk.order.service.IMoldApplyService;
import org.springblade.erpdata.feign.IErpDataProduceClient;
import org.springblade.system.cache.UserCache;
import org.springblade.system.pojo.entity.User;
import org.springframework.stereotype.Service;
import java.util.Date;
@ -23,6 +29,11 @@ import java.util.List;
@Service
public class MoldApplyServiceImpl extends BaseServiceImpl<MoldApplyMapper, MoldApply> implements IMoldApplyService {
private final MoldDemandMapper moldDemandMapper;
@Resource
private IErpDataProduceClient erpDataProduceClient;
@Override
public IPage<MoldApply> selectPage(IPage<MoldApply> page, MoldApply entity) {
List<MoldApply> dataList = baseMapper.selectPage(page, entity);
@ -46,8 +57,21 @@ public class MoldApplyServiceImpl extends BaseServiceImpl<MoldApplyMapper, MoldA
@Override
public boolean saveBatchByPage(List<MoldApply> applyList) {
User createMan = UserCache.getUser(AuthUtil.getUserId());
for (MoldApply moldApply : applyList) {
MoldDemand moldDemand = moldDemandMapper.selectById(moldApply.getId());
moldApply.setId(null);
moldApply.setStatus(MoldApplyEnum.STATUS_CREATE.getCode());
User keeper = UserCache.getUser(moldApply.getKeeper());
String erpWoCode = erpDataProduceClient.createMoldPlan(moldApply.getPartCode(),moldApply.getToolCode(),
moldApply.getPlanTypeCode(),moldApply.getApplyNum().intValue(),
moldApply.getNeedDate(),moldApply.getQuaLevel(),
keeper.getRealName(),createMan.getRealName(),moldApply.getMemo()).getData();
moldDemand.setMafStatus(11002);
moldDemand.setErpWoCode(erpWoCode);
moldDemand.setKeeper(moldApply.getKeeper());
moldDemand.setReleaser(moldApply.getReleaser());
moldDemandMapper.updateById(moldDemand);
}
return saveBatch(applyList);

@ -383,6 +383,7 @@ public class PlateGoodsRecordServiceImpl extends BaseServiceImpl<PlateGoodsRecor
yieldOrder.setValidationResult(YieldOrderEnum.VALIDATION_RESULT_PASS.getCode());
yieldOrder.setValidationMomo("");
}
yieldOrder.setPlateGoodsCode(dsPart.getPlateGoodsCode());
yieldOrderMapper.updateById(yieldOrder);
}else{
return true;

@ -168,7 +168,7 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
}
@Override
public IPage<YieldOrder> pageMaterialApply(IPage<YieldOrder> page, Long wcId, Integer materialType, Integer overHalfMon) {
public IPage<YieldOrder> pageMaterialApply(IPage<YieldOrder> page, Long wcId, String plateGoodsCode, Integer overHalfMon) {
// 只有电镀的需要镀层物料,故只查询电镀的订单
List<YieldOrderEnum> yieldTypeList = new ArrayList<>();
yieldTypeList.add(YieldOrderEnum.YIELD_TYPE_1);
@ -184,7 +184,7 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
YieldOrder entity = new YieldOrder();
entity.setWorkCenterId(wcId);
// TODO 1. 金钾银钾如何区分,使用工艺编制中的物料编号,其中只有金钾、银钾的选项
List<YieldOrder> dataList = baseMapper.pageMaterialApply(page, wcId, materialType, overHalfMon, yieldTypeList, yieldStatusList);
List<YieldOrder> dataList = baseMapper.pageMaterialApply(page, wcId, plateGoodsCode, overHalfMon, yieldTypeList, yieldStatusList);
return page.setRecords(dataList);
}

@ -5,10 +5,8 @@ import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.desk.produce.pojo.dto.MesRbRedoRoutDTO;
import org.springblade.desk.produce.pojo.entity.OrderDeclare;
import org.springblade.erpdata.pojo.vo.*;
import org.springblade.erpdata.service.IErpDataProduceService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@ -129,4 +127,10 @@ public class ErpDataProduceClient implements IErpDataProduceClient {
return R.data(erpDataProduceService.proRbtransferlev(hrCode, ypCode, woCode, cardNo, partCode, batchNo, createMan, createTime, handoverUnit, handoverQty, recDept, roamNo, deliverKey, testQty, lossQty, scrapQty));
}
@Override
public R<String> createMoldPlan(String partCode, String moCode, String plantype, Integer quantity, Date needDate, String level, String keeper, String createMan, String memo) {
return R.data(erpDataProduceService.createMoldPlan(partCode, moCode, plantype, quantity, needDate, level, keeper, createMan, memo));
}
}

@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.erpdata.service.IErpDataWmsService;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import org.springframework.web.bind.annotation.RestController;
@ -47,4 +48,9 @@ public class ErpDataWmsClient implements IErpDataWmsClient{
public R<String> deleteMoldPlan(String erpWoCode) throws BusinessException {
return R.data(erpDataWmsService.deleteMoldPlan(erpWoCode));
}
@Override
public R<StGoodsExtStatusVO> getGoodsExtStatus(String goodsCode) {
return R.data(erpDataWmsService.getGoodsExtStatus(goodsCode));
}
}

@ -0,0 +1,19 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName ErpDataWmsMapper
* @description:
* @autor: WuSiYu
* @create 2026-04-29 16:52
**/
public interface ErpDataWmsMapper extends Mapper {
StGoodsExtStatusVO getGoodsExtStatus(String goodsCode);
}

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.erpdata.mapper.ErpDataWmsMapper">
<select id="getGoodsExtStatus" resultType="org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO">
SELECT
erp.prtno,
-- ERP 一级库存、计划数量
NVL(erp.invqty1j, 0) AS invqty1j,
NVL(erp.planqty, 0) AS planqty
FROM dba_mgr.v_mes_rb_prtstuff erp
WHERE erp.prtno = #{goodsCode}
</select>
</mapper>

@ -3,7 +3,6 @@ package org.springblade.erpdata.service;
import org.springblade.desk.produce.pojo.dto.MesRbRedoRoutDTO;
import org.springblade.erpdata.pojo.vo.*;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -60,4 +59,7 @@ public interface IErpDataProduceService {
ErpReturnDataVO proRbinviogen(String hrCode, String partCode, Integer handoverQty, String prodIdent, String batchNo, String ypCode, String woCode, String handoverUnit, String createMan, String recDept, String memo, String deliverKey, Integer testQty, Integer lossQty, Integer scrapQty);
ErpReturnDataVO proRbtransferlev(String hrCode, String ypCode, String woCode, String cardNo, String partCode, String batchNo, String createMan, String createTime, String handoverUnit, Integer handoverQty, String recDept, String roamNo, String deliverKey, Integer testQty, Integer lossQty, Integer scrapQty);
String createMoldPlan(String partCode, String moCode, String plantype, Integer quantity, Date needDate, String level,
String keeper, String createMan, String memo);
}

@ -1,6 +1,7 @@
package org.springblade.erpdata.service;
import org.springblade.common.exception.BusinessException;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import java.util.Date;
@ -23,4 +24,6 @@ public interface IErpDataWmsService {
String createMoldPlan(String partCode, String moCode, String plantype, Double quantity, Date needDate, String level, String keeper, String createMan, String memo, String urgentType, String erpWoCode) throws BusinessException;
String deleteMoldPlan(String erpWoCode) throws BusinessException;
StGoodsExtStatusVO getGoodsExtStatus(String goodsCode);
}

@ -3,6 +3,7 @@ package org.springblade.erpdata.service.impl;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.desk.produce.pojo.dto.MesRbRedoRoutDTO;
import org.springblade.erpdata.mapper.ErpDataProduceMapper;
@ -465,4 +466,57 @@ public class ErpDataProduceServiceImpl implements IErpDataProduceService {
erpReturnDataVO.setExcnote((String) resultMap.get("v_excnote"));
return erpReturnDataVO;
}
@Override
public String createMoldPlan(String partCode, String moCode, String plantype, Integer quantity, Date needDate, String level,
String keeper, String createMan, String memo) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
// 指定存储过程名(包含 DB Link)
.withProcedureName("dba_mgr.pro_rbtoolreqm")
// 建议关闭元数据访问(通过 DB Link 访问时可避免权限/性能问题)
.withoutProcedureColumnMetaDataAccess()
// 显式声明参数
.declareParameters(
new SqlParameter("v_prtno", Types.VARCHAR), // IN
new SqlParameter("v_toolcode", Types.VARCHAR), // IN
new SqlParameter("v_plntype", Types.VARCHAR), // IN
new SqlParameter("v_tlreqqty", Types.INTEGER), // IN
new SqlParameter("v_tlreqdat", Types.DATE), // IN
new SqlParameter("v_prtmdept", Types.VARCHAR), // IN
new SqlParameter("v_prtlotno", Types.VARCHAR), // IN
new SqlParameter("v_WARCTLR", Types.VARCHAR), // IN
new SqlParameter("v_operator", Types.VARCHAR), // IN
new SqlParameter("v_remark", Types.VARCHAR), // IN
new SqlParameter("v_stat", Types.VARCHAR), // IN
new SqlParameter("v_toolid1", Types.VARCHAR), // IN
new SqlOutParameter("v_excnote", Types.VARCHAR),// OUT
new SqlOutParameter("v_excflag", Types.VARCHAR), // OUT
new SqlOutParameter("v_toolid", Types.VARCHAR) // OUT
);
// 2. 封装输入参数
Map<String, Object> inParams = new HashMap<>();
inParams.put("v_prtno", partCode);
inParams.put("v_toolcode", moCode);
inParams.put("v_plntype", plantype);
inParams.put("v_tlreqqty", quantity);
inParams.put("v_tlreqdat", needDate);
inParams.put("v_prtmdept", "3600");
inParams.put("v_prtlotno", level);
inParams.put("v_WARCTLR", keeper);
inParams.put("v_operator", createMan);
inParams.put("v_remark", StringUtils.isBlank(memo) ? "" : memo);
inParams.put("v_stat", "0");
inParams.put("v_toolid1", "");
// 3. 执行并获取结果 Map
Map<String, Object> resultMap = jdbcCall.execute(inParams);
// 4. 提取输出参数
String excflag = (String) resultMap.get("v_excflag");
String excnote = (String) resultMap.get("v_excnote");
String wxno = (String) resultMap.get("v_toolid");
return wxno;
}
}

@ -1,9 +1,12 @@
package org.springblade.erpdata.service.impl;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.exception.BusinessException;
import org.springblade.erpdata.mapper.ErpDataWmsMapper;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.erpdata.service.IErpDataWmsService;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import org.springframework.jdbc.core.JdbcTemplate;
@ -31,6 +34,9 @@ import java.util.Map;
@Service
public class ErpDataWmsServiceImpl implements IErpDataWmsService {
@Resource
private final ErpDataWmsMapper erpDataWmsMapper;
private final JdbcTemplate jdbcTemplate;
@Override
@ -209,4 +215,9 @@ public class ErpDataWmsServiceImpl implements IErpDataWmsService {
return excflag;
}
@Override
public StGoodsExtStatusVO getGoodsExtStatus(String goodsCode){
return erpDataWmsMapper.getGoodsExtStatus(goodsCode);
}
}

@ -25,6 +25,8 @@
*/
package org.springblade.scheduling.scheduling.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@ -34,6 +36,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
@ -43,20 +46,25 @@ 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.desk.basic.pojo.entity.OemCraftAbilityEntity;
import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import org.springblade.desk.basic.constant.ExcelConst;
import org.springblade.scheduling.pojo.entity.QualityGradeEntity;
import org.springblade.scheduling.scheduling.excel.QualityGradeExcel;
import org.springblade.scheduling.scheduling.service.IQualityGradeService;
import org.springblade.scheduling.scheduling.vo.QualityGradeVO;
import org.springblade.scheduling.scheduling.wrapper.QualityGradeWrapper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -292,4 +300,105 @@ public class QualityGradeController extends BladeController {
return R.data(list);
}
@PostMapping("/importExcel")
@ApiOperationSupport(order = 72)
@Operation(summary = "导入Excel", description = "MultipartFile")
public R importExcel(@RequestParam("file") MultipartFile file) {
importExcelCheck(file);
List<QualityGradeEntity> list = ExcelUtil.read(file, QualityGradeEntity.class);
if (CollUtil.isEmpty(list)){
return R.fail("导入数据为空");
}
list.forEach(s -> {
String type = s.getType();
if (StrUtil.isNotEmpty(type)) {
List<String> typeCodes = new ArrayList<>();
List<String> typeNames = new ArrayList<>();
for (Map.Entry<String, String> entry : QualityGradeEntity.typeMap.entrySet()) {
if (type.contains(entry.getValue())) {
typeCodes.add(entry.getKey());
typeNames.add(entry.getValue());
}
}
if (!typeCodes.isEmpty()) {
s.setType(String.join(",", typeCodes));
s.setTypeNames(String.join(",", typeNames));
}
}
// isLocal
String isLocal = s.getIsLocal();
if (StrUtil.isNotEmpty(isLocal)) {
for (Map.Entry<String, String> entry : QualityGradeEntity.isLocalMap.entrySet()) {
if (entry.getValue().equals(isLocal)) {
s.setIsLocal(entry.getKey());
break;
}
}
}
// isThickness
String isThickness = s.getIsThickness();
if (StrUtil.isNotEmpty(isThickness)) {
for (Map.Entry<String, String> entry : QualityGradeEntity.isThicknessMap.entrySet()) {
if (entry.getValue().equals(isThickness)) {
s.setIsThickness(entry.getKey());
break;
}
}
}
});
return R.data(qualityGradeService.saveBatch(list));
}
public static R importExcelCheck(MultipartFile file) {
if (file.isEmpty()) {
return R.fail("请上传文件");
}
String fileName = file.getOriginalFilename();
if (StringUtils.isBlank(fileName)) {
return R.fail("文件名为空");
}
if (!StringUtils.endsWith(fileName, ExcelConst.EXT_XLS) &&
!StringUtils.endsWith(fileName, ExcelConst.EXT_XLSX)) {
return R.fail("格式不正确");
}
return null;
}
/**
* 下载模板
*/
@IsAdmin
@GetMapping("/downloadTemplate")
@ApiOperationSupport(order = 9)
@Operation(summary = "导出模板", description = "导出模板")
public ResponseEntity<org.springframework.core.io.Resource> exportQualityGrade(HttpServletResponse response) {
return downloadXlsTemplate(
"Excel/质量等级表数据导入模板.xlsx",
"导入模版-质量等级表数据.xlsx");
}
public static ResponseEntity<Resource> downloadXlsTemplate(String path, String downloadFileName) {
if (StringUtils.isAnyBlank(path, downloadFileName)) {
throw new IllegalArgumentException("path or downloadFileName is null");
}
// 读取resource下的Excel文件,路径从resource根目录开始。
org.springframework.core.io.Resource resource = new ClassPathResource(path);
// 检查文件是否存在。
if (!resource.exists()) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
// 构建响应头。
HttpHeaders headers = new HttpHeaders();
// 文件名编码,解决中文乱码问题。
String encodedFileName = URLEncoder.encode(downloadFileName, StandardCharsets.UTF_8)
.replaceAll("\\+", "%20");
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"");
// 返回文件流
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.parseMediaType(ExcelConst.CONTENT_TYPE_XLSX))
.body(resource);
}
}

@ -120,7 +120,7 @@
LEFT JOIN MES_YIELD_ORDER g on g.id = a.yo_id
<where>
a.is_deleted = 0 and b.is_deleted = 0 and a.status in (1,2,3,5)
and b.plan_start_time is not null and b.plan_end_time is not null and g.work_center_id in (81,122,162)
and b.plan_start_time is not null and b.plan_end_time is not null
<if test="startTime !=null and startTime != ''">
and to_char(b.plan_start_time,'YYYY-MM-DD') <![CDATA[ >= ]]> #{startTime}
</if>

@ -635,6 +635,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
Boolean isOccupied = false;
List<EquipResourceEntity> resourceList = entry1.getValue();
for (EquipResourceEntity equipResource : resourceList) {
if(equipResource.getStartTime().compareTo(prevProcessEnd) <0){
continue;
}
//烧结订单需判断零件类型
if(order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode()){
//玻璃饼订单查询玻璃饼直径,壳体查询最大外径
@ -664,11 +667,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if(order.getYieldType() != YieldOrderEnum.YIELD_TYPE_1.getCode()){
Double personHours = 0.0;
if("箱式排腊玻化工序".equals(processMap.get(craft.getPpsId()))){
personHours = calPersonHoursByXsplbh(order,part);
personHours = calPersonHoursByXsplbh(capacity.intValue(),part);
}else if("真空炉灌胶".equals(processMap.get(craft.getPpsId()))){
personHours = calPersonHoursByZklgj(order,part);
personHours = calPersonHoursByZklgj(capacity.intValue(),part);
}else{
personHours = calPersonHours(order,craft,part);
personHours = calPersonHours(capacity.intValue(),craft,part);
}
workPlan.setPlanEndTime(workPlan.getPlanEndTime().plusMinutes(personHours.longValue()));
}
@ -783,21 +786,21 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}else{
if("玻璃封接组装".equals(processMap.get(craft.getPpsId()))){//玻璃封接组装单独计算
totalTime = calPersonHoursByBlfjzz(order,part);
totalTime = calPersonHoursByBlfjzz(order.getYpQty(),part);
}else if("箱式排腊玻化工序".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByXsplbh(order,part);
totalTime = calPersonHoursByXsplbh(order.getYpQty(),part);
}else if("玻璃封接卸模".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByBlfjxm(order,part);
totalTime = calPersonHoursByBlfjxm(order.getYpQty(),part);
}else if("玻璃封接灌胶".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByBlfjgj(order,part);
totalTime = calPersonHoursByBlfjgj(order.getYpQty(),part);
}else if("真空炉灌胶".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByZklgj(order,part);
totalTime = calPersonHoursByZklgj(order.getYpQty(),part);
}else if("单侧折针".equals(processMap.get(craft.getPpsId())) || "双侧折针".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByZz(order,part,processMap.get(craft.getPpsId()));
totalTime = calPersonHoursByZz(order.getYpQty(),part,processMap.get(craft.getPpsId()));
}else if("玻璃封接电镀上挂".equals(processMap.get(craft.getPpsId()))){
totalTime = calPersonHoursByBlfjddsg(order,part);
totalTime = calPersonHoursByBlfjddsg(order.getYpQty(),part);
}else{
totalTime = calPersonHours(order,craft,part);
totalTime = calPersonHours(order.getYpQty(),craft,part);
}
}
@ -1766,11 +1769,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
Double personHours = 0.0;
if("箱式排腊玻化工序".equals(processMap.get(craft.getPpsId()))){
personHours = calPersonHoursByXsplbh(order,part);
personHours = calPersonHoursByXsplbh(order.getYpQty(),part);
}else if("真空炉灌胶".equals(processMap.get(craft.getPpsId()))){
personHours = calPersonHoursByZklgj(order,part);
personHours = calPersonHoursByZklgj(order.getYpQty(),part);
}else{
personHours = calPersonHours(order,craft,part);
personHours = calPersonHours(order.getYpQty(),craft,part);
}
workPlan.setPlanEndTime(workPlan.getPlanEndTime().plusMinutes(personHours.longValue()));
workPlan.setWorkQty(0);
@ -1940,7 +1943,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
glassCakeOutClient.batchGeneratePreOutOrder(list);
}
public Double calPersonHours(YieldOrderEntity order,YieldOrderCraftEntity craft,PartEntity part){
public Double calPersonHours(Integer qty,YieldOrderCraftEntity craft,PartEntity part){
Double personTime = 0.0;
List<PersonAbilityEntity> personAbilityList = personAbilityService.list(Wrappers.<PersonAbilityEntity>lambdaQuery()
.eq(PersonAbilityEntity::getWorkCenterId,craft.getWorkCenterId())
@ -1953,7 +1956,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
List<PersonAbilityVO> voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference<List<PersonAbilityVO>>() {});
for(PersonAbilityVO vo : voList){
if(part.getExternalDiameter() != null && part.getExternalDiameter() > vo.getStartNum() && part.getExternalDiameter() <= vo.getEndNum()){
personTime = Double.parseDouble(vo.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue();
personTime = Double.parseDouble(vo.getStandardTime()) * qty + personAbility.getPrepareTime().doubleValue();
break;
}
}
@ -1966,7 +1969,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
List<PersonAbilityVO> voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference<List<PersonAbilityVO>>() {});
for(PersonAbilityVO vo : voList){
if(part.getBlbDiameter() != null && part.getBlbDiameter() >vo.getStartNum() && part.getBlbDiameter() <= vo.getEndNum()){
personTime = Double.parseDouble(vo.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue();
personTime = Double.parseDouble(vo.getStandardTime()) * qty + personAbility.getPrepareTime().doubleValue();
break;
}
}
@ -1990,7 +1993,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
List<PersonAbilityVO> voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference<List<PersonAbilityVO>>() {});
for(PersonAbilityVO vo : voList){
if(quota > vo.getStartNum() && quota <= vo.getEndNum()){
personTime = Double.parseDouble(vo.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue();
personTime = Double.parseDouble(vo.getStandardTime()) * qty + personAbility.getPrepareTime().doubleValue();
break;
}
}
@ -2003,7 +2006,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.eq(PersonAbilityEntity::getWorkCenterId,craft.getWorkCenterId())
.eq(PersonAbilityEntity::getCraftId,craft.getCaId())
.eq(PersonAbilityEntity::getProcessId,craft.getPpsId()));
personTime = Double.parseDouble(personAbility.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue();
personTime = Double.parseDouble(personAbility.getStandardTime()) * qty + personAbility.getPrepareTime().doubleValue();
}
}
return Math.ceil(personTime);
@ -2011,7 +2014,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//玻璃封接组装
public Double calPersonHoursByBlfjzz(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByBlfjzz(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null) {
List<PartRelationEntity> partRelationList = partRelationService.list(Wrappers.<PartRelationEntity>lambdaQuery().eq(PartRelationEntity::getPartId,part.getId()));
@ -2106,11 +2109,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
return Math.ceil(result * order.getYpQty());
return Math.ceil(result * qty);
}
//箱式排腊玻化工序
public Double calPersonHoursByXsplbh(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByXsplbh(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null && part.getBlbDiameter() != null) {
Double n = part.getBlbDiameter();
@ -2135,11 +2138,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
result = 0.6 + 0.6 * Math.pow(1.2, y);
}
return Math.ceil(result * order.getYpQty() + 19);
return Math.ceil(result * qty + 19);
}
//玻璃封接卸模
public Double calPersonHoursByBlfjxm(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByBlfjxm(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null) {
List<PartRelationEntity> partRelationList = partRelationService.list(Wrappers.<PartRelationEntity>lambdaQuery().eq(PartRelationEntity::getPartId,part.getId()));
@ -2220,11 +2223,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
}
return Math.ceil(result * order.getYpQty() + 3);
return Math.ceil(result * qty + 3);
}
//玻璃封接灌胶
public Double calPersonHoursByBlfjgj(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByBlfjgj(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null&&part.getExternalDiameter() != null) {
Double n = part.getExternalDiameter();
@ -2263,11 +2266,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
}
return Math.ceil(result * order.getYpQty() + 4);
return Math.ceil(result * qty + 4);
}
//真空炉灌胶
public Double calPersonHoursByZklgj(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByZklgj(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null && part.getExternalDiameter() != null) {
List<PartRelationEntity> partRelationList = partRelationService.list(Wrappers.<PartRelationEntity>lambdaQuery().eq(PartRelationEntity::getPartId,part.getId()));
@ -2297,7 +2300,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if (n > 80) {
result = 15.6 + 1.5 * sumOfQuota;
}
result = result * order.getYpQty() + 7;
result = result * qty + 7;
} else {
if (n <= 15) {
result = 6.6 + 3.5 * sumOfQuota;
@ -2314,13 +2317,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if (n > 80) {
result = 15.6 + 3.5 * sumOfQuota;
}
result = result * order.getYpQty() + 10;
result = result * qty + 10;
}
}
return Math.ceil(result);
}
//单侧折针、双侧折针
public Double calPersonHoursByZz(YieldOrderEntity order,PartEntity part,String processName){
public Double calPersonHoursByZz(Integer qty,PartEntity part,String processName){
Double result = 0.0;
if (part != null && part.getId() != null) {
List<PartRelationEntity> partRelationList = partRelationService.list(Wrappers.<PartRelationEntity>lambdaQuery().eq(PartRelationEntity::getPartId,part.getId()));
@ -2340,11 +2343,11 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
}
}
}
return Math.ceil(result * order.getYpQty() + 2);
return Math.ceil(result * qty + 2);
}
//玻璃封接电镀上挂
public Double calPersonHoursByBlfjddsg(YieldOrderEntity order,PartEntity part){
public Double calPersonHoursByBlfjddsg(Integer qty,PartEntity part){
Double result = 0.0;
if (part != null && part.getId() != null) {
List<PartRelationEntity> partRelationList = partRelationService.list(Wrappers.<PartRelationEntity>lambdaQuery().eq(PartRelationEntity::getPartId,part.getId()));
@ -2357,7 +2360,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
result = (38 + 3 * sumOfQuota) / 60;
}
}
return Math.ceil(result * order.getYpQty() + 2);
return Math.ceil(result * qty + 2);
}
public static List<YieldOrderEntity> mergeYieldOrderList(List<YieldOrderEntity> originalList) {

@ -41,6 +41,7 @@ import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.desk.basic.feign.IWorkCenterClient;
import org.springblade.desk.basic.pojo.entity.BasicClazz;
import org.springblade.desk.basic.pojo.entity.PlatingAssortment;
import org.springblade.desk.basic.pojo.entity.TeamSet;
import org.springblade.system.cache.SysCache;
import org.springblade.system.mapper.DeptMapper;
@ -190,7 +191,8 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
// List<User> list = userExtService.listAllByRoleIds("2032373544077012993,2032373858255548418");
// List<Long> userIds = list.stream().map(User::getId).collect(Collectors.toList());
BasicClazz detail = workCenterClient.getClazzById(clazzId).getData();
//BasicClazz detail = workCenterClient.getClazzById(clazzId).getData();
PlatingAssortment detail = workCenterClient.platingAssortmentByid(clazzId).getData();
if(detail != null){
String teamId = detail.getTeamMemberId();
if(null != teamId && !"".equals(teamId)){

@ -105,11 +105,6 @@ public class StBuyOrderController extends BladeController {
stBuyOrder.setApprovalStatus(StBuyOrder.APPROVAL_STATUS_CHECKING);
}
/* 2. 默认排序:boCode 升序(*/
if (StrUtil.isBlank(query.getAscs()) && StrUtil.isBlank(query.getDescs())) {
query.setAscs("bo_code");
}
IPage<StBuyOrderVO> pages = stBuyOrderService.selectStBuyOrderPage(Condition.getPage(query), stBuyOrder);
return R.data(pages);
}

@ -0,0 +1,32 @@
package org.springblade.wms.feign;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.wms.service.IStGoodsExtService;
import org.springframework.web.bind.annotation.RestController;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName WmsTaskClient
* @description:
* @autor: WuSiYu
* @create 2026-04-30 10:20
**/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
@Slf4j
public class WmsTaskClientImpl implements WmsTaskClient{
private final IStGoodsExtService stGoodsExtService;
@Override
public boolean executeGoodsStatusUpdate() {
stGoodsExtService.executeGoodsStatusUpdate();
return true;
}
}

@ -51,7 +51,7 @@
AND g.goods_code LIKE CONCAT('%', #{ew.entity.goodsCode}, '%')
</if>
</if>
ORDER BY a.create_time DESC
</select>
<select id="selectStAllotRecordPage" resultType="org.springblade.wms.pojo.vo.StAllotRecordVO">
@ -80,6 +80,7 @@
<if test="param2.goodsCode != null and param2.goodsCode != ''">
AND g.goods_code = #{param2.goodsCode}
</if>
ORDER BY a.create_time DESC
</select>

@ -32,7 +32,7 @@
se.es_time AS esTime,
se.es_man AS esMan,
se.submit_status AS submitStatus,
NVL(se.es_qty, 0),
se.es_qty,
-- 物料表:物料编码、物料名称
g.goods_code AS goodsCode,
g.goods_name AS goodsName,

@ -41,5 +41,7 @@ public interface StGoodsExtMapper extends BaseMapper<StGoodsExt> {
List<StGoodsExtExcel> exportStGoodsExt(@Param("ew") Wrapper<StGoodsExt> queryWrapper);
IPage<StGoodsExtVO> selectGoodsExtWithGoods(IPage<StGoodsExtVO> page, @Param("ew") QueryWrapper<StGoodsExt> queryWrapper);
StGoodsExt getGoodsExt(Double invqty1j, Double planqty, Long goodsId);
}

@ -87,6 +87,33 @@
ORDER BY se.create_time DESC
</select>
<select id="getGoodsExt" resultType="org.springblade.wms.pojo.entity.StGoodsExt">
SELECT
mes.last_qty as lastStore,
CASE
WHEN NVL(#{planqty}, 0) + NVL(mes.last_qty, 0) &lt;= NVL(ge.use_average, 0)
THEN 1
WHEN (NVL(#{invqty1j}, 0) + NVL(mes.last_qty, 0)) &lt; NVL(ge.use_average, 0) AND NVL(#{planqty}, 0) &gt; 0
THEN 2
WHEN NVL(mes.last_qty, 0) &lt; NVL(ge.use_average, 0) AND NVL(#{planqty}, 0) &gt; 0
THEN 3
WHEN NVL(ge.use_average, 0) = 0
THEN 5
ELSE 4
END AS goodsStatus
FROM st_goods_ext ge
INNER JOIN st_goods g ON g.id = ge.goods_id
LEFT JOIN (
SELECT b.goods_code, SUM(a.quantity - a.occupy_quantity) AS last_qty
FROM st_realtime_stock a
INNER JOIN st_goods b ON a.goods_id = b.id
GROUP BY b.goods_code
) mes ON g.goods_code = mes.goods_code
WHERE g.id = #{goodsId}
</select>
<select id="exportStGoodsExt" resultType="org.springblade.wms.excel.StGoodsExtExcel">
SELECT * FROM ST_GOODS_EXT ${ew.customSqlSegment}
</select>

@ -41,5 +41,7 @@ public interface IStGoodsExtService extends BaseService<StGoodsExt> {
IPage<StGoodsExtVO> selectGoodsExtPage(IPage<StGoodsExtVO> page, Map<String, Object> stGoodsExt);
Boolean getSpecial(Long goodsId);
void executeGoodsStatusUpdate();
}

@ -10,7 +10,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.common.feign.IMesApprovalRecordClient;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
@ -226,7 +225,7 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
// 3. 更新审批状态
buyOrder.setApprovalStatus(approvalResult);
buyOrder.setCheckMan(approver.getNickName());
buyOrder.setCheckMan(approver.getUserId());
buyOrder.setCheckDate(new Date());
baseMapper.updateById(buyOrder);
@ -277,14 +276,19 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
StGoods goods = stGoodsService.getById(bo.getGoodsId());
dto.setPrtno(goods.getGoodsCode());
dto.setPrtlotno(StrUtil.blankToDefault(bo.getGrade(), " "));
dto.setReqdept(AuthUtil.getUser().getDeptId().toString()); // 当前人部门
// dto.setReqdept(AuthUtil.getUser().getDeptId().toString()); // 当前人部门"3400"
dto.setReqdept("3400"); // 当前人部门"3400"
dto.setReqdat(bo.getNeedDate() == null ? "" : DateUtil.format(bo.getNeedDate(), "yyyy-MM-dd"));
dto.setReqqty(BigDecimal.valueOf(Optional.ofNullable(bo.getBuyQty()).orElse(0D)));
dto.setReqdate(bo.getDeclareDate() == null ? "" : DateUtil.format(bo.getDeclareDate(), "yyyy-MM-dd"));
dto.setPlnarea(bo.getPlanArea());
dto.setReqctlr(String.valueOf(AuthUtil.getUser().getUserId())); // 当前登录人
R<User> ruser = userClient.userInfoById(bo.getDeclareMan());
User declareMan = ruser.getData();
dto.setReqctlr(declareMan.getAccount()); // 当前登录人
dto.setCheckdate(bo.getCheckDate() == null ? "" : DateUtil.format(bo.getCheckDate(), "yyyy-MM-dd"));
dto.setCheckman(bo.getCheckMan() == null ? "" : bo.getCheckMan());
R<User> userR = userClient.userInfoById(bo.getCheckMan());
User checkMan = userR.getData();
dto.setCheckman(checkMan.getAccount() == null ? "" : checkMan.getAccount());
pdList.add(dto);
}

@ -71,6 +71,8 @@ public class StExpireSubmissionServiceImpl extends BaseServiceImpl<StExpireSubmi
throw new RuntimeException("到期送检发送失败: " + ex.getMessage());
}
e.setEsMan(user.getUserId());
e.setSubmitStatus(1);
e.setCreateUser(user.getUserId());
e.setEsTime(new Date());
// 保存送检记录

@ -3,10 +3,16 @@ package org.springblade.wms.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.erpdata.feign.IErpDataWmsClient;
import org.springblade.erpdata.pojo.vo.StGoodsExtStatusVO;
import org.springblade.wms.excel.StGoodsExtExcel;
import org.springblade.wms.mapper.StGoodsExtMapper;
import org.springblade.wms.mapper.StGoodsMapper;
import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.entity.StGoodsExt;
import org.springblade.wms.pojo.vo.StGoodsExtVO;
import org.springblade.wms.service.IStGoodsExtService;
@ -14,6 +20,8 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @version 1.0
@ -23,10 +31,15 @@ import java.util.Map;
* @autor: WuSiYu
* @create 2025-12-15 14:31
**/
@Slf4j
@Service
public class StGoodsExtServiceImpl extends BaseServiceImpl<StGoodsExtMapper, StGoodsExt> implements IStGoodsExtService {
@Resource
private StGoodsMapper stGoodsMapper;
@Resource
private IErpDataWmsClient erpDataWmsClient;
@Override
public IPage<StGoodsExtVO> selectStGoodsExtPage(IPage<StGoodsExtVO> page, StGoodsExtVO stGoodsExt) {
return page.setRecords(baseMapper.selectStGoodsExtPage(page, stGoodsExt));
@ -58,6 +71,49 @@ public class StGoodsExtServiceImpl extends BaseServiceImpl<StGoodsExtMapper, StG
return stGoodsExt.getSpecial() != null ? stGoodsExt.getSpecial() : false;
}
@Override
public void executeGoodsStatusUpdate() {
try {
// 1. 调用你的 Mapper 方法,查询所有商品计算后的状态
QueryWrapper<StGoodsExt> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_deleted", 0);
List<StGoodsExt> list = baseMapper.selectList(queryWrapper);
List<Long> goodsIds = list.stream()
.map(StGoodsExt::getGoodsId)
.filter(Objects::nonNull)
.toList();
Map<Long, String> goodsIdToCodeMap = stGoodsMapper.selectBatchIds(goodsIds)
.stream()
.collect(Collectors.toMap(StGoods::getId, StGoods::getGoodsCode));
for (StGoodsExt ext : list) {
Long goodsId = ext.getGoodsId();
String goodsCode = goodsIdToCodeMap.get(goodsId);
StGoodsExtStatusVO vo = erpDataWmsClient.getGoodsExtStatus(goodsCode).getData();
if (vo == null) {
log.warn("物料ERP信息不存在,跳过:goodsCode={}", goodsCode);
continue;
}
StGoodsExt goodsExt = baseMapper.getGoodsExt(vo.getInvqty1j(),vo.getPlanqty(),goodsId);
ext.setFirstStore(vo.getInvqty1j());
ext.setLastStore(goodsExt.getLastStore());
ext.setPlanQty(vo.getPlanqty());
ext.setGoodsStatus(goodsExt.getGoodsStatus());
// ext.setUpdateTime(new Date());
// ext.setUpdateUser(AuthUtil.getUserId());
this.updateById(ext);
}
log.info("===== 物料状态定时更新完成 =====", list.size());
} catch (Exception e) {
log.info("===== 物料状态定时更新异常 =====", e);
}
}
@Override
public List<StGoodsExtExcel> exportStGoodsExt(Wrapper<StGoodsExt> queryWrapper) {

@ -73,6 +73,7 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl<StOtherOutRecor
stOtherOutRecord.setCreateTime(new Date());
stOtherOutRecord.setUpdateUser(user.getUserId());
stOtherOutRecord.setUpdateTime(new Date());
stOtherOutRecord.setRrId(rrId);
// 3. 先保存出库单基础记录(获取ID)
this.save(stOtherOutRecord);
@ -184,6 +185,12 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl<StOtherOutRecor
stOtherOutRecord.setUpdateUser(user.getUserId());
stOtherOutRecord.setUpdateTime(new Date());
this.updateById(stOtherOutRecord);
if(stOtherOutRecord.getBfType() == 2 && stOtherOutRecord.getRrId() != null){
StReturnRecord stReturnRecord = stReturnRecordMapper.selectById(stOtherOutRecord.getRrId());
stReturnRecord.setBfCode(detail.getSirCode());
stReturnRecordMapper.updateById(stReturnRecord);
}
}
stRealtimeStockService.reviseRealTimeStock(Collections.singletonList(detail), Collections.singletonList(stock), null);

@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.BarcodeFactory;
@ -24,6 +25,8 @@ import org.springblade.wms.pojo.vo.*;
import org.springblade.wms.service.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
@ -232,7 +235,7 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
// 初始化返回集合,收集批量处理的rlsId
List<Long> rlsIdList = new ArrayList<>();
List<String> warnMsgList = new ArrayList<>();
// 遍历出入库记录列表,批量执行核心业务逻辑
for (int i = 0; i < inoutList.size(); i++) {
// 3.1 获取当前索引对应的单个对象
@ -357,9 +360,14 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}
stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
// ========== 新增:其他/刀具出库后校验最低库存预警 ==========
checkAndWarnMinStock(stGoods, inout.getGoodsId(), quantity);
checkAndTriggerReissue(stGoods, inout.getGoodsId(), quantity);
String warnMsg = checkAndWarnMinStock(stGoods, inout.getGoodsId(), quantity);
if (warnMsg != null) {
warnMsgList.add(warnMsg);
}
String warnMsg2 = checkAndTriggerReissue(stGoods, inout.getGoodsId(), quantity);
if (warnMsg2 != null) {
warnMsgList.add(warnMsg2);
}
}// 新增:玻璃饼出库独立分支(与其他出库/刀具出库平级)
else if (StStockInoutRecord.INOUT_SOURCE_GLASS_CAKE_OUT.equals(inout.getInOutSource())) {
// 玻璃饼出库专属:预占用校验(规则与原有一致)
@ -385,8 +393,14 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
// 玻璃饼出库:扣减库存(规则与其他出库一致,也可单独定制)
stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
// ========== 新增:玻璃饼出库后校验最低库存预警 ==========
checkAndWarnMinStock(stGoods, inout.getGoodsId(), quantity);
checkAndTriggerReissue(stGoods, inout.getGoodsId(), quantity);
String warnMsg3 = checkAndWarnMinStock(stGoods, inout.getGoodsId(), quantity);
if (warnMsg3 != null) {
warnMsgList.add(warnMsg3);
}
String warnMsg4 = checkAndTriggerReissue(stGoods, inout.getGoodsId(), quantity);
if (warnMsg4 != null) {
warnMsgList.add(warnMsg4);
}
}
// else if (StStockInoutRecord.INOUT_SOURCE_ASSIGN_OUT.equals(inout.getInOutSource())) {
// if (!stock.getMoldBaseMaterial()) {
@ -444,6 +458,11 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
rlsIdList.add(rlsId);
}
//
if (!warnMsgList.isEmpty()) {
// 把消息存到 REQUEST,给前端展示
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
request.setAttribute("warnMsgList", warnMsgList);
}
// // 返回批量处理后的rlsId列表
return rlsIdList;
}
@ -526,9 +545,9 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}
// 2. 仅开启最低库存预警时,才执行校验
if (Boolean.TRUE.equals(stGoods.getMinWarning())) {
if ("1".equals(stGoods.getMinWarning())) {
// 3. 计算出库后库存,处理最低库存空值(默认0)
Double currentStock = stGoods.getCurrentQuantity() - outQuantity;
Double currentStock = stGoods.getCurrentQuantity();
Double minStock = stGoods.getMinNum() == null ? 0.0 : stGoods.getMinNum();
// 4. 低于最低库存时,生成预警信息+执行后续逻辑

Loading…
Cancel
Save