liweidong
liweidong-hj 3 weeks ago
commit 96ef525f5b
  1. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModify.java
  2. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/common/constant/BizTypeConstant.java
  3. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/PriceSheetVO.java
  4. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/order/pojo/entity/YieldOrder.java
  5. 7
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/vo/WorkOrderVO.java
  6. 2
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/YieldOrderEntity.java
  7. 12
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java
  8. 26
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java
  9. 2
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGoodsExt.java
  10. 151
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java
  11. 10
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java
  12. 35
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java
  13. 157
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyServiceImpl.java
  14. 49
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyMonitorController.java
  15. 190
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsEnergyTargetController.java
  16. 76
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetElectricExcel.java
  17. 57
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEnergyTargetExcel.java
  18. 48
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/BsEnergyTargetMapper.java
  19. 70
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EnergyTargetMapper.xml
  20. 113
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsEnergyTargetVO.java
  21. 38
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsEnergyTargetService.java
  22. 91
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsEnergyTargetServiceImpl.java
  23. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStatementServiceImpl.java
  24. 20
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java
  25. 12
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/mapper/WorkOrderMapper.xml
  26. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MacToolUseServiceImpl.java
  27. 24
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java
  28. 12
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderServiceImpl.java
  29. BIN
      blade-service/blade-desk/src/main/resources/Excel/energy/用电目标.xls
  30. BIN
      blade-service/blade-desk/src/main/resources/Excel/energy/能耗目标.xls
  31. 4
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataOemMapper.xml
  32. 234
      blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java
  33. 164
      blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java
  34. 8
      blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java
  35. 3
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.java
  36. 6
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml
  37. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.java
  38. 32
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.xml
  39. 52
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java
  40. 116
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml
  41. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
  42. 14
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
  43. 51
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java
  44. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherReceiptRecordService.java
  45. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java
  46. 10
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java
  47. 5
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsExtServiceImpl.java
  48. 30
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java
  49. 345
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java
  50. 38
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherReceiptRecordServiceImpl.java
  51. 40
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java
  52. 36
      blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java

@ -78,4 +78,7 @@ public class PlanAssignSteerModify extends BaseEntity {
@Schema(description = "审批状态: 0-草稿, 1-一级审批中, 2-审批通过, 3-审批驳回, 4-二级审批中")
private Integer approvalStatus = ApprovalStatus.DRAFT;
@Schema(description = "附件")
private String attachment;
}

@ -16,4 +16,6 @@ public interface BizTypeConstant {
* 工艺任务转派
*/
String CRAFT_TASK_REDEPLOY = "工艺任务转派";
String SET_SUITE_FLOW = "齐套流转";
}

@ -51,6 +51,12 @@ public class PriceSheetVO {
@Schema(description = "阶梯价标识")
private String stairflag;
/**
* 阶梯价标记key
*/
@Schema(description = "阶梯价标记key")
private String stairflagkey;
/**
* 阶梯上限
*/

@ -510,6 +510,9 @@ public class YieldOrder extends BaseEntity {
@Schema(description = "责任部门")
private String resDept;
@Schema(description = "原生产订单ID")
private Long oldYoId;
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double plateThickness1;

@ -88,6 +88,12 @@ public class WorkOrderVO extends WorkOrder {
@Schema(description = "下序名称")
private String ppsNameNext;
@Schema(description = "上序id")
private Long ppsIdUp;
@Schema(description = "上序名称")
private String ppsNameUp;
@Schema(description = "下一班组id")
private Long makeTeamNext;
@ -105,5 +111,4 @@ public class WorkOrderVO extends WorkOrder {
@Schema(description = "优先级;1.正常,2.项目要求日期急件,3.合同急件,4.绩效零件,5.调度标注急件")
private String priorityName;
}

@ -377,5 +377,7 @@ public class YieldOrderEntity extends TenantEntity {
private String tjtNum;
@Schema(description = "责任部门")
private String resDept;
@Schema(description = "原生产订单ID")
private Long oldYoId;
}

@ -26,6 +26,8 @@ public interface WmsTaskClient {
String BUY_ORDER_APPLY = API_PREFIX + "/buyOrderApply";
String SAVE_SUB_ORDER_WAREHOUSING = API_PREFIX + "/saveSubOrderWarehousing";
/**
* 物料状态监控同步erp
*/
@ -40,4 +42,12 @@ public interface WmsTaskClient {
@RequestParam("buyDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date buyDate, @RequestParam("checkUserId")Long checkUserId,
@RequestParam("checkDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date checkDate) throws Exception;
}
/**
* 子件入库
*/
@PostMapping(SAVE_SUB_ORDER_WAREHOUSING)
void saveSubOrderWarehousing(@RequestParam("goodsCode")String goodsCode, @RequestParam("batchNo")String batchNo, @RequestParam("quantity")Double quantity,
@RequestParam("shId")Long shId, @RequestParam("slId")Long slId, @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date date,
@RequestParam("userId")Long userId) throws Exception;
}

@ -0,0 +1,26 @@
package org.springblade.wms.pojo.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import java.io.Serial;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutDTO
* @description: 石墨模出库 数据传输对象实体类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@Data
@EqualsAndHashCode(callSuper = true)
public class StGraphiteMoldOutDTO extends StGraphiteMoldOut {
@Serial
private static final long serialVersionUID = 1L;
}

@ -32,7 +32,7 @@ public class StGoodsExt extends BaseEntity {
* 季度月使用量均值
*/
@Schema(description = "季度月使用量均值")
private Long useAverage;
private Double useAverage;
/**
* 一级库存
*/

@ -0,0 +1,151 @@
package org.springblade.wms.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
import java.io.Serial;
import java.util.Date;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOut
* @description: 石墨模出库 实体类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@Data
@TableName("ST_GRAPHITE_MOLD_OUT")
@Schema(description = "StGraphiteMoldOut对象")
@EqualsAndHashCode(callSuper = true)
public class StGraphiteMoldOut extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 出库凭证信息
*/
@Schema(description = "出库凭证信息")
private Long sirId;
/**
* 生产单号
*/
@TableField(value = "YO_CODE")
private String yoCode;
/**
* 批次号
*/
@Schema(description = "批次号")
private String piNo;
/**
* 流程卡号
*/
@Schema(description = "流程卡号")
private String cardNo;
/**
* 物料ID
*/
@Schema(description = "物料ID")
private Long goodsId;
/**
* 物料编号
*/
@Schema(description = "物料编号")
private String goodsCode;
/**
* 物料名称
*/
@Schema(description = "物料名称")
private String goodsName;
/**
* 物料需求量
*/
@Schema(description = "物料需求量")
private Double needQuantity;
/**
* 库房ID
*/
@Schema(description = "库房ID")
private Long shId;
/**
* 库房名称
*/
@Schema(description = "库房名称")
private String shName;
/**
* 库位ID
*/
@Schema(description = "库位ID")
private Long slId;
/**
* 库位号
*/
@Schema(description = "库位号")
private String location;
/**
* 已出库数量
*/
@Schema(description = "已出库数量")
private Double outedQuantity;
/**
* 出库时间
*/
@Schema(description = "出库时间")
private Date outTime;
/**
* 出库人
*/
@Schema(description = "出库人")
private Long outUser;
/**
* 出库单号
*/
@Schema(description = "出库单号")
private String outCode;
/**
* 库存ID
*/
@Schema(description = "库存ID")
private Long rlsId;
/**
* 状态
*/
@Schema(description = "状态")
private Long curStatus;
/**
* 可用库存数量
*/
@TableField(exist = false)
private Double stockQty;
/**
* 领料人ID
*/
@Schema(description = "领料人ID")
private Long picker;
}

@ -180,6 +180,11 @@ public class StStockInoutRecord extends TenantEntity {
*/
@Schema(description = "单价")
private Double unitPrice;
/**
* 流程卡号
*/
@Schema(description = "流程卡号")
private String cardNo;
/**
* 是否印字
@ -204,8 +209,8 @@ public class StStockInoutRecord extends TenantEntity {
public static final Short IN_TYPE = 0;
public static final Short OUT_TYPE = 1;
/*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料
11:配额出库,12:其他出库,13:领料出库 15刀具出库*/
/*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料
11:配额出库,12:其他出库,13:领料出库 15刀具出库,16玻璃饼出库,17石墨模出库*/
public static final Short INOUT_SOURCE_PURCHASE_RECEIPT = 1;
public static final Short INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT = 2;
public static final Short INOUT_SOURCE_OTHER_PURCHASE_RECEIPT = 3;
@ -217,6 +222,7 @@ public class StStockInoutRecord extends TenantEntity {
public static final Short INOUT_SOURCE_ASSIGN_OUT = 13;
public static final Short INOUT_SOURCE_TOOl_OUT = 15;
public static final Short INOUT_SOURCE_GLASS_CAKE_OUT = 16;
public static final Short INOUT_SOURCE_GRAPHITE_MOLD_OUT = 17;
}

@ -0,0 +1,35 @@
package org.springblade.wms.pojo.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import java.io.Serial;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutVO
* @description: 石墨模出库 视图实体类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@Data
@EqualsAndHashCode(callSuper = true)
public class StGraphiteMoldOutVO extends StGraphiteMoldOut {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "创建人名称")
@TableField(exist = false)
private String createUserName;
@Schema(description = "出库人名称")
@TableField(exist = false)
private String outUserName;
@Schema(description = "领料人名称")
@TableField(exist = false)
private String pickerName;
}

@ -4,6 +4,8 @@
package org.springblade.desk.basic.service.impl;
import cn.hutool.core.bean.BeanUtil;
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.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -18,10 +20,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.mapper.PlanAssignSteerModifyApprovalMapper;
import org.springblade.desk.basic.mapper.PlanAssignSteerModifyMapper;
import org.springblade.desk.basic.pojo.entity.PlanAssignSteer;
import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify;
import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyApproval;
import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD;
import org.springblade.desk.basic.pojo.entity.*;
import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyDVO;
import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyTimelineVO;
import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO;
@ -67,6 +66,7 @@ public class PlanAssignSteerModifyServiceImpl extends BaseServiceImpl<PlanAssign
@Resource
IUserClient userClient;
@Override
public IPage<PlanAssignSteerModifyVO> selectPlanAssignSteerModifyPage(IPage<PlanAssignSteerModifyVO> page, PlanAssignSteerModify planAssignSteerModify) {
return page.setRecords(baseMapper.selectPlanAssignSteerModifyPage(page, planAssignSteerModify));
@ -331,83 +331,100 @@ public class PlanAssignSteerModifyServiceImpl extends BaseServiceImpl<PlanAssign
* 根据审批通过的调整单更新分外协分派管理列表
*/
private void updatePlanAssignSteerFromModify(Long pasmId) {
//List<PlanAssignSteerModifyD> modifyDLst = planAssignSteerModifyDMapper.findByPasmId(pasmId);
//if (modifyDLst == null || modifyDLst.isEmpty()) {
// return;
//}
//
//PlanAssignSteerModify modify = getById(pasmId);
//if (modify == null) {
// return;
//}
//
//for (PlanAssignSteerModifyD modifyD : modifyDLst) {
// // 根据工艺能力和外协厂商查找现有分派规则
// QueryWrapper<BsAssignEntity> queryWrapper = new QueryWrapper<>();
// queryWrapper.eq("CRAFT_ABILITY_ID", modifyD.getPlatingId())
// .eq("OEM_ID", modifyD.getOemId());
// BsAssignEntity assign = bsAssignService.getOne(queryWrapper);
//
// if (assign == null) {
// // 不存在则创建新记录
// assign = new BsAssignEntity();
// assign.setCraftAbilityId(modifyD.getPlatingId());
// assign.setOemId(modifyD.getOemId());
// log.warn("分派规则不存在,创建新记录:工艺能力ID={},外协厂商ID={}",
// modifyD.getPlatingId(), modifyD.getOemId());
// }
//
// // 更新备注信息(记录来源)
// String remark = "分派控制调整单ID:" + pasmId;
// if (Func.isNotEmpty(assign.getRemark())) {
// remark = assign.getRemark() + "; " + remark;
// }
// assign.setRemark(remark);
//
// // 保存或更新
// if (assign.getId() == null || assign.getId() == 0) {
// bsAssignService.save(assign);
// } else {
// bsAssignService.updateById(assign);
// }
//}
}
@Override
public PlanAssignSteerModifyVO getDetail(Long pasmId, Long caId) {
// 参数校验:pasmId为空直接返回null
if (pasmId == null) {
return null;
List<PlanAssignSteerModifyD> modifyDLst = planAssignSteerModifyDService.findByPasmId(pasmId);
if (modifyDLst == null || modifyDLst.isEmpty()) {
return;
}
// 查询主表信息
List<PlanAssignSteerModifyVO> list = baseMapper.findByPasmId(pasmId);
if (list.isEmpty()) {
return null;
PlanAssignSteerModify modify = getById(pasmId);
if (modify == null) {
return;
}
PlanAssignSteerModifyVO modifyVO = list.get(0);
for (PlanAssignSteerModifyD modifyD : modifyDLst) {
// 根据工艺能力和外协厂商查找现有分派规则
QueryWrapper<PlanAssignSteer> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("PLATING_ID", modifyD.getPlatingId())
.eq("OEM_ID", modifyD.getOemId());
List<PlanAssignSteer> assignSteers = planAssignSteerService.list(queryWrapper);
BigDecimal assignScale = Objects.isNull(modifyD.getAssignScale()) ? BigDecimal.ZERO : modifyD.getAssignScale();
if (CollUtil.isEmpty(assignSteers)) {
// 不存在则创建新记录
PlanAssignSteer assignEntity = new PlanAssignSteer();
assignEntity.setPlatingId(modifyD.getPlatingId());
assignEntity.setOemId(modifyD.getOemId());
assignEntity.setAssignScale(assignScale);
planAssignSteerService.save(assignEntity);
break;
}
assignSteers.forEach(assign -> {
assign.setAssignScale(assignScale);
});
planAssignSteerService.updateBatchById(assignSteers);
}
// 判断是否需要查询明细:caId为空 或 caId与主表的platingId匹配
// // TODO: 2026/5/22 caId根据工艺能力查询计划分派控制
boolean shouldQueryDetail = caId == null || caId.equals(modifyVO.getPlatingId());
}
@Override
public PlanAssignSteerModifyVO getDetail(Long pasmId, Long caId) {
List<PlanAssignSteerModifyDVO> modifyLst = null;
if (shouldQueryDetail) {
List<PlanAssignSteerModifyD> detailList = planAssignSteerModifyDService.findByPasmId(pasmId);
if (!detailList.isEmpty()) {
modifyLst = detailList.stream()
.map(d -> {
PlanAssignSteerModifyDVO vo = new PlanAssignSteerModifyDVO();
BeanUtil.copyProperties(d, vo);
return vo;
})
.collect(Collectors.toList());
PlanAssignSteerModifyVO modifyVO = null;
Boolean initSteer = false;
if (pasmId != null) {
List<PlanAssignSteerModifyVO> entity = baseMapper.findByPasmId(pasmId);
List<PlanAssignSteerModifyVO> list = baseMapper.findByPasmId(pasmId);
if (list.isEmpty()) {
return null;
}
modifyVO = list.get(0);
if (caId == null || caId.equals(modifyVO.getPlatingId())) {
List<PlanAssignSteerModifyD> detailList = planAssignSteerModifyDService.findByPasmId(pasmId);
if (!detailList.isEmpty()) {
modifyLst = detailList.stream()
.map(d -> {
PlanAssignSteerModifyDVO vo = new PlanAssignSteerModifyDVO();
BeanUtil.copyProperties(d, vo);
return vo;
})
.collect(Collectors.toList());
}
} else {
initSteer = true;
}
} else {
if (caId == null) {
modifyVO = new PlanAssignSteerModifyVO();
modifyVO.setPlatingId(null);
modifyVO.setCreateMan(AuthUtil.getUserId());
modifyVO.setCreateTime(new Date());
} else {
initSteer = true;
}
}
if (initSteer) {
modifyVO = null;
// 根据工艺能力和外协厂商查找现有分派规则
List<PlanAssignSteer> assignSteers = planAssignSteerService.list(Wrappers.lambdaQuery(PlanAssignSteer.class)
.eq(PlanAssignSteer::getPlatingId, caId));
modifyLst = assignSteers.stream()
.map(assign -> {
PlanAssignSteerModifyDVO modifyDVO = new PlanAssignSteerModifyDVO();
modifyDVO.setPlatingId(assign.getPlatingId());
modifyDVO.setOemId(assign.getOemId());
modifyDVO.setAssignScale(assign.getAssignScale());
modifyDVO.setPasId(assign.getId());
return modifyDVO;
})
.collect(Collectors.toList());
}
modifyVO.setModifyLst(modifyLst);
return modifyVO;
}

@ -104,16 +104,16 @@ public class BsEnergyMonitorController extends BladeController {
if (exist != null && !exist.getId().equals(bsEnergyMonitor.getId())) {
return R.fail(bsEnergyMonitor.getMonth() + "月份能源监控表已存在");
}
if(bsEnergyMonitor.getLastWater() != null && bsEnergyMonitor.getLastOutput() != null){
if (bsEnergyMonitor.getLastWater() != null && bsEnergyMonitor.getLastOutput() != null) {
bsEnergyMonitor.setLastWaterRate(bsEnergyMonitor.getLastWater().divide(bsEnergyMonitor.getLastOutput(), 6, RoundingMode.HALF_UP));
}
if(bsEnergyMonitor.getLastElectric() != null && bsEnergyMonitor.getLastOutput() != null){
if (bsEnergyMonitor.getLastElectric() != null && bsEnergyMonitor.getLastOutput() != null) {
bsEnergyMonitor.setLastElectricRate(bsEnergyMonitor.getLastElectric().divide(bsEnergyMonitor.getLastOutput(), 6, RoundingMode.HALF_UP));
}
if(bsEnergyMonitor.getCurrentWater() != null && bsEnergyMonitor.getCurrentOutput() != null){
if (bsEnergyMonitor.getCurrentWater() != null && bsEnergyMonitor.getCurrentOutput() != null) {
bsEnergyMonitor.setCurrentWaterRate(bsEnergyMonitor.getCurrentWater().divide(bsEnergyMonitor.getCurrentOutput(), 6, RoundingMode.HALF_UP));
}
if(bsEnergyMonitor.getCurrentElectric() != null && bsEnergyMonitor.getCurrentOutput() != null){
if (bsEnergyMonitor.getCurrentElectric() != null && bsEnergyMonitor.getCurrentOutput() != null) {
bsEnergyMonitor.setCurrentElectricRate(bsEnergyMonitor.getCurrentElectric().divide(bsEnergyMonitor.getCurrentOutput(), 6, RoundingMode.HALF_UP));
}
}
@ -148,28 +148,17 @@ public class BsEnergyMonitorController extends BladeController {
@GetMapping("/getLastYearDetail")
@Operation(summary = "上年度详情", description = "传入bsEnergyMonitor")
public R<BsEnergyMonitorEntity> getLastYearDetail(BsEnergyMonitorEntity bsEnergyMonitor) {
YearMonth currentMonth = YearMonth.parse(bsEnergyMonitor.getMonth());
String currentYear = String.valueOf(currentMonth.getYear());
YearMonth lastYearMonth = currentMonth.minusYears(1);
String lastMonth = lastYearMonth.toString();
YearMonth currentYearMonth = YearMonth.parse(bsEnergyMonitor.getMonth());
String currentYear = String.valueOf(currentYearMonth.getYear());
String month = String.format("%02d", currentYearMonth.getMonthValue());
YearMonth lastYearMonth = currentYearMonth.minusYears(1);
String lastYear = String.valueOf(lastYearMonth.getYear());
String quarter = this.getQuarter(currentMonth.getMonth().getValue());
BsEnergyMonitorEntity detail = new BsEnergyMonitorEntity();
BsEnergyMonitorEntity lastYearDetail = bsEnergyMonitorService.getOne(new LambdaQueryWrapper<BsEnergyMonitorEntity>().eq(BsEnergyMonitorEntity::getMonth, lastMonth));
BsEnergyTargetEntity lastYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, lastYear)
.eq(BsEnergyTargetEntity::getType, "1"));
BsEnergyTargetEntity currentYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, currentYear)
.eq(BsEnergyTargetEntity::getType, "1"));
BsEnergyTargetEntity lastYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, lastYear)
.eq(BsEnergyTargetEntity::getQuarter, quarter)
.eq(BsEnergyTargetEntity::getType, "2"));
BsEnergyTargetEntity currentYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, currentYear)
.eq(BsEnergyTargetEntity::getQuarter, quarter)
.eq(BsEnergyTargetEntity::getType, "2"));
BsEnergyMonitorEntity lastYearDetail = bsEnergyMonitorService.getOne(new LambdaQueryWrapper<BsEnergyMonitorEntity>().eq(BsEnergyMonitorEntity::getMonth, lastYearMonth.toString()));
BsEnergyTargetEntity lastYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().eq(BsEnergyTargetEntity::getYear, lastYear).eq(BsEnergyTargetEntity::getMonth, month).eq(BsEnergyTargetEntity::getType, "1"));
BsEnergyTargetEntity currentYearWaterTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().eq(BsEnergyTargetEntity::getYear, currentYear).eq(BsEnergyTargetEntity::getMonth, month).eq(BsEnergyTargetEntity::getType, "1"));
BsEnergyTargetEntity lastYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().eq(BsEnergyTargetEntity::getYear, lastYear).eq(BsEnergyTargetEntity::getMonth, month).eq(BsEnergyTargetEntity::getType, "2"));
BsEnergyTargetEntity currentYearElectricTarget = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().eq(BsEnergyTargetEntity::getYear, currentYear).eq(BsEnergyTargetEntity::getMonth, month).eq(BsEnergyTargetEntity::getType, "2"));
if (lastYearDetail != null) {
detail.setLastWater(lastYearDetail.getCurrentWater());
detail.setLastElectric(lastYearDetail.getCurrentElectric());
@ -192,16 +181,4 @@ public class BsEnergyMonitorController extends BladeController {
return R.data(detail);
}
public static String getQuarter(int month) {
if (month <= 3) {
return "1";
} else if (month <= 6) {
return "2";
} else if (month <= 9) {
return "3";
} else {
return "4";
}
}
}

@ -26,9 +26,10 @@
package org.springblade.desk.energy.controller;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -45,21 +46,19 @@ 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.util.ExcelExtUtil;
import org.springblade.desk.energy.excel.BsEnergyTargetElectricExcel;
import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel;
import org.springblade.desk.energy.excel.BsEnergyTargetExcel;
import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity;
import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO;
import org.springblade.desk.energy.service.IBsEnergyTargetService;
import org.springblade.desk.energy.wrapper.BsEnergyTargetWrapper;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.Resource;
import org.springframework.data.redis.hash.HashMapper;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 能耗目标表 控制器
@ -80,29 +79,16 @@ public class BsEnergyTargetController extends BladeController {
*/
@GetMapping("/detail")
@Operation(summary = "详情", description = "传入bsEnergyTarget")
public R<BsEnergyTargetVO> detail(BsEnergyTargetEntity bsEnergyTarget) {
BsEnergyTargetEntity detail = bsEnergyTargetService.getOne(Condition.getQueryWrapper(bsEnergyTarget));
return R.data(BsEnergyTargetWrapper.build().entityVO(detail));
}
/**
* 能耗目标表 获取用水目标
*/
@GetMapping("/detailByWater")
@Operation(summary = "根据月份获取用水目标", description = "获取用水目标")
public R<BigDecimal> getWaterTargetByMonth(String month) {
BigDecimal waterTarget = bsEnergyTargetService.getWaterTargetByMonth(month);
return R.data(waterTarget);
}
/**
* 能耗目标表 获取用水目标
*/
@GetMapping("/detailByElectric")
@Operation(summary = "根据月份获取用电目标", description = "获取用电目标")
public R<BigDecimal> getElectricTargetByMonth(String month) {
BigDecimal electricTarget = bsEnergyTargetService.getElectricTargetByMonth(month);
return R.data(electricTarget);
public R<BsEnergyTargetVO> detail(BsEnergyTargetVO bsEnergyTarget) {
if (StringUtils.isEmpty(bsEnergyTarget.getYear()) || StringUtils.isEmpty(bsEnergyTarget.getType())) {
return R.fail("参数错误");
}
List<BsEnergyTargetVO> list = bsEnergyTargetService.selectBsEnergyTargetList(bsEnergyTarget);
if (CollectionUtils.isNotEmpty(list)) {
return R.data(list.get(0));
} else {
return R.fail("能耗目标详情查询失败");
}
}
/**
@ -119,21 +105,23 @@ public class BsEnergyTargetController extends BladeController {
* 能耗目标表 新增或修改
*/
@PostMapping("/submit")
@Operation(summary = "新增或修改", description = "传入bsEnergyTarget")
public R submit(@Valid @RequestBody BsEnergyTargetEntity bsEnergyTarget) {
BsEnergyTargetEntity bsEnergyTargetEntity = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, bsEnergyTarget.getYear())
.eq(BsEnergyTargetEntity::getType, bsEnergyTarget.getType())
.eq(bsEnergyTarget.getQuarter() != null, BsEnergyTargetEntity::getQuarter, bsEnergyTarget.getQuarter()));
if (bsEnergyTargetEntity != null && !bsEnergyTargetEntity.getId().equals(bsEnergyTarget.getId())) {
if ("1".equals(bsEnergyTarget.getType())) {
return R.fail("该年份能耗目标已存在");
}
if ("2".equals(bsEnergyTarget.getType())) {
return R.fail("该季度能耗目标已存在");
@Operation(summary = "新增或修改", description = "传入bsEnergyTargetList")
public R submit(@Valid @RequestBody List<BsEnergyTargetVO> bsEnergyTargetList) {
List<String> years = bsEnergyTargetList.stream().map(BsEnergyTargetVO::getYear).collect(Collectors.toList());
List<BsEnergyTargetEntity> existList = bsEnergyTargetService.list(new LambdaQueryWrapper<BsEnergyTargetEntity>().in(BsEnergyTargetEntity::getYear, years));
Map<String, Long> existMap = existList.stream().collect(Collectors.toMap(e -> e.getYear() + "-" + e.getMonth() + "-" + e.getType(), BsEnergyTargetEntity::getId, (oldValue, newValue) -> oldValue));
List<BsEnergyTargetEntity> saves = new ArrayList<>();
for (BsEnergyTargetVO bsEnergyTargetVO : bsEnergyTargetList) {
List<BsEnergyTargetEntity> bsEnergyTargetEntities = bsEnergyTargetVO.parseEntities();
for (BsEnergyTargetEntity bsEnergyTarget : bsEnergyTargetEntities) {
String key = bsEnergyTarget.getYear() + "-" + bsEnergyTarget.getMonth() + "-" + bsEnergyTarget.getType();
if (existMap.containsKey(key)) {
bsEnergyTarget.setId(existMap.get(key));
}
}
saves.addAll(bsEnergyTargetEntities);
}
return R.status(bsEnergyTargetService.saveOrUpdate(bsEnergyTarget));
return R.status(bsEnergyTargetService.saveOrUpdateBatch(saves));
}
/**
@ -152,130 +140,40 @@ public class BsEnergyTargetController extends BladeController {
@GetMapping("/export-bsEnergyTarget")
@Operation(summary = "导出数据", description = "传入bsEnergyTarget")
public void exportBsEnergyTarget(@Parameter(hidden = true) @RequestParam Map<String, Object> bsEnergyTarget, BladeUser bladeUser, HttpServletResponse response) {
Map<String, Object> conMap = new HashMap();
conMap.put("type", bsEnergyTarget.get("type"));
conMap.put("isDeleted", 0);
List<BsEnergyTargetEntity> list = bsEnergyTargetService.listByMap(conMap);
if ("1".equals(bsEnergyTarget.get("type"))) {
List<BsEnergyTargetWaterExcel> bsEnergyTargetWaterExcels = BeanUtil.copyToList(list, BsEnergyTargetWaterExcel.class);
ExcelUtil.export(response, "用水目标" + DateUtil.time(), "用水目标", bsEnergyTargetWaterExcels, BsEnergyTargetWaterExcel.class);
} else {
List<BsEnergyTargetElectricExcel> bsEnergyTargetElectricExcels = BeanUtil.copyToList(list, BsEnergyTargetElectricExcel.class);
ExcelUtil.export(response, "用电目标" + DateUtil.time(), "用电目标", bsEnergyTargetElectricExcels, BsEnergyTargetElectricExcel.class);
}
BsEnergyTargetVO vo = new BsEnergyTargetVO();
vo.setYear((String) bsEnergyTarget.get("year"));
vo.setType((String) bsEnergyTarget.get("type"));
List<BsEnergyTargetVO> list = bsEnergyTargetService.selectBsEnergyTargetList(vo);
List<BsEnergyTargetExcel> bsEnergyTargetExcels = BeanUtil.copyToList(list, BsEnergyTargetExcel.class);
ExcelUtil.export(response, "能耗目标" + DateUtil.time(), "能耗目标", bsEnergyTargetExcels, BsEnergyTargetExcel.class);
}
@GetMapping("/water-download-excel-template")
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<Resource> waterDownloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/energy/用水目标.xls",
"导入模版-用水目标.xls");
"Excel/energy/能耗目标.xls",
"导入模版-能耗目标.xls");
}
@GetMapping("/electric-download-excel-template")
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<Resource> electricDownloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate(
"Excel/energy/用电目标.xls",
"导入模版-用电目标.xls");
"Excel/energy/能耗目标.xls",
"导入模版-能耗目标.xls");
}
@PostMapping("/water-import-excel")
@Operation(summary = "导入Excel", description = "MultipartFile")
public R waterImportExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<BsEnergyTargetWaterExcel> importList = ExcelUtil.read(
file, 0, 1, BsEnergyTargetWaterExcel.class
);
boolean result = true;
Set<String> existSet = new HashSet<>();
StringBuffer msg = new StringBuffer();
List<BsEnergyTargetEntity> list = new ArrayList<>();
for (BsEnergyTargetWaterExcel excel : importList) {
if (existSet.contains(excel.getYear())) {
msg.append("Excel里【" + excel.getYear() + "】重复了\rn");
result = false;
continue;
}
existSet.add(excel.getYear());
BsEnergyTargetEntity exist = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, excel.getYear())
.eq(BsEnergyTargetEntity::getType, "1"));
if (exist != null) {
msg.append(excel.getYear() + "能耗目标已存在\n");
result = false;
continue;
}
BsEnergyTargetEntity bsEnergyTargetEntity = new BsEnergyTargetEntity();
BeanUtils.copyProperties(excel, bsEnergyTargetEntity);
bsEnergyTargetEntity.setType("1");
list.add(bsEnergyTargetEntity);
}
bsEnergyTargetService.saveBatch(list);
if (result) {
return R.success("导入成功");
} else {
return R.fail(msg.toString());
}
return bsEnergyTargetService.importExcelData(file, "1");
}
@PostMapping("/electric-import-excel")
@Operation(summary = "导入Excel", description = "MultipartFile")
public R electricImportExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<BsEnergyTargetElectricExcel> importList = ExcelUtil.read(
file, 0, 1, BsEnergyTargetElectricExcel.class
);
boolean result = true;
Set<String> existSet = new HashSet<>();
StringBuffer msg = new StringBuffer();
List<BsEnergyTargetEntity> list = new ArrayList<>();
for (BsEnergyTargetElectricExcel excel : importList) {
String key = excel.getYear() + "-" + excel.getQuarter();
if (existSet.contains(key)) {
msg.append("Excel里【" + key + "】重复了\rn");
result = false;
continue;
}
existSet.add(key);
if("第一季度".equals(excel.getQuarter())){
excel.setQuarter("1");
} else if("第二季度".equals(excel.getQuarter())){
excel.setQuarter("2");
} else if("第三季度".equals(excel.getQuarter())){
excel.setQuarter("3");
} else if("第四季度".equals(excel.getQuarter())){
excel.setQuarter("4");
}
BsEnergyTargetEntity exist = bsEnergyTargetService.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>().
eq(BsEnergyTargetEntity::getYear, excel.getYear())
.eq(BsEnergyTargetEntity::getType, "2")
.eq(BsEnergyTargetEntity::getQuarter, excel.getQuarter()));
if (exist != null) {
msg.append(key + "能耗目标已存在\n");
result = false;
continue;
}
BsEnergyTargetEntity bsEnergyTargetEntity = new BsEnergyTargetEntity();
BeanUtils.copyProperties(excel, bsEnergyTargetEntity);
bsEnergyTargetEntity.setType("2");
list.add(bsEnergyTargetEntity);
}
bsEnergyTargetService.saveBatch(list);
if (result) {
return R.success("导入成功");
} else {
return R.fail(msg.toString());
}
return bsEnergyTargetService.importExcelData(file, "2");
}
}

@ -1,76 +0,0 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.desk.energy.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.math.BigDecimal;
/**
* 能耗目标表 Excel实体类
*
* @author BladeX
* @since 2026-03-02
*/
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class BsEnergyTargetElectricExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 年份
*/
@ColumnWidth(50)
@ExcelProperty("年份")
private String year;
/**
* 季度
*/
@ColumnWidth(50)
@ExcelProperty("季度")
private String quarter;
/**
* 用电目标(kWh/dm²)
*/
@ColumnWidth(50)
@ExcelProperty("用电目标(kWh/dm²)")
private BigDecimal target;
}

@ -49,7 +49,7 @@ import java.io.Serial;
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class BsEnergyTargetWaterExcel implements Serializable {
public class BsEnergyTargetExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ -57,15 +57,56 @@ public class BsEnergyTargetWaterExcel implements Serializable {
/**
* 年份
*/
@ColumnWidth(50)
@ColumnWidth(20)
@ExcelProperty("年份")
private String year;
/**
* 用水目标(L/d)
*/
@ColumnWidth(50)
@ExcelProperty("用水目标(L/d㎡)")
private BigDecimal target;
@ColumnWidth(20)
@ExcelProperty("1月")
private BigDecimal m01Target;
@ColumnWidth(20)
@ExcelProperty("2月")
private BigDecimal m02Target;
@ColumnWidth(20)
@ExcelProperty("3月")
private BigDecimal m03Target;
@ColumnWidth(20)
@ExcelProperty("4月")
private BigDecimal m04Target;
@ColumnWidth(20)
@ExcelProperty("5月")
private BigDecimal m05Target;
@ColumnWidth(20)
@ExcelProperty("6月")
private BigDecimal m06Target;
@ColumnWidth(20)
@ExcelProperty("7月")
private BigDecimal m07Target;
@ColumnWidth(20)
@ExcelProperty("8月")
private BigDecimal m08Target;
@ColumnWidth(20)
@ExcelProperty("9月")
private BigDecimal m09Target;
@ColumnWidth(20)
@ExcelProperty("10月")
private BigDecimal m10Target;
@ColumnWidth(20)
@ExcelProperty("11月")
private BigDecimal m11Target;
@ColumnWidth(20)
@ExcelProperty("12月")
private BigDecimal m12Target;
}

@ -27,11 +27,9 @@ package org.springblade.desk.energy.mapper;
import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity;
import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO;
import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@ -43,29 +41,29 @@ import java.util.Map;
*/
public interface BsEnergyTargetMapper extends BaseMapper<BsEnergyTargetEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param bsEnergyTarget 查询参数
* @return List<BsEnergyTargetVO>
*/
List<BsEnergyTargetVO> selectBsEnergyTargetPage(IPage page, BsEnergyTargetVO bsEnergyTarget);
/**
* 自定义分页
*
* @param page 分页参数
* @param bsEnergyTarget 查询参数
* @return List<BsEnergyTargetVO>
*/
List<BsEnergyTargetVO> selectBsEnergyTargetPage(IPage page, BsEnergyTargetVO bsEnergyTarget);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<BsEnergyTargetExcel>
*/
List<BsEnergyTargetWaterExcel> exportBsEnergyTarget(@Param("ew") Wrapper<BsEnergyTargetEntity> queryWrapper);
/**
* 自定义查询
*
* @param bsEnergyTarget
* @return
*/
List<BsEnergyTargetVO> selectBsEnergyTargetList(BsEnergyTargetVO bsEnergyTarget);
/**
* 根据条件查询列表
* @param conMap
* @return
*/
List<BsEnergyTargetEntity> listByMap(Map<String, Object> conMap);
/**
* 根据条件查询列表
*
* @param conMap
* @return
*/
List<BsEnergyTargetEntity> listByMap(Map<String, Object> conMap);
}

@ -20,8 +20,24 @@
</resultMap>
<select id="selectBsEnergyTargetPage" resultMap="bsEnergyTargetResultMap">
select * from BS_ENERGY_TARGET
<select id="selectBsEnergyTargetPage" resultType="org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO">
SELECT * FROM (
SELECT
year,
TYPE,
MAX(CASE WHEN month = '01' THEN target ELSE NULL END ) AS m01Target,
MAX(CASE WHEN month = '02' THEN target ELSE NULL END ) AS m02Target,
MAX(CASE WHEN month = '03' THEN target ELSE NULL END ) AS m03Target,
MAX(CASE WHEN month = '04' THEN target ELSE NULL END ) AS m04Target,
MAX(CASE WHEN month = '05' THEN target ELSE NULL END ) AS m05Target,
MAX(CASE WHEN month = '06' THEN target ELSE NULL END ) AS m06Target,
MAX(CASE WHEN month = '07' THEN target ELSE NULL END ) AS m07Target,
MAX(CASE WHEN month = '08' THEN target ELSE NULL END ) AS m08Target,
MAX(CASE WHEN month = '09' THEN target ELSE NULL END ) AS m09Target,
MAX(CASE WHEN month = '10' THEN target ELSE NULL END ) AS m10Target,
MAX(CASE WHEN month = '11' THEN target ELSE NULL END ) AS m11Target,
MAX(CASE WHEN month = '12' THEN target ELSE NULL END ) AS m12Target
FROM BS_ENERGY_TARGET
<where>
is_deleted = 0
<if test="bsEnergyTarget.type!=null">
@ -30,13 +46,9 @@
<if test="bsEnergyTarget.year!=null">
and year = #{bsEnergyTarget.year}
</if>
<if test="bsEnergyTarget.quarter!=null">
and quarter = #{bsEnergyTarget.quarter}
</if>
<if test="bsEnergyTarget.status!=null">
and status = #{bsEnergyTarget.status}
</if>
</where>
GROUP BY year, type
)
<choose>
<when test="bsEnergyTarget.orderByField != null and bsEnergyTarget.orderByField != ''">
ORDER BY ${bsEnergyTarget.orderByField}
@ -44,36 +56,40 @@
<if test="!bsEnergyTarget.isAsc">DESC</if>
</when>
<otherwise>
ORDER BY CREATE_TIME DESC
ORDER BY year DESC
</otherwise>
</choose>
</select>
<select id="exportBsEnergyTarget" resultType="org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel">
SELECT * FROM BS_ENERGY_TARGET ${ew.customSqlSegment}
</select>
<select id="listByMap" resultType="org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity">
select ID,TYPE,MONTH,YEAR,TARGET,CASE WHEN QUARTER = 1 THEN '第一季度' WHEN QUARTER = 2 THEN '第二季度' WHEN QUARTER = 3 THEN '第三季度' WHEN QUARTER = 4 THEN '第四季度' ELSE '' END AS QUARTER
<select id="selectBsEnergyTargetList" resultType="org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO">
SELECT
year,
TYPE,
MAX(CASE WHEN month = '01' THEN target ELSE NULL END ) AS m01Target,
MAX(CASE WHEN month = '02' THEN target ELSE NULL END ) AS m02Target,
MAX(CASE WHEN month = '03' THEN target ELSE NULL END ) AS m03Target,
MAX(CASE WHEN month = '04' THEN target ELSE NULL END ) AS m04Target,
MAX(CASE WHEN month = '05' THEN target ELSE NULL END ) AS m05Target,
MAX(CASE WHEN month = '06' THEN target ELSE NULL END ) AS m06Target,
MAX(CASE WHEN month = '07' THEN target ELSE NULL END ) AS m07Target,
MAX(CASE WHEN month = '08' THEN target ELSE NULL END ) AS m08Target,
MAX(CASE WHEN month = '09' THEN target ELSE NULL END ) AS m09Target,
MAX(CASE WHEN month = '10' THEN target ELSE NULL END ) AS m10Target,
MAX(CASE WHEN month = '11' THEN target ELSE NULL END ) AS m11Target,
MAX(CASE WHEN month = '12' THEN target ELSE NULL END ) AS m12Target
FROM BS_ENERGY_TARGET
<where>
<if test="year!=null">
and YEAR = #{year}
</if>
<if test="month!=null">
and MONTH = #{month}
</if>
<if test="quarter!=null">
and QUARTER = #{quarter}
</if>
is_deleted = 0
<if test="type!=null">
and TYPE = #{type}
and type = #{type}
</if>
<if test="isDeleted!=null">
and IS_DELETED = #{isDeleted}
<if test="year!=null">
and year = #{year}
</if>
</where>
GROUP BY year, TYPE
ORDER BY year DESC
</select>
</mapper>

@ -25,10 +25,15 @@
*/
package org.springblade.desk.energy.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 能耗目标表 视图实体类
@ -39,16 +44,102 @@ import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
public class BsEnergyTargetVO extends BsEnergyTargetEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 排序字段
*/
private String orderByField;
/**
* true: 升序false: 降序
*/
private boolean isAsc;
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "1月")
private BigDecimal m01Target;
@Schema(description = "2月")
private BigDecimal m02Target;
@Schema(description = "3月")
private BigDecimal m03Target;
@Schema(description = "4月")
private BigDecimal m04Target;
@Schema(description = "5月")
private BigDecimal m05Target;
@Schema(description = "6月")
private BigDecimal m06Target;
@Schema(description = "7月")
private BigDecimal m07Target;
@Schema(description = "8月")
private BigDecimal m08Target;
@Schema(description = "9月")
private BigDecimal m09Target;
@Schema(description = "10月")
private BigDecimal m10Target;
@Schema(description = "11月")
private BigDecimal m11Target;
@Schema(description = "12月")
private BigDecimal m12Target;
/**
* 排序字段
*/
private String orderByField;
/**
* true: 升序false: 降序
*/
private boolean isAsc;
public List<BsEnergyTargetEntity> parseEntities() {
List<BsEnergyTargetEntity> list = new ArrayList<>();
if (m01Target != null) {
list.add(buildEntity("01", m01Target));
}
if (m02Target != null) {
list.add(buildEntity("02", m02Target));
}
if (m03Target != null) {
list.add(buildEntity("03", m03Target));
}
if (m04Target != null) {
list.add(buildEntity("04", m04Target));
}
if (m05Target != null) {
list.add(buildEntity("05", m05Target));
}
if (m06Target != null) {
list.add(buildEntity("06", m06Target));
}
if (m07Target != null) {
list.add(buildEntity("07", m07Target));
}
if (m08Target != null) {
list.add(buildEntity("08", m08Target));
}
if (m09Target != null) {
list.add(buildEntity("09", m09Target));
}
if (m10Target != null) {
list.add(buildEntity("10", m10Target));
}
if (m11Target != null) {
list.add(buildEntity("11", m11Target));
}
if (m12Target != null) {
list.add(buildEntity("12", m12Target));
}
return list;
}
private BsEnergyTargetEntity buildEntity(String month, BigDecimal target) {
BsEnergyTargetEntity entity = new BsEnergyTargetEntity();
entity.setYear(super.getYear());
entity.setMonth(month);
entity.setTarget(target);
entity.setType(super.getType());
return entity;
}
}

@ -25,16 +25,14 @@
*/
package org.springblade.desk.energy.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.springblade.core.tool.api.R;
import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity;
import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO;
import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* 能耗目标表 服务类
@ -52,36 +50,20 @@ public interface IBsEnergyTargetService extends BaseService<BsEnergyTargetEntity
*/
IPage<BsEnergyTargetVO> selectBsEnergyTargetPage(IPage<BsEnergyTargetVO> page, BsEnergyTargetVO bsEnergyTarget);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<BsEnergyTargetExcel>
*/
List<BsEnergyTargetWaterExcel> exportBsEnergyTarget(Wrapper<BsEnergyTargetEntity> queryWrapper);
/**
* 根据月份获取用水目标
* 自定义查询
*
* @param month 月份
* @return 用水目标
*/
BigDecimal getWaterTargetByMonth(String month);
/**
* 根据月份获取用电目标
*
* @param month 月份
* @return 用电目标
* @param bsEnergyTarget
* @return
*/
BigDecimal getElectricTargetByMonth(String month);
List<BsEnergyTargetVO> selectBsEnergyTargetList(BsEnergyTargetVO bsEnergyTarget);
/**
* 根据条件查询列表
* 数据导入
*
* @param conMap
* @param file
* @param type
* @return
*/
List<BsEnergyTargetEntity> listByMap(Map<String, Object> conMap);
R importExcelData(MultipartFile file, String type);
}

@ -26,20 +26,24 @@
package org.springblade.desk.energy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springblade.desk.dashboard.utils.DateUtils;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.energy.excel.BsEnergyTargetExcel;
import org.springblade.desk.energy.pojo.entity.BsEnergyTargetEntity;
import org.springblade.desk.energy.pojo.vo.BsEnergyTargetVO;
import org.springblade.desk.energy.excel.BsEnergyTargetWaterExcel;
import org.springblade.desk.energy.mapper.BsEnergyTargetMapper;
import org.springblade.desk.energy.service.IBsEnergyTargetService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 能耗目标表 服务实现类
@ -50,46 +54,49 @@ import java.util.Map;
@Service
public class BsEnergyTargetServiceImpl extends BaseServiceImpl<BsEnergyTargetMapper, BsEnergyTargetEntity> implements IBsEnergyTargetService {
@Override
public IPage<BsEnergyTargetVO> selectBsEnergyTargetPage(IPage<BsEnergyTargetVO> page, BsEnergyTargetVO bsEnergyTarget) {
return page.setRecords(baseMapper.selectBsEnergyTargetPage(page, bsEnergyTarget));
}
@Override
public IPage<BsEnergyTargetVO> selectBsEnergyTargetPage(IPage<BsEnergyTargetVO> page, BsEnergyTargetVO bsEnergyTarget) {
return page.setRecords(baseMapper.selectBsEnergyTargetPage(page, bsEnergyTarget));
}
@Override
public List<BsEnergyTargetVO> selectBsEnergyTargetList(BsEnergyTargetVO bsEnergyTarget) {
return baseMapper.selectBsEnergyTargetList(bsEnergyTarget);
}
@Override
public List<BsEnergyTargetWaterExcel> exportBsEnergyTarget(Wrapper<BsEnergyTargetEntity> queryWrapper) {
List<BsEnergyTargetWaterExcel> bsEnergyTargetList = baseMapper.exportBsEnergyTarget(queryWrapper);
//bsEnergyTargetList.forEach(bsEnergyTarget -> {
// bsEnergyTarget.setTypeName(DictCache.getValue(DictEnum.YES_NO, BsEnergyTarget.getType()));
//});
return bsEnergyTargetList;
}
@Override
public R importExcelData(MultipartFile file, String type) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<BsEnergyTargetExcel> importList = ExcelUtil.read(
file, 0, 1, BsEnergyTargetExcel.class
);
List<BsEnergyTargetVO> voList = importList.stream()
.map(excel -> {
BsEnergyTargetVO vo = new BsEnergyTargetVO();
BeanUtils.copyProperties(excel, vo);
vo.setType(type);
return vo;
})
.collect(Collectors.toList());
List<String> years = importList.stream().map(BsEnergyTargetExcel::getYear).collect(Collectors.toList());
List<BsEnergyTargetEntity> existList = this.list(new LambdaQueryWrapper<BsEnergyTargetEntity>().in(BsEnergyTargetEntity::getYear, years).eq(BsEnergyTargetEntity::getType, type));
Map<String, Long> existMap = existList.stream().collect(Collectors.toMap(e -> e.getYear() + "-" + e.getMonth() + "-" + e.getType(), BsEnergyTargetEntity::getId, (oldValue, newValue) -> oldValue));
List<BsEnergyTargetEntity> saves = new ArrayList<>();
for (BsEnergyTargetVO bsEnergyTargetVO : voList) {
List<BsEnergyTargetEntity> bsEnergyTargetEntities = bsEnergyTargetVO.parseEntities();
for (BsEnergyTargetEntity bsEnergyTarget : bsEnergyTargetEntities) {
String key = bsEnergyTarget.getYear() + "-" + bsEnergyTarget.getMonth() + "-" + bsEnergyTarget.getType();
if (existMap.containsKey(key)) {
bsEnergyTarget.setId(existMap.get(key));
}
}
saves.addAll(bsEnergyTargetEntities);
}
return R.status(this.saveOrUpdateBatch(saves));
}
@Override
public BigDecimal getWaterTargetByMonth(String month) {
BsEnergyTargetEntity energyTargetEntity = this.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>()
.eq(BsEnergyTargetEntity::getMonth, month));
if(energyTargetEntity != null){
return energyTargetEntity.getTarget();
}
return new BigDecimal(0);
}
@Override
public BigDecimal getElectricTargetByMonth(String month) {
String year = month.substring(0, 4);
int quarter = DateUtils.getQuarter(Integer.parseInt(month.substring(5, 7)));
BsEnergyTargetEntity energyTargetEntity = this.getOne(new LambdaQueryWrapper<BsEnergyTargetEntity>()
.eq(BsEnergyTargetEntity::getYear, year)
.eq(BsEnergyTargetEntity::getQuarter, quarter));
if (energyTargetEntity != null) {
return energyTargetEntity.getTarget();
}
return new BigDecimal(0);
}
@Override
public List<BsEnergyTargetEntity> listByMap(Map<String, Object> conMap){
return baseMapper.listByMap(conMap);
}
}

@ -2006,11 +2006,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
private boolean ruleTieredPricing(StatementVO statementVO, PriceSheetVO priceSheet) {
//匹配阶梯价
// 非阶梯价直接返回
if ("1".equals(priceSheet.getStairflag())) {
if ("1".equals(priceSheet.getStairflagkey())) {
return true;
}
// 单批阶梯价(按件数)
else if ("4".equals(priceSheet.getStairflag())) {
else if ("4".equals(priceSheet.getStairflagkey())) {
try {
double makeQty = statementVO.getMakeQty().doubleValue();
double lower = Double.parseDouble(priceSheet.getLower());
@ -2021,7 +2021,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
}
// 单批阶梯价(按单件面积)
else if ("5".equals(priceSheet.getStairflag())) {
else if ("5".equals(priceSheet.getStairflagkey())) {
try {
double ypArea = statementVO.getYpArea().doubleValue();
double lower = Double.parseDouble(priceSheet.getLower());
@ -2032,7 +2032,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
}
// 单批阶梯价(按单批面积)
else if ("6".equals(priceSheet.getStairflag())) {
else if ("6".equals(priceSheet.getStairflagkey())) {
try {
double totalArea = statementVO.getTotalArea().doubleValue();
double lower = Double.parseDouble(priceSheet.getLower());

@ -25,6 +25,9 @@ import org.springblade.desk.basic.pojo.entity.WorkCenter;
import org.springblade.desk.basic.service.ILocallyPlatedPartService;
import org.springblade.desk.basic.service.IQualityGradeService;
import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.desk.common.constant.BizTypeConstant;
import org.springblade.desk.common.feign.IMesNotifyMessageClient;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity;
import org.springblade.desk.dashboard.constant.DsCraftConstant;
import org.springblade.desk.dashboard.constant.DsPartConstant;
import org.springblade.desk.dashboard.pojo.entity.*;
@ -130,6 +133,10 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
@Autowired
private ILocallyPlatedPartService locallyPlatedPartService;
@Autowired
private IMesNotifyMessageClient mesNotifyMessageClient;
@Value("${business.oldMes.url}")
private String oldMesUrl;
@Value("${business.oldMes.syncOrderList}")
@ -1086,6 +1093,19 @@ public class YieldOrderServiceImpl extends BaseServiceImpl<YieldOrderMapper, Yie
// 订单接收
this.confirm(yieldOrder.getCardNo(), "0");
}
try {
// 给烧结工艺员发消息提醒
if ("21E6-575-10418_001-B1".equals(yieldOrder.getPartCode()) || "21E6-575-10116_001-E30-N".equals(yieldOrder.getPartCode())) {
MesNotifyMessageEntity mesNotifyMessageEntity = new MesNotifyMessageEntity();
mesNotifyMessageEntity.setBizType(BizTypeConstant.SET_SUITE_FLOW);
mesNotifyMessageEntity.setTitle("烧结齐套流转通知");
mesNotifyMessageEntity.setContent("零件【" + yieldOrder.getPartCode() + "】已齐套流转,请及时处理");
mesNotifyMessageEntity.setReceiveRoleName("烧结-工艺员");
mesNotifyMessageClient.save(mesNotifyMessageEntity);
}
} catch (Exception e) {
log.error("齐套流转消息发送失败:{}" + e.getMessage());
}
return b;
}

@ -34,7 +34,9 @@
mwo.ID woId,
mwo.YO_ID yoId,
mwo.TS_ID tsId,
bts.TS_NAME mainTsName,
mwo.OC_ID ocId,
bo.OC_NAME mainOcName,
mwp.MAKE_TEAM makeTeam,
mwp.OC_ID ppsOcId,
bpe.NAME ppsName,
@ -66,16 +68,24 @@
mwo.INVENTORY_QTY inventoryQty,
mwo.MAKE_QTY - mwo.INVENTORY_QTY notInQty,
nmwp.PPS_ID ppsIdNext,
nbpe.NAME ppsNameNext,
umwp.PPS_ID ppsIdUp,
ubpe.NAME ppsNameUp,
nmwp.MAKE_TEAM makeTeamNext,
mwo.PICKING_STATUS pickingStatus,
myo.RECEIVE_USER receiveUser,
mwo.COLLABORATE collaborate,
mwo.MEMO memo
FROM MES_WORK_ORDER mwo
LEFT JOIN MES_YIELD_ORDER myo ON mwo.YO_ID = myo.ID
INNER JOIN MES_YIELD_ORDER myo ON mwo.YO_ID = myo.ID
LEFT JOIN MES_WORK_PLAN mwp ON mwo.WP_ID = mwp.ID
LEFT JOIN MES_WORK_PLAN nmwp ON mwp.NEXT_WP_ID = nmwp.ID
LEFT JOIN MES_WORK_PLAN umwp ON mwp.FRONT_WP_ID = umwp.ID
LEFT JOIN BS_PROCESS_SET bpe ON mwp.PPS_ID = bpe.ID
LEFT JOIN BS_PROCESS_SET nbpe ON nmwp.PPS_ID = nbpe.ID
LEFT JOIN BS_PROCESS_SET ubpe ON umwp.PPS_ID = ubpe.ID
LEFT JOIN BS_TEAM_SET bts ON mwo.TS_ID = bts.ID
LEFT JOIN BS_OEM bo ON mwo.OC_ID = bo.ID
<where>
mwo.is_deleted = 0
<if test="workOrder.runStatus != null and workOrder.runStatus != ''">

@ -36,6 +36,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@ -348,7 +350,7 @@ public class MacToolUseServiceImpl extends BaseServiceImpl<MacToolUseMapper, Mac
@Override
public List<MacToolUse> listByNoFinished() {
return this.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getFinished, 0).orderByAsc(MacToolUse::getMtnCode));
return this.list(Wrappers.lambdaQuery(MacToolUse.class).eq(MacToolUse::getFinished, 0).ge(MacToolUse::getCreateTime, Date.from(LocalDateTime.now().minusDays(2).atZone(ZoneId.systemDefault()).toInstant())).orderByAsc(MacToolUse::getMtnCode));
}
private Double setMaxHeat(Map<String, JSONObject> eUMap, JSONObject jsonObject, Double heat) {

@ -61,6 +61,7 @@ import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.Dict;
import org.springblade.system.pojo.entity.User;
import org.springblade.system.pojo.enums.DictEnum;
import org.springblade.wms.feign.WmsTaskClient;
import org.springblade.wms.pojo.entity.StClassRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -128,6 +129,9 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
private final IBsSafePatrolInspectionService inspectionService;
private final IBsEpciuPatrolInspectionService bsEpciuPatrolInspectionService;
private final IBsDosingRecService bsDosingRecService;
@Resource
private WmsTaskClient wmsTaskClient;
@Override
@Transactional(rollbackFor = Exception.class)
public void bindingCard(DeviceBindDTO deviceBindDTO) {
@ -661,6 +665,14 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
if (newPartVersion == null) {
throw new ServiceException("零件【" + rr.getPrtno() + "】的版本不存在!");
}
// 查询原订单
WorkOrder wo = workOrderService.getWorkOrderUniqueRec(rr.getPrtno(), rr.getSplcode(), rr.getSono());
if (wo == null) {
wo = workOrderService.getWorkOrderUniqueRec(rr.getPrtno(), rr.getSplcode(), null);
}
if (wo != null) {
yieldOrder.setOldYoId(wo.getYoId());
}
yieldOrder.setPartVersion(newPartVersion.getPartVersion());
yieldOrder.setRank("2");
yieldOrder.setBatchNo(batchNo);
@ -1083,8 +1095,8 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
@Override
public void saveSubOrder(SaveSubOrderVo subOrder) {
Long wpId = subOrder.getWpId();
// Long shId = subOrder.getWpId();
// Long cslId = subOrder.getWpId();
Long shId = subOrder.getWpId();
Long cslId = subOrder.getWpId();
if (wpId == null) {
throw new ServiceException("参数异常!");
}
@ -1108,8 +1120,12 @@ public class PdaSaveServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlan
}
Date nowDate = new Date();
//进行入库
// stRealtimeStockWebService.saveSubOrderWarehousing(yo.getPartCode(), wo.getBatchNo(), wo.getMakeQty(), shId, cslId, nowDate, AuthUtil.getUserId());
try {
//进行入库
wmsTaskClient.saveSubOrderWarehousing(yo.getPartCode(), wo.getBatchNo(), wo.getMakeQty(), shId, cslId, nowDate, AuthUtil.getUserId());
} catch (Exception e) {
log.error("子件入库调用失败:{}", e.getMessage());
}
//当前工序完工
wp.setFactEndTime(nowDate);
wp.setStatus(WorkPlan.STATUS_COMPLETE);

@ -1741,6 +1741,13 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanItemDetail workPlanItemDetail;
List<InspectionItem> inspectionItems = inspectionService.list();
for (DsProcessProjectVO project : projects) {
// 如果是耐蚀性检测,需要满足三个条件才允许生产对应的检测项目:1-工作订单备注包含HTBY,2-生产标识包含JHT,3-镀种含金或者Au
if ("耐蚀性检测".equals(project.getProjectName())) {
if (!yieldOrder.getYpMemo().contains("HTBY") || !yieldOrder.getProductIdent().contains("JHT") ||
!(yieldOrder.getPlate().contains("金") || yieldOrder.getPlate().contains("Au") || yieldOrder.getPlate().contains("au"))) {
continue;
}
}
workPlanItem = new WorkPlanItem();
workPlanItem.setWpId(workPlan.getId());
workPlanItem.setItemCode(project.getTrialNo());
@ -2063,6 +2070,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
if (!WorkPlan.STATUS_START.equals(wp.getStatus())) {
throw new ServiceException("当前工序已报工完成!");
}
if (StringUtils.isNotBlank(wp.getTeamMembers()) && !AuthUtil.getUserName().contains(wp.getTeamMembers())) {
throw new ServiceException("当前报工人与工序计划人不符,不可提交!");
}
MacToolUse mtu;
BsProcessSetEntity dsProcess = bsProcessSetService.getById(wp.getPpsId());
WorkPlan frontWp = workPlanService.getById(wp.getFrontWpId());
@ -2178,7 +2188,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
YieldOrder yieldOrder = yieldOrderService.getById(workOrder.getYoId());
if (yieldOrder.getFatherYoId() != null) {
YieldOrder fatherYieldOrder = yieldOrderService.getById(yieldOrder.getFatherYoId());
// 玻璃封接退火
// 玻璃封接退火工序调用玻璃饼出库
if (yieldOrder.getYieldType() == YieldOrderEnum.YIELD_TYPE_4.getCode() && 63 == wp.getPpsId()) {
StGlassCakeOutDTO stGlassCakeOutDTO = new StGlassCakeOutDTO();
stGlassCakeOutDTO.setYoCode(fatherYieldOrder.getYoCode());

@ -31,10 +31,10 @@
AND a.remark LIKE concat(concat('%', #{query.memo}),'%')
</if>
<if test="query.inDateStart != null and query.inDateStart != ''">
AND to_date(#{query.inDateStart},'YYYY-MM-DD HH24:MI:SS'), <![CDATA[ >= ]]> a.startdat
AND to_date(${query.inDateStart},'YYYY-MM-DD'), <![CDATA[ >= ]]> a.startdat
</if>
<if test="query.inDateEnd != null and query.inDateEnd != ''">
AND to_date(#{query.inDateEnd},'YYYY-MM-DD HH24:MI:SS'), <![CDATA[ <= ]]> a.validdat
AND to_date(${query.inDateEnd},'YYYY-MM-DD'), <![CDATA[ <= ]]> a.validdat
</if>
<if test="query.validflags != null and query.validflags != ''">
AND a.validflag IN

@ -0,0 +1,234 @@
package org.springblade.wms.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.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.secure.annotation.IsAdmin;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.wms.excel.StGraphiteMoldOutExcel;
import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import org.springblade.wms.pojo.vo.StStockInoutRecordVO;
import org.springblade.wms.service.IStGraphiteMoldOutService;
import org.springblade.wms.service.IStStockInoutRecordService;
import org.springblade.wms.wrapper.StGraphiteMoldOutWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutController
* @description: 石墨模出库 控制器
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@RestController
@AllArgsConstructor
@RequestMapping("/stGraphiteMoldOut")
@Tag(name = "石墨模出库", description = "石墨模出库接口")
public class StGraphiteMoldOutController extends BladeController {
private final IStGraphiteMoldOutService stGraphiteMoldOutService;
private final IStStockInoutRecordService stStockInoutRecordService;
/**
* 石墨模出库 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@ApiLog("石墨模出库 详情")
@Operation(summary = "详情", description = "传入stGraphiteMoldOut")
public R<StGraphiteMoldOutVO> detail(StGraphiteMoldOut stGraphiteMoldOut) {
StGraphiteMoldOut detail = stGraphiteMoldOutService.getOne(Condition.getQueryWrapper(stGraphiteMoldOut));
return R.data(StGraphiteMoldOutWrapper.build().entityVO(detail));
}
/**
* 石墨模出库 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@ApiLog("石墨模出库 分页")
@Operation(summary = "分页", description = "传入stGraphiteMoldOut")
public R<IPage<StGraphiteMoldOutVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> stGraphiteMoldOut, Query query) {
IPage<StGraphiteMoldOut> pages = stGraphiteMoldOutService.page(Condition.getPage(query), Condition.getQueryWrapper(stGraphiteMoldOut, StGraphiteMoldOut.class));
return R.data(StGraphiteMoldOutWrapper.build().pageVO(pages));
}
/**
* 石墨模出库 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@ApiLog("石墨模出库 自定义分页")
@Operation(summary = "分页", description = "传入stGraphiteMoldOut")
public R<IPage<StGraphiteMoldOutVO>> page(StGraphiteMoldOutVO stGraphiteMoldOut, Query query) {
IPage<StGraphiteMoldOutVO> pages = stGraphiteMoldOutService.selectStGraphiteMoldOutPage(Condition.getPage(query), stGraphiteMoldOut);
return R.data(pages);
}
/**
* 石墨模出库 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@ApiLog("石墨模出库 新增")
@Operation(summary = "新增", description = "传入stGraphiteMoldOut")
public R save(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) {
return R.status(stGraphiteMoldOutService.save(stGraphiteMoldOut));
}
/**
* 石墨模出库 修改
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@ApiLog("石墨模出库 修改")
@Operation(summary = "修改", description = "传入stGraphiteMoldOut")
public R update(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) {
return R.status(stGraphiteMoldOutService.updateById(stGraphiteMoldOut));
}
/**
* 石墨模出库 新增或修改
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 6)
@ApiLog("石墨模出库 新增或修改")
@Operation(summary = "新增或修改", description = "传入stGraphiteMoldOut")
public R submit(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) {
return R.status(stGraphiteMoldOutService.saveOrUpdate(stGraphiteMoldOut));
}
/**
* 石墨模出库 删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 7)
@ApiLog("石墨模出库 删除")
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(stGraphiteMoldOutService.deleteLogic(Func.toLongList(ids)));
}
/**
* 石墨模出库 生成出库单号
*/
@GetMapping("/generateCode")
@ApiOperationSupport(order = 8)
@ApiLog("石墨模出库 生成出库单号")
@Operation(summary = "生成石墨模出库单号", description = "获取新单据号并返回空账单对象")
public R<StStockInoutRecordVO> generateCode() {
// 1. 生成单号
String sirCode = stStockInoutRecordService.generateCode();
// 2. 封装合表 VO
StStockInoutRecordVO vo = new StStockInoutRecordVO();
vo.setSirCode(sirCode);
vo.setCreateUser(AuthUtil.getUserId());
return R.data(vo);
}
/**
* 生成石墨模预出库单
*/
@PostMapping("/generateOrder")
@ApiOperationSupport(order = 9)
@ApiLog("生成石墨模预出库单")
@Operation(summary = "生成石墨模预出库单", description = "按物料编号+规格等条件查库存,库存充足生成预出库单,不足返回指定提示")
public R<List<StGraphiteMoldOut>> generatePreOutOrder(
@Parameter(description = "石墨模预出库信息", required = true)
@RequestBody StGraphiteMoldOutDTO dto
) {
return R.data(stGraphiteMoldOutService.generatePreOutOrder(dto));
}
/**
* 批量生成石墨模预出库单
*/
@PostMapping("/batchGenerateOrder")
@ApiOperationSupport(order = 10)
@ApiLog("批量生成石墨模预出库单")
@Operation(summary = "批量生成石墨模预出库单", description = "批量传入石墨模信息,逐条校验库存,成功生成预出库单,失败收集提示信息(一条失败不影响其他)")
public R<Map<String, Object>> batchGeneratePreOutOrder(
@Parameter(description = "石墨模预出库信息集合", required = true)
@RequestBody List<StGraphiteMoldOutDTO> dtoList
) {
Map<String, Object> result = stGraphiteMoldOutService.batchGeneratePreOutOrder(dtoList);
return R.data(result);
}
/**
* 扫码查询/新增待出库数据
*/
@GetMapping("/scanCard")
@ApiOperationSupport(order = 11)
@ApiLog("扫码查询/新增待出库数据")
@Operation(summary = "扫码处理石墨模出库", description = "传入流程卡号,查询/新增待出库数据")
public R<List<StGraphiteMoldOut>> scanCard(
@Parameter(description = "流程卡号(扫码内容)", required = true) @RequestParam String cardNo) {
return R.data(stGraphiteMoldOutService.scanCardProcess(cardNo, AuthUtil.getUser()));
}
/**
* 编辑出库数量后 提交确认出库
*/
@PostMapping("/submitOutStock")
@ApiOperationSupport(order = 12)
@ApiLog("编辑出库数量后 提交确认出库")
@Operation(summary = "石墨模出库-提交确认出库", description = "填写出库数量后提交,写入出入库记录并扣减库存,变更为已出库状态")
public R<StGraphiteMoldOut> submitOutStock(@RequestBody StGraphiteMoldOut stGraphiteMoldOut) {
BladeUser user = AuthUtil.getUser();
StGraphiteMoldOut result = stGraphiteMoldOutService.submitOutStock(stGraphiteMoldOut, user);
return R.data(result);
}
/**
* 编辑出库数量后 批量出库
*/
@PostMapping("/batchSubmitOutStock")
@ApiOperationSupport(order = 13)
@ApiLog("编辑出库数量后 批量出库")
@Operation(summary = "石墨模出库-提交确认出库", description = "填写出库数量后提交,写入出入库记录并扣减库存,变更为已出库状态")
public R<List<StGraphiteMoldOut>> batchSubmitOutStock(@RequestBody List<StGraphiteMoldOut> paramList) {
BladeUser user = AuthUtil.getUser();
List<StGraphiteMoldOut> result = stGraphiteMoldOutService.batchSubmitOutStock(paramList, user);
return R.data(result);
}
/**
* 导出数据
*/
@IsAdmin
@GetMapping("/export-stGraphiteMoldOut")
@ApiOperationSupport(order = 14)
@ApiLog("导出数据")
@Operation(summary = "导出数据", description = "传入stGraphiteMoldOut")
public void exportStGraphiteMoldOut(@Parameter(hidden = true) @RequestParam Map<String, Object> stGraphiteMoldOut, BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<StGraphiteMoldOut> queryWrapper = Condition.getQueryWrapper(stGraphiteMoldOut, StGraphiteMoldOut.class);
List<StGraphiteMoldOutExcel> list = stGraphiteMoldOutService.exportStGraphiteMoldOut(queryWrapper);
ExcelUtil.export(response, "石墨模出库数据" + DateUtil.time(), "石墨模出库数据表", list, StGraphiteMoldOutExcel.class);
}
}

@ -0,0 +1,164 @@
package org.springblade.wms.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutExcel
* @description: 石墨模出库 Excel实体类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class StGraphiteMoldOutExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ColumnWidth(20)
@ExcelProperty("主键")
private Long id;
/**
* 租户ID
*/
@ColumnWidth(20)
@ExcelProperty("租户ID")
private String tenantId;
/**
* 是否已删除
*/
@ColumnWidth(20)
@ExcelProperty("是否已删除")
private Long isDeleted;
/**
* 出库凭证信息
*/
@ColumnWidth(20)
@ExcelProperty("出库凭证信息")
private Long sirId;
/**
* 车间订单号
*/
@ColumnWidth(20)
@ExcelProperty("车间订单号")
private String woCode;
/**
* 生产单号
*/
@ColumnWidth(20)
@ExcelProperty("生产单号")
private String yoCode;
/**
* 零件号
*/
@ColumnWidth(20)
@ExcelProperty("零件号")
private String partCode;
/**
* 零件名称
*/
@ColumnWidth(20)
@ExcelProperty("零件名称")
private String partName;
/**
* 批次号
*/
@ColumnWidth(20)
@ExcelProperty("批次号")
private String piNo;
/**
* 流程卡号
*/
@ColumnWidth(20)
@ExcelProperty("流程卡号")
private String cardNo;
/**
* 物料需求量
*/
@ColumnWidth(20)
@ExcelProperty("物料需求量")
private Double needQuantity;
/**
* 已出库数量
*/
@ColumnWidth(20)
@ExcelProperty("已出库数量")
private Double outedQuantity;
/**
* 状态
*/
@ColumnWidth(20)
@ExcelProperty("状态")
private Long curStatus;
/**
* 出库时间
*/
@ColumnWidth(20)
@ExcelProperty("出库时间")
private Date outTime;
/**
* 出库人
*/
@ColumnWidth(20)
@ExcelProperty("出库人")
private Long outUser;
/**
* 物料ID
*/
@ColumnWidth(20)
@ExcelProperty("物料ID")
private Long goodsId;
/**
* 库位ID
*/
@ColumnWidth(20)
@ExcelProperty("库位ID")
private Long slId;
/**
* 库房ID
*/
@ColumnWidth(20)
@ExcelProperty("库房ID")
private Long shId;
/**
* 库存ID
*/
@ColumnWidth(20)
@ExcelProperty("库存ID")
private Long rlsId;
/**
* 出库单号
*/
@ColumnWidth(20)
@ExcelProperty("出库单号")
private String outCode;
/**
* 备注
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String memo;
/**
* 领料人ID
*/
@ColumnWidth(20)
@ExcelProperty("领料人ID")
private Long picker;
}

@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.wms.service.IStBuyOrderService;
import org.springblade.wms.service.IStGoodsExtService;
import org.springblade.wms.service.IStOtherReceiptRecordService;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@ -29,6 +30,8 @@ public class WmsTaskClientImpl implements WmsTaskClient{
private final IStBuyOrderService stBuyOrderService;
private final IStOtherReceiptRecordService stOtherReceiptRecordService;
@Override
public boolean executeGoodsStatusUpdate() {
stGoodsExtService.executeGoodsStatusUpdate();
@ -39,4 +42,9 @@ public class WmsTaskClientImpl implements WmsTaskClient{
public Long buyOrderApply(String goodsCode, Double buyQty, Long userId, Date buyDate, Long checkUserId, Date checkDate) throws Exception {
return stBuyOrderService.buyOrderApplyFor(goodsCode, buyQty, userId, buyDate, checkUserId, checkDate);
}
@Override
public void saveSubOrderWarehousing(String goodsCode, String batchNo, Double quantity, Long shId, Long slId, Date date, Long userId) throws Exception {
stOtherReceiptRecordService.saveSubOrderWarehousing(goodsCode, batchNo, quantity, shId, slId, date, userId);
}
}

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.wms.excel.StGlassCakeOutExcel;
@ -53,5 +54,7 @@ public interface StGlassCakeOutMapper extends BaseMapper<StGlassCakeOut> {
YieldOrder getByYieldOrder(String yoCode);
List<YieldOrder> getYieldOrderList(Long id, String yieldType);
DsPartRelationEntity getPartQuota(String partCode, String goodsCode);
}

@ -225,4 +225,10 @@
AND YIELD_TYPE = #{yieldType}
</select>
<select id="getPartQuota" resultType="org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity">
select * from DS_PART_RELATION where is_deleted = 0
and PART_CODE = #{partCode}
and CHILD_PART_CODE = #{subCode}
</select>
</mapper>

@ -43,5 +43,9 @@ public interface StGoodsExtMapper extends BaseMapper<StGoodsExt> {
IPage<StGoodsExtVO> selectGoodsExtWithGoods(IPage<StGoodsExtVO> page, @Param("ew") QueryWrapper<StGoodsExt> queryWrapper);
StGoodsExt getGoodsExt(Double invqty1j, Double planqty, Long goodsId);
StGoodsExt selectWithAvgMonth(Long goodsId);
Double getPlanQty(Long goodsId);
}

@ -118,5 +118,37 @@
SELECT * FROM ST_GOODS_EXT ${ew.customSqlSegment}
</select>
<select id="selectWithAvgMonth" resultType="org.springblade.wms.pojo.vo.StGoodsExtVO">
SELECT
g.id AS goodsId,
g.goods_code AS goodsCode,
-- 90天内出库总数量
NVL(SUM(s.quantity), 0) AS totalOutQuantity,
-- 月均出库数量 = 总出库 / 3
ROUND(NVL(SUM(s.quantity), 0) / 3, 2) AS useAverage
FROM ST_STOCK_INOUT_RECORD s
-- 关联物料表
LEFT JOIN st_goods g ON s.goods_id = g.id
-- 条件:只查 出库 + 近90天
WHERE s.IN_OUT_TYPE = 1
AND s.create_time >= SYSDATE - 90
AND s.is_deleted = 0
AND s.goods_id = #{goodsId}
-- 按物料分组
GROUP BY g.id, g.goods_code
</select>
<select id="getPlanQty" resultType="java.lang.Double">
SELECT NVL(SUM(sur_draw_qty), 0) AS planQty
FROM ST_BUY_ORDER
WHERE goods_id = #{goodsId}
AND is_deleted = 0
</select>
</mapper>

@ -0,0 +1,52 @@
package org.springblade.wms.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.wms.excel.StGraphiteMoldOutExcel;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import java.util.List;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutMapper
* @description: 石墨模出库 Mapper 接口
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
public interface StGraphiteMoldOutMapper extends BaseMapper<StGraphiteMoldOut> {
/**
* 自定义分页
*
* @param page 分页参数
* @param stGraphiteMoldOut 查询参数
* @return List<StGraphiteMoldOutVO>
*/
List<StGraphiteMoldOutVO> selectStGraphiteMoldOutPage(IPage page, StGraphiteMoldOutVO stGraphiteMoldOut);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<StGraphiteMoldOutExcel>
*/
List<StGraphiteMoldOutExcel> exportStGraphiteMoldOut(@Param("ew") Wrapper<StGraphiteMoldOut> queryWrapper);
StGraphiteMoldOut getBySirId(Long sirId);
WorkOrder getByWoCode(String cardNo);
YieldOrder getByYoCode(String cardNo);
YieldOrder getByYieldOrder(String yoCode);
List<YieldOrder> getYieldOrderList(Long id, String yieldType);
}

@ -0,0 +1,116 @@
<?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.wms.mapper.StGraphiteMoldOutMapper">
<!-- 通用查询映射结果 -->
<resultMap id="stGraphiteMoldOutResultMap" type="org.springblade.wms.pojo.entity.StGraphiteMoldOut">
<result column="ID" property="id"/>
<result column="TENANT_ID" property="tenantId"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="STATUS" property="status"/>
<result column="IS_DELETED" property="isDeleted"/>
<result column="SIR_ID" property="sirId"/>
<result column="YO_CODE" property="yoCode"/>
<result column="PI_NO" property="piNo"/>
<result column="CARD_NO" property="cardNo"/>
<result column="NEED_QUANTITY" property="needQuantity"/>
<result column="OUTED_QUANTITY" property="outedQuantity"/>
<result column="CUR_STATUS" property="curStatus"/>
<result column="OUT_TIME" property="outTime"/>
<result column="OUT_USER" property="outUser"/>
<result column="GOODS_ID" property="goodsId"/>
<result column="SL_ID" property="slId"/>
<result column="SH_ID" property="shId"/>
<result column="RLS_ID" property="rlsId"/>
<result column="OUT_CODE" property="outCode"/>
</resultMap>
<select id="selectStGraphiteMoldOutPage" resultType="org.springblade.wms.pojo.vo.StGraphiteMoldOutVO">
SELECT
gmo.id, gmo.create_user, gmo.create_time,
gmo.sir_id, gmo.yo_code, gmo.pi_no,
gmo.card_no, gmo.need_quantity, gmo.outed_quantity,
gmo.cur_status, gmo.out_time, gmo.out_user, gmo.out_code, gmo.picker,
-- 物料表字段
g.goods_code,
g.id AS goodsId,
g.goods_name,
-- 库房名称
w.id AS shId,
w.sh_name,
-- 库位名称
lc.id AS slId,
lc.location,
-- 库存表字段
r.id AS rlsId,
COALESCE(r.quantity, 0) - COALESCE(r.occupy_quantity, 0) AS stockQty,
-- 用户名称
cu.name AS create_user_name,
ou.name AS out_user_name,
pk.name AS picker_name
FROM ST_GRAPHITE_MOLD_OUT gmo
LEFT JOIN ST_GOODS g ON gmo.goods_id = g.id AND g.is_deleted = 0
LEFT JOIN ST_STOREHOUSE w ON gmo.sh_id = w.id AND w.is_deleted = 0
LEFT JOIN ST_STORAGE_LOCATION lc ON gmo.sl_id = lc.id AND lc.is_deleted = 0
LEFT JOIN ST_REALTIME_STOCK r ON gmo.rls_id = r.id AND r.is_deleted = 0
LEFT JOIN BLADE_USER cu ON gmo.create_user = cu.id AND cu.is_deleted = 0
LEFT JOIN BLADE_USER ou ON gmo.out_user = ou.id AND ou.is_deleted = 0
LEFT JOIN BLADE_USER pk ON gmo.picker = pk.id AND pk.is_deleted = 0
WHERE gmo.is_deleted = 0
<if test="stGraphiteMoldOut.yoCode != null and stGraphiteMoldOut.yoCode != ''">
AND gmo.yo_code LIKE '%' || #{stGraphiteMoldOut.yoCode} || '%'
</if>
<if test="stGraphiteMoldOut.cardNo != null and stGraphiteMoldOut.cardNo != ''">
AND gmo.card_no LIKE '%' || #{stGraphiteMoldOut.cardNo} || '%'
</if>
<if test="stGraphiteMoldOut.goodsCode != null and stGraphiteMoldOut.goodsCode != ''">
AND g.goods_code LIKE '%' || #{stGraphiteMoldOut.goodsCode} || '%'
</if>
<if test="stGraphiteMoldOut.curStatus != null">
AND gmo.cur_status = #{stGraphiteMoldOut.curStatus}
</if>
ORDER BY gmo.create_time DESC
</select>
<select id="getBySirId" resultMap="stGraphiteMoldOutResultMap">
SELECT *
FROM ST_GRAPHITE_MOLD_OUT
WHERE SIR_ID = #{sirId}
AND ROWNUM = 1
</select>
<select id="exportStGraphiteMoldOut" resultType="org.springblade.wms.excel.StGraphiteMoldOutExcel">
SELECT * FROM ST_GRAPHITE_MOLD_OUT ${ew.customSqlSegment}
</select>
<select id="getByWoCode" resultType="org.springblade.desk.produce.pojo.entity.WorkOrder">
SELECT *
FROM MES_WORK_ORDER
WHERE card_no = #{cardNo}
</select>
<select id="getByYoCode" resultType="org.springblade.desk.order.pojo.entity.YieldOrder">
SELECT *
FROM MES_YIELD_ORDER
WHERE card_no = #{cardNo}
</select>
<select id="getByYieldOrder" resultType="org.springblade.desk.order.pojo.entity.YieldOrder">
SELECT *
FROM MES_YIELD_ORDER
WHERE YO_CODE = #{yoCode}
</select>
<select id="getYieldOrderList" resultType="org.springblade.desk.order.pojo.entity.YieldOrder">
SELECT *
FROM MES_YIELD_ORDER
WHERE FATHER_YO_ID = #{id}
AND YIELD_TYPE = #{yieldType}
</select>
</mapper>

@ -106,5 +106,9 @@ public interface StRealtimeStockMapper extends BaseMapper<StRealtimeStock> {
List<StStorehouseVO> findStorehouseByGoodsCode(String goodsCode);
StRealtimeStock getByGoodsCodeAndShIdAndSlId(String goodsCode, Long shId, Long slId);
// Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId);
StRealtimeStock selectMaxUsableStockByMoldAttr(String goodsCode);
}

@ -676,6 +676,20 @@
AND g.is_deleted = 0
</select>
<select id="selectMaxUsableStockByMoldAttr" resultType="org.springblade.wms.pojo.entity.StRealtimeStock">
SELECT *
FROM (
SELECT s.*
FROM st_realtime_stock s
LEFT JOIN st_goods g ON s.goods_id = g.id AND g.is_deleted = 0
WHERE g.goods_code = #{goodsCode}
AND s.is_deleted = 0
AND s.stop_use = 0
ORDER BY s.create_time ASC
)
WHERE ROWNUM = 1
</select>
<!-- <select id="queryByShIdAndSlId" resultType="java.lang.Object">-->
<!-- SELECT-->
<!-- a.ID,-->

@ -0,0 +1,51 @@
package org.springblade.wms.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.secure.BladeUser;
import org.springblade.wms.excel.StGraphiteMoldOutExcel;
import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName IStGraphiteMoldOutService
* @description: 石墨模出库 服务类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
public interface IStGraphiteMoldOutService extends BaseService<StGraphiteMoldOut> {
/**
* 自定义分页
*
* @param page 分页参数
* @param stGraphiteMoldOut 查询参数
* @return IPage<StGraphiteMoldOutVO>
*/
IPage<StGraphiteMoldOutVO> selectStGraphiteMoldOutPage(IPage<StGraphiteMoldOutVO> page, StGraphiteMoldOutVO stGraphiteMoldOut);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<StGraphiteMoldOutExcel>
*/
List<StGraphiteMoldOutExcel> exportStGraphiteMoldOut(Wrapper<StGraphiteMoldOut> queryWrapper);
List<StGraphiteMoldOut> scanCardProcess(String cardNo, BladeUser user);
StGraphiteMoldOut submitOutStock(StGraphiteMoldOut stGraphiteMoldOut, BladeUser user);
List<StGraphiteMoldOut> generatePreOutOrder(StGraphiteMoldOutDTO dto);
Map<String, Object> batchGeneratePreOutOrder(List<StGraphiteMoldOutDTO> dtoList);
List<StGraphiteMoldOut> batchSubmitOutStock(List<StGraphiteMoldOut> paramList, BladeUser user);
}

@ -10,6 +10,7 @@ import org.springblade.wms.pojo.entity.StOtherReceiptRecord;
import org.springblade.wms.pojo.entity.StStockInoutRecord;
import org.springblade.wms.pojo.vo.StOtherReceiptRecordVO;
import java.util.Date;
import java.util.List;
/**
@ -45,5 +46,8 @@ public interface IStOtherReceiptRecordService extends BaseService<StOtherReceipt
void otherWarehousing(StOtherReceiptRecord stOtherReceiptRecord, BladeUser user);
StStockInoutRecord getGlassCakeByWoCode(String woCode, String goodsCode);
void saveSubOrderWarehousing(String goodsCode, String batchNo, Double quantity, Long shId, Long slId, Date date, Long userId) throws Exception;
}

@ -108,5 +108,7 @@ public interface IStRealtimeStockService extends BaseService<StRealtimeStock> {
* @return
*/
StGoodStatisVO getGoodsByCode(String partCode);
// Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId);
}

@ -10,6 +10,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.desk.dashboard.feign.IPartClient;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.wms.excel.StGlassCakeOutExcel;
import org.springblade.wms.mapper.StGlassCakeOutMapper;
@ -163,7 +164,8 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
String materialNo = glassCake.getMaterial(); // 材料号
BigDecimal thickness = glassCake.getFormingThickness(); // 成型厚度
String goodsCode = glassCake.getPartCode();
// Double quota = glassCake.getQuota();
DsPartRelationEntity dsPartRelation = baseMapper.getPartQuota(faYieldOrder.getPartCode(), goodsCode);
// 空值校验:核心属性为空则无法匹配库存,直接跳过
if (goodsCode == null) {
@ -192,7 +194,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
// continue;
// }
Double requireQty = faYieldOrder.getYpQty()*glassCake.getQuota();
Double requireQty = faYieldOrder.getYpQty() * dsPartRelation.getQuota();
System.out.println("玻璃饼编码:" + goodsCode + ",总需求:" + requireQty);
// =====================【校验】总可用库存是否足够 =====================
@ -302,7 +304,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getWoCode());
lock.setWoNo(preOutStock.getCardNo());
// lock.setOccupyQuantity(preOutStock.getRequireQty());
// 锁本次扣的数量
lock.setOccupyQuantity(actualTake);
@ -546,7 +548,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
inoutRecord.setInOutReason("玻璃饼出库");
inoutRecord.setInOutDate(nowDate);
// 业务信息
inoutRecord.setWoCode(outEntity.getWoCode());
inoutRecord.setWoCode(outEntity.getCardNo());
inoutRecord.setUserId(userId);
// 租户/创建人基础字段(继承TenantEntity)
inoutRecord.setUserId(param.getPicker());

@ -99,9 +99,12 @@ public class StGoodsExtServiceImpl extends BaseServiceImpl<StGoodsExtMapper, StG
continue;
}
StGoodsExt goodsExt = baseMapper.getGoodsExt(vo.getInvqty1j(),vo.getPlanqty(),goodsId);
StGoodsExt goodsAvg = baseMapper.selectWithAvgMonth(goodsId);
Double planQty = baseMapper.getPlanQty(goodsId);
ext.setFirstStore(vo.getInvqty1j());
ext.setLastStore(goodsExt.getLastStore());
ext.setPlanQty(vo.getPlanqty());
ext.setUseAverage(goodsAvg.getUseAverage());
ext.setPlanQty(planQty);
ext.setGoodsStatus(goodsExt.getGoodsStatus());
// ext.setUpdateTime(new Date());
// ext.setUpdateUser(AuthUtil.getUserId());

@ -71,35 +71,7 @@ public class StGoodsServiceImpl extends BaseServiceImpl<StGoodsMapper, StGoods>
public StGoods saveGoodsInfo(List<String> prtnoList) throws Exception {
StGoods goods = null;
//查询物料信息
// List<StPdmPartDTO> pdmPartInfo = stHttpRequestService.getPdmPartInfo(prtnoList);
List<StPdmPartDTO> pdmPartInfo = new ArrayList<>();
StPdmPartDTO dto1 = new StPdmPartDTO();
dto1.setPrtno("TEST-MAT-001");
dto1.setReleaseno("V1.0");
dto1.setDrwpartno("DWG-TEST-001");
dto1.setPrtdesc("测试物料_环规");
dto1.setMtlsgrt(7.85);
dto1.setPrttype("PART");
dto1.setSource("自制");
dto1.setMtlspcf("45#钢");
dto1.setPrtum("PCS");
dto1.setCavityno("1");
dto1.setCplb("机械部件");
dto1.setEcnno("ECN-TEST-001");
dto1.setEnditem((short) 123);
dto1.setMtltmrk("45#钢");
dto1.setPartLink("/pdm/part/TEST-MAT-001");
dto1.setPriority("1");
dto1.setPrtrevedit("Released");
dto1.setPrtstd("GB/T 1234-2020");
dto1.setPrtwt(0.5);
dto1.setRemark("测试物料");
dto1.setTrademark("测试");
dto1.setRcdchgdatd(new Date());
pdmPartInfo.add(dto1);
List<StPdmPartDTO> pdmPartInfo = stHttpRequestService.getPdmPartInfo(prtnoList);
log.debug("pdmPartInfo:{}", pdmPartInfo);
if (CollectionUtils.isEmpty(pdmPartInfo)) {

@ -0,0 +1,345 @@
package org.springblade.wms.service.impl;
import cn.hutool.core.util.IdUtil;
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 org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.wms.excel.StGraphiteMoldOutExcel;
import org.springblade.wms.mapper.StGraphiteMoldOutMapper;
import org.springblade.wms.mapper.StRealtimeStockMapper;
import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO;
import org.springblade.wms.pojo.entity.*;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import org.springblade.wms.service.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutServiceImpl
* @description: 石墨模出库 服务实现类
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
@Service
public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMoldOutMapper, StGraphiteMoldOut> implements IStGraphiteMoldOutService {
@Resource
StRealtimeStockMapper stRealtimeStockMapper;
@Resource
IStStockInoutRecordService stStockInoutRecordService;
@Resource
IStRealtimeStockService stRealtimeStockService;
@Resource
IStGoodsService stGoodsService;
@Resource
IStStorehouseService stStorehouseService;
@Resource
IStStorageLocationService stStorageLocationService;
@Override
public IPage<StGraphiteMoldOutVO> selectStGraphiteMoldOutPage(IPage<StGraphiteMoldOutVO> page, StGraphiteMoldOutVO stGraphiteMoldOut) {
return page.setRecords(baseMapper.selectStGraphiteMoldOutPage(page, stGraphiteMoldOut));
}
@Override
@Transactional(rollbackFor = Exception.class)
public List<StGraphiteMoldOut> generatePreOutOrder(StGraphiteMoldOutDTO dto) {
if (dto == null) {
throw new ServiceException("石墨模信息不能为空,无法生成预出库单");
}
Date now = new Date();
YieldOrder faYieldOrder = baseMapper.getByYoCode(dto.getCardNo());
if (faYieldOrder == null) {
throw new RuntimeException("根据流程卡号【" + dto.getCardNo() + "】未查询到生产订单信息");
}
List<StGraphiteMoldOut> preOutStockList = new ArrayList<>();
String goodsCode = faYieldOrder.getPartCode();
Double requireQty = faYieldOrder.getYpQty();
System.out.println("石墨模编码:" + goodsCode + ",总需求:" + requireQty);
List<StRealtimeStock> candidateStockList = new ArrayList<>();
double totalUsable = 0.0;
while (true) {
StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(goodsCode);
if (maxStock == null) {
break;
}
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
double usableQty = maxStock.getQuantity() - occupyQty;
if (usableQty <= 0) {
break;
}
candidateStockList.add(maxStock);
totalUsable += usableQty;
if (totalUsable >= requireQty) {
break;
}
}
if (totalUsable < requireQty - 0.001) {
throw new ServiceException("石墨模【" + goodsCode + "】库存不足,无法生成!需求数量:" + requireQty + ",可用库存:" + totalUsable);
}
double remainingQty = requireQty;
for (StRealtimeStock maxStock : candidateStockList) {
if (remainingQty <= 0.001) {
break;
}
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
double usableQty = maxStock.getQuantity() - occupyQty;
double actualTake = Math.min(usableQty, remainingQty);
StGraphiteMoldOut preOutStock = new StGraphiteMoldOut();
preOutStock.setYoCode(faYieldOrder.getYoCode());
preOutStock.setCardNo(dto.getCardNo());
preOutStock.setOutCode(stStockInoutRecordService.generateCode());
preOutStock.setNeedQuantity(requireQty);
preOutStock.setGoodsId(maxStock.getGoodsId());
StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId());
preOutStock.setGoodsName(stGoods.getGoodsName());
preOutStock.setGoodsCode(stGoods.getGoodsCode());
preOutStock.setSlId(maxStock.getSlId());
StStorageLocation location = stStorageLocationService.getById(maxStock.getSlId());
preOutStock.setLocation(location.getLocation());
preOutStock.setShId(maxStock.getShId());
StStorehouse storehouse = stStorehouseService.getById(maxStock.getShId());
preOutStock.setShName(storehouse.getShName());
preOutStock.setRlsId(maxStock.getId());
preOutStock.setPiNo(maxStock.getPiNo());
preOutStock.setCurStatus(0L);
preOutStock.setCreateTime(now);
preOutStock.setUpdateTime(now);
preOutStockList.add(preOutStock);
System.out.println("石墨模[编码:" + goodsCode + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId());
double newOccupy = occupyQty + actualTake;
maxStock.setOccupyQuantity(newOccupy);
stRealtimeStockService.updateById(maxStock);
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getCardNo());
lock.setOccupyQuantity(actualTake);
lock.setStatus(0);
stRealtimeStockMapper.insertStockLock(lock);
remainingQty -= actualTake;
}
System.out.println("石墨模[编码:" + goodsCode + "] 预出库全部完成!");
this.saveBatch(preOutStockList);
return preOutStockList;
}
@Override
public Map<String, Object> batchGeneratePreOutOrder(List<StGraphiteMoldOutDTO> dtoList) {
Map<String, Object> resultMap = new HashMap<>(2);
List<StGraphiteMoldOut> successList = new ArrayList<>();
List<String> failMsgList = new ArrayList<>();
if (CollectionUtils.isEmpty(dtoList)) {
failMsgList.add("批量生成失败:石墨模信息集合不能为空");
resultMap.put("successList", successList);
resultMap.put("failMsgList", failMsgList);
return resultMap;
}
for (int i = 0; i < dtoList.size(); i++) {
StGraphiteMoldOutDTO dto = dtoList.get(i);
try {
List<StGraphiteMoldOut> preOutOrderList = this.generatePreOutOrder(dto);
for (StGraphiteMoldOut item : preOutOrderList) {
if (item != null) {
successList.add(item);
}
}
} catch (ServiceException e) {
failMsgList.add(String.format("第%s条:%s", i + 1, e.getMessage()));
} catch (Exception e) {
failMsgList.add(String.format("第%s条:生成失败,未知异常:%s", i + 1, e.getMessage()));
}
}
resultMap.put("successList", successList);
resultMap.put("failMsgList", failMsgList);
return resultMap;
}
@Override
@Transactional(rollbackFor = Exception.class)
public List<StGraphiteMoldOut> scanCardProcess(String cardNo, BladeUser user) {
QueryWrapper<StGraphiteMoldOut> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("card_no", cardNo);
queryWrapper.eq("cur_status", 0L);
List<StGraphiteMoldOut> waitOutList = baseMapper.selectList(queryWrapper);
if (!CollectionUtils.isEmpty(waitOutList)) {
for (StGraphiteMoldOut waitOut : waitOutList) {
StRealtimeStock stock = stRealtimeStockService.getById(waitOut.getRlsId());
if (stock != null) {
waitOut.setStockQty(stock.getQuantity() - stock.getOccupyQuantity());
waitOut.setPiNo(stock.getPiNo());
}
StGoods stGoods = stGoodsService.getById(waitOut.getGoodsId());
waitOut.setGoodsCode(stGoods.getGoodsCode());
waitOut.setGoodsName(stGoods.getGoodsName());
StStorehouse storehouse = stStorehouseService.getById(waitOut.getShId());
waitOut.setShName(storehouse.getShName());
StStorageLocation location = stStorageLocationService.getById(waitOut.getSlId());
waitOut.setLocation(location.getLocation());
}
return waitOutList;
}else {
StGraphiteMoldOutDTO dto = new StGraphiteMoldOutDTO();
dto.setCardNo(cardNo);
List<StGraphiteMoldOut> stGraphiteMoldOutList = this.generatePreOutOrder(dto);
if (!CollectionUtils.isEmpty(stGraphiteMoldOutList)) {
for (StGraphiteMoldOut waitOut : stGraphiteMoldOutList) {
StRealtimeStock stock = stRealtimeStockService.getById(waitOut.getRlsId());
if (stock != null) {
waitOut.setStockQty(stock.getQuantity() - stock.getOccupyQuantity());
waitOut.setPiNo(stock.getPiNo());
}
StGoods stGoods = stGoodsService.getById(waitOut.getGoodsId());
waitOut.setGoodsCode(stGoods.getGoodsCode());
waitOut.setGoodsName(stGoods.getGoodsName());
StStorehouse storehouse = stStorehouseService.getById(waitOut.getShId());
waitOut.setShName(storehouse.getShName());
StStorageLocation location = stStorageLocationService.getById(waitOut.getSlId());
waitOut.setLocation(location.getLocation());
}
return stGraphiteMoldOutList;
}
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public StGraphiteMoldOut submitOutStock(StGraphiteMoldOut param, BladeUser user) {
List<StGraphiteMoldOut> outList = new ArrayList<>();
outList.add(param);
List<StGraphiteMoldOut> resultList = this.batchSubmitOutStock(outList, user);
return resultList.isEmpty() ? null : resultList.get(0);
}
@Transactional(rollbackFor = Exception.class)
public List<StGraphiteMoldOut> batchSubmitOutStock(List<StGraphiteMoldOut> paramList, BladeUser user) {
if (paramList == null || paramList.isEmpty()) {
throw new ServiceException("出库数据不能为空");
}
Long userId = Long.valueOf(user.getUserId());
Date nowDate = new Date();
List<StStockInoutRecord> allInoutList = new ArrayList<>();
List<StRealtimeStock> stockList = new ArrayList<>();
List<StGraphiteMoldOut> resultList = new ArrayList<>();
for (StGraphiteMoldOut param : paramList) {
if (param.getId() == null) {
throw new ServiceException("出库数据ID不能为空");
}
if (param.getOutedQuantity() == null || param.getOutedQuantity() <= 0) {
throw new ServiceException("流程卡号【"+param.getCardNo()+"】请填写正确的出库数量,数量必须大于0");
}
StGraphiteMoldOut outEntity = this.getById(param.getId());
if (outEntity == null) {
throw new ServiceException("主键ID【"+param.getId()+"】未查询到该待出库数据");
}
if (outEntity.getCurStatus() != 0L) {
throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】非待出库状态,无法提交出库");
}
StRealtimeStock realtimeStock = stRealtimeStockService.getById(outEntity.getRlsId());
if (realtimeStock != null) {
stockList.add(realtimeStock);
}
if (param.getOutedQuantity() > realtimeStock.getQuantity()) {
throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】出库数量不能大于库存总数量,库存数量为:" + realtimeStock.getQuantity());
}
outEntity.setRlsId(param.getRlsId());
outEntity.setGoodsId(param.getGoodsId());
outEntity.setShId(param.getShId());
outEntity.setSlId(param.getSlId());
outEntity.setOutedQuantity(param.getOutedQuantity());
outEntity.setOutUser(userId);
outEntity.setOutTime(nowDate);
outEntity.setCurStatus(1L);
outEntity.setUpdateUser(userId);
outEntity.setUpdateTime(nowDate);
outEntity.setPicker(param.getPicker());
this.updateById(outEntity);
StStockInoutRecord inoutRecord = new StStockInoutRecord();
inoutRecord.setCheckNo(outEntity.getCardNo());
inoutRecord.setSirCode(outEntity.getOutCode());
inoutRecord.setSlId(outEntity.getSlId());
inoutRecord.setRlsId(outEntity.getRlsId());
inoutRecord.setShId(outEntity.getShId());
inoutRecord.setGoodsId(outEntity.getGoodsId());
inoutRecord.setPiNo(realtimeStock.getPiNo());
inoutRecord.setStovePiNo(realtimeStock.getStovePiNo());
inoutRecord.setQuantity(param.getOutedQuantity());
inoutRecord.setUnitPrice(realtimeStock.getBalanceMoney());
inoutRecord.setSirMoney(param.getOutedQuantity() * realtimeStock.getBalanceMoney());
inoutRecord.setInOutType(StStockInoutRecord.OUT_TYPE);
inoutRecord.setInOutSource(StStockInoutRecord.INOUT_SOURCE_GRAPHITE_MOLD_OUT);
inoutRecord.setInOutDate(nowDate);
inoutRecord.setUserId(param.getPicker());
inoutRecord.setCreateUser(userId);
inoutRecord.setCreateTime(nowDate);
inoutRecord.setUpdateUser(userId);
inoutRecord.setUpdateTime(nowDate);
stStockInoutRecordService.save(inoutRecord);
allInoutList.add(inoutRecord);
outEntity.setSirId(inoutRecord.getId());
this.updateById(outEntity);
resultList.add(outEntity);
}
if (!allInoutList.isEmpty() && !stockList.isEmpty()) {
stRealtimeStockService.reviseRealTimeStock(allInoutList, stockList, null);
}
return resultList;
}
@Override
public List<StGraphiteMoldOutExcel> exportStGraphiteMoldOut(Wrapper<StGraphiteMoldOut> queryWrapper) {
List<StGraphiteMoldOutExcel> list = baseMapper.exportStGraphiteMoldOut(queryWrapper);
return list;
}
}

@ -7,13 +7,16 @@ 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 org.springblade.common.exception.BusinessException;
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.desk.dashboard.feign.IPartClient;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.system.feign.IUserClient;
import org.springblade.wms.excel.StOtherReceiptRecordExcel;
import org.springblade.wms.mapper.StOtherReceiptRecordMapper;
import org.springblade.wms.pojo.dto.InitStockDTO;
@ -52,6 +55,8 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
IStStockInoutRecordService stStockInoutRecordService;
@Resource
IPartClient partClient;
@Resource
IUserClient userClient;
// private static IPartClient getPartClient() {
// if (partClient == null) {
@ -336,6 +341,39 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
return inoutRecord;
}
@Override
public void saveSubOrderWarehousing(String goodsCode, String batchNo, Double quantity, Long shId, Long slId, Date date, Long userId) throws Exception {
BladeUser user = AuthUtil.getUser();
StOtherReceiptRecord otherReceiptRecord = new StOtherReceiptRecord();
//入库信息
otherReceiptRecord.setWarehousingReason(StOtherReceiptRecord.REASON_PRODUCE);
otherReceiptRecord.setShId(shId);
otherReceiptRecord.setSlId(slId);
otherReceiptRecord.setCreateUser(userId);
//如果物料信息不存在,则同步
StGoods goods = stGoodsService.queryByCode(goodsCode);
if (goods == null) {
throw new ServiceException("物料【" + goodsCode + "】不存在,无法执行入库操作");
}
otherReceiptRecord.setGoodsId(goods.getId());
List<StStockInoutRecord> inoutList = new ArrayList<>();
StStockInoutRecord stockInoutRecord = new StStockInoutRecord();
stockInoutRecord.setGoodsId(goods.getId());
stockInoutRecord.setPiNo(batchNo);
stockInoutRecord.setQuantity(quantity);
stockInoutRecord.setShId(shId);
stockInoutRecord.setSlId(slId);
stockInoutRecord.setInOutDate(date);
stockInoutRecord.setCreateUser(userId);
inoutList.add(stockInoutRecord);
otherReceiptRecord.setInoutList(inoutList);
this.otherWarehousing(otherReceiptRecord, user);
}
@Override
public List<StOtherReceiptRecordExcel> exportStOtherReceiptRecord(Wrapper<StOtherReceiptRecord> queryWrapper) {
List<StOtherReceiptRecordExcel> stOtherReceiptRecordList = baseMapper.exportStOtherReceiptRecord(queryWrapper);

@ -388,8 +388,8 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}// 新增:玻璃饼出库独立分支(与其他出库/刀具出库平级)
else if (StStockInoutRecord.INOUT_SOURCE_GLASS_CAKE_OUT.equals(inout.getInOutSource())) {
// 玻璃饼出库专属:预占用校验(规则与原有一致)
if (StringUtils.isNotBlank(inout.getWoCode()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getWoCode(), stock.getId().toString())) {
if (StringUtils.isNotBlank(inout.getCheckNo()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getCheckNo(), stock.getId().toString())) {
StGlassCakeOut stGlassCakeOut = stGlassCakeOutMapper.getBySirId(inout.getId());
if (StringUtils.isNotBlank(stGlassCakeOut.getMemo())) {
// 仅备注含"补"字时跳过预占用校验
@ -418,6 +418,32 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
if (warnMsg4 != null) {
warnMsgList.add(warnMsg4);
}
} else if (StStockInoutRecord.INOUT_SOURCE_GRAPHITE_MOLD_OUT.equals(inout.getInOutSource())) {
// 石墨模出库:校验预占用锁库 + 扣减库存逻辑
if (StringUtils.isNotBlank(inout.getCheckNo()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getCheckNo(), stock.getId().toString())) {
throw new ServiceException("石墨模出库需匹配预占用,此工作订单无预占用!");
}
}
// 校验可用库存
Double surplusQuantity =
stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity();
if (surplusQuantity < quantity) {
throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,石墨模出库失败");
}
// 扣减库存
stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
// 最低库存预警
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_ASSIGN_OUT.equals(inout.getInOutSource())) {
// if (!stock.getMoldBaseMaterial()) {
@ -532,9 +558,10 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
BigDecimal.valueOf(quantity))
.doubleValue();
if (StrUtil.isNotBlank(inout.getWoCode()) && newOccupy >= 0) {
String lockNo = StrUtil.isNotBlank(inout.getWoCode()) ? inout.getWoCode() : inout.getCardNo();
if (StrUtil.isNotBlank(lockNo) && newOccupy >= 0) {
db.setOccupyQuantity(newOccupy);
this.updateRealTimeLock(inout.getWoCode(), db.getId(), quantity);
this.updateRealTimeLock(lockNo, db.getId(), quantity);
// NumberUtil.add(
// BigDecimal.valueOf(newOccupy),
// BigDecimal.valueOf(quantity)
@ -976,6 +1003,11 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}
}
// @Override
// public Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId) {
// return baseMapper.queryByShIdAndSlId(goodsCode, quantity, shId, slId);
// }
@Override
public List<StRealtimeStockExcel> exportStRealtimeStock(Wrapper<StRealtimeStock> queryWrapper) {
List<StRealtimeStockExcel> stRealtimeStockList = baseMapper.exportStRealtimeStock(queryWrapper);

@ -0,0 +1,36 @@
package org.springblade.wms.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.wms.pojo.entity.StGraphiteMoldOut;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import java.util.Objects;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StGraphiteMoldOutWrapper
* @description: 石墨模出库 包装类,返回视图层所需的字段
* @autor: WuSiYu
* @create 2025-xx-xx xx:xx
**/
public class StGraphiteMoldOutWrapper extends BaseEntityWrapper<StGraphiteMoldOut, StGraphiteMoldOutVO> {
public static StGraphiteMoldOutWrapper build() {
return new StGraphiteMoldOutWrapper();
}
@Override
public StGraphiteMoldOutVO entityVO(StGraphiteMoldOut stGraphiteMoldOut) {
StGraphiteMoldOutVO stGraphiteMoldOutVO = Objects.requireNonNull(BeanUtil.copyProperties(stGraphiteMoldOut, StGraphiteMoldOutVO.class));
//User createUser = UserCache.getUser(stGraphiteMoldOut.getCreateUser());
//User updateUser = UserCache.getUser(stGraphiteMoldOut.getUpdateUser());
//stGraphiteMoldOutVO.setCreateUserName(createUser.getName());
//stGraphiteMoldOutVO.setUpdateUserName(updateUser.getName());
return stGraphiteMoldOutVO;
}
}
Loading…
Cancel
Save