zhangherong
2025-05-22 e990e67920907f103ab7ec3a5a2f86d33f8e6bd2
Merge remote-tracking branch 'origin/master'
已添加15个文件
已修改5个文件
1618 ■■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentLeanOutStatusEnum.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentLeanOutRequest.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentLeanOutService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutboundOrderAndDetailDto.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutboundDetailMapper.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutboundOrderMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutboundDetailMapper.xml 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutboundOrderMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundDetailService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundDetailServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolLedgerDetailServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentLeanOutStatusEnum.java
@@ -7,4 +7,13 @@
    WAIT_CONFIRM, //待确认
    COMPLETE, //已完成
    ;
    public static EquipmentLeanOutStatusEnum getInstance(String code) {
        EquipmentLeanOutStatusEnum[] values = EquipmentLeanOutStatusEnum.values();
        for (EquipmentLeanOutStatusEnum value : values) {
            if (value.name().equals(code)) {
                return value;
            }
        }
        return null;
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java
@@ -18,6 +18,7 @@
import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
import org.jeecg.modules.eam.service.IEamEquipmentLeanOutService;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -201,7 +202,7 @@
    @AutoLog(value = "设备借出归还-审批流")
    @ApiOperation(value = "设备借出归还-审批流", notes = "设备借出归还-审批流")
    @RequestMapping(value = "/approval", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<?> approval(@RequestBody EamEquipmentLeanOut request) {
    public Result<?> approval(@RequestBody EamEquipmentLeanOutRequest request) {
        if (request == null) {
            return Result.error("添加的对象不能为空!");
        }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentLeanOutRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
package org.jeecg.modules.eam.request;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @Description: è®¾å¤‡å€Ÿå‡ºå½’还
 * @Author: jeecg-boot
 * @Date: 2025-05-21
 * @Version: V1.0
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EamEquipmentLeanOutRequest extends FlowTaskVo implements Serializable {
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**
     * åˆ›å»ºäºº
     */
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**
     * æ›´æ–°äºº
     */
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    /**
     * åˆ é™¤æ ‡è®°
     */
    @ApiModelProperty(value = "删除标记")
    private Integer delFlag;
    /**
     * è®¾å¤‡ID
     */
    @ApiModelProperty(value = "设备ID")
    private String equipmentId;
    /**
     * å•据号
     */
    @Excel(name = "单据号", width = 15)
    @ApiModelProperty(value = "单据号")
    private String code;
    /**
     * å€Ÿå…¥éƒ¨é—¨
     */
    @Excel(name = "借入部门", width = 15, dictTable = "mdc_production", dicText = "production_name", dicCode = "id")
    @ApiModelProperty(value = "借入部门")
    @Dict(dicCode = "mdc_production, production_name, id")
    private String leanDepartId;
    /**
     * å€Ÿå…¥è´£ä»»äºº
     */
    @Excel(name = "借入责任人", width = 15)
    @ApiModelProperty(value = "借入责任人")
    @Dict(dicCode = "sys_user, realname, username")
    private String leanPerson;
    /**
     * å€Ÿç”¨åŽŸå› 
     */
    @ApiModelProperty(value = "借用原因")
    private String leanReason;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    @ApiModelProperty(value = "审批类型")
    @Dict(dicCode = "approved_rejected")
    private String approvalDealType;
    /**
     * å€Ÿå‡ºçŠ¶æ€
     */
    @Excel(name = "借出状态", width = 15)
    @ApiModelProperty(value = "借出状态")
    @Dict(dicCode = "equipment_lean_out_status")
    private String leanStatus;
    /**
     * å€Ÿå‡ºå¼€å§‹æ—¶é—´
     */
    @ApiModelProperty(value = "借出时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date leanStartTime;
    /**
     * å€Ÿå‡ºå½’还时间
     */
    @ApiModelProperty(value = "归还时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date leanEndTime;
    /**
     * å®¡æ ¸äºº
     */
    @Excel(name = "审核人", width = 15)
    @ApiModelProperty(value = "审核人")
    @Dict(dicCode = "sys_user, realname, username")
    private String approvalUser;
    /**
     * å®¡æ ¸æ„è§
     */
    @Excel(name = "审核意见", width = 15)
    @ApiModelProperty(value = "审核意见")
    private String approvalComment;
    /**
     * å®¡æ ¸æ—¶é—´
     */
    @ApiModelProperty(value = "审核时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date approvalTime;
    /**
     * ç¡®è®¤äºº
     */
    @Excel(name = "确认人", width = 15)
    @ApiModelProperty(value = "确认人")
    @Dict(dicCode = "sys_user, realname, username")
    private String confirmUser;
    /**
     * ç¡®è®¤æ„è§
     */
    @Excel(name = "确认意见", width = 15)
    @ApiModelProperty(value = "确认意见")
    private String confirmComment;
    /**
     * ç¡®è®¤æ—¶é—´
     */
    @ApiModelProperty(value = "确认时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date confirmTime;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "归还备注", width = 15)
    @ApiModelProperty(value = "归还备注")
    private String returnComment;
    //列表展示
    @TableField(exist = false)
    private String equipmentCode;
    @TableField(exist = false)
    private String equipmentName;
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentLeanOutService.java
@@ -5,6 +5,7 @@
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
/**
 * @Description: è®¾å¤‡å€Ÿå‡ºå½’还
@@ -50,5 +51,5 @@
     * @param request
     * @return
     */
    EamEquipmentLeanOut approval(EamEquipmentLeanOut request);
    EamEquipmentLeanOut approval(EamEquipmentLeanOutRequest request);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.eam.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,18 +10,19 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.DataBaseConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.eam.constant.AssetStatusEnum;
import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
import org.jeecg.modules.eam.constant.*;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import org.jeecg.modules.eam.mapper.EamEquipmentLeanOutMapper;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
import org.jeecg.modules.eam.service.IEamEquipmentLeanOutService;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
@@ -229,6 +231,10 @@
        variables.put("NextAssignee", usernames);
        Result result = flowDefinitionService.startProcessInstanceByKey("equipment_lean_out", variables);
        if (result != null) {
            entity.setLeanStartTime(new Date());
            entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_APPROVAL.name());
            //保存工单
            equipmentLeanOutMapper.updateById(entity);
            return result.isSuccess();
        }
        return true;
@@ -236,41 +242,112 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public EamEquipmentLeanOut approval(EamEquipmentLeanOut eamEquipmentLeanOut) {
        try {
            // æ£€æŸ¥è¯·æ±‚参数
            if (!isValidRequest(eamEquipmentLeanOut)) {
                throw new JeecgBootException("非法参数");
            }
            if (EquipmentLeanOutStatusEnum.WAIT_APPROVAL.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_RETURN.name());
                // å¾…归还
            } else if (EquipmentLeanOutStatusEnum.WAIT_RETURN.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                // å¾…确认
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name());
            } else if (EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                // å·²å®Œæˆ
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
            }
            // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
            LoginUser sysUser = getCurrentUser();
            if (sysUser == null || StrUtil.isBlank(sysUser.getId())) {
                throw new JeecgBootException("账号不存在");
            }
            // å®¡æ‰¹äºº
            eamEquipmentLeanOut.setApprovalUser(sysUser.getUsername());
            //检查设备
            EamEquipment equipment = eamEquipmentService.getById(eamEquipmentLeanOut.getEquipmentId());
            if (equipment == null) {
                throw new JeecgBootException("设备不存在!");
            }
            eamEquipmentLeanOut.setLeanPerson(sysUser.getUsername());
            this.updateById(eamEquipmentLeanOut);
            // èŽ·å–æµç¨‹ä¸šåŠ¡è®°å½•
            return eamEquipmentLeanOut;
        } catch (Exception e) {
            throw new JeecgBootException("操作失败:" + e.getMessage());
    public EamEquipmentLeanOut approval(EamEquipmentLeanOutRequest request) {
        EamEquipmentLeanOut entity = equipmentLeanOutMapper.selectById(request.getId());
        if (entity == null) {
            throw new JeecgBootException("审批的数据已删除,请刷新重试!");
        }
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (user == null || StrUtil.isBlank(user.getId())) {
            throw new JeecgBootException("未获取到登录用户,请重新登录后再试!");
        }
        request.setApprovalUser(user.getUsername());
        // èŽ·å–æµç¨‹ä¸šåŠ¡è®°å½•
        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(request.getInstanceId());
        if (flowMyBusiness == null) {
            throw new JeecgBootException("流程实例不存在,请刷新后重试!");
        }
        boolean userAuthorized = isUserAuthorized(flowMyBusiness, user);
        if (!userAuthorized) {
            throw new JeecgBootException("用户无权操作此任务,请刷新后重试!");
        }
        // è®¤é¢†ä»»åŠ¡
        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
            throw new JeecgBootException("任务不存在、已完成或已被他人认领!");
        }
        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
        if (equipment == null) {
            throw new JeecgBootException("设备不存在,请检查!");
        }
        EquipmentLeanOutStatusEnum status = EquipmentLeanOutStatusEnum.getInstance(entity.getLeanStatus());
        if (status == null) {
            return null;
        }
        //流程变量
        Map<String, Object> values = new HashMap<>();
        switch (status) {
            // å®¡æ‰¹
            case WAIT_APPROVAL:
                //执行完成
                values.put("dataId", entity.getId());
                values.put("organization", request.getApprovalComment());
                values.put("comment", request.getApprovalComment());
                values.put("approvalDealType", request.getApprovalDealType());
                request.setComment(request.getApprovalComment());
                entity.setApprovalUser(user.getUsername());// å®¡æ ¸äºº
                entity.setApprovalComment(request.getApprovalComment());// å®¡æ ¸æ„è§
                entity.setApprovalTime(new Date());// å®¡æ ¸æ—¶é—´
                entity.setApprovalDealType(request.getApprovalDealType()); // å®¡æ‰¹ç±»åž‹
                // éªŒè¯é€šè¿‡è¿˜æ˜¯é©³å›ž
                if (request.getApprovalDealType().equals("1")) {
                    //设置entity
                    entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_RETURN.name());
                    List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getLeanPerson()));
                    values.put("NextAssignee", userApprovalList);
                } else {
                    //设置entity
                    entity.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
                }
                break;
            // å½’还
            case WAIT_RETURN:
                if (StringUtils.isBlank(equipment.getEquipmentManager())) {
                    throw new JeecgBootException("设备未分配设备管理员,无法进入下级审批!");
                }
                List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getLeanPerson()));
                userApprovalList.add(equipment.getEquipmentManager());
                values.put("dataId", entity.getId());
                values.put("organization", request.getReturnComment());
                values.put("comment", request.getReturnComment());
                values.put("NextAssignee", userApprovalList);
                request.setComment(request.getReturnComment());
                entity.setLeanEndTime(new Date()); //归还时间
                //设置entity
                entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name());
                entity.setApprovalUser(user.getUsername());// å®¡æ ¸äºº
                entity.setLeanEndTime(new Date());// å½’还时间
                entity.setReturnComment(request.getReturnComment());// å½’还备注
                break;
            // å½’还确认
            case WAIT_CONFIRM:
                values.put("dataId", entity.getId());
                values.put("organization", request.getConfirmComment());
                values.put("comment", request.getConfirmComment());
                request.setComment(request.getConfirmComment());
                //设置entity
                entity.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
                entity.setConfirmUser(user.getUsername());
                entity.setConfirmComment(request.getConfirmComment());
                entity.setConfirmTime(new Date());
                // ä¿®æ”¹è®¾å¤‡çŠ¶æ€
                equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
                eamEquipmentService.updateById(equipment);
                break;
        }
        request.setValues(values);
        // å®Œæˆæµç¨‹ä»»åŠ¡
        Result result = flowTaskService.complete(request);
        if (!result.isSuccess()) {
            throw new JeecgBootException("审批失败,请刷新查看!");
        }
        //保存工单
        equipmentLeanOutMapper.updateById(entity);
        return entity;
    }
@@ -281,17 +358,28 @@
        business.getActStatus();
    }
    private boolean isValidRequest(EamEquipmentLeanOut request) {
        return StrUtil.isNotBlank(request.getCode()) && StrUtil.isNotBlank(request.getEquipmentId());
    private boolean claimTask(String taskId, LoginUser user) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            return false;
        }
        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
            return false;
        }
        taskService.claim(taskId, user.getUsername());
        return true;
    }
    private LoginUser getCurrentUser() {
        try {
            return (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {
            return null;
        }
    /**
     * åˆ¤æ–­ç”¨æˆ·æ˜¯å¦æ‹¥æœ‰æ­¤æƒé™
     *
     * @param flowMyBusiness
     * @param user
     * @return
     */
    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
        return todoUsers != null && todoUsers.contains(user.getUsername());
    }
    @Override
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/OutboundOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
package org.jeecg.modules.tms.controller;
import org.jeecg.common.system.query.QueryGenerator;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
import org.jeecg.modules.tms.enums.OutBillStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import java.util.Arrays;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.tms.entity.OutboundDetail;
import org.jeecg.modules.tms.entity.OutboundOrder;
import org.jeecg.modules.tms.service.IOutboundOrderService;
import org.jeecg.modules.tms.service.IOutboundDetailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 /**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Api(tags="tms_outbound_order")
@RestController
@RequestMapping("/tms/outboundOrder")
@Slf4j
public class OutboundOrderController extends JeecgController<OutboundOrder, IOutboundOrderService> {
    @Autowired
    private IOutboundOrderService outboundOrderService;
    @Autowired
    private IOutboundDetailService outboundDetailService;
    /*---------------------------------主表处理-begin-------------------------------------*/
    /**
     * åˆ†é¡µåˆ—表查询
     * @param outboundOrder
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "tms_outbound_order-分页列表查询")
    @ApiOperation(value="tms_outbound_order-分页列表查询", notes="tms_outbound_order-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<OutboundOrder>> queryPageList(OutboundOrder outboundOrder,
                                   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                   HttpServletRequest req) {
        Map<String, String[]> parameterMap = req.getParameterMap();
        QueryWrapper<OutboundOrder> queryWrapper = QueryGenerator.initQueryWrapper(outboundOrder, parameterMap);
        Page<OutboundOrder> page = new Page<OutboundOrder>(pageNo, pageSize);
        IPage<OutboundOrder> pageList = outboundOrderService.queryPageList(page, parameterMap);
        return Result.OK(pageList);
    }
    /**
     *   æ·»åŠ 
     * @param outboundOrder
     * @return
     */
    @AutoLog(value = "tms_outbound_order-添加")
    @ApiOperation(value="tms_outbound_order-添加", notes="tms_outbound_order-添加")
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:add")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody OutboundOrder outboundOrder) {
        outboundOrderService.save(outboundOrder);
        return Result.OK("添加成功!");
    }
    @AutoLog(value = "tms_outbound_order-添加出库申请单主表及明细信息")
    @ApiOperation(value="tms_outbound_order-添加出库申请单主表及明细信息", notes="tms_outbound_order-添加出库申请单主表及明细信息")
    @PostMapping(value = "/addTotal")
    public Result<String> addTotal(@RequestBody OutboundOrderAndDetailDto outboundOrder) {
        outboundOrderService.addTotal(outboundOrder);
        return Result.OK("添加成功!");
    }
    @AutoLog(value = "tms_outbound_order-编辑出库申请单主表及明细信息")
    @ApiOperation(value="tms_outbound_order-编辑出库申请单主表及明细信息", notes="tms_outbound_order-编辑出库申请单主表及明细信息")
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:edit")
    @RequestMapping(value = "/editTotal", method = {RequestMethod.PUT,RequestMethod.POST})
    public Result<String> editTotal(@RequestBody OutboundOrderAndDetailDto outboundOrder) {
        outboundOrderService.editTotal(outboundOrder);
        return Result.OK("编辑成功!");
    }
    /**
     *  ç¼–辑
     * @param outboundOrder
     * @return
     */
    @AutoLog(value = "tms_outbound_order-编辑")
    @ApiOperation(value="tms_outbound_order-编辑", notes="tms_outbound_order-编辑")
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
    public Result<String> edit(@RequestBody OutboundOrder outboundOrder) {
        outboundOrderService.updateById(outboundOrder);
        return Result.OK("编辑成功!");
    }
    @AutoLog(value = "tms_outbound_order-提交出库申请单")
    @ApiOperation(value="tms_outbound_order-提交出库申请单", notes="tms_outbound_order-提交出库申请单")
    @GetMapping(value = "/submit")
    public Result<String> submit(@RequestParam(name="id") String id) {
        OutboundOrder order = new OutboundOrder();
        order.setId(id);
        order.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
        outboundOrderService.updateById(order);
        //开启流程
        return Result.OK("提交成功!");
    }
    /**
     * é€šè¿‡id删除
     * @param id
     * @return
     */
    @AutoLog(value = "tms_outbound_order-通过id删除")
    @ApiOperation(value="tms_outbound_order-通过id删除", notes="tms_outbound_order-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name="id",required=true) String id) {
        outboundOrderService.delMain(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     * @param ids
     * @return
     */
    @AutoLog(value = "tms_outbound_order-批量删除")
    @ApiOperation(value="tms_outbound_order-批量删除", notes="tms_outbound_order-批量删除")
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
        this.outboundOrderService.delBatchMain(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * å¯¼å‡º
     * @return
     */
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, OutboundOrder outboundOrder) {
        return super.exportXls(request, outboundOrder, OutboundOrder.class, "tms_outbound_order");
    }
    /**
     * å¯¼å…¥
     * @return
     */
    //@RequiresPermissions("org.jeecg.modules:tms_outbound_order:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, OutboundOrder.class);
    }
    /*---------------------------------主表处理-end-------------------------------------*/
    /*--------------------------------子表处理-出库申请单明细-begin----------------------------------------------*/
    /**
     * é€šè¿‡ä¸»è¡¨ID查询
     * @return
     */
    //@AutoLog(value = "出库申请单明细-通过主表ID查询")
    @ApiOperation(value="出库申请单明细-通过主表ID查询", notes="出库申请单明细-通过主表ID查询")
    @GetMapping(value = "/listOutboundDetailByMainId")
    public Result<IPage<OutboundDetailVo>> listOutboundDetailByMainId(OutboundDetail outboundDetail,
                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                    HttpServletRequest req) {
        Map<String, String[]> parameterMap = req.getParameterMap();
        QueryWrapper<OutboundDetail> queryWrapper = QueryGenerator.initQueryWrapper(outboundDetail, parameterMap);
        Page<OutboundDetail> page = new Page<OutboundDetail>(pageNo, pageSize);
        IPage<OutboundDetailVo> pageList = outboundDetailService.queryPageList(page, parameterMap);
        return Result.OK(pageList);
    }
    /**
     * æ·»åŠ 
     * @param outboundDetail
     * @return
     */
    @AutoLog(value = "出库申请单明细-添加")
    @ApiOperation(value="出库申请单明细-添加", notes="出库申请单明细-添加")
    @PostMapping(value = "/addOutboundDetail")
    public Result<String> addOutboundDetail(@RequestBody OutboundDetail outboundDetail) {
        outboundDetailService.save(outboundDetail);
        return Result.OK("添加成功!");
    }
    /**
     * ç¼–辑
     * @param outboundDetail
     * @return
     */
    @AutoLog(value = "出库申请单明细-编辑")
    @ApiOperation(value="出库申请单明细-编辑", notes="出库申请单明细-编辑")
    @RequestMapping(value = "/editOutboundDetail", method = {RequestMethod.PUT,RequestMethod.POST})
    public Result<String> editOutboundDetail(@RequestBody OutboundDetail outboundDetail) {
        outboundDetailService.updateById(outboundDetail);
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     * @param id
     * @return
     */
    @AutoLog(value = "出库申请单明细-通过id删除")
    @ApiOperation(value="出库申请单明细-通过id删除", notes="出库申请单明细-通过id删除")
    @DeleteMapping(value = "/deleteOutboundDetail")
    public Result<String> deleteOutboundDetail(@RequestParam(name="id",required=true) String id) {
        outboundDetailService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     * @param ids
     * @return
     */
    @AutoLog(value = "出库申请单明细-批量删除")
    @ApiOperation(value="出库申请单明细-批量删除", notes="出库申请单明细-批量删除")
    @DeleteMapping(value = "/deleteBatchOutboundDetail")
    public Result<String> deleteBatchOutboundDetail(@RequestParam(name="ids",required=true) String ids) {
        this.outboundDetailService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * å¯¼å‡º
     * @return
     */
    @RequestMapping(value = "/exportOutboundDetail")
    public ModelAndView exportOutboundDetail(HttpServletRequest request, OutboundDetail outboundDetail) {
         // Step.1 ç»„装查询条件
         QueryWrapper<OutboundDetail> queryWrapper = QueryGenerator.initQueryWrapper(outboundDetail, request.getParameterMap());
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         // Step.2 èŽ·å–å¯¼å‡ºæ•°æ®
         List<OutboundDetail> pageList = outboundDetailService.list(queryWrapper);
         List<OutboundDetail> exportList = null;
         // è¿‡æ»¤é€‰ä¸­æ•°æ®
         String selections = request.getParameter("selections");
         if (oConvertUtils.isNotEmpty(selections)) {
             List<String> selectionList = Arrays.asList(selections.split(","));
             exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
         } else {
             exportList = pageList;
         }
         // Step.3 AutoPoi å¯¼å‡ºExcel
         ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
         //此处设置的filename无效,前端会重更新设置一下
         mv.addObject(NormalExcelConstants.FILE_NAME, "出库申请单明细");
         mv.addObject(NormalExcelConstants.CLASS, OutboundDetail.class);
         mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("出库申请单明细报表", "导出人:" + sysUser.getRealname(), "出库申请单明细"));
         mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
         return mv;
    }
    /**
     * å¯¼å…¥
     * @return
     */
    @RequestMapping(value = "/importOutboundDetail/{mainId}")
    public Result<?> importOutboundDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") String mainId) {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
       // èŽ·å–ä¸Šä¼ æ–‡ä»¶å¯¹è±¡
             MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setNeedSave(true);
             try {
                 List<OutboundDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), OutboundDetail.class, params);
                 for (OutboundDetail temp : list) {
                    temp.setOutStorehouseId(mainId);
                 }
                 long start = System.currentTimeMillis();
                 outboundDetailService.saveBatch(list);
                 log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
                 return Result.OK("文件导入成功!数据行数:" + list.size());
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
                 return Result.error("文件导入失败:" + e.getMessage());
             } finally {
                 try {
                     file.getInputStream().close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
         return Result.error("文件导入失败!");
    }
    /*--------------------------------子表处理-出库申请单明细-end----------------------------------------------*/
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package org.jeecg.modules.tms.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import org.jeecg.common.aspect.annotation.Dict;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.UnsupportedEncodingException;
/**
 * @Description: å‡ºåº“申请单明细
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Data
@TableName("tms_outbound_detail")
@ApiModel(value="tms_outbound_detail对象", description="出库申请单明细")
public class OutboundDetail implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**出库单号*/
    @ApiModelProperty(value = "出库单号")
    private String outStorehouseId;
    /**刀具编码*/
    @Excel(name = "刀具编码", width = 15)
    @ApiModelProperty(value = "刀具编码")
    private String toolCode;
    /**刀具编号*/
    @Excel(name = "刀具编号", width = 15)
    @ApiModelProperty(value = "刀具编号")
    private String toolId;
    /**申请出库数量*/
    @Excel(name = "申请出库数量", width = 15)
    @ApiModelProperty(value = "申请出库数量")
    private java.math.BigDecimal outboundQuantity;
    /**实际出库数量*/
    @Excel(name = "实际出库数量", width = 15)
    @ApiModelProperty(value = "实际出库数量")
    private java.math.BigDecimal outActualCount;
    /**出库时间*/
    @Excel(name = "出库时间", width = 15, format = "yyyy-MM-dd HH:mm")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "出库时间")
    private Date outboundTime;
    /**仓库*/
    @Excel(name = "仓库", width = 15)
    @ApiModelProperty(value = "仓库")
    @Dict(dictTable = "tms_warehouse", dicCode = "id", dicText = "warehouse_name")
    private String storageLocation;
    /**出库库位*/
    @Excel(name = "出库库位", width = 15)
    @ApiModelProperty(value = "出库库位")
    private String outboundLocation;
    /**出库状态;1.未出库;2.部分出库;3.出库完成*/
    @Excel(name = "出库状态;1.未出库;2.部分出库;3.出库完成", width = 15)
    @ApiModelProperty(value = "出库状态;1.未出库;2.部分出库;3.出库完成")
    @Dict(dicCode = "out_storehouse_status")
    private Integer status;
    /**租户号*/
    @Excel(name = "租户号", width = 15)
    @ApiModelProperty(value = "租户号")
    private String tenantId;
    /**操作员*/
    @ApiModelProperty(value = "操作员")
    private String createBy;
    /**创建时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**更新人*/
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/OutboundOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package org.jeecg.modules.tms.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import org.jeecgframework.poi.excel.annotation.Excel;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Data
@TableName("tms_outbound_order")
@ApiModel(value="tms_outbound_order对象", description="tms_outbound_order")
public class OutboundOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键id*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键id")
    private String id;
    /**出库单编号*/
    @Excel(name = "出库单编号", width = 15)
    @ApiModelProperty(value = "出库单编号")
    private String outNum;
    /**出库类型*/
    @Excel(name = "出库类型", width = 15, dicCode = "out_storehouse_type")
    @Dict(dicCode = "out_storehouse_type")
    @ApiModelProperty(value = "出库类型")
    private String outStorehouseType;
    /**是否归还;1未归还(默认);2.已归还*/
    @Excel(name = "是否归还;1未归还(默认);2.已归还", width = 15)
    @ApiModelProperty(value = "是否归还;1未归还(默认);2.已归还")
    private Integer isReturn;
    /**经手人*/
    @Excel(name = "经手人", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "id")
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
    @ApiModelProperty(value = "经手人")
    private String handler;
    /**审核人*/
    @Excel(name = "审核人", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "id")
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
    @ApiModelProperty(value = "审核人")
    private String reviewer;
    /**单子状态*/
    @Excel(name = "单子状态", width = 15)
    @ApiModelProperty(value = "单子状态")
    @Dict(dicCode = "out_bill_status")
    private String orderStatus;
    /**出库状态*/
    @Excel(name = "出库状态", width = 15)
    @ApiModelProperty(value = "出库状态")
    @Dict(dicCode = "out_storehouse_status")
    private String outStatus;
    /**审核时间*/
    @Excel(name = "审核时间", width = 15, format = "yyyy-MM-dd HH:mm")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "审核时间")
    private Date auditDate;
    /**开始时间*/
    @TableField(exist = false)
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "开始时间")
    private Date startTime;
    /**结束时间*/
    @TableField(exist = false)
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "结束时间")
    private Date endTime;
    /**审核意见*/
    @Excel(name = "审核意见", width = 15)
    @ApiModelProperty(value = "审核意见")
    private String approvalOpinion;
    /**领用事由*/
    @Excel(name = "领用事由", width = 15)
    @ApiModelProperty(value = "领用事由")
    private String subjectMatter;
    /**出库时间*/
    @Excel(name = "出库时间", width = 15, format = "yyyy-MM-dd HH:mm")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "出库时间")
    private Date outboundTime;
    /**备注*/
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**租户号*/
    @Excel(name = "租户号", width = 15)
    @ApiModelProperty(value = "租户号")
    private String tenantId;
    /**操作员*/
    @ApiModelProperty(value = "操作员")
    private String createBy;
    /**创建时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**更新人*/
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/OutboundOrderAndDetailDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package org.jeecg.modules.tms.entity.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.modules.tms.entity.OutboundDetail;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Data
@Accessors(chain = true)
@ApiModel(value="tms_outbound_order对象", description="tms_outbound_order")
public class OutboundOrderAndDetailDto implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键id*/
    @ApiModelProperty(value = "主键id")
    private String id;
    /**出库单编号*/
    @ApiModelProperty(value = "出库单编号")
    private String outNum;
    /**出库类型*/
    @Dict(dicCode = "out_storehouse_type")
    @ApiModelProperty(value = "出库类型")
    private String outStorehouseType;
    /**是否归还;1未归还(默认);2.已归还*/
    @ApiModelProperty(value = "是否归还;1未归还(默认);2.已归还")
    private Integer isReturn;
    /**经手人*/
    @ApiModelProperty(value = "经手人")
    private String handler;
    /**审核人*/
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
    @ApiModelProperty(value = "审核人")
    private String reviewer;
    /**单子状态*/
    @ApiModelProperty(value = "单子状态")
    private String orderStatus;
    /**审核时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "审核时间")
    private Date auditDate;
    /**审核意见*/
    @ApiModelProperty(value = "审核意见")
    private String approvalOpinion;
    /**领用事由*/
    @ApiModelProperty(value = "领用事由")
    private String subjectMatter;
    /**出库时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "出库时间")
    private Date outboundTime;
    /**备注*/
    @ApiModelProperty(value = "备注")
    private String remark;
    /**出库申请单明细*/
    @ApiModelProperty(value = "出库申请单明细")
    private List<OutboundDetail> outboundDetailList;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/vo/OutboundDetailVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package org.jeecg.modules.tms.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @Description: å‡ºåº“申请单明细
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Data
@ApiModel(value="出库申请单明细页面展示对象封装", description="出库申请单明细页面展示对象封装")
public class OutboundDetailVo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键*/
    @ApiModelProperty(value = "主键")
    private String id;
    /**出库单号*/
    @ApiModelProperty(value = "出库单号")
    private String outStorehouseId;
    /**刀具编码*/
    @ApiModelProperty(value = "刀具编码(tms_base_tool表主键id)")
    private String toolCode;
    /**刀具编号*/
    @ApiModelProperty(value = "刀具编号")
    private String toolId;
    /**刀具编码*/
    @ApiModelProperty(value = "刀具编码(tms_base_tool表tool_code字段)")
    private String toolNum;
    /**申请出库数量*/
    @ApiModelProperty(value = "申请出库数量")
    private java.math.BigDecimal outboundQuantity;
    /**实际出库数量*/
    @ApiModelProperty(value = "实际出库数量")
    private java.math.BigDecimal outActualCount;
    /**出库时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "出库时间")
    private Date outboundTime;
    /**仓库*/
    @ApiModelProperty(value = "仓库")
    @Dict(dictTable = "tms_warehouse", dicCode = "id", dicText = "warehouse_name")
    private String storageLocation;
    /**出库库位*/
    @ApiModelProperty(value = "出库库位")
    private String outboundLocation;
    /**出库状态;1.未出库;2.部分出库;3.出库完成*/
    @ApiModelProperty(value = "出库状态;1.未出库;2.部分出库;3.出库完成")
    @Dict(dicCode = "out_storehouse_status")
    private Integer status;
    /**操作员*/
    @ApiModelProperty(value = "操作员")
    private String createBy;
    /**创建时间*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**工具类型*/
    @Dict(dicCode = "application_type")
    @ApiModelProperty(value = "工具类型")
    private String applicationType;
    /**中文名称*/
    @ApiModelProperty(value = "中文名称")
    private String chineseName;
    /**型号/图号*/
    @ApiModelProperty(value = "型号/图号")
    private String toolModel;
    /**刀具材料*/
    @ApiModelProperty(value = "刀具材料")
    private String toolMaterial;
    /**零件材料*/
    @ApiModelProperty(value = "零件材料")
    private String partMaterial;
    /**厂家*/
    @ApiModelProperty(value = "厂家")
    private String supplierId;
    /**可用库存数量*/
    @ApiModelProperty(value = "可用库存数量")
    private java.math.BigDecimal quantity;
    /**仓库名称*/
    @ApiModelProperty(value = "仓库名称")
    private String warehouseName;
    /**台账明细表主键id*/
    @ApiModelProperty(value = "台账明细表主键id,工具选择时去重用")
    private String toolLedgerDetailId;
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/enums/OutBillStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package org.jeecg.modules.tms.enums;
import java.util.Objects;
/**
 * å‡ºåº“单状态枚举类
 */
public enum OutBillStatus {
    /**
     * è‰ç¨¿çŠ¶æ€ï¼Œå€¼ä¸º1
     */
    DRAFT("1", "草稿"),
    /**
     * å·²æäº¤çŠ¶æ€ï¼Œå€¼ä¸º2
     */
    SUBMITTED("2", "已提交"),
    /**
     * å®¡æ‰¹é€šè¿‡çŠ¶æ€ï¼Œå€¼ä¸º3
     */
    APPROVED("3", "审批通过"),
    /**
     * å®¡æ‰¹é©³å›žçŠ¶æ€ï¼Œå€¼ä¸º4
     */
    REJECTED("4", "审批驳回");
    private final String value;
    private final String description;
    /**
     * æž„造方法
     *
     * @param value       çŠ¶æ€å€¼
     * @param description çŠ¶æ€æè¿°
     */
    OutBillStatus(String value, String description) {
        this.value = value;
        this.description = description;
    }
    /**
     * èŽ·å–çŠ¶æ€å€¼
     *
     * @return çŠ¶æ€å€¼
     */
    public String getValue() {
        return value;
    }
    /**
     * èŽ·å–çŠ¶æ€æè¿°
     *
     * @return çŠ¶æ€æè¿°
     */
    public String getDescription() {
        return description;
    }
    /**
     * æ ¹æ®çŠ¶æ€å€¼èŽ·å–å¯¹åº”çš„æžšä¸¾å®žä¾‹
     *
     * @param value çŠ¶æ€å€¼
     * @return å¯¹åº”的枚举实例,如果找不到匹配的值则返回null
     */
    public static OutBillStatus fromValue(String value) {
        for (OutBillStatus status : values()) {
            if (Objects.equals(status.getValue(), value)) {
                return status;
            }
        }
        return null;
    }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutboundDetailMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
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.OutboundDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
/**
 * @Description: å‡ºåº“申请单明细
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
public interface OutboundDetailMapper extends BaseMapper<OutboundDetail> {
    /**
     * é€šè¿‡ä¸»è¡¨id删除子表数据
     *
     * @param mainId ä¸»è¡¨id
     * @return boolean
     */
    public boolean deleteByMainId(@Param("mainId") String mainId);
   /**
    * é€šè¿‡ä¸»è¡¨id查询子表数据
    *
    * @param mainId ä¸»è¡¨id
    * @return List<OutboundDetail>
    */
    public List<OutboundDetail> selectByMainId(@Param("mainId") String mainId);
    IPage<OutboundDetailVo> queryPageList(Page<OutboundDetail> page,
                                          @Param(Constants.WRAPPER) Wrapper<OutboundDetail> queryWrapper);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/OutboundOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.tms.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
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.OutboundOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
public interface OutboundOrderMapper extends BaseMapper<OutboundOrder> {
    IPage<OutboundOrder> queryPageList(Page<OutboundOrder> page,
                                       @Param(Constants.WRAPPER) Wrapper<OutboundOrder> queryWrapper);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/OutboundDetailMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
<?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.jeecg.modules.tms.mapper.OutboundDetailMapper">
    <delete id="deleteByMainId" parameterType="java.lang.String">
        DELETE
        FROM  tms_outbound_detail
        WHERE
             out_storehouse_id = #{mainId}
    </delete>
    <select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.tms.entity.OutboundDetail">
        SELECT *
        FROM  tms_outbound_detail
        WHERE
             out_storehouse_id = #{mainId}
    </select>
    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.vo.OutboundDetailVo">
        SELECT
            t1.id,
            t1.out_storehouse_id outStorehouseId,
            t1.tool_code toolCode,
            t1.tool_id toolId,
            t2.tool_code toolNum,
            t1.outbound_quantity outboundQuantity,
            t1.out_actual_count outActualCount,
            t1.outbound_time outboundTime,
            t1.storage_location storageLocation,
            t1.outbound_location outboundLocation,
            t1.status,
            t1.create_by createBy,
            t1.create_time createTime,
            t2.chinese_name chineseName,
            t2.tool_model toolModel,
            t2.parama_table_name paramaTableName,
            t3.application_type applicationType,
            t3.supplier_id supplierId,
            t11.id toolLedgerDetailId,
            t11.quantity,
            ISNULL(t12.warehouse_id, '') + '/' + ISNULL(t12.warehouse_name, '') warehouseName,
            <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_outbound_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
        LEFT JOIN tms_tool_ledger_detail t11 on t1.tool_code = t11.tool_code and t1.tool_id = t11.tool_id
        LEFT JOIN tms_warehouse t12 on t1.storage_location = t12.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/OutboundOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
<?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.jeecg.modules.tms.mapper.OutboundOrderMapper">
    <select id="queryPageList" resultType="org.jeecg.modules.tms.entity.OutboundOrder">
        SELECT
            t.id,
            t.out_num outNum,
            t.out_storehouse_type outStorehouseType,
            t.is_return isReturn,
            t.handler,
            t.reviewer,
            t.order_status orderStatus,
            t.out_status outStatus,
            t.audit_date auditDate,
            t.approval_opinion approvalOpinion,
            t.subject_matter subjectMatter,
            t.outbound_time outboundTime,
            t.remark,
            t.create_by createBy,
            t.create_time createTime
        FROM tms_outbound_order t
        ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundDetailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
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.OutboundDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
import java.util.List;
import java.util.Map;
/**
 * @Description: å‡ºåº“申请单明细
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
public interface IOutboundDetailService extends IService<OutboundDetail> {
  /**
   * é€šè¿‡ä¸»è¡¨id查询子表数据
   *
   * @param mainId
   * @return List<OutboundDetail>
   */
    public List<OutboundDetail> selectByMainId(String mainId);
    IPage<OutboundDetailVo> queryPageList(Page<OutboundDetail> page, Map<String, String[]> parameterMap);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IOutboundOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
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.OutboundDetail;
import org.jeecg.modules.tms.entity.OutboundOrder;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
public interface IOutboundOrderService extends IService<OutboundOrder> {
    /**
     * åˆ é™¤ä¸€å¯¹å¤š
     *
     * @param id
     */
    public void delMain (String id);
    /**
     * æ‰¹é‡åˆ é™¤ä¸€å¯¹å¤š
     *
     * @param idList
     */
    public void delBatchMain (Collection<? extends Serializable> idList);
    void addTotal(OutboundOrderAndDetailDto outboundOrder);
    IPage<OutboundOrder> queryPageList(Page<OutboundOrder> page, Map<String, String[]> parameterMap);
    void editTotal(OutboundOrderAndDetailDto outboundOrder);
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
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.OutboundDetail;
import org.jeecg.modules.tms.entity.vo.OutboundDetailVo;
import org.jeecg.modules.tms.mapper.OutboundDetailMapper;
import org.jeecg.modules.tms.service.IOutboundDetailService;
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;
/**
 * @Description: å‡ºåº“申请单明细
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Service
public class OutboundDetailServiceImpl extends ServiceImpl<OutboundDetailMapper, OutboundDetail> implements IOutboundDetailService {
    @Autowired
    private OutboundDetailMapper outboundDetailMapper;
    @Override
    public List<OutboundDetail> selectByMainId(String mainId) {
        return outboundDetailMapper.selectByMainId(mainId);
    }
    @Override
    public IPage<OutboundDetailVo> queryPageList(Page<OutboundDetail> page, Map<String, String[]> parameterMap) {
        QueryWrapper<OutboundDetail> queryWrapper = Wrappers.query();
        String[] outStorehouseIds = parameterMap.get("outStorehouseId");
        if (outStorehouseIds != null && outStorehouseIds.length > 0) {
            queryWrapper.eq("t1.out_storehouse_id", outStorehouseIds[0]);
        }
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
package org.jeecg.modules.tms.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
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.entity.OutboundOrder;
import org.jeecg.modules.tms.entity.OutboundDetail;
import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
import org.jeecg.modules.tms.enums.OutBillStatus;
import org.jeecg.modules.tms.mapper.OutboundDetailMapper;
import org.jeecg.modules.tms.mapper.OutboundOrderMapper;
import org.jeecg.modules.tms.service.IOutboundDetailService;
import org.jeecg.modules.tms.service.IOutboundOrderService;
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.util.Map;
import java.util.Objects;
/**
 * @Description: tms_outbound_order
 * @Author: jeecg-boot
 * @Date:   2025-05-16
 * @Version: V1.0
 */
@Service
public class OutboundOrderServiceImpl extends ServiceImpl<OutboundOrderMapper, OutboundOrder> implements IOutboundOrderService {
    @Autowired
    private IOutboundDetailService outboundDetailService;
    @Autowired
    private ISysBusinessCodeRuleService businessCodeRuleService;
    @Autowired
    private OutboundOrderMapper outboundOrderMapper;
    @Autowired
    private OutboundDetailMapper outboundDetailMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delMain(String id) {
        outboundDetailMapper.deleteByMainId(id);
        outboundOrderMapper.deleteById(id);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delBatchMain(Collection<? extends Serializable> idList) {
        for(Serializable id:idList) {
            outboundDetailMapper.deleteByMainId(id.toString());
            outboundOrderMapper.deleteById(id);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addTotal(OutboundOrderAndDetailDto outboundOrder) {
        OutboundOrder order = BeanUtil.copyProperties(outboundOrder, OutboundOrder.class);
        order.setHandler(Objects.requireNonNull(getCurrentUser()).getId());
        order.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"));
        order.setOrderStatus(OutBillStatus.DRAFT.getValue());
        save(order);
        List<OutboundDetail> detailList = CollectionUtil.newArrayList();
        outboundOrder.getOutboundDetailList().forEach(item->{
            item.setOutStorehouseId(order.getId());
            detailList.add(item);
        });
        outboundDetailService.saveBatch(detailList);
    }
    @Override
    public IPage<OutboundOrder> queryPageList(Page<OutboundOrder> page, Map<String, String[]> parameterMap) {
        QueryWrapper<OutboundOrder> queryWrapper = Wrappers.query();
        String[] outNums = parameterMap.get("outNum");
        if (outNums != null && outNums.length > 0) {
            queryWrapper.like("t.out_num", outNums[0]);
        }
        String[] outStorehouseTypes = parameterMap.get("outStorehouseType");
        if (outStorehouseTypes != null && outStorehouseTypes.length > 0) {
            queryWrapper.eq("t.out_storehouse_type", outStorehouseTypes[0]);
        }
        String[] statuses = parameterMap.get("orderStatus");
        if (statuses != null && statuses.length > 0) {
            queryWrapper.eq("t.order_status", statuses[0]);
        }
        String[] startTimes = parameterMap.get("startTime");
        if (startTimes != null && startTimes.length > 0) {
            queryWrapper.ge("t.create_time", startTimes[0]);
        }
        String[] endTimes = parameterMap.get("endTime");
        if (endTimes != null && endTimes.length > 0) {
            queryWrapper.le("t.create_time", endTimes[0]);
        }
        queryWrapper.orderByDesc("t.create_time");
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void editTotal(OutboundOrderAndDetailDto outboundOrder) {
        //删除所有明细
        outboundDetailService.remove(new LambdaQueryWrapper<OutboundDetail>()
                .eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()));
        OutboundOrder outboundOrderUpdate = BeanUtil.copyProperties(outboundOrder, OutboundOrder.class);
        outboundOrderMapper.updateById(outboundOrderUpdate);
        List<OutboundDetail> detailList = CollectionUtil.newArrayList();
        outboundOrder.getOutboundDetailList().forEach(item->{
            item.setOutStorehouseId(outboundOrderUpdate.getId());
            detailList.add(item);
        });
        outboundDetailService.saveBatch(detailList);
    }
    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;
    }
}
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ToolLedgerDetailServiceImpl.java
@@ -8,9 +8,7 @@
import org.jeecg.modules.tms.mapper.ToolLedgerDetailMapper;
import org.jeecg.modules.tms.service.IToolLedgerDetailService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Map;
/**
@@ -33,6 +31,11 @@
        if (statuses != null && statuses.length > 0) {
            queryWrapper.eq("t.status", statuses[0]);
        }
        String[] excludeIds = parameterMap.get("excludeIds");
        if (excludeIds != null && excludeIds.length > 0) {
            String[] idArray = excludeIds[0].split(",");
            queryWrapper.notIn("t.id", idArray);
        }
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
}