Merge remote-tracking branch 'origin/master'

master
wanghao 1 month ago
commit f12d1f50ae

@ -32,7 +32,7 @@
<hutool.version>5.8.31</hutool.version> <hutool.version>5.8.31</hutool.version>
<redisson.version>3.37.0</redisson.version> <redisson.version>3.37.0</redisson.version>
<lock4j.version>2.2.7</lock4j.version> <lock4j.version>2.2.7</lock4j.version>
<snailjob.version>1.1.2</snailjob.version> <snailjob.version>1.4.0</snailjob.version>
<satoken.version>1.39.0</satoken.version> <satoken.version>1.39.0</satoken.version>
<lombok.version>1.18.34</lombok.version> <lombok.version>1.18.34</lombok.version>
<logstash.version>7.4</logstash.version> <logstash.version>7.4</logstash.version>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hwmom-api-dms</artifactId>
<description>
hwmom-api-dms dms接口模块
</description>
<dependencies>
<!-- RuoYi Common Core-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,9 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteInspectInstanceService {
public R<Integer> insertInspectInstance(String planInspectCode, String tenantId, Long userId);
}

@ -0,0 +1,13 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteLubeInstanceService {
public R<Void> insertLubeInstance(String lubeInstanceCode, String tenantId, Long userId);
}

@ -0,0 +1,8 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteMaintInstanceService {
public R<Integer> insertDmsBillsMaintInstance(String planMaintCode, String tenantId, Long userId);
}

@ -0,0 +1,9 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteRepairStanceService {
public R<Integer> insertDmsRepairInstance(String planRepairCode);
}

@ -16,6 +16,9 @@
<module>hwmom-api-mes</module> <module>hwmom-api-mes</module>
<module>hwmom-api-pda</module> <module>hwmom-api-pda</module>
<module>hwmom-api-workflow</module> <module>hwmom-api-workflow</module>
<module>hwmom-api-dms</module>
<module>ruoyi-api-job</module>
</modules> </modules>
<artifactId>ruoyi-api</artifactId> <artifactId>ruoyi-api</artifactId>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-api-job</artifactId>
<description>
ruoyi-api-job job接口模块
</description>
<dependencies>
<!-- RuoYi Common Core-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,50 @@
package org.dromara.job.api;
import com.aizuda.snailjob.client.job.core.dto.JobResponseVO;
import org.dromara.common.core.domain.R;
import org.dromara.job.api.model.DmsJobEntity;
/**
*
*
* @author Yinq
*/
public interface RemoteJobService {
/**
*
*
* @param dmsJobEntity
* @return id
*/
public R<Long> addClusterJob(DmsJobEntity dmsJobEntity);
/**
*
*/
public R<Void> updateClusterJob(DmsJobEntity dmsJobEntity);
/**
*
*
* @param jobId
* @return
*/
public R<JobResponseVO> queryJob(Long jobId);
/**
*
*
* @param jobId ID
* @param status
* status NO:0 ; YES:1
*/
public R<Void> updateJobStatus(Long jobId, Long status);
/**
* SnailJobOpenApi
*/
// public Boolean deleteJob(Long jobId);
}

@ -0,0 +1,61 @@
package org.dromara.job.api.model;
import com.aizuda.snailjob.client.job.core.enums.AllocationAlgorithmEnum;
import com.aizuda.snailjob.client.job.core.enums.TriggerTypeEnum;
import com.aizuda.snailjob.common.core.enums.JobBlockStrategyEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* SnailJob
*
* @author zch
* @date 2025-03-25
*/
@Data
@Accessors(chain = true)
public class DmsJobEntity implements Serializable {
private static final long serialVersionUID = 1L;
/** 直接复制com.aizuda.snailjob.client.job.core.dto.JobResponseVO */
private Long id;
private String groupName;
private String jobName;
private String argsStr;
private String extAttrs;
private LocalDateTime nextTriggerAt;
private Integer jobStatus;
private AllocationAlgorithmEnum routeKey;//private Integer routeKey;(1:一致性哈希2:随机;3:LRU;4:轮询;5:第一个;6:最后一个;)
private Integer executorType;
private String executorInfo;
private TriggerTypeEnum triggerType;//private Integer triggerType;//触发类型:2. 固定时间 3.CRON 表达式 99.工作流
private String triggerInterval;
private JobBlockStrategyEnum blockStrategy;//private Integer blockStrategy;//阻塞策略:1、丢弃 2、覆盖 3、并行
private Integer executorTimeout;
private Integer maxRetryTimes;
private Integer retryInterval;
private Integer taskType;
private Integer parallelNum;
private String description;
private LocalDateTime createDt;
private LocalDateTime updateDt;
//DUBBO穿不了token手动传参
private String tenantId;
private String userId;
}

@ -42,6 +42,10 @@
<version>3.5.8</version> <version>3.5.8</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
</dependencies> </dependencies>

@ -21,4 +21,7 @@ public interface HwMomMesConstants {
*/ */
public static final String REDIS_KEY_DEVICE_INFO = "hw_device_info"; public static final String REDIS_KEY_DEVICE_INFO = "hw_device_info";
public static final String MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE = "1";//启用
public static final String MES_MATERIAL_BOM_ACTIVE_FLAG_HISTORY = "2";//历史
public static final String MES_MATERIAL_BOM_ACTIVE_FLAG_DESIGN = "3";//设计中
} }

@ -67,4 +67,8 @@ public enum BusinessType {
*/ */
COMPLETE, COMPLETE,
/**
*
*/
PUBLISH,
} }

@ -144,6 +144,42 @@
</dependency> </dependency>
<!-- <dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-server-common</artifactId>
<version>${snailjob.version}</version>
</dependency>
&lt;!&ndash; snail-job 重试相关依赖 &ndash;&gt;
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>${snailjob.version}</version>
</dependency>
&lt;!&ndash; snail-job 客户端核心依赖 &ndash;&gt;
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>${snailjob.version}</version>
</dependency>-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-job</artifactId>
<version>${revision}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>hwmom-api-dms</artifactId>
<version>${revision}</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -15,8 +15,6 @@ import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.dms.domain.DmsBillsFaultInstance;
import org.dromara.dms.domain.DmsFaultInstanceActivity;
import org.dromara.dms.domain.bo.DmsBillsFaultInstanceBo; import org.dromara.dms.domain.bo.DmsBillsFaultInstanceBo;
import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo; import org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo;
import org.dromara.dms.service.IDmsBillsFaultInstanceService; import org.dromara.dms.service.IDmsBillsFaultInstanceService;
@ -24,13 +22,10 @@ import org.dromara.dms.utils.TemplateExcelUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* ; *
* 访:/dms/dmsBillsFaultInstance * 访:/dms/dmsBillsFaultInstance
* *
* @author zch * @author zch
@ -45,7 +40,7 @@ public class DmsBillsFaultInstanceController extends BaseController {
private final IDmsBillsFaultInstanceService dmsBillsFaultInstanceService; private final IDmsBillsFaultInstanceService dmsBillsFaultInstanceService;
/** /**
* ; *
*/ */
@SaCheckPermission("dms:dmsBillsFaultInstance:list") @SaCheckPermission("dms:dmsBillsFaultInstance:list")
@GetMapping("/list") @GetMapping("/list")
@ -54,18 +49,18 @@ public class DmsBillsFaultInstanceController extends BaseController {
} }
/** /**
* ; *
*/ */
@SaCheckPermission("dms:dmsBillsFaultInstance:export") @SaCheckPermission("dms:dmsBillsFaultInstance:export")
@Log(title = "故障报修工单;手工创建故障报修工单", businessType = BusinessType.EXPORT) @Log(title = "故障报修工单", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(DmsBillsFaultInstanceBo bo, HttpServletResponse response) { public void export(DmsBillsFaultInstanceBo bo, HttpServletResponse response) {
List<DmsBillsFaultInstanceVo> list = dmsBillsFaultInstanceService.queryList(bo); List<DmsBillsFaultInstanceVo> list = dmsBillsFaultInstanceService.queryList(bo);
ExcelUtil.exportExcel(list, "故障报修工单;手工创建故障报修工单", DmsBillsFaultInstanceVo.class, response); ExcelUtil.exportExcel(list, "故障报修工单", DmsBillsFaultInstanceVo.class, response);
} }
/** /**
* ; *
* *
* @param repairInstanceId * @param repairInstanceId
*/ */
@ -77,10 +72,10 @@ public class DmsBillsFaultInstanceController extends BaseController {
} }
/** /**
* ; *
*/ */
@SaCheckPermission("dms:dmsBillsFaultInstance:add") @SaCheckPermission("dms:dmsBillsFaultInstance:add")
@Log(title = "故障报修工单;手工创建故障报修工单", businessType = BusinessType.INSERT) @Log(title = "故障报修工单", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DmsBillsFaultInstanceBo bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody DmsBillsFaultInstanceBo bo) {
@ -88,10 +83,10 @@ public class DmsBillsFaultInstanceController extends BaseController {
} }
/** /**
* ; *
*/ */
@SaCheckPermission("dms:dmsBillsFaultInstance:edit") @SaCheckPermission("dms:dmsBillsFaultInstance:edit")
@Log(title = "故障报修工单;手工创建故障报修工单", businessType = BusinessType.UPDATE) @Log(title = "故障报修工单", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DmsBillsFaultInstanceBo bo) { public R<Void> edit(@Validated(EditGroup.class) @RequestBody DmsBillsFaultInstanceBo bo) {
@ -99,12 +94,12 @@ public class DmsBillsFaultInstanceController extends BaseController {
} }
/** /**
* ; *
* *
* @param repairInstanceIds * @param repairInstanceIds
*/ */
@SaCheckPermission("dms:dmsBillsFaultInstance:remove") @SaCheckPermission("dms:dmsBillsFaultInstance:remove")
@Log(title = "故障报修工单;手工创建故障报修工单", businessType = BusinessType.DELETE) @Log(title = "故障报修工单", businessType = BusinessType.DELETE)
@DeleteMapping("/{repairInstanceIds}") @DeleteMapping("/{repairInstanceIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] repairInstanceIds) { @PathVariable Long[] repairInstanceIds) {
@ -113,7 +108,7 @@ public class DmsBillsFaultInstanceController extends BaseController {
/** /**
* ; *
*/ */
@GetMapping("/getDmsBillsFaultInstanceList") @GetMapping("/getDmsBillsFaultInstanceList")
@ -122,41 +117,42 @@ public class DmsBillsFaultInstanceController extends BaseController {
return R.ok(list); return R.ok(list);
} }
@PostMapping("faultRecordExport") // @PostMapping("faultRecordExport")
public void faultRecordExport(DmsBillsFaultInstance dmsBillsFaultInstance, HttpServletResponse response) throws Exception { // public void faultRecordExport(DmsBillsFaultInstance dmsBillsFaultInstance, HttpServletResponse response) throws Exception {
Map<String, Object> beanParams = new HashMap<>(); // Map<String, Object> beanParams = new HashMap<>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
DmsFaultInstanceActivity faulsts = dmsBillsFaultInstanceService.selectFaults(dmsBillsFaultInstance.getRepairInstanceId()); // DmsFaultInstanceActivity faults = dmsBillsFaultInstanceService.selectFaults(dmsBillsFaultInstance.getRepairInstanceId());
beanParams.put("applyUser",faulsts.getApplyUser()); // beanParams.put("applyUser",faults.getApplyUser());
beanParams.put("applyTime",format.format(faulsts.getApplyTime())); // beanParams.put("applyTime",format.format(faults.getApplyTime()));
beanParams.put("deviceName",faulsts.getDeviceName()); // beanParams.put("deviceName",faults.getDeviceName());
beanParams.put("deviceLocation",faulsts.getDeviceLocation()); // beanParams.put("deviceLocation",faults.getDeviceLocation());
beanParams.put("deviceCode",faulsts.getDeviceCode()); // beanParams.put("deviceCode",faults.getDeviceCode());
//
// if (faults.getRealBeginTime()!=null){
// beanParams.put("realEndTime",format.format(faults.getRealEndTime()));
// }
// if (faults.getRealEndTime()!=null){
// beanParams.put("realBeginTime",format.format(faults.getRealBeginTime()));
// }
// if (faults.getUpdateTime()!=null){
// beanParams.put("confirmTime",format.format(faults.getUpdateTime()));
// }
//// beanParams.put("realEndTime",format.format(faults.getRealEndTime()));
// beanParams.put("faultDescription",faults.getFaultDescription());
// beanParams.put("checkedFault",faults.getCheckedFault());
// beanParams.put("repairContent",faults.getRepairContent());
// beanParams.put("protectedMethod",faults.getProtectedMethod());
// beanParams.put("repairer",faults.getRepairer());
// String repairConfirm;
// if (faults.getConfirmer()!=null){
// repairConfirm = faults.getConfirmer();
// }else {
// repairConfirm = "未完成";
// }
// beanParams.put("repairConfirm",repairConfirm);
// beanParams.put("list",faults.getParts());
//
// TemplateExcelUtils.downLoadExcel("维修记录","",beanParams, response);
// }
if (faulsts.getRealBeginTime()!=null){
beanParams.put("realEndTime",format.format(faulsts.getRealEndTime()));
}
if (faulsts.getRealEndTime()!=null){
beanParams.put("realBeginTime",format.format(faulsts.getRealBeginTime()));
}
if (faulsts.getUpdateTime()!=null){
beanParams.put("confirmTime",format.format(faulsts.getUpdateTime()));
}
// beanParams.put("realEndTime",format.format(faulsts.getRealEndTime()));
beanParams.put("faultDescription",faulsts.getFaultDescription());
beanParams.put("checkedFault",faulsts.getCheckedFault());
beanParams.put("repairContent",faulsts.getRepairContent());
beanParams.put("protectedMethod",faulsts.getProtectedMethod());
beanParams.put("repairer",faulsts.getRepairer());
String repairConfirm;
if (faulsts.getConfirmer()!=null){
repairConfirm = faulsts.getConfirmer();
}else {
repairConfirm = "未完成";
}
beanParams.put("repairConfirm",repairConfirm);
beanParams.put("list",faulsts.getParts());
TemplateExcelUtils.downLoadExcel("维修记录","",beanParams, response);
}
} }

@ -76,8 +76,8 @@ public class DmsBillsInspectInstanceController extends BaseController {
@Log(title = "点巡检工单", businessType = BusinessType.INSERT) @Log(title = "点巡检工单", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DmsBillsInspectInstanceBo bo) { public R<DmsBillsInspectInstanceVo> add(@Validated(AddGroup.class) @RequestBody DmsBillsInspectInstanceBo bo) {
return toAjax(dmsBillsInspectInstanceService.insertByBo(bo)); return R.ok(dmsBillsInspectInstanceService.insertByBo(bo));
} }
/** /**
@ -87,8 +87,8 @@ public class DmsBillsInspectInstanceController extends BaseController {
@Log(title = "点巡检工单", businessType = BusinessType.UPDATE) @Log(title = "点巡检工单", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DmsBillsInspectInstanceBo bo) { public R<DmsBillsInspectInstanceVo> edit(@Validated(EditGroup.class) @RequestBody DmsBillsInspectInstanceBo bo) {
return toAjax(dmsBillsInspectInstanceService.updateByBo(bo)); return R.ok(dmsBillsInspectInstanceService.updateByBo(bo));
} }
/** /**

@ -77,8 +77,8 @@ public class DmsBillsLubeInstanceController extends BaseController {
@Log(title = "润滑工单", businessType = BusinessType.INSERT) @Log(title = "润滑工单", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DmsBillsLubeInstanceBo bo) { public R<DmsBillsLubeInstanceVo> add(@Validated(AddGroup.class) @RequestBody DmsBillsLubeInstanceBo bo) {
return toAjax(dmsBillsLubeInstanceService.insertByBo(bo)); return R.ok(dmsBillsLubeInstanceService.insertByBo(bo));
} }
/** /**
@ -88,8 +88,8 @@ public class DmsBillsLubeInstanceController extends BaseController {
@Log(title = "润滑工单", businessType = BusinessType.UPDATE) @Log(title = "润滑工单", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DmsBillsLubeInstanceBo bo) { public R<DmsBillsLubeInstanceVo> edit(@Validated(EditGroup.class) @RequestBody DmsBillsLubeInstanceBo bo) {
return toAjax(dmsBillsLubeInstanceService.updateByBo(bo)); return R.ok(dmsBillsLubeInstanceService.updateByBo(bo));
} }
/** /**

@ -77,8 +77,8 @@ public class DmsBillsMaintInstanceController extends BaseController {
@Log(title = "保养工单", businessType = BusinessType.INSERT) @Log(title = "保养工单", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DmsBillsMaintInstanceBo bo) { public R<DmsBillsMaintInstanceVo> add(@Validated(AddGroup.class) @RequestBody DmsBillsMaintInstanceBo bo) {
return toAjax(dmsBillsMaintInstanceService.insertByBo(bo)); return R.ok(dmsBillsMaintInstanceService.insertByBo(bo));
} }
/** /**
@ -88,8 +88,8 @@ public class DmsBillsMaintInstanceController extends BaseController {
@Log(title = "保养工单", businessType = BusinessType.UPDATE) @Log(title = "保养工单", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DmsBillsMaintInstanceBo bo) { public R<DmsBillsMaintInstanceVo> edit(@Validated(EditGroup.class) @RequestBody DmsBillsMaintInstanceBo bo) {
return toAjax(dmsBillsMaintInstanceService.updateByBo(bo)); return R.ok(dmsBillsMaintInstanceService.updateByBo(bo));
} }
/** /**

@ -11,7 +11,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* ; dms_bills_fault_instance * dms_bills_fault_instance
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07

@ -86,4 +86,10 @@ public class DmsBillsInspectInstance extends TenantEntity {
private String remark; private String remark;
/**
*
*/
private String status;
} }

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.tenant.core.TenantEntity;
import org.dromara.dms.domain.vo.DmsBillsLubeDetailVo; import org.dromara.dms.domain.vo.DmsBillsLubeDetailVo;
import java.io.Serial; import java.io.Serial;
@ -22,7 +23,7 @@ import java.util.List;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@TableName("dms_bills_lube_instance") @TableName("dms_bills_lube_instance")
public class DmsBillsLubeInstance extends BaseEntity { public class DmsBillsLubeInstance extends TenantEntity {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -30,7 +31,7 @@ public class DmsBillsLubeInstance extends BaseEntity {
/** /**
* *
*/ */
@TableId(value = "lube_instance_id", type = IdType.AUTO) @TableId(value = "lube_instance_id")
private Long lubeInstanceId; private Long lubeInstanceId;
/** /**
@ -93,6 +94,12 @@ public class DmsBillsLubeInstance extends BaseEntity {
*/ */
private String remark; private String remark;
/**
*
*/
private String status;
/** /**
* *
*/ */

@ -30,7 +30,8 @@ public class DmsBillsMaintInstance extends TenantEntity {
/** /**
* *
*/ */
@TableId(value = "maint_instance_id", type = IdType.AUTO) // @TableId(value = "maint_instance_id", type = IdType.AUTO)
@TableId(value = "maint_instance_id")
private Long maintInstanceId; private Long maintInstanceId;
/** /**
@ -99,6 +100,11 @@ public class DmsBillsMaintInstance extends TenantEntity {
*/ */
private String remark; private String remark;
/**
*
*/
private String status;
@TableField(exist = false) @TableField(exist = false)
private String maintStatusStr; private String maintStatusStr;

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable;
/** /**
* dms_inspect_project_device * dms_inspect_project_device
@ -14,9 +15,9 @@ import java.io.Serial;
* @date 2025-03-24 * @date 2025-03-24
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode()
@TableName("dms_inspect_project_device") @TableName("dms_inspect_project_device")
public class DmsInspectProjectDevice extends TenantEntity { public class DmsInspectProjectDevice implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -37,4 +38,9 @@ public class DmsInspectProjectDevice extends TenantEntity {
private Long targetId; private Long targetId;
/**
*
*/
private String tenantId;
} }

@ -64,4 +64,11 @@ public class DmsInspectRouteDetail extends TenantEntity {
@TableField(exist = false) @TableField(exist = false)
private String machineName;//JOIN private String machineName;//JOIN
/**
*
*/
@TableField(exist = false)
private String standardName;
} }

@ -1,6 +1,8 @@
package org.dromara.dms.domain; package org.dromara.dms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -26,6 +28,7 @@ public class DmsPlanInspect extends TenantEntity {
/** /**
* *
*/ */
@TableId(value = "plan_inspect_id", type = IdType.AUTO)
private Long planInspectId; private Long planInspectId;
/** /**

@ -99,8 +99,6 @@ public class DmsPlanLube extends TenantEntity {
private String cronExpression; private String cronExpression;
/** /**
* *
*/ */

@ -35,7 +35,7 @@ public class DmsPlanLubeDetail extends TenantEntity {
/** /**
* IDprod_base_machine_infodevice_id * IDprod_base_machine_infodevice_id
*/ */
private Long machineId; private Long deviceId;
/** /**
* , * ,

@ -12,7 +12,7 @@ import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
/** /**
* ; dms_bills_fault_instance * dms_bills_fault_instance
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07

@ -82,5 +82,10 @@ public class DmsBillsInspectInstanceBo extends BaseEntity {
*/ */
private String remark; private String remark;
/**
*
*/
private String status;
} }

@ -88,6 +88,11 @@ public class DmsBillsLubeInstanceBo extends BaseEntity {
*/ */
private String remark; private String remark;
/**
*
*/
private String status;
private String lubeStatusStr;//常量拼接的状态值 private String lubeStatusStr;//常量拼接的状态值

@ -94,4 +94,9 @@ public class DmsBillsMaintInstanceBo extends BaseEntity {
private String maintStatusStr; private String maintStatusStr;
/**
*
*/
private String status;
} }

@ -22,7 +22,7 @@ import java.util.List;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@AutoMapper(target = DmsPlanLube.class, reverseConvertGenerate = false) @AutoMapper(target = DmsPlanLube.class)
public class DmsPlanLubeBo extends BaseEntity { public class DmsPlanLubeBo extends BaseEntity {
/** /**

@ -17,7 +17,7 @@ import java.util.List;
/** /**
* ; dms_bills_fault_instance * dms_bills_fault_instance
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07

@ -104,5 +104,10 @@ public class DmsBillsInspectInstanceVo implements Serializable {
@ExcelProperty(value = "备注") @ExcelProperty(value = "备注")
private String remark; private String remark;
/**
*
*/
private String status;
} }

@ -1,7 +1,10 @@
package org.dromara.dms.domain.vo; package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.annotation.ExcelDictFormat;
@ -109,6 +112,11 @@ public class DmsBillsLubeInstanceVo implements Serializable {
@ExcelProperty(value = "备注") @ExcelProperty(value = "备注")
private String remark; private String remark;
/**
*
*/
private String status;
/** /**
* *
*/ */
@ -119,4 +127,17 @@ public class DmsBillsLubeInstanceVo implements Serializable {
*/ */
private List<DmsBillsLubeDetailVo> dmsBillsLubeDetailList; private List<DmsBillsLubeDetailVo> dmsBillsLubeDetailList;
/**
*
*/
@ExcelIgnore
private Long createBy;
/**
*
*/
@ExcelIgnore
private Date createTime;
} }

@ -118,5 +118,8 @@ public class DmsBillsMaintInstanceVo implements Serializable {
@ExcelProperty(value = "备注") @ExcelProperty(value = "备注")
private String remark; private String remark;
/**
*
*/
private String status;
} }

@ -75,4 +75,9 @@ public class DmsInspectRouteDetailVo implements Serializable {
*/ */
private String machineName;//JOIN private String machineName;//JOIN
/**
*
*/
private String standardName;//JOIN
} }

@ -2,16 +2,18 @@ package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.dms.domain.DmsPlanMaint; import org.dromara.dms.domain.DmsPlanMaint;
import org.dromara.dms.domain.DmsPlanMaintDetail;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
@ -122,4 +124,6 @@ public class DmsPlanMaintVo implements Serializable {
private Long timeLimitDays; private Long timeLimitDays;
private Long timeLimitHours; private Long timeLimitHours;
/** 保养计划明细信息 */
private List<DmsPlanMaintDetail> dmsPlanMaintDetailList;
} }

@ -0,0 +1,147 @@
package org.dromara.dms.dubbo;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.dms.api.RemoteInspectInstanceService;
import org.dromara.dms.domain.*;
import org.dromara.dms.mapper.*;
import org.dromara.dms.service.impl.DmsInspectProjectDeviceServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceService {
private final DmsPlanInspectMapper dmsPlanInspectMapper;
private final DmsInspectRouteDetailMapper dmsInspectRouteDetailMapper;
private final DmsBillsInspectInstanceMapper dmsBillsInspectInstanceMapper;
private final DmsInspectInstanceDetailMapper dmsInspectInstanceDetailMapper;
private final DmsInspectInstanceDetailProjectMapper dmsInspectInstanceDetailProjectMapper;
private final DmsInspectProjectDeviceMapper dmsInspectProjectDeviceMapper;
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertInspectInstance(String planInspectCode, String tenantId, Long userId){
// 使用 replaceAll 方法将双引号替换为空字符串
String result = planInspectCode.replaceAll("\"", "");
DmsPlanInspect dmsPlanInspect = dmsPlanInspectMapper.selectPlanInspectJoinJobByInspectCode(result);
Long timeLimit = dmsPlanInspect.getTimeLimit();
if (timeLimit != null) {
Long days = timeLimit / (24 * 60 * 60l);
Long hours = timeLimit % (24 * 60 * 60l);
// System.out.println(days);
// System.out.println(hours);
dmsPlanInspect.setTimeLimitDays(days);
dmsPlanInspect.setTimeLimitHours(hours / (60 * 60l));
}
DmsBillsInspectInstance dmsBillsInspectInstance = new DmsBillsInspectInstance();
// DmsRepairInstance dmsRepairInstance = dmsRepairInstanceService.selectDmsRepairInstanceByRepairInstanceId(2l);
dmsBillsInspectInstance.setPlanInspectId(dmsPlanInspect.getPlanInspectId());
// dmsBillsInspectInstance.setWfProcessId(105l);
dmsBillsInspectInstance.setInspectType(dmsPlanInspect.getInspectType());//检查类型(1巡检 2点检)
dmsBillsInspectInstance.setPlanBeginTime(dmsPlanInspect.getPlanTime());
dmsBillsInspectInstance.setPlanEndTime(new Date(dmsPlanInspect.getPlanTime().getTime()+dmsPlanInspect.getTimeLimit()*1000l));
dmsBillsInspectInstance.setInspectRouteId(dmsPlanInspect.getInspectRouteId());
// dmsBillsInspectInstance.setDeviceAmount(dmsPlanInspect.getDeviceAmount());//设备数量
// dmsBillsInspectInstance.setPerformer(dmsPlanInspect.getPerformer());//执行人
//写死105也可根据传入对象的wfprocessid作为传参。
/*
Long aLong = dmsRepairInstanceMapper.selectWfProcessActivityId(105l);
if (dmsBillsInspectInstance.getInspectType().equals("1")) {
dmsBillsInspectInstance.setWfProcessId(105l);
} else if (dmsBillsInspectInstance.getInspectType().equals("2")) {
dmsBillsInspectInstance.setWfProcessId(104l);
}
*/
// dmsBillsInspectInstance.setIsFlag("1");
dmsBillsInspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT);//待巡检
dmsBillsInspectInstance.setCreateBy(userId);
// dmsBillsInspectInstance.setCreateTime(new Date());
dmsBillsInspectInstance.setTenantId(tenantId);
int i = dmsBillsInspectInstanceMapper.insert(dmsBillsInspectInstance);
// List<DmsBillsInspectInstance> dmsBillsInspectInstances = dmsBillsInspectInstanceMapper.selectDmsBillsInspectInstanceList(dmsBillsInspectInstance);
//新建第一步工单实例节点
/*
DmsBillsInspectInstanceActivity dmsBillsInspectInstanceActivity = new DmsBillsInspectInstanceActivity();
dmsBillsInspectInstanceActivity.setInspectInstanceId(dmsBillsInspectInstance.getInspectInstanceId());
dmsBillsInspectInstanceActivity.setInspectRouteId(dmsBillsInspectInstance.getInspectRouteId());
dmsBillsInspectInstanceActivity.setDeviceAmount(dmsBillsInspectInstance.getDeviceAmount());
dmsBillsInspectInstanceActivity.setPerformer(dmsBillsInspectInstance.getPerformer());
dmsBillsInspectInstanceActivity.setProcessStepOrder(1l);
dmsBillsInspectInstanceActivity.setProcessActivityId(aLong);
dmsBillsInspectInstanceActivityMapper.insertDmsBillsInspectInstanceActivity(dmsBillsInspectInstanceActivity);
*/
//新建点巡检工单明细
/* DmsInspectRouteDetail queryInspectRouteDetail = new DmsInspectRouteDetail();
queryInspectRouteDetail.setInspectRouteId(dmsBillsInspectInstance.getInspectRouteId());*/
MPJLambdaWrapper<DmsInspectRouteDetail> lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class)
.eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId());
List<DmsInspectRouteDetail> dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw);
for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){
DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail();
Long deviceId = dmsInspectRouteDetail.getMachineId();
dmsInspectInstanceDetail.setInspectInstanceId(dmsBillsInspectInstance.getInspectInstanceId());
dmsInspectInstanceDetail.setLineStep(dmsInspectRouteDetail.getLineStep());
dmsInspectInstanceDetail.setMachineId(deviceId);
dmsInspectInstanceDetail.setInstanceDetailStatus("1");//1待巡检 2巡检中 3已完成
dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard());
dmsInspectInstanceDetail.setInspectStatus("0");//FIXME:为什么设置为异常设备状态1正常 0异常
// dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(dmsInspectInstanceDetail);
dmsInspectInstanceDetail.setTenantId(tenantId);
dmsInspectInstanceDetail.setCreateBy(userId);
// dmsInspectInstanceDetail.setCreateTime(new Date());
dmsInspectInstanceDetailMapper.insert(dmsInspectInstanceDetail);
Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(dmsInspectRouteDetail.getInspectStandard());
// DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice();
// queryInspectProjectDevice.setTargetType("2");//FIXME:关联类型(1设备类型)
// queryInspectProjectDevice.setTargetId(deviceId);
MPJLambdaWrapper<DmsInspectProjectDevice> DmsInspectProjectDeviceLQW = JoinWrappers.lambda(DmsInspectProjectDevice.class)
.eq(DmsInspectProjectDevice::getTargetType, "2")//FIXME:关联类型(1设备类型)
.eq(DmsInspectProjectDevice::getTargetId, deviceId);
List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectList(DmsInspectProjectDeviceLQW);
// for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){
DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject();
dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId());
dmsInspectInstanceDetailProject.setInspectProjectId(projectId);
// dmsInspectInstanceDetailProjectMapper.insertDmsInspectInstanceDetailProject(dmsInspectInstanceDetailProject);
dmsInspectInstanceDetailProject.setTenantId(tenantId);
dmsInspectInstanceDetailProject.setCreateBy(userId);
// dmsInspectInstanceDetailProject.setCreateTime(new Date());
dmsInspectInstanceDetailProjectMapper.insert(dmsInspectInstanceDetailProject);
// }
}
return R.ok(i);
}
}

@ -0,0 +1,133 @@
package org.dromara.dms.dubbo;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.dms.domain.*;
import org.dromara.dms.domain.bo.DmsBillsLubeInstanceBo;
import org.dromara.dms.domain.bo.DmsPlanLubeBo;
import org.dromara.dms.domain.vo.DmsBillsLubeInstanceVo;
import org.dromara.dms.domain.vo.DmsPlanLubeDetailVo;
import org.dromara.dms.mapper.*;
import org.dromara.dms.service.IDmsBillsLubeInstanceService;
import org.dromara.dms.service.IDmsPlanInspectService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.dms.api.RemoteLubeInstanceService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService {
private final DmsBillsLubeInstanceMapper dmsBillsLubeInstanceMapper;
private final DmsBillsLubeDetailMapper dmsBillsLubeDetailMapper;
private final DmsPlanLubeMapper dmsPlanLubeMapper;
private final DmsBillsLubeInstanceActivityMapper dmsBillsLubeInstanceActivityMapper;
private final DmsPlanLubeDetailMapper dmsPlanLubeDetailMapper;
private final IDmsBillsLubeInstanceService dmsBillsLubeInstanceService;
private final IDmsPlanInspectService dmsPlanInspectService;
private final DmsPlanInspectMapper dmsPlanInspectMapper;
private final DmsInspectRouteDetailMapper dmsInspectRouteDetailMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public R<Void> insertLubeInstance(String planLubeCode, String tenantId, Long userId) {
// 去除润滑计划编号中的双引号
// String lubeInstanceCodeS = planLubeCode.replaceAll("\"", "");
// 根据润滑计划编号查询润滑计划信息
DmsPlanLube dmsPlanLube = dmsPlanLubeMapper.selectDmsPlanLubeJoinByPlanLubeCode(planLubeCode);
DmsPlanLubeDetail dmsPlanLubeDetail = new DmsPlanLubeDetail();
dmsPlanLubeDetail.setPlanLubeId(dmsPlanLube.getPlanLubeId());
MPJLambdaWrapper<DmsPlanLubeDetail> dmsPlanLubeDetailWrapper = JoinWrappers
.lambda(DmsPlanLubeDetail.class)
.eq(DmsPlanLubeDetail::getPlanLubeId, dmsPlanLube.getPlanLubeId());
List<DmsPlanLubeDetailVo> dmsPlanLubeDetailList = dmsPlanLubeDetailMapper.selectVoList(dmsPlanLubeDetailWrapper);
dmsPlanLube.setDmsPlanLubeDetailList(dmsPlanLubeDetailList);
// 获取润滑计划详情列表
List<DmsPlanLubeDetailVo> planLubeDetails = dmsPlanLube.getDmsPlanLubeDetailList();
if (planLubeDetails == null || planLubeDetails.isEmpty()) {
// 如果润滑计划详情为空返回false
return R.fail();
}
// 创建新的润滑工单实例对象
DmsBillsLubeInstance dmsBillsLubeInstance = new DmsBillsLubeInstance();
// 设置创建人
dmsBillsLubeInstance.setCreateBy(dmsPlanLube.getCreateBy());
// 设置润滑工单的计划ID
dmsBillsLubeInstance.setPlanLubeId(dmsPlanLube.getPlanLubeId());
// 设置计划开始时间为润滑时间
dmsBillsLubeInstance.setPlanBeginTime(dmsPlanLube.getLubeTime());
// 生成并设置润滑工单编码
dmsBillsLubeInstance.setBillsLubeCode(Seq.getId(Seq.dmsLubeInstanceSeqType, Seq.dmsLubeInstanceCode));
// 设置润滑状态为待润滑
dmsBillsLubeInstance.setLubeStatus(DmsConstants.DMS_BILLS_LUBE_INSTANCE_STATUS_TO_LUBE);
// 设置润滑组
dmsBillsLubeInstance.setLubeGroup(dmsPlanLube.getLubeGroup());
// 设置润滑监督人
dmsBillsLubeInstance.setLubeSupervisor(dmsPlanLube.getLubeSupervisor());
// 设置润滑级别
dmsBillsLubeInstance.setLubeLevel(dmsPlanLube.getLubeLevel());
// 获取时间限制
Long timeLimit = dmsPlanLube.getTimeLimit();
// 计算并设置计划结束时间
Date planEndTime = new Date(dmsPlanLube.getLubeTime().getTime() + timeLimit * 1000L);
dmsBillsLubeInstance.setPlanEndTime(planEndTime);
dmsBillsLubeInstance.setCreateBy(userId);
// dmsBillsLubeInstance.setCreateTime(new Date());
dmsBillsLubeInstance.setTenantId(tenantId);
// 插入润滑工单实例到数据库
int i = dmsBillsLubeInstanceMapper.insert(dmsBillsLubeInstance);
DmsPlanLubeBo dmsPlanLubeBo = MapstructUtils.convert(dmsPlanLube, DmsPlanLubeBo.class);
// 批量插入润滑工单详情
List<DmsPlanLubeDetailVo> lubeDetails = dmsPlanLubeBo.getDmsPlanLubeDetailList();
List<DmsBillsLubeDetail> billsLubeDetails = new ArrayList<>();
for (DmsPlanLubeDetailVo planLubeDetail : lubeDetails) {
DmsBillsLubeDetail dmsBillsLubeDetail = new DmsBillsLubeDetail();
dmsBillsLubeDetail.setLubeInstanceId(dmsBillsLubeInstance.getLubeInstanceId());
dmsBillsLubeDetail.setMachineId(planLubeDetail.getDeviceId());
dmsBillsLubeDetail.setLubeStationId(planLubeDetail.getLubeStationId());
dmsBillsLubeDetail.setLubeStandardId(planLubeDetail.getLubeStandardId());
//dmsBillsLubeDetail.setActiveFlag("Y"); // 假设是否标记字段对应activeFlag
dmsBillsLubeDetail.setTenantId(tenantId);
dmsBillsLubeDetail.setCreateBy(userId);
// dmsBillsLubeDetail.setCreateTime(new Date());
dmsBillsLubeDetailMapper.insert(dmsBillsLubeDetail);
}
return R.ok();
}
}

@ -0,0 +1,130 @@
package org.dromara.dms.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.api.RemoteMaintInstanceService;
import org.dromara.dms.domain.*;
import org.dromara.dms.mapper.DmsBillsMaintDetailMapper;
import org.dromara.dms.mapper.DmsBillsMaintDetailProjectMapper;
import org.dromara.dms.mapper.DmsBillsMaintInstanceMapper;
import org.dromara.dms.mapper.DmsPlanMaintMapper;
import org.dromara.system.api.model.LoginUser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceService {
private final DmsPlanMaintMapper dmsPlanMaintMapper;
private final DmsBillsMaintInstanceMapper dmsBillsMaintInstanceMapper;
private final DmsBillsMaintDetailMapper dmsBillsMaintDetailMapper;
private final DmsBillsMaintDetailProjectMapper dmsBillsMaintDetailProjectMapper;
/**
*
*
* @param planMaintCode
* @return
*/
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertDmsBillsMaintInstance(String planMaintCode , String tenantId, Long userId) {
String planMaintCodeS = planMaintCode.replaceAll("\"", "");
DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS);
List<DmsPlanMaintDetail> planMaintDetails = dmsPlanMaint.getDmsPlanMaintDetailList();
if (planMaintDetails == null || planMaintDetails.isEmpty()) {
return R.fail();
}
DmsBillsMaintInstance dmsBillsMaintInstance = new DmsBillsMaintInstance();
dmsBillsMaintInstance.setPlanBeginTime(dmsPlanMaint.getMaintTime());
dmsBillsMaintInstance.setPlanMaintId(dmsPlanMaint.getPlanMaintId());
dmsBillsMaintInstance.setBillsMaintCode(Seq.getId(Seq.maintInstanceSeqType, Seq.maintInstanceCode));
dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_TO_MAINT);//待保养
dmsBillsMaintInstance.setMaintGroup(dmsPlanMaint.getMaintGroup());
dmsBillsMaintInstance.setMaintSupervisor(dmsPlanMaint.getMaintSupervisor());
dmsBillsMaintInstance.setMaintLevel(dmsPlanMaint.getMaintLevel());
Date lubeTime = dmsPlanMaint.getMaintTime();
Long timeLimit = dmsPlanMaint.getTimeLimit();
// dmsBillsMaintInstance.setIsFlag(1l);
// dmsBillsMaintInstance.setWfProcessId(103l);
dmsBillsMaintInstance.setPlanEndTime(new Date(lubeTime.getTime() + timeLimit * 1000l));
//字段没有自动填充,只能代码手动填充
dmsBillsMaintInstance.setCreateBy(userId);
dmsBillsMaintInstance.setTenantId(tenantId);
int i = dmsBillsMaintInstanceMapper.insert(dmsBillsMaintInstance);
// DmsMaintInstanceActivity dmsMaintInstanceActivity = new DmsMaintInstanceActivity();
// dmsMaintInstanceActivity.setMaintInstanceId(dmsBillsMaintInstance.getMaintInstanceId());
// dmsMaintInstanceActivity.setProcessStepOrder(1L);
// int i1 = dmsMaintInstanceActivityMapper.insertDmsMaintInstanceActivity(dmsMaintInstanceActivity);
batchInsertDmsBillsMaintDetail(dmsPlanMaint, dmsBillsMaintInstance.getMaintInstanceId(), tenantId, userId);
return R.ok(i);
}
@Transactional( rollbackFor = Exception.class )
public void batchInsertDmsBillsMaintDetail(DmsPlanMaint dmsPlanMaint, Long maintInstanceId, String tenantId, Long userId) {
List<DmsPlanMaintDetail> planMaintDetails = dmsPlanMaint.getDmsPlanMaintDetailList();
List<DmsBillsMaintDetail> billsMaintDetails = new ArrayList<>();
planMaintDetails.forEach(planMaintDetail -> {
DmsBillsMaintDetail dmsBillsMaintDetail = new DmsBillsMaintDetail();
dmsBillsMaintDetail.setMaintInstanceId(maintInstanceId);
dmsBillsMaintDetail.setMachineId(planMaintDetail.getMachineId());
dmsBillsMaintDetail.setMaintStationId(planMaintDetail.getMaintStationId());
dmsBillsMaintDetail.setMaintStandardId(planMaintDetail.getMaintStandardId());
// dmsBillsMaintDetail.setIsFlag(1L);
dmsBillsMaintDetail.setMaintStatus(1L);//保养状态1待保养 2保养中 3已完成
//字段没有自动填充,只能代码手动填充
dmsBillsMaintDetail.setCreateBy(userId);
dmsBillsMaintDetail.setTenantId(tenantId);
dmsBillsMaintDetailMapper.insert(dmsBillsMaintDetail);
});
ArrayList<DmsBillsMaintDetailProject> billsMaintDetailProjectList = new ArrayList<>();
List<DmsBillsMaintDetail> list = dmsBillsMaintDetailMapper.selectDetailList(maintInstanceId);
for (DmsBillsMaintDetail detail : list) {
List<DmsBaseMaintProject> projects = dmsBillsMaintDetailMapper.selectPrjectIds(detail.getMaintStationId());
for (DmsBaseMaintProject project : projects) {
DmsBillsMaintDetailProject billsMaintDetailProject = new DmsBillsMaintDetailProject();
billsMaintDetailProject.setBillsMaintDetailId(detail.getBillsMaintDetailId());
// DmsBaseMaintStation station = dmsBillsMaintDetailMapper.selectMainStation(detail.getStationId());
billsMaintDetailProject.setMaintProjectId(project.getMaintProjectId());
billsMaintDetailProject.setMaintProjectName(project.getMaintProjectName());
billsMaintDetailProject.setMaintProjectDesc(project.getMaintProjectDesc());
billsMaintDetailProject.setMaintProjectStatus("2");//保养项目状态0待保养 1保养完成FIXME:为什么是2
//字段没有自动填充,只能代码手动填充
billsMaintDetailProject.setCreateBy(userId);
billsMaintDetailProject.setTenantId(tenantId);
dmsBillsMaintDetailProjectMapper.insert(billsMaintDetailProject);
}
}
}
}

@ -0,0 +1,132 @@
package org.dromara.dms.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.api.RemoteRepairStanceService;
import org.dromara.dms.domain.DmsPlanRepair;
import org.dromara.dms.domain.DmsRepairInstance;
import org.dromara.dms.domain.DmsRepairInstanceActivity;
import org.dromara.dms.mapper.DmsPlanRepairMapper;
import org.dromara.dms.mapper.DmsRepairInstanceActivityMapper;
import org.dromara.dms.mapper.DmsRepairInstanceMapper;
import org.dromara.dms.service.IDmsPlanRepairService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.Date;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteRepairStanceServicempl implements RemoteRepairStanceService {
private final DmsPlanRepairMapper dmsPlanRepairMapper;
private final DmsRepairInstanceMapper dmsRepairInstanceMapper;
private final DmsRepairInstanceActivityMapper dmsRepairInstanceActivityMapper;
private final IDmsPlanRepairService dmsPlanRepairService;
public static String lastDate="2000-01-01";
//流水号
public static int serialNumber = 0;
/**
* ;
*
*/
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertDmsRepairInstance(String planRepairCode) {
String repairCode = planRepairCode.replaceAll("\"", "");
DmsPlanRepair dmsPlanRepair = dmsPlanRepairMapper.selectDmsPlanRepairByPlanRepairCode(repairCode);
Long timeLimit = dmsPlanRepair.getTimeLimit();
if (timeLimit !=null){
Long days = timeLimit / (24 * 60 * 60l);
Long hours = timeLimit % (24 * 60 * 60l);
dmsPlanRepair.setTimeLimitDays(days);
dmsPlanRepair.setTimeLimitHours(hours/(60*60l));
}
dmsPlanRepair.setCreateMethod("2");//1:手工创建工单2根据计划自动创建工单
DmsRepairInstance dmsRepairInstance = new DmsRepairInstance();
// dmsRepairInstance.setWfProcessId(101l);
dmsRepairInstance.setPlanRepairId(dmsPlanRepair.getPlanRepairId());
dmsRepairInstance.setPlanBeginTime(dmsPlanRepair.getRepairTime());
dmsRepairInstance.setInstanceType("2");//工单类型1手工创建 2自动创建
// dmsRepairInstance.setRepairType(dmsPlanRepair.getRepairType());
// dmsRepairInstance.setRepairGroup(dmsPlanRepair.getRepairGroup());
// dmsRepairInstance.setRepairSupervisor(dmsPlanRepair.getRepairSupervisor());
// WfProcessActivity wfProcessActivity = new WfProcessActivity();
// wfProcessActivity.setWfProcessId(dmsRepairInstance.getWfProcessId());
// Long aLong = dmsRepairInstanceMapper.selectWfProcessActivityId(dmsRepairInstance.getWfProcessId());
// 创建一个SimpleDateFormat对象用于格式化日期为"yyyyMMdd"格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 获取当前日期
Date date = new Date();
// 将当前日期格式化为字符串
String format = sdf.format(date);
// 如果格式化后的日期字符串与上次记录的日期不同
if (!format.equals(lastDate)){
// 更新上次记录的日期为当前日期
lastDate = format;
// 重置序列号为0
serialNumber = 0;
}
// 增加序列号
serialNumber++;
// 将序列号格式化为6位数不足部分用0填充
String serialNumberStr = String.format("%06d", serialNumber);
// 拼接日期和序列号生成每日代码
String dailyCode = format + serialNumberStr;
// 设置维修单的代码
dmsRepairInstance.setBillsRepairCode(dailyCode);
// LoginUser user = SecurityUtils.getLoginUser();
LoginUser user = LoginHelper.getLoginUser();
if (dmsRepairInstance.getPlanBeginTime()!=null){
DmsPlanRepair planRepair = dmsPlanRepairMapper.selectDmsPlanRepairByPlanRepairId(dmsRepairInstance.getPlanRepairId());
Long limit = planRepair.getTimeLimit();
Date planBeginTime = dmsRepairInstance.getPlanBeginTime();
dmsRepairInstance.setPlanEndTime(new Date(planBeginTime.getTime() + limit*1000l));
}
// dmsRepairInstance.setIsFlag("1");
dmsRepairInstance.setBillsStatus("1");//工单状态0待检修 1检修中 2检修完成
if (dmsRepairInstance.getInstanceType()==null) {
dmsRepairInstance.setInstanceType("1");//工单类型1手工创建 2自动创建
}
// dmsRepairInstance.setApplyBy(user.getUsername());
// dmsRepairInstance.setApplyTime(DateUtils.getNowDate());
// dmsRepairInstance.setWfProcessId(101l);
int flag = dmsRepairInstanceMapper.insert(dmsRepairInstance);
//创建工单时新建工单实例节点
DmsRepairInstanceActivity dmsRepairInstanceActivity = new DmsRepairInstanceActivity();
dmsRepairInstanceActivity.setRepairInstanceId(dmsRepairInstance.getRepairInstanceId());
dmsRepairInstanceActivity.setProcessHandleStatus("1");//状态(0已结束 1执行中 2待接取 3已转发
//先写死第一步所对应的步骤后续通过wfProcessId来查询步骤对应的id
// dmsRepairInstanceActivity.setProcessActivityId(aLong);
dmsRepairInstanceActivity.setProcessStepOrder(1l);//工单流程步骤顺序
// dmsRepairInstanceActivity.setCreateBy();
dmsRepairInstanceActivity.setCreateTime(DateUtils.getNowDate());
dmsRepairInstanceActivity.setStartTime(DateUtils.getNowDate());
// dmsRepairInstanceActivity.setRepairType(dmsRepairInstance.getRepairType());
// dmsRepairInstanceActivity.setRepairGroup(dmsRepairInstance.getRepairGroup());
// dmsRepairInstanceActivity.setRepairSupervisor(dmsRepairInstance.getRepairSupervisor());
dmsRepairInstanceActivityMapper.insert(dmsRepairInstanceActivity);
return R.ok(flag);
}
}

@ -10,7 +10,7 @@ import org.dromara.dms.domain.vo.DmsFaultInstanceActivityVo;
import java.util.List; import java.util.List;
/** /**
* ;Mapper * Mapper
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07

@ -1,6 +1,7 @@
package org.dromara.dms.mapper; package org.dromara.dms.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.dms.domain.DmsBaseMaintProject;
import org.dromara.dms.domain.DmsBillsMaintDetail; import org.dromara.dms.domain.DmsBillsMaintDetail;
import org.dromara.dms.domain.DmsBillsMaintInstance; import org.dromara.dms.domain.DmsBillsMaintInstance;
import org.dromara.dms.domain.vo.DmsBaseMaintProjectVo; import org.dromara.dms.domain.vo.DmsBaseMaintProjectVo;
@ -25,11 +26,11 @@ public interface DmsBillsMaintDetailMapper extends BaseMapperPlus<DmsBillsMaintD
*/ */
public List<DmsBillsMaintDetail> selectDmsBillsMaintDetailJoinList(DmsBillsMaintDetail dmsBillsMaintDetail); public List<DmsBillsMaintDetail> selectDmsBillsMaintDetailJoinList(DmsBillsMaintDetail dmsBillsMaintDetail);
List<DmsBillsMaintDetailVo> selectDetailList(Long maintInstanceId); List<DmsBillsMaintDetail> selectDetailList(Long maintInstanceId);
DmsBaseMaintStationVo selectMainStation(Long stationId); DmsBaseMaintStationVo selectMainStation(Long stationId);
List<DmsBaseMaintProjectVo> selectPrjectIds(Long stationId); List<DmsBaseMaintProject> selectPrjectIds(Long stationId);
/** /**
* Join * Join

@ -12,4 +12,5 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface DmsInspectProjectDeviceMapper extends BaseMapperPlus<DmsInspectProjectDevice, DmsInspectProjectDeviceVo> { public interface DmsInspectProjectDeviceMapper extends BaseMapperPlus<DmsInspectProjectDevice, DmsInspectProjectDeviceVo> {
} }

@ -16,6 +16,6 @@ public interface DmsPlanInspectMapper extends BaseMapperPlus<DmsPlanInspect, Dms
DmsPlanInspectVo selectPlanInspectJoinJobByInspectId(Long planInspectId); DmsPlanInspectVo selectPlanInspectJoinJobByInspectId(Long planInspectId);
DmsPlanInspectVo selectPlanInspectJoinJobByInspectId1(String planInspectId); DmsPlanInspect selectPlanInspectJoinJobByInspectCode(String planInspectCode);
} }

@ -26,7 +26,7 @@ public interface DmsPlanMaintMapper extends BaseMapperPlus<DmsPlanMaint, DmsPlan
* @param planMaintId * @param planMaintId
* @return * @return
*/ */
public DmsPlanMaint selectPlanMaintJoinJobByPlanMaintId(Long planMaintId); public DmsPlanMaint selectDmsPlanMaintByPlanMaintId(Long planMaintId);
} }

@ -1,6 +1,7 @@
package org.dromara.dms.mapper; package org.dromara.dms.mapper;
import org.dromara.dms.domain.DmsPlanRepair; import org.dromara.dms.domain.DmsPlanRepair;
import org.dromara.dms.domain.DmsPlanRepairDetail;
import org.dromara.dms.domain.vo.DmsPlanRepairVo; import org.dromara.dms.domain.vo.DmsPlanRepairVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@ -12,4 +13,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface DmsPlanRepairMapper extends BaseMapperPlus<DmsPlanRepair, DmsPlanRepairVo> { public interface DmsPlanRepairMapper extends BaseMapperPlus<DmsPlanRepair, DmsPlanRepairVo> {
DmsPlanRepair selectDmsPlanRepairByPlanRepairCode(String planRepairCode);
DmsPlanRepair selectDmsPlanRepairByPlanRepairId(Long planRepairId);
} }

@ -10,7 +10,7 @@ import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
* ;Service * Service
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07
@ -18,48 +18,48 @@ import java.util.List;
public interface IDmsBillsFaultInstanceService { public interface IDmsBillsFaultInstanceService {
/** /**
* ; *
* *
* @param repairInstanceId * @param repairInstanceId
* @return ; * @return
*/ */
DmsBillsFaultInstanceVo queryById(Long repairInstanceId); DmsBillsFaultInstanceVo queryById(Long repairInstanceId);
/** /**
* ; *
* *
* @param bo * @param bo
* @param pageQuery * @param pageQuery
* @return ; * @return
*/ */
TableDataInfo<DmsBillsFaultInstanceVo> queryPageList(DmsBillsFaultInstanceBo bo, PageQuery pageQuery); TableDataInfo<DmsBillsFaultInstanceVo> queryPageList(DmsBillsFaultInstanceBo bo, PageQuery pageQuery);
/** /**
* ; *
* *
* @param bo * @param bo
* @return ; * @return
*/ */
List<DmsBillsFaultInstanceVo> queryList(DmsBillsFaultInstanceBo bo); List<DmsBillsFaultInstanceVo> queryList(DmsBillsFaultInstanceBo bo);
/** /**
* ; *
* *
* @param bo ; * @param bo
* @return * @return
*/ */
Boolean insertByBo(DmsBillsFaultInstanceBo bo); Boolean insertByBo(DmsBillsFaultInstanceBo bo);
/** /**
* ; *
* *
* @param bo ; * @param bo
* @return * @return
*/ */
Boolean updateByBo(DmsBillsFaultInstanceBo bo); Boolean updateByBo(DmsBillsFaultInstanceBo bo);
/** /**
* ; *
* *
* @param ids * @param ids
* @param isValid * @param isValid

@ -48,7 +48,7 @@ public interface IDmsBillsInspectInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean insertByBo(DmsBillsInspectInstanceBo bo); DmsBillsInspectInstanceVo insertByBo(DmsBillsInspectInstanceBo bo);
/** /**
* *
@ -56,7 +56,7 @@ public interface IDmsBillsInspectInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean updateByBo(DmsBillsInspectInstanceBo bo); DmsBillsInspectInstanceVo updateByBo(DmsBillsInspectInstanceBo bo);
/** /**
* *

@ -48,7 +48,7 @@ public interface IDmsBillsLubeInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean insertByBo(DmsBillsLubeInstanceBo bo); DmsBillsLubeInstanceVo insertByBo(DmsBillsLubeInstanceBo bo);
/** /**
* *
@ -56,7 +56,7 @@ public interface IDmsBillsLubeInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean updateByBo(DmsBillsLubeInstanceBo bo); DmsBillsLubeInstanceVo updateByBo(DmsBillsLubeInstanceBo bo);
/** /**
* *

@ -49,7 +49,7 @@ public interface IDmsBillsMaintInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean insertByBo(DmsBillsMaintInstanceBo bo); DmsBillsMaintInstanceVo insertByBo(DmsBillsMaintInstanceBo bo);
/** /**
* *
@ -57,7 +57,7 @@ public interface IDmsBillsMaintInstanceService {
* @param bo * @param bo
* @return * @return
*/ */
Boolean updateByBo(DmsBillsMaintInstanceBo bo); DmsBillsMaintInstanceVo updateByBo(DmsBillsMaintInstanceBo bo);
/** /**
* *

@ -24,7 +24,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* ;Service * Service
* *
* @author zch * @author zch
* @date 2025-04-07 * @date 2025-04-07
@ -38,10 +38,10 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
private final DmsBillsFaultInstanceMapper dmsBillsFaultInstanceMapper; private final DmsBillsFaultInstanceMapper dmsBillsFaultInstanceMapper;
/** /**
* ; *
* *
* @param repairInstanceId * @param repairInstanceId
* @return ; * @return
*/ */
@Override @Override
public DmsBillsFaultInstanceVo queryById(Long repairInstanceId){ public DmsBillsFaultInstanceVo queryById(Long repairInstanceId){
@ -49,11 +49,11 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
/** /**
* ; *
* *
* @param bo * @param bo
* @param pageQuery * @param pageQuery
* @return ; * @return
*/ */
@Override @Override
public TableDataInfo<DmsBillsFaultInstanceVo> queryPageList(DmsBillsFaultInstanceBo bo, PageQuery pageQuery) { public TableDataInfo<DmsBillsFaultInstanceVo> queryPageList(DmsBillsFaultInstanceBo bo, PageQuery pageQuery) {
@ -63,10 +63,10 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
/** /**
* ; *
* *
* @param bo * @param bo
* @return ; * @return
*/ */
@Override @Override
public List<DmsBillsFaultInstanceVo> queryList(DmsBillsFaultInstanceBo bo) { public List<DmsBillsFaultInstanceVo> queryList(DmsBillsFaultInstanceBo bo) {
@ -100,9 +100,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
/** /**
* ; *
* *
* @param bo ; * @param bo
* @return * @return
*/ */
@Override @Override
@ -117,9 +117,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
/** /**
* ; *
* *
* @param bo ; * @param bo
* @return * @return
*/ */
@Override @Override
@ -137,7 +137,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
} }
/** /**
* ; *
* *
* @param ids * @param ids
* @param isValid * @param isValid

@ -108,14 +108,14 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
* @return * @return
*/ */
@Override @Override
public Boolean insertByBo(DmsBillsInspectInstanceBo bo) { public DmsBillsInspectInstanceVo insertByBo(DmsBillsInspectInstanceBo bo) {
DmsBillsInspectInstance add = MapstructUtils.convert(bo, DmsBillsInspectInstance.class); DmsBillsInspectInstance add = MapstructUtils.convert(bo, DmsBillsInspectInstance.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setInspectInstanceId(add.getInspectInstanceId()); bo.setInspectInstanceId(add.getInspectInstanceId());
} }
return flag; return MapstructUtils.convert(add, DmsBillsInspectInstanceVo.class);
} }
/** /**
@ -125,10 +125,10 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
* @return * @return
*/ */
@Override @Override
public Boolean updateByBo(DmsBillsInspectInstanceBo bo) { public DmsBillsInspectInstanceVo updateByBo(DmsBillsInspectInstanceBo bo) {
DmsBillsInspectInstance update = MapstructUtils.convert(bo, DmsBillsInspectInstance.class); DmsBillsInspectInstance update = MapstructUtils.convert(bo, DmsBillsInspectInstance.class);
validEntityBeforeSave(update); validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0; return MapstructUtils.convert(update, DmsBillsInspectInstanceVo.class);
} }
/** /**

@ -29,6 +29,7 @@ import org.dromara.dms.mapper.*;
import org.dromara.dms.service.IDmsBillsLubeInstanceService; import org.dromara.dms.service.IDmsBillsLubeInstanceService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -124,14 +125,14 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
* @return * @return
*/ */
@Override @Override
public Boolean insertByBo(DmsBillsLubeInstanceBo bo) { public DmsBillsLubeInstanceVo insertByBo(DmsBillsLubeInstanceBo bo) {
DmsBillsLubeInstance add = MapstructUtils.convert(bo, DmsBillsLubeInstance.class); DmsBillsLubeInstance add = MapstructUtils.convert(bo, DmsBillsLubeInstance.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setLubeInstanceId(add.getLubeInstanceId()); bo.setLubeInstanceId(add.getLubeInstanceId());
} }
return flag; return MapstructUtils.convert(add, DmsBillsLubeInstanceVo.class);
} }
/** /**
@ -141,10 +142,10 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
* @return * @return
*/ */
@Override @Override
public Boolean updateByBo(DmsBillsLubeInstanceBo bo) { public DmsBillsLubeInstanceVo updateByBo(DmsBillsLubeInstanceBo bo) {
DmsBillsLubeInstance update = MapstructUtils.convert(bo, DmsBillsLubeInstance.class); DmsBillsLubeInstance update = MapstructUtils.convert(bo, DmsBillsLubeInstance.class);
validEntityBeforeSave(update); validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0; return MapstructUtils.convert(update, DmsBillsLubeInstanceVo.class);
} }
/** /**
@ -225,13 +226,13 @@ public class DmsBillsLubeInstanceServiceImpl implements IDmsBillsLubeInstanceSer
dmsBillsLubeInstanceBo.setPlanEndTime(planEndTime); dmsBillsLubeInstanceBo.setPlanEndTime(planEndTime);
// 插入润滑工单实例到数据库 // 插入润滑工单实例到数据库
boolean success = this.insertByBo(dmsBillsLubeInstanceBo); DmsBillsLubeInstanceVo billsLubeInstance = this.insertByBo(dmsBillsLubeInstanceBo);
DmsPlanLubeBo dmsPlanLubeBo = MapstructUtils.convert(dmsPlanLube, DmsPlanLubeBo.class); DmsPlanLubeBo dmsPlanLubeBo = MapstructUtils.convert(dmsPlanLube, DmsPlanLubeBo.class);
// 批量插入润滑工单详情 // 批量插入润滑工单详情
batchInsertDmsBillsLubeDetail(dmsPlanLubeBo, dmsBillsLubeInstanceBo.getLubeInstanceId()); batchInsertDmsBillsLubeDetail(dmsPlanLubeBo, dmsBillsLubeInstanceBo.getLubeInstanceId());
return success; return !ObjectUtils.isEmpty(billsLubeInstance);//不为空返回true
} }
/** /**

@ -63,7 +63,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
* @return * @return
*/ */
@Override @Override
public DmsBillsMaintInstanceVo queryById(Long maintInstanceId){ public DmsBillsMaintInstanceVo queryById(Long maintInstanceId) {
return baseMapper.selectVoById(maintInstanceId); return baseMapper.selectVoById(maintInstanceId);
} }
@ -96,26 +96,24 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
private MPJLambdaWrapper<DmsBillsMaintInstance> buildQueryWrapper(DmsBillsMaintInstanceBo bo) { private MPJLambdaWrapper<DmsBillsMaintInstance> buildQueryWrapper(DmsBillsMaintInstanceBo bo) {
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<DmsBillsMaintInstance> lqw = JoinWrappers.lambda(DmsBillsMaintInstance.class) MPJLambdaWrapper<DmsBillsMaintInstance> lqw = JoinWrappers.lambda(DmsBillsMaintInstance.class)
.selectAll(DmsBillsMaintInstance.class) .selectAll(DmsBillsMaintInstance.class)
.select(DmsPlanMaint::getMaintSupervisor) .select(DmsPlanMaint::getMaintSupervisor)
.selectAs(DmsPlanMaint::getRemark,DmsBillsMaintInstance::getPlanRemark) .selectAs(DmsPlanMaint::getRemark, DmsBillsMaintInstance::getPlanRemark)
.leftJoin(DmsPlanMaint.class,DmsPlanMaint::getPlanMaintId,DmsBillsMaintInstance::getPlanMaintId) .leftJoin(DmsPlanMaint.class, DmsPlanMaint::getPlanMaintId, DmsBillsMaintInstance::getPlanMaintId)
.eq(bo.getMaintInstanceId() != null, DmsBillsMaintInstance::getMaintInstanceId, bo.getMaintInstanceId())
.eq(bo.getMaintInstanceId() != null, DmsBillsMaintInstance::getMaintInstanceId, bo.getMaintInstanceId()) .eq(bo.getPlanMaintId() != null, DmsBillsMaintInstance::getPlanMaintId, bo.getPlanMaintId())
.eq(bo.getPlanMaintId() != null, DmsBillsMaintInstance::getPlanMaintId, bo.getPlanMaintId()) .eq(bo.getWfDefinitionId() != null, DmsBillsMaintInstance::getWfDefinitionId, bo.getWfDefinitionId())
.eq(bo.getWfDefinitionId() != null, DmsBillsMaintInstance::getWfDefinitionId, bo.getWfDefinitionId()) .eq(StringUtils.isNotBlank(bo.getBillsMaintCode()), DmsBillsMaintInstance::getBillsMaintCode, bo.getBillsMaintCode())
.eq(StringUtils.isNotBlank(bo.getBillsMaintCode()), DmsBillsMaintInstance::getBillsMaintCode, bo.getBillsMaintCode()) .eq(StringUtils.isNotBlank(bo.getMaintGroup()), DmsBillsMaintInstance::getMaintGroup, bo.getMaintGroup())
.eq(StringUtils.isNotBlank(bo.getMaintGroup()), DmsBillsMaintInstance::getMaintGroup, bo.getMaintGroup()) .eq(StringUtils.isNotBlank(bo.getMaintSupervisor()), DmsBillsMaintInstance::getMaintSupervisor, bo.getMaintSupervisor())
.eq(StringUtils.isNotBlank(bo.getMaintSupervisor()), DmsBillsMaintInstance::getMaintSupervisor, bo.getMaintSupervisor()) .eq(bo.getMaintLevel() != null, DmsBillsMaintInstance::getMaintLevel, bo.getMaintLevel())
.eq(bo.getMaintLevel() != null , DmsBillsMaintInstance::getMaintLevel, bo.getMaintLevel()) .eq(bo.getPlanBeginTime() != null, DmsBillsMaintInstance::getPlanBeginTime, bo.getPlanBeginTime())
.eq(bo.getPlanBeginTime() != null, DmsBillsMaintInstance::getPlanBeginTime, bo.getPlanBeginTime()) .eq(bo.getRealBeginTime() != null, DmsBillsMaintInstance::getRealBeginTime, bo.getRealBeginTime())
.eq(bo.getRealBeginTime() != null, DmsBillsMaintInstance::getRealBeginTime, bo.getRealBeginTime()) .eq(bo.getPlanEndTime() != null, DmsBillsMaintInstance::getPlanEndTime, bo.getPlanEndTime())
.eq(bo.getPlanEndTime() != null, DmsBillsMaintInstance::getPlanEndTime, bo.getPlanEndTime()) .eq(bo.getRealEndTime() != null, DmsBillsMaintInstance::getRealEndTime, bo.getRealEndTime())
.eq(bo.getRealEndTime() != null, DmsBillsMaintInstance::getRealEndTime, bo.getRealEndTime()) .eq(bo.getMaintStatus() != null, DmsBillsMaintInstance::getMaintStatus, bo.getMaintStatus())
.eq(bo.getMaintStatus() != null, DmsBillsMaintInstance::getMaintStatus, bo.getMaintStatus()) .eq(bo.getMaintCompRate() != null, DmsBillsMaintInstance::getMaintCompRate, bo.getMaintCompRate())
.eq(bo.getMaintCompRate() != null, DmsBillsMaintInstance::getMaintCompRate, bo.getMaintCompRate()) .orderByDesc(DmsBillsMaintInstance::getCreateTime);
.orderByDesc(DmsBillsMaintInstance::getCreateTime);
return lqw; return lqw;
} }
@ -126,14 +124,14 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
* @return * @return
*/ */
@Override @Override
public Boolean insertByBo(DmsBillsMaintInstanceBo bo) { public DmsBillsMaintInstanceVo insertByBo(DmsBillsMaintInstanceBo bo) {
DmsBillsMaintInstance add = MapstructUtils.convert(bo, DmsBillsMaintInstance.class); DmsBillsMaintInstance add = MapstructUtils.convert(bo, DmsBillsMaintInstance.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setMaintInstanceId(add.getMaintInstanceId()); bo.setMaintInstanceId(add.getMaintInstanceId());
} }
return flag; return MapstructUtils.convert(add, DmsBillsMaintInstanceVo.class);
} }
/** /**
@ -143,16 +141,16 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
* @return * @return
*/ */
@Override @Override
public Boolean updateByBo(DmsBillsMaintInstanceBo bo) { public DmsBillsMaintInstanceVo updateByBo(DmsBillsMaintInstanceBo bo) {
DmsBillsMaintInstance update = MapstructUtils.convert(bo, DmsBillsMaintInstance.class); DmsBillsMaintInstance update = MapstructUtils.convert(bo, DmsBillsMaintInstance.class);
validEntityBeforeSave(update); validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0; return MapstructUtils.convert(update, DmsBillsMaintInstanceVo.class);
} }
/** /**
* *
*/ */
private void validEntityBeforeSave(DmsBillsMaintInstance entity){ private void validEntityBeforeSave(DmsBillsMaintInstance entity) {
//TODO 做一些数据校验,如唯一约束 //TODO 做一些数据校验,如唯一约束
} }
@ -165,7 +163,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
*/ */
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
@ -178,7 +176,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
* @return * @return
*/ */
@Override @Override
@Transactional( rollbackFor= Exception.class) @Transactional(rollbackFor = Exception.class)
public int insertDmsBillsMaintInstance(String planMaintCode) { public int insertDmsBillsMaintInstance(String planMaintCode) {
String planMaintCodeS = planMaintCode.replaceAll("\"", ""); String planMaintCodeS = planMaintCode.replaceAll("\"", "");
DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS); DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS);
@ -205,7 +203,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
dmsBillsMaintInstance.setPlanEndTime(new Date(lubeTime.getTime() + timeLimit * 1000l)); dmsBillsMaintInstance.setPlanEndTime(new Date(lubeTime.getTime() + timeLimit * 1000l));
int insert = baseMapper.insert(dmsBillsMaintInstance); int insert = baseMapper.insert(dmsBillsMaintInstance);
/* DmsBillMaintInstanceActivity表弃用 */ /* DmsBillMaintInstanceActivity表弃用 */
/* DmsBillMaintInstanceActivity dmsMaintInstanceActivity = new DmsMaintInstanceActivity(); /* DmsBillMaintInstanceActivity dmsMaintInstanceActivity = new DmsMaintInstanceActivity();
dmsMaintInstanceActivity.setMaintInstanceId(dmsBillsMaintInstance.getMaintInstanceId()); dmsMaintInstanceActivity.setMaintInstanceId(dmsBillsMaintInstance.getMaintInstanceId());
dmsMaintInstanceActivity.setProcessStepOrder(1L); dmsMaintInstanceActivity.setProcessStepOrder(1L);
@ -231,10 +229,10 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
dmsBillsMaintDetailMapper.insertBatch(billsMaintDetails); dmsBillsMaintDetailMapper.insertBatch(billsMaintDetails);
ArrayList<DmsBillsMaintDetailProject> detailprojectList = new ArrayList<>(); ArrayList<DmsBillsMaintDetailProject> detailprojectList = new ArrayList<>();
List<DmsBillsMaintDetailVo> list = dmsBillsMaintDetailMapper.selectDetailList(maintInstanceId); List<DmsBillsMaintDetail> list = dmsBillsMaintDetailMapper.selectDetailList(maintInstanceId);
for (DmsBillsMaintDetailVo detail : list) { for (DmsBillsMaintDetail detail : list) {
List<DmsBaseMaintProjectVo> projects = dmsBillsMaintDetailMapper.selectPrjectIds(detail.getMaintStationId()); List<DmsBaseMaintProject> projects = dmsBillsMaintDetailMapper.selectPrjectIds(detail.getMaintStationId());
for (DmsBaseMaintProjectVo project : projects) { for (DmsBaseMaintProject project : projects) {
DmsBillsMaintDetailProject detailproject = new DmsBillsMaintDetailProject(); DmsBillsMaintDetailProject detailproject = new DmsBillsMaintDetailProject();
detailproject.setBillsMaintDetailId(detail.getBillsMaintDetailId()); detailproject.setBillsMaintDetailId(detail.getBillsMaintDetailId());
// DmsBaseMaintStation station = dmsBillsMaintDetailMapper.selectMainStation(detail.getStationId()); // DmsBaseMaintStation station = dmsBillsMaintDetailMapper.selectMainStation(detail.getStationId());

@ -75,8 +75,7 @@ public class DmsInspectProjectDeviceServiceImpl implements IDmsInspectProjectDev
.selectAll(DmsInspectProjectDevice.class) .selectAll(DmsInspectProjectDevice.class)
.eq(bo.getInspectProjectId() != null, DmsInspectProjectDevice::getInspectProjectId, bo.getInspectProjectId()) .eq(bo.getInspectProjectId() != null, DmsInspectProjectDevice::getInspectProjectId, bo.getInspectProjectId())
.eq(StringUtils.isNotBlank(bo.getTargetType()), DmsInspectProjectDevice::getTargetType, bo.getTargetType()) .eq(StringUtils.isNotBlank(bo.getTargetType()), DmsInspectProjectDevice::getTargetType, bo.getTargetType())
.eq(bo.getTargetId() != null, DmsInspectProjectDevice::getTargetId, bo.getTargetId()) .eq(bo.getTargetId() != null, DmsInspectProjectDevice::getTargetId, bo.getTargetId());
.orderByDesc(DmsInspectProjectDevice::getCreateTime);
return lqw; return lqw;
} }

@ -11,6 +11,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.dms.domain.DmsBaseInspectRoute; import org.dromara.dms.domain.DmsBaseInspectRoute;
import org.dromara.dms.domain.DmsBaseInspectStandard;
import org.dromara.dms.domain.DmsBaseMachineInfo; import org.dromara.dms.domain.DmsBaseMachineInfo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.dms.domain.bo.DmsInspectRouteDetailBo; import org.dromara.dms.domain.bo.DmsInspectRouteDetailBo;
@ -83,10 +84,16 @@ public class DmsInspectRouteDetailServiceImpl implements IDmsInspectRouteDetailS
.select(DmsBaseMachineInfo::getMachineName) .select(DmsBaseMachineInfo::getMachineName)
.leftJoin(DmsBaseMachineInfo.class, DmsBaseMachineInfo::getMachineId,DmsInspectRouteDetail::getMachineId) .leftJoin(DmsBaseMachineInfo.class, DmsBaseMachineInfo::getMachineId,DmsInspectRouteDetail::getMachineId)
.select(DmsBaseInspectStandard::getStandardName)
.leftJoin(DmsBaseInspectStandard.class, DmsBaseInspectStandard::getInspectStandardId,DmsInspectRouteDetail::getInspectStandard)
.eq(bo.getRouteDetailId() != null, DmsInspectRouteDetail::getRouteDetailId, bo.getRouteDetailId()) .eq(bo.getRouteDetailId() != null, DmsInspectRouteDetail::getRouteDetailId, bo.getRouteDetailId())
.eq(bo.getInspectRouteId() != null, DmsInspectRouteDetail::getInspectRouteId, bo.getInspectRouteId()) .eq(bo.getInspectRouteId() != null, DmsInspectRouteDetail::getInspectRouteId, bo.getInspectRouteId())
.eq(bo.getLineStep() != null, DmsInspectRouteDetail::getLineStep, bo.getLineStep()) .eq(bo.getLineStep() != null, DmsInspectRouteDetail::getLineStep, bo.getLineStep())
.eq(bo.getMachineId() != null, DmsInspectRouteDetail::getMachineId, bo.getMachineId()) .eq(bo.getMachineId() != null, DmsInspectRouteDetail::getMachineId, bo.getMachineId())
.eq(bo.getInspectStandard() != null, DmsInspectRouteDetail::getInspectStandard, bo.getInspectStandard())
.eq(StringUtils.isNotBlank(bo.getInspectStandard()), DmsInspectRouteDetail::getInspectStandard, bo.getInspectStandard()) .eq(StringUtils.isNotBlank(bo.getInspectStandard()), DmsInspectRouteDetail::getInspectStandard, bo.getInspectStandard())
.orderByDesc(DmsInspectRouteDetail::getCreateTime); .orderByDesc(DmsInspectRouteDetail::getCreateTime);
return lqw; return lqw;

@ -1,22 +1,32 @@
package org.dromara.dms.service.impl; package org.dromara.dms.service.impl;
import com.aizuda.snailjob.client.job.core.enums.AllocationAlgorithmEnum;
import com.aizuda.snailjob.client.job.core.enums.TriggerTypeEnum;
import com.aizuda.snailjob.common.core.enums.JobBlockStrategyEnum;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.uuid.Seq; import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.domain.DmsBaseInspectRoute; import org.dromara.dms.domain.DmsBaseInspectRoute;
import org.dromara.dms.domain.DmsPlanInspect; import org.dromara.dms.domain.DmsPlanInspect;
import org.dromara.dms.domain.bo.DmsPlanInspectBo; import org.dromara.dms.domain.bo.DmsPlanInspectBo;
import org.dromara.dms.domain.vo.DmsPlanInspectVo; import org.dromara.dms.domain.vo.DmsPlanInspectVo;
import org.dromara.dms.domain.vo.DmsPlanMaintVo;
import org.dromara.dms.mapper.DmsBaseInspectRouteMapper; import org.dromara.dms.mapper.DmsBaseInspectRouteMapper;
import org.dromara.dms.mapper.DmsPlanInspectMapper; import org.dromara.dms.mapper.DmsPlanInspectMapper;
import org.dromara.dms.service.IDmsPlanInspectService; import org.dromara.dms.service.IDmsPlanInspectService;
import org.dromara.dms.utils.CronUtils; import org.dromara.dms.utils.CronUtils;
import org.dromara.job.api.RemoteJobService;
import org.dromara.job.api.model.DmsJobEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -39,6 +49,9 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
private final DmsBaseInspectRouteMapper dmsBaseInspectRouteMapper; private final DmsBaseInspectRouteMapper dmsBaseInspectRouteMapper;
@DubboReference
private final RemoteJobService remoteJobService;
private static final Long SECONDS_PER_DAY = 24 * 60 * 60L; private static final Long SECONDS_PER_DAY = 24 * 60 * 60L;
private static final Long SECONDS_PER_HOUR = 60 * 60L; private static final Long SECONDS_PER_HOUR = 60 * 60L;
@ -149,7 +162,7 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
* @return * @return
*/ */
@Override @Override
@Transactional( rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public Boolean insertByBo(DmsPlanInspectBo bo) { public Boolean insertByBo(DmsPlanInspectBo bo) {
DmsPlanInspect add = MapstructUtils.convert(bo, DmsPlanInspect.class); DmsPlanInspect add = MapstructUtils.convert(bo, DmsPlanInspect.class);
String day = "*"; String day = "*";
@ -179,23 +192,35 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
if (add.getInspectLevel().equals(3l)){ if (add.getInspectLevel().equals(3l)){
cron = "0 0 "+add.getHour()+" "+day+" "+ month+" ? "+year; cron = "0 0 "+add.getHour()+" "+day+" "+ month+" ? "+year;
} }
String planInspectCode = Seq.getId(Seq.planInspectSeqType, Seq.planInspectCode); bo.setCronExpression(cron);//cron表达式
/* SysJob job = new SysJob();
job.setJobName("点巡检计划编号" + planInspectCode + "工单任务");
job.setJobGroup("DEFAULT");
job.setInvokeTarget("ryTask.getDmsBillsInstance(\"" + planInspectCode + "\")");
job.setCronExpression(cron);
job.setMisfirePolicy("1");
job.setConcurrent("1");
job.setStatus("1");
R<Integer> jobIdR = remoteJobService.add(SecurityConstants.INNER, job);*/
String time = cron; String planInspectCode = Seq.getId(Seq.planInspectSeqType, Seq.planInspectCode);
//通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(time); if(bo.getActiveFlag().equals("1")) {//激活标识1是 0否
add.setPlanTime(nextExecution); DmsJobEntity dmsJobEntity = new DmsJobEntity();
add.setPlanInspectCode(planInspectCode); dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
// add.setJobId(jobIdR.getData().longValue()); .setJobName("点巡检计划编号" + planInspectCode + "工单任务")
.setExecutorInfo("stanceInspect")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planInspectCode")
.setExtAttrs(planInspectCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
System.out.println(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long newJobId = longR.getData();
//通过cron表达式获取下一次执行时间
String time = cron;
Date nextExecution = CronUtils.getNextExecution(time);
add.setPlanTime(nextExecution);
add.setPlanInspectCode(planInspectCode);
add.setJobId(newJobId);
}
Long timeLimitDays = add.getTimeLimitDays()==null ? 0L:add.getTimeLimitDays(); Long timeLimitDays = add.getTimeLimitDays()==null ? 0L:add.getTimeLimitDays();
Long timeLimitHours = add.getTimeLimitHours() == null ? 0L:add.getTimeLimitHours(); Long timeLimitHours = add.getTimeLimitHours() == null ? 0L:add.getTimeLimitHours();
@ -221,9 +246,84 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public Boolean updateByBo(DmsPlanInspectBo bo) { public Boolean updateByBo(DmsPlanInspectBo bo) {
DmsPlanInspect update = MapstructUtils.convert(bo, DmsPlanInspect.class); DmsPlanInspect update = MapstructUtils.convert(bo, DmsPlanInspect.class);
String day = "*";
String month = "*";
String week = "*";
String year = "*";
String cron = "";
if (update.getDay()!=null){
day = update.getDay().toString();
}
if (update.getMonth()!=null){
month = update.getMonth().toString();
}
if (update.getWeek()!=null){
Long weekDay = update.getWeek() + 1;
week = weekDay.toString();
}
if (update.getYear()!=null){
year = update.getYear().toString();
}
if (update.getInspectLevel().equals(1l)){
cron = "0 0 "+update.getHour()+" "+day+" "+month+" ?";
}
if (update.getInspectLevel().equals(2l)){
cron = "0 0 "+update.getHour()+" ?"+" "+month+" "+week;
}
if (update.getInspectLevel().equals(3l)){
cron = "0 0 "+update.getHour()+" "+day+" "+ month+" ? "+year;
}
bo.setCronExpression(cron);//cron表达式
String time = cron;
//通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(time);
update.setPlanTime(nextExecution);
//获取设备总数
Long aLong = dmsBaseInspectRouteMapper.selectAmountByInspectRouteId(update.getInspectRouteId());
update.setDeviceAmount(aLong);
validEntityBeforeSave(update); validEntityBeforeSave(update);
Long jobId = bo.getJobId();
String planInspectCode = bo.getPlanInspectCode();
// String cronExpression = bo.getCronExpression();
if (bo.getActiveFlag().equals("1")) {//激活标识1是 0否
if (StringUtils.isNull(jobId)){//之前没激活创建定时任务,创建定时任务
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("点巡检计划编号" + planInspectCode + "工单任务")
.setExecutorInfo("stanceInspect")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planInspectCode")
.setExtAttrs(planInspectCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long newJobId = longR.getData();
update.setJobId(newJobId);
}else{//之前激活了,修改定时任务
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity
.setId(jobId)
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Void> updateClusterJob = remoteJobService.updateClusterJob(dmsJobEntity);
}
}else{//如果激活状态为01是 0否
if (StringUtils.isNotNull(jobId)) {//之前激活过,创建并关联了任务
//则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
}
}
return baseMapper.updateById(update) > 0; return baseMapper.updateById(update) > 0;
} }
@ -242,10 +342,19 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
for (Long id : ids){
DmsPlanInspectVo dmsPlanInspectVo = baseMapper.selectVoById(id);
Long jobId = dmsPlanInspectVo.getJobId();
if (StringUtils.isNotNull(jobId)){
//则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
}
}
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
} }

@ -81,14 +81,14 @@ public class DmsPlanLubeDetailServiceImpl implements IDmsPlanLubeDetailService {
.leftJoin(DmsBaseLubeStation.class,DmsBaseLubeStation::getLubeStationId,DmsPlanLubeDetail::getLubeStationId) .leftJoin(DmsBaseLubeStation.class,DmsBaseLubeStation::getLubeStationId,DmsPlanLubeDetail::getLubeStationId)
//关联查询设备 //关联查询设备
.select(DmsBaseMachineInfo::getMachineName) .select(DmsBaseMachineInfo::getMachineName)
.leftJoin(DmsBaseMachineInfo.class,DmsBaseMachineInfo::getMachineId,DmsPlanLubeDetail::getMachineId) .leftJoin(DmsBaseMachineInfo.class,DmsBaseMachineInfo::getMachineId,DmsPlanLubeDetail::getDeviceId)
//关联查询润滑标准 //关联查询润滑标准
.select(DmsBaseLubeStandard::getLubeStandardCode) .select(DmsBaseLubeStandard::getLubeStandardCode)
.leftJoin(DmsBaseLubeStandard.class,DmsBaseLubeStandard::getLubeStandardId,DmsPlanLubeDetail::getLubeStandardId) .leftJoin(DmsBaseLubeStandard.class,DmsBaseLubeStandard::getLubeStandardId,DmsPlanLubeDetail::getLubeStandardId)
.eq(bo.getPlanLubeDetailId() != null, DmsPlanLubeDetail::getPlanLubeDetailId, bo.getPlanLubeDetailId()) .eq(bo.getPlanLubeDetailId() != null, DmsPlanLubeDetail::getPlanLubeDetailId, bo.getPlanLubeDetailId())
.eq(bo.getPlanLubeId() != null, DmsPlanLubeDetail::getPlanLubeId, bo.getPlanLubeId()) .eq(bo.getPlanLubeId() != null, DmsPlanLubeDetail::getPlanLubeId, bo.getPlanLubeId())
.eq(bo.getDeviceId() != null, DmsPlanLubeDetail::getMachineId, bo.getDeviceId()) .eq(bo.getDeviceId() != null, DmsPlanLubeDetail::getDeviceId, bo.getDeviceId())
.eq(bo.getLubeStationId() != null, DmsPlanLubeDetail::getLubeStationId, bo.getLubeStationId()) .eq(bo.getLubeStationId() != null, DmsPlanLubeDetail::getLubeStationId, bo.getLubeStationId())
.eq(bo.getLubeStandardId() != null, DmsPlanLubeDetail::getLubeStandardId, bo.getLubeStandardId()) .eq(bo.getLubeStandardId() != null, DmsPlanLubeDetail::getLubeStandardId, bo.getLubeStandardId())
.eq(StringUtils.isNotBlank(bo.getOperationDescription()), DmsPlanLubeDetail::getOperationDescription, bo.getOperationDescription()) .eq(StringUtils.isNotBlank(bo.getOperationDescription()), DmsPlanLubeDetail::getOperationDescription, bo.getOperationDescription())
@ -160,14 +160,14 @@ public class DmsPlanLubeDetailServiceImpl implements IDmsPlanLubeDetailService {
MPJLambdaWrapper<DmsPlanLubeDetail> wrapper = JoinWrappers.lambda(DmsPlanLubeDetail.class) MPJLambdaWrapper<DmsPlanLubeDetail> wrapper = JoinWrappers.lambda(DmsPlanLubeDetail.class)
.selectAs(DmsPlanLubeDetail::getPlanLubeDetailId, DmsPlanLubeDetail::getPlanLubeDetailId) .selectAs(DmsPlanLubeDetail::getPlanLubeDetailId, DmsPlanLubeDetail::getPlanLubeDetailId)
.selectAs(DmsPlanLubeDetail::getPlanLubeId, DmsPlanLubeDetail::getPlanLubeId) .selectAs(DmsPlanLubeDetail::getPlanLubeId, DmsPlanLubeDetail::getPlanLubeId)
.selectAs(DmsPlanLubeDetail::getMachineId, DmsPlanLubeDetail::getMachineId) .selectAs(DmsPlanLubeDetail::getDeviceId, DmsPlanLubeDetail::getDeviceId)
.selectAs(DmsPlanLubeDetail::getLubeStationId, DmsPlanLubeDetail::getLubeStationId) .selectAs(DmsPlanLubeDetail::getLubeStationId, DmsPlanLubeDetail::getLubeStationId)
.selectAs(DmsPlanLubeDetail::getLubeStandardId, DmsPlanLubeDetail::getLubeStandardId) .selectAs(DmsPlanLubeDetail::getLubeStandardId, DmsPlanLubeDetail::getLubeStandardId)
.selectAs(DmsPlanLubeDetail::getOperationDescription, DmsPlanLubeDetail::getOperationDescription) .selectAs(DmsPlanLubeDetail::getOperationDescription, DmsPlanLubeDetail::getOperationDescription)
.selectAs(DmsBaseMachineInfo::getMachineName, DmsPlanLubeDetail::getMachineName) .selectAs(DmsBaseMachineInfo::getMachineName, DmsPlanLubeDetail::getMachineName)
.selectAs(DmsBaseLubeStation::getLubeStationName, DmsPlanLubeDetail::getLubeStationName) .selectAs(DmsBaseLubeStation::getLubeStationName, DmsPlanLubeDetail::getLubeStationName)
.selectAs(DmsBaseLubeStandard::getLubeStandardCode, DmsPlanLubeDetail::getLubeStandardCode) .selectAs(DmsBaseLubeStandard::getLubeStandardCode, DmsPlanLubeDetail::getLubeStandardCode)
.leftJoin(DmsBaseMachineInfo.class, DmsBaseMachineInfo::getMachineId, DmsPlanLubeDetail::getMachineId) .leftJoin(DmsBaseMachineInfo.class, DmsBaseMachineInfo::getMachineId, DmsPlanLubeDetail::getDeviceId)
.leftJoin(DmsBaseLubeStation.class, DmsBaseLubeStation::getDeviceTypeId, DmsBaseMachineInfo::getMachineId) .leftJoin(DmsBaseLubeStation.class, DmsBaseLubeStation::getDeviceTypeId, DmsBaseMachineInfo::getMachineId)
.leftJoin(DmsBaseLubeStandard.class, DmsBaseLubeStandard::getLubeStandardId, DmsPlanLubeDetail::getLubeStandardId) .leftJoin(DmsBaseLubeStandard.class, DmsBaseLubeStandard::getLubeStandardId, DmsPlanLubeDetail::getLubeStandardId)
.eq(DmsPlanLubeDetail::getPlanLubeId, planLubeId); .eq(DmsPlanLubeDetail::getPlanLubeId, planLubeId);

@ -3,13 +3,17 @@ package org.dromara.dms.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.uuid.Seq; import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.common.mybatis.Utils.UniqueCodeUtils; import org.dromara.common.mybatis.Utils.UniqueCodeUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.domain.DmsBillsLubeInstance; import org.dromara.dms.domain.DmsBillsLubeInstance;
import org.dromara.dms.domain.DmsPlanLube; import org.dromara.dms.domain.DmsPlanLube;
import org.dromara.dms.domain.bo.DmsPlanLubeBo; import org.dromara.dms.domain.bo.DmsPlanLubeBo;
@ -21,12 +25,20 @@ import org.dromara.dms.utils.CronUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.aizuda.snailjob.client.job.core.enums.AllocationAlgorithmEnum;
import com.aizuda.snailjob.client.job.core.enums.TriggerTypeEnum;
import com.aizuda.snailjob.client.job.core.openapi.SnailJobOpenApi;
import com.aizuda.snailjob.common.core.enums.JobBlockStrategyEnum;
import com.aizuda.snailjob.client.job.core.dto.JobResponseVO;
import com.aizuda.snailjob.common.core.enums.StatusEnum;
import org.dromara.job.api.model.DmsJobEntity;
import org.dromara.job.api.RemoteJobService;
/** /**
* Service * Service
* *
@ -41,6 +53,9 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
private final DmsBillsLubeInstanceMapper dmsBillsLubeInstanceMapper; private final DmsBillsLubeInstanceMapper dmsBillsLubeInstanceMapper;
@DubboReference
private final RemoteJobService remoteJobService;
private static final Long SECONDS_PER_DAY = 24 * 60 * 60L; private static final Long SECONDS_PER_DAY = 24 * 60 * 60L;
private static final Long SECONDS_PER_HOUR = 60 * 60L; private static final Long SECONDS_PER_HOUR = 60 * 60L;
@ -160,35 +175,40 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public Boolean insertByBo(DmsPlanLubeBo bo) { public Boolean insertByBo(DmsPlanLubeBo bo) {
// 生成新的润滑计划编号 // 生成新的润滑计划编号
String planLubeCode = Seq.getId(Seq.dmsPlanLubeSeqType, Seq.dmsPlanLubeCode); String planLubeCode = Seq.getId(Seq.dmsPlanLubeSeqType, Seq.dmsPlanLubeCode);
bo.setPlanLubeCode(planLubeCode); bo.setPlanLubeCode(planLubeCode);
/*
// 创建系统任务对象
SysJob job = new SysJob();
job.setJobName("润滑计划编号" + planLubeCode + "工单任务");
job.setJobGroup("DEFAULT");
job.setInvokeTarget("ryTask.getDmsBillsLube(\"" + planLubeCode + "\")");
job.setCronExpression(bo.getCronExpression());
job.setMisfirePolicy("1");
job.setConcurrent("1");
job.setStatus("1");
// 添加任务到远程服务并获取任务ID if(bo.getActiveFlag().equals("1")){//激活标识1是 0否
R<Integer> jobIdR = remoteJobService.add(SecurityConstants.INNER, job);*/ DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("润滑计划编号" + planLubeCode + "工单任务")
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planLubeCode")
.setExtAttrs(planLubeCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long jobId = longR.getData();
// 通过cron表达式获取下一次执行时间 // 通过cron表达式获取下一次执行时间
String cronExpression = bo.getCronExpression(); String cronExpression = bo.getCronExpression();
if (StringUtils.isNotEmpty(cronExpression)) { if (StringUtils.isNotEmpty(cronExpression)) {
Date nextExecution = CronUtils.getNextExecution(cronExpression); Date nextExecution = CronUtils.getNextExecution(cronExpression);
bo.setLubeTime(nextExecution); bo.setLubeTime(nextExecution);
}
// 设置润滑计划的任务ID
bo.setJobId(jobId);
} }
// 设置润滑计划的任务ID
/* bo.setJobId(jobIdR.getData().longValue());*/
// 计算润滑计划的时间限制(天和小时) // 计算润滑计划的时间限制(天和小时)
Long timeLimitDays = bo.getTimeLimitDays() == null ? 0L : bo.getTimeLimitDays(); Long timeLimitDays = bo.getTimeLimitDays() == null ? 0L : bo.getTimeLimitDays();
Long timeLimitHours = bo.getTimeLimitHours() == null ? 0L : bo.getTimeLimitHours(); Long timeLimitHours = bo.getTimeLimitHours() == null ? 0L : bo.getTimeLimitHours();
@ -212,38 +232,65 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public Boolean updateByBo(DmsPlanLubeBo bo) { public Boolean updateByBo(DmsPlanLubeBo bo) {
/* Long jobId = bo.getJobId();*/ Long jobId = bo.getJobId();
String cronExpression = bo.getCronExpression(); String cronExpression = bo.getCronExpression();
if (StringUtils.isNotEmpty(cronExpression)) { if (bo.getActiveFlag().equals("1")){//激活标识1是 0否
// 通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(cronExpression); // 通过cron表达式获取下一次执行时间
bo.setLubeTime(nextExecution); Date nextExecution = CronUtils.getNextExecution(cronExpression);
bo.setLubeTime(nextExecution);
if (StringUtils.isNull(jobId)) {// 如果没有关联任务,创建新任务
String planLubeCode = bo.getPlanLubeCode();
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("润滑计划编号" + planLubeCode + "工单任务")
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planLubeCode")
.setExtAttrs(planLubeCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long newJobId = longR.getData();
bo.setJobId(newJobId);
} else {// 如果有关联任务,更新状态
// 更新现有任务
String planLubeCode = bo.getPlanLubeCode();
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setId(jobId);//任务ID
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("润滑计划编号" + planLubeCode + "工单任务")
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planLubeCode")
.setExtAttrs(planLubeCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Void> longR = remoteJobService.updateClusterJob(dmsJobEntity);
/* if (jobId == null) {
// 如果没有关联任务,创建新任务
String planLubeCode = bo.getPlanLubeCode();
SysJob job = new SysJob();
job.setJobName("润滑计划编号" + planLubeCode + "工单任务");
job.setJobGroup("DEFAULT");
job.setInvokeTarget("ryTask.getDmsBillsLube(\"" + planLubeCode + "\")");
job.setCronExpression(bo.getCronExpression());
job.setMisfirePolicy("1");
job.setConcurrent("1");
job.setStatus("1");
R<Integer> jobIdR = remoteJobService.add(SecurityConstants.INNER, job);
bo.setJobId(jobIdR.getData().longValue());
} else {
// 更新现有任务
SysJob sysJob = remoteJobService.getJobInfo(jobId, SecurityConstants.INNER);
if (sysJob != null) {
sysJob.setCronExpression(bo.getCronExpression());
remoteJobService.update(SecurityConstants.INNER, sysJob);
} }
}*/ }else{//如果激活状态为01是 0否
} if (StringUtils.isNotNull(jobId)) {//如果关联了任务,则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
}
}
// 计算润滑计划的时间限制(天和小时) // 计算润滑计划的时间限制(天和小时)
Long timeLimitDays = bo.getTimeLimitDays() == null ? 0L : bo.getTimeLimitDays(); Long timeLimitDays = bo.getTimeLimitDays() == null ? 0L : bo.getTimeLimitDays();
@ -280,18 +327,21 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if(isValid){
// 删除前检查是否可以删除 //TODO 做一些业务上的校验,判断是否需要校验
/* for (Long id : ids) { }
// 删除前检查是否可以删除
for (Long id : ids) {
// 查询关联的任务ID // 查询关联的任务ID
DmsPlanLubeVo dmsPlanLube = baseMapper.selectVoById(id); DmsPlanLubeVo dmsPlanLube = baseMapper.selectVoById(id);
if (dmsPlanLube != null && dmsPlanLube.getJobId() != null) { Long jobId = dmsPlanLube.getJobId();
// 删除关联的定时任务 if (StringUtils.isNotNull(jobId)) {
remoteJobService.remove(dmsPlanLube.getJobId(), SecurityConstants.INNER); //则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
} }
}*/ }
}
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }

@ -1,20 +1,29 @@
package org.dromara.dms.service.impl; package org.dromara.dms.service.impl;
import com.aizuda.snailjob.client.job.core.enums.AllocationAlgorithmEnum;
import com.aizuda.snailjob.client.job.core.enums.TriggerTypeEnum;
import com.aizuda.snailjob.common.core.enums.JobBlockStrategyEnum;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.uuid.Seq; import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.domain.DmsPlanMaint; import org.dromara.dms.domain.DmsPlanMaint;
import org.dromara.dms.domain.bo.DmsPlanMaintBo; import org.dromara.dms.domain.bo.DmsPlanMaintBo;
import org.dromara.dms.domain.vo.DmsPlanMaintVo; import org.dromara.dms.domain.vo.DmsPlanMaintVo;
import org.dromara.dms.mapper.DmsPlanMaintMapper; import org.dromara.dms.mapper.DmsPlanMaintMapper;
import org.dromara.dms.service.IDmsPlanMaintService; import org.dromara.dms.service.IDmsPlanMaintService;
import org.dromara.dms.utils.CronUtils; import org.dromara.dms.utils.CronUtils;
import org.dromara.job.api.RemoteJobService;
import org.dromara.job.api.model.DmsJobEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -35,6 +44,9 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
private final DmsPlanMaintMapper baseMapper; private final DmsPlanMaintMapper baseMapper;
@DubboReference
private final RemoteJobService remoteJobService;
private static final Long SECONDS_PER_DAY = 24 * 60 * 60L; private static final Long SECONDS_PER_DAY = 24 * 60 * 60L;
private static final Long SECONDS_PER_HOUR = 60 * 60L; private static final Long SECONDS_PER_HOUR = 60 * 60L;
@ -151,7 +163,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
* @return * @return
*/ */
@Override @Override
@Transactional( rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public Boolean insertByBo(DmsPlanMaintBo bo) { public Boolean insertByBo(DmsPlanMaintBo bo) {
DmsPlanMaint add = MapstructUtils.convert(bo, DmsPlanMaint.class); DmsPlanMaint add = MapstructUtils.convert(bo, DmsPlanMaint.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
@ -194,12 +206,31 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
job.setConcurrent("1"); job.setConcurrent("1");
job.setStatus("1"); job.setStatus("1");
R<Integer> jobIdR = remoteJobService.add(SecurityConstants.INNER, job);*/ R<Integer> jobIdR = remoteJobService.add(SecurityConstants.INNER, job);*/
if(bo.getActiveFlag().equals("1")) {//激活标识1是 0否
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("保养计划编号" + planMaintCode + "工单任务")
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planMaintCode")
.setExtAttrs(planMaintCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long jobId = longR.getData();
String time = cron;
//通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(time);
add.setMaintTime(nextExecution);
add.setJobId(jobId);
}
String time = cron;
//通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(time);
add.setMaintTime(nextExecution);
// add.setJobId(jobIdR.getData().longValue());
add.setPlanMaintCode(planMaintCode); add.setPlanMaintCode(planMaintCode);
Long timeLimitDays = add.getTimeLimitDays()==null?0L:add.getTimeLimitDays(); Long timeLimitDays = add.getTimeLimitDays()==null?0L:add.getTimeLimitDays();
Long timeLimitHours = add.getTimeLimitHours() == null?0L:add.getTimeLimitHours(); Long timeLimitHours = add.getTimeLimitHours() == null?0L:add.getTimeLimitHours();
@ -220,9 +251,93 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public Boolean updateByBo(DmsPlanMaintBo bo) { public Boolean updateByBo(DmsPlanMaintBo bo) {
DmsPlanMaint update = MapstructUtils.convert(bo, DmsPlanMaint.class); DmsPlanMaint update = MapstructUtils.convert(bo, DmsPlanMaint.class);
String day = "*";
String month = "*";
String week = "*";
String year = "*";
String cron = "";
if (update.getDay()!=null){
day = update.getDay().toString();
}
if (update.getMonth()!=null){
month = update.getMonth().toString();
}
if (update.getWeek()!=null){
Long weekDay = update.getWeek() + 1;
week = weekDay.toString();
}
if (update.getYear()!=null){
year = update.getYear().toString();
}
if (update.getMaintLevel().equals(1l)){
cron = "0 0 "+update.getHour()+" "+day+" "+month+" ?";
}
if (update.getMaintLevel().equals(2l)){
cron = "0 0 "+update.getHour()+" ?"+" "+month+" "+week;
}
if (update.getMaintLevel().equals(3l)){
cron = "0 0 "+update.getHour()+" "+day+" "+ month+" ? "+year;
}
Long timeLimitDays = update.getTimeLimitDays()==null?0L:update.getTimeLimitDays();
Long timeLimitHours = update.getTimeLimitHours() == null?0L:update.getTimeLimitHours();
update.setTimeLimit((timeLimitDays * SECONDS_PER_DAY)
+ (timeLimitHours * SECONDS_PER_HOUR));
String time = cron;
//通过cron表达式获取下一次执行时间
Date nextExecution = CronUtils.getNextExecution(time);
update.setMaintTime(nextExecution);
validEntityBeforeSave(update); validEntityBeforeSave(update);
Long jobId = bo.getJobId();
String planMaintCode = bo.getPlanMaintCode();
if (bo.getActiveFlag().equals("1")){
if (StringUtils.isNull(jobId)){//之前没激活创建定时任务,创建定时任务
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("保养计划编号" + planMaintCode + "工单任务")
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planMaintCode")
.setExtAttrs(planMaintCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Long> longR = remoteJobService.addClusterJob(dmsJobEntity);
Long newJobId = longR.getData();
update.setMaintTime(nextExecution);
update.setJobId(newJobId);
}else{//之前激活了,修改定时任务
DmsJobEntity dmsJobEntity = new DmsJobEntity();
dmsJobEntity.setId(jobId);
dmsJobEntity.setRouteKey(AllocationAlgorithmEnum.ROUND)//路由策略:轮询
.setJobName("保养计划编号" + planMaintCode + "工单任务")
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.CONCURRENCY)//阻塞策略:并发
.setMaxRetryTimes(2)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(3)//重试间隔时长
.setArgsStr("planMaintCode")
.setExtAttrs(planMaintCode)
.setUserId(LoginHelper.getUserId().toString())
.setTenantId(LoginHelper.getTenantId());
R<Void> updateClusterJob = remoteJobService.updateClusterJob(dmsJobEntity);
}
}else{//如果激活状态为01是 0否
if (StringUtils.isNotNull(jobId)){//之前激活过,创建并关联了任务
//则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
}
}
return baseMapper.updateById(update) > 0; return baseMapper.updateById(update) > 0;
} }
@ -241,10 +356,19 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
* @return * @return
*/ */
@Override @Override
@GlobalTransactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
for (Long id : ids){
DmsPlanMaintVo dmsPlanMaintVo = baseMapper.selectVoById(id);
Long jobId = dmsPlanMaintVo.getJobId();
if (StringUtils.isNotNull(jobId)){
//则任务状态为关闭
R<Void> voidR = remoteJobService.updateJobStatus(jobId, 0L);//任务状态0关闭1开启
}
}
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
} }

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
@ -15,6 +16,7 @@ import org.dromara.dms.domain.vo.DmsPlanRepairVo;
import org.dromara.dms.mapper.DmsPlanRepairDetailMapper; import org.dromara.dms.mapper.DmsPlanRepairDetailMapper;
import org.dromara.dms.mapper.DmsPlanRepairMapper; import org.dromara.dms.mapper.DmsPlanRepairMapper;
import org.dromara.dms.service.IDmsPlanRepairService; import org.dromara.dms.service.IDmsPlanRepairService;
import org.dromara.job.api.RemoteJobService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -173,6 +175,10 @@ public class DmsPlanRepairServiceImpl implements IDmsPlanRepairService {
@Override @Override
@Transactional( rollbackFor = Exception.class ) @Transactional( rollbackFor = Exception.class )
public Boolean insertByBo(DmsPlanRepairBo bo) { public Boolean insertByBo(DmsPlanRepairBo bo) {
/*
*DMS
* */
DmsPlanRepair add = MapstructUtils.convert(bo, DmsPlanRepair.class); DmsPlanRepair add = MapstructUtils.convert(bo, DmsPlanRepair.class);
validEntityBeforeSave(add); validEntityBeforeSave(add);
add.setTimeLimit((add.getTimeLimitDays()*SECONDS_PER_DAY) add.setTimeLimit((add.getTimeLimitDays()*SECONDS_PER_DAY)

@ -93,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="selectDetailList" resultType="DmsBillsMaintDetailVo" <select id="selectDetailList" resultType="org.dromara.dms.domain.DmsBillsMaintDetail"
parameterType="java.lang.Long"> parameterType="java.lang.Long">
select * from dms_bills_maint_detail where maint_instance_id = #{maintInstanceId} select * from dms_bills_maint_detail where maint_instance_id = #{maintInstanceId}
</select> </select>
@ -103,7 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select * from dms_base_maint_station where maint_station_id = #{stationId} select * from dms_base_maint_station where maint_station_id = #{stationId}
</select> </select>
<select id="selectPrjectIds" resultType="org.dromara.dms.domain.vo.DmsBaseMaintProjectVo"> <select id="selectPrjectIds" resultType="org.dromara.dms.domain.DmsBaseMaintProject">
SELECT x.maint_project_id,a.maint_project_name,a.maint_project_desc SELECT x.maint_project_id,a.maint_project_name,a.maint_project_desc
FROM dms_base_station_project x FROM dms_base_station_project x
left join dms_base_maint_project a on x.maint_project_id = a.maint_project_id left join dms_base_maint_project a on x.maint_project_id = a.maint_project_id

@ -36,15 +36,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where a.plan_inspect_id = #{planInspectId} where a.plan_inspect_id = #{planInspectId}
</select> </select>
<select id="selectPlanInspectJoinJobByInspectId1" resultType="org.dromara.dms.domain.vo.DmsPlanInspectVo" <select id="selectPlanInspectJoinJobByInspectCode" resultType="org.dromara.dms.domain.DmsPlanInspect"
parameterType="java.lang.String"> parameterType="java.lang.String">
select a.plan_inspect_id, a.plan_inspect_code, a.plan_inspect_name, a.inspect_type, select a.plan_inspect_id, a.plan_inspect_code, a.plan_inspect_name, a.inspect_type,
a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id, a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id,
a.performer, a.remark, a.create_by, a.create_time, a.update_by, a.update_time, a.performer, a.remark, a.create_by, a.create_time, a.update_by,
b.cron_expression a.update_time
/* ,
b.cron_expression*/
from dms_plan_inspect a from dms_plan_inspect a
left join sys_job b on a.job_id = b.job_id -- left join sys_job b on a.job_id = b.job_id left join sys_job b on a.job_id = b.job_id
where a.plan_inspect_code = #{planInspectId} where a.plan_inspect_code = #{planInspectCode}
</select> </select>
</mapper> </mapper>

@ -33,7 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="DmsPlanLubeDetail" id="DmsPlanLubeDetailResult"> <resultMap type="DmsPlanLubeDetail" id="DmsPlanLubeDetailResult">
<result property="planLubeDetailId" column="sub_plan_lube_detail_id" /> <result property="planLubeDetailId" column="sub_plan_lube_detail_id" />
<result property="planLubeId" column="sub_plan_lube_id" /> <result property="planLubeId" column="sub_plan_lube_id" />
<result property="machineId" column="sub_machine_id" /> <result property="deviceId" column="sub_machine_id" />
<result property="lubeStationId" column="sub_lube_station_id" /> <result property="lubeStationId" column="sub_lube_station_id" />
<result property="lubeStandardId" column="sub_lube_standard_id" /> <result property="lubeStandardId" column="sub_lube_standard_id" />
<result property="operationDescription" column="sub_operation_description" /> <result property="operationDescription" column="sub_operation_description" />
@ -47,9 +47,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectDmsPlanLubeJoinByPlanLubeCode" parameterType="String" resultMap="DmsPlanLubeDmsPlanLubeDetailResult"> <select id="selectDmsPlanLubeJoinByPlanLubeCode" parameterType="String" resultMap="DmsPlanLubeDmsPlanLubeDetailResult">
select a.plan_lube_id, a.plan_lube_code, a.lube_level, a.lube_group, a.lube_supervisor, a.lube_time, a.time_limit, a.job_id, a.cycle_period, a.create_method, a.active_flag, a.remark, a.create_by, a.create_time, a.update_by, a.update_time, select a.plan_lube_id, a.plan_lube_code, a.lube_level, a.lube_group, a.lube_supervisor, a.lube_time, a.time_limit, a.job_id, a.cycle_period, a.create_method, a.active_flag, a.remark, a.create_by, a.create_time, a.update_by, a.update_time,
b.plan_lube_detail_id as sub_plan_lube_detail_id, /* b.plan_lube_detail_id as sub_plan_lube_detail_id,
b.plan_lube_id as sub_plan_lube_id, b.plan_lube_id as sub_plan_lube_id,
b.machine_id as sub_machine_id, b.device_id as sub_machine_id,
b.lube_station_id as sub_lube_station_id, b.lube_station_id as sub_lube_station_id,
b.lube_standard_id as sub_lube_standard_id, b.lube_standard_id as sub_lube_standard_id,
b.operation_description as sub_operation_description, b.operation_description as sub_operation_description,
@ -58,9 +58,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
b.create_by as sub_create_by, b.create_by as sub_create_by,
b.create_time as sub_create_time, b.create_time as sub_create_time,
b.update_by as sub_update_by, b.update_by as sub_update_by,
b.update_time as sub_update_time b.update_time as sub_update_time*/
from dms_plan_lube a from dms_plan_lube a
left join dms_plan_lube_detail b on b.plan_lube_id = a.plan_lube_id /* left join dms_plan_lube_detail b on b.plan_lube_id = a.plan_lube_id*/
where a.plan_lube_code = #{planLubeCode} where a.plan_lube_code = #{planLubeCode}
</select> </select>

@ -30,6 +30,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<collection property="dmsPlanMaintDetailList" notNullColumn="sub_plan_maint_detail_id" javaType="java.util.List" resultMap="DmsPlanMaintDetailResult" /> <collection property="dmsPlanMaintDetailList" notNullColumn="sub_plan_maint_detail_id" javaType="java.util.List" resultMap="DmsPlanMaintDetailResult" />
</resultMap> </resultMap>
<resultMap type="DmsPlanMaintDetail" id="DmsPlanMaintDetailResult">
<result property="planMaintDetailId" column="sub_plan_maint_detail_id" />
<result property="planMaintId" column="sub_plan_maint_id" />
<result property="machineId" column="sub_machine_id" />
<result property="maintStationId" column="sub_maint_station_id" />
<result property="maintStandardId" column="sub_maint_standard_id" />
<result property="operationDescription" column="sub_operation_description" />
<!-- <result property="isFlag" column="sub_is_flag" />-->
<result property="remark" column="sub_remark" />
<result property="createBy" column="sub_create_by" />
<result property="createTime" column="sub_create_time" />
<result property="updateBy" column="sub_update_by" />
<result property="updateTime" column="sub_update_time" />
</resultMap>
<select id="selectDmsPlanMaintJoinByPlanMaintCode" parameterType="String" resultMap="DmsPlanMaintDmsPlanMaintDetailResult"> <select id="selectDmsPlanMaintJoinByPlanMaintCode" parameterType="String" resultMap="DmsPlanMaintDmsPlanMaintDetailResult">
select a.plan_maint_id, a.plan_maint_code, a.maint_level, a.maint_group, a.maint_supervisor, a.maint_time,a.time_limit,a.job_id, select a.plan_maint_id, a.plan_maint_code, a.maint_level, a.maint_group, a.maint_supervisor, a.maint_time,a.time_limit,a.job_id,
a.cycle_period, a.maint_status, a.create_method, a.remark, a.create_by, a.create_time, a.update_by, a.update_time, a.cycle_period, a.maint_status, a.create_method, a.remark, a.create_by, a.create_time, a.update_by, a.update_time,

@ -3,4 +3,62 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.dms.mapper.DmsPlanRepairMapper"> <mapper namespace="org.dromara.dms.mapper.DmsPlanRepairMapper">
<resultMap type="DmsPlanRepair" id="DmsPlanRepairResult">
<result property="planRepairId" column="plan_repair_id" />
<result property="planRepairCode" column="plan_repair_code" />
<result property="repairType" column="repair_type" />
<result property="repairGroup" column="repair_group" />
<result property="repairSupervisor" column="repair_supervisor" />
<result property="repairTime" column="repair_time" />
<result property="timeLimit" column="time_limit" />
<!-- <result property="repairEndTime" column="repair_end_time" />-->
<result property="cyclePeriod" column="cycle_period" />
<!-- <result property="repairStatus" column="repair_status" />-->
<result property="createMethod" column="create_method" />
<!--<result property="isFlag" column="is_flag" />-->
<result property="remark" column="remark" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<resultMap id="DmsPlanRepairDmsPlanRepairDetailResult" type="DmsPlanRepair" extends="DmsPlanRepairResult">
<collection property="dmsPlanRepairDetailList" notNullColumn="sub_plan_repair_detail_id" javaType="java.util.List" resultMap="DmsPlanRepairDetailResult" />
</resultMap>
<resultMap type="DmsPlanRepairDetail" id="DmsPlanRepairDetailResult">
<result property="planRepairDetailId" column="sub_plan_repair_detail_id" />
<result property="planRepairId" column="sub_plan_repair_id" />
<result property="repairDetailTargetType" column="repair_detail_target_type" />
<result property="repairDetailTargetId" column="repair_detail_target_id" />
<result property="faultType" column="sub_fault_type" />
<result property="repairDesc" column="sub_repair_desc" />
<result property="repairProtocol" column="sub_repair_protocol" />
<result property="operationDescription" column="sub_operation_description" />
<result property="createBy" column="sub_create_by" />
<result property="createTime" column="sub_create_time" />
<result property="updateBy" column="sub_update_by" />
<result property="updateTime" column="sub_update_time" />
</resultMap>
<select id="selectDmsPlanRepairByPlanRepairCode" parameterType="String" resultMap="DmsPlanRepairDmsPlanRepairDetailResult">
select a.plan_repair_id, a.plan_repair_code, a.repair_type, a.repair_group, a.repair_supervisor, a.repair_time, a.cycle_period, a.create_method,
/*a.is_flag, */
a.remark, a.create_by, a.create_time, a.update_by, a.update_time,a.time_limit,
b.plan_repair_detail_id as sub_plan_repair_detail_id, b.plan_repair_id as sub_plan_repair_id, b.repair_detail_target_type as sub_repair_detail_target_type,b.repair_detail_target_id as repair_detail_target_id, b.fault_type as sub_fault_type, b.repair_desc as sub_repair_desc, b.repair_protocol as sub_repair_protocol, b.operation_description as sub_operation_description, b.create_by as sub_create_by, b.create_time as sub_create_time, b.update_by as sub_update_by, b.update_time as sub_update_time
from dms_plan_repair a
left join dms_plan_repair_detail b on b.plan_repair_id = a.plan_repair_id
where a.plan_repair_code = #{planRepairCode}
</select>
<select id="selectDmsPlanRepairByPlanRepairId" parameterType="Long" resultMap="DmsPlanRepairDmsPlanRepairDetailResult">
select a.plan_repair_id, a.plan_repair_code, a.repair_type, a.repair_group, a.repair_supervisor, a.repair_time, a.cycle_period, a.create_method, a.is_flag, a.remark, a.create_by, a.create_time, a.update_by, a.update_time,a.time_limit,
b.plan_repair_detail_id as sub_plan_repair_detail_id, b.plan_repair_id as sub_plan_repair_id, b.repair_detail_target_type as sub_repair_detail_target_type,b.repair_detail_target_id as repair_detail_target_id, b.fault_type as sub_fault_type, b.repair_desc as sub_repair_desc, b.repair_protocol as sub_repair_protocol, b.operation_description as sub_operation_description, b.create_by as sub_create_by, b.create_time as sub_create_time, b.update_by as sub_update_by, b.update_time as sub_update_time
from dms_plan_repair a
left join dms_plan_repair_detail b on b.plan_repair_id = a.plan_repair_id
where a.plan_repair_id = #{planRepairId}
</select>
</mapper> </mapper>

@ -111,10 +111,6 @@
<groupId>com.microsoft.sqlserver</groupId> <groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId> <artifactId>mssql-jdbc</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>hwmom-common-mom</artifactId> <artifactId>hwmom-common-mom</artifactId>
@ -135,6 +131,36 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-autoconfigure</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-data-jpa</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -0,0 +1,92 @@
package org.dromara.mes.config;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.enums.PlanStatusEnum;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.guard.Guard;
import org.springframework.statemachine.action.Action;
import java.util.EnumSet;
@Configuration
@EnableStateMachineFactory
public class PlanStatusMachineConfig extends StateMachineConfigurerAdapter<PlanStatusEnum, PlanEventEnum> {
@Override
public void configure(StateMachineStateConfigurer<PlanStatusEnum, PlanEventEnum> states) throws Exception {
states
.withStates()
.initial(PlanStatusEnum.CREATED)
.states(EnumSet.allOf(PlanStatusEnum.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<PlanStatusEnum, PlanEventEnum> transitions) throws Exception {
transitions
.withExternal()
.source(PlanStatusEnum.CREATED)
.target(PlanStatusEnum.PLANNED)
.event(PlanEventEnum.PLAN)
.and()
.withExternal()
.source(PlanStatusEnum.PLANNED)
.target(PlanStatusEnum.IN_PROGRESS)
.event(PlanEventEnum.START)
.action(startAction())
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.PAUSED)
.event(PlanEventEnum.PAUSE)
.and()
.withExternal()
.source(PlanStatusEnum.PAUSED)
.target(PlanStatusEnum.IN_PROGRESS)
.event(PlanEventEnum.RESUME)
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.COMPLETED)
.event(PlanEventEnum.COMPLETE)
.guard(completionGuard())
.and()
.withExternal()
.source(PlanStatusEnum.CREATED)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL)
.and()
.withExternal()
.source(PlanStatusEnum.PLANNED)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL)
.and()
.withExternal()
.source(PlanStatusEnum.IN_PROGRESS)
.target(PlanStatusEnum.CANCELLED)
.event(PlanEventEnum.CANCEL);
}
@Bean
public Action<PlanStatusEnum, PlanEventEnum> startAction() {
return context -> {
System.out.println("工单启动,准备资源...");
// 可注入其他Service
};
}
@Bean
public Guard<PlanStatusEnum, PlanEventEnum> completionGuard() {
return context -> {
// 检查是否允许完成
System.out.println("检查是否允许完成");
return true; // 示例:始终允许
};
}
}

@ -135,6 +135,19 @@ public class ProdMaterialBomController extends BaseController {
return R.ok(list); return R.ok(list);
} }
/**
* BOM
*/
@SaCheckPermission("mes:materialBom:add")
@GetMapping("/selectNextMaterialBomVersion/{parentId}")
public R<String> selectNextMaterialBomVersion(@NotNull(message = "不能为空")
@PathVariable Long parentId) {
String nextMaterialBomVersion = prodMaterialBomService.selectNextMaterialBomVersion(parentId);
return R.ok("success",nextMaterialBomVersion);
}
/** /**
* BOMBOM * BOMBOM
*/ */
@ -203,4 +216,15 @@ public class ProdMaterialBomController extends BaseController {
return R.ok(list); return R.ok(list);
} }
/**
*
*/
@SaCheckPermission("mes:materialBom:publish")
@Log(title = "物料BOM信息", businessType = BusinessType.PUBLISH)
@RepeatSubmit()
@PostMapping("/publish")
public R<Void> publish(@RequestBody ProdMaterialBomBo bo) {
return toAjax(prodMaterialBomService.publishByBo(bo));
}
} }

@ -17,9 +17,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.mes.domain.ProdBaseRouteProcess; import org.dromara.mes.domain.ProdBaseRouteProcess;
import org.dromara.mes.domain.bo.ProdMaterialBomBo; import org.dromara.mes.domain.bo.ProdMaterialBomBo;
import org.dromara.mes.domain.bo.ProdMaterialBomVersionBo;
import org.dromara.mes.domain.bo.ProdPlanInfoBo; import org.dromara.mes.domain.bo.ProdPlanInfoBo;
import org.dromara.mes.domain.vo.*; import org.dromara.mes.domain.vo.*;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.service.IProdBaseRouteProcessService; import org.dromara.mes.service.IProdBaseRouteProcessService;
import org.dromara.mes.service.IProdMaterialBomService; import org.dromara.mes.service.IProdMaterialBomService;
import org.dromara.mes.service.IProdMaterialBomVersionService; import org.dromara.mes.service.IProdMaterialBomVersionService;
@ -206,8 +206,19 @@ public class ProdPlanInfoController extends BaseController {
*/ */
@SaCheckPermission("mes:planInfo:list") @SaCheckPermission("mes:planInfo:list")
@GetMapping("/materialBomVersionSelect") @GetMapping("/materialBomVersionSelect")
public R<List<ProdMaterialBomVersionVo>> materialBomVersionSelect(ProdMaterialBomVersionBo prodMaterialBomBo) { public R<List<ProdMaterialBomVo>> materialBomVersionSelect(ProdMaterialBomBo prodMaterialBomBo) {
return R.ok(prodMaterialBomVersionService.queryList(prodMaterialBomBo)); return R.ok(prodMaterialBomService.queryList4Select(prodMaterialBomBo));
} }
/**
* planstatus
* @param planId
* @param event
* @return
*/
@PostMapping("/{planId}/events")
public boolean triggerEvent(@PathVariable Long planId, @RequestParam PlanEventEnum event) {
return prodPlanInfoService.sendEvent(planId, event);
}
} }

@ -128,6 +128,11 @@ public class ProdBaseMachineInfo extends TenantEntity {
@TableLogic @TableLogic
private String delFlag; private String delFlag;
/**
* 1 2
*/
private String instockType;
/** /**
* *
*/ */

@ -0,0 +1,46 @@
package org.dromara.mes.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.util.Date;
/**
* prod_base_station_materialtype
*
* @author Yinq
* @date 2025-05-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("prod_base_station_materialtype")
public class ProdBaseStationMaterialtype extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long stationId;
/**
* ID
*/
private Long materialTypeId;
/**
* (1 0)
*/
private String activeFlag;
@TableField(exist = false)
private Long updateBy;
@TableField(exist = false)
private Date updateTime;
}

@ -140,5 +140,10 @@ public class ProdBaseMachineInfoBo extends BaseEntity {
@ExcelProperty(value = "请求间隔") @ExcelProperty(value = "请求间隔")
private Long requestInterval; private Long requestInterval;
/**
* 1 2
*/
private String instockType;
private List<ProdBaseMachineProcess> baseMachineProcessList; private List<ProdBaseMachineProcess> baseMachineProcessList;
} }

@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import java.util.List;
/** /**
* prod_base_station_info * prod_base_station_info
@ -75,4 +78,6 @@ public class ProdBaseStationInfoBo extends BaseEntity {
private String remark; private String remark;
private Long machineId; private Long machineId;
private List<ProdBaseStationMaterialtype> prodBaseStationMaterialtypeList;
} }

@ -0,0 +1,42 @@
package org.dromara.mes.domain.bo;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* prod_base_station_materialtype
*
* @author Yinq
* @date 2025-05-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ProdBaseStationMaterialtype.class, reverseConvertGenerate = false)
public class ProdBaseStationMaterialtypeBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "工位ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long stationId;
/**
* ID
*/
@NotNull(message = "物料类型ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long materialTypeId;
/**
* (1 0)
*/
@NotBlank(message = "激活标识(1是 0否)不能为空", groups = { AddGroup.class, EditGroup.class })
private String activeFlag;
}

@ -126,13 +126,15 @@ public class ProdPlanInfoBo extends BaseEntity {
private Long completeAmount; private Long completeAmount;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date planBeginTime; private Date planBeginTime;
/** /**
* *
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date planEndTime; private Date planEndTime;
/** /**

@ -197,6 +197,13 @@ public class ProdBaseMachineInfoVo implements Serializable {
@ExcelProperty(value = "设备模型名称") @ExcelProperty(value = "设备模型名称")
private String deviceModeName; private String deviceModeName;
/**
* 1 2
*/
@ExcelProperty(value = "入库类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "mes_instock_type")
private String instockType;
private List<ProdBaseMachineProcess> baseMachineProcessList; private List<ProdBaseMachineProcess> baseMachineProcessList;
} }

@ -7,10 +7,12 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
@ -138,4 +140,6 @@ public class ProdBaseStationInfoVo implements Serializable {
*/ */
@ExcelProperty(value = "机台名称") @ExcelProperty(value = "机台名称")
private String machineName; private String machineName;
private List<ProdBaseStationMaterialtype> prodBaseStationMaterialtypeList;
} }

@ -0,0 +1,51 @@
package org.dromara.mes.domain.vo;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* prod_base_station_materialtype
*
* @author Yinq
* @date 2025-05-13
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ProdBaseStationMaterialtype.class)
public class ProdBaseStationMaterialtypeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "工位ID")
private Long stationId;
/**
* ID
*/
@ExcelProperty(value = "物料类型ID")
private Long materialTypeId;
/**
* (1 0)
*/
@ExcelProperty(value = "激活标识(1是 0否)", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "active_flag")
private String activeFlag;
}

@ -213,4 +213,8 @@ public class ProdMaterialBomVo implements Serializable {
&& Objects.equals(parentMaterialTypeId, o.getParentMaterialTypeId()) && Objects.equals(materialBomVersion, o.getMaterialBomVersion()) && Objects.equals(parentMaterialTypeId, o.getParentMaterialTypeId()) && Objects.equals(materialBomVersion, o.getMaterialBomVersion())
&& standardAmount.compareTo(o.getStandardAmount())==0; && standardAmount.compareTo(o.getStandardAmount())==0;
} }
public String getKey(){
return this.parentId+"-"+this.materialBomVersion;
}
} }

@ -11,11 +11,13 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.mes.enums.PlanStatusEnum;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
/** /**
@ -182,6 +184,7 @@ public class ProdPlanInfoVo implements Serializable {
*/ */
@ExcelProperty(value = "工单计划状态", converter = ExcelDictConvert.class) @ExcelProperty(value = "工单计划状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "mes_plan_status") @ExcelDictFormat(dictType = "mes_plan_status")
// @Enumerated(EnumType.ORDINAL)
private String planStatus; private String planStatus;
/** /**

@ -52,6 +52,10 @@ public class TreeSelect implements Serializable {
private String treeKey;//作为树的唯一键使用 private String treeKey;//作为树的唯一键使用
private String activeFlag;//状态
private boolean isRoot;
public TreeSelect() { public TreeSelect() {
} }
@ -79,6 +83,27 @@ public class TreeSelect implements Serializable {
this.materialTypeId = prodMaterialBomVo.getMaterialTypeId(); this.materialTypeId = prodMaterialBomVo.getMaterialTypeId();
this.materialTypeName = prodMaterialBomVo.getMaterialTypeName(); this.materialTypeName = prodMaterialBomVo.getMaterialTypeName();
this.materialBomVersion = prodMaterialBomVo.getMaterialBomVersion(); this.materialBomVersion = prodMaterialBomVo.getMaterialBomVersion();
this.activeFlag = prodMaterialBomVo.getActiveFlag();
}
public TreeSelect(ProdMaterialBomVo prodMaterialBomVo,boolean isRoot) {
this.id = prodMaterialBomVo.getMaterialBomId();//树的唯一键,有可能为空所以不能作为树的ID
this.treeKey = prodMaterialBomVo.getMaterialId() + "-" + prodMaterialBomVo.getMaterialBomVersion();
if (prodMaterialBomVo.getParentId() == null) {
this.label = prodMaterialBomVo.getMaterialName();
} else {
this.label = "[" + prodMaterialBomVo.getMaterialBomVersion() + "][" + prodMaterialBomVo.getMaterialTypeName() + "]" +
prodMaterialBomVo.getMaterialName();
}
this.parentId = prodMaterialBomVo.getParentId();
this.materialId = prodMaterialBomVo.getMaterialId();
this.children = prodMaterialBomVo.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
this.materialName = prodMaterialBomVo.getMaterialName();
this.materialTypeId = prodMaterialBomVo.getMaterialTypeId();
this.materialTypeName = prodMaterialBomVo.getMaterialTypeName();
this.materialBomVersion = prodMaterialBomVo.getMaterialBomVersion();
this.activeFlag = prodMaterialBomVo.getActiveFlag();
this.isRoot = isRoot;
} }
public Long getId() { public Long getId() {
@ -160,4 +185,25 @@ public class TreeSelect implements Serializable {
public void setTreeKey(String treeKey) { public void setTreeKey(String treeKey) {
this.treeKey = treeKey; this.treeKey = treeKey;
} }
public String getActiveFlag() {
return activeFlag;
}
public void setActiveFlag(String activeFlag) {
this.activeFlag = activeFlag;
}
public boolean isRoot() {
return isRoot;
}
public void setRoot(boolean root) {
isRoot = root;
}
// 唯一标识
public String getUniqueKey() {
return parentId + "|" + materialId + "|" + materialBomVersion;
}
} }

@ -0,0 +1,16 @@
package org.dromara.mes.enums;
/**
* @description pro_plan_info
* 0 1 2 3 4
* @author xins
* @date 2025/4/15 9:28
*/
public enum PlanEventEnum {
PLAN, // 计划
START, // 开始
PAUSE, // 暂停
RESUME, // 恢复
COMPLETE, // 完成
CANCEL // 取消
}

@ -0,0 +1,41 @@
package org.dromara.mes.enums;
/**
* @description pro_plan_info
* 0 1 2 3 4
* @author xins
* @date 2025/4/15 9:28
*/
public enum PlanStatusEnum {
CREATED("0", "已创建"),
PLANNED("1", "已计划"),
IN_PROGRESS("2", "进行中"),
PAUSED("3", "已暂停"),
COMPLETED("4", "已完成"),
CANCELLED("5", "已取消");
private final String code;
private final String description;
PlanStatusEnum(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
public static PlanStatusEnum fromCode(String code) {
for (PlanStatusEnum status : PlanStatusEnum.values()) {
if (status.getCode().equals(code)) {
return status;
}
}
throw new IllegalArgumentException("Invalid status code: " + code);
}
}

@ -0,0 +1,39 @@
package org.dromara.mes.listeners;
import lombok.extern.slf4j.Slf4j;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.enums.PlanStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.listener.StateMachineListener;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.state.State;
import org.springframework.stereotype.Component;
/**
* @Author xins
* @Date 2025/4/15 14:07
* @Description:
*/
@Slf4j
@Component
public class StatusMachineListeners extends StateMachineListenerAdapter<String, String>{
@Override
public void stateChanged(State<String, String> from, State<String, String> to) {
System.out.println("State changed from " + (from != null ? from.getId() : "null")
+ " to " + to.getId());
}
@Override
public void stateEntered(State<String, String> state) {
System.out.println("Entered state: " + state.getId());
}
@Override
public void stateExited(State<String, String> state) {
System.out.println("Exited state: " + state.getId());
}
}

@ -0,0 +1,15 @@
package org.dromara.mes.mapper;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import org.dromara.mes.domain.vo.ProdBaseStationMaterialtypeVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* Mapper
*
* @author Yinq
* @date 2025-05-13
*/
public interface ProdBaseStationMaterialtypeMapper extends BaseMapperPlus<ProdBaseStationMaterialtype, ProdBaseStationMaterialtypeVo> {
}

@ -1,5 +1,6 @@
package org.dromara.mes.mapper; package org.dromara.mes.mapper;
import org.apache.ibatis.annotations.Select;
import org.dromara.mes.domain.ProdMaterialBom; import org.dromara.mes.domain.ProdMaterialBom;
import org.dromara.mes.domain.bo.ProdMaterialBomBo; import org.dromara.mes.domain.bo.ProdMaterialBomBo;
import org.dromara.mes.domain.vo.ProdMaterialBomVo; import org.dromara.mes.domain.vo.ProdMaterialBomVo;
@ -57,4 +58,14 @@ public interface ProdMaterialBomMapper extends BaseMapperPlus<ProdMaterialBom, P
* @return bom * @return bom
*/ */
ProdMaterialBomVo selectParentMaterialBomJoin(ProdMaterialBomBo podMaterialBomBo); ProdMaterialBomVo selectParentMaterialBomJoin(ProdMaterialBomBo podMaterialBomBo);
@Select("SELECT NEXT VALUE FOR material_bom_id_sequence")
long getNextMaterialBomIdSequence();
/**
* parentId(+1)
* @param parentId
* @return
*/
String selectNextMaterialBomVersion(Long parentId);
} }

@ -0,0 +1,69 @@
package org.dromara.mes.service;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import org.dromara.mes.domain.vo.ProdBaseStationMaterialtypeVo;
import org.dromara.mes.domain.bo.ProdBaseStationMaterialtypeBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author Yinq
* @date 2025-05-13
*/
public interface IProdBaseStationMaterialtypeService {
/**
*
*
* @param stationId
* @return
*/
ProdBaseStationMaterialtypeVo queryById(Long stationId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ProdBaseStationMaterialtypeVo> queryPageList(ProdBaseStationMaterialtypeBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ProdBaseStationMaterialtypeVo> queryList(ProdBaseStationMaterialtypeBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ProdBaseStationMaterialtypeBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ProdBaseStationMaterialtypeBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

@ -4,9 +4,11 @@ import org.dromara.mes.domain.ProdMaterialBom;
import org.dromara.mes.domain.vo.ProdMaterialBomVo; import org.dromara.mes.domain.vo.ProdMaterialBomVo;
import org.dromara.mes.domain.bo.ProdMaterialBomBo; import org.dromara.mes.domain.bo.ProdMaterialBomBo;
import org.dromara.mes.domain.vo.TreeSelect; import org.dromara.mes.domain.vo.TreeSelect;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* BOMService * BOMService
@ -49,6 +51,15 @@ public interface IProdMaterialBomService {
*/ */
Boolean updateByBo(ProdMaterialBomBo bo); Boolean updateByBo(ProdMaterialBomBo bo);
/**
* BOM
*
* @param bo BOM
* @return
*/
public Boolean publishByBo(ProdMaterialBomBo bo);
/** /**
* BOM * BOM
* *
@ -65,6 +76,13 @@ public interface IProdMaterialBomService {
*/ */
public Boolean deleteMaterialBoms(List<ProdMaterialBomBo> materialBomBos); public Boolean deleteMaterialBoms(List<ProdMaterialBomBo> materialBomBos);
/**
* ID
* @param parentId
* @return
*/
public String selectNextMaterialBomVersion(Long parentId);
/** /**
* BOMBOM * BOMBOM
* @param boList BOM * @param boList BOM
@ -95,4 +113,12 @@ public interface IProdMaterialBomService {
* @return bom * @return bom
*/ */
public List<TreeSelect> selectMaterialBomTreeList(ProdMaterialBomBo bo); public List<TreeSelect> selectMaterialBomTreeList(ProdMaterialBomBo bo);
/**
* BOM
*
* @param bo
* @return BOM
*/
public List<ProdMaterialBomVo> queryList4Select(ProdMaterialBomBo bo);
} }

@ -6,6 +6,7 @@ import org.dromara.mes.domain.vo.ProdPlanInfoVo;
import org.dromara.mes.domain.bo.ProdPlanInfoBo; import org.dromara.mes.domain.bo.ProdPlanInfoBo;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.mes.enums.PlanEventEnum;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -107,4 +108,8 @@ public interface IProdPlanInfoService {
* @return * @return
*/ */
List<PlanMonitorVo> queryMoritorList(ProdPlanInfoBo bo); List<PlanMonitorVo> queryMoritorList(ProdPlanInfoBo bo);
public boolean sendEvent(Long planId, PlanEventEnum event);
} }

@ -1,5 +1,6 @@
package org.dromara.mes.service.impl; package org.dromara.mes.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -9,12 +10,11 @@ import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.mes.domain.ProdBaseMachineInfo; import org.dromara.mes.domain.*;
import org.dromara.mes.domain.ProdBaseProcessInfo; import org.dromara.mes.mapper.ProdBaseStationMaterialtypeMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.mes.domain.bo.ProdBaseStationInfoBo; import org.dromara.mes.domain.bo.ProdBaseStationInfoBo;
import org.dromara.mes.domain.vo.ProdBaseStationInfoVo; import org.dromara.mes.domain.vo.ProdBaseStationInfoVo;
import org.dromara.mes.domain.ProdBaseStationInfo;
import org.dromara.mes.mapper.ProdBaseStationInfoMapper; import org.dromara.mes.mapper.ProdBaseStationInfoMapper;
import org.dromara.mes.service.IProdBaseStationInfoService; import org.dromara.mes.service.IProdBaseStationInfoService;
@ -34,6 +34,9 @@ public class ProdBaseStationInfoServiceImpl implements IProdBaseStationInfoServi
private final ProdBaseStationInfoMapper baseMapper; private final ProdBaseStationInfoMapper baseMapper;
private final ProdBaseStationMaterialtypeMapper stationMaterialtypeMapper;
/** /**
* *
* *
@ -42,7 +45,18 @@ public class ProdBaseStationInfoServiceImpl implements IProdBaseStationInfoServi
*/ */
@Override @Override
public ProdBaseStationInfoVo queryById(Long stationId) { public ProdBaseStationInfoVo queryById(Long stationId) {
return baseMapper.selectVoById(stationId); ProdBaseStationInfoBo bo = new ProdBaseStationInfoBo();
bo.setStationId(stationId);
MPJLambdaWrapper<ProdBaseStationInfo> lqw = buildQueryWrapper(bo);
ProdBaseStationInfoVo prodBaseStationInfoVo = baseMapper.selectVoOne(lqw);
//机台关联工序
MPJLambdaWrapper<ProdBaseStationMaterialtype> lqwRelation = JoinWrappers.lambda(ProdBaseStationMaterialtype.class)
.selectAll(ProdBaseStationMaterialtype.class)
.eq(bo.getStationId() != null, ProdBaseStationMaterialtype::getStationId, bo.getStationId())
.orderByAsc(ProdBaseStationMaterialtype::getCreateTime);
List<ProdBaseStationMaterialtype> prodBaseStationMaterialtypeList = stationMaterialtypeMapper.selectList(lqwRelation);
prodBaseStationInfoVo.setProdBaseStationMaterialtypeList(prodBaseStationMaterialtypeList);
return prodBaseStationInfoVo;
} }
/** /**
@ -119,6 +133,15 @@ public class ProdBaseStationInfoServiceImpl implements IProdBaseStationInfoServi
public Boolean updateByBo(ProdBaseStationInfoBo bo) { public Boolean updateByBo(ProdBaseStationInfoBo bo) {
ProdBaseStationInfo update = MapstructUtils.convert(bo, ProdBaseStationInfo.class); ProdBaseStationInfo update = MapstructUtils.convert(bo, ProdBaseStationInfo.class);
validEntityBeforeSave(update); validEntityBeforeSave(update);
List<ProdBaseStationMaterialtype> prodBaseStationMaterialtypeList = bo.getProdBaseStationMaterialtypeList();
if (!prodBaseStationMaterialtypeList.isEmpty()) {
LambdaQueryWrapper<ProdBaseStationMaterialtype> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotNull(bo.getStationId()), ProdBaseStationMaterialtype::getStationId, bo.getStationId());
stationMaterialtypeMapper.delete(lqw);
for (ProdBaseStationMaterialtype stationMaterialType : prodBaseStationMaterialtypeList) {
stationMaterialtypeMapper.insert(stationMaterialType);
}
}
return baseMapper.updateById(update) > 0; return baseMapper.updateById(update) > 0;
} }

@ -0,0 +1,134 @@
package org.dromara.mes.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.mes.domain.bo.ProdBaseStationMaterialtypeBo;
import org.dromara.mes.domain.vo.ProdBaseStationMaterialtypeVo;
import org.dromara.mes.domain.ProdBaseStationMaterialtype;
import org.dromara.mes.mapper.ProdBaseStationMaterialtypeMapper;
import org.dromara.mes.service.IProdBaseStationMaterialtypeService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
*
* @author Yinq
* @date 2025-05-13
*/
@RequiredArgsConstructor
@Service
public class ProdBaseStationMaterialtypeServiceImpl implements IProdBaseStationMaterialtypeService {
private final ProdBaseStationMaterialtypeMapper baseMapper;
/**
*
*
* @param stationId
* @return
*/
@Override
public ProdBaseStationMaterialtypeVo queryById(Long stationId){
return baseMapper.selectVoById(stationId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ProdBaseStationMaterialtypeVo> queryPageList(ProdBaseStationMaterialtypeBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ProdBaseStationMaterialtype> lqw = buildQueryWrapper(bo);
Page<ProdBaseStationMaterialtypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ProdBaseStationMaterialtypeVo> queryList(ProdBaseStationMaterialtypeBo bo) {
MPJLambdaWrapper<ProdBaseStationMaterialtype> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private MPJLambdaWrapper<ProdBaseStationMaterialtype> buildQueryWrapper(ProdBaseStationMaterialtypeBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ProdBaseStationMaterialtype> lqw = JoinWrappers.lambda(ProdBaseStationMaterialtype.class)
.selectAll(ProdBaseStationMaterialtype.class)
.eq(bo.getStationId() != null, ProdBaseStationMaterialtype::getStationId, bo.getStationId())
.eq(bo.getMaterialTypeId() != null, ProdBaseStationMaterialtype::getMaterialTypeId, bo.getMaterialTypeId())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ProdBaseStationMaterialtype::getActiveFlag, bo.getActiveFlag())
.orderByDesc(ProdBaseStationMaterialtype::getCreateTime);
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(ProdBaseStationMaterialtypeBo bo) {
ProdBaseStationMaterialtype add = MapstructUtils.convert(bo, ProdBaseStationMaterialtype.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setStationId(add.getStationId());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(ProdBaseStationMaterialtypeBo bo) {
ProdBaseStationMaterialtype update = MapstructUtils.convert(bo, ProdBaseStationMaterialtype.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ProdBaseStationMaterialtype entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -134,6 +134,60 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
} }
/**
* BOM
*
* @param bo BOM
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean publishByBo(ProdMaterialBomBo bo) {
String materialBomVersion = bo.getMaterialBomVersion();
bo.setDeleteFlag(HwMomMesConstants.DELETE_FLAG_NO);
bo.setMaterialBomVersion(null);
//先获取parentid所有的物料bom信息
List<ProdMaterialBomVo> allVosByParentId = this.queryList(bo);
if (allVosByParentId == null || allVosByParentId.isEmpty()) {
throw new ServiceException("数据已删除");
}
//再过滤出当前要发布的版本信息
List<ProdMaterialBomVo> toPublishVos = allVosByParentId.stream().
filter(e -> e.getMaterialBomVersion().equals(materialBomVersion) &&
!e.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE))
.collect(Collectors.toList());
if (toPublishVos == null && toPublishVos.isEmpty()) {
throw new ServiceException("无可发布数据,或已发布");
}
//再过滤出其他激活版本,需要改为历史版本的数据
List<ProdMaterialBomVo> toHistoryVos = allVosByParentId.stream().
filter(e -> !e.getMaterialBomVersion().equals(materialBomVersion) &&
e.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE))
.collect(Collectors.toList());
//发布
for (ProdMaterialBomVo toPublishVo : toPublishVos) {
ProdMaterialBom toPublishMaterialBom = MapstructUtils.convert(toPublishVo, ProdMaterialBom.class);
toPublishMaterialBom.setActiveFlag(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE);
baseMapper.updateById(toPublishMaterialBom);
}
//改为历史版本
if (toHistoryVos != null && !toHistoryVos.isEmpty()) {
for (ProdMaterialBomVo toHistoryVo : toHistoryVos) {
ProdMaterialBom toHistoryMaterialBom = MapstructUtils.convert(toHistoryVo, ProdMaterialBom.class);
toHistoryMaterialBom.setActiveFlag(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_HISTORY);
baseMapper.updateById(toHistoryMaterialBom);
}
}
return true;
}
/** /**
* BOM * BOM
* *
@ -163,7 +217,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* @description BOM * @description BOM
*/ */
@Override @Override
@Transactional (rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean deleteMaterialBoms(List<ProdMaterialBomBo> materialBomBos) { public Boolean deleteMaterialBoms(List<ProdMaterialBomBo> materialBomBos) {
Collection<Long> ids = new ArrayList<>(); Collection<Long> ids = new ArrayList<>();
materialBomBos.forEach(materialBomBo -> { materialBomBos.forEach(materialBomBo -> {
@ -181,51 +235,65 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
* *
*/ */
private void validEntityUsed(@NotNull ProdMaterialBomBo entity) { private void validEntityUsed(@NotNull ProdMaterialBomBo entity) {
Long semiFinishedId = mesProperties.getSemiFinishedId();
Long modelingId = mesProperties.getModelingId();
Long vulcanizingId = mesProperties.getVulcanizingId();
String semiFinishedTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + semiFinishedId; if (entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_ACTIVE)) {
String modelingTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + modelingId; throw new ServiceException("此物料bom已经发布不能修改");
String vulcanizingTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + vulcanizingId;
ProdPlanInfoBo queryBo = new ProdPlanInfoBo();
queryBo.setMaterialId(entity.getParentId());
queryBo.setMaterialBomVersion(entity.getMaterialBomVersion());
MPJLambdaWrapper<ProdPlanInfo> lqw = buildPlanQueryWrapper(queryBo);
/**
* 使bom
*/
List<ProdPlanInfoVo> semiFinishedPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(semiFinishedTableName, lqw);
if (semiFinishedPlanInfoVos != null && !semiFinishedPlanInfoVos.isEmpty()) {
List<String> planCodes = semiFinishedPlanInfoVos.stream()
.map(ProdPlanInfoVo::getPlanCode)
.toList();
throw new ServiceException("半制品计划中计划编号[" + planCodes.toString() + "]已经使用此bom不能修改");
} }
List<ProdPlanInfoVo> modelingPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(modelingTableName, lqw); if (entity.getActiveFlag().equals(HwMomMesConstants.MES_MATERIAL_BOM_ACTIVE_FLAG_HISTORY)) {
if (modelingPlanInfoVos != null && !modelingPlanInfoVos.isEmpty()) { throw new ServiceException("此物料bom为历史版本不能修改");
List<String> planCodes = modelingPlanInfoVos.stream()
.map(ProdPlanInfoVo::getPlanCode)
.toList();
throw new ServiceException("成型计划中计划编号[" + planCodes.toString() + "]已经使用此bom不能修改");
}
List<ProdPlanInfoVo> vulcanizingPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(vulcanizingTableName, lqw);
if (vulcanizingPlanInfoVos != null && !vulcanizingPlanInfoVos.isEmpty()) {
List<String> planCodes = vulcanizingPlanInfoVos.stream()
.map(ProdPlanInfoVo::getPlanCode)
.toList();
throw new ServiceException("硫化计划中计划编号已经使用[" + planCodes.toString() + "已经使用此bom不能修改");
} }
} }
// /**
// * 更新前的数据校验
// */
// private void validEntityUsed(@NotNull ProdMaterialBomBo entity) {
// Long semiFinishedId = mesProperties.getSemiFinishedId();
// Long modelingId = mesProperties.getModelingId();
// Long vulcanizingId = mesProperties.getVulcanizingId();
//
// String semiFinishedTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + semiFinishedId;
// String modelingTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + modelingId;
// String vulcanizingTableName = DatabaseConstants.TABLE_NAME_PROD_PLAN_INFO_PREFIX + "_" + vulcanizingId;
//
// ProdPlanInfoBo queryBo = new ProdPlanInfoBo();
// queryBo.setMaterialId(entity.getParentId());
// queryBo.setMaterialBomVersion(entity.getMaterialBomVersion());
// MPJLambdaWrapper<ProdPlanInfo> lqw = buildPlanQueryWrapper(queryBo);
//
// /**
// * 查询半制品计划、成型计划、硫化计划中有没有使用此bom
// */
// List<ProdPlanInfoVo> semiFinishedPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(semiFinishedTableName, lqw);
// if (semiFinishedPlanInfoVos != null && !semiFinishedPlanInfoVos.isEmpty()) {
// List<String> planCodes = semiFinishedPlanInfoVos.stream()
// .map(ProdPlanInfoVo::getPlanCode)
// .toList();
//
// throw new ServiceException("半制品计划中计划编号[" + planCodes.toString() + "]已经使用此bom不能修改");
// }
//
// List<ProdPlanInfoVo> modelingPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(modelingTableName, lqw);
// if (modelingPlanInfoVos != null && !modelingPlanInfoVos.isEmpty()) {
// List<String> planCodes = modelingPlanInfoVos.stream()
// .map(ProdPlanInfoVo::getPlanCode)
// .toList();
//
// throw new ServiceException("成型计划中计划编号[" + planCodes.toString() + "]已经使用此bom不能修改");
// }
//
// List<ProdPlanInfoVo> vulcanizingPlanInfoVos = prodPlanInfoMapper.selectProdPlanInfoList(vulcanizingTableName, lqw);
// if (vulcanizingPlanInfoVos != null && !vulcanizingPlanInfoVos.isEmpty()) {
// List<String> planCodes = vulcanizingPlanInfoVos.stream()
// .map(ProdPlanInfoVo::getPlanCode)
// .toList();
//
// throw new ServiceException("硫化计划中计划编号已经使用[" + planCodes.toString() + "已经使用此bom不能修改");
// }
//
// }
/** /**
@ -244,6 +312,20 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
} }
/**
* ID
*
* @param parentId
* @return
*/
@Override
public String selectNextMaterialBomVersion(Long parentId) {
String nextMaterialBomVersion = baseMapper.selectNextMaterialBomVersion(parentId);
System.out.println("nnn:" + nextMaterialBomVersion);
return nextMaterialBomVersion;
}
/** /**
* BOMBOM * BOMBOM
* *
@ -257,6 +339,9 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return false; return false;
} }
// long materialBomId = baseMapper.getNextMaterialBomIdSequence();
// System.out.println("matbomid:"+materialBomId);
//判断在新建子级时是否存在在此颗树的父级节点存在此子级节点根据bom版本找(可以先不加此判断,主要原因是物料类型已经限制了) //判断在新建子级时是否存在在此颗树的父级节点存在此子级节点根据bom版本找(可以先不加此判断,主要原因是物料类型已经限制了)
//获取materialbomid不为空的更新获取materialbomid为空materialid不为空的保存 //获取materialbomid不为空的更新获取materialbomid为空materialid不为空的保存
for (ProdMaterialBomBo prodMaterialBomBo : boList) { for (ProdMaterialBomBo prodMaterialBomBo : boList) {
@ -311,17 +396,305 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
@Override @Override
public List<TreeSelect> selectMaterialBomTreeList(ProdMaterialBomBo bo) { public List<TreeSelect> selectMaterialBomTreeList(ProdMaterialBomBo bo) {
List<ProdMaterialBomVo> prodMaterialBomVos = baseMapper.selectMaterialBomJoinList(bo); List<ProdMaterialBomVo> prodMaterialBomVos = baseMapper.selectMaterialBomJoinList(bo);
return buildMaterialBomTreeSelect(prodMaterialBomVos); return buildMaterialBomTree(prodMaterialBomVos);
} }
/** /**
* *
* *
* @param bomList bom
* @return
*/
private List<TreeSelect> buildMaterialBomTree(List<ProdMaterialBomVo> bomList) {
// 1. 建立索引
Map<String, List<ProdMaterialBomVo>> parentVersionGroup = new HashMap<>();//根据parentid_materialbomversion分组
Map<Long, Set<String>> materialVersions = new HashMap<>();//根据materialid分组存储materialbomversion
Map<Long, String> materialNameMap = new HashMap<>();//根据materialid存储materialname
Map<Long, Long> materialTypeIdMap = new HashMap<>();//根据materialid存储materialtypeid
Map<Long, String> materialTypeNameMap = new HashMap<>();//根据materialid存储materialtypename
Map<String, String> versionActiveFlagMap = new HashMap<>(); // 根据materialid和version存储版本状态
for (ProdMaterialBomVo item : bomList) {
// 按parentId+version分组
String parentKey = item.getParentId() + "_" + item.getMaterialBomVersion();
//如果不存在则计算添加
parentVersionGroup.computeIfAbsent(parentKey, k -> new ArrayList<>()).add(item);
// 记录每个material的所有版本
materialVersions.computeIfAbsent(item.getMaterialId(), k -> new HashSet<>())
.add(item.getMaterialBomVersion());
// 记录物料名称
if (item.getMaterialName() != null) {
materialNameMap.putIfAbsent(item.getMaterialId(), item.getMaterialName());
}
if (item.getParentMaterialName() != null) {
materialNameMap.putIfAbsent(item.getParentId(), item.getParentMaterialName());
}
// 记录物料类型ID和物料类型名称
if (item.getMaterialTypeId() != null) {
materialTypeIdMap.putIfAbsent(item.getMaterialId(), item.getMaterialTypeId());
materialTypeNameMap.putIfAbsent(item.getMaterialId(), item.getMaterialTypeName());
}
if (item.getParentMaterialTypeId() != null) {
materialTypeIdMap.putIfAbsent(item.getParentId(), item.getParentMaterialTypeId());
materialTypeNameMap.putIfAbsent(item.getParentId(), item.getParentMaterialTypeName());
}
// 记录版本状态(新增)
String versionKey = item.getParentId() + "_" + item.getMaterialBomVersion();
versionActiveFlagMap.putIfAbsent(versionKey, item.getActiveFlag());
}
// 2. 找出顶级节点
Set<Long> topLevelParentIds = bomList.stream()
.map(ProdMaterialBomVo::getParentId)
.filter(parentId -> !materialVersions.containsKey(parentId))
.collect(Collectors.toSet());
// 3. 构建树结构
List<TreeSelect> tree = new ArrayList<>();
for (Long topParentId : topLevelParentIds) {
// 获取该顶级节点的所有版本
Set<String> parentVersions = bomList.stream()
.filter(item -> item.getParentId().equals(topParentId))
.map(ProdMaterialBomVo::getMaterialBomVersion)
.collect(Collectors.toSet());
for (String version : parentVersions) {
String parentKey = topParentId + "_" + version;
String activeFlag = versionActiveFlagMap.get(parentKey);
TreeSelect versionNode = createParentNode(topParentId, version, activeFlag, materialNameMap, materialTypeIdMap, materialTypeNameMap, parentKey);
if (parentVersionGroup.containsKey(parentKey)) {
// 获取该父节点下的所有materialId
Set<Long> childMaterialIds = parentVersionGroup.get(parentKey).stream()
.map(ProdMaterialBomVo::getMaterialId)
.collect(Collectors.toSet());
buildTree(versionNode,childMaterialIds,materialVersions,parentVersionGroup,materialNameMap,materialTypeIdMap,materialTypeNameMap,versionActiveFlagMap);
}
// 只有当有子节点时才添加父节点
if (!versionNode.getChildren().isEmpty()) {
tree.add(versionNode);
}
}
}
return tree;
// return topLevelNodes;
// return rootNodes.stream().map(TreeSelect::new).collect(Collectors.toList());
}
private static String buildLabel(Long materialId, String version, Map<Long, String> materialNameMap, Map<Long, String> materialTypeNameMap) {
String materialName = materialNameMap.getOrDefault(materialId, "");
String materialTypeName = materialTypeNameMap.getOrDefault(materialId, "");
return String.format("[%s][%s]%s",
version,
materialTypeName.isEmpty() ? "" : materialTypeName,
materialName.isEmpty() ? "" : materialName);
}
private static void buildTree(TreeSelect versionNode,
Set<Long> childMaterialIds,Map<Long, Set<String>> materialVersions,
Map<String, List<ProdMaterialBomVo>> parentVersionGroup,
Map<Long, String> materialNameMap, Map<Long, Long> materialTypeIdMap,
Map<Long, String> materialTypeNameMap,Map<String, String> versionActiveFlagMap){
for (Long materialId : childMaterialIds) {
// 添加无版本号的基础节点
versionNode.getChildren().add(createChildNode(materialId, materialNameMap, materialTypeIdMap, materialTypeNameMap));
// 动态添加该material的有子节点的版本
if (materialVersions.containsKey(materialId)) {
for (String childVersion : materialVersions.get(materialId)) {
TreeSelect versionedNode = createVersionNodeIfHasChildren(
materialId, childVersion, materialVersions,parentVersionGroup, materialNameMap, materialTypeIdMap, materialTypeNameMap, versionActiveFlagMap);
if (versionedNode != null) {
versionNode.getChildren().add(versionedNode);
}
}
}
}
}
private static TreeSelect createChildNode(Long materialId,
Map<Long, String> materialNameMap, Map<Long, Long> materialTypeIdMap, Map<Long, String> materialTypeNameMap) {
// this.parentId = prodMaterialBomVo.getParentId();
TreeSelect node = new TreeSelect();
node.setTreeKey(materialId.toString());
String materialName = materialNameMap.getOrDefault(materialId, "");
String materialTypeName = materialTypeNameMap.getOrDefault(materialId, "");
String label = String.format("[%s]%s",
materialTypeName.isEmpty() ? "" : materialTypeName,
materialName.isEmpty() ? "" : materialName);
node.setLabel(label);
node.setMaterialId(materialId);
node.setMaterialTypeId(materialTypeIdMap.getOrDefault(materialId, 0L));
node.setMaterialTypeName(materialTypeNameMap.getOrDefault(materialId, ""));
node.setMaterialBomVersion(null);
node.setActiveFlag(null);
return node;
}
private static TreeSelect createVersionNodeIfHasChildren(Long materialId, String version,
Map<Long,Set<String>> materialVersions,
Map<String, List<ProdMaterialBomVo>> parentVersionGroup,
Map<Long, String> materialNameMap, Map<Long, Long> materialTypeIdMap,
Map<Long, String> materialTypeNameMap, Map<String, String> versionActiveFlagMap) {
String key = materialId+"_"+version;
String activeFlag = versionActiveFlagMap.getOrDefault(key, "");
// 只有当该版本有子节点时才创建
if (parentVersionGroup.containsKey(key)) {
TreeSelect node = createParentNode(materialId, version, activeFlag, materialNameMap, materialTypeIdMap, materialTypeNameMap, key);
// 添加子节点
Set<Long> childIds = parentVersionGroup.get(key).stream()
.map(ProdMaterialBomVo::getMaterialId)
.collect(Collectors.toSet());
buildTree(node,childIds,materialVersions,parentVersionGroup,materialNameMap,materialTypeIdMap,materialTypeNameMap,versionActiveFlagMap);
// for (Long childId : childIds) {
// node.getChildren().add(createChildNode(childId, materialNameMap, materialTypeIdMap, materialTypeNameMap));
// }
return node;
}
return null;
}
private static TreeSelect createParentNode(Long materialId, String version, String activeFlag, Map<Long, String> materialNameMap, Map<Long, Long> materialTypeIdMap, Map<Long, String> materialTypeNameMap, String key) {
TreeSelect node = new TreeSelect();
node.setTreeKey(key);
node.setLabel(buildLabel(materialId, version, materialNameMap, materialTypeNameMap));
node.setMaterialBomVersion(version);
node.setMaterialId(materialId);
node.setMaterialTypeId(materialTypeIdMap.getOrDefault(materialId, 0L));
node.setMaterialTypeName(materialTypeNameMap.getOrDefault(materialId, ""));
node.setActiveFlag(activeFlag);
node.setChildren(new ArrayList<>());
return node;
}
private static List<TreeSelect> buildChildren(Long currentParentId, List<ProdMaterialBomVo> items,
Map<Long, Map<String, List<ProdMaterialBomVo>>> parentVersionMap) {
List<TreeSelect> children = new ArrayList<>();
for (ProdMaterialBomVo item : items) {
// 确保当前item的parentId匹配currentParentId
if (!item.getParentId().equals(currentParentId)) {
continue;
}
TreeSelect childNode = new TreeSelect();
childNode.setTreeKey(item.getMaterialId().toString());
// 检查是否有子节点
if (parentVersionMap.containsKey(item.getMaterialId())) {
// 有子节点,需要处理每个版本
Map<String, List<ProdMaterialBomVo>> versionMap = parentVersionMap.get(item.getMaterialId());
if (versionMap.size() == 1) {
// 只有一个版本
String version = versionMap.keySet().iterator().next();
childNode.setLabel(item.getMaterialId() + " (v" + version + ")");
childNode.setMaterialBomVersion(version);
childNode.setChildren(buildChildren(item.getMaterialId(), versionMap.get(version), parentVersionMap));
} else {
// 多个版本,需要创建中间节点
childNode.setLabel(item.getMaterialId().toString());
childNode.setChildren(new ArrayList<>());
for (Map.Entry<String, List<ProdMaterialBomVo>> versionEntry : versionMap.entrySet()) {
String version = versionEntry.getKey();
TreeSelect versionNode = new TreeSelect();
versionNode.setTreeKey(item.getMaterialId() + "_" + version);
versionNode.setLabel(item.getMaterialId() + " (v" + version + ")");
versionNode.setMaterialBomVersion(version);
versionNode.setChildren(buildChildren(item.getMaterialId(), versionEntry.getValue(), parentVersionMap));
childNode.getChildren().add(versionNode);
}
}
} else {
// 没有子节点,直接创建
childNode.setLabel(item.getMaterialId().toString());
}
children.add(childNode);
}
return children;
}
// private static void printTree(List<ProdMaterialBomVo> nodes, int indent) {
// for (ProdMaterialBomVo node : nodes) {
// System.out.println(" ".repeat(indent) + node.getParentMaterialName()+"["+node.getMaterialBomVersion()+"]"+node.getMaterialName());
// printTree(node.getChildren(), indent + 1);
// }
// }
// private List<TreeSelect> buildMaterialBomTree(List<ProdMaterialBomVo> prodMaterialBomVos) {
// // 用于存储所有节点
// Map<String, TreeSelect> nodeMap = new HashMap<>();
// // 用于存储根节点
// List<TreeSelect> rootNodes = new ArrayList<>();
// // 用于识别哪些materialId是父节点
// Map<String, Boolean> isParentMap = new HashMap<>();
//
// // 第一次遍历:创建所有节点并识别父节点
// for (ProdMaterialBomVo bom : prodMaterialBomVos) {
// // 创建节点
// TreeSelect node = new TreeSelect(bom);
// String nodeKey = bom.getMaterialId() + "|" + bom.getMaterialBomVersion();
// nodeMap.put(nodeKey, node);
//
// // 标记此materialId是某个节点的parentId
// isParentMap.put(bom.getParentId(), true);
// }
//
// // 第二次遍历:建立父子关系
// for (ProdMaterialBomVo bom : prodMaterialBomVos) {
// String nodeKey = bom.getMaterialId() + "|" + bom.getMaterialBomVersion();
// String parentKey = bom.getParentId() + "|" + bom.getMaterialBomVersion();
//
// TreeSelect currentNode = nodeMap.get(nodeKey);
// TreeSelect parentNode = nodeMap.get(parentKey);
//
// if (parentNode != null) {
// // 添加到父节点的子列表
// parentNode.addChild(currentNode);
// } else if (!isParentMap.containsKey(bom.getMaterialId())) {
// // 如果当前节点的materialId从未作为parentId出现过则是根节点
// rootNodes.add(currentNode);
// }
// }
//
// return rootNodes;
// }
/**
*
*
* @param prodMaterialBomVos * @param prodMaterialBomVos
* @return * @return
*/ */
private List<ProdMaterialBomVo> buildMaterialBomTree(List<ProdMaterialBomVo> prodMaterialBomVos) { private List<ProdMaterialBomVo> buildMaterialBomTreeNodesDiscard(List<ProdMaterialBomVo> prodMaterialBomVos) {
List<ProdMaterialBomVo> returnList = new ArrayList<ProdMaterialBomVo>(); List<ProdMaterialBomVo> returnList = new ArrayList<ProdMaterialBomVo>();
/** /**
* parent * parent
@ -334,10 +707,10 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
.toList(); .toList();
//2、过滤出parentId相同的 //2、过滤出parentId-materialBomVersion相同的
List<ProdMaterialBomVo> distinctParentIdVoList = topMaterialBomVos.stream() List<ProdMaterialBomVo> distinctParentIdVoList = topMaterialBomVos.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
ProdMaterialBomVo::getParentId, // 以parentId作为key ProdMaterialBomVo::getKey, // 以parentId-materialBomVersion作为key
Function.identity(), // 以对象本身作为value Function.identity(), // 以对象本身作为value
(existing, replacement) -> existing // 如果遇到重复的key保留已有的对象 (existing, replacement) -> existing // 如果遇到重复的key保留已有的对象
)) ))
@ -355,6 +728,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
topProdMaterialBomVo.setMaterialTypeName(prodMaterialBomVo.getParentMaterialTypeName());//设置parent的物料类型名称 topProdMaterialBomVo.setMaterialTypeName(prodMaterialBomVo.getParentMaterialTypeName());//设置parent的物料类型名称
topProdMaterialBomVo.setMaterialName(prodMaterialBomVo.getParentMaterialName());//设置parent的物料名称 topProdMaterialBomVo.setMaterialName(prodMaterialBomVo.getParentMaterialName());//设置parent的物料名称
topProdMaterialBomVo.setMaterialBomVersion(prodMaterialBomVo.getMaterialBomVersion()); topProdMaterialBomVo.setMaterialBomVersion(prodMaterialBomVo.getMaterialBomVersion());
topProdMaterialBomVo.setActiveFlag(prodMaterialBomVo.getActiveFlag());
prodMaterialBomVos.add(topProdMaterialBomVo); prodMaterialBomVos.add(topProdMaterialBomVo);
recursionFn(prodMaterialBomVos, topProdMaterialBomVo); recursionFn(prodMaterialBomVos, topProdMaterialBomVo);
@ -379,28 +753,7 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
returnList = prodMaterialBomVos; returnList = prodMaterialBomVos;
} }
return returnList; return returnList;
}
/**
*
*
* @param prodMaterialBomVos bom
* @return
*/
private List<TreeSelect> buildMaterialBomTreeSelect(List<ProdMaterialBomVo> prodMaterialBomVos) {
// 根据物料bom版本号group不能的版本是不同的树。使用 groupingBy 将 List 转换为 Map<String, List<ProdMaterialBomVo>>
Map<String, List<ProdMaterialBomVo>> prodMaterialBomVoMap = prodMaterialBomVos.stream()
.collect(Collectors.groupingBy(ProdMaterialBomVo::getMaterialBomVersion));
List<ProdMaterialBomVo> allMaterialBomTrees = new ArrayList<>();
// 根据物料版本号build树
prodMaterialBomVoMap.forEach((materialBomVersion, vos) -> {
List<ProdMaterialBomVo> materialBomTrees = buildMaterialBomTree(vos);
allMaterialBomTrees.addAll(materialBomTrees);
});
return allMaterialBomTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
} }
@ -410,14 +763,21 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
private void recursionFn(List<ProdMaterialBomVo> list, ProdMaterialBomVo parent) { private void recursionFn(List<ProdMaterialBomVo> list, ProdMaterialBomVo parent) {
// 获取子节点 // 获取子节点
List<ProdMaterialBomVo> childList = getChildList(list, parent); List<ProdMaterialBomVo> childList = getChildList(list, parent);
if (childList == null || childList.isEmpty()) {
System.out.println(parent.getMaterialBomId() + "----");
// parent.setMaterialBomVersion("");
} else {
System.out.println(parent.getMaterialBomId() + "****" + childList.get(0).getMaterialBomVersion());
// parent.setMaterialBomVersion(childList.get(0).getMaterialBomVersion());
}
parent.setChildren(childList); parent.setChildren(childList);
// 递归处理子节点 // 递归处理子节点
for (ProdMaterialBomVo child : childList) { for (ProdMaterialBomVo child : childList) {
// 确保子节点继承 BOM 版本信息 // 父节点显示bom版本信息一个父子记录的信息的bom版本确保子节点继承 BOM 版本信息
if (StringUtils.isBlank(child.getMaterialBomVersion()) && StringUtils.isNotBlank(parent.getMaterialBomVersion())) { // if (StringUtils.isNotBlank(child.getMaterialBomVersion())) {
child.setMaterialBomVersion(parent.getMaterialBomVersion()); // parent.setMaterialBomVersion(child.getMaterialBomVersion());
} // }
recursionFn(list, child); recursionFn(list, child);
} }
} }
@ -481,4 +841,25 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService {
return lqw; return lqw;
} }
/**
* BOM
*
* @param bo
* @return BOM
*/
@Override
public List<ProdMaterialBomVo> queryList4Select(ProdMaterialBomBo bo) {
bo.setDeleteFlag(HwMomMesConstants.DELETE_FLAG_NO);
MPJLambdaWrapper<ProdMaterialBom> lqw = buildQueryWrapper(bo);
List<ProdMaterialBomVo> prodMaterialBomVos = baseMapper.selectVoList(lqw);
List<ProdMaterialBomVo> filteredList = prodMaterialBomVos.stream()
.collect(Collectors.groupingBy(ProdMaterialBomVo::getMaterialBomVersion)) // 按BOM版本分组
.values().stream() // 获取分组后的值集合
.map(group -> group.get(0)) // 取每组第一个元素
.collect(Collectors.toList()); // 收集为列表
return filteredList;
}
} }

@ -17,9 +17,14 @@ import org.dromara.mes.domain.bo.ProdPlanInfoBo;
import org.dromara.mes.domain.vo.MesProductPlanEditVo; import org.dromara.mes.domain.vo.MesProductPlanEditVo;
import org.dromara.mes.domain.vo.PlanMonitorVo; import org.dromara.mes.domain.vo.PlanMonitorVo;
import org.dromara.mes.domain.vo.ProdPlanInfoVo; import org.dromara.mes.domain.vo.ProdPlanInfoVo;
import org.dromara.mes.enums.PlanEventEnum;
import org.dromara.mes.enums.PlanStatusEnum;
import org.dromara.mes.mapper.ProdPlanInfoMapper; import org.dromara.mes.mapper.ProdPlanInfoMapper;
import org.dromara.mes.service.IProdPlanInfoService; import org.dromara.mes.service.IProdPlanInfoService;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
@ -27,6 +32,15 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.stereotype.Service;
import org.springframework.statemachine.support.DefaultStateMachineContext;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.service.StateMachineService;
/** /**
* Service * Service
* *
@ -37,10 +51,20 @@ import java.util.Map;
@Service @Service
public class ProdPlanInfoServiceImpl implements IProdPlanInfoService { public class ProdPlanInfoServiceImpl implements IProdPlanInfoService {
private final Logger log = LoggerFactory.getLogger(ProdPlanInfoServiceImpl.class);
private static final String PLAN_ID_HEADER = "planId";
private final ProdPlanInfoMapper baseMapper; private final ProdPlanInfoMapper baseMapper;
private final DynamicBaseSqlMapper<ProdPlanInfo> dynamicBaseSqlMapper; private final DynamicBaseSqlMapper<ProdPlanInfo> dynamicBaseSqlMapper;
@Autowired
private StateMachineFactory<PlanStatusEnum, PlanEventEnum> stateMachineFactory;
/** /**
* *
* *
@ -104,8 +128,8 @@ public class ProdPlanInfoServiceImpl implements IProdPlanInfoService {
.eq(bo.getPlanAmount() != null, ProdPlanInfo::getPlanAmount, bo.getPlanAmount()) .eq(bo.getPlanAmount() != null, ProdPlanInfo::getPlanAmount, bo.getPlanAmount())
.eq(bo.getDispatchAmount() != null, ProdPlanInfo::getDispatchAmount, bo.getDispatchAmount()) .eq(bo.getDispatchAmount() != null, ProdPlanInfo::getDispatchAmount, bo.getDispatchAmount())
.eq(bo.getCompleteAmount() != null, ProdPlanInfo::getCompleteAmount, bo.getCompleteAmount()) .eq(bo.getCompleteAmount() != null, ProdPlanInfo::getCompleteAmount, bo.getCompleteAmount())
.eq(bo.getPlanBeginTime() != null, ProdPlanInfo::getPlanBeginTime, bo.getPlanBeginTime()) .between(StringUtils.isNotNull(bo.getPlanBeginTime()) && StringUtils.isNotNull(bo.getPlanEndTime()),
.eq(bo.getPlanEndTime() != null, ProdPlanInfo::getPlanEndTime, bo.getPlanEndTime()) ProdPlanInfo::getPlanBeginTime, bo.getPlanBeginTime(), bo.getPlanEndTime())
.eq(bo.getRealBeginTime() != null, ProdPlanInfo::getRealBeginTime, bo.getRealBeginTime()) .eq(bo.getRealBeginTime() != null, ProdPlanInfo::getRealBeginTime, bo.getRealBeginTime())
.eq(bo.getRealEndTime() != null, ProdPlanInfo::getRealEndTime, bo.getRealEndTime()) .eq(bo.getRealEndTime() != null, ProdPlanInfo::getRealEndTime, bo.getRealEndTime())
.eq(StringUtils.isNotBlank(bo.getAttachId()), ProdPlanInfo::getAttachId, bo.getAttachId()) .eq(StringUtils.isNotBlank(bo.getAttachId()), ProdPlanInfo::getAttachId, bo.getAttachId())
@ -344,4 +368,61 @@ public class ProdPlanInfoServiceImpl implements IProdPlanInfoService {
return lqw; return lqw;
} }
private PlanEventEnum determineEvent(PlanStatusEnum currentStatus, PlanStatusEnum targetStatus) {
// 根据当前状态和目标状态确定需要触发的事件
if (currentStatus == PlanStatusEnum.CREATED && targetStatus == PlanStatusEnum.PLANNED) {
return PlanEventEnum.PLAN;
}
if (currentStatus == PlanStatusEnum.PLANNED && targetStatus == PlanStatusEnum.IN_PROGRESS) {
return PlanEventEnum.START;
}
// ... 其他状态转换逻辑
throw new IllegalStateException("No valid event for transition from " +
currentStatus + " to " + targetStatus);
}
public boolean sendEvent(Long planId, PlanEventEnum event) {
ProdPlanInfoVo plan = baseMapper.selectVoById(planId);
ProdPlanInfo add = MapstructUtils.convert(plan, ProdPlanInfo.class);
StateMachine<PlanStatusEnum, PlanEventEnum> sm = build(add);
Message<PlanEventEnum> message = MessageBuilder.withPayload(event)
.setHeader("planId", planId)
.build();
boolean result = sm.sendEvent(message);
if (result) {
// 保存字符串状态码到数据库
plan.setPlanStatus(sm.getState().getId().getCode());
baseMapper.updateById(add);
log.info("Plan {} status changed to {} after event {}",
planId, sm.getState().getId(), event);
}
return result;
}
private StateMachine<PlanStatusEnum, PlanEventEnum> build(ProdPlanInfo plan) {
StateMachine<PlanStatusEnum, PlanEventEnum> sm = stateMachineFactory.getStateMachine(String.valueOf(plan.getPlanId()));
sm.stop();
sm.getStateMachineAccessor()
.doWithAllRegions(sma -> {
sma.resetStateMachine(new DefaultStateMachineContext<>(
PlanStatusEnum.fromCode(plan.getPlanStatus()), null, null, null));
});
sm.start();
return sm;
}
} }

@ -84,20 +84,17 @@ public class ProdProductPlanDetailServiceImpl implements IProdProductPlanDetailS
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ProdProductPlanDetail> lqw = JoinWrappers.lambda(ProdProductPlanDetail.class) MPJLambdaWrapper<ProdProductPlanDetail> lqw = JoinWrappers.lambda(ProdProductPlanDetail.class)
.selectAll(ProdProductPlanDetail.class) .selectAll(ProdProductPlanDetail.class)
// //工装连表查询名称
//工装连表查询名称 // .select(BaseToolingInfo::getToolingName)
.select(BaseToolingInfo::getToolingName) // .leftJoin(BaseToolingInfo.class, BaseToolingInfo::getToolingId, ProdProductPlanDetail::getToolingId)
.leftJoin(BaseToolingInfo.class, BaseToolingInfo::getToolingId, ProdProductPlanDetail::getToolingId) //
// //班次连表查询名称
//班次连表查询名称 // .select(BaseShiftInfo::getShiftName)
.select(BaseShiftInfo::getShiftName) // .leftJoin(BaseShiftInfo.class, BaseShiftInfo::getShiftId, ProdProductPlanDetail::getShiftId)
.leftJoin(BaseShiftInfo.class, BaseShiftInfo::getShiftId, ProdProductPlanDetail::getShiftId) //
// //班组连表查询名称
//班组连表查询名称 // .select(BaseClassTeamInfo::getTeamName)
.select(BaseClassTeamInfo::getTeamName) // .leftJoin(BaseClassTeamInfo.class, BaseClassTeamInfo::getClassTeamId, ProdProductPlanDetail::getClassTeamId)
.leftJoin(BaseClassTeamInfo.class, BaseClassTeamInfo::getClassTeamId, ProdProductPlanDetail::getClassTeamId)
//接班 //接班
/* .select(ProdShiftChange::) /* .select(ProdShiftChange::)
.leftJoin(ProdShiftChange.class, ProdShiftChange::getShiftChangeId, ProdProductPlanDetail::getShiftChangeId)*/ .leftJoin(ProdShiftChange.class, ProdShiftChange::getShiftChangeId, ProdProductPlanDetail::getShiftChangeId)*/

@ -0,0 +1,7 @@
<?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="org.dromara.mes.mapper.ProdBaseStationMaterialtypeMapper">
</mapper>

@ -4,43 +4,103 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.mes.mapper.ProdMaterialBomMapper"> <mapper namespace="org.dromara.mes.mapper.ProdMaterialBomMapper">
<select id="selectMaterialBomJoinList" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo"> <select id="selectMaterialBomJoinList" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">
select select
pmb.material_bom_id, pmb.material_bom_id,
pmb.material_id, pmb.material_id,
pmb.parent_id, pmb.parent_id,
pmb.material_type_id, pmb.material_type_id,
pmb.material_bom_version,
pmb.parent_material_type_id, pmb.parent_material_type_id,
pmb.parent_standard_amount, pmb.material_bom_version,
pmb.parent_unit_id, pmb.active_flag,
pmb.top_flag,
bmi.material_name, bmi.material_name,
bmt.matrial_type_name as material_type_name,
bmip.material_name as parent_material_name, bmip.material_name as parent_material_name,
bmt.matrial_type_name as material_type_name,
bmtp.matrial_type_name as parent_material_type_name bmtp.matrial_type_name as parent_material_type_name
from prod_material_bom pmb from prod_material_bom pmb
left join base_material_info bmi on pmb.material_id=bmi.material_id left join base_material_info bmi on pmb.material_id=bmi.material_id
left join base_material_type bmt on pmb.material_type_id = bmt.matrial_type_id
left join base_material_info bmip on pmb.parent_id=bmip.material_id left join base_material_info bmip on pmb.parent_id=bmip.material_id
left join base_material_type bmt on bmi.material_type_id = bmt.matrial_type_id
left join base_material_type bmtp on pmb.parent_material_type_id = bmtp.matrial_type_id left join base_material_type bmtp on pmb.parent_material_type_id = bmtp.matrial_type_id
<where> <where>
and pmb.delete_flag='0'
<if test="materialTypeCode != null and materialTypeCode != ''">and bmt.matrial_type_code like concat('%', #{materialTypeCode}, <if test="materialTypeCode != null and materialTypeCode != ''">and bmt.matrial_type_code like concat('%', #{materialTypeCode},
'%') '%')
</if> </if>
<if test="materialTypeName != null and materialTypeName != ''">and bmt.matrial_type_name like concat('%', #{materialTypeName}, <if test="materialTypeName != null and materialTypeName != ''">and bmt.matrial_type_name like concat('%', #{materialTypeName},
'%') '%')
</if> </if>
<if test="materialBomVersion != null and materialBomVersion != ''">and pmb.material_bom_version = #{materialBomVersion}
</if>
<if test="parentId != null ">and pmb.parent_id = #{parentId}</if> <if test="parentId != null ">and pmb.parent_id = #{parentId}</if>
</where> </where>
order by pmb.material_bom_id, pmb.material_bom_version desc order by pmb.material_bom_id desc
</select> </select>
<!-- <select id="selectMaterialBomJoinList" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">-->
<!-- WITH BomCTE AS (-->
<!-- SELECT-->
<!-- b.parent_id,-->
<!-- b.material_id,-->
<!-- b.material_bom_version,-->
<!-- b.parent_unit_id,-->
<!-- b.active_flag,-->
<!-- b.parent_standard_amount,-->
<!-- b.material_type_id,-->
<!-- b.parent_material_type_id,-->
<!-- b.tenant_id ,-->
<!-- m_parent.material_name AS parent_material_name,-->
<!-- m_parent.material_code AS parent_material_code,-->
<!-- m_child.material_name,-->
<!-- m_child.material_code,-->
<!-- bmt_parent.matrial_type_name as parent_material_type_name,-->
<!-- bmt_child.matrial_type_name as material_type_name,-->
<!-- 1 AS level,-->
<!-- CAST(m_parent.material_name + '[' + b.material_bom_version + ']' + ' > ' + m_child.material_name AS VARCHAR(500)) AS path-->
<!-- FROM prod_material_bom b-->
<!-- JOIN base_material_info m_parent ON b.parent_id = m_parent.material_id-->
<!-- JOIN base_material_info m_child ON b.material_id = m_child.material_id-->
<!-- JOIN base_material_type bmt_parent ON b.parent_material_type_id = bmt_parent.matrial_type_id-->
<!-- JOIN base_material_type bmt_child ON b.material_type_id = bmt_child.matrial_type_id-->
<!-- <where>-->
<!-- b.delete_flag='0'-->
<!-- <if test="parentId != null and parentId != ''">-->
<!-- AND b.parent_id = #{parentId}-->
<!-- </if>-->
<!-- AND b.material_bom_desc LIKE '%测%'-->
<!-- </where>-->
<!-- UNION ALL-->
<!-- SELECT-->
<!-- b.parent_id,-->
<!-- b.material_id,-->
<!-- b.material_bom_version,-->
<!-- b.parent_unit_id,-->
<!-- b.active_flag,-->
<!-- b.parent_standard_amount,-->
<!-- b.material_type_id,-->
<!-- b.parent_material_type_id,-->
<!-- b.tenant_id ,-->
<!-- m_parent.material_name AS parent_material_name,-->
<!-- m_parent.material_code AS parent_material_code,-->
<!-- m_child.material_name,-->
<!-- m_child.material_code,-->
<!-- bmt_parent.matrial_type_name as parent_material_type_name,-->
<!-- bmt_child.matrial_type_name as material_type_name,-->
<!-- c.level + 1,-->
<!-- CAST(c.path + '[' + b.material_bom_version + ']' + ' > ' + m_child.material_name AS VARCHAR(500)) AS path-->
<!-- FROM BomCTE c-->
<!-- JOIN prod_material_bom b ON c.material_id = b.parent_id-->
<!-- JOIN base_material_info m_parent ON b.parent_id = m_parent.material_id-->
<!-- JOIN base_material_info m_child ON b.material_id = m_child.material_id-->
<!-- JOIN base_material_type bmt_parent ON b.parent_material_type_id = bmt_parent.matrial_type_id-->
<!-- JOIN base_material_type bmt_child ON b.material_type_id = bmt_child.matrial_type_id-->
<!-- WHERE c.level &lt; 100-->
<!-- AND b.delete_flag='0'-->
<!-- )-->
<!-- SELECT * FROM BomCTE ORDER BY level, path-->
<!-- </select>-->
<select id="selectParentMaterialBomJoin" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo"> <select id="selectParentMaterialBomJoin" parameterType="ProdMaterialBomBo" resultType="ProdMaterialBomVo">
select select
top 1 top 1
@ -51,6 +111,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pmb.parent_material_type_id, pmb.parent_material_type_id,
pmb.parent_standard_amount, pmb.parent_standard_amount,
pmb.parent_unit_id, pmb.parent_unit_id,
pmb.active_flag,
pmb.material_bom_desc,
bmt.matrial_type_name as parent_material_type_name bmt.matrial_type_name as parent_material_type_name
from base_material_info bmi from base_material_info bmi
left join prod_material_bom pmb on pmb.parent_id=bmi.material_id and pmb.material_bom_version = #{materialBomVersion} and pmb.delete_flag='0' left join prod_material_bom pmb on pmb.parent_id=bmi.material_id and pmb.material_bom_version = #{materialBomVersion} and pmb.delete_flag='0'
@ -117,4 +179,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="selectNextMaterialBomVersion" parameterType="Long" resultType="String">
SELECT RIGHT('0' + CAST(ISNULL(MAX(CAST(material_bom_version AS INT)), 0) + 1 AS VARCHAR), 2)
FROM prod_material_bom where parent_id = #{parentId}
</select>
</mapper> </mapper>

@ -5,14 +5,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="org.dromara.mes.mapper.ProdProductPlanDetailMapper"> <mapper namespace="org.dromara.mes.mapper.ProdProductPlanDetailMapper">
<select id="selectProdProductPlanDetailList" resultType="org.dromara.mes.domain.vo.ProdProductPlanDetailVo"> <select id="selectProdProductPlanDetailList" resultType="org.dromara.mes.domain.vo.ProdProductPlanDetailVo">
select SELECT
<if test="ew.getSqlSelect != null"> <if test="ew.getSqlSelect != null">
${ew.getSqlSelect} ${ew.getSqlSelect},
</if> </if>
<if test="ew.getSqlSelect == null"> t1.tooling_name,
* t2.shift_name,
</if> t3.team_name
from ${tableName} t FROM ${tableName} t
LEFT JOIN base_tooling_info t1 ON t.tooling_id = t1.tooling_id
LEFT JOIN base_shift_info t2 ON t.shift_id = t2.shift_id
LEFT JOIN base_class_team_info t3 ON t.class_team_id = t3.class_team_id
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save