فهرست منبع

添加消息通知

yzc 1 سال پیش
والد
کامیت
ad4bcf276f

+ 6 - 1
hx-common/src/main/java/com/fjhx/common/enums/PushBusinessTypeEnum.java

@@ -41,7 +41,12 @@ public enum PushBusinessTypeEnum {
     /**
      * 单证被删除
      */
-    DOCUMENTS_DEL(7);
+    DOCUMENTS_DEL(7),
+
+    /**
+     * 新任务
+     */
+    NEW_TASK(8);
 
     private final int type;
 

+ 15 - 0
hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java

@@ -1,6 +1,9 @@
 package com.fjhx.jxst.flow;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
 import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
@@ -8,6 +11,10 @@ import com.fjhx.jxst.service.sales.SalesContractDetailsService;
 import com.fjhx.jxst.service.sales.SalesContractService;
 import com.fjhx.mes.entity.work.dto.WorkOrderDto;
 import com.fjhx.mes.service.work.WorkOrderService;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -22,6 +29,8 @@ public class SalesContractFlow extends FlowDelegate {
     private SalesContractDetailsService salesContractDetailsService;
     @Autowired
     private WorkOrderService workOrderService;
+    @Autowired
+    private ISysUserService userService;
     @Override
     public String getFlowKey() {
         return "jxst_sales_contract_flow";
@@ -50,6 +59,12 @@ public class SalesContractFlow extends FlowDelegate {
             //添加工单
             workOrderService.add(workOrder);
         }
+
+        //推送消息给生产计划下发的负责人
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        List<Long> userIds = userService.getUserIdsByRoleKey("admin");
+        DynamicDataSourceContextHolder.poll();
+        WebSocketPush.byUsers(PushTypeEnum.MESSAGE, userIds, "您有新的工单待下发!", PushBusinessTypeEnum.NEW_TASK.getType());
     }
 
 }

+ 31 - 6
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java

@@ -1,10 +1,15 @@
 package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.production.po.ProductionPlan;
 import com.fjhx.mes.entity.production.po.ProductionTask;
+import com.fjhx.mes.entity.production.po.ProductionTaskProcessesDetail;
 import com.fjhx.mes.entity.production.vo.ProductionTaskVo;
 import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.entity.work.po.WorkOrderProductionProcesses;
@@ -15,6 +20,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.mes.service.production.ProductionTaskService;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -51,6 +60,8 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
     ProductInfoService productInfoService;
     @Autowired
     ProductionTaskService productionTaskService;
+    @Autowired
+    private ISysUserService userService;
 
     @Override
     public Page<ProductionPlanVo> getPage(ProductionPlanSelectDto dto) {
@@ -137,17 +148,31 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
         return result;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
-    public void add(ProductionPlanDto productionPlanDto) {
+    public synchronized void add(ProductionPlanDto productionPlanDto) {
+        Long workOrderId = productionPlanDto.getWorkOrderId();
+        WorkOrder workOrder = workOrderService.getById(workOrderId);
+
+        //检查待排程数量防止并发
+        List<ProductionPlan> productionPlanList = this.list(q -> q.eq(ProductionPlan::getWorkOrderId, productionPlanDto.getWorkOrderId()));
+        BigDecimal planCount = productionPlanList.stream().map(ProductionPlan::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if(planCount.add(productionPlanDto.getQuantity()).compareTo(workOrder.getQuantity())>0){
+            throw new ServiceException("计划数量大于工单数量,请检查!");
+        }
+
         productionPlanDto.setStatus(0);
         productionPlanDto.setCode(CodeEnum.PRODUCTION_PLAN.getCode());
         this.save(productionPlanDto);
-        Long workOrderId = productionPlanDto.getWorkOrderId();
         //修改工单状态为进行中
-        WorkOrder byId = workOrderService.getById(workOrderId);
-        byId.setStatus(1);
-        workOrderService.updateById(byId);
+        workOrder.setStatus(1);
+        workOrderService.updateById(workOrder);
+
+        //推送消息给生产任务下发的负责人
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        List<Long> userIds = userService.getUserIdsByRoleKey("admin");
+        DynamicDataSourceContextHolder.poll();
+        WebSocketPush.byUsers(PushTypeEnum.MESSAGE, userIds, "您有新的生产计划待下发!", PushBusinessTypeEnum.NEW_TASK.getType());
     }
 
     @Override

+ 23 - 10
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java

@@ -3,6 +3,7 @@ package com.fjhx.mes.service.production.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -21,6 +22,8 @@ import com.fjhx.mes.service.production.*;
 import com.fjhx.mes.service.technology.TechnologyService;
 import com.fjhx.mes.service.work.WorkOrderProductionProcessesService;
 import com.fjhx.mes.service.work.WorkOrderService;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
 import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.StockWait;
 import com.fjhx.wms.entity.stock.po.StockWaitDetails;
@@ -74,6 +77,8 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
     private ProductInfoService productInfoService;
     @Autowired
     private ProductionProcessesService productionProcessesService;
+    @Autowired
+    private ProductionTaskProcessesDetailService productionTaskProcessesDetailService;
 
     @Override
     public Page<ProductionTaskDetailVo> getPage(ProductionTaskDetailSelectDto dto) {
@@ -87,9 +92,9 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
         //过滤负责人为自己的任务
         wrapper.eq(ProductionTaskDetail::getPersonLiableId, SecurityUtils.getUserId());
         //过滤未在流转的记录
-        wrapper.eq(ProductionTaskDetail::getCirculationStatus,0);
+        wrapper.eq(ProductionTaskDetail::getCirculationStatus, 0);
         //过滤未完成的记录
-        wrapper.eq(ProductionTaskDetail::getFinishStatus,0);
+        wrapper.eq(ProductionTaskDetail::getFinishStatus, 0);
         return pageCom(wrapper, dto);
     }
 
@@ -98,15 +103,15 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
      */
     Page<ProductionTaskDetailVo> pageCom(IWrapper<ProductionTaskDetail> wrapper, ProductionTaskDetailSelectDto dto) {
         //关键字搜索
-        if (ObjectUtil.isNotEmpty(dto.getKeyword())){
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
             List<Long> productIds = productInfoService.listObject(ProductInfo::getId, q -> q.like(ProductInfo::getName, dto.getKeyword()));
-            wrapper.and(q->q.in(ProductionTaskDetail::getProductId,productIds).or().like(ProductionTaskDetail::getProductSn,dto.getKeyword()));
+            wrapper.and(q -> q.in(ProductionTaskDetail::getProductId, productIds).or().like(ProductionTaskDetail::getProductSn, dto.getKeyword()));
         }
 
         wrapper.orderByDesc("ptd", ProductionTaskDetail::getId);
         Page<ProductionTaskDetailVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<ProductionTaskDetailVo> records = page.getRecords();
-        if(ObjectUtil.isEmpty(records)){
+        if (ObjectUtil.isEmpty(records)) {
             return new Page<>();
         }
         //赋值流转人名称
@@ -177,6 +182,14 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
         productionTaskDetailRecord.setPersonLiableId(SecurityUtils.getUserId());
         productionTaskDetailRecord.setReceivedTime(productionTaskDetail.getReceivedTime());
         productionTaskDetailRecordService.save(productionTaskDetailRecord);
+
+        //推送消息给下一工序的用户有单可以抢了
+        Long nextProductionProcessesId = productionTaskDetail.getNextProductionProcessesId();
+        List<Long> userIds = productionTaskProcessesDetailService.listObject(ProductionTaskProcessesDetail::getUserId, q -> q
+                .eq(ProductionTaskProcessesDetail::getProductionProcessesId, nextProductionProcessesId)
+                .eq(ProductionTaskProcessesDetail::getProductionTaskId, productionTaskDetail.getProductionTaskId())
+        );
+        WebSocketPush.byUsers(PushTypeEnum.MESSAGE, userIds, "您有新的任务可接收!", PushBusinessTypeEnum.NEW_TASK.getType());
     }
 
     /**
@@ -222,11 +235,11 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
         IWrapper<ProductionTaskDetail> wrapper = getWrapper();
 
         //过滤工序用户列表里有自己的数据
-        wrapper.eq("ptpd.user_id",SecurityUtils.getUserId());
+        wrapper.eq("ptpd.user_id", SecurityUtils.getUserId());
         //过滤正在流转中的数据
-        wrapper.eq("ptd",ProductionTaskDetail::getCirculationStatus,1);
+        wrapper.eq("ptd", ProductionTaskDetail::getCirculationStatus, 1);
         //过滤未完工的数据
-        wrapper.eq("ptd",ProductionTaskDetail::getFinishStatus,0);
+        wrapper.eq("ptd", ProductionTaskDetail::getFinishStatus, 0);
 
         return pageCom(wrapper, dto);
     }
@@ -238,7 +251,7 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
     public void receive(ProductionTaskDetailDto productionTaskDetailDto) {
         ProductionTaskDetail productionTaskDetail = getById(productionTaskDetailDto.getId());
 
-        if(Objects.equals(0,productionTaskDetail.getCirculationStatus())){
+        if (Objects.equals(0, productionTaskDetail.getCirculationStatus())) {
             throw new ServiceException("该任务已被他人接收,接收失败");
         }
 
@@ -290,7 +303,7 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
 
 
     @Override
-    public ProductionTaskDetailVo snInfo(String sn){
+    public ProductionTaskDetailVo snInfo(String sn) {
         Assert.notEmpty(sn, "sn不能为空");
         ProductionTaskDetailVo productionTaskDetailVo = baseMapper.snInfo(sn);
         Assert.notEmpty(productionTaskDetailVo, "查询不到sn信息");

+ 19 - 3
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -33,6 +34,8 @@ import com.fjhx.mes.service.work.WorkOrderBomService;
 import com.fjhx.mes.service.work.WorkOrderProductionProcessesService;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
 import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.StockWait;
 import com.fjhx.wms.entity.stock.po.StockWaitDetails;
@@ -140,12 +143,20 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
 
     @DSTransactional
     @Override
-    public void add(ProductionTaskDto productionTaskDto) {
+    public synchronized void add(ProductionTaskDto productionTaskDto) {
+        Long productionPlanId = productionTaskDto.getProductionPlanId();
+        ProductionPlan productionPlan = productionPlanService.getById(productionPlanId);
+
+        //检查待排程数量防止并发
+        List<ProductionTask> productionTaskList = this.list(q -> q.eq(ProductionTask::getProductionPlanId, productionTaskDto.getProductionPlanId()));
+        BigDecimal taskCount = productionTaskList.stream().map(ProductionTask::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if(taskCount.add(productionTaskDto.getQuantity()).compareTo(productionPlan.getQuantity())>0){
+            throw new ServiceException("任务数量大于计划数量,请检查!");
+        }
+
         productionTaskDto.setCode(CodeEnum.PRODUCTION_TASK.getCode());
         this.save(productionTaskDto);
-        Long productionPlanId = productionTaskDto.getProductionPlanId();
         //更新生产计划状态为进行中
-        ProductionPlan productionPlan = productionPlanService.getById(productionPlanId);
         productionPlan.setStatus(1);
         productionPlanService.updateById(productionPlan);
 
@@ -315,6 +326,11 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
             }
         }
         productionTaskProcessesDetailService.saveBatch(productionTaskProcessesDetailList);
+
+        //推送消息给第一个工序的用户有单可以抢了
+        WorkOrderProductionProcesses workOrderProductionProcesses = productionProcessesList.get(0);
+        List<Long> userIds = taskProcessesUserJson.getList(workOrderProductionProcesses.getId().toString(), Long.class);
+        WebSocketPush.byUsers(PushTypeEnum.MESSAGE,userIds,"您有新的任务可接收!", PushBusinessTypeEnum.NEW_TASK.getType());
     }
 
     @Override