From 7fc3a69a9592fde25971055ff0c98eea98188805 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期四, 07 八月 2025 10:20:11 +0800 Subject: [PATCH] 生产管控 排产功能接口 --- db/双林新火炬MES数据库设计.pdma.json | 22 + src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java | 84 +++++++ src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java | 7 src/main/java/org/jeecg/modules/base/service/IShiftService.java | 3 src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java | 1 src/main/java/org/jeecg/modules/mes/enums/ProductionWorkOrderStatus.java | 17 + src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java | 21 + src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java | 40 ++ src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java | 35 +++ src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java | 372 ++++++++++++++++++++++----------- src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkScheduleRequest.java | 31 ++ src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml | 8 src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java | 4 13 files changed, 509 insertions(+), 136 deletions(-) diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" index 42ffab3..e3aa0fd 100644 --- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" +++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.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": [], diff --git a/src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java b/src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java index ba9a438..f7bc3ce 100644 --- a/src/main/java/org/jeecg/modules/base/controller/ShiftGroupController.java +++ b/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 * diff --git a/src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java b/src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java index 66fe3af..2da1132 100644 --- a/src/main/java/org/jeecg/modules/base/mapper/ShiftMapper.java +++ b/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); } diff --git a/src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml b/src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml index cb85843..ce54435 100644 --- a/src/main/java/org/jeecg/modules/base/mapper/xml/ShiftMapper.xml +++ b/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> \ No newline at end of file diff --git a/src/main/java/org/jeecg/modules/base/service/IShiftService.java b/src/main/java/org/jeecg/modules/base/service/IShiftService.java index a1d955c..7a26242 100644 --- a/src/main/java/org/jeecg/modules/base/service/IShiftService.java +++ b/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); } diff --git a/src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java b/src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java index 58f99ff..86cba92 100644 --- a/src/main/java/org/jeecg/modules/base/service/impl/ShiftServiceImpl.java +++ b/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); + } } diff --git a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java b/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java index 5a340af..d712a21 100644 --- a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java +++ b/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; + } + } } diff --git a/src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java b/src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java new file mode 100644 index 0000000..2c02022 --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkScheduleRequest.java b/src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkScheduleRequest.java new file mode 100644 index 0000000..17cd87c --- /dev/null +++ b/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; +} diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java b/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java index 488323c..efccd0d 100644 --- a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java +++ b/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; } diff --git a/src/main/java/org/jeecg/modules/mes/enums/ProductionWorkOrderStatus.java b/src/main/java/org/jeecg/modules/mes/enums/ProductionWorkOrderStatus.java new file mode 100644 index 0000000..e2c6de7 --- /dev/null +++ b/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 +} diff --git a/src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java b/src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java index c3fdffc..3e00fd7 100644 --- a/src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java +++ b/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); } diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java index 0bfbfb8..51adc5b 100644 --- a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java +++ b/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; + } } -- Gitblit v1.9.3