diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java index 5973c4e027..1016e76529 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java @@ -56,4 +56,8 @@ public interface ErrorCodeConstants { ErrorCode RECIPE_POINT_NOT_EXISTS = new ErrorCode(1_003_000_000, "手动配置参数表(绑定配方)不存在"); ErrorCode RECIPE_DEVICE_ATTRIBUTE_NOT_EXISTS = new ErrorCode(1_003_000_000, "配方配置(关联采集设备模型-点位管理)不存在"); + ErrorCode RECIPE_CODE_DUPLICATE = new ErrorCode(1_003_000_004, "编码已存在"); + ErrorCode RECIPE_CODE_EMPTY = new ErrorCode(1_003_000_005, "配方编码不能为空"); + ErrorCode RECIPE_PLAN_DETAIL_NOT_EXISTS = new ErrorCode(1_003_000_006, "配方计划详情表(配方库)不存在"); + } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/RecipeController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/RecipeController.java index be84fbb309..5ad269f9f6 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/RecipeController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/RecipeController.java @@ -71,13 +71,21 @@ public class RecipeController { return success(BeanUtils.toBean(recipe, RecipeRespVO.class)); } - @GetMapping("/page") - @Operation(summary = "获得配方管理主分页") - @PreAuthorize("@ss.hasPermission('iot:recipe:query')") - public CommonResult> getRecipePage(@Valid RecipePageReqVO pageReqVO) { - PageResult pageResult = recipeService.getRecipePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, RecipeRespVO.class)); - } +// @GetMapping("/page") +// @Operation(summary = "获得配方管理主分页") +// @PreAuthorize("@ss.hasPermission('iot:recipe:query')") +// public CommonResult> getRecipePage(@Valid RecipePageReqVO pageReqVO) { +// PageResult pageResult = recipeService.getRecipePage(pageReqVO); +// return success(BeanUtils.toBean(pageResult, RecipeRespVO.class)); +// } +@GetMapping("/page") +@Operation(summary = "获得配方管理主分页") +@PreAuthorize("@ss.hasPermission('iot:recipe:query')") +public CommonResult> getRecipePage(@Valid RecipePageReqVO pageReqVO) { + // 直接调用实现类的方法,无类型转换 + PageResult pageResult = recipeService.getRecipePageWithDeviceId(pageReqVO); + return success(pageResult); +} @GetMapping("/export-excel") @Operation(summary = "导出配方管理主 Excel") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java index e7d1662619..80dec1c437 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java @@ -52,4 +52,8 @@ public class RecipeRespVO { // @ExcelProperty("数据单位") private String dataUnit; + @Schema(description = "关联设备ID", example = "1001") +// @ExcelProperty("关联设备ID") + private Long deviceId; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java index eaf6859330..ad41f6fc8b 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java @@ -45,12 +45,18 @@ public class RecipeDeviceAttributeController { return success(recipeDeviceAttributeService.createRecipeDeviceAttributeBatch(createReqVO)); } +// @PutMapping("/update") +// @Operation(summary = "更新配方配置(关联采集设备模型-点位管理)") +// @PreAuthorize("@ss.hasPermission('iot:recipe-device-attribute:update')") +// public CommonResult updateRecipeDeviceAttribute(@Valid @RequestBody RecipeDeviceAttributeSaveReqVO updateReqVO) { +// recipeDeviceAttributeService.updateRecipeDeviceAttribute(updateReqVO); +// return success(true); +// } @PutMapping("/update") - @Operation(summary = "更新配方配置(关联采集设备模型-点位管理)") - @PreAuthorize("@ss.hasPermission('iot:recipe-device-attribute:update')") - public CommonResult updateRecipeDeviceAttribute(@Valid @RequestBody RecipeDeviceAttributeSaveReqVO updateReqVO) { - recipeDeviceAttributeService.updateRecipeDeviceAttribute(updateReqVO); - return success(true); + @Operation(summary = "更新配方设备属性(先删后增)") + public CommonResult update(@Valid @RequestBody RecipeDeviceAttributeUpdateReqVO reqVO) { + Boolean success = recipeDeviceAttributeService.updateRecipeDeviceAttribute(reqVO); + return success(success); // 返回是否成功(和create接口返回格式一致) } @DeleteMapping("/delete") @@ -71,12 +77,19 @@ public class RecipeDeviceAttributeController { return success(BeanUtils.toBean(recipeDeviceAttribute, RecipeDeviceAttributeRespVO.class)); } +// @GetMapping("/page") +// @Operation(summary = "获得配方配置(关联采集设备模型-点位管理)分页") +// @PreAuthorize("@ss.hasPermission('iot:recipe-device-attribute:query')") +// public CommonResult> getRecipeDeviceAttributePage(@Valid RecipeDeviceAttributePageReqVO pageReqVO) { +// PageResult pageResult = recipeDeviceAttributeService.getRecipeDeviceAttributePage(pageReqVO); +// return success(BeanUtils.toBean(pageResult, RecipeDeviceAttributeRespVO.class)); +// } @GetMapping("/page") - @Operation(summary = "获得配方配置(关联采集设备模型-点位管理)分页") - @PreAuthorize("@ss.hasPermission('iot:recipe-device-attribute:query')") - public CommonResult> getRecipeDeviceAttributePage(@Valid RecipeDeviceAttributePageReqVO pageReqVO) { - PageResult pageResult = recipeDeviceAttributeService.getRecipeDeviceAttributePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, RecipeDeviceAttributeRespVO.class)); + @Operation(summary = "分页查询配方配置") + public CommonResult> page(RecipeDeviceAttributePageReqVO reqVO) { + // 替换为关联查询方法 + PageResult pageResult = recipeDeviceAttributeService.selectPageWithAttribute(reqVO); + return success(pageResult); } @GetMapping("/export-excel") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributePageRespDTO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributePageRespDTO.java new file mode 100644 index 0000000000..010f1c73b7 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributePageRespDTO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo; + +import lombok.Data; + +/** + * 配方设备属性分页返回DTO + * + * @author 自定义作者名 + */ +@Data +public class RecipeDeviceAttributePageRespDTO { + + /** + * 主键ID + */ + private Long id; + + + private Long attributeId; + + /** + * 属性名称 + */ + private String attributeName; + + /** + * 属性类型 + */ + private String attributeType; + + /** + * 数据类型 + */ + private String dataType; + + /** + * 数据单位 + */ + private String dataUnit; + + + + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeRespVO.java index e427ad223e..d32851777e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeRespVO.java @@ -44,4 +44,34 @@ public class RecipeDeviceAttributeRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; -} \ No newline at end of file +} +// +//@Data +//@ExcelIgnoreUnannotated +//public class RecipeDeviceAttributeRespVO { +// // 1. 来自iot_recipe_device_attribute表的主键 +// @Schema(description = "配方配置ID", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("配方配置ID") +// private Long id; +// +// // 2. 来自iot_device_attribute表的关联字段(核心展示字段) +// @Schema(description = "设备属性ID", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("配方配置ID") +// private Long attributeId; // 关联iot_device_attribute.id +// +// @Schema(description = "属性名称", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("属性名称") +// private String attributeName; // 关联iot_device_attribute.attribute_name +// +// @Schema(description = "属性类型", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("属性类型") +// private String attributeType; // 关联iot_device_attribute.attribute_type +// +// @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("数据类型") +// private String dataType; // 关联iot_device_attribute.data_type +// +// @Schema(description = "数据单位", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("数据单位") +// private String dataUnit; // 关联iot_device_attribute.data_unit +//} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeUpdateReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeUpdateReqVO.java new file mode 100644 index 0000000000..b8213aa90c --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/vo/RecipeDeviceAttributeUpdateReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo; + +import lombok.Data; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 配方设备属性更新VO(先删后增) + * + * @author 内蒙必硕 + */ +@Data +public class RecipeDeviceAttributeUpdateReqVO { + + /** 配方ID(必传) */ + @NotNull(message = "配方ID不能为空") + private Long recipeId; + + /** 要关联的attribute_id集合(允许为空,为空则仅删除) */ + private List ids; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java new file mode 100644 index 0000000000..3a9cf8beec --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; +import cn.iocoder.yudao.module.iot.service.recipeplandetail.RecipePlanDetailService; + +@Tag(name = "管理后台 - 配方计划详情表(配方库)") +@RestController +@RequestMapping("/iot/recipe-plan-detail") +@Validated +public class RecipePlanDetailController { + + @Resource + private RecipePlanDetailService recipePlanDetailService; + + @PostMapping("/create") + @Operation(summary = "创建配方计划详情表(配方库)") + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:create')") + public CommonResult createRecipePlanDetail(@Valid @RequestBody RecipePlanDetailSaveReqVO createReqVO) { + return success(recipePlanDetailService.createRecipePlanDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新配方计划详情表(配方库)") + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:update')") + public CommonResult updateRecipePlanDetail(@Valid @RequestBody RecipePlanDetailSaveReqVO updateReqVO) { + recipePlanDetailService.updateRecipePlanDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除配方计划详情表(配方库)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:delete')") + public CommonResult deleteRecipePlanDetail(@RequestParam("id") Long id) { + recipePlanDetailService.deleteRecipePlanDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得配方计划详情表(配方库)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:query')") + public CommonResult getRecipePlanDetail(@RequestParam("id") Long id) { + RecipePlanDetailDO recipePlanDetail = recipePlanDetailService.getRecipePlanDetail(id); + return success(BeanUtils.toBean(recipePlanDetail, RecipePlanDetailRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得配方计划详情表(配方库)分页") + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:query')") + public CommonResult> getRecipePlanDetailPage(@Valid RecipePlanDetailPageReqVO pageReqVO) { + PageResult pageResult = recipePlanDetailService.getRecipePlanDetailPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RecipePlanDetailRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出配方计划详情表(配方库) Excel") + @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportRecipePlanDetailExcel(@Valid RecipePlanDetailPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = recipePlanDetailService.getRecipePlanDetailPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "配方计划详情表(配方库).xls", "数据", RecipePlanDetailRespVO.class, + BeanUtils.toBean(list, RecipePlanDetailRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageReqVO.java new file mode 100644 index 0000000000..be02b2911d --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 配方计划详情表(配方库)分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RecipePlanDetailPageReqVO extends PageParam { + + @Schema(description = "编码(新建时输入)") + private String code; + + @Schema(description = "名称(新建时输入)", example = "李四") + private String name; + + @Schema(description = "关联配方(关联iot_recipe表的id)", example = "2489") + private Long recipeId; + + @Schema(description = "关联计划(关联mes_plan表的id)", example = "28398") + private Long planId; + + @Schema(description = "来源(新增/生产中)") + private String source; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java new file mode 100644 index 0000000000..20f7f315a5 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import com.alibaba.excel.annotation.ExcelProperty; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 配方计划详情表(配方库) Response VO") +@Data +public class RecipePlanDetailRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19016") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "编码(新建时输入)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("编码(新建时输入)") + private String code; + + @Schema(description = "名称(新建时输入)", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("名称(新建时输入)") + private String name; + + @Schema(description = "关联配方ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2489") + @ExcelProperty("关联配方ID") + private Long recipeId; + + @Schema(description = "配方名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("配方名称") + private String recipeName; // 新增关联字段 + + @Schema(description = "关联计划ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28398") + @ExcelProperty("关联计划ID") + private Long planId; + + @Schema(description = "计划编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("计划编码") + private String planCode; // 新增关联字段 + + @Schema(description = "来源(新增/生产中)") + @ExcelProperty("来源(新增/生产中)") + private String source; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java new file mode 100644 index 0000000000..fca5e3de42 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 配方计划详情表(配方库)新增/修改 Request VO") +@Data +public class RecipePlanDetailSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19016") + private Long id; + + @Schema(description = "编码(新建时输入)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "编码(新建时输入)不能为空") + private String code; + + @Schema(description = "名称(新建时输入)", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotEmpty(message = "名称(新建时输入)不能为空") + private String name; + + @Schema(description = "关联配方(关联iot_recipe表的id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2489") + @NotNull(message = "关联配方(关联iot_recipe表的id)不能为空") + private Long recipeId; + + @Schema(description = "关联计划(关联mes_plan表的id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "28398") + @NotNull(message = "关联计划(关联mes_plan表的id)不能为空") + private Long planId; + + @Schema(description = "来源(新增/生产中)") + private String source; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedeviceattribute/RecipeDeviceAttributeDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedeviceattribute/RecipeDeviceAttributeDO.java index dd0f3af07e..b861415655 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedeviceattribute/RecipeDeviceAttributeDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedeviceattribute/RecipeDeviceAttributeDO.java @@ -52,4 +52,5 @@ public class RecipeDeviceAttributeDO extends BaseDO { */ private String dataUnit; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java new file mode 100644 index 0000000000..fd9f279241 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 配方计划详情表(配方库) DO + * + * @author 内蒙必硕 + */ +@TableName("iot_recipe_plan_detail") +@KeySequence("iot_recipe_plan_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RecipePlanDetailDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 编码(新建时输入) + */ + private String code; + /** + * 名称(新建时输入) + */ + private String name; + /** + * 关联配方(关联iot_recipe表的id) + */ + private Long recipeId; + /** + * 关联计划(关联mes_plan表的id) + */ + private Long planId; + /** + * 来源(新增/生产中) + */ + private String source; + /** + * 是否启用 + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java new file mode 100644 index 0000000000..c3ccd3bc96 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail; + +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 包含关联信息的配方计划详情DO + */ +@Data +public class RecipePlanDetailWithRelationsDO { + private Long id; + private String code; + private String name; + private Long recipeId; + private String recipeName; // 来自iot_recipe表 + private Long planId; + private String planCode; // 来自mes_plan表 + private String source; + private Boolean isEnable; + private LocalDateTime createTime; +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java index 6aa3f816a5..c25d80108b 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java @@ -1,13 +1,53 @@ -package cn.iocoder.yudao.module.iot.dal.mysql.recipedeviceattribute; +//package cn.iocoder.yudao.module.iot.dal.mysql.recipedeviceattribute; +// +//import java.util.*; +// +//import cn.iocoder.yudao.framework.common.pojo.PageResult; +//import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +//import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +//import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; +//import org.apache.ibatis.annotations.Mapper; +//import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; +// +///** +// * 配方配置(关联采集设备模型-点位管理) Mapper +// * +// * @author 内蒙必硕 +// */ +//@Mapper +//public interface RecipeDeviceAttributeMapper extends BaseMapperX { +// +// default PageResult selectPage(RecipeDeviceAttributePageReqVO reqVO) { +// return selectPage(reqVO, new LambdaQueryWrapperX() +// .eqIfPresent(RecipeDeviceAttributeDO::getRecipeId, reqVO.getRecipeId()) +// .eqIfPresent(RecipeDeviceAttributeDO::getAttributeId, reqVO.getAttributeId()) +// .likeIfPresent(RecipeDeviceAttributeDO::getAttributeName, reqVO.getAttributeName()) +// .eqIfPresent(RecipeDeviceAttributeDO::getAttributeType, reqVO.getAttributeType()) +// .eqIfPresent(RecipeDeviceAttributeDO::getDataType, reqVO.getDataType()) +// .eqIfPresent(RecipeDeviceAttributeDO::getDataUnit, reqVO.getDataUnit()) +// .betweenIfPresent(RecipeDeviceAttributeDO::getCreateTime, reqVO.getCreateTime()) +// .orderByDesc(RecipeDeviceAttributeDO::getId)); +// } +// +// +// +//} -import java.util.*; +package cn.iocoder.yudao.module.iot.dal.mysql.recipedeviceattribute; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; +import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.RecipeDeviceAttributePageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.RecipeDeviceAttributePageRespDTO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * 配方配置(关联采集设备模型-点位管理) Mapper @@ -17,6 +57,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; @Mapper public interface RecipeDeviceAttributeMapper extends BaseMapperX { + // 原有分页方法(保留) default PageResult selectPage(RecipeDeviceAttributePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(RecipeDeviceAttributeDO::getRecipeId, reqVO.getRecipeId()) @@ -29,4 +70,32 @@ public interface RecipeDeviceAttributeMapper extends BaseMapperX", + "SELECT rda.id, rda.attribute_id, dcm.attribute_name, dcm.attribute_type, dcm.data_type, dcm.data_unit", + "FROM iot_recipe_device_attribute rda", + "LEFT JOIN iot_device_contact_model dcm ON rda.attribute_id = dcm.id", + "WHERE 1=1", + " AND rda.deleted = 0", + "", + " AND rda.recipe_id = #{reqVO.recipeId}", + "", + "", + " AND dcm.attribute_name LIKE CONCAT('%', #{reqVO.attributeName}, '%')", + "", + "ORDER BY rda.id DESC", + "" + }) + List selectPageWithAttribute( + Page page, // 分页参数(由插件自动填充) + @Param("reqVO") RecipeDeviceAttributePageReqVO reqVO); + + // 封装成芋道的PageResult(默认方法,复用框架逻辑) + default PageResult selectPageWithAttributeWrap(RecipeDeviceAttributePageReqVO reqVO) { + Page page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); + List list = selectPageWithAttribute(page, reqVO); + return new PageResult<>(list, page.getTotal()); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java new file mode 100644 index 0000000000..32ca893138 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.iot.dal.mysql.recipeplandetail; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; + +/** + * 配方计划详情表(配方库) Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface RecipePlanDetailMapper extends BaseMapperX { + + default PageResult selectPage(RecipePlanDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RecipePlanDetailDO::getCode, reqVO.getCode()) + .likeIfPresent(RecipePlanDetailDO::getName, reqVO.getName()) + .eqIfPresent(RecipePlanDetailDO::getRecipeId, reqVO.getRecipeId()) + .eqIfPresent(RecipePlanDetailDO::getPlanId, reqVO.getPlanId()) + .eqIfPresent(RecipePlanDetailDO::getSource, reqVO.getSource()) + .eqIfPresent(RecipePlanDetailDO::getIsEnable, reqVO.getIsEnable()) + .betweenIfPresent(RecipePlanDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RecipePlanDetailDO::getId)); + } + + // 新增关联查询分页方法 +// PageResult selectPageWithRelations(@Param("req") RecipePlanDetailPageReqVO reqVO); + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeService.java index 892f1fc80a..e4aab6ea9d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeService.java @@ -52,4 +52,21 @@ public interface RecipeService { */ PageResult getRecipePage(RecipePageReqVO pageReqVO); + // ========== 新增:声明带deviceId的方法 ========== + /** + * 获得配方管理主分页(包含deviceId字段) + * + * @param pageReqVO 分页查询 + * @return 配方管理主分页(含deviceId) + */ + PageResult getRecipePageWithDeviceId(RecipePageReqVO pageReqVO); + + /** + * 获得单个配方管理主(包含deviceId字段) + * + * @param id 编号 + * @return 配方管理主(含deviceId) + */ + RecipeRespVO getRecipeWithDeviceId(Long id); + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeServiceImpl.java index 6a4733a301..3cf1757593 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipe/RecipeServiceImpl.java @@ -1,21 +1,129 @@ +//package cn.iocoder.yudao.module.iot.service.recipe; +// +//import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants; +//import org.springframework.stereotype.Service; +//import javax.annotation.Resource; +//import org.springframework.validation.annotation.Validated; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.util.*; +//import cn.iocoder.yudao.module.iot.controller.admin.recipe.vo.*; +//import cn.iocoder.yudao.module.iot.dal.dataobject.recipe.RecipeDO; +//import cn.iocoder.yudao.framework.common.pojo.PageResult; +//import cn.iocoder.yudao.framework.common.pojo.PageParam; +//import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +// +//import cn.iocoder.yudao.module.iot.dal.mysql.recipe.RecipeMapper; +//import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +// +//import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +//import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; +// +//import cn.iocoder.yudao.framework.common.exception.ServiceException; +//import cn.hutool.core.util.StrUtil; +//import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +//import cn.iocoder.yudao.framework.common.exception.ServiceException; +// +//import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; // 引入现有DeviceDO +//import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; // 引入现有DeviceMapper +// +///** +// * 配方管理主 Service 实现类 +// * +// * @author 内蒙必硕 +// */ +//@Service +//@Validated +//public class RecipeServiceImpl implements RecipeService { +// +// @Resource +// private RecipeMapper recipeMapper; +// +//// @Override +//// public Long createRecipe(RecipeSaveReqVO createReqVO) { +//// // 插入 +//// RecipeDO recipe = BeanUtils.toBean(createReqVO, RecipeDO.class); +//// recipeMapper.insert(recipe); +//// // 返回 +//// return recipe.getId(); +//// } +//@Override +//public Long createRecipe(RecipeSaveReqVO createReqVO) { +// String recipeCode = createReqVO.getRecipeCode(); +// +// // 1. 校验recipeCode不为空(使用新增的RECIPE_CODE_EMPTY错误码) +// if (StrUtil.isBlank(recipeCode)) { +// throw new ServiceException(ErrorCodeConstants.RECIPE_CODE_EMPTY); +// } +// +// // 2. 校验recipeCode是否重复(使用新增的RECIPE_CODE_DUPLICATE错误码) +// boolean exists = recipeMapper.exists( +// new LambdaQueryWrapperX().eq(RecipeDO::getRecipeCode, recipeCode) +// ); +// if (exists) { +// throw new ServiceException(ErrorCodeConstants.RECIPE_CODE_DUPLICATE); +// } +// +// // ========== 原有逻辑保持不变 ========== +// RecipeDO recipe = BeanUtils.toBean(createReqVO, RecipeDO.class); +// recipeMapper.insert(recipe); +// return recipe.getId(); +//} +// +// @Override +// public void updateRecipe(RecipeSaveReqVO updateReqVO) { +// // 校验存在 +// validateRecipeExists(updateReqVO.getId()); +// // 更新 +// RecipeDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDO.class); +// recipeMapper.updateById(updateObj); +// } +// +// @Override +// public void deleteRecipe(Long id) { +// // 校验存在 +// validateRecipeExists(id); +// // 删除 +// recipeMapper.deleteById(id); +// } +// +// private void validateRecipeExists(Long id) { +// if (recipeMapper.selectById(id) == null) { +// throw exception(RECIPE_NOT_EXISTS); +// } +// } +// +// @Override +// public RecipeDO getRecipe(Long id) { +// return recipeMapper.selectById(id); +// } +// +//} package cn.iocoder.yudao.module.iot.service.recipe; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import cn.iocoder.yudao.module.iot.controller.admin.recipe.vo.*; +import cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.iot.controller.admin.recipe.vo.RecipePageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.recipe.vo.RecipeRespVO; +import cn.iocoder.yudao.module.iot.controller.admin.recipe.vo.RecipeSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.recipe.RecipeDO; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.recipe.RecipeMapper; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hutool.core.util.StrUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; -import cn.iocoder.yudao.module.iot.dal.mysql.recipe.RecipeMapper; +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.RECIPE_NOT_EXISTS; /** * 配方管理主 Service 实现类 @@ -28,30 +136,37 @@ public class RecipeServiceImpl implements RecipeService { @Resource private RecipeMapper recipeMapper; + @Resource + private DeviceMapper deviceMapper; // 注入现有DeviceMapper + // ========== 原有方法保持不变 ========== @Override public Long createRecipe(RecipeSaveReqVO createReqVO) { - // 插入 + String recipeCode = createReqVO.getRecipeCode(); + if (StrUtil.isBlank(recipeCode)) { + throw new ServiceException(ErrorCodeConstants.RECIPE_CODE_EMPTY); + } + boolean exists = recipeMapper.exists( + new LambdaQueryWrapperX().eq(RecipeDO::getRecipeCode, recipeCode) + ); + if (exists) { + throw new ServiceException(ErrorCodeConstants.RECIPE_CODE_DUPLICATE); + } RecipeDO recipe = BeanUtils.toBean(createReqVO, RecipeDO.class); recipeMapper.insert(recipe); - // 返回 return recipe.getId(); } @Override public void updateRecipe(RecipeSaveReqVO updateReqVO) { - // 校验存在 validateRecipeExists(updateReqVO.getId()); - // 更新 RecipeDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDO.class); recipeMapper.updateById(updateObj); } @Override public void deleteRecipe(Long id) { - // 校验存在 validateRecipeExists(id); - // 删除 recipeMapper.deleteById(id); } @@ -71,4 +186,65 @@ public class RecipeServiceImpl implements RecipeService { return recipeMapper.selectPage(pageReqVO); } + // ========== 新增带deviceId的方法(改为public,供Controller直接调用) ========== + /** + * 分页查询配方,包含deviceId字段 + */ + public PageResult getRecipePageWithDeviceId(RecipePageReqVO pageReqVO) { + // 1. 查询配方分页数据 + PageResult recipePage = recipeMapper.selectPage(pageReqVO); + List recipeList = recipePage.getList(); + if (recipeList.isEmpty()) { + return PageResult.empty(recipePage.getTotal()); + } + + // 2. 提取所有machineName,批量查询deviceId(避免N+1查询) + List machineNames = recipeList.stream() + .map(RecipeDO::getMachineName) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + // 调用现有DeviceMapper查询设备名称->ID映射 + List deviceList = deviceMapper.selectList( + new LambdaQueryWrapperX().in(DeviceDO::getDeviceName, machineNames) + ); + // 构建设备名称到ID的映射(处理重复名称,取第一个) + Map deviceName2IdMap = new HashMap<>(); + for (DeviceDO device : deviceList) { + deviceName2IdMap.putIfAbsent(device.getDeviceName(), device.getId()); + } + + // 3. 转换为VO并设置deviceId + List respVOList = new ArrayList<>(); + for (RecipeDO recipe : recipeList) { + RecipeRespVO respVO = BeanUtils.toBean(recipe, RecipeRespVO.class); + // 根据machineName关联设置deviceId + respVO.setDeviceId(deviceName2IdMap.get(recipe.getMachineName())); + respVOList.add(respVO); + } + + return new PageResult<>(respVOList, recipePage.getTotal()); + } + + /** + * 查询单个配方,包含deviceId字段 + */ + public RecipeRespVO getRecipeWithDeviceId(Long id) { + RecipeDO recipe = getRecipe(id); + if (recipe == null) { + return null; + } + RecipeRespVO respVO = BeanUtils.toBean(recipe, RecipeRespVO.class); + // 关联查询deviceId + if (recipe.getMachineName() != null) { + DeviceDO device = deviceMapper.selectOne( + new LambdaQueryWrapperX().eq(DeviceDO::getDeviceName, recipe.getMachineName()) + ); + if (device != null) { + respVO.setDeviceId(device.getId()); + } + } + return respVO; + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java index e6d541dbcd..5be305d89f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java @@ -27,7 +27,7 @@ public interface RecipeDeviceAttributeService { * * @param updateReqVO 更新信息 */ - void updateRecipeDeviceAttribute(@Valid RecipeDeviceAttributeSaveReqVO updateReqVO); +// void updateRecipeDeviceAttribute(@Valid RecipeDeviceAttributeSaveReqVO updateReqVO); /** * 删除配方配置(关联采集设备模型-点位管理) @@ -54,4 +54,11 @@ public interface RecipeDeviceAttributeService { Boolean createRecipeDeviceAttributeBatch(RecipeDeviceAttributeSaveReqVO createReqVO); + PageResult selectPageWithAttribute(RecipeDeviceAttributePageReqVO reqVO); + Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqVO); + + + + + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java index a6ce0dc952..60d4d1fee3 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java @@ -24,6 +24,12 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; // 或芋道的Col import java.util.List; import java.util.stream.Collectors; + +import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.RecipeDeviceAttributePageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.RecipeDeviceAttributePageRespDTO; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + //import cn.iocoder.yudao.framework.common.util.bean.BeanUtils; // 确保BeanUtils的导入正确 /** @@ -74,15 +80,47 @@ public class RecipeDeviceAttributeServiceImpl implements RecipeDeviceAttributeSe return insertSuccess; } - @Override - public void updateRecipeDeviceAttribute(RecipeDeviceAttributeSaveReqVO updateReqVO) { - // 校验存在 - validateRecipeDeviceAttributeExists(updateReqVO.getId()); - // 更新 - RecipeDeviceAttributeDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDeviceAttributeDO.class); - recipeDeviceAttributeMapper.updateById(updateObj); +// @Override +// public void updateRecipeDeviceAttribute(RecipeDeviceAttributeSaveReqVO updateReqVO) { +// // 校验存在 +// validateRecipeDeviceAttributeExists(updateReqVO.getId()); +// // 更新 +// RecipeDeviceAttributeDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDeviceAttributeDO.class); +// recipeDeviceAttributeMapper.updateById(updateObj); +// } +@Override +@Transactional(rollbackFor = Exception.class) // 事务保证原子性 +public Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqVO) { + // 1. 非空校验:recipeId不能为空(和create保持一致的校验风格) + if (reqVO.getRecipeId() == null) { + throw new IllegalArgumentException("更新失败:配方ID(recipeId)不能为空"); } + // 步骤1:删除该recipeId下的所有旧记录 + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(RecipeDeviceAttributeDO::getRecipeId, reqVO.getRecipeId()); + recipeDeviceAttributeMapper.delete(deleteWrapper); + + // 步骤2:如果ids不为空,批量创建新记录(复用create的Bean拷贝+流式处理风格) + Boolean insertSuccess = true; // 默认成功(无ids时直接返回成功) + if (!CollectionUtils.isEmpty(reqVO.getIds())) { + List attributeList = reqVO.getIds().stream() + .map(attributeId -> { + // 复用create的Bean拷贝逻辑,保持代码风格一致 + RecipeDeviceAttributeDO attributeDO = BeanUtils.toBean(reqVO, RecipeDeviceAttributeDO.class); + attributeDO.setAttributeId(attributeId); + return attributeDO; + }) + .collect(Collectors.toList()); + + // 复用create的批量插入逻辑,返回插入结果 + insertSuccess = recipeDeviceAttributeMapper.insertBatch(attributeList); + } + + // 返回最终结果(删除必成功,插入结果决定最终返回值) + return insertSuccess; +} + @Override public void deleteRecipeDeviceAttribute(Long id) { // 校验存在 @@ -107,4 +145,9 @@ public class RecipeDeviceAttributeServiceImpl implements RecipeDeviceAttributeSe return recipeDeviceAttributeMapper.selectPage(pageReqVO); } + @Override + public PageResult selectPageWithAttribute(RecipeDeviceAttributePageReqVO reqVO) { + return recipeDeviceAttributeMapper.selectPageWithAttributeWrap(reqVO); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java new file mode 100644 index 0000000000..428989f463 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.iot.service.recipeplandetail; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 配方计划详情表(配方库) Service 接口 + * + * @author 内蒙必硕 + */ +public interface RecipePlanDetailService { + + /** + * 创建配方计划详情表(配方库) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRecipePlanDetail(@Valid RecipePlanDetailSaveReqVO createReqVO); + + /** + * 更新配方计划详情表(配方库) + * + * @param updateReqVO 更新信息 + */ + void updateRecipePlanDetail(@Valid RecipePlanDetailSaveReqVO updateReqVO); + + /** + * 删除配方计划详情表(配方库) + * + * @param id 编号 + */ + void deleteRecipePlanDetail(Long id); + + /** + * 获得配方计划详情表(配方库) + * + * @param id 编号 + * @return 配方计划详情表(配方库) + */ + RecipePlanDetailDO getRecipePlanDetail(Long id); + + /** + * 获得配方计划详情表(配方库)分页 + * + * @param pageReqVO 分页查询 + * @return 配方计划详情表(配方库)分页 + */ + PageResult getRecipePlanDetailPage(RecipePlanDetailPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java new file mode 100644 index 0000000000..91cdd70aac --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.iot.service.recipeplandetail; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.iot.dal.mysql.recipeplandetail.RecipePlanDetailMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; + +/** + * 配方计划详情表(配方库) Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class RecipePlanDetailServiceImpl implements RecipePlanDetailService { + + @Resource + private RecipePlanDetailMapper recipePlanDetailMapper; + + @Override + public Long createRecipePlanDetail(RecipePlanDetailSaveReqVO createReqVO) { + // 插入 + RecipePlanDetailDO recipePlanDetail = BeanUtils.toBean(createReqVO, RecipePlanDetailDO.class); + recipePlanDetailMapper.insert(recipePlanDetail); + // 返回 + return recipePlanDetail.getId(); + } + + @Override + public void updateRecipePlanDetail(RecipePlanDetailSaveReqVO updateReqVO) { + // 校验存在 + validateRecipePlanDetailExists(updateReqVO.getId()); + // 更新 + RecipePlanDetailDO updateObj = BeanUtils.toBean(updateReqVO, RecipePlanDetailDO.class); + recipePlanDetailMapper.updateById(updateObj); + } + + @Override + public void deleteRecipePlanDetail(Long id) { + // 校验存在 + validateRecipePlanDetailExists(id); + // 删除 + recipePlanDetailMapper.deleteById(id); + } + + private void validateRecipePlanDetailExists(Long id) { + if (recipePlanDetailMapper.selectById(id) == null) { + throw exception(RECIPE_PLAN_DETAIL_NOT_EXISTS); + } + } + + @Override + public RecipePlanDetailDO getRecipePlanDetail(Long id) { + return recipePlanDetailMapper.selectById(id); + } + + @Override + public PageResult getRecipePlanDetailPage(RecipePlanDetailPageReqVO pageReqVO) { + return recipePlanDetailMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipeplandetail/RecipePlanDetailMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipeplandetail/RecipePlanDetailMapper.xml new file mode 100644 index 0000000000..85f78f994e --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipeplandetail/RecipePlanDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index e658d517ca..28998b31b3 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -99,5 +99,8 @@ public interface ErrorCodeConstants { ErrorCode DEVICE_LEDGER_EXISTS = new ErrorCode(1002000010, "设备台账编码已存在"); ErrorCode SUBJECT_EXISTS = new ErrorCode(1002000010, "项目编码已存在"); ErrorCode TASK_MANAGEMENT_NOT_EXISTS = new ErrorCode(1002000011, "设备类型不存在"); + ErrorCode TICKET_MANAGEMENT_NOT_EXISTS = new ErrorCode(1002000012, "工单管理不存在"); + ErrorCode TICKET_RESULTS_NOT_EXISTS = new ErrorCode(1002000013, "工单检验结果不存在"); + ErrorCode TICKET_RESULTS_ID_NOT_NULL = new ErrorCode(1002000014, "工单检验结果Id不存在"); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java index 111c8ca3f5..ce4449765c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java @@ -1,5 +1,9 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger; +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.utils.ResumeNameUtils; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.alibaba.excel.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -8,7 +12,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; -import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; import java.util.*; @@ -39,6 +42,9 @@ public class DeviceLedgerController { @Resource private DeviceLedgerService deviceLedgerService; + @Resource + private AdminUserApi adminUserApi; + @PostMapping("/create") @Operation(summary = "创建设备台账") @PreAuthorize("@ss.hasPermission('mes:device-ledger:create')") @@ -82,11 +88,12 @@ public class DeviceLedgerController { @GetMapping("/page") @Operation(summary = "获得设备台账分页") @PreAuthorize("@ss.hasPermission('mes:device-ledger:query')") - public CommonResult> getDeviceLedgerPage(@Valid DeviceLedgerPageReqVO pageReqVO) { + public CommonResult> getDeviceLedgerPage(@Valid DeviceLedgerPageReqVO pageReqVO) { PageResult pageResult = deviceLedgerService.getDeviceLedgerPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DeviceLedgerRespVO.class)); + return success(ResumeNameUtils.buildPageCreatorName(BeanUtils.toBean(pageResult, DeviceLedgerRespVO.class))); } + @GetMapping("/export-excel") @Operation(summary = "导出设备台账 Excel") @PreAuthorize("@ss.hasPermission('mes:device-ledger:export')") @@ -95,9 +102,15 @@ public class DeviceLedgerController { HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = deviceLedgerService.getDeviceLedgerPage(pageReqVO).getList(); + List deviceLedgerRespVOS = BeanUtils.toBean(list, DeviceLedgerRespVO.class); + + ResumeNameUtils.fillUserInfoForExport(deviceLedgerRespVOS); + // 导出 Excel - ExcelUtils.write(response, "设备台账.xls", "数据", DeviceLedgerRespVO.class, - BeanUtils.toBean(list, DeviceLedgerRespVO.class)); + ExcelUtils.write(response, "设备台账.xls", "数据", DeviceLedgerRespVO.class,deviceLedgerRespVOS); } + + + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/enums/DeviceLedgerStatusEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/enums/DeviceLedgerStatusEnum.java new file mode 100644 index 0000000000..7e3502cf24 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/enums/DeviceLedgerStatusEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +@Getter +@AllArgsConstructor +public enum DeviceLedgerStatusEnum { + NORMAL(0, "正常"), + DISABLED(1, "停用"), + MAINTENANCE(2, "维修"), + SCRAP(3, "报废"); + + private final Integer code; + private final String description; + + public static DeviceLedgerStatusEnum getByCode(Integer code) { + for (DeviceLedgerStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/utils/ResumeNameUtils.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/utils/ResumeNameUtils.java new file mode 100644 index 0000000000..ab5d160784 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/utils/ResumeNameUtils.java @@ -0,0 +1,297 @@ +package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.utils; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 用户名称解析工具类 + * + * @author 你的名字 + */ +@Slf4j +@Component +public class ResumeNameUtils { + + private static AdminUserApi adminUserApi = null; + + public ResumeNameUtils(AdminUserApi adminUserApi) { + ResumeNameUtils.adminUserApi = adminUserApi; + } + + + /** + * 为分页结果填充用户名称信息 + * + * @param pageResult 分页结果 + * @return 填充后的分页结果 + */ + public static PageResult buildPageCreatorName(PageResult pageResult) { + if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { + return pageResult; + } + + // 假设你的VO类有特定的方法,这里需要根据实际VO类调整 + // 这里使用泛型,你需要根据实际情况调整 + List voList = pageResult.getList(); + + // 如果是DeviceLedgerRespVO类型 + if (!voList.isEmpty() && voList.get(0) instanceof DeviceLedgerRespVO) { + List convertedList = voList.stream() + .map(vo -> (DeviceLedgerRespVO) vo) + .collect(Collectors.toList()); + + fillUserInfo(convertedList); + + // 返回新的PageResult + return new PageResult<>(convertedList, pageResult.getTotal()); + } + + // 可以添加其他类型的处理 + return pageResult; + } + + /** + * 为导出方法填充用户信息 + * + * @param voList 设备台账VO列表 + */ + public static void fillUserInfoForExport(List voList) { + fillUserInfo(voList); + } + + /** + * 通用方法:填充用户信息 + * + * @param voList 设备台账VO列表 + */ + public static void fillUserInfo(List voList) { + if (voList == null || voList.isEmpty()) { + return; + } + + // 1. 收集所有需要查询的用户ID + Set userIds = collectUserIds(voList); + + if (userIds.isEmpty()) { + return; + } + + // 2. 批量查询用户信息 + Map userMap = batchGetUsers(userIds); + + // 3. 填充用户名称 + fillUserNames(voList, userMap); + } + + /** + * 收集所有用户ID + */ + private static Set collectUserIds(List voList) { + Set userIds = new HashSet<>(); + + for (DeviceLedgerRespVO vo : voList) { + // 收集创建者ID + if (StringUtils.isNotBlank(vo.getCreator())) { + try { + userIds.add(Long.valueOf(vo.getCreator())); + } catch (NumberFormatException e) { + log.warn("创建者ID格式错误: {}", vo.getCreator()); + } + } + + // 收集设备管理员ID + if (StringUtils.isNotBlank(vo.getDeviceManager())) { + collectManagerIds(vo.getDeviceManager(), userIds); + } + + // 如果需要,可以收集其他用户ID字段 + // collectOtherUserIds(vo, userIds); + } + + return userIds; + } + + /** + * 收集设备管理员ID + */ + private static void collectManagerIds(String deviceManager, Set userIds) { + if (StringUtils.isBlank(deviceManager)) { + return; + } + + try { + Arrays.stream(deviceManager.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .forEach(userIds::add); + } catch (NumberFormatException e) { + log.warn("设备管理员ID格式错误: {}", deviceManager); + } + } + + /** + * 批量查询用户信息 + */ + private static Map batchGetUsers(Set userIds) { + if (userIds.isEmpty()) { + return Collections.emptyMap(); + } + + try { + // 如果adminUserApi支持批量查询 + // return adminUserApi.getUserList(userIds).stream() + // .collect(Collectors.toMap(AdminUserRespDTO::getId, Function.identity())); + + // 如果不支持批量查询,则逐个查询 + Map userMap = new HashMap<>(); + for (Long userId : userIds) { + try { + AdminUserRespDTO user = adminUserApi.getUser(userId); + if (user != null) { + userMap.put(userId, user); + } + } catch (Exception e) { + log.error("查询用户信息失败,用户ID: {}", userId, e); + } + } + return userMap; + } catch (Exception e) { + log.error("批量查询用户信息失败", e); + return Collections.emptyMap(); + } + } + + /** + * 填充用户名称 + */ + private static void fillUserNames(List voList, Map userMap) { + for (DeviceLedgerRespVO vo : voList) { + // 填充创建者名称 + fillCreatorName(vo, userMap); + + // 填充设备管理员名称 + fillDeviceManagerName(vo, userMap); + + // 填充其他用户名称 + // fillOtherUserNames(vo, userMap); + } + } + + /** + * 填充创建者名称 + */ + private static void fillCreatorName(DeviceLedgerRespVO vo, Map userMap) { + if (StringUtils.isBlank(vo.getCreator())) { + return; + } + + try { + Long creatorId = Long.valueOf(vo.getCreator()); + AdminUserRespDTO creator = userMap.get(creatorId); + if (creator != null) { + vo.setCreatorName(formatUserName(creator)); + } else { + vo.setCreatorName("未知(" + creatorId + ")"); + } + } catch (NumberFormatException e) { + vo.setCreatorName("ID格式错误"); + } + } + + /** + * 填充设备管理员名称 + */ + private static void fillDeviceManagerName(DeviceLedgerRespVO vo, Map userMap) { + if (StringUtils.isBlank(vo.getDeviceManager())) { + return; + } + + try { + String[] managerIdStrs = vo.getDeviceManager().split(","); + List managerNames = new ArrayList<>(); + + for (String managerIdStr : managerIdStrs) { + managerIdStr = managerIdStr.trim(); + if (StringUtils.isBlank(managerIdStr)) { + continue; + } + + try { + Long managerId = Long.valueOf(managerIdStr); + AdminUserRespDTO manager = userMap.get(managerId); + if (manager != null) { + managerNames.add(formatUserName(manager)); + } else { + managerNames.add("未知(" + managerId + ")"); + } + } catch (NumberFormatException e) { + managerNames.add("格式错误"); + } + } + + vo.setDeviceManagerName(String.join(",", managerNames)); + } catch (Exception e) { + log.warn("填充设备管理员名称失败: {}", vo.getDeviceManager(), e); + vo.setDeviceManagerName("解析错误"); + } + } + + /** + * 格式化用户显示名称 + */ + public static String formatUserName(AdminUserRespDTO user) { + if (user == null) { + return ""; + } + + String username = user.getUsername() != null ? user.getUsername() : ""; + String nickname = user.getNickname() != null ? user.getNickname() : ""; + + return "(" + username + ")" + nickname; + } + + /** + * 简易版格式化用户名称 + */ + public String formatUserNameSimple(AdminUserRespDTO user) { + if (user == null) { + return ""; + } + return user.getNickname() != null ? user.getNickname() : user.getUsername(); + } + + /** + * 静态工具方法:解析逗号分隔的ID字符串 + */ + public static List parseIds(String ids) { + if (StringUtils.isBlank(ids)) { + return Collections.emptyList(); + } + + try { + return Arrays.stream(ids.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .distinct() + .collect(Collectors.toList()); + } catch (NumberFormatException e) { + log.warn("解析ID字符串失败: {}", ids, e); + return Collections.emptyList(); + } + } + + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java index 9bc106edf0..28bcda2a3e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; import lombok.*; -import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; import java.time.LocalDateTime; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - 设备类型分页 Request VO") @@ -52,12 +54,12 @@ public class DeviceLedgerPageReqVO extends PageParam { private String deviceManager; @Schema(description = "设备生产日期") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] productionDate; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate productionDate; @Schema(description = "设备入厂日期") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] factoryEntryDate; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate factoryEntryDate; @Schema(description = "设备备注", example = "随便") private String deviceRemark; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java index 6f36cd5d33..9ab10ec951 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java @@ -1,19 +1,22 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; +import org.springframework.format.annotation.DateTimeFormat; @Schema(description = "管理后台 - 设备类型 Response VO") @Data @ExcelIgnoreUnannotated -public class DeviceLedgerRespVO { +public class DeviceLedgerRespVO extends BaseDO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24467") - @ExcelProperty("id") +// @ExcelProperty("id") private Long id; @Schema(description = "设备编号") @@ -25,8 +28,8 @@ public class DeviceLedgerRespVO { private String deviceName; @Schema(description = "设备状态 (0-正常, 1-停用, 2-维修, 3-报废)", example = "2") - @ExcelProperty("设备状态 (0-正常, 1-停用, 2-维修, 3-报废)") - private Integer deviceStatus; + @ExcelProperty(value = "设备状态", converter = DeviceStatusConverter.class) + private Integer deviceStatus; @Schema(description = "设备品牌") @ExcelProperty("设备品牌") @@ -61,16 +64,22 @@ public class DeviceLedgerRespVO { private String deviceLocation; @Schema(description = "设备负责人") - @ExcelProperty("设备负责人") +// @ExcelProperty("设备负责人") private String deviceManager; + @Schema(description = "设备负责人名字", example = "随便") + @ExcelProperty("设备负责人名字") + private String deviceManagerName; + @Schema(description = "设备生产日期") @ExcelProperty("设备生产日期") - private LocalDateTime productionDate; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate productionDate; @Schema(description = "设备入厂日期") @ExcelProperty("设备入厂日期") - private LocalDateTime factoryEntryDate; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate factoryEntryDate; @Schema(description = "设备备注", example = "随便") @ExcelProperty("设备备注") @@ -81,11 +90,19 @@ public class DeviceLedgerRespVO { private String remark; @Schema(description = "排序") - @ExcelProperty("排序") +// @ExcelProperty("排序") private Integer sort; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; + + @Schema(description = "创建人名字", example = "随便") + @ExcelProperty("创建人名字") + private String creatorName; + + + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerSaveReqVO.java index 1016f43d86..dd1f4f4326 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerSaveReqVO.java @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; -import javax.validation.constraints.*; -import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; import java.time.LocalDateTime; @Schema(description = "管理后台 - 设备类型新增/修改 Request VO") @@ -51,10 +50,10 @@ public class DeviceLedgerSaveReqVO { private String deviceManager; @Schema(description = "设备生产日期") - private LocalDateTime productionDate; + private LocalDate productionDate; @Schema(description = "设备入厂日期") - private LocalDateTime factoryEntryDate; + private LocalDate factoryEntryDate; @Schema(description = "设备备注", example = "随便") private String deviceRemark; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceStatusConverter.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceStatusConverter.java new file mode 100644 index 0000000000..13f99d54f2 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceStatusConverter.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; + +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.enums.DeviceLedgerStatusEnum; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import org.springframework.stereotype.Component; + +/** + * 设备状态转换器 + */ +@Component +public class DeviceStatusConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + /** + * 读取Excel时调用(从Excel到Java对象) + */ + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String cellValue = cellData.getStringValue(); + if (cellValue == null || cellValue.trim().isEmpty()) { + return null; + } + + // 将中文状态转换为数字 + for (DeviceLedgerStatusEnum status : DeviceLedgerStatusEnum.values()) { + if (status.getDescription().equals(cellValue)) { + return status.getCode(); + } + } + + // 如果中文没匹配到,尝试直接解析数字 + try { + return Integer.parseInt(cellValue); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("设备状态格式错误: " + cellValue); + } + } + + /** + * 写入Excel时调用(从Java对象到Excel) + */ + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (value == null) { + return new WriteCellData<>(""); + } + + DeviceLedgerStatusEnum status = DeviceLedgerStatusEnum.getByCode(value); + String text = status != null ? status.getDescription() : "未知"; + return new WriteCellData<>(text); + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java index efb750dcff..206d320d1c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java @@ -6,11 +6,17 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; import cn.iocoder.yudao.module.mes.controller.admin.dvsubject.vo.DvSubjectPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.dvsubject.vo.DvSubjectRespVO; import cn.iocoder.yudao.module.mes.controller.admin.dvsubject.vo.DvSubjectSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.service.dvsubject.DvSubjectService; +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.alibaba.excel.util.StringUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,7 +29,9 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; @@ -38,6 +46,14 @@ public class DvSubjectController { @Resource private DvSubjectService dvSubjectService; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private DictDataApi dictDataApi; + + + @PostMapping("/create") @Operation(summary = "创建维保项目") @PreAuthorize("@ss.hasPermission('mes:dv-subject:create')") @@ -83,7 +99,8 @@ public class DvSubjectController { @PreAuthorize("@ss.hasPermission('mes:dv-subject:query')") public CommonResult> getDvSubjectPage(@Valid DvSubjectPageReqVO pageReqVO) { PageResult pageResult = dvSubjectService.getDvSubjectPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DvSubjectRespVO.class)); + PageResult dvSubjectRespVOPageResult = BeanUtils.toBean(pageResult, DvSubjectRespVO.class); + return success(buildCreatorName(dvSubjectRespVOPageResult)); } @GetMapping("/export-excel") @@ -94,9 +111,77 @@ public class DvSubjectController { HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = dvSubjectService.getDvSubjectPage(pageReqVO).getList(); + + List dvSubjectRespVOList = BeanUtils.toBean(list, DvSubjectRespVO.class); + // 1. 获取字典数据 + Map> dictData = getDictData(); + + for (DvSubjectRespVO dvSubjectRespVO : dvSubjectRespVOList) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(dvSubjectRespVO.getCreator())); + dvSubjectRespVO.setCreatorName("(" + user.getUsername()+ ")" + user.getNickname()); + + // 转换检验方式字典值 + if (StringUtils.isNotBlank(dvSubjectRespVO.getInspectionMethod())) { + String inspectionMethodLabel = dictData.get("Inspection_method") + .get(dvSubjectRespVO.getInspectionMethod()); + if (StringUtils.isNotBlank(inspectionMethodLabel)) { + // 可以创建一个临时字段存储,或者直接替换原字段 + dvSubjectRespVO.setInspectionMethod(inspectionMethodLabel); + } + } + + // 转换值类型字典值 + if (StringUtils.isNotBlank(dvSubjectRespVO.getValueType())) { + String valueTypeLabel = dictData.get("value_types") + .get(dvSubjectRespVO.getValueType()); + if (StringUtils.isNotBlank(valueTypeLabel)) { + dvSubjectRespVO.setValueType(valueTypeLabel); + } + } + + } // 导出 Excel ExcelUtils.write(response, "维保项目.xls", "数据", DvSubjectRespVO.class, - BeanUtils.toBean(list, DvSubjectRespVO.class)); + dvSubjectRespVOList ); + } + + + private PageResult buildCreatorName(PageResult dvSubjectRespVOPageResult) { + for (DvSubjectRespVO dvSubjectRespVO : dvSubjectRespVOPageResult.getList()) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(dvSubjectRespVO.getCreator())); + dvSubjectRespVO.setCreatorName("(" + user.getUsername()+ ")" + user.getNickname()); + } + + return dvSubjectRespVOPageResult; + } + + /** + * 获取字典数据 + */ + private Map> getDictData() { + Map> dictData = new HashMap<>(); + + try { + // 获取检验方式字典 + Map inspectionMethodDict = new HashMap<>(); + List inspectionMethods = dictDataApi.getDictDataList("Inspection_method"); + for (DictDataRespDTO dict : inspectionMethods) { + inspectionMethodDict.put(dict.getValue(), dict.getLabel()); + } + dictData.put("Inspection_method", inspectionMethodDict); + + // 获取值类型字典 + Map valueTypeDict = new HashMap<>(); + List valueTypes = dictDataApi.getDictDataList("value_types"); + for (DictDataRespDTO dict : valueTypes) { + valueTypeDict.put(dict.getValue(), dict.getLabel()); + } + dictData.put("value_types", valueTypeDict); + } catch (Exception e) { + throw new RuntimeException("获取字典数据异常:" + e); + } + + return dictData; } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java index 870b118788..12d12ba658 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.dvsubject.vo; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -13,10 +15,10 @@ import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; @Schema(description = "管理后台 - 维保项目 Response VO") @Data @ExcelIgnoreUnannotated -public class DvSubjectRespVO { +public class DvSubjectRespVO extends BaseDO { @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24679") - @ExcelProperty("ID") +// @ExcelProperty("ID") private Long id; @Schema(description = "项目编码", requiredMode = Schema.RequiredMode.REQUIRED) @@ -46,6 +48,7 @@ public class DvSubjectRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "检验方式") @@ -60,4 +63,8 @@ public class DvSubjectRespVO { @ExcelProperty("判定基准") private String judgmentCriteria; + @Schema(description = "创建人名字") + @ExcelProperty("创建人名字") + private String creatorName; + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectSaveReqVO.java index 1fdec3636d..0384b9edcb 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectSaveReqVO.java @@ -25,7 +25,7 @@ public class DvSubjectSaveReqVO { private String subjectType; @Schema(description = "项目内容", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "项目内容不能为空") +// @NotEmpty(message = "项目内容不能为空") private String subjectContent; @Schema(description = "标准") @@ -35,5 +35,16 @@ public class DvSubjectSaveReqVO { @NotNull(message = "是否启用不能为空") private Boolean isEnable; + @Schema(description = "检验方式", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "检验方式") + private String inspectionMethod; + + @Schema(description = "值类型", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "值类型") + private String valueType; + + @Schema(description = "判定基准", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "判定基准") + private String judgmentCriteria; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java index 54998bd59b..ec49856cd2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java @@ -1,6 +1,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.planmaintenance; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.TicketManagementRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.subjectplan.SubjectPlanDO; +import cn.iocoder.yudao.module.mes.service.subjectplan.SubjectPlanService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -40,6 +45,12 @@ public class PlanMaintenanceController { @Resource private PlanMaintenanceService planMaintenanceService; + @Resource + private SubjectPlanService subjectPlanService; + + @Resource + private AdminUserApi adminUserApi; + @PostMapping("/create") @Operation(summary = "创建方案维护") @PreAuthorize("@ss.hasPermission('mes:plan-maintenance:create')") @@ -83,7 +94,9 @@ public class PlanMaintenanceController { @PreAuthorize("@ss.hasPermission('mes:plan-maintenance:query')") public CommonResult> getPlanMaintenancePage(@Valid PlanMaintenancePageReqVO pageReqVO) { PageResult pageResult = planMaintenanceService.getPlanMaintenancePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, PlanMaintenanceRespVO.class)); + PageResult planMaintenanceRespVOPageResult = BeanUtils.toBean(pageResult, PlanMaintenanceRespVO.class); + + return success(buildPageCreatorName(planMaintenanceRespVOPageResult)); } @GetMapping("/export-excel") @@ -94,9 +107,15 @@ public class PlanMaintenanceController { HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = planMaintenanceService.getPlanMaintenancePage(pageReqVO).getList(); + + List planMaintenanceRespVOS = BeanUtils.toBean(list, PlanMaintenanceRespVO.class); + for (PlanMaintenanceRespVO planMaintenanceRespVO : planMaintenanceRespVOS) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); + planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + // 导出 Excel - ExcelUtils.write(response, "方案维护.xls", "数据", PlanMaintenanceRespVO.class, - BeanUtils.toBean(list, PlanMaintenanceRespVO.class)); + ExcelUtils.write(response, "方案维护.xls", "数据", PlanMaintenanceRespVO.class,planMaintenanceRespVOS); } @@ -104,9 +123,18 @@ public class PlanMaintenanceController { @Operation(summary = "查询项目集合列表") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:plan-maintenance:query')") - public CommonResult> getSubjectList(@RequestParam("id") Long id) { - List subjectPlanDOList = planMaintenanceService.getSubjectList(id); + public CommonResult> getSubjectList(@RequestParam("id") Long id) { + List subjectPlanDOList = planMaintenanceService.getSubjectList(id); return success(subjectPlanDOList); } + + private PageResult buildPageCreatorName(PageResult planMaintenanceRespVOPageResult) { + for (PlanMaintenanceRespVO planMaintenanceRespVO : planMaintenanceRespVOPageResult.getList()) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); + planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + return planMaintenanceRespVOPageResult; + } + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java index e5af3baf68..372aa3fc7b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java @@ -19,7 +19,7 @@ public class PlanMaintenancePageReqVO extends PageParam { private String planName; @Schema(description = "名称", example = "1") - private String planType; + private Integer planType; @Schema(description = "描述", example = "你猜") private String description; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java index cafd1a5a6b..dd98576352 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.planmaintenance.vo; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -10,7 +11,7 @@ import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - 方案维护 Response VO") @Data @ExcelIgnoreUnannotated -public class PlanMaintenanceRespVO { +public class PlanMaintenanceRespVO extends BaseDO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19033") @ExcelProperty("id") @@ -22,7 +23,7 @@ public class PlanMaintenanceRespVO { @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty("名称") - private String planType; + private int planType; @Schema(description = "描述", example = "你猜") @ExcelProperty("描述") @@ -32,4 +33,10 @@ public class PlanMaintenanceRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "项目集合ids") + private List subjectIds; + + @Schema(description = "创建人名字") + @ExcelProperty("创建人名字") + private String creatorName; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java index b995e74630..be934909af 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java @@ -98,4 +98,13 @@ public class TaskManagementController { BeanUtils.toBean(list, TaskManagementRespVO.class)); } + + @PostMapping("/createTicket") + @Operation(summary = "创建工单管理") + @PreAuthorize("@ss.hasPermission('mes:task-management:create')") + public CommonResult createTicket(@RequestParam("id") Long id) { + taskManagementService.createTicket(id); + return success(true); + } + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java new file mode 100644 index 0000000000..1312d8c71e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java @@ -0,0 +1,123 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement; + +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.module.mes.service.ticketmanagement.TicketManagementService; + +@Tag(name = "管理后台 - 工单管理") +@RestController +@RequestMapping("/mes/ticket-management") +@Validated +public class TicketManagementController { + + @Resource + private TicketManagementService ticketManagementService; + + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/create") + @Operation(summary = "创建工单管理") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:create')") + public CommonResult createTicketManagement(@Valid @RequestBody TicketManagementSaveReqVO createReqVO) { + return success(ticketManagementService.createTicketManagement(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新工单管理") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:update')") + public CommonResult updateTicketManagement(@Valid @RequestBody TicketManagementSaveReqVO updateReqVO) { + ticketManagementService.updateTicketManagement(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除工单管理") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:ticket-management:delete')") + public CommonResult deleteTicketManagement(@RequestParam("id") Long id) { + ticketManagementService.deleteTicketManagement(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得工单管理") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:query')") + public CommonResult getTicketManagement(@RequestParam("id") Long id) { + TicketManagementDO ticketManagement = ticketManagementService.getTicketManagement(id); + return success(BeanUtils.toBean(ticketManagement, TicketManagementRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得工单管理分页") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:query')") + public CommonResult> getTicketManagementPage(@Valid TicketManagementPageReqVO pageReqVO) { + PageResult pageResult = ticketManagementService.getTicketManagementPage(pageReqVO); + return success(buildPageCreatorName(BeanUtils.toBean(pageResult, TicketManagementRespVO.class))); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出工单管理 Excel") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTicketManagementExcel(@Valid TicketManagementPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = ticketManagementService.getTicketManagementPage(pageReqVO).getList(); + List ticketManagementRespVOList = BeanUtils.toBean(list, TicketManagementRespVO.class); + for (TicketManagementRespVO ticketManagementRespVO : ticketManagementRespVOList) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(ticketManagementRespVO.getCreator())); + ticketManagementRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + + // 导出 Excel + ExcelUtils.write(response, "工单管理.xls", "数据", TicketManagementRespVO.class, + ticketManagementRespVOList); + } + + + @PutMapping("/batchUpdateStatus") + @Operation(summary = "批量取消工单") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:update')") + public CommonResult batchUpdateTicketStatus(@Valid @RequestBody TicketManagementBatchUpdateReqVO reqVO) { + ticketManagementService.batchUpdateJobStatus(reqVO); + return success(true); + } + + private PageResult buildPageCreatorName(PageResult ticketManagementRespVOPageResult) { + for (TicketManagementRespVO ticketManagementRespVO : ticketManagementRespVOPageResult.getList()) { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(ticketManagementRespVO.getCreator())); + ticketManagementRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + return ticketManagementRespVOPageResult; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementBatchUpdateReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementBatchUpdateReqVO.java new file mode 100644 index 0000000000..f3539708bd --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementBatchUpdateReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +// 1. 新增请求VO +@Data +public class TicketManagementBatchUpdateReqVO { + + @Schema(description = "工单ID列表,用逗号分隔", example = "1,2,3") + @NotBlank(message = "工单ID不能为空") + private String ids; + + @Schema(description = "作业状态", example = "2") + @NotNull(message = "作业状态不能为空") + private Integer jobStatus ; // 默认值为2 +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java new file mode 100644 index 0000000000..322c61ef8c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 项目方案关联分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TicketManagementPageReqVO extends PageParam { + + @Schema(description = "项目ID", example = "21368") + private String subjectId; + + @Schema(description = "方案ID", example = "20459") + private Long planId; + + @Schema(description = "单号") + private String planNo; + + @Schema(description = "设备名称", example = "张三") + private String deviceName; + + @Schema(description = "类型", example = "2") + private String planType; + + @Schema(description = "计划配置名称", example = "赵六") + private String configName; + + @Schema(description = "作业状态", example = "1") + private Integer jobStatus; + + @Schema(description = "作业结果") + private String jobResult; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + + @Schema(description = "id集合导出用") + private String ids; + + + /** + * 作业开始时间 + */ + private String taskTime; + + /** + * 作业结束时间 + */ + private String taskEndTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java new file mode 100644 index 0000000000..5072e6d06b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.github.xiaoymin.knife4j.annotations.Ignore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 项目方案关联 Response VO") +@Data +@ExcelIgnoreUnannotated +public class TicketManagementRespVO extends BaseDO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6566") + @ExcelProperty("id") + private Long id; + + @Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21368") +// @ExcelProperty("项目ID") + private Long subjectId; + + @Schema(description = "方案ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20459") +// @ExcelProperty("方案ID") + private Long planId; + + @Schema(description = "单号") + @ExcelProperty("单号") + private String planNo; + + @Schema(description = "设备名称", example = "张三") + @ExcelProperty("设备名称") + private String deviceName; + + @Schema(description = "类型", example = "2") + @ExcelProperty("类型") + private String planType; + + @Schema(description = "计划配置名称", example = "赵六") + @ExcelProperty("计划配置名称") + private String configName; + + @Schema(description = "作业状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("作业状态") + private Integer jobStatus; + + @Schema(description = "作业结果") + @ExcelProperty("作业结果") + private Integer jobResult; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + + + /** + * 作业开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime taskTime; + + /** + * 作业结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime taskEndTime; + + + @Schema(description = "创建人名字") + @ExcelProperty("创建人名字") + private String creatorName; + + + + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementSaveReqVO.java new file mode 100644 index 0000000000..78371ae107 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementSaveReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 项目方案关联新增/修改 Request VO") +@Data +public class TicketManagementSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6566") + private Long id; + + @Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21368") + @NotNull(message = "项目ID不能为空") + private Long subjectId; + + @Schema(description = "方案ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20459") + @NotNull(message = "方案ID不能为空") + private Long planId; + + @Schema(description = "单号") + private String planNo; + + @Schema(description = "设备名称", example = "张三") + private String deviceName; + + @Schema(description = "类型", example = "2") + private String planType; + + @Schema(description = "计划配置名称", example = "赵六") + private String configName; + + @Schema(description = "作业状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "作业状态不能为空") + private Integer jobStatus; + + @Schema(description = "作业结果") + private Integer jobResult; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/TicketResultsController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/TicketResultsController.java new file mode 100644 index 0000000000..0aa0366889 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/TicketResultsController.java @@ -0,0 +1,104 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketresults; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +import cn.iocoder.yudao.module.mes.service.ticketresults.TicketResultsService; + +@Tag(name = "管理后台 - 工单检验结果") +@RestController +@RequestMapping("/mes/ticket-results") +@Validated +public class TicketResultsController { + + @Resource + private TicketResultsService ticketResultsService; + + @PostMapping("/create") + @Operation(summary = "创建工单检验结果") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:create')") + public CommonResult createTicketResults(@Valid @RequestBody TicketResultsSaveReqVO createReqVO) { + return success(ticketResultsService.createTicketResults(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新工单检验结果") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:update')") + public CommonResult updateTicketResults(@Valid @RequestBody TicketResultsSaveReqVO updateReqVO) { + ticketResultsService.updateTicketResults(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除工单检验结果") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:ticket-results:delete')") + public CommonResult deleteTicketResults(@RequestParam("id") Long id) { + ticketResultsService.deleteTicketResults(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得工单检验结果") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:query')") + public CommonResult getTicketResults(@RequestParam("id") Long id) { + TicketResultsDO ticketResults = ticketResultsService.getTicketResults(id); + return success(BeanUtils.toBean(ticketResults, TicketResultsRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得工单检验结果分页") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:query')") + public CommonResult> getTicketResultsPage(@Valid TicketResultsPageReqVO pageReqVO) { + PageResult pageResult = ticketResultsService.getTicketResultsPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, TicketResultsRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出工单检验结果 Excel") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTicketResultsExcel(@Valid TicketResultsPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = ticketResultsService.getTicketResultsPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "工单检验结果.xls", "数据", TicketResultsRespVO.class, + BeanUtils.toBean(list, TicketResultsRespVO.class)); + } + + @PutMapping("/batchUpdate") + @Operation(summary = "批量更新工单检验结果") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:update')") + public CommonResult batchUpdateTicketResults( + @Valid @RequestBody List updateReqVOList) { + ticketResultsService.batchUpdateTicketResults(updateReqVOList); + return success(true); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/enums/JobResultEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/enums/JobResultEnum.java new file mode 100644 index 0000000000..9c2d87ad4b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/enums/JobResultEnum.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 作业结果枚举 + */ +@Getter +@AllArgsConstructor +public enum JobResultEnum { + + /** + * 待完成 + */ + PENDING(0, "待完成"), + + /** + * 通过 + */ + PASS(1, "通过"), + + /** + * 不通过 + */ + FAIL(2, "不通过"); + + /** + * 结果编码 + */ + private final Integer code; + + /** + * 结果描述 + */ + private final String description; + + /** + * 根据编码获取枚举 + */ + public static JobResultEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (JobResultEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + /** + * 判断编码是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + /** + * 获取所有编码 + */ + public static List getAllCodes() { + return Arrays.stream(values()) + .map(JobResultEnum::getCode) + .collect(Collectors.toList()); + } + + /** + * 获取所有描述 + */ + public static List getAllDescriptions() { + return Arrays.stream(values()) + .map(JobResultEnum::getDescription) + .collect(Collectors.toList()); + } + + /** + * 是否为待完成 + */ + public boolean isPending() { + return this == PENDING; + } + + /** + * 是否为通过 + */ + public boolean isPass() { + return this == PASS; + } + + /** + * 是否为不通过 + */ + public boolean isFail() { + return this == FAIL; + } + + /** + * 是否已完成(通过或不通过都算完成) + */ + public boolean isCompleted() { + return this == PASS || this == FAIL; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsPageReqVO.java new file mode 100644 index 0000000000..808ec79bd3 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsPageReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 工单检验结果分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TicketResultsPageReqVO extends PageParam { + + @Schema(description = "检验项名称", example = "赵六") + private String inspectionItemName; + + @Schema(description = "检验方式") + private String inspectionMethod; + + @Schema(description = "判定基准") + private String judgmentCriteria; + + @Schema(description = "检验结果 0-待检测 1-检测通过 2-检测不通过") + private Integer inspectionResult; + + @Schema(description = "图片路径") + private String images; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "检验时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] inspectionTime; + + @Schema(description = "工单管理Id") + private Long managementId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsRespVO.java new file mode 100644 index 0000000000..1f5312ef22 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsRespVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 工单检验结果 Response VO") +@Data +@ExcelIgnoreUnannotated +public class TicketResultsRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30557") + @ExcelProperty("id") + private Long id; + + @Schema(description = "检验项名称", example = "赵六") + @ExcelProperty("检验项名称") + private String inspectionItemName; + + @Schema(description = "检验方式") + @ExcelProperty("检验方式") + private String inspectionMethod; + + @Schema(description = "判定基准") + @ExcelProperty("判定基准") + private String judgmentCriteria; + + @Schema(description = "检验结果 0-待检测 1-检测通过 2-检测不通过") + @ExcelProperty("检验结果 0-待检测 1-检测通过 2-检测不通过") + private Integer inspectionResult; + + @Schema(description = "图片路径") + @ExcelProperty("图片路径") + private String images; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "检验时间") + @ExcelProperty("检验时间") + private LocalDateTime inspectionTime; + + @Schema(description = "工单管理Id") + private Long managementId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsSaveReqVO.java new file mode 100644 index 0000000000..0a90b76d0b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketresults/vo/TicketResultsSaveReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 工单检验结果新增/修改 Request VO") +@Data +public class TicketResultsSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30557") + private Long id; + + @Schema(description = "检验项名称", example = "赵六") + private String inspectionItemName; + + @Schema(description = "工单管理Id") + private Long managementId; + + @Schema(description = "检验方式") + private String inspectionMethod; + + @Schema(description = "判定基准") + private String judgmentCriteria; + + @Schema(description = "检验结果 0-待检测 1-检测通过 2-检测不通过") + private Integer inspectionResult; + + @Schema(description = "图片路径") + private String images; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "检验时间") + private LocalDateTime inspectionTime; + + @Schema(description = "检验人") + private String inspector; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java index bfccf7c1a8..19c71062c4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger; import lombok.*; + +import java.time.*; import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; import java.time.LocalDateTime; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -80,11 +81,11 @@ public class DeviceLedgerDO extends BaseDO { /** * 设备生产日期 */ - private LocalDateTime productionDate; + private LocalDate productionDate; /** * 设备入厂日期 */ - private LocalDateTime factoryEntryDate; + private LocalDate factoryEntryDate; /** * 设备备注 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java index 5a0dabe41e..95903014e8 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java @@ -32,12 +32,17 @@ public class PlanMaintenanceDO extends BaseDO { */ private String planName; /** - * 名称 + * 类型 1-保养 2-维护 */ - private String planType; + private int planType; /** * 描述 */ private String description; + /** + * 项目id集合 + */ + @TableField(exist = false) + private List subjectIds; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java new file mode 100644 index 0000000000..add03ab761 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.*; + +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 工单管理 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_ticket_management") +@KeySequence("mes_ticket_management_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TicketManagementDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 项目ID + */ + private Long subjectId; + /** + * 方案ID + */ + private Long planId; + /** + * 单号 + */ + private String planNo; + /** + * 设备名称 + */ + private String deviceName; + /** + * 类型 + */ + private int planType; + /** + * 计划配置名称 + */ + private String configName; + /** + * 作业状态 0-待完成 1-已完成 2-已取消 + */ + private Integer jobStatus; + /** + * 作业结果 0-待完成 1-通过 2-不通过 + */ + private int jobResult; + + /** + * 作业开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime taskTime; + + /** + * 作业结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime taskEndTime; + + + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketresults/TicketResultsDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketresults/TicketResultsDO.java new file mode 100644 index 0000000000..5782f1064a --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketresults/TicketResultsDO.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 工单检验结果 DO + * + * @author 内蒙必硕 + */ +@TableName("mes_ticket_results") +@KeySequence("mes_ticket_results_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TicketResultsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 检验项名称 + */ + private String inspectionItemName; + /** + * 检验方式 + */ + private String inspectionMethod; + /** + * 判定基准 + */ + private String judgmentCriteria; + /** + * 检验结果 0-待检测 1-检测通过 2-检测不通过 + */ + private Integer inspectionResult; + /** + * 图片路径 + */ + private String images; + /** + * 备注 + */ + private String remark; + /** + * 检验时间 + */ + private LocalDateTime inspectionTime; + /** + * 检验人 + */ + private Long managementId; + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java index 2da2f0fa07..5c189f07d9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java @@ -6,7 +6,6 @@ import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import com.alibaba.excel.util.StringUtils; import org.apache.ibatis.annotations.Mapper; @@ -36,13 +35,11 @@ public interface DeviceLedgerMapper extends BaseMapperX { .eqIfPresent(DeviceLedgerDO::getSystemOrg, reqVO.getSystemOrg()) .eqIfPresent(DeviceLedgerDO::getDeviceLocation, reqVO.getDeviceLocation()) .eqIfPresent(DeviceLedgerDO::getDeviceManager, reqVO.getDeviceManager()) - .betweenIfPresent(DeviceLedgerDO::getProductionDate, reqVO.getProductionDate()) - .betweenIfPresent(DeviceLedgerDO::getFactoryEntryDate, reqVO.getFactoryEntryDate()) .eqIfPresent(DeviceLedgerDO::getDeviceRemark, reqVO.getDeviceRemark()) .eqIfPresent(DeviceLedgerDO::getRemark, reqVO.getRemark()) .eqIfPresent(DeviceLedgerDO::getSort, reqVO.getSort()) .betweenIfPresent(DeviceLedgerDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(DeviceLedgerDO::getId); + .orderByDesc(DeviceLedgerDO::getCreateTime); // 单独处理 ids 条件 if (StringUtils.isNotBlank(reqVO.getIds())) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvsubject/DvSubjectMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvsubject/DvSubjectMapper.java index e139542055..665420fe87 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvsubject/DvSubjectMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvsubject/DvSubjectMapper.java @@ -35,7 +35,7 @@ public interface DvSubjectMapper extends BaseMapperX { .eqIfPresent(DvSubjectDO::getSubjectStandard, reqVO.getSubjectStandard()) .eqIfPresent(DvSubjectDO::getIsEnable, reqVO.getIsEnable()) .betweenIfPresent(DvSubjectDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(DvSubjectDO::getId); + .orderByDesc(DvSubjectDO::getCreateTime); // 单独处理 ids 条件 if (StringUtils.isNotBlank(reqVO.getIds())) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planmaintenance/PlanMaintenanceMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planmaintenance/PlanMaintenanceMapper.java index d5f446ba45..e1d444ea22 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planmaintenance/PlanMaintenanceMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/planmaintenance/PlanMaintenanceMapper.java @@ -28,7 +28,7 @@ public interface PlanMaintenanceMapper extends BaseMapperX { .eqIfPresent(PlanMaintenanceDO::getPlanType, reqVO.getPlanType()) .eqIfPresent(PlanMaintenanceDO::getDescription, reqVO.getDescription()) .betweenIfPresent(PlanMaintenanceDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(PlanMaintenanceDO::getId); + .orderByDesc(PlanMaintenanceDO::getCreateTime); // 单独处理 ids 条件 if (StringUtils.isNotBlank(reqVO.getIds())) { @@ -38,8 +38,10 @@ public interface PlanMaintenanceMapper extends BaseMapperX { .collect(Collectors.toList()); planMaintenanceDOLambdaQueryWrapperX.in(PlanMaintenanceDO::getId, idList); } + PageResult planMaintenanceDOPageResult = selectPage(reqVO, planMaintenanceDOLambdaQueryWrapperX); - return selectPage(reqVO, planMaintenanceDOLambdaQueryWrapperX); + + return planMaintenanceDOPageResult; } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketmanagement/TicketManagementMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketmanagement/TicketManagementMapper.java new file mode 100644 index 0000000000..ceb55385ea --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketmanagement/TicketManagementMapper.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement; + +import java.util.*; +import java.util.stream.Collectors; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.taskmanagement.TaskManagementDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import com.alibaba.excel.util.StringUtils; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 项目方案关联 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface TicketManagementMapper extends BaseMapperX { + + default PageResult selectPage(TicketManagementPageReqVO reqVO) { + + LambdaQueryWrapperX ticketManagementDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>(); + ticketManagementDOLambdaQueryWrapperX + .eqIfPresent(TicketManagementDO::getSubjectId, reqVO.getSubjectId()) + .eqIfPresent(TicketManagementDO::getPlanId, reqVO.getPlanId()) + .eqIfPresent(TicketManagementDO::getPlanNo, reqVO.getPlanNo()) + .likeIfPresent(TicketManagementDO::getDeviceName, reqVO.getDeviceName()) + .eqIfPresent(TicketManagementDO::getPlanType, reqVO.getPlanType()) + .likeIfPresent(TicketManagementDO::getConfigName, reqVO.getConfigName()) + .eqIfPresent(TicketManagementDO::getJobStatus, reqVO.getJobStatus()) + .eqIfPresent(TicketManagementDO::getJobResult, reqVO.getJobResult()) + .orderByDesc(TicketManagementDO::getCreateTime); + + + // 单独处理 ids 条件 + if (StringUtils.isNotBlank(reqVO.getIds())) { + List idList = Arrays.stream(reqVO.getIds().split(",")) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + ticketManagementDOLambdaQueryWrapperX.in(TicketManagementDO::getId, idList); + } + + + return selectPage(reqVO,ticketManagementDOLambdaQueryWrapperX); + } + + + /** + * 批量更新作业状态 + * + * @param idList 工单ID列表 + * @param jobStatus 作业状态 + * @return 更新记录数 + */ + int batchUpdateJobStatus(@Param("idList") List idList, + @Param("jobStatus") Integer jobStatus); + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketresults/TicketResultsMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketresults/TicketResultsMapper.java new file mode 100644 index 0000000000..0723f76e02 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/ticketresults/TicketResultsMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.ticketresults; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.*; + +/** + * 工单检验结果 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface TicketResultsMapper extends BaseMapperX { + + default PageResult selectPage(TicketResultsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TicketResultsDO::getInspectionItemName, reqVO.getInspectionItemName()) + .eqIfPresent(TicketResultsDO::getInspectionMethod, reqVO.getInspectionMethod()) + .eqIfPresent(TicketResultsDO::getJudgmentCriteria, reqVO.getJudgmentCriteria()) + .eqIfPresent(TicketResultsDO::getInspectionResult, reqVO.getInspectionResult()) + .eqIfPresent(TicketResultsDO::getImages, reqVO.getImages()) + .eqIfPresent(TicketResultsDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TicketResultsDO::getInspectionTime, reqVO.getInspectionTime()) + .eqIfPresent(TicketResultsDO::getManagementId, reqVO.getManagementId()) + .betweenIfPresent(TicketResultsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TicketResultsDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java index 26e257dfc7..70b71633a3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerService.java @@ -5,7 +5,6 @@ import javax.validation.*; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; /** * 设备类型 Service 接口 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java index 521f06ba02..886467a941 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java @@ -1,17 +1,14 @@ package cn.iocoder.yudao.module.mes.service.deviceledger; -import cn.iocoder.yudao.module.mes.dal.dataobject.devicetype.DeviceTypeDO; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; import java.util.*; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; @@ -38,6 +35,8 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { validateCodeOnly(createReqVO.getDeviceCode()); // 插入 DeviceLedgerDO deviceLedger = BeanUtils.toBean(createReqVO, DeviceLedgerDO.class); + + deviceLedgerMapper.insert(deviceLedger); // 返回 return deviceLedger.getId(); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceService.java index 6c0eb44397..426835dd75 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.service.planmaintenance; import java.util.*; import javax.validation.*; import cn.iocoder.yudao.module.mes.controller.admin.planmaintenance.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.planmaintenance.PlanMaintenanceDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -53,6 +54,6 @@ public interface PlanMaintenanceService { */ PageResult getPlanMaintenancePage(PlanMaintenancePageReqVO pageReqVO); - List getSubjectList(Long id); + List getSubjectList(Long id); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceServiceImpl.java index f8ed907eba..da715510c4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/planmaintenance/PlanMaintenanceServiceImpl.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.service.planmaintenance; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.subjectplan.SubjectPlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.dvsubject.DvSubjectMapper; import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper; import cn.iocoder.yudao.module.mes.service.subjectplan.SubjectPlanService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -39,6 +41,9 @@ public class PlanMaintenanceServiceImpl implements PlanMaintenanceService { @Resource private SubjectPlanMapper subjectPlanMapper; + @Resource + private DvSubjectMapper dvSubjectMapper; + @Override @Transactional(rollbackFor = Exception.class) @@ -149,16 +154,38 @@ public class PlanMaintenanceServiceImpl implements PlanMaintenanceService { @Override public PageResult getPlanMaintenancePage(PlanMaintenancePageReqVO pageReqVO) { - return planMaintenanceMapper.selectPage(pageReqVO); + PageResult planMaintenanceDOPageResult = planMaintenanceMapper.selectPage(pageReqVO); + for (PlanMaintenanceDO planMaintenanceDO : planMaintenanceDOPageResult.getList()) { + List ids = new ArrayList<>(); + List subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.lambdaQuery() + .eq(SubjectPlanDO::getPlanId, planMaintenanceDO.getId())); + for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) { + ids.add(subjectPlanDO.getSubjectId()); + } + planMaintenanceDO.setSubjectIds(ids); + } + + + return planMaintenanceDOPageResult; } @Override - public List getSubjectList(Long id) { + public List getSubjectList(Long id) { if (id == null ){ throw exception(SUBJECT_ID_NOT_EXISTS); } - return subjectPlanMapper.selectList(Wrappers.lambdaQuery() - .eq(SubjectPlanDO::getSubjectId, id)); + //查询对应的设备列表 + List dvSubjectDOList = new ArrayList<>(); + List subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.lambdaQuery() + .eq(SubjectPlanDO::getPlanId, id)); + for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) { + DvSubjectDO dvSubjectDO = dvSubjectMapper.selectById(subjectPlanDO.getSubjectId()); + if (dvSubjectDO!=null){ + dvSubjectDOList.add(dvSubjectDO); + } + } + + return dvSubjectDOList; } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementService.java index fd62dce721..618c9cc901 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementService.java @@ -52,4 +52,5 @@ public interface TaskManagementService { */ PageResult getTaskManagementPage(TaskManagementPageReqVO pageReqVO); + void createTicket(Long id); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java index 066b8007f7..ef2fa03431 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java @@ -1,11 +1,27 @@ package cn.iocoder.yudao.module.mes.service.taskmanagement; +import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.planmaintenance.PlanMaintenanceDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.subjectplan.SubjectPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.dvsubject.DvSubjectMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.planmaintenance.PlanMaintenanceMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; + import cn.iocoder.yudao.module.mes.controller.admin.taskmanagement.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.taskmanagement.TaskManagementDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -29,6 +45,25 @@ public class TaskManagementServiceImpl implements TaskManagementService { @Resource private TaskManagementMapper taskManagementMapper; + @Resource + private TicketManagementMapper ticketManagementMapper; + + @Resource + private TicketResultsMapper ticketResultsMapper; + + @Resource + private DeviceLedgerMapper deviceLedgerMapper; + + @Resource + private PlanMaintenanceMapper planMaintenanceMapper; + + @Resource + private SubjectPlanMapper subjectPlanMapper; + + + @Resource + private DvSubjectMapper dvSubjectMapper; + @Override public Long createTaskManagement(TaskManagementSaveReqVO createReqVO) { // 插入 @@ -73,4 +108,61 @@ public class TaskManagementServiceImpl implements TaskManagementService { return taskManagementMapper.selectPage(pageReqVO); } + @Override + public void createTicket(Long id) { + + List ticketManagementDOS = new ArrayList<>(); + + //检验数据是否存在 + validateTaskManagementExists(id); + TaskManagementDO taskManagementDO = taskManagementMapper.selectById(id); + if (taskManagementDO == null){ + throw exception(TASK_MANAGEMENT_NOT_EXISTS); + } + + // 将逗号分隔的字符串转换为Long类型的List + List idList = Arrays.stream(taskManagementDO.getDeviceList().split(",")) + .map(String::trim) // 去除可能存在的空格 + .map(Long::valueOf) + .collect(Collectors.toList()); + + + for (Long deviceId : idList) { + TicketManagementDO ticketManagementDO = new TicketManagementDO(); + DeviceLedgerDO deviceLedgerDO = deviceLedgerMapper.selectById(deviceId); + ticketManagementDO.setPlanNo(generatePrefixedOrderNo()); + ticketManagementDO.setPlanId(taskManagementDO.getProjectForm()); + ticketManagementDO.setDeviceName(deviceLedgerDO.getDeviceName()); + ticketManagementDO.setPlanType(taskManagementDO.getTaskType()); + ticketManagementDO.setConfigName(taskManagementDO.getName()); + ticketManagementDO.setTaskEndTime(taskManagementDO.getEndDate()); + ticketManagementMapper.insert(ticketManagementDO); + + List dvSubjectDOList = new ArrayList<>(); + List subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.lambdaQuery().eq(SubjectPlanDO::getPlanId, ticketManagementDO.getPlanId())); + for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) { + DvSubjectDO dvSubjectDO = dvSubjectMapper.selectById(subjectPlanDO.getSubjectId()); + + TicketResultsDO ticketResultsDO = new TicketResultsDO(); + ticketResultsDO.setInspectionItemName(dvSubjectDO.getSubjectName()); + ticketResultsDO.setInspectionMethod(dvSubjectDO.getInspectionMethod()); + ticketResultsDO.setJudgmentCriteria(dvSubjectDO.getJudgmentCriteria()); + ticketResultsDO.setManagementId(ticketManagementDO.getId()); + ticketResultsMapper.insert(ticketResultsDO); + } + + } + + } + + + /** + * 带前缀的时间戳单号 + */ + public static String generatePrefixedOrderNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String date = sdf.format(new Date()); + String randomNum = String.format("%06d", new Random().nextInt(1000000)); + return "E" + date + randomNum; + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java new file mode 100644 index 0000000000..1e8202fee3 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.service.ticketmanagement; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 项目方案关联 Service 接口 + * + * @author 内蒙必硕 + */ +public interface TicketManagementService { + + /** + * 创建项目方案关联 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTicketManagement(@Valid TicketManagementSaveReqVO createReqVO); + + /** + * 更新项目方案关联 + * + * @param updateReqVO 更新信息 + */ + void updateTicketManagement(@Valid TicketManagementSaveReqVO updateReqVO); + + /** + * 删除项目方案关联 + * + * @param id 编号 + */ + void deleteTicketManagement(Long id); + + /** + * 获得项目方案关联 + * + * @param id 编号 + * @return 项目方案关联 + */ + TicketManagementDO getTicketManagement(Long id); + + /** + * 获得项目方案关联分页 + * + * @param pageReqVO 分页查询 + * @return 项目方案关联分页 + */ + PageResult getTicketManagementPage(TicketManagementPageReqVO pageReqVO); + + void batchUpdateJobStatus(@Valid TicketManagementBatchUpdateReqVO reqVO); +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java new file mode 100644 index 0000000000..8038f0cdce --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.mes.service.ticketmanagement; + +import com.alibaba.excel.util.StringUtils; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * 项目方案关联 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class TicketManagementServiceImpl implements TicketManagementService { + + @Resource + private TicketManagementMapper ticketManagementMapper; + + @Override + public Long createTicketManagement(TicketManagementSaveReqVO createReqVO) { + // 插入 + TicketManagementDO ticketManagement = BeanUtils.toBean(createReqVO, TicketManagementDO.class); + ticketManagementMapper.insert(ticketManagement); + // 返回 + return ticketManagement.getId(); + } + + @Override + public void updateTicketManagement(TicketManagementSaveReqVO updateReqVO) { + // 校验存在 + validateTicketManagementExists(updateReqVO.getId()); + // 更新 + TicketManagementDO updateObj = BeanUtils.toBean(updateReqVO, TicketManagementDO.class); + ticketManagementMapper.updateById(updateObj); + } + + @Override + public void deleteTicketManagement(Long id) { + // 校验存在 + validateTicketManagementExists(id); + // 删除 + ticketManagementMapper.deleteById(id); + } + + private void validateTicketManagementExists(Long id) { + if (ticketManagementMapper.selectById(id) == null) { + throw exception(TICKET_MANAGEMENT_NOT_EXISTS); + } + } + + @Override + public TicketManagementDO getTicketManagement(Long id) { + return ticketManagementMapper.selectById(id); + } + + @Override + public PageResult getTicketManagementPage(TicketManagementPageReqVO pageReqVO) { + return ticketManagementMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchUpdateJobStatus(TicketManagementBatchUpdateReqVO reqVO) { + // 1. 解析ID列表 + List idList = parseIds(reqVO.getIds()); + if (idList.isEmpty()) { + throw exception(TICKET_MANAGEMENT_NOT_EXISTS); + } + + // 2. 批量更新 + ticketManagementMapper.batchUpdateJobStatus(idList, reqVO.getJobStatus()); + } + + /** + * 解析逗号分隔的ID字符串 + */ + private List parseIds(String ids) { + if (StringUtils.isBlank(ids)) { + return Collections.emptyList(); + } + + return Arrays.stream(ids.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .distinct() + .collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsService.java new file mode 100644 index 0000000000..f0da9fdb44 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.mes.service.ticketresults; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 工单检验结果 Service 接口 + * + * @author 内蒙必硕 + */ +public interface TicketResultsService { + + /** + * 创建工单检验结果 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTicketResults(@Valid TicketResultsSaveReqVO createReqVO); + + /** + * 更新工单检验结果 + * + * @param updateReqVO 更新信息 + */ + void updateTicketResults(@Valid TicketResultsSaveReqVO updateReqVO); + + /** + * 删除工单检验结果 + * + * @param id 编号 + */ + void deleteTicketResults(Long id); + + /** + * 获得工单检验结果 + * + * @param id 编号 + * @return 工单检验结果 + */ + TicketResultsDO getTicketResults(Long id); + + /** + * 获得工单检验结果分页 + * + * @param pageReqVO 分页查询 + * @return 工单检验结果分页 + */ + PageResult getTicketResultsPage(TicketResultsPageReqVO pageReqVO); + + /** + * 工单检验结果批量更新 + * + * @param updateReqVOList 批量更新 + * @return 工单检验结果批量更新 + */ + void batchUpdateTicketResults(@Valid List updateReqVOList); +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java new file mode 100644 index 0000000000..0f75ce78f7 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java @@ -0,0 +1,170 @@ +package cn.iocoder.yudao.module.mes.service.ticketresults; + +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums.JobResultEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * 工单检验结果 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class TicketResultsServiceImpl implements TicketResultsService { + + @Resource + private TicketResultsMapper ticketResultsMapper; + + @Resource + @Lazy + private TicketManagementMapper ticketManagementMapper; + + + @Override + public Long createTicketResults(TicketResultsSaveReqVO createReqVO) { + // 插入 + TicketResultsDO ticketResults = BeanUtils.toBean(createReqVO, TicketResultsDO.class); + ticketResultsMapper.insert(ticketResults); + // 返回 + return ticketResults.getId(); + } + + @Override + public void updateTicketResults(TicketResultsSaveReqVO updateReqVO) { + // 校验存在 + validateTicketResultsExists(updateReqVO.getId()); + // 更新 + TicketResultsDO updateObj = BeanUtils.toBean(updateReqVO, TicketResultsDO.class); + ticketResultsMapper.updateById(updateObj); + } + + @Override + public void deleteTicketResults(Long id) { + // 校验存在 + validateTicketResultsExists(id); + // 删除 + ticketResultsMapper.deleteById(id); + } + + private void validateTicketResultsExists(Long id) { + if (ticketResultsMapper.selectById(id) == null) { + throw exception(TICKET_RESULTS_NOT_EXISTS); + } + } + + @Override + public TicketResultsDO getTicketResults(Long id) { + return ticketResultsMapper.selectById(id); + } + + @Override + public PageResult getTicketResultsPage(TicketResultsPageReqVO pageReqVO) { + return ticketResultsMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchUpdateTicketResults(List updateReqVOList) { + if (CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + // 1. 数据验证 + validateBatchUpdateData(updateReqVOList); + + // 2. 批量更新 + List updateList = new ArrayList<>(); + LocalDateTime now = LocalDateTime.now(); + + for (TicketResultsSaveReqVO vo : updateReqVOList) { + // 转换为DO + TicketResultsDO updateDO = BeanUtils.toBean(vo, TicketResultsDO.class); + updateDO.setUpdateTime(now); + updateList.add(updateDO); + } + + // 3. 执行批量更新 + ticketResultsMapper.updateBatch(updateList); + + //4. 判断是否全部已检验 + handleInspectionResult(updateReqVOList); + } + + /** + * 验证批量更新数据 + */ + private void validateBatchUpdateData(List updateReqVOList) { + if (CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + Set idSet = new HashSet<>(); + + for (int i = 0; i < updateReqVOList.size(); i++) { + TicketResultsSaveReqVO vo = updateReqVOList.get(i); + + // 验证ID不能为空 + if (vo.getId() == null) { + throw exception(TICKET_RESULTS_ID_NOT_NULL); + } + + idSet.add(vo.getId()); + + // 调用单个验证逻辑 + validateTicketResultsExists(vo.getId()); + } + } + + + /** + * 处理检验结果 + */ + private void handleInspectionResult(List updateReqVOList) { + if (CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + // 检查是否有未填写的 + boolean hasPending = updateReqVOList.stream() + .anyMatch(vo -> vo.getInspectionResult() == null || vo.getInspectionResult().equals(JobResultEnum.PENDING.getCode())); + + if (hasPending) { + return; + } + TicketManagementDO ticketManagementDO = ticketManagementMapper.selectById(updateReqVOList.get(0).getManagementId()); + if (ticketManagementDO == null ){ + throw exception(TICKET_MANAGEMENT_NOT_EXISTS); + } + // 检查是否有不通过的 + boolean hasFail = updateReqVOList.stream() + .anyMatch(vo -> vo.getInspectionResult() != null && vo.getInspectionResult().equals(JobResultEnum.FAIL.getCode())); + if (hasFail) { + ticketManagementDO.setJobResult(JobResultEnum.FAIL.getCode()); + } else { + ticketManagementDO.setJobResult(JobResultEnum.PASS.getCode()); + } + ticketManagementMapper.updateById(ticketManagementDO); + + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/ticketmanagement/TicketManagementMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/ticketmanagement/TicketManagementMapper.xml new file mode 100644 index 0000000000..d78e084bd3 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/ticketmanagement/TicketManagementMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + UPDATE mes_ticket_management + SET job_status = #{jobStatus}, + update_time = NOW() + WHERE id IN + + #{id} + + \ No newline at end of file