huminmin
2026-05-12 ce1ea9ac3806578719070a463ef7381a0d3c5148
分派生产单到班组长,班组长:排产工单到班组成员
已添加1个文件
已修改20个文件
246 ■■■■■ 文件已修改
doc/20260511_create_table_production_team.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/TeamLeaderVo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionTeamController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionTeamUserRelController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionTeamUserRelMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOperationTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionOperationTaskService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionTeamUserRelService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionTeamUserRelServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionTeamUserRelMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260511_create_table_production_team.sql
@@ -26,3 +26,9 @@
    index              idx_sys_user_id (sys_user_id),
    unique idx_production_team_user (production_team_id, sys_user_id)
);
alter table production_order add column team_leader_user_id bigint not null default 0 comment '班组长ID';
alter table production_order add index idx_team_leader_user_id (team_leader_user_id);
alter table production_operation_task
    add team_user_id bigint default 0 not null comment '班组团员用户id';
src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java
@@ -44,4 +44,7 @@
    @Schema(description = "结束日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    @Schema(description = "班组成员用户ID")
    private Long teamUserId;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -55,4 +55,6 @@
    @Schema(description = "销售合同号")
    private String salesContractNo;
    @Schema(description = "班组长ID")
    private Long leaderId;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java
@@ -49,4 +49,16 @@
    @Schema(description = "类型 åŒºåˆ†è®¡æ—¶å’Œè®¡ä»¶(0计时1计件)")
    private Integer type;
    @Schema(description = "班组长名称")
    private String leaderName;
    @Schema(description = "班组长用户ID")
    private Long leaderUserId;
    @Schema(description = "班组团员用户ID")
    private Long teamUserId;
    @Schema(description = "班组团员名称")
    private String teamUserName;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -44,4 +44,7 @@
    @Schema(description = "是否已退料")
    private Boolean returned;
    @Schema(description = "班组长昵称")
    private String teamLeaderUserName;
}
src/main/java/com/ruoyi/production/bean/vo/TeamLeaderVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.production.bean.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class TeamLeaderVo extends ProductionTeamVo.MemberVo {
    @Schema(description = "班组ID")
    private Long productionTeamId;
    @Schema(description = "班组名称")
    private String teamName;
}
src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
@@ -70,6 +70,12 @@
        return R.ok(productionOperationTaskService.assign(dto));
    }
    @Operation(summary = "指派班组成员")
    @PostMapping("/assignTeamUser")
    public R<Boolean> assignTeamUser(@RequestBody ProductionOperationTaskDto dto) {
        return R.ok(productionOperationTaskService.assignTeamUser(dto));
    }
    @PostMapping("/down")
    @Operation(summary = "工单流转卡下载")
    public void down(HttpServletResponse response, @RequestBody ProductionOperationTaskDto dto) {
src/main/java/com/ruoyi/production/controller/ProductionTeamController.java
@@ -8,6 +8,7 @@
import com.ruoyi.production.service.ProductionTeamService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -17,15 +18,12 @@
 * ç”Ÿäº§ç­ç»„控制器
 */
@RestController
@RequestMapping("/production_team")
@RequestMapping("/productionTeam")
@Tag(name = "生产班组管理", description = "生产班组增删改查接口")
@AllArgsConstructor
public class ProductionTeamController {
    private final ProductionTeamService productionTeamService;
    public ProductionTeamController(ProductionTeamService productionTeamService) {
        this.productionTeamService = productionTeamService;
    }
    private ProductionTeamService productionTeamService;
    /**
     * åˆ›å»ºç­ç»„
src/main/java/com/ruoyi/production/controller/ProductionTeamUserRelController.java
@@ -1,7 +1,18 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionTeamDto;
import com.ruoyi.production.bean.vo.ProductionTeamVo;
import com.ruoyi.production.bean.vo.TeamLeaderVo;
import org.springframework.web.bind.annotation.RequestParam;
import com.ruoyi.production.service.ProductionTeamUserRelService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * <p>
@@ -13,6 +24,24 @@
 */
@RestController
@RequestMapping("/productionTeamUserRel")
@AllArgsConstructor
public class ProductionTeamUserRelController {
    private ProductionTeamUserRelService productionTeamUserRelService;
    /**
     * æŸ¥è¯¢ç­ç»„长列表
     */
    @GetMapping("/leaderList")
    @Operation(summary = "查询班组长列表", description = "查询生产班组班组长列表")
    public R<List<TeamLeaderVo>> getTeamLeaderList() {
        return R.ok(productionTeamUserRelService.listAllLeaders());
    }
    /**
     * æ ¹æ®ç­ç»„长用户ID查询班组成员列表
     */
    @GetMapping("/memberListByLeader")
    @Operation(summary = "根据班组长查询班组成员", description = "根据班组长用户ID查询所属班组的成员列表")
    public R<List<ProductionTeamVo.MemberVo>> getMemberListByLeader(@RequestParam Long leaderUserId) {
        return R.ok(productionTeamUserRelService.listTeamMembersByLeader(leaderUserId));
    }
}
src/main/java/com/ruoyi/production/mapper/ProductionTeamUserRelMapper.java
@@ -1,8 +1,12 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.bean.vo.ProductionTeamVo;
import com.ruoyi.production.bean.vo.TeamLeaderVo;
import com.ruoyi.production.pojo.ProductionTeamUserRel;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * <p>
@@ -15,4 +19,16 @@
@Mapper
public interface ProductionTeamUserRelMapper extends BaseMapper<ProductionTeamUserRel> {
    /**
     * æŸ¥è¯¢æ‰€æœ‰ç­ç»„长信息(包含用户名称和班组名称)
     * @return ç­ç»„长信息列表
     */
    List<TeamLeaderVo> selectAllLeaders();
    /**
     * æ ¹æ®ç­ç»„长用户ID查询班组成员列表
     * @param leaderUserId ç­ç»„长用户ID
     * @return ç­ç»„成员列表
     */
    List<ProductionTeamVo.MemberVo> selectTeamMembersByLeader(Long leaderUserId);
}
src/main/java/com/ruoyi/production/pojo/ProductionOperationTask.java
@@ -76,4 +76,7 @@
    @Schema(description = "权限用户ID列表,格式:[1,2,3]。指定多个用户ID时,用逗号分隔。")
    private String userIds;
    @Schema(description = "班组成员用户ID")
    private Long teamUserId;
}
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -88,4 +88,7 @@
    @Schema(description = "是否结束)")
    @TableField("is_end_order")
    private Boolean endOrder;
    @Schema(description = "班组长ID")
    private Long teamLeaderUserId;
}
src/main/java/com/ruoyi/production/service/ProductionOperationTaskService.java
@@ -27,6 +27,13 @@
    boolean assign(ProductionOperationTaskDto dto);
    /**
     * æŒ‡æ´¾ç­ç»„成员
     * @param dto å·¥å•DTO
     * @return æ˜¯å¦æˆåŠŸ
     */
    boolean assignTeamUser(ProductionOperationTaskDto dto);
    void down(HttpServletResponse response, ProductionOperationTaskDto dto);
    List<ProductionOperationTaskVo> getOperation(ProductionOperationTaskDto dto);
src/main/java/com/ruoyi/production/service/ProductionTeamUserRelService.java
@@ -1,7 +1,11 @@
package com.ruoyi.production.service;
import com.ruoyi.production.pojo.ProductionTeamUserRel;
import com.ruoyi.production.bean.vo.ProductionTeamVo;
import com.ruoyi.production.bean.vo.TeamLeaderVo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.pojo.ProductionTeamUserRel;
import java.util.List;
/**
 * <p>
@@ -13,4 +17,16 @@
 */
public interface ProductionTeamUserRelService extends IService<ProductionTeamUserRel> {
    /**
     * èŽ·å–æ‰€æœ‰ç­ç»„é•¿é›†åˆ
     * @return ç­ç»„长集合
     */
    List<TeamLeaderVo> listAllLeaders();
    /**
     * æ ¹æ®ç­ç»„长用户ID获取班组成员列表
     * @param leaderUserId ç­ç»„长用户ID
     * @return ç­ç»„成员列表
     */
    List<ProductionTeamVo.MemberVo> listTeamMembersByLeader(Long leaderUserId);
}
src/main/java/com/ruoyi/production/service/impl/ProductionOperationTaskServiceImpl.java
@@ -126,6 +126,26 @@
        return true;
    }
    @Override
    public boolean assignTeamUser(ProductionOperationTaskDto dto) {
        // æŒ‡æ´¾ç­ç»„成员
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("工单ID不能为空");
        }
        if (dto.getTeamUserId() == null) {
            throw new ServiceException("班组用户ID不能为空");
        }
        ProductionOperationTask update = new ProductionOperationTask();
        update.setId(dto.getId());
        update.setTeamUserId(dto.getTeamUserId());
        int rows = baseMapper.updateById(update);
        if (rows <= 0) {
            throw new ServiceException("工单不存在或已删除");
        }
        return true;
    }
    private LambdaQueryWrapper<ProductionOperationTask> buildQueryWrapper(ProductionOperationTaskDto dto) {
        // æŒ‰æ¡ä»¶åŠ¨æ€æž„å»ºæ•°æ®åº“æŸ¥è¯¢æ¡ä»¶
        ProductionOperationTask query = dto == null ? new ProductionOperationTask() : dto;
src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java
@@ -7,6 +7,7 @@
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.production.bean.dto.ProductionOrderPickDto;
import com.ruoyi.production.bean.vo.ProductionOrderPickVo;
@@ -61,6 +62,9 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean savePick(ProductionOrderPickDto dto) {
        // æ ¡éªŒå½“前用户必须为订单班组长
        validateTeamLeader(dto);
        // é¢†æ–™æ–°å¢žæ€»æµç¨‹ï¼š
        // 1) è§£æžå‰ç«¯è¡Œæ•°æ®å¹¶é€è¡Œåˆå¹¶å‚æ•°ï¼›
        // 2) æ ¡éªŒå‚数与批次;
@@ -1178,4 +1182,36 @@
        // æ•°é‡æ ¼å¼åŒ–输出(去除末尾无效0)。
        return defaultDecimal(value).stripTrailingZeros().toPlainString();
    }
    /**
     * æ ¡éªŒå½“前用户必须为订单班组长
     * @param dto é¢†æ–™DTO
     */
    private void validateTeamLeader(ProductionOrderPickDto dto) {
        // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·ID
        Long currentUserId = SecurityUtils.getLoginUser().getUserId();
        // èŽ·å–ç”Ÿäº§è®¢å•ID
        Long productionOrderId = resolveProductionOrderId(dto);
        if (productionOrderId == null) {
            throw new ServiceException("生产订单ID不能为空");
        }
        // æŸ¥è¯¢ç”Ÿäº§è®¢å•
        ProductionOrder productionOrder = productionOrderMapper.selectById(productionOrderId);
        if (productionOrder == null) {
            throw new ServiceException("生产订单不存在");
        }
        // èŽ·å–è®¢å•çš„ç­ç»„é•¿ID
        Long teamLeaderUserId = productionOrder.getTeamLeaderUserId();
        if (teamLeaderUserId == null) {
            throw new ServiceException("该订单未设置班组长");
        }
        // æ ¡éªŒå½“前用户是否为班组长
        if (!Objects.equals(currentUserId, teamLeaderUserId)) {
            throw new ServiceException("当前用户不是该订单的班组长,无法进行领料操作");
        }
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -151,6 +151,7 @@
        productionOrder.setProductModelId(firstPlan.getProductModelId());
        productionOrder.setQuantity(assignedQuantity);
        productionOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
        productionOrder.setTeamLeaderUserId(productionPlanDto.getLeaderId());
        if (!productionOrderService.saveProductionOrder(productionOrder)) {
            throw new ServiceException("下发失败,生产订单保存失败");
        }
src/main/java/com/ruoyi/production/service/impl/ProductionTeamUserRelServiceImpl.java
@@ -1,11 +1,15 @@
package com.ruoyi.production.service.impl;
import com.ruoyi.production.pojo.ProductionTeamUserRel;
import com.ruoyi.production.bean.vo.ProductionTeamVo;
import com.ruoyi.production.bean.vo.TeamLeaderVo;
import com.ruoyi.production.mapper.ProductionTeamUserRelMapper;
import com.ruoyi.production.pojo.ProductionTeamUserRel;
import com.ruoyi.production.service.ProductionTeamUserRelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -15,8 +19,17 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-11 11:15:05
 */
@AllArgsConstructor
@Service
@RequiredArgsConstructor
public class ProductionTeamUserRelServiceImpl extends ServiceImpl<ProductionTeamUserRelMapper, ProductionTeamUserRel> implements ProductionTeamUserRelService {
    @Override
    public List<TeamLeaderVo> listAllLeaders() {
        return baseMapper.selectAllLeaders();
    }
    @Override
    public List<ProductionTeamVo.MemberVo> listTeamMembersByLeader(Long leaderUserId) {
        return baseMapper.selectTeamMembersByLeader(leaderUserId);
    }
}
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -25,6 +25,9 @@
        select pot.*,
               po.nps_no as npsNo,
               po.is_end_order as endOrder,
               po.team_leader_user_id as leaderUserId,
               u.nick_name as leaderName,
               teamUser.nick_name as teamUserName,
               p.product_name as productName,
               pm.model as model,
               pm.unit as unit,
@@ -41,6 +44,8 @@
                 left join production_order_routing_operation poro on pot.production_order_routing_operation_id = poro.id
                 left join product_model pm on pm.id = ifnull(poro.product_model_id, po.product_model_id)
                 left join product p on pm.product_id = p.id
                 left join sys_user u on po.team_leader_user_id = u.user_id
                 left join sys_user teamUser on pot.team_user_id = teamUser.user_id
                 left join (
            select ppm.production_operation_task_id as taskId,
                   sum(ifnull(ppo.scrap_qty, 0)) as scrapQty
src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -28,6 +28,7 @@
        <result column="model" property="model" />
        <result column="processRouteCode" property="processRouteCode" />
        <result column="returned" property="returned" />
        <result column="teamLeaderUserName" property="teamLeaderUserName" />
    </resultMap>
    <sql id="ProductionOrderVoColumns">
@@ -46,6 +47,8 @@
        po.dept_id,
        po.plan_complete_time,
        po.status,
        po.team_leader_user_id,
        sl_user.nick_name as teamLeaderUserName,
        po_sales.salesContractNo,
        po_sales.customerName,
        p.product_name as productName,
@@ -75,6 +78,7 @@
                 left join product p on pm.product_id = p.id
                 left join technology_routing tr on po.technology_routing_id = tr.id
                 left join technology_bom tb on tb.id = tr.bom_id
                 left join sys_user sl_user on sl_user.user_id = po.team_leader_user_id
                 left join (
            select production_order_id as productionOrderId,
                   if(max(case when ifnull(is_returned, 0) = 1 then 1 else 0 end) = 1, true, false) as returned
src/main/resources/mapper/production/ProductionTeamUserRelMapper.xml
@@ -13,4 +13,34 @@
        <result column="update_time" property="updateTime" />
    </resultMap>
    <!-- æŸ¥è¯¢æ‰€æœ‰ç­ç»„长信息 -->
    <select id="selectAllLeaders" resultType="com.ruoyi.production.bean.vo.TeamLeaderVo">
        SELECT
            rel.sys_user_id AS user_id,
            u.nick_name,
            rel.production_team_id,
            t.team_name
        FROM production_team_user_rel rel
        LEFT JOIN sys_user u ON rel.sys_user_id = u.user_id
        LEFT JOIN production_team t ON rel.production_team_id = t.id
        WHERE rel.is_leader = 1
        GROUP BY rel.sys_user_id, rel.production_team_id
    </select>
    <!-- æ ¹æ®ç­ç»„长用户ID查询班组成员列表 -->
    <select id="selectTeamMembersByLeader" resultType="com.ruoyi.production.bean.vo.ProductionTeamVo$MemberVo">
        SELECT
            rel.sys_user_id AS userId,
            u.nick_name,
            CASE WHEN rel.is_leader = 1 THEN TRUE ELSE FALSE END AS isLeader
        FROM production_team_user_rel rel
        LEFT JOIN sys_user u ON rel.sys_user_id = u.user_id
        WHERE rel.production_team_id IN (
            SELECT production_team_id
            FROM production_team_user_rel
            WHERE sys_user_id = #{leaderUserId} AND is_leader = 1
        )
          AND rel.is_leader = 0
    </select>
</mapper>