新火炬后端单体项目初始化代码
cuilei
7 天以前 7fc3a69a9592fde25971055ff0c98eea98188805
生产管控 排产功能接口
已添加3个文件
已修改10个文件
645 ■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/service/IShiftService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java 372 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkScheduleRequest.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/enums/ProductionWorkOrderStatus.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -4,7 +4,7 @@
  "avatar": "",
  "version": "4.9.4",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-7-28 20:46:22",
  "updatedTime": "2025-8-7 10:18:16",
  "dbConns": [],
  "profile": {
    "default": {
@@ -632,7 +632,7 @@
      "#DDE5FF"
    ],
    "DDLToggleCase": "L",
    "menuWidth": "364px"
    "menuWidth": "293px"
  },
  "entities": [
    {
@@ -11409,6 +11409,24 @@
          "extProps": {},
          "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC",
          "id": "3319292F-3CC9-4D3A-B20F-1736BFE8DE66"
        },
        {
          "defKey": "republish_reason",
          "defName": "重发布原因",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "3E948CEC-3070-472C-AF92-F3CA11EC9D15",
          "id": "2AED1385-ED6E-470E-98C0-2F077E1A3187"
        }
      ],
      "correlations": [],
src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java
@@ -9,8 +9,16 @@
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.TranslateDictTextUtils;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.base.entity.ShiftGroup;
import org.jeecg.modules.base.entity.UserGroup;
@@ -54,6 +62,11 @@
     @Autowired
     private IUserGroupService userGroupService;
     @Autowired
     private ObjectMapper objectMapper;
     @Autowired
     private TranslateDictTextUtils translateDictTextUtils;
    
    /**
     * åˆ†é¡µåˆ—表查询
@@ -157,6 +170,28 @@
        return Result.OK(shiftGroup);
    }
    @AutoLog(value = "班组人员信息-通过产线id查询其下所有班组")
    @ApiOperation(value="班组人员信息-通过产线id查询其下所有班组", notes = "班组人员信息-通过产线id查询其下所有班组")
    @GetMapping(value = "/queryShiftGroupByFactoryId")
    public Result<?> queryShiftGroupByFactoryId(@RequestParam(name="factoryId") String factoryId) {
        List<ShiftGroup> shiftGroupList = shiftGroupService.list(new LambdaQueryWrapper<ShiftGroup>()
                .eq(ShiftGroup::getFactoryId, factoryId)
                .eq(ShiftGroup::getDelFlag, CommonConstant.DEL_FLAG_0));
        JSONArray array = new JSONArray();
        for (ShiftGroup shiftGroup : shiftGroupList) {
            try {
                String json = objectMapper.writeValueAsString(shiftGroup);
                JSONObject item = JSONObject.parseObject(json);
                translateDictTextUtils.translateField("shiftId", shiftGroup.getShiftId(), item, "base_shift,shift_name,id");
                translateDictTextUtils.translateField("shiftCode", shiftGroup.getShiftId(), item, "base_shift,shift_code,id");
                array.add(item);
            } catch (JsonProcessingException e) {
                return Result.error("数据转译失败!");
            }
        }
        return Result.OK(array);
    }
    /**
    * å¯¼å‡ºexcel
    *
src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java
@@ -14,4 +14,5 @@
 */
public interface ShiftMapper extends BaseMapper<Shift> {
    List<Shift> selectShiftListByFactoryId(String factoryId);
}
src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml
@@ -2,4 +2,12 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.base.mapper.ShiftMapper">
    <select id="selectShiftListByFactoryId" resultType="org.jeecg.modules.base.entity.Shift">
        select
            t1.*,
            t2.id as group_id
        from base_shift t1
        inner join base_shift_group t2 on t1.id = t2.shift_id
        where t1.del_flag = 0 and t1.shift_status = '1' and t2.del_flag = 0 and t2.factory_id = #{factoryId}
    </select>
</mapper>
src/main/java/org/jeecg/modules/base/service/IShiftService.java
@@ -3,6 +3,8 @@
import org.jeecg.modules.base.entity.Shift;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * @Description: ç­æ¬¡
 * @Author: jeecg-boot
@@ -11,4 +13,5 @@
 */
public interface IShiftService extends IService<Shift> {
    List<Shift> selectShiftListByFactoryId(String factoryId);
}
src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java
@@ -7,6 +7,9 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collections;
import java.util.List;
/**
 * @Description: ç­æ¬¡
 * @Author: jeecg-boot
@@ -16,4 +19,8 @@
@Service
public class ShiftServiceImpl extends ServiceImpl<ShiftMapper, Shift> implements IShiftService {
    @Override
    public List<Shift> selectShiftListByFactoryId(String factoryId) {
        return this.baseMapper.selectShiftListByFactoryId(factoryId);
    }
}
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
@@ -1,16 +1,26 @@
package org.jeecg.modules.mes.controller;
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.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mes.dto.MesProductionWorkOrderRepublishRequest;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.enums.ProductionWorkOrderStatus;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -18,144 +28,258 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: æŽ’产工单
* @Author: jeecg-boot
* @Date:   2025-07-04
* @Version: V1.0
*/
@Api(tags="排产工单")
 * @Description: æŽ’产工单
 * @Author: jeecg-boot
 * @Date: 2025-07-04
 * @Version: V1.0
 */
@Api(tags = "排产工单")
@RestController
@RequestMapping("/mesproductionworkorder/mesProductionWorkOrder")
@Slf4j
public class MesProductionWorkOrderController extends JeecgController<MesProductionWorkOrder, IMesProductionWorkOrderService> {
   @Autowired
   private IMesProductionWorkOrderService mesProductionWorkOrderService;
    @Autowired
    private IMesProductionWorkOrderService mesProductionWorkOrderService;
   /**
    * åˆ†é¡µåˆ—表查询
    *
    * @param mesProductionWorkOrder
    * @param pageNo
    * @param pageSize
    * @param req
    * @return
    */
   //@AutoLog(value = "排产工单-分页列表查询")
   @ApiOperation(value="排产工单-分页列表查询", notes="排产工单-分页列表查询")
   @GetMapping(value = "/list")
   public Result<IPage<MesProductionWorkOrder>> queryPageList(MesProductionWorkOrder mesProductionWorkOrder,
                                  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                  HttpServletRequest req) {
       QueryWrapper<MesProductionWorkOrder> queryWrapper = QueryGenerator.initQueryWrapper(mesProductionWorkOrder, req.getParameterMap());
       Page<MesProductionWorkOrder> page = new Page<MesProductionWorkOrder>(pageNo, pageSize);
       IPage<MesProductionWorkOrder> pageList = mesProductionWorkOrderService.page(page, queryWrapper);
       return Result.OK(pageList);
   }
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param mesProductionWorkOrder
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "排产工单-分页列表查询")
    @ApiOperation(value = "排产工单-分页列表查询", notes = "排产工单-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<MesProductionWorkOrder>> queryPageList(MesProductionWorkOrder mesProductionWorkOrder,
                                                               @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                               @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                               HttpServletRequest req) {
        Map<String, String[]> parameterMap = req.getParameterMap();
        QueryWrapper<MesProductionWorkOrder> queryWrapper = QueryGenerator.initQueryWrapper(mesProductionWorkOrder, parameterMap);
        String[] startDates = parameterMap.get("startDate");
        String[] endDates = parameterMap.get("endDate");
        if (startDates != null && startDates.length > 0) {
            queryWrapper.ge("work_order_date", startDates[0]);
        }
        if (endDates != null && endDates.length > 0) {
            queryWrapper.le("work_order_date", endDates[0]);
        }
        Page<MesProductionWorkOrder> page = new Page<MesProductionWorkOrder>(pageNo, pageSize);
        IPage<MesProductionWorkOrder> pageList = mesProductionWorkOrderService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
   /**
    *   æ·»åŠ 
    *
    * @param mesProductionWorkOrder
    * @return
    */
   @AutoLog(value = "排产工单-添加")
   @ApiOperation(value="排产工单-添加", notes="排产工单-添加")
   //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:add")
   @PostMapping(value = "/add")
   public Result<String> add(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) {
       mesProductionWorkOrderService.save(mesProductionWorkOrder);
       return Result.OK("添加成功!");
   }
    /**
     * æ·»åŠ 
     *
     * @param mesProductionWorkOrder
     * @return
     */
    @AutoLog(value = "排产工单-添加")
    @ApiOperation(value = "排产工单-添加", notes = "排产工单-添加")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:add")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) {
        mesProductionWorkOrderService.save(mesProductionWorkOrder);
        return Result.OK("添加成功!");
    }
   /**
    *  ç¼–辑
    *
    * @param mesProductionWorkOrder
    * @return
    */
   @AutoLog(value = "排产工单-编辑")
   @ApiOperation(value="排产工单-编辑", notes="排产工单-编辑")
   //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:edit")
   @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
   public Result<String> edit(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) {
       mesProductionWorkOrderService.updateById(mesProductionWorkOrder);
       return Result.OK("编辑成功!");
   }
    @AutoLog(value = "排产工单-保存排产计划")
    @ApiOperation(value = "排产工单-保存排产计划", notes = "排产工单-保存排产计划")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:saveSchedulePlan")
    @PostMapping("/addSchedulePlan")
    public Result<String> addSchedulePlan(@RequestBody List<MesProductionWorkOrder> mesProductionWorkOrderList) {
        if (!validatePlan(mesProductionWorkOrderList)) {
            return Result.error("排产计划不合理,保存失败!");
        }
        mesProductionWorkOrderList.forEach(item -> item.setWorkOrderStatus(ProductionWorkOrderStatus.NEW.name()));
        mesProductionWorkOrderService.saveBatch(mesProductionWorkOrderList);
        return Result.OK("添加成功!");
    }
   /**
    *   é€šè¿‡id删除
    *
    * @param id
    * @return
    */
   @AutoLog(value = "排产工单-通过id删除")
   @ApiOperation(value="排产工单-通过id删除", notes="排产工单-通过id删除")
   //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:delete")
   @DeleteMapping(value = "/delete")
   public Result<String> delete(@RequestParam(name="id",required=true) String id) {
       mesProductionWorkOrderService.removeById(id);
       return Result.OK("删除成功!");
   }
    private boolean validatePlan(List<MesProductionWorkOrder> mesProductionWorkOrderList) {
        //同一物料、同一日期下、只能存在一个班次
        Map<String, List<MesProductionWorkOrder>> orderMapByMaterial = mesProductionWorkOrderList.stream()
                .collect(Collectors.groupingBy(MesProductionWorkOrder::getMaterialNumber));
        for (String materialNumber : orderMapByMaterial.keySet()) {
            List<MesProductionWorkOrder> workOrderList = orderMapByMaterial.get(materialNumber);
            Map<Date, List<MesProductionWorkOrder>> orderMapByDate = workOrderList.stream()
                    .collect(Collectors.groupingBy(MesProductionWorkOrder::getWorkOrderDate));
            for (Date date : orderMapByDate.keySet()) {
                List<MesProductionWorkOrder> orderList = orderMapByDate.get(date);
                Map<String, List<MesProductionWorkOrder>> orderMapByShift = orderList.stream()
                        .collect(Collectors.groupingBy(MesProductionWorkOrder::getShiftId));
                for (String shiftId : orderMapByShift.keySet()) {
                    List<MesProductionWorkOrder> list = orderMapByShift.get(shiftId);
                    if (list.size() > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
   /**
    *  æ‰¹é‡åˆ é™¤
    *
    * @param ids
    * @return
    */
   @AutoLog(value = "排产工单-批量删除")
   @ApiOperation(value="排产工单-批量删除", notes="排产工单-批量删除")
   //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:deleteBatch")
   @DeleteMapping(value = "/deleteBatch")
   public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
       this.mesProductionWorkOrderService.removeByIds(Arrays.asList(ids.split(",")));
       return Result.OK("批量删除成功!");
   }
    @AutoLog(value = "排产工单-生成排产计划")
    @ApiOperation(value = "排产工单-生成排产计划", notes = "排产工单-生成排产计划")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:schedule")
    @GetMapping(value = "/schedule")
    public Result<?> schedule(MesProductionWorkScheduleRequest request) {
        if (StringUtils.isBlank(request.getFactoryId())
                || Objects.isNull(request.getStartDate())
                || Objects.isNull(request.getEndDate())) {
            return Result.error("请传入必要参数!");
        }
        return Result.ok(mesProductionWorkOrderService.schedule(request));
    }
   /**
    * é€šè¿‡id查询
    *
    * @param id
    * @return
    */
   //@AutoLog(value = "排产工单-通过id查询")
   @ApiOperation(value="排产工单-通过id查询", notes="排产工单-通过id查询")
   @GetMapping(value = "/queryById")
   public Result<MesProductionWorkOrder> queryById(@RequestParam(name="id",required=true) String id) {
       MesProductionWorkOrder mesProductionWorkOrder = mesProductionWorkOrderService.getById(id);
       if(mesProductionWorkOrder==null) {
           return Result.error("未找到对应数据");
       }
       return Result.OK(mesProductionWorkOrder);
   }
    @AutoLog(value = "排产工单-发布排产计划")
    @ApiOperation(value = "排产工单-发布排产计划", notes = "排产工单-发布排产计划")
    //@RequiresPermissions("mes:production:work:order:publish")
    @RequestMapping(value = "/publish", method = {RequestMethod.POST, RequestMethod.PUT})
    public Result<String> publish(@RequestParam("ids") String ids) {
        List<String> idList = Arrays.asList(ids.split(","));
        List<MesProductionWorkOrder> list = mesProductionWorkOrderService.list(new LambdaQueryWrapper<MesProductionWorkOrder>()
                .in(MesProductionWorkOrder::getId, idList)
                .eq(MesProductionWorkOrder::getDelFlag, CommonConstant.DEL_FLAG_0)).stream()
                .filter(i -> !ProductionWorkOrderStatus.NEW.name().equals(i.getWorkOrderStatus()))
                .collect(Collectors.toList());
        if (!list.isEmpty()) {
            return Result.error("已发布的排产计划不能重复发布!");
        }
        List<MesProductionWorkOrder> publishList = CollectionUtil.newArrayList();
        idList.forEach(id -> {
            MesProductionWorkOrder publish = new MesProductionWorkOrder()
                    .setId(id)
                    .setPublishTime(new Date())
                    .setPublisher(Objects.requireNonNull(getCurrentUser()).getUsername())
                    .setWorkOrderStatus(ProductionWorkOrderStatus.PUBLISHED.name());
            publishList.add(publish);
        });
        mesProductionWorkOrderService.updateBatchById(publishList);
        return Result.OK("发布成功");
    }
   /**
   * å¯¼å‡ºexcel
   *
   * @param request
   * @param mesProductionWorkOrder
   */
   //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:exportXls")
   @RequestMapping(value = "/exportXls")
   public ModelAndView exportXls(HttpServletRequest request, MesProductionWorkOrder mesProductionWorkOrder) {
       return super.exportXls(request, mesProductionWorkOrder, MesProductionWorkOrder.class, "排产工单");
   }
    @AutoLog(value = "排产工单-重发布排产计划")
    @ApiOperation(value="排产工单-重发布排产计划", notes="重发布排产计划")
    //@RequiresPermissions("mes:production:work:order:republish")
    @PostMapping(value = "/republish")
    public Result<String> republish(@RequestBody MesProductionWorkOrderRepublishRequest request) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(request.getId());
        //todo åˆ¤æ–­ç­æ¬¡æ˜¯å¦ç»“束的逻辑
        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) {
            return Result.error("当前工单状态不支持重发布!");
        }
        MesProductionWorkOrder republish = new MesProductionWorkOrder()
                .setId(request.getId())
                .setPlanQuantity(request.getPlanQuantity())
                .setRepublisher(Objects.requireNonNull(getCurrentUser()).getUsername())
                .setRepublishTime(new Date())
                .setRepublishReason(request.getRepublishReason())
                .setWorkOrderStatus(ProductionWorkOrderStatus.REPUBLISHED.name());
        mesProductionWorkOrderService.updateById(republish);
        return Result.ok("重发布成功!");
    }
   /**
    /**
     * ç¼–辑
     *
     * @param mesProductionWorkOrder
     * @return
     */
    @AutoLog(value = "排产工单-编辑")
    @ApiOperation(value = "排产工单-编辑", notes = "排产工单-编辑")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<String> edit(@RequestBody MesProductionWorkOrder mesProductionWorkOrder) {
        mesProductionWorkOrderService.updateById(mesProductionWorkOrder);
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "排产工单-通过id删除")
    @ApiOperation(value = "排产工单-通过id删除", notes = "排产工单-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
        mesProductionWorkOrderService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "排产工单-批量删除")
    @ApiOperation(value = "排产工单-批量删除", notes = "排产工单-批量删除")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.mesProductionWorkOrderService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "排产工单-通过id查询")
    @ApiOperation(value = "排产工单-通过id查询", notes = "排产工单-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<MesProductionWorkOrder> queryById(@RequestParam(name = "id", required = true) String id) {
        MesProductionWorkOrder mesProductionWorkOrder = mesProductionWorkOrderService.getById(id);
        if (mesProductionWorkOrder == null) {
            return Result.error("未找到对应数据");
        }
        return Result.OK(mesProductionWorkOrder);
    }
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param mesProductionWorkOrder
     */
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, MesProductionWorkOrder mesProductionWorkOrder) {
        return super.exportXls(request, mesProductionWorkOrder, MesProductionWorkOrder.class, "排产工单");
    }
    /**
     * é€šè¿‡excel导入数据
   *
   * @param request
   * @param response
   * @return
   */
   //@RequiresPermissions("mes_production_work_order:importExcel")
   @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
   public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
       return super.importExcel(request, response, MesProductionWorkOrder.class);
   }
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("mes_production_work_order:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, MesProductionWorkOrder.class);
    }
    private LoginUser getCurrentUser() {
        try {
            return (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {
            return null;
        }
    }
}
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.mes.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class MesProductionWorkOrderRepublishRequest {
    /**主键*/
    @ApiModelProperty(value = "主键")
    private String id;
    /**计划生产数量*/
    @ApiModelProperty(value = "计划生产数量")
    private Double planQuantity;
    /**重发布原因*/
    @ApiModelProperty(value = "重发布原因")
    private String republishReason;
}
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkScheduleRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package org.jeecg.modules.mes.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class MesProductionWorkScheduleRequest {
    /**产线ID(冗余)*/
    @Dict(dictTable = "base_factory", dicCode = "id", dicText = "factory_name")
    @ApiModelProperty(value = "产线ID(冗余)")
    private String factoryId;
    /**排产起始日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "排产起始日期")
    private Date startDate;
    /**排产截至日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "排产截至日期")
    private Date endDate;
}
src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
@@ -1,9 +1,6 @@
package org.jeecg.modules.mes.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -11,6 +8,7 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.common.constant.CommonConstant;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
@@ -55,7 +53,7 @@
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    private Integer delFlag = CommonConstant.DEL_FLAG_0;
    /**工单号(任务号)*/
    @Excel(name = "工单号(任务号)", width = 15)
    @ApiModelProperty(value = "工单号(任务号)")
@@ -88,14 +86,14 @@
    @ApiModelProperty(value = "班次ID(冗余)")
    private String shiftId;
    /**排产日期*/
    @Excel(name = "排产日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @Excel(name = "排产日期", width = 20, format = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "排产日期")
    private Date workOrderDate;
    /**工单状态*/
    @Excel(name = "工单状态", width = 15, dicCode = "work_order_status")
    @Dict(dicCode = "work_order_status")
    @Excel(name = "工单状态", width = 15, dicCode = "mes_work_order_status")
    @Dict(dicCode = "mes_work_order_status")
    @ApiModelProperty(value = "工单状态")
    private String workOrderStatus;
    /**实际报工数量*/
@@ -105,6 +103,7 @@
    /**发布人*/
    @Excel(name = "发布人", width = 15)
    @ApiModelProperty(value = "发布人")
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
    private String publisher;
    /**发布时间*/
    @Excel(name = "发布时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@@ -115,6 +114,7 @@
    /**重发布人*/
    @Excel(name = "重发布人", width = 15)
    @ApiModelProperty(value = "重发布人")
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
    private String republisher;
    /**重发布时间*/
    @Excel(name = "重发布时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@@ -122,4 +122,24 @@
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "重发布时间")
    private Date republishTime;
    /**重发布原因*/
    @Excel(name = "重发布原因", width = 30)
    @ApiModelProperty(value = "重发布原因")
    private String republishReason;
    /**产线编码*/
    @TableField(exist = false)
    private String factoryCode;
    /**产线名称*/
    @TableField(exist = false)
    private String factoryName;
    /**班组名称*/
    @TableField(exist = false)
    private String groupName;
    /**班次编码*/
    @TableField(exist = false)
    private String shiftCode;
    /**班次名称*/
    @TableField(exist = false)
    private String shiftName;
}
src/main/java/org/jeecg/modules/mes/enums/ProductionWorkOrderStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package org.jeecg.modules.mes.enums;
public enum ProductionWorkOrderStatus {
    /**
     * æ–°å»º
     */
    NEW,
    /**
     * å·²å‘布
     */
    PUBLISHED,
    /**
     * é‡å‘布
     */
    REPUBLISHED
}
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java
@@ -1,7 +1,10 @@
package org.jeecg.modules.mes.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import java.util.List;
/**
 * @Description: æŽ’产工单
@@ -11,4 +14,5 @@
 */
public interface IMesProductionWorkOrderService extends IService<MesProductionWorkOrder> {
    List<MesProductionWorkOrder> schedule(MesProductionWorkScheduleRequest request);
}
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -1,10 +1,29 @@
package org.jeecg.modules.mes.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.entity.Shift;
import org.jeecg.modules.base.entity.ShiftGroup;
import org.jeecg.modules.base.service.IFactoryService;
import org.jeecg.modules.base.service.IShiftGroupService;
import org.jeecg.modules.base.service.IShiftService;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.mapper.MesProductionWorkOrderMapper;
import org.jeecg.modules.system.service.ISysDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * @Description: æŽ’产工单
@@ -14,5 +33,70 @@
 */
@Service
public class MesProductionWorkOrderServiceImpl extends ServiceImpl<MesProductionWorkOrderMapper, MesProductionWorkOrder> implements IMesProductionWorkOrderService {
    @Autowired
    private IShiftService shiftService;
    @Autowired
    private IShiftGroupService shiftGroupService;
    @Autowired
    private IFactoryService factoryService;
    @Override
    public List<MesProductionWorkOrder> schedule(MesProductionWorkScheduleRequest request) {
        //查询起止日期范围内的排产计划,先排除
        //查询该产线下所有的班次
        Map<String, ShiftGroup> shiftGroupMap = shiftGroupService.list(new LambdaQueryWrapper<ShiftGroup>()
                        .eq(ShiftGroup::getFactoryId, request.getFactoryId())
                        .eq(ShiftGroup::getDelFlag, CommonConstant.DEL_FLAG_0))
                .stream().collect(Collectors.toMap(ShiftGroup::getShiftId, v1 -> v1, (v1, v2) -> v1));
        Factory factory = factoryService.getById(request.getFactoryId());
        Map<String, Shift> shiftNameMap = new HashMap<>();
        List<Shift> shifts = shiftService.list(new LambdaQueryWrapper<Shift>()
                .in(Shift::getId, shiftGroupMap.keySet()));
        shifts.forEach(shift -> shiftNameMap.put(shift.getId(), shift));
        LocalDate startDate = request.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate endDate = request.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        // ä½¿ç”¨æ—¥æœŸèŒƒå›´è¿›è¡ŒéåŽ†å¤„ç†
        List<LocalDate> dateRange = Stream.iterate(startDate, date -> date.plusDays(1))
                .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
                .collect(Collectors.toList());
        List<MesProductionWorkOrder> newProductionWorkOrderList = CollectionUtil.newArrayList();
        for (LocalDate date : dateRange) {
            for (String shiftId : shiftGroupMap.keySet()) {
                Date workOrderDate = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
                //查询该产线、班次在该日期下是否有排产计划
                Optional<MesProductionWorkOrder> optional = list(new LambdaQueryWrapper<MesProductionWorkOrder>()
                        .eq(MesProductionWorkOrder::getWorkOrderDate, workOrderDate)
                        .eq(MesProductionWorkOrder::getFactoryId, request.getFactoryId())
                        .eq(MesProductionWorkOrder::getShiftId, shiftId))
                        .stream().findAny();
                if (!optional.isPresent()) {
                    ShiftGroup shiftGroup = shiftGroupMap.get(shiftId);
                    //没有,生成新排产计划
                    MesProductionWorkOrder mesProductionWorkOrder = new MesProductionWorkOrder()
                            .setFactoryId(factory.getId())
                            .setFactoryCode(factory.getFactoryCode())
                            .setFactoryName(factory.getFactoryName())
                            .setShiftId(shiftId)
                            .setShiftCode(shiftNameMap.get(shiftId).getShiftCode())
                            .setShiftName(shiftNameMap.get(shiftId).getShiftName())
                            .setGroupId(shiftGroup.getId())
                            .setGroupName(shiftGroup.getGroupName())
                            .setWorkOrderDate(workOrderDate);
                    newProductionWorkOrderList.add(mesProductionWorkOrder);
                }
            }
        }
        //如果为空,默认给一条,用于手动新增时表格的初始化
        if (newProductionWorkOrderList.isEmpty()) {
            MesProductionWorkOrder mesProductionWorkOrder = new MesProductionWorkOrder()
                    .setFactoryId(factory.getId())
                    .setFactoryCode(factory.getFactoryCode())
                    .setFactoryName(factory.getFactoryName());
            newProductionWorkOrderList.add(mesProductionWorkOrder);
        }
        return newProductionWorkOrderList;
    }
}