cuilei
2025-06-11 2be9b7f9c675e6ffe64adfac0a3e37f30404af99
工具管理-刀具准备单功能接口开发
已添加1个文件
已修改15个文件
484 ■■■■■ 文件已修改
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderDetailMapper.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
@@ -1,5 +1,6 @@
package org.jeecg.modules.tms.controller;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.system.query.QueryGenerator;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -72,9 +73,10 @@
                                                         @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                         @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                         HttpServletRequest req) {
        QueryWrapper<PreparationOrder> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrder, req.getParameterMap());
        Map<String, String[]> parameterMap = req.getParameterMap();
        QueryWrapper<PreparationOrder> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrder, parameterMap);
        Page<PreparationOrder> page = new Page<PreparationOrder>(pageNo, pageSize);
        IPage<PreparationOrder> pageList = preparationOrderService.page(page, queryWrapper);
        IPage<PreparationOrder> pageList = preparationOrderService.queryPageList(page, parameterMap);
        return Result.OK(pageList);
    }
@@ -139,8 +141,17 @@
    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
        this.preparationOrderService.delBatchMain(Arrays.asList(ids.split(",")));
        preparationOrderService.delBatchMain(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    @AutoLog(value = "刀具准备单-转出库申请单")
    @ApiOperation(value = "刀具准备单-转出库申请单", notes = "刀具准备单-转出库申请单")
    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:convert")
    @PostMapping(value = "/convertToOutboundOrder")
    public Result<String> convertToOutboundOrder(@RequestBody List<String> preparationOrderIds) {
        List<String> result = preparationOrderService.convertToOutboundOrder(preparationOrderIds);
        return Result.OK(JSONObject.toJSONString(result));
    }
    /**
@@ -177,9 +188,10 @@
                                                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                                                    HttpServletRequest req) {
        QueryWrapper<PreparationOrderDetail> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrderDetail, req.getParameterMap());
        Map<String, String[]> parameterMap = req.getParameterMap();
        QueryWrapper<PreparationOrderDetail> queryWrapper = QueryGenerator.initQueryWrapper(preparationOrderDetail, parameterMap);
        Page<PreparationOrderDetail> page = new Page<PreparationOrderDetail>(pageNo, pageSize);
        IPage<PreparationOrderDetail> pageList = preparationOrderDetailService.page(page, queryWrapper);
        IPage<PreparationOrderDetail> pageList = preparationOrderDetailService.queryPageList(page, parameterMap);
        return Result.OK(pageList);
    }
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -22,6 +23,7 @@
 * @Version: V1.0
 */
@Data
@Accessors(chain = true)
@TableName("tms_outbound_detail")
@ApiModel(value="tms_outbound_detail对象", description="出库申请单明细")
public class OutboundDetail implements Serializable {
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java
@@ -5,6 +5,8 @@
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import liquibase.pro.packaged.E;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -20,6 +22,7 @@
 * @Version: V1.0
 */
@Data
@Accessors(chain = true)
@TableName("tms_outbound_order")
@ApiModel(value="tms_outbound_order对象", description="tms_outbound_order")
public class OutboundOrder implements Serializable {
@@ -98,6 +101,42 @@
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**准备单编号*/
    @Excel(name = "准备单编号", width = 15)
    @ApiModelProperty(value = "准备单编号")
    private String preparationOrderId;
    /**零件图号*/
    @Excel(name = "零件图号", width = 15)
    @ApiModelProperty(value = "零件图号")
    private String partDrawingNo;
    /**零件名称*/
    @Excel(name = "零件名称", width = 15)
    @ApiModelProperty(value = "零件名称")
    private String partName;
    /**零件材料*/
    @Excel(name = "零件材料", width = 15)
    @ApiModelProperty(value = "零件材料")
    private String partMaterial;
    /**加工批次*/
    @Excel(name = "工序(工步号)", width = 15)
    @ApiModelProperty(value = "工序(工步号)")
    private String productionProcessesNo;
    /**加工批次*/
    @Excel(name = "加工批次", width = 15)
    @ApiModelProperty(value = "加工批次")
    private String batchCode;
    /**加工数量*/
    @Excel(name = "加工数量", width = 15)
    @ApiModelProperty(value = "加工数量")
    private String machiningCount;
    /**加工设备*/
    @Excel(name = "加工设备", width = 15)
    @ApiModelProperty(value = "加工设备")
    private String equipmentCode;
    /**程序名*/
    @Excel(name = "程序名", width = 15)
    @ApiModelProperty(value = "程序名")
    private String ncName;
    /**租户号*/
    @Excel(name = "租户号", width = 15)
    @ApiModelProperty(value = "租户号")
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrder.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -22,6 +23,7 @@
 * @Version: V1.0
 */
@Data
@Accessors(chain = true)
@TableName("tms_preparation_order")
@ApiModel(value="tms_preparation_order对象", description="刀具准备单")
public class PreparationOrder implements Serializable {
@@ -72,6 +74,7 @@
    @ApiModelProperty(value = "准备单出库数量")
    private java.math.BigDecimal outboundQuantity;
    /**单子状态;1.未审核;2.调机员已审核;3.已转出库申请*/
    @Dict(dicCode = "preparation_order_status")
    @Excel(name = "单子状态;1.未审核;2.调机员已审核;3.已转出库申请", width = 15)
    @ApiModelProperty(value = "单子状态;1.未审核;2.调机员已审核;3.已转出库申请")
    private String orderStatus;
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
@@ -2,10 +2,12 @@
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.util.Date;
@@ -33,7 +35,7 @@
    private String preparationOrderId;
    /**刀具编码*/
    @Excel(name = "刀具编码", width = 15)
    @ApiModelProperty(value = "刀具编码")
    @ApiModelProperty(value = "刀具编码(tms_base_tool表id字段)")
    private String toolCode;
    /**刀具编号*/
    @Excel(name = "刀具编号", width = 15)
@@ -63,4 +65,34 @@
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    /**刀具编码(tms_base_tool表tool_code字段)*/
    @TableField(exist = false)
    @ApiModelProperty(value = "刀具编码(tms_base_tool表tool_code字段)")
    private String toolNum;
    /**中文名称*/
    @TableField(exist = false)
    @ApiModelProperty(value = "中文名称")
    private String chineseName;
    /**型号/图号*/
    @TableField(exist = false)
    @ApiModelProperty(value = "型号/图号")
    private String toolModel;
    /**工具类型*/
    @TableField(exist = false)
    @ApiModelProperty(value = "工具类型")
    @Dict(dicCode = "application_type")
    private String applicationType;
    /**刀具材料*/
    @TableField(exist = false)
    @ApiModelProperty(value = "刀具材料")
    private String toolMaterial;
    /**零件材料*/
    @TableField(exist = false)
    @ApiModelProperty(value = "零件材料")
    private String partMaterial;
    /**厂家*/
    @TableField(exist = false)
    @ApiModelProperty(value = "厂家")
    private String supplierId;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutStorehouseType.java
@@ -8,7 +8,8 @@
    TOOL_BORROW("1", "工具借用"),
    MAINTENANCE_OUTBOUND("2", "维修出库"),
    CALIBRATION_OUTBOUND("3", "检定出库"),
    GRINDING_OUTBOUND("4", "刃磨出库");
    GRINDING_OUTBOUND("4", "刃磨出库"),
    PREPARATION_OUTBOUND("5", "准备单出库");
    private final String value;
    private final String description;
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/PreparationOrderStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package org.jeecg.modules.tms.enums;
import lombok.Getter;
import java.util.Objects;
/**
 * åˆ€å…·å‡†å¤‡å•状态枚举类
 */
@Getter
public enum PreparationOrderStatus {
    /**
     * å¾…审核状态,值为1
     */
    PENDING_AUDIT("1", "未审核"),
    /**
     * å®¡æ ¸é€šè¿‡çŠ¶æ€ï¼Œå€¼ä¸º2
     */
    AUDITED("2", "调机员已审核"),
    /**
     * è½¬å‡ºåº“申请状态,值为3
     */
    CONVERT("3", "已转出库申请");
    private final String value;
    private final String description;
    /**
     * æž„造方法
     *
     * @param value       çŠ¶æ€å€¼
     * @param description çŠ¶æ€æè¿°
     */
    PreparationOrderStatus(String value, String description) {
        this.value = value;
        this.description = description;
    }
    /**
     * æ ¹æ®çŠ¶æ€å€¼èŽ·å–å¯¹åº”çš„æžšä¸¾å®žä¾‹
     *
     * @param value çŠ¶æ€å€¼
     * @return å¯¹åº”的枚举实例,如果找不到匹配的值则返回null
     */
    public static PreparationOrderStatus fromValue(String value) {
        for (PreparationOrderStatus status : values()) {
            if (Objects.equals(status.getValue(), value)) {
                return status;
            }
        }
        return null;
    }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderDetailMapper.java
@@ -1,6 +1,12 @@
package org.jeecg.modules.tms.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.tms.entity.PreparationOrderDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
@@ -29,4 +35,6 @@
     */
    public List<PreparationOrderDetail> selectByMainId(@Param("mainId") String mainId);
    IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page,
                                                @Param(Constants.WRAPPER) Wrapper<PreparationOrderDetail> queryWrapper);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/PreparationOrderMapper.java
@@ -2,6 +2,11 @@
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.tms.entity.PreparationOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -14,4 +19,6 @@
 */
public interface PreparationOrderMapper extends BaseMapper<PreparationOrder> {
    IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page,
                                          @Param(Constants.WRAPPER) Wrapper<PreparationOrder> queryWrapper);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderDetailMapper.xml
@@ -15,4 +15,79 @@
        WHERE
            preparation_order_id = #{mainId}
    </select>
    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.PreparationOrderDetail">
        SELECT
            t1.id id,
            t1.preparation_order_id preparationOrderId,
            t1.tool_code toolCode,
            t1.outbound_quantity outboundQuantity,
            t1.tenant_id tenantId,
            t1.create_by createBy,
            t1.create_time createTime,
            t1.update_by updateBy,
            t1.update_time updateTime,
            t2.tool_code toolNum,
            t2.chinese_name chineseName,
            t2.tool_model toolModel,
            t2.parama_table_name paramaTableName,
            t3.application_type applicationType,
            t3.supplier_id supplierId,
        <choose>
            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
                t4.tool_material toolMaterial,
                t4.part_material partMaterial
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
                t5.tool_material toolMaterial,
                t5.part_material partMaterial
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
                t6.tool_material toolMaterial,
                t6.part_material partMaterial
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
                t7.tool_material toolMaterial,
                t7.part_material partMaterial
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
                t8.tool_material toolMaterial,
                t8.part_material partMaterial
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
                t9.tool_material toolMaterial,
                t9.part_material partMaterial
            </when>
            <otherwise>
                t10.tool_material toolMaterial,
                t10.part_material partMaterial
            </otherwise>
        </choose>
        FROM tms_preparation_order_detail t1
        LEFT JOIN tms_base_tools t2 on t1.tool_code = t2.id
        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
        <choose>
            <when test="ew.paramNameValuePairs.paramaTableName == '1'">
                LEFT JOIN tms_para_common_tool t4 on t4.tool_code = t2.id
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '2'">
                LEFT JOIN tms_para_hole_tools t5 on t5.tool_code = t2.id
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '3'">
                LEFT JOIN tms_para_threading_tool t6 on t6.tool_code = t2.id
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '4'">
                LEFT JOIN tms_para_mill_tool t7 on t7.tool_code = t2.id
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '5'">
                LEFT JOIN tms_para_turning_tools t8 on t8.tool_code = t2.id
            </when>
            <when test="ew.paramNameValuePairs.paramaTableName == '6'">
                LEFT JOIN tms_para_blade t9 on t9.tool_code = t2.id
            </when>
            <otherwise>
                LEFT JOIN tms_para_common_tool t10 on t10.tool_code = t2.id
            </otherwise>
        </choose>
        ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/PreparationOrderMapper.xml
@@ -2,4 +2,28 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.tms.mapper.PreparationOrderMapper">
    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.PreparationOrder">
        SELECT
            t.id AS id,
            t.preparation_order_num AS preparationOrderNum,
            t.part_drawing_no AS partDrawingNo,
            t.part_name AS partName,
            t.part_material AS partMaterial,
            t.production_processes_no AS productionProcessesNo,
            t.batch_code AS batchCode,
            t.machining_count AS machiningCount,
            t.equipment_code AS equipmentCode,
            t.nc_name AS ncName,
            t.outbound_quantity AS outboundQuantity,
            t.order_status AS orderStatus,
            t.outbound_time AS outboundTime,
            t.remark AS remark,
            t.tenant_id AS tenantId,
            t.create_by AS createBy,
            t.create_time AS createTime,
            t.update_by AS updateBy,
            t.update_time AS updateTime
        FROM tms_preparation_order t
        ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderDetailService.java
@@ -1,8 +1,11 @@
package org.jeecg.modules.tms.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.tms.entity.PreparationOrderDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
 * @Description: åˆ€å…·å‡†å¤‡å•明细
@@ -19,4 +22,6 @@
   * @return List<PreparationOrderDetail>
   */
    public List<PreparationOrderDetail> selectByMainId(String mainId);
    IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page, Map<String, String[]> parameterMap);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
@@ -1,5 +1,7 @@
package org.jeecg.modules.tms.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.tms.entity.PreparationOrderDetail;
import org.jeecg.modules.tms.entity.PreparationOrder;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -8,6 +10,7 @@
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * @Description: åˆ€å…·å‡†å¤‡å•
@@ -33,4 +36,8 @@
    void editTotal(PreparationOrderAndDetailDto preparationOrderAndDetailDto);
    List<String> convertToOutboundOrder(List<String> preparationOrderIds);
    IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -175,13 +175,14 @@
        if (!Objects.equals(outboundOrder.getOrderStatus(), OutBillStatus.DRAFT.getValue())) {
            throw new JeecgBootException("无法提交非草稿状态的出库申请单!");
        }
        //锁定申请单明细中工具库存
        if (lockOutboundStock(id)) {
        if (!OutStorehouseType.PREPARATION_OUTBOUND.getValue().equals(outboundOrder.getOutStorehouseType())) {
            //不是从准备单转入的出库申请,执行锁库
            lockOutboundStock(id);
        }
            //启动流程
            if (triggerProcess(outboundOrder)) {
                outboundOrder.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
                updateById(outboundOrder);
            }
        }
    }
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderDetailServiceImpl.java
@@ -1,10 +1,16 @@
package org.jeecg.modules.tms.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.tms.entity.PreparationOrderDetail;
import org.jeecg.modules.tms.mapper.PreparationOrderDetailMapper;
import org.jeecg.modules.tms.service.IPreparationOrderDetailService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,4 +30,14 @@
    public List<PreparationOrderDetail> selectByMainId(String mainId) {
        return preparationOrderDetailMapper.selectByMainId(mainId);
    }
    @Override
    public IPage<PreparationOrderDetail> queryPageList(Page<PreparationOrderDetail> page, Map<String, String[]> parameterMap) {
        QueryWrapper<PreparationOrderDetail> queryWrapper = Wrappers.query();
        String[] preparationOrderIds = parameterMap.get("preparationOrderId");
        if (preparationOrderIds != null && preparationOrderIds.length > 0) {
            queryWrapper.eq("t1.preparation_order_id", preparationOrderIds[0]);
        }
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
@@ -1,22 +1,31 @@
package org.jeecg.modules.tms.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.jeecg.modules.tms.convert.PreparationOrderConvert;
import org.jeecg.modules.tms.entity.PreparationOrder;
import org.jeecg.modules.tms.entity.PreparationOrderDetail;
import org.jeecg.modules.tms.entity.*;
import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
import org.jeecg.modules.tms.enums.*;
import org.jeecg.modules.tms.mapper.PreparationOrderDetailMapper;
import org.jeecg.modules.tms.mapper.PreparationOrderMapper;
import org.jeecg.modules.tms.service.IPreparationOrderDetailService;
import org.jeecg.modules.tms.service.IPreparationOrderService;
import org.jeecg.modules.tms.service.*;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.List;
import java.util.Collection;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Description: åˆ€å…·å‡†å¤‡å•
@@ -33,6 +42,18 @@
    private PreparationOrderDetailMapper preparationOrderDetailMapper;
    @Autowired
    private IPreparationOrderDetailService preparationOrderDetailService;
    @Autowired
    private IToolLedgerService toolLedgerService;
    @Autowired
    private IToolLedgerDetailService toolLedgerDetailService;
    @Autowired
    private IOutboundOrderService outboundOrderService;
    @Autowired
    private IOutboundDetailService outboundDetailService;
    @Autowired
    private ISysBusinessCodeRuleService businessCodeRuleService;
    @Autowired
    private IBaseToolsService baseToolsService;
    
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -66,4 +87,147 @@
        preparationOrderDetailService.saveBatch(detailUpdateList);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public List<String> convertToOutboundOrder(List<String> preparationOrderIds) {
        List<String> resultMessage = CollectionUtil.newArrayList();
        List<PreparationOrder> preparationOrderList = listByIds(preparationOrderIds);
        //校验准备单明细中的数量
        for (PreparationOrder preparationOrder : preparationOrderList) {
            if (PreparationOrderStatus.PENDING_AUDIT.getValue().equals(preparationOrder.getOrderStatus())) {
                resultMessage.add("准备单【" + preparationOrder.getPreparationOrderNum() + "】未审核,无法转出库申请!");
                continue;
            }
            if (PreparationOrderStatus.CONVERT.getValue().equals(preparationOrder.getOrderStatus())) {
                resultMessage.add("准备单【" + preparationOrder.getPreparationOrderNum() + "】已经转出,请勿重复提交!");
                continue;
            }
            List<PreparationOrderDetail> preparationOrderDetailList = preparationOrderDetailService.list(new LambdaQueryWrapper<PreparationOrderDetail>()
                    .eq(PreparationOrderDetail::getPreparationOrderId, preparationOrder.getId()));
            Map<String, BigDecimal> preparationOrderToolCodeMap = preparationOrderDetailList.stream().collect(Collectors.toMap(PreparationOrderDetail::getToolCode,
                    PreparationOrderDetail::getOutboundQuantity, (k1, k2) -> k1));
            List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(new LambdaQueryWrapper<ToolLedgerDetail>()
                    .in(ToolLedgerDetail::getToolCode, preparationOrderToolCodeMap.keySet())
                    .eq(ToolLedgerDetail::getQuantity, BigDecimal.ONE)
                    .eq(ToolLedgerDetail::getStatus, ToolCirculationStatus.IN_STOCK.getValue()));
            Map<String, List<ToolLedgerDetail>> ledgerDetailToolCodeMap = toolLedgerDetailList.stream().collect(Collectors.groupingBy(ToolLedgerDetail::getToolCode));
            List<OutboundDetail> outboundDetailList = CollectionUtil.newArrayList();
            for (PreparationOrderDetail preparationOrderDetail : preparationOrderDetailList) {
                String toolCode = preparationOrderDetail.getToolCode();
                BigDecimal needQuantity = preparationOrderDetail.getOutboundQuantity();
                List<ToolLedgerDetail> toolLedgerDetails = ledgerDetailToolCodeMap.get(toolCode);
                BigDecimal stockQuantity = Optional.ofNullable(toolLedgerDetails).orElse(Collections.emptyList()).stream()
                        .map(ToolLedgerDetail::getQuantity)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                if (CollectionUtil.isEmpty(toolLedgerDetails) || stockQuantity.compareTo(needQuantity) < 0) {
                    BaseTools tools = baseToolsService.getById(toolCode);
                    resultMessage.add("准备单【" + preparationOrder.getPreparationOrderNum() +"】中,编码为【" + tools.getToolCode() + "】的工具,库存不足,转出库申请单失败!");
                    break;
                } else {
                    //从库存明细中取出需要的数量,指定到把
                    List<ToolLedgerDetail> selectedTools = toolLedgerDetails.subList(0, needQuantity.intValue());
                    //生成申请单明细
                    selectedTools.forEach(item->{
                        OutboundDetail detail = new OutboundDetail()
                                .setToolCode(item.getToolCode())
                                .setToolId(item.getToolId())
                                .setOutboundQuantity(item.getQuantity())
                                .setStorageLocation(item.getWarehouseId())
                                .setOutboundLocation(item.getPositionCode())
                                .setStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue())
                                .setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
                                .setCreateTime(new Date());
                        outboundDetailList.add(detail);
                    });
                }
            }
            BigDecimal totalOutboundQuantity = preparationOrderDetailList.stream()
                    .map(detail -> Optional.ofNullable(detail.getOutboundQuantity()).orElse(BigDecimal.ZERO))
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            if (outboundDetailList.size() == totalOutboundQuantity.intValue()) {
                //指定到把的数量与需求数量一致,满足转出库申请单的条件,生成出库申请单
                OutboundOrder order = new OutboundOrder()
                        .setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"))
                        .setOutStorehouseType(OutStorehouseType.PREPARATION_OUTBOUND.getValue())
                        .setHandler(Objects.requireNonNull(getCurrentUser()).getId())
                        .setReviewer(Objects.requireNonNull(getCurrentUser()).getUsername())
                        .setOrderStatus(OutBillStatus.DRAFT.getValue())
                        .setSubjectMatter("刀具准备单转入")
                        .setPreparationOrderId(preparationOrder.getId())
                        .setPartDrawingNo(preparationOrder.getPartDrawingNo())
                        .setPartName(preparationOrder.getPartName())
                        .setPartMaterial(preparationOrder.getPartMaterial())
                        .setProductionProcessesNo(preparationOrder.getProductionProcessesNo())
                        .setBatchCode(preparationOrder.getBatchCode())
                        .setMachiningCount(preparationOrder.getMachiningCount())
                        .setEquipmentCode(preparationOrder.getEquipmentCode())
                        .setNcName(preparationOrder.getNcName())
                        .setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
                        .setCreateTime(new Date());
                outboundOrderService.save(order);
                outboundDetailList.forEach(item -> item.setOutStorehouseId(order.getId()));
                outboundDetailService.saveBatch(outboundDetailList);
                //锁定库存台账明细库存
                LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
                String codeIdString = outboundDetailList.stream()
                        .map(detail -> "'" + detail.getToolCode() + ":" + detail.getToolId() + "'")
                        .collect(Collectors.joining(","));
                String sql = "(tool_code + ':' + tool_id) IN (" + codeIdString + ")";
                queryWrapper.apply(sql);
                toolLedgerDetailService.update(new ToolLedgerDetail().setQuantity(BigDecimal.ZERO), queryWrapper);
                //锁定库存台账主表
                List<ToolLedger> toolLedgerList = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>()
                        .in(ToolLedger::getToolId, preparationOrderToolCodeMap.keySet()));
                toolLedgerList.forEach(item -> {
                    BigDecimal outboundQuantity = preparationOrderToolCodeMap.getOrDefault(item.getToolId(), BigDecimal.ZERO);
                    item.setAvailableCount(Optional.ofNullable(item.getAvailableCount()).orElse(BigDecimal.ZERO).subtract(outboundQuantity));
                });
                toolLedgerService.updateBatchById(toolLedgerList);
                //更新准备单状态
                updateById(new PreparationOrder()
                        .setId(preparationOrder.getId())
                        .setOutboundTime(new Date())
                        .setOrderStatus(PreparationOrderStatus.CONVERT.getValue()));//3.已转出库申请
                resultMessage.add("准备单【" + preparationOrder.getPreparationOrderNum() + "】转出库申请单成功!");
            }
        }
        return resultMessage;
    }
    @Override
    public IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap) {
        QueryWrapper<PreparationOrder> queryWrapper = Wrappers.query();
        String[] preparationOrderNums = parameterMap.get("preparationOrderNum");
        if (preparationOrderNums != null && preparationOrderNums.length > 0) {
            queryWrapper.like("t.preparation_order_num", preparationOrderNums[0]);
        }
        String[] orderStatuses = parameterMap.get("orderStatus");
        if (orderStatuses != null && orderStatuses.length > 0) {
            queryWrapper.eq("t.order_status", orderStatuses[0]);
        }
        String[] beginTimes = parameterMap.get("beginTime");
        if (beginTimes != null && beginTimes.length > 0) {
            queryWrapper.ge("t.create_time", beginTimes[0]);
        }
        String[] endTimes = parameterMap.get("endTime");
        if (endTimes != null && endTimes.length > 0) {
            queryWrapper.le("t.create_time", endTimes[0]);
        }
        queryWrapper.orderByAsc("t.create_time");
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
    private LoginUser getCurrentUser() {
        // èŽ·å–å½“å‰è®¤è¯çš„ç™»å½•ç”¨æˆ·ä¿¡æ¯
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null && currentUser.isAuthenticated()) {
            Object principal = currentUser.getPrincipal();
            if (principal instanceof LoginUser) {
                return (LoginUser) principal;
            }
        }
        return null;
    }
}