仓库管理新增石墨模出库

liweidong
wusiyu 6 days ago
parent bc71ee7830
commit dada568893
  1. 26
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java
  2. 151
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java
  3. 24
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java
  4. 234
      blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java
  5. 164
      blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java
  6. 52
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java
  7. 118
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml
  8. 51
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java
  9. 345
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java
  10. 36
      blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java

@ -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;
}

@ -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;
}

@ -0,0 +1,24 @@
package org.springblade.wms.pojo.vo;
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;
}

@ -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;
}

@ -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,118 @@
<?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.wo_code, 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.memo, gmo.picker,
-- 物料表字段
g.goods_code,
g.id AS goodsId,
g.goods_name,
-- 库房名称
w.id AS shId,
w.sh_name,
w.sh_code,
-- 库位名称
lc.id AS slId,
lc.location,
-- 库存表字段
r.id AS rlsId,
r.pi_no,
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>

@ -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);
}

@ -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("根据生产订单ID【" + 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;
}
}

@ -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