diff --git a/src/main/java/com/ydool/common/gen/Generator.java b/src/main/java/com/ydool/common/gen/Generator.java index c848140..f956293 100644 --- a/src/main/java/com/ydool/common/gen/Generator.java +++ b/src/main/java/com/ydool/common/gen/Generator.java @@ -27,9 +27,9 @@ public class Generator { public static void main(String[] args) { //表名 - String tableName = "t_integrated_notice_user"; + String tableName = "t_work_flow_file_number"; //表前缀 - String tablePrefix = "t_integrated_"; + String tablePrefix = "t_"; //作者— String author = "zhouyuan"; @@ -66,7 +66,7 @@ public class Generator { //包配置 PackageConfig pc = new PackageConfig(); - pc.setParent("com.ydool.integrated"); + pc.setParent("com.ydool.oa.workFlow"); pc.setEntity("entity"); pc.setServiceImpl("service"); pc.setMapper("mapper"); diff --git a/src/main/java/com/ydool/oa/workFlow/controller/WorkFlowController.java b/src/main/java/com/ydool/oa/workFlow/controller/WorkFlowController.java index 563740a..81985f8 100644 --- a/src/main/java/com/ydool/oa/workFlow/controller/WorkFlowController.java +++ b/src/main/java/com/ydool/oa/workFlow/controller/WorkFlowController.java @@ -14,6 +14,7 @@ import com.ydool.oa.workFlow.data.entity.WorkFlowNotice; import com.ydool.oa.workFlow.data.vo.WorkFlowNoticeVo; import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo; import com.ydool.oa.workFlow.data.vo.WorkFlowVo; +import com.ydool.oa.workFlow.service.WorkFlowFileNumberService; import com.ydool.oa.workFlow.service.WorkFlowNoticeService; import com.ydool.oa.workFlow.service.WorkFlowService; import io.swagger.annotations.Api; @@ -39,6 +40,9 @@ public class WorkFlowController extends BaseController { @Autowired private WorkFlowNoticeService workFlowNoticeService; + @Autowired + private WorkFlowFileNumberService workFlowFileNumberService; + /** * 发起流程 @@ -53,6 +57,17 @@ public class WorkFlowController extends BaseController { return workFlowService.start(vo); } + /** + * 获取文件编号 + */ + @GetMapping(value = "getFileNumberByType") + @ApiOperation(value = "获取文件编号") + @ApiImplicitParam(name = "type", value = "流程类型") + @ApiOperationSupport(order = 10) + public AjaxResult getFileNumberByType(String type) { + return AjaxResult.ok().data(workFlowFileNumberService.getMaxNumber(type)); + } + /** * 撤销流程 diff --git a/src/main/java/com/ydool/oa/workFlow/data/entity/WorkFlowFileNumber.java b/src/main/java/com/ydool/oa/workFlow/data/entity/WorkFlowFileNumber.java new file mode 100644 index 0000000..da48961 --- /dev/null +++ b/src/main/java/com/ydool/oa/workFlow/data/entity/WorkFlowFileNumber.java @@ -0,0 +1,38 @@ +package com.ydool.oa.workFlow.data.entity; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ydool.common.base.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +/** + *

+ * 工作流程文件编号 + *

+ * + * @author zhouyuan + * @since 2024-05-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("t_work_flow_file_number") +@ApiModel(value="WorkFlowFileNumber对象", description="工作流程文件编号") +public class WorkFlowFileNumber extends BaseEntity{ + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "关联流程id") + private String workFlowId; + + @ApiModelProperty(value = "流程类型") + private String type; + + @ApiModelProperty(value = "文件编号年份") + private Integer year; + + @ApiModelProperty(value = "文件编号") + private Integer number; + +} diff --git a/src/main/java/com/ydool/oa/workFlow/mapper/WorkFlowFileNumberMapper.java b/src/main/java/com/ydool/oa/workFlow/mapper/WorkFlowFileNumberMapper.java new file mode 100644 index 0000000..c172a1f --- /dev/null +++ b/src/main/java/com/ydool/oa/workFlow/mapper/WorkFlowFileNumberMapper.java @@ -0,0 +1,32 @@ +package com.ydool.oa.workFlow.mapper; + +import com.ydool.oa.workFlow.data.entity.WorkFlowFileNumber; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + *

+ * 工作流程文件编号 Mapper 接口 + *

+ * + * @author zhouyuan + * @since 2024-05-30 + */ +@Mapper +public interface WorkFlowFileNumberMapper extends MPJBaseMapper { + + /** + * 获取最大编号 + * @param type + * @param year + * @return + */ + @Select("select COALESCE(max(number), 0) + 1\n" + + "from t_work_flow_file_number\n" + + "where type = #{type}\n" + + "and year = #{year}") + Integer getMaxNumber(@Param("type")String type, @Param("year") Integer year); + +} diff --git a/src/main/java/com/ydool/oa/workFlow/service/WorkFlowFileNumberService.java b/src/main/java/com/ydool/oa/workFlow/service/WorkFlowFileNumberService.java new file mode 100644 index 0000000..b32c1ae --- /dev/null +++ b/src/main/java/com/ydool/oa/workFlow/service/WorkFlowFileNumberService.java @@ -0,0 +1,54 @@ +package com.ydool.oa.workFlow.service; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import com.ydool.common.base.BaseService; +import com.ydool.common.exception.AjaxResultException; +import com.ydool.oa.workFlow.data.entity.WorkFlowFileNumber; +import com.ydool.oa.workFlow.mapper.WorkFlowFileNumberMapper; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + *

+ * 工作流程文件编号 服务类 + *

+ * + * @author zhouyuan + * @since 2024-05-30 + */ +@Service +public class WorkFlowFileNumberService extends BaseService { + + @Resource + private WorkFlowFileNumberMapper workFlowFileNumberMapper; + + public synchronized String getMaxNumber(String type) { + if (StrUtil.isBlank(type)) { + throw new AjaxResultException("type不能为空"); + } + int year = LocalDateTimeUtil.now().getYear(); + Integer maxNumber = workFlowFileNumberMapper.getMaxNumber(type, year); + //maxNumber变成3位数的字符串,少的位数补零 + return year + String.format("%03d", maxNumber); + } + + @SneakyThrows + public synchronized void setMaxNumber(WorkFlowFileNumber workFlowFileNumber) { + try { + synchronized (this) { + Integer maxNumber = workFlowFileNumberMapper.getMaxNumber(workFlowFileNumber.getType(), workFlowFileNumber.getYear()); + workFlowFileNumber.setNumber(maxNumber); + workFlowFileNumberMapper.insert(workFlowFileNumber); + } + } catch (Exception e) { + //等待1s后重新 + Thread.sleep(1000); + setMaxNumber(workFlowFileNumber); + } + } + +} + diff --git a/src/main/java/com/ydool/oa/workFlow/service/WorkFlowService.java b/src/main/java/com/ydool/oa/workFlow/service/WorkFlowService.java index 3017892..bc3f701 100644 --- a/src/main/java/com/ydool/oa/workFlow/service/WorkFlowService.java +++ b/src/main/java/com/ydool/oa/workFlow/service/WorkFlowService.java @@ -5,16 +5,14 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ydool.common.base.BaseService; import com.ydool.common.data.dto.AjaxResult; import com.ydool.common.exception.ResultException; import com.ydool.oa.workFlow.data.dto.WorkFlowCountDto; -import com.ydool.oa.workFlow.data.entity.WorkFlow; -import com.ydool.oa.workFlow.data.entity.WorkFlowNotice; -import com.ydool.oa.workFlow.data.entity.WorkFlowStep; -import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog; +import com.ydool.oa.workFlow.data.entity.*; import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo; import com.ydool.oa.workFlow.data.vo.WorkFlowVo; import com.ydool.oa.workFlow.data.wrapper.WorkFlowWrapper; @@ -28,6 +26,7 @@ import com.ydool.staff.service.IAuditService; import com.ydool.system.entity.User; import com.ydool.system.service.impl.UserServiceImpl; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -63,6 +62,10 @@ public class WorkFlowService extends BaseService { @Autowired private IAuditService auditService; + @Autowired + @Lazy + private WorkFlowFileNumberService workFlowFileNumberService; + /** * 发起流程 * @@ -104,6 +107,22 @@ public class WorkFlowService extends BaseService { workFlow.setStatus(WorkFlowStatusEnum.ACTIVE.getStatus()); boolean flag = save(workFlow); + if (!flag) return AjaxResult.fail("发起失败"); + // 判断是否为轮换或药剂 + if (vo.getType().equals(WorkFlowTypeEnum.ROTATION.getType()) || vo.getType().equals(WorkFlowTypeEnum.DRUG.getType())) { + // 重新计算文件编号 + WorkFlowFileNumber workFlowFileNumber = new WorkFlowFileNumber(); + workFlowFileNumber.setWorkFlowId(workFlow.getId()); + workFlowFileNumber.setType(vo.getType()); + workFlowFileNumber.setYear(LocalDateTime.now().getYear()); + workFlowFileNumberService.setMaxNumber(workFlowFileNumber); + String data = workFlow.getData(); + data = JSONUtil.toJsonStr(JSONUtil.parseObj(data).set("number", workFlowFileNumber.getYear() + String.format("%03d", workFlowFileNumber.getNumber()))); + workFlow.setData(data); + flag = updateById(workFlow); + if (!flag) return AjaxResult.fail("发起失败,请重新发起"); + } + // 2.保存流程步骤 WorkFlowStep workFlowStep = new WorkFlowStep(workFlow, WorkFlowStepTypeEnum.START.getType(), StpUtil.getLoginIdAsString(), WorkFlowStepStatusEnum.SUBMIT.getStatus(), ""); @@ -332,7 +351,6 @@ public class WorkFlowService extends BaseService { WorkFlowStepLog workFlowStepLog = new WorkFlowStepLog(workFlow); flag = workFlowStepLogService.save(workFlowStepLog); - return flag ? AjaxResult.ok().msg("撤回成功") : AjaxResult.fail("撤回失败"); }