龚焕茏
2024-04-17 042936ba89e122bece0e4ce595c68f859b9e9bed
工单下发:新增互斥锁、下发记录
1个文件已修改
3个文件已添加
192 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrderDistributeRecord.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderDistributeRecordMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderDistributeRecordMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrderDistributeRecord.java
New file
@@ -0,0 +1,38 @@
package com.ycl.platform.domain.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ycl.platform.base.AbsEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
 * 工单下发记录
 *
 * @author gonghl
 * @since 2024-04-17
 */
@Data
@Accessors(chain = true)
@TableName("t_work_order_distribute_record")
@ApiModel(value = "WorkOrderAuditingRecord对象", description = "工单下发记录")
@AllArgsConstructor
@NoArgsConstructor
public class WorkOrderDistributeRecord extends AbsEntity {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("工单ID")
    @TableField("work_order_id")
    private Integer workOrderId;
    @ApiModelProperty("下发人")
    @TableField("user_id")
    private Long userId;
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderDistributeRecordMapper.java
New file
@@ -0,0 +1,19 @@
package com.ycl.platform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.platform.domain.entity.WorkOrderDistributeRecord;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * 工单下发 Mapper 接口
 *
 * @author gonghl
 * @since 2024-04-17
 */
@Mapper
public interface WorkOrderDistributeRecordMapper extends BaseMapper<WorkOrderDistributeRecord> {
    void insertBatch(List<WorkOrderDistributeRecord> list);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1,44 +1,42 @@
package com.ycl.platform.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.exception.ServiceException;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.form.*;
import com.ycl.platform.domain.query.DistributeWorkOrderQuery;
import com.ycl.platform.domain.query.WorkOrderQuery;
import com.ycl.platform.domain.vo.DistributeWorkOrderVO;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.mapper.*;
import com.ycl.platform.service.NotifyService;
import com.ycl.platform.service.WorkOrderService;
import com.ycl.system.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.domain.query.WorkOrderQuery;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.system.model.LoginUser;
import com.ycl.system.page.PageUtil;
import com.ycl.utils.DateUtils;
import com.ycl.utils.SecurityUtils;
import enumeration.general.FastDistributeTypeEnum;
import com.ycl.utils.redis.RedisCache;
import enumeration.general.NotifyTypeEnum;
import enumeration.general.WorkOrderStatusEnum;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.stereotype.Service;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Objects;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import lombok.RequiredArgsConstructor;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 工单 服务实现类
@@ -56,7 +54,12 @@
    private final WorkOrderAuditingRecordMapper workOrderAuditingRecordMapper;
    private final WorkOrderYwConditionRecordMapper workOrderYwConditionRecordMapper;
    private final NotifyService notifyService;
    private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper;
    private final String DISTRIBUTE_LOCK_KEY = "distributeLock";
    @Autowired
    private RedisCache redisCache;
    /**
     * 添加
@@ -289,6 +292,7 @@
                break;
           }
        // 查询符合条件的工单
        List<Integer> ids = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                .eq(Objects.nonNull(data.getUnitId()), WorkOrder::getUnitId, data.getUnitId())
@@ -303,24 +307,86 @@
        if (ids.isEmpty()) {
            return Result.error("没有符合条件的工单");
        } else {
        }
        if (!getDistributeLock()) {
            return Result.error("工单下发中,请稍后重试");
        }
        try {
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                    .in(WorkOrder::getId, ids)
                    .update();
            addDistributeRecord(ids);
            return Result.ok("成功下发" + ids.size() + "条工单");
        } catch (Exception e) {
            return Result.ok("操作失败");
        } finally {
            distributeUnLock();
        }
        return Result.ok("成功下发" + ids.size() + "条工单");
    }
    @Override
    public Result selectedIdsDistribute(List<Integer> ids, Integer unitId) {
        new LambdaUpdateChainWrapper<>(baseMapper)
                .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                .in(ArrayUtils.isNotEmpty(ids.toArray()), WorkOrder::getId, ids)
                .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                .eq(Objects.nonNull(unitId), WorkOrder::getUnitId, unitId)
                .update();
        return Result.ok("操作成功");
        if (!getDistributeLock()) {
            return Result.error("工单下发中,请稍后重试");
        }
        try {
            if (ids.isEmpty()) {
                ids = new LambdaQueryChainWrapper<>(baseMapper)
                        .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                        .eq(Objects.nonNull(unitId), WorkOrder::getUnitId, unitId)
                        .select(WorkOrder::getId)
                        .list()
                        .stream()
                        .map(WorkOrder::getId)
                        .collect(Collectors.toList());
            }
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .set(WorkOrder::getStatus, WorkOrderStatusEnum.DISTRIBUTED)
                    .in(WorkOrder::getId, ids)
                    .eq(WorkOrder::getStatus, WorkOrderStatusEnum.WAIT_DISTRIBUTE)
                    .eq(Objects.nonNull(unitId), WorkOrder::getUnitId, unitId)
                    .update();
            addDistributeRecord(ids);
            return Result.ok("操作成功");
        } catch (Exception e) {
            return Result.ok("操作失败");
        } finally {
            distributeUnLock();
        }
    }
    /**
     * 申请工单下发锁
     * @return 工单下发锁申请结果
     */
    public synchronized Boolean getDistributeLock() {
        if (Objects.isNull(redisCache.getCacheObject(DISTRIBUTE_LOCK_KEY))) {
            redisCache.setCacheObject(DISTRIBUTE_LOCK_KEY, "1");
            return true;
        } else {
            return false;
        }
    }
    /**
     * 工单下发锁释放
     */
    public synchronized void distributeUnLock() {
        redisCache.deleteObject(DISTRIBUTE_LOCK_KEY);
    }
    /**
     * 添加工单下发记录
     * @param ids 工单id
     */
    private void addDistributeRecord(List<Integer> ids) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        workOrderDistributeRecordMapper.insertBatch(
                ids.stream()
                        .map(id -> new WorkOrderDistributeRecord(id, loginUser.getUserId()))
                        .toList()
        );
    }
    /**
ycl-server/src/main/resources/mapper/zgyw/WorkOrderDistributeRecordMapper.xml
New file
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycl.platform.mapper.WorkOrderDistributeRecordMapper">
    <insert id="insertBatch">
        insert into t_work_order_distribute_record (work_order_id, user_id, create_time, deleted)
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.workOrderId}, #{item.userId}, now(), '0')
        </foreach>
    </insert>
</mapper>