From a112373b17ea2af47c09aa6833146157b5b98e0c Mon Sep 17 00:00:00 2001 From: 86158 <461356067@qq.com> Date: Thu, 22 Jan 2026 17:44:49 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E5=85=B7=E8=AF=A6=E6=83=85=E7=9A=84=E7=82=B9=E6=A3=80=E4=BF=9D?= =?UTF-8?q?=E5=85=BB=E7=BB=B4=E4=BF=AE=E5=B1=A5=E5=8E=86=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/mes/enums/ErrorCodeConstants.java | 7 +- .../deviceledger/vo/DeviceLedgerRespVO.java | 4 +- .../admin/mold/MoldBrandController.java | 206 ++++++++++++ .../controller/admin/mold/MoldController.java | 94 ++++++ .../admin/mold/enums/OrgTypeStatusEnum.java | 35 ++ .../admin/mold/vo/MoldBrandPageReqVO.java | 60 ++++ .../admin/mold/vo/MoldBrandRespVO.java | 77 +++++ .../admin/mold/vo/MoldBrandSaveReqVO.java | 55 +++ .../admin/mold/vo/MoldPageReqVO.java | 69 ++++ .../admin/mold/vo/MoldProductRespVO.java | 37 +++ .../controller/admin/mold/vo/MoldRespVO.java | 87 +++++ .../admin/mold/vo/MoldSaveReqVO.java | 60 ++++ .../admin/mold/vo/OrgTypeConverter.java | 86 +++++ .../moldoperate/MoldOperateController.java | 12 +- .../moldrepair/MoldRepairController.java | 97 +++++- .../moldrepair/enums/RepairResultEnum.java | 38 +++ .../moldrepair/vo/MoldRepairLineRespVO.java | 58 ++++ .../vo/MoldRepairLineSaveReqVO.java | 48 +++ .../admin/moldrepair/vo/MoldRepairRespVO.java | 7 + .../moldrepair/vo/MoldRepairUpdateReqVO.java | 44 +++ .../MoldRepairTemsController.java | 2 +- .../MoldTicketManagementController.java | 157 ++++++++- .../vo/MoldTicketManagementPageReqVO.java | 9 +- .../vo/MoldTicketInspectionExportVO.java | 60 ++++ .../deviceledger/DeviceLedgerDO.java | 4 +- .../dal/dataobject/mold/MesMoldBrandDO.java | 76 +++++ .../mold/MesMoldBrandProductDO.java | 42 +++ .../mes/dal/dataobject/mold/MesMoldDO.java | 118 +++++++ .../dataobject/moldrepair/MoldRepairDO.java | 5 + .../moldrepair/MoldRepairLineDO.java | 5 + .../MoldTicketResultsDO.java | 11 +- .../dal/mysql/mold/MesMoldBrandMapper.java | 72 ++++ .../mysql/mold/MesMoldBrandProductMapper.java | 35 ++ .../mes/dal/mysql/mold/MesMoldMapper.java | 45 +++ .../MoldTicketResultsMapper.java | 4 +- .../mes/dal/redis/no/MesNoRedisDAO.java | 2 +- .../deviceledger/DeviceLedgerService.java | 2 +- .../deviceledger/DeviceLedgerServiceImpl.java | 12 +- .../mes/service/mold/MoldBrandService.java | 176 ++++++++++ .../service/mold/MoldBrandServiceImpl.java | 312 ++++++++++++++++++ .../module/mes/service/mold/MoldService.java | 99 ++++++ .../mes/service/mold/MoldServiceImpl.java | 104 ++++++ .../moldrecord/MoldRecordServiceImpl.java | 12 +- .../service/moldrepair/MoldRepairService.java | 38 ++- .../moldrepair/MoldRepairServiceImpl.java | 257 ++++++++++++++- .../moldrepairtems/MoldRepairTemsService.java | 2 +- .../MoldRepairTemsServiceImpl.java | 10 +- .../MoldTaskManagementServiceImpl.java | 8 +- .../MoldTicketManagementService.java | 6 + .../MoldTicketManagementServiceImpl.java | 44 +++ .../MoldTicketResultsMapper.xml | 24 +- 51 files changed, 2848 insertions(+), 86 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldBrandController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/enums/OrgTypeStatusEnum.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldProductRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/OrgTypeConverter.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/enums/RepairResultEnum.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairUpdateReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketresults/vo/MoldTicketInspectionExportVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandProductDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandProductMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldServiceImpl.java 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 9c86caad8..81a09dc56 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 @@ -95,6 +95,11 @@ public interface ErrorCodeConstants { ErrorCode MOLD_RETURN_NOT_EXISTS = new ErrorCode(5_0087, "模具入库不存在"); ErrorCode MOLD_OPERATE_NOT_EXISTS = new ErrorCode(5_0087, "模具上下模不存在"); + ErrorCode MOLD_REPAIR_NOT_EXISTS = new ErrorCode(5_0087, "模具维修记录不存在"); + ErrorCode MOLD_REPAIR_CODE_EXISTS = new ErrorCode(5_0087, "模具维修记录编码已存在"); + ErrorCode MOLD_REPAIR_LINE_NOT_EXISTS = new ErrorCode(5_0088, "模具维修子表记录不存在"); + ErrorCode MOLD_REPAIR_LINE_ID_NOT_EXISTS = new ErrorCode(5_0088, "模具维修子表记录Id为空"); + ErrorCode DV_CHECK_NOT_EXISTS = new ErrorCode(5_0087, "维保计划不存在"); @@ -107,7 +112,7 @@ public interface ErrorCodeConstants { ErrorCode DV_REPAIR_LINE_ID_NOT_EXISTS = new ErrorCode(5_0088, "设备维修子表记录Id为空"); - ErrorCode ZJ_TYPE_NOT_EXISTS = new ErrorCode(5_009, "检验类型不存在"); + ErrorCode ZJ_TYPE_NOT_EXISTS = new ErrorCode(5_0090, "检验类型不存在"); ErrorCode ZJ_ITEM_NOT_EXISTS = new ErrorCode(5_0091, "检验项目不存在"); ErrorCode ZJ_SCHEMA_NOT_EXISTS = new ErrorCode(5_0092, "检验方案不存在"); ErrorCode ZJ_PRODUCT_NOT_EXISTS = new ErrorCode(5_0093, "检验参数不存在"); 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 50fb3f205..3f064ea15 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 @@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; @@ -127,7 +127,7 @@ public class DeviceLedgerRespVO extends BaseDO { private List beijianList; @Schema(description = "模具列表") - private List moldList; + private List moldList; @Schema(description = "附件地址") @ExcelProperty("附件地址") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldBrandController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldBrandController.java new file mode 100644 index 000000000..9c1bd7166 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldBrandController.java @@ -0,0 +1,206 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.dal.dataobject.mold.MesMoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.service.mold.MoldBrandService; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 模具型号") +@RestController("mesMoldBrandController") +@RequestMapping("/mes/mold-brand") +@Validated +public class MoldBrandController { + + @Resource + private MoldBrandService moldBrandService; + + @PostMapping("/create") + @Operation(summary = "创建模具型号") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:create')") + public CommonResult createMoldBrand(@Valid @RequestBody MoldBrandSaveReqVO createReqVO) { + return success(moldBrandService.createMoldBrand(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新模具型号") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:update')") + public CommonResult updateMoldBrand(@Valid @RequestBody MoldBrandSaveReqVO updateReqVO) { + moldBrandService.updateMoldBrand(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除模具型号") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')") + public CommonResult deleteMoldBrand(@RequestParam("id") Long id) { + moldBrandService.deleteMoldBrand(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得模具型号") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult getMoldBrand(@RequestParam("id") Long id) { + MesMoldBrandDO moldBrand = moldBrandService.getMoldBrand(id); + return success(BeanUtils.toBean(moldBrand, MoldBrandRespVO.class)); + } + @GetMapping("/getBrandList") + @Operation(summary = "获得模具型号列表") + public CommonResult> getBrandList(MoldBrandPageReqVO pageReqVO) { + List brandDOList = moldBrandService.selectBy(pageReqVO); + return success(brandDOList); + } + @GetMapping("/page") + @Operation(summary = "获得模具型号分页") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult> getMoldBrandPage(@Valid MoldBrandPageReqVO pageReqVO) { + PageResult pageResult = moldBrandService.getMoldBrandPage(pageReqVO); + return success(pageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出模具型号 Excel") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMoldBrandExcel(@Valid MoldBrandPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = moldBrandService.getMoldBrandPage(pageReqVO).getList(); + List moldBrandRespVOS = BeanUtils.toBean(list, MoldBrandRespVO.class); + // 导出 Excel + ExcelUtils.write(response, "模具型号.xls", "数据", MoldBrandRespVO.class, moldBrandRespVOS); + } + + // ==================== 子表(模具) ==================== + @GetMapping("/getMoldList") + @Operation(summary = "获得模具型号") + public CommonResult> getMoldList(MesMoldDO moldDO) { + List doList = moldBrandService.selectBy(moldDO); + return success(doList); + } + + @GetMapping("/getMoldAllList") + @Operation(summary = "获得模具型号") + public CommonResult> getMoldAllList() { + List doList = moldBrandService.getAllList(); + return success(doList); + } + + @GetMapping("/mold/page") + @Operation(summary = "获得模具分页") + @Parameter(name = "brandId", description = "型号id") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult> getMoldPage(PageParam pageReqVO, @RequestParam(value = "brandId", required = false) Long brandId) { + return success(moldBrandService.getMoldPage(pageReqVO, brandId)); + } + + @GetMapping("/mold/list") + @Operation(summary = "获得模具列表") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult> getMoldList() { + List moldDOList = moldBrandService.getMoldList(); + return success(moldDOList); + } + + @PostMapping("/mold/create") + @Operation(summary = "创建模具") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:create')") + public CommonResult createMold(@Valid @RequestBody MesMoldDO mold) { + return success(moldBrandService.createMold(mold)); + } + + @PutMapping("/mold/update") + @Operation(summary = "更新模具") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:update')") + public CommonResult updateMold(@Valid @RequestBody MesMoldDO mold) { + moldBrandService.updateMold(mold); + return success(true); + } + + @DeleteMapping("/mold/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除模具") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')") + public CommonResult deleteMold(@RequestParam("id") Long id) { + moldBrandService.deleteMold(id); + return success(true); + } + + @GetMapping("/mold/get") + @Operation(summary = "获得模具") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult getMold(@RequestParam("id") Long id) { + return success(moldBrandService.getMold(id)); + } + + // ==================== 子表(模具产品) ==================== + + @GetMapping("/mold-brand-product/page") + @Operation(summary = "获得模具产品分页") + @Parameter(name = "brandId", description = "型号ID") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult> getMoldBrandProductPage(PageParam pageReqVO, + @RequestParam("brandId") Long brandId) { + PageResult pageResult = moldBrandService.getMoldBrandProductPage(pageReqVO, brandId); + PageResult result = new PageResult<>(moldBrandService.buildProduct(pageResult.getList()),pageResult.getTotal()); + return success(result); + } + + @PostMapping("/mold-brand-product/create") + @Operation(summary = "创建模具产品") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:create')") + public CommonResult createMoldBrandProduct(@Valid @RequestBody MesMoldBrandProductDO moldBrandProduct) { + return success(moldBrandService.createMoldBrandProduct(moldBrandProduct)); + } + + @PutMapping("/mold-brand-product/update") + @Operation(summary = "更新模具产品") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:update')") + public CommonResult updateMoldBrandProduct(@Valid @RequestBody MesMoldBrandProductDO moldBrandProduct) { + moldBrandService.updateMoldBrandProduct(moldBrandProduct); + return success(true); + } + + @DeleteMapping("/mold-brand-product/delete") + @Parameter(name = "id", description = "编号", required = true) + @Operation(summary = "删除模具产品") + @PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')") + public CommonResult deleteMoldBrandProduct(@RequestParam("id") Long id) { + moldBrandService.deleteMoldBrandProduct(id); + return success(true); + } + + @GetMapping("/mold-brand-product/get") + @Operation(summary = "获得模具产品") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + public CommonResult getMoldBrandProduct(@RequestParam("id") Long id) { + return success(moldBrandService.getMoldBrandProduct(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/controller/admin/mold/MoldController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldController.java new file mode 100644 index 000000000..9cd46dadd --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/MoldController.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.service.mold.MoldService; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 模具") +@RestController("mesMoldController") +@RequestMapping("/mes/mold") +@Validated +public class MoldController { + + @Resource + private MoldService moldService; + + + @PostMapping("/create") + @Operation(summary = "创建模具") + @PreAuthorize("@ss.hasPermission('erp:mold:create')") + public CommonResult createMold(@Valid @RequestBody MoldSaveReqVO createReqVO) { + return success(moldService.createMold(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新模具") + @PreAuthorize("@ss.hasPermission('erp:mold:update')") + public CommonResult updateMold(@Valid @RequestBody MoldSaveReqVO updateReqVO) { + moldService.updateMold(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除模具") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:mold:delete')") + public CommonResult deleteMold(@RequestParam("id") Long id) { + moldService.deleteMold(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得模具") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:mold:query')") + public CommonResult getMold(@RequestParam("id") Long id) { + MesMoldDO mold = moldService.getMold(id); + return success(BeanUtils.toBean(mold, MoldRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得模具分页") + @PreAuthorize("@ss.hasPermission('erp:mold:query')") + public CommonResult> getMoldPage(@Valid MoldPageReqVO pageReqVO) { + PageResult pageResult = moldService.getMoldPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MoldRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出模具 Excel") + @PreAuthorize("@ss.hasPermission('erp:mold:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMoldExcel(@Valid MoldPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = moldService.getMoldPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "模具.xls", "数据", MoldRespVO.class, + BeanUtils.toBean(list, MoldRespVO.class)); + } + +} \ 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/mold/enums/OrgTypeStatusEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/enums/OrgTypeStatusEnum.java new file mode 100644 index 000000000..4168438bf --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/enums/OrgTypeStatusEnum.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrgTypeStatusEnum { + zhijiang("zhijiang", "制浆"), + duidie("duidie", "堆叠"), + chengxing("chengxing", "成型"), + honggan("honggan", "烘干"), + zhuanyi("zhuanyi", "转移"), + jiashi("jiashi", "加湿"), + reya("reya", "热压"), + qiebian("qiebian", "切边"), + pinjian("pinjian", "品检"), + dabao("dabao", "打包"), + tiebiao("tiebiao", "贴标"), + sufeng("sufeng", "塑封"), + pinyin("pinyin", "品印"); + + private final String orgtype; + private final String description; + + public static OrgTypeStatusEnum getByCode(String code) { + for (OrgTypeStatusEnum status : values()) { + if (status.getOrgtype().equals(code)) { + return status; + } + } + return null; + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandPageReqVO.java new file mode 100644 index 000000000..7e061a684 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandPageReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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 MoldBrandPageReqVO extends PageParam { + + @Schema(description = "型号编码") + private String code; + + @Schema(description = "型号名称", example = "王五") + private String name; + + @Schema(description = "规格", example = "2") + private String moldType; + + @Schema(description = "产品ID", example = "2336") + private Long productId; + + @Schema(description = "预期寿命(小时)") + private BigDecimal useTime; + + @Schema(description = "维保模式", example = "2") + private Integer maintainType; + + @Schema(description = "维保周期") + private BigDecimal maintainTime; + + @Schema(description = "模具系数") + private Long moldSize; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "工序", example = "你说的对") + private String orgType; + + @Schema(description = "id集合导出用") + private String ids; +} \ 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/mold/vo/MoldBrandRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandRespVO.java new file mode 100644 index 000000000..97813445d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandRespVO.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + + +@Schema(description = "管理后台 - 模具型号 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MoldBrandRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24140") + @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 = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("规格") + private String moldType; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336") + private Long productId; + @Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336") +// @ExcelProperty("产品") + private String productName; + + @Schema(description = "预期寿命/次") + @ExcelProperty("预期寿命/次") + private BigDecimal useTime; + + @Schema(description = "维保模式", example = "2") +// @ExcelProperty(value = "维保模式", converter = DictConvert.class) + @DictFormat("maintain_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer maintainType; + + @Schema(description = "维保周期") +// @ExcelProperty("维保周期") + private BigDecimal maintainTime; + + @Schema(description = "模穴数", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("模穴数") + private Long moldSize; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + @ColumnWidth(20) + private LocalDateTime createTime; + + @Schema(description = "工序", example = "reya") + @ExcelProperty(value = "工序", converter = DictConvert.class) + @DictFormat("mes_org_type") + private String orgType; +// , converter = OrgTypeConverter.class +} \ 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/mold/vo/MoldBrandSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandSaveReqVO.java new file mode 100644 index 000000000..74a672b8f --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldBrandSaveReqVO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 模具型号新增/修改 Request VO") +@Data +public class MoldBrandSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24140") + 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 = "规格", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotEmpty(message = "规格不能为空") + private String moldType; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336") +// @NotNull(message = "产品ID不能为空") + private Long productId; + + @Schema(description = "预期寿命(小时)") + private BigDecimal useTime; + + @Schema(description = "维保模式", example = "2") + private Integer maintainType; + + @Schema(description = "维保周期") + private BigDecimal maintainTime; + + @Schema(description = "模穴数", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "模穴数不能为空") + private Long moldSize; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + @Schema(description = "工序", example = "你说的对") + private String orgType; + +} \ 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/mold/vo/MoldPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldPageReqVO.java new file mode 100644 index 000000000..3a50cd2b0 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldPageReqVO.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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 MoldPageReqVO extends PageParam { + + @Schema(description = "模具编码") + private String code; + + @Schema(description = "模具名称", example = "芋艿") + private String name; + + @Schema(description = "单位ID", example = "19527") + private Long unitId; + + @Schema(description = "设备ID", example = "24428") + private Long machineId; + + @Schema(description = "设备名称", example = "24428") + private String machineName; + + @Schema(description = "使用次数/次") + private BigDecimal useTime; + + @Schema(description = "入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] inTime; + + @Schema(description = "状态", example = "1") + private Integer status; + + @Schema(description = "模具图片") + private String images; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "型号id", example = "15258") + private Long brandId; + + @Schema(description = "id集合导出用") + private String ids; + + + @Schema(description = "附件地址") + private String fileUrl; + +} \ 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/mold/vo/MoldProductRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldProductRespVO.java new file mode 100644 index 000000000..f07f96338 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldProductRespVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 模具 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MoldProductRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336") + private Long productId; + @Schema(description = "产品", requiredMode = Schema.RequiredMode.REQUIRED, example = "2336") + @ExcelProperty("产品") + private String productName; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258") + @ExcelProperty("型号id") + private Long brandId; +} \ 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/mold/vo/MoldRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldRespVO.java new file mode 100644 index 000000000..208d5660d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldRespVO.java @@ -0,0 +1,87 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - 模具 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MoldRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278") + @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 = "19527") + private Long unitId; + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") +// @ExcelProperty("单位") + private String unitName; + + @Schema(description = "设备ID", example = "24428") + private Long machineId; + + @Schema(description = "设备名称", example = "24428") + @ExcelProperty("使用设备") + private String machineName; + + @Schema(description = "使用次数/次") + @ExcelProperty("使用次数/次") + private BigDecimal useTime; + + @Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime inTime; + + @Schema(description = "状态", example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat("erp_mold_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "模具图片") +// @ExcelProperty("模具图片") + private String images; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) +// @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258") + private Long brandId; + + @Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258") + @ExcelProperty("型号") + private String brandName; + + @Schema(description = "附件地址") + @ExcelProperty("附件地址") + private String fileUrl; + +} \ 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/mold/vo/MoldSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldSaveReqVO.java new file mode 100644 index 000000000..e5a802900 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/MoldSaveReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 模具新增/修改 Request VO") +@Data +public class MoldSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32278") + 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 = "单位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19527") +// @NotNull(message = "单位ID不能为空") + private Long unitId; + + @Schema(description = "机台ID", example = "24428") + private Long machineId; + + @Schema(description = "使用次数/次") + private BigDecimal useTime; + + @Schema(description = "入库时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库时间不能为空") + private LocalDateTime inTime; + + @Schema(description = "状态", example = "1") + private Integer status; + + @Schema(description = "模具图片") + private String images; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + + @Schema(description = "型号id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15258") +// @NotNull(message = "型号id不能为空") + private Long brandId; + + @Schema(description = "附件地址") + private String fileUrl; + +} \ 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/mold/vo/OrgTypeConverter.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/OrgTypeConverter.java new file mode 100644 index 000000000..60269dd5d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mold/vo/OrgTypeConverter.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.mes.controller.admin.mold.vo; + +import cn.iocoder.yudao.module.mes.controller.admin.mold.enums.OrgTypeStatusEnum; +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("mesOrgTypeConverter") +public class OrgTypeConverter implements Converter { // 泛型改为 String,对应英文字符串 + + /** + * 读取Excel时调用(Excel中的英文/中文 → Java对象的英文字符串) + */ + @Override + public String convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String cellValue = cellData.getStringValue(); + if (cellValue == null || cellValue.trim().isEmpty()) { + return null; + } + + // 优先匹配中文 → 转换为对应的英文常量名 + for (OrgTypeStatusEnum status : OrgTypeStatusEnum.values()) { + if (status.getDescription().equals(cellValue)) { // 注意枚举的描述方法是 getDesc + return status.name(); // 返回枚举的英文常量名(如 IN_USE) + } + } + + // 匹配英文 → 直接返回(兼容Excel中填英文的场景) + for (OrgTypeStatusEnum status : OrgTypeStatusEnum.values()) { + if (status.name().equals(cellValue)) { + return cellValue; + } + } + + // 无匹配则抛出异常 + throw new IllegalArgumentException("设备状态格式错误: " + cellValue + ",仅支持中文(在机/在库/维修中/保养中/报废)或英文(IN_USE/IN_STOCK/UNDER_REPAIR/UNDER_MAINTENANCE/SCRAPPED)"); + } + + /** + * 写入Excel时调用(Java对象的英文字符串 → Excel中的中文) + */ + @Override + public WriteCellData convertToExcelData(String value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (value == null || value.trim().isEmpty()) { + return new WriteCellData<>(""); + } + + // 根据英文常量名匹配枚举,转换为中文 + OrgTypeStatusEnum status = null; + try { + status = OrgTypeStatusEnum.valueOf(value); // 通过英文名称获取枚举 + } catch (IllegalArgumentException e) { + // 若英文匹配失败,尝试兜底匹配中文(兼容异常场景) + for (OrgTypeStatusEnum s : OrgTypeStatusEnum.values()) { + if (s.getDescription().equals(value)) { + status = s; + break; + } + } + } + + String text = status != null ? status.getDescription() : "未知"; + return new WriteCellData<>(text); + } + + // 必须实现的接口方法:指定转换的Java类型 + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + // 必须实现的接口方法:指定Excel单元格类型 + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } +} \ 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/moldoperate/MoldOperateController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldoperate/MoldOperateController.java index c42384d4d..c67fc1fb6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldoperate/MoldOperateController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldoperate/MoldOperateController.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.moldoperate; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO; -import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldSaveReqVO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO; -import cn.iocoder.yudao.module.erp.service.mold.MoldService; +import cn.iocoder.yudao.module.mes.service.mold.MoldService; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; @@ -66,7 +66,7 @@ public class MoldOperateController { public CommonResult createMoldOperate(@Valid @RequestBody MoldOperateSaveReqVO createReqVO) { if (Objects.equals(createReqVO.getOperateType(), "1")) { DeviceLedgerDO deviceLedger = deviceLedgerService.getDeviceLedger(createReqVO.getDeviceId()); - MoldDO moldDO = moldService.getMold(createReqVO.getMoldId()); + MesMoldDO moldDO = moldService.getMold(createReqVO.getMoldId()); moldDO.setMachineId(createReqVO.getDeviceId()); moldDO.setMachineName(deviceLedger.getDeviceName()); moldDO.setStatus(0); // 在机 0 在库 1 @@ -76,7 +76,7 @@ public class MoldOperateController { } else { DeviceLedgerDO deviceLedger = deviceLedgerService.getDeviceLedger(createReqVO.getDeviceId()); createReqVO.setMoldId(Long.parseLong(deviceLedger.getMoldId())); - MoldDO moldDO = moldService.getMold(Long.parseLong(deviceLedger.getMoldId())); + MesMoldDO moldDO = moldService.getMold(Long.parseLong(deviceLedger.getMoldId())); moldDO.setMachineId(0L); moldDO.setMachineName(""); moldDO.setStatus(3); // 在机 0 在库 1 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java index 137199aa8..134291575 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java @@ -6,9 +6,10 @@ 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.moldrepair.vo.MoldRepairPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; import cn.iocoder.yudao.module.mes.service.moldrepair.MoldRepairService; @@ -25,6 +26,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -32,7 +36,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -@Tag(name = "管理后台 - 设备维修记录") +@Tag(name = "管理后台 - 模具维修记录") @RestController @RequestMapping("/mes/mold-repair") @Validated @@ -45,14 +49,14 @@ public class MoldRepairController { private AdminUserApi adminUserApi; @PostMapping("/create") - @Operation(summary = "创建设备维修记录") + @Operation(summary = "创建模具维修记录") @PreAuthorize("@ss.hasPermission('mes:mold-repair:create')") public CommonResult createMoldRepair(@Valid @RequestBody MoldRepairSaveReqVO createReqVO) { return success(moldRepairService.createMoldRepair(createReqVO)); } @PutMapping("/update") - @Operation(summary = "更新设备维修记录") + @Operation(summary = "更新模具维修记录") @PreAuthorize("@ss.hasPermission('mes:mold-repair:update')") public CommonResult updateMoldRepair(@Valid @RequestBody MoldRepairSaveReqVO updateReqVO) { moldRepairService.updateMoldRepair(updateReqVO); @@ -60,7 +64,7 @@ public class MoldRepairController { } @DeleteMapping("/delete") - @Operation(summary = "删除设备维修记录") + @Operation(summary = "删除模具维修记录") @Parameter(name = "ids", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:mold-repair:delete')") public CommonResult deleteMoldRepair(@RequestParam("ids") String ids) { @@ -75,7 +79,7 @@ public class MoldRepairController { } @GetMapping("/get") - @Operation(summary = "获得设备维修记录") + @Operation(summary = "获得模具维修记录") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:mold-repair:query')") public CommonResult getMoldRepair(@RequestParam("id") Long id) { @@ -84,7 +88,7 @@ public class MoldRepairController { } @GetMapping("/page") - @Operation(summary = "获得设备维修记录分页") + @Operation(summary = "获得模具维修记录分页") @PreAuthorize("@ss.hasPermission('mes:mold-repair:query')") public CommonResult> getMoldRepairPage(@Valid MoldRepairPageReqVO pageReqVO) { PageResult pageResult = moldRepairService.getMoldRepairPage(pageReqVO); @@ -93,7 +97,7 @@ public class MoldRepairController { } @GetMapping("/export-excel") - @Operation(summary = "导出设备维修记录 Excel") + @Operation(summary = "导出模具维修记录 Excel") @PreAuthorize("@ss.hasPermission('mes:mold-repair:export')") @ApiAccessLog(operateType = EXPORT) public void exportMoldRepairExcel(@Valid MoldRepairPageReqVO pageReqVO, @@ -114,22 +118,89 @@ public class MoldRepairController { moldSubjectRespVO.setStatusName(moldSubjectRespVO.getStatus() != null ? (moldSubjectRespVO.getStatus() == 0 ? "待完成" : "已完成") : null); } + if (moldSubjectRespVO.getRepairStatus() !=null) { + moldSubjectRespVO.setRepairStatusName(moldSubjectRespVO.getRepairStatus() != null ? + (moldSubjectRespVO.getRepairStatus() == 1 ? "通过" : "不通过") : null); + } } // 导出 Excel - ExcelUtils.write(response, "设备维修记录.xls", "数据", MoldRepairRespVO.class,moldRepairRespVOList); + ExcelUtils.write(response, "模具维修记录.xls", "数据", MoldRepairRespVO.class,moldRepairRespVOList); } - // ==================== 子表(设备维修记录行) ==================== + // ==================== 子表(模具维修记录行) ==================== @GetMapping("/mold-repair-line/list-by-repair-id") - @Operation(summary = "获得设备维修记录行列表") + @Operation(summary = "获得模具维修记录行列表") @Parameter(name = "repairId", description = "维修单ID") @PreAuthorize("@ss.hasPermission('mes:mold-repair:query')") public CommonResult> getMoldRepairLineListByRepairId(@RequestParam("repairId") Long repairId) { return success(moldRepairService.getMoldRepairLineListByRepairId(repairId)); } + @PostMapping("/updateRepairLine") + @Operation(summary = "更新模具维修子表") + @PreAuthorize("@ss.hasPermission('mes:mold-repair:update')") + public CommonResult updateRepairLine(@Valid @RequestBody MoldRepairLineSaveReqVO updateReqVO) { + moldRepairService.updateRepairLine(updateReqVO); + return success(true); + } + + @PutMapping("/updateMoldRepairStatus") + @Operation(summary = "更新模具维修子记录状态") + @PreAuthorize("@ss.hasPermission('mes:mold-repair:update')") + public CommonResult updateMoldRepairStatus(@Valid @RequestBody MoldRepairUpdateReqVO updateReqVO) { + moldRepairService.updateMoldRepairStatus(updateReqVO); + return success(true); + } + + + @PutMapping("/batchUpdate") + @Operation(summary = "批量更新维修检验结果") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:update')") + public CommonResult batchUpdateTicketResults( + @Valid @RequestBody List updateReqVOList) { + moldRepairService.batchUpdateTicketResults(updateReqVOList); + return success(true); + } + + + @GetMapping("/getRepairListByMoldId") + @Operation(summary = "根据模具Id获得维修历史记录") + @Parameter(name = "moldId", description = "模具Id", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:ticket-management:query')") + public CommonResult> getRepairListByMoldId(@RequestParam("moldId") Long moldId, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime) { + List moldRepairDOList = moldRepairService.getRepairListByMoldId(moldId,startTime,endTime,null); + return success(moldRepairDOList); + } + + + + @GetMapping("/export-repair-excel") + @Operation(summary = "导出维修历史记录 Excel") + @PreAuthorize("@ss.hasPermission('mes:ticket-results:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportRepairExcel(@RequestParam("moldId") Long moldId, + @RequestParam(name = "ids",required = false) String ids, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime, + HttpServletResponse response) throws IOException { + + // 查询数据 + List moldRepairDOList = moldRepairService.getRepairListByMoldId(moldId,startTime,endTime,ids); + + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("维修记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("维修记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + ExcelUtils.write(response, fileName, "维修记录", MoldRepairLineRespVO.class, moldRepairDOList); + } + private PageResult buildCreatorName(PageResult moldSubjectRespVOPageResult) { for (MoldRepairRespVO moldSubjectRespVO : moldSubjectRespVOPageResult.getList()) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/enums/RepairResultEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/enums/RepairResultEnum.java new file mode 100644 index 000000000..3a1737b7b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/enums/RepairResultEnum.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 维修结果状态枚举 + */ +@Getter +@AllArgsConstructor +public enum RepairResultEnum { + PENDING(0, "待维修"), + PASS(1, "OK"), + FAIL(2, "NG"); + + private final Integer code; + private final String desc; + + public Integer getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + public static String getDescByCode(Integer code) { + if (code == null) { + return ""; + } + for (RepairResultEnum value : values()) { + if (value.code.equals(code)) { + return value.desc; + } + } + return "未知"; + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineRespVO.java new file mode 100644 index 000000000..adc5bdede --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineRespVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo; + + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 模具维修记录 Resp VO") +@Data +@ExcelIgnoreUnannotated +public class MoldRepairLineRespVO { + + @Schema(description = "项目行Id") + private Long id; + + @Schema(description = "维修单编号") + @ExcelProperty("维修单编号") + private String repairCode; + + @Schema(description = "维修单名称") + @ExcelProperty("维修单名称") + private String repairName; + + @Schema(description = "维修完成日期") + @ExcelProperty("维修完成日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime finishDate; + + @Schema(description = "项目编码") + @ExcelProperty("项目编码") + private String subjectCode; + + @Schema(description = "项目名称") + @ExcelProperty("项目名称") + private String subjectName; + + @Schema(description = "项目内容") + @ExcelProperty("项目内容") + private String subjectContent; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "维修结果 0-待维修 1-通过 2-不通过") + private Integer result; + + @Schema(description = "维修结果") + @ExcelProperty("维修结果") + private String repairResult; + + + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineSaveReqVO.java new file mode 100644 index 000000000..6513fac8d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairLineSaveReqVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Schema(description = "管理后台 - 模具维修记录子表/修改 Request VO") +@Data +public class MoldRepairLineSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27809") + private Long id; + + @Schema(description = "维修单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long repairId; + + @Schema(description = "项目ID") + private Long subjectId; + + @Schema(description = "项目编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "6979") + private String subjectCode; + + @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String subjectName; + + @Schema(description = "项目类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + private String subjectType; + + @Schema(description = "项目内容") + private String subjectContent; + + @Schema(description = "标准") + private String subjectStandard; + + @Schema(description = "故障描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "1622") + private String malfunction; + + @Schema(description = "故障描述资源") + private String malfunctionUrl; + + @Schema(description = "维修情况") + private String repairDes; + + @Schema(description = "备注") + private String remark; + @Schema(description = "维修结果 0-待维修 1-通过 2-不通过") + private Integer result; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairRespVO.java index b9911f351..08eb499d9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairRespVO.java @@ -109,5 +109,12 @@ public class MoldRepairRespVO { @Schema(description = "关键件Id", example = "你猜") private Long componentId; + @Schema(description = "维修状态 0-待完成 1-通过 2-不通过") + private Integer repairStatus; + + @Schema(description = "维修状态") + @ExcelProperty("维修状态") + private String repairStatusName; + } \ 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/moldrepair/vo/MoldRepairUpdateReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairUpdateReqVO.java new file mode 100644 index 000000000..90b93bb4d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/vo/MoldRepairUpdateReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + + +@Schema(description = "管理后台 - 设备维修更新子记录 Req VO") +@Data +public class MoldRepairUpdateReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27809") + @NotNull + private Long id; + + @Schema(description = "报修日期") + @NotNull(message = "报修日期不能为空") + private LocalDateTime requireDate; + + @Schema(description = "完成日期") + @NotNull(message = "完成日期不能为空") + private LocalDateTime finishDate; + + @Schema(description = "验收日期") + @NotNull(message = "验收日期不能为空") + private LocalDateTime confirmDate; + + @Schema(description = "维修结果") + @NotBlank(message = "维修结果不能为空") + private String repairResult; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "子列表") + @NotNull(message = "子列表不能为空") + private List updateReqVOList; + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepairtems/MoldRepairTemsController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepairtems/MoldRepairTemsController.java index 9998bd5c1..e02e017ef 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepairtems/MoldRepairTemsController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepairtems/MoldRepairTemsController.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.moldrepairtems; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/MoldTicketManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/MoldTicketManagementController.java index a67dfce9b..1e7c4db94 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/MoldTicketManagementController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/MoldTicketManagementController.java @@ -1,8 +1,16 @@ package cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement; -import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.vo.MoldTicketInspectionExportVO; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.InspectionResultEnum; +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketInspectionExportVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; +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 org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -14,8 +22,12 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.io.IOException; +import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -44,6 +56,9 @@ public class MoldTicketManagementController { @Resource private AdminUserApi adminUserApi; + @Resource + private DictDataApi dictDataApi; + @PostMapping("/create") @Operation(summary = "创建工单管理") @PreAuthorize("@ss.hasPermission('mes:mold-ticket-management:create')") @@ -124,4 +139,144 @@ public class MoldTicketManagementController { } return moldticketManagementRespVOPageResult; } + + + @GetMapping("/getInspectionByMoldId") + @Operation(summary = "根据模具Id获得点检历史记录") + @Parameter(name = "moldId", description = "模具Id", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:mold-ticket-management:query')") + public CommonResult< List> getInspectionByMoldId(@RequestParam("moldId") Long moldId, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime) { + List moldTicketResultsDOList = moldticketManagementService.getInspectionByMoldId(moldId,startTime,endTime,""); + return success(moldTicketResultsDOList); + } + + @GetMapping("/export-excel-inspection") + @Operation(summary = "导出点检历史记录 Excel") + @PreAuthorize("@ss.hasPermission('mes:mold-ticket-results:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMoldTicketResultsExcel(@RequestParam("moldId") Long moldId, + @RequestParam(name = "ids",required = false) String ids, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime, + HttpServletResponse response) throws IOException { + + // 查询数据 + List results = moldticketManagementService.getInspectionByMoldId(moldId, startTime, endTime, ids); + + // 转换为VO并处理数据 + List exportVos = results.stream() + .map(this::convertToExportVO) + .collect(Collectors.toList()); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("点检记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("点检记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + ExcelUtils.write(response, fileName, "点检记录", MoldTicketInspectionExportVO.class, exportVos); + } + + + @GetMapping("/getMaintenanceByMoldId") + @Operation(summary = "根据模具Id获得保养历史记录") + @Parameter(name = "moldId", description = "模具Id", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:mold_ticket-management:query')") + public CommonResult> getMaintenanceByMoldId(@RequestParam("moldId") Long moldId, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime) { + List moldticketResultsDOList = moldticketManagementService.getMaintenanceByMoldId(moldId,startTime,endTime,""); + return success(moldticketResultsDOList); + } + + + @GetMapping("/export-excel-maintenance") + @Operation(summary = "导出保养历史记录 Excel") + @PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportExcelMaintenance(@RequestParam("moldId") Long moldId, + @RequestParam(name = "ids",required = false) String ids, + @RequestParam(name = "startTime",required = false) String startTime, + @RequestParam(name = "endTime",required = false) String endTime, + HttpServletResponse response) throws IOException { + + // 查询数据 + List results = moldticketManagementService.getMaintenanceByMoldId(moldId, startTime, endTime, ids); + + // 转换为VO并处理数据 + List exportVos = results.stream() + .map(this::convertToExportVO) + .collect(Collectors.toList()); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("保养记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("保养记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + ExcelUtils.write(response, fileName, "保养记录", MoldTicketInspectionExportVO.class, exportVos); + } + + + + /** + * 获取字典数据 + */ + 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); + + } catch (Exception e) { + throw new RuntimeException("获取字典数据异常:" + e); + } + + return dictData; + } + + /** + * 数据转换 + */ + private MoldTicketInspectionExportVO convertToExportVO(MoldTicketResultsDO record) { + MoldTicketInspectionExportVO vo = BeanUtils.toBean(record, MoldTicketInspectionExportVO.class); + + // 转换检验结果 + if (record.getInspectionResult() != null) { + vo.setResult(record.getInspectionResult().equals(InspectionResultEnum.OK.getCode()) ? InspectionResultEnum.OK.getLabel() : + record.getInspectionResult().equals(InspectionResultEnum.NG.getCode()) ? InspectionResultEnum.NG.getLabel() : String.valueOf(record.getInspectionResult())); + } + + // 处理操作人信息 + if (StringUtils.isNotBlank(record.getOperator())) { + try { + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(record.getOperator())); + if (user != null) { + vo.setOperator("(" + user.getUsername() + ")" + user.getNickname()); + } + } catch (Exception e) { + // 转换失败保持原值 + } + } + + // 处理检验方式字典 + if (StringUtils.isNotBlank(record.getInspectionMethod())) { + Map> dictData = getDictData(); + String methodLabel = dictData.getOrDefault("Inspection_method", Collections.emptyMap()) + .get(record.getInspectionMethod()); + if (StringUtils.isNotBlank(methodLabel)) { + vo.setInspectionMethod(methodLabel); + } + } + + return vo; + } } \ 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/moldticketmanagement/vo/MoldTicketManagementPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/vo/MoldTicketManagementPageReqVO.java index a4afba546..8389b8c0c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/vo/MoldTicketManagementPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketmanagement/vo/MoldTicketManagementPageReqVO.java @@ -53,14 +53,11 @@ public class MoldTicketManagementPageReqVO extends PageParam { private String ids; - /** - * 作业开始时间 - */ + @Schema(description = "作业开始时间") private String taskTime; - /** - * 作业结束时间 - */ + @Schema(description = "作业结束时间") 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/moldticketresults/vo/MoldTicketInspectionExportVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketresults/vo/MoldTicketInspectionExportVO.java new file mode 100644 index 000000000..e35c89094 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldticketresults/vo/MoldTicketInspectionExportVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +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.Data; + +import java.time.LocalDateTime; + +@Data +@ExcelIgnoreUnannotated +public class MoldTicketInspectionExportVO { + +// @ExcelProperty("设备编号") +// private String deviceCode; +// +// @ExcelProperty("设备名称") +// private String deviceName; + + @ExcelProperty("检验项名称") + private String inspectionItemName; + + @ExcelProperty("检验方式") + private String inspectionMethod; + + @ExcelProperty("判定基准") + private String judgmentCriteria; + + @ExcelProperty("点检时间") + @ColumnWidth(20) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime taskTime; + + @ExcelProperty("作业结果") + private String result; + + @ExcelProperty("备注") + private String remark; + + private Integer inspectionResult; + + @ExcelProperty("作业人") + private String operator; + + @ExcelProperty("创建时间") + @ColumnWidth(20) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + 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/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 ab7705a57..84e6f3039 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,6 +1,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; @@ -156,6 +156,6 @@ public class DeviceLedgerDO extends BaseDO { * 模具列表 */ @TableField(exist = false) - private List moldList; + private List moldList; } \ 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/mold/MesMoldBrandDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandDO.java new file mode 100644 index 000000000..a714cf2b4 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.mold; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 模具型号 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_mold_brand") +@KeySequence("erp_mold_brand_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMoldBrandDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 型号编码 + */ + private String code; + /** + * 型号名称 + */ + private String name; + /** + * 规格 + */ + private String moldType; + /** + * 产品ID + */ + private Long productId; + /** + * 预期寿命(小时) + */ + private BigDecimal useTime; + /** + * 维保模式 + * + * 枚举 {@link TODO maintain_type 对应的类} + */ + private Integer maintainType; + /** + * 维保周期 + */ + private BigDecimal maintainTime; + /** + * 模具系数 + */ + private Long moldSize; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + */ + private Boolean isEnable; + +// @Schema(description = "工序", example = "你说的对") + private String orgType; +} \ 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/mold/MesMoldBrandProductDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandProductDO.java new file mode 100644 index 000000000..601051e1b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldBrandProductDO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.mold; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 模具产品 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_mold_brand_product") +@KeySequence("erp_mold_brand_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMoldBrandProductDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 型号ID + */ + private Long brandId; + /** + * 产品ID + */ + private Long productId; + /** + * 备注 + */ + private String remark; + +} \ 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/mold/MesMoldDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldDO.java new file mode 100644 index 000000000..6ef80b777 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mold/MesMoldDO.java @@ -0,0 +1,118 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.mold; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 模具 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_mold") +@KeySequence("erp_mold_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMoldDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 模具编码 + */ + private String code; + /** + * 模具名称 + */ + private String name; + /** + * 单位ID + */ + private Long unitId; + /** + * 设备ID + */ + private Long machineId; + /** + * 设备名称 + */ + private String machineName; + /** + * 使用时间(小时) + */ + private BigDecimal useTime; + /** + * 入库时间 + */ + private LocalDateTime inTime; + /** + * 状态 + * + * 枚举 {@link TODO erp_mold_status 对应的类} + */ + private Integer status; + /** + * 模具图片 + */ + private String images; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + */ + private Boolean isEnable; + /** + * 型号id + */ + private Long brandId; + + + private String fileUrl; + + /** + * 点检列表 + */ + @TableField(exist = false) + private List inspectionList; + + /** + * 保养列表 + */ + @TableField(exist = false) + private List maintainList; + + /** + * 维修列表 + */ + @TableField(exist = false) + private Map> repairList; + + @TableField(exist = false) + private String orgType; + @TableField(exist = false) + private Long moldSize; + @TableField(exist = false) + private String brandName; + @TableField(exist = false) + private String moldType; + +} \ 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/moldrepair/MoldRepairDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairDO.java index c40f70bfd..29c7a78af 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairDO.java @@ -114,4 +114,9 @@ public class MoldRepairDO extends BaseDO { */ private Long componentId; + /** + * 维修结果 0-待维修 1-通过 2-不通过 + */ + private Integer repairStatus; + } \ 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/moldrepair/MoldRepairLineDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairLineDO.java index aed8c3b19..18379dd3b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairLineDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldrepair/MoldRepairLineDO.java @@ -72,4 +72,9 @@ public class MoldRepairLineDO extends BaseDO { */ private String remark; + /** + * 维修结果 0-待维修 1-通过 2-不通过 + */ + private Integer result; + } \ 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/moldticketresults/MoldTicketResultsDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldticketresults/MoldTicketResultsDO.java index 847a6c85d..cec628d8c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldticketresults/MoldTicketResultsDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/moldticketresults/MoldTicketResultsDO.java @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults; 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; @@ -65,4 +63,13 @@ public class MoldTicketResultsDO extends BaseDO { */ private Long moldId; + /** + * 作业时间 + */ + @TableField(exist = false) + private LocalDateTime taskTime; + + @TableField(exist = false) + private String operator; + } \ 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/mold/MesMoldBrandMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandMapper.java new file mode 100644 index 000000000..9628c4abc --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandMapper.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.mold; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldBrandPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; +import com.alibaba.excel.util.StringUtils; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 模具型号 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface MesMoldBrandMapper extends BaseMapperX { + + default PageResult selectPage(MoldBrandPageReqVO reqVO) { + + LambdaQueryWrapperX moldBrandDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>(); + moldBrandDOLambdaQueryWrapperX + .eqIfPresent(MesMoldBrandDO::getCode, reqVO.getCode()) + .likeIfPresent(MesMoldBrandDO::getName, reqVO.getName()) + .eqIfPresent(MesMoldBrandDO::getMoldType, reqVO.getMoldType()) + .eqIfPresent(MesMoldBrandDO::getProductId, reqVO.getProductId()) + .eqIfPresent(MesMoldBrandDO::getUseTime, reqVO.getUseTime()) + .eqIfPresent(MesMoldBrandDO::getMaintainType, reqVO.getMaintainType()) + .eqIfPresent(MesMoldBrandDO::getMaintainTime, reqVO.getMaintainTime()) + .eqIfPresent(MesMoldBrandDO::getMoldSize, reqVO.getMoldSize()) + .eqIfPresent(MesMoldBrandDO::getRemark, reqVO.getRemark()) + .eqIfPresent(MesMoldBrandDO::getIsEnable, reqVO.getIsEnable()) + .eqIfPresent(MesMoldBrandDO::getOrgType, reqVO.getOrgType()) + .betweenIfPresent(MesMoldBrandDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesMoldBrandDO::getId); + + // 单独处理 ids 条件 + if (StringUtils.isNotBlank(reqVO.getIds())) { + List idList = Arrays.stream(reqVO.getIds().split(",")) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + moldBrandDOLambdaQueryWrapperX.in(MesMoldBrandDO::getId, idList); + } + + return selectPage(reqVO, moldBrandDOLambdaQueryWrapperX); + + + + + } + default List selectBy(MoldBrandPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesMoldBrandDO::getCode, reqVO.getCode()) + .likeIfPresent(MesMoldBrandDO::getName, reqVO.getName()) + .eqIfPresent(MesMoldBrandDO::getMoldType, reqVO.getMoldType()) + .eqIfPresent(MesMoldBrandDO::getProductId, reqVO.getProductId()) + .eqIfPresent(MesMoldBrandDO::getUseTime, reqVO.getUseTime()) + .eqIfPresent(MesMoldBrandDO::getMaintainType, reqVO.getMaintainType()) + .eqIfPresent(MesMoldBrandDO::getMaintainTime, reqVO.getMaintainTime()) + .eqIfPresent(MesMoldBrandDO::getMoldSize, reqVO.getMoldSize()) + .eqIfPresent(MesMoldBrandDO::getRemark, reqVO.getRemark()) + .eqIfPresent(MesMoldBrandDO::getIsEnable, reqVO.getIsEnable()) + .eqIfPresent(MesMoldBrandDO::getOrgType, reqVO.getOrgType()) + .betweenIfPresent(MesMoldBrandDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesMoldBrandDO::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/dal/mysql/mold/MesMoldBrandProductMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandProductMapper.java new file mode 100644 index 000000000..31900c68d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldBrandProductMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.mold; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 模具产品 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface MesMoldBrandProductMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long brandId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(MesMoldBrandProductDO::getBrandId, brandId) + .orderByDesc(MesMoldBrandProductDO::getId)); + } + + default int deleteByBrandId(Long brandId) { + return delete(MesMoldBrandProductDO::getBrandId, brandId); + } + default List selectList(MesMoldBrandProductDO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesMoldBrandProductDO::getProductId, reqVO.getProductId()) + .eqIfPresent(MesMoldBrandProductDO::getBrandId, reqVO.getBrandId()) + .orderByDesc(MesMoldBrandProductDO::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/dal/mysql/mold/MesMoldMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldMapper.java new file mode 100644 index 000000000..659c99e0d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mold/MesMoldMapper.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.mold; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 模具 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface MesMoldMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long brandId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesMoldDO::getBrandId, brandId) + .orderByDesc(MesMoldDO::getId)); + } + + default int deleteByBrandId(Long brandId) { + return delete(MesMoldDO::getBrandId, brandId); + } + + default List selectBy(MesMoldDO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesMoldDO::getCode, reqVO.getCode()) + .likeIfPresent(MesMoldDO::getName, reqVO.getName()) + .eqIfPresent(MesMoldDO::getBrandId, reqVO.getBrandId()) + .orderByDesc(MesMoldDO::getId)); + } + + default List selectBy(Long brandId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesMoldDO::getBrandId, brandId) + .orderByDesc(MesMoldDO::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/dal/mysql/moldticketresults/MoldTicketResultsMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/moldticketresults/MoldTicketResultsMapper.java index 3d1db4254..c2725885d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/moldticketresults/MoldTicketResultsMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/moldticketresults/MoldTicketResultsMapper.java @@ -34,5 +34,7 @@ public interface MoldTicketResultsMapper extends BaseMapperX findByDeviceIdAndPlanType(@Param("deviceId") Long deviceId,@Param("planType") Integer planType); + List findByMoldIdAndPlanType(@Param("moldId") Long moldId, @Param("planType") Integer planType, + @Param("startTime") String startTime, @Param("endTime") String endTime, + @Param("ids") String ids); } \ 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/redis/no/MesNoRedisDAO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java index aff79a07e..9b0ec2799 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/no/MesNoRedisDAO.java @@ -23,7 +23,7 @@ public class MesNoRedisDAO { /** - * 模具 {@link cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO} + * 模具 {@link cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO} */ public static final String MOLD_NO_PREFIX = "MUJU-"; public static final String MOLD_RECORD_NO_PREFIX = "MR-"; 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 64767d31b..6b05e555a 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 @@ -4,7 +4,7 @@ import java.util.*; import javax.validation.*; import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; 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 b8042213b..1c2d44316 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 @@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; -import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; @@ -72,7 +72,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { private ErpProductMapper productMapper; @Resource - private MoldMapper moldMapper; + private MesMoldMapper mesMoldMapper; @Resource private ErpProductUnitService productUnitService; @@ -194,7 +194,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { } //模具列表 - List moldList = new ArrayList<>(); + List moldList = new ArrayList<>(); if (StringUtils.isNotBlank(deviceLedgerDO.getMoldId())) { // 将逗号分隔的字符串转换为Long类型的List List idList = Arrays.stream(deviceLedgerDO.getMoldId().split(",")) @@ -202,7 +202,7 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { .map(Long::valueOf) .collect(Collectors.toList()); for (Long moldId : idList) { - MoldDO moldDO = moldMapper.selectById(moldId); + MesMoldDO moldDO = mesMoldMapper.selectById(moldId); if(moldDO!=null){ moldList.add(moldDO); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandService.java new file mode 100644 index 000000000..f87d6c2d0 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandService.java @@ -0,0 +1,176 @@ +package cn.iocoder.yudao.module.mes.service.mold; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * 模具型号 Service 接口 + * + * @author 内蒙必硕 + */ +public interface MoldBrandService { + + /** + * 创建模具型号 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMoldBrand(@Valid MoldBrandSaveReqVO createReqVO); + + /** + * 更新模具型号 + * + * @param updateReqVO 更新信息 + */ + void updateMoldBrand(@Valid MoldBrandSaveReqVO updateReqVO); + + /** + * 删除模具型号 + * + * @param id 编号 + */ + void deleteMoldBrand(Long id); + + /** + * 获得模具型号 + * + * @param id 编号 + * @return 模具型号 + */ + MesMoldBrandDO getMoldBrand(Long id); + List selectBy(MoldBrandPageReqVO reqVO); + /** + * 获得模具型号分页 + * + * @param pageReqVO 分页查询 + * @return 模具型号分页 + */ + PageResult getMoldBrandPage(MoldBrandPageReqVO pageReqVO); + default Map getMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getList(ids), MesMoldBrandDO::getId); + } + List getList(Collection ids); + // ==================== 子表(模具) ==================== + + /** + * 获得模具分页 + * + * @param pageReqVO 分页查询 + * @param brandId 型号id + * @return 模具分页 + */ + PageResult getMoldPage(PageParam pageReqVO, Long brandId); + + List getMoldList(); + + /** + * 创建模具 + * + * @param mold 创建信息 + * @return 编号 + */ + Long createMold(@Valid MesMoldDO mold); + + /** + * 更新模具 + * + * @param mold 更新信息 + */ + void updateMold(@Valid MesMoldDO mold); + + /** + * 删除模具 + * + * @param id 编号 + */ + void deleteMold(Long id); + + /** + * 获得模具 + * + * @param id 编号 + * @return 模具 + */ + MesMoldDO getMold(Long id); + List selectBy(MesMoldDO reqVO); + // ==================== 子表(模具产品) ==================== + + /** + * 获得模具产品分页 + * + * @param pageReqVO 分页查询 + * @param brandId 型号ID + * @return 模具产品分页 + */ + PageResult getMoldBrandProductPage(PageParam pageReqVO, Long brandId); + List buildProduct(List list); + /** + * 创建模具产品 + * + * @param moldBrandProduct 创建信息 + * @return 编号 + */ + Long createMoldBrandProduct(@Valid MesMoldBrandProductDO moldBrandProduct); + + /** + * 更新模具产品 + * + * @param moldBrandProduct 更新信息 + */ + void updateMoldBrandProduct(@Valid MesMoldBrandProductDO moldBrandProduct); + + /** + * 删除模具产品 + * + * @param id 编号 + */ + void deleteMoldBrandProduct(Long id); + + /** + * 获得模具产品 + * + * @param id 编号 + * @return 模具产品 + */ + MesMoldBrandProductDO getMoldBrandProduct(Long id); + + List getAllList(); + + + /** + * 获得产品分类列表 + * + * @param ids 编号数组 + * @return 产品分类列表 + */ + List getMoldBrandList(Collection ids); + + /** + * 获得产品分类 Map + * + * @param ids 编号数组 + * @return 产品分类 Map + */ + default Map getMoldBrandMap(Collection ids) { + if(ids.isEmpty())return new HashMap<>(); + return convertMap(getMoldBrandList(ids), MesMoldBrandDO::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/mold/MoldBrandServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandServiceImpl.java new file mode 100644 index 000000000..2d0122509 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldBrandServiceImpl.java @@ -0,0 +1,312 @@ +package cn.iocoder.yudao.module.mes.service.mold; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.*; +import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.enums.MoldPlanTypeEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandProductDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldBrandMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldBrandProductMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.moldticketresults.MoldTicketResultsMapper; +import cn.iocoder.yudao.module.erp.service.product.ErpProductService; +import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; + +/** + * 模具型号 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service("mesMoldBrandService") +@Validated +public class MoldBrandServiceImpl implements MoldBrandService { + + @Resource + private MesMoldBrandMapper mesMoldBrandMapper; + @Resource + private MesMoldMapper mesMoldMapper; + @Resource + private MoldRepairMapper moldRepairMapperRepair; + @Resource + private MoldRepairLineMapper moldRepairLineMapper; + @Resource + private MoldTicketResultsMapper moldticketResultsMapper; + @Resource + private ErpProductUnitService productUnitService; + @Resource + private ErpProductService productService; + @Override + public Long createMoldBrand(MoldBrandSaveReqVO createReqVO) { + // 插入 + MesMoldBrandDO moldBrand = BeanUtils.toBean(createReqVO, MesMoldBrandDO.class); + mesMoldBrandMapper.insert(moldBrand); + // 返回 + return moldBrand.getId(); + } + + @Override + public void updateMoldBrand(MoldBrandSaveReqVO updateReqVO) { + // 校验存在 + validateMoldBrandExists(updateReqVO.getId()); + // 更新 + MesMoldBrandDO updateObj = BeanUtils.toBean(updateReqVO, MesMoldBrandDO.class); + mesMoldBrandMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteMoldBrand(Long id) { + // 校验存在 + validateMoldBrandExists(id); + // 删除 + mesMoldBrandMapper.deleteById(id); + + // 删除子表 + deleteMoldByBrandId(id); + } + + private void validateMoldBrandExists(Long id) { + if (mesMoldBrandMapper.selectById(id) == null) { + throw exception(MOLD_BRAND_NOT_EXISTS); + } + } + + @Override + public MesMoldBrandDO getMoldBrand(Long id) { + return mesMoldBrandMapper.selectById(id); + } + @Override + public List selectBy(MoldBrandPageReqVO reqVO){ + return mesMoldBrandMapper.selectBy(reqVO); + } + + @Override + public PageResult getMoldBrandPage(MoldBrandPageReqVO pageReqVO) { + PageResult pageResult = mesMoldBrandMapper.selectPage(pageReqVO); + return new PageResult<>(buildMoldBrandVOList(pageResult.getList()), pageResult.getTotal()); + } + + private List buildMoldBrandVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map map = productService.getProductMap( + convertSet(list, MesMoldBrandDO::getProductId)); + return BeanUtils.toBean(list, MoldBrandRespVO.class, item -> { + MapUtils.findAndThen(map, item.getProductId(), + product -> item.setProductName(product.getName())); + }); + } + @Override + public List getList(Collection ids) { + return mesMoldBrandMapper.selectBatchIds(ids); + } + // ==================== 子表(模具) ==================== + + @Override + public PageResult getMoldPage(PageParam pageReqVO, Long brandId) { + PageResult pageResult = mesMoldMapper.selectPage(pageReqVO, brandId); + return new PageResult<>(buildMoldVOList(pageResult.getList()), pageResult.getTotal()); + } + + @Override + public List getMoldList() { + return mesMoldMapper.selectList(); + } + + private List buildMoldVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map unitMap = productUnitService.getProductUnitMap( + convertSet(list, MesMoldDO::getUnitId)); + return BeanUtils.toBean(list, MoldRespVO.class, product -> { + MapUtils.findAndThen(unitMap, product.getUnitId(), + unit -> product.setUnitName(unit.getName())); + }); + } + @Override + public Long createMold(MesMoldDO mold) { + mesMoldMapper.insert(mold); + return mold.getId(); + } + + @Override + public void updateMold(MesMoldDO mold) { + // 校验存在 + validateMoldExists(mold.getId()); + // 更新 + mesMoldMapper.updateById(mold); + } + + @Override + public void deleteMold(Long id) { + // 校验存在 + validateMoldExists(id); + // 删除 + mesMoldMapper.deleteById(id); + } + + @Override + public MesMoldDO getMold(Long id) { + MesMoldDO moldDO = mesMoldMapper.selectById(id); + Map> moldRepairDOMap=new HashMap<>(); + + // 关联查询品牌表并补充字段 + if (moldDO != null && moldDO.getBrandId() != null) { + MesMoldBrandDO moldBrandDO = mesMoldBrandMapper.selectById(moldDO.getBrandId()); + if (moldBrandDO != null) { + moldDO.setBrandName(moldBrandDO.getName()); // 品牌名称 + moldDO.setMoldType(moldBrandDO.getMoldType()); // 模具类型 + moldDO.setMoldSize(moldBrandDO.getMoldSize()); // 模具尺寸 + moldDO.setOrgType(moldBrandDO.getOrgType()); // 组织类型 + } + } + + //点检列表 + List inspectionList = moldticketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.INSPECTION.getCode(),null,null,null); + if(CollectionUtils.isNotEmpty(inspectionList)){ + moldDO.setInspectionList(inspectionList); + } + + //保养列表 + List maintainList = moldticketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.MAINTENANCE.getCode(),null,null,null); + if(CollectionUtils.isNotEmpty(maintainList)){ + moldDO.setMaintainList(maintainList); + } + + //维修列表 + List moldRepairDOS = moldRepairMapperRepair.selectList( + Wrappers.lambdaQuery() + .eq(MoldRepairDO::getMoldId, id)); + + for (MoldRepairDO moldRepairDO : moldRepairDOS) { + List moldRepairLineDOS = moldRepairLineMapper.selectList(Wrappers.lambdaQuery() + .eq(MoldRepairLineDO::getRepairId, moldRepairDO.getId()) + .orderByDesc(MoldRepairLineDO::getCreateTime)); + if (!moldRepairLineDOS.isEmpty()) { + // 修复JSON序列化null Key问题(保持原有风格的极简处理) + String repairName = moldRepairDO.getRepairName(); + if (repairName == null || repairName.trim().isEmpty()) { + repairName = "维修单-" + moldRepairDO.getId(); + } + moldRepairDOMap.put(repairName, moldRepairLineDOS); + } + } + + if(CollectionUtils.isNotEmpty(moldRepairDOMap)){ + moldDO.setRepairList(moldRepairDOMap); + } + + return moldDO; + } + @Override + public List selectBy(MesMoldDO reqVO){ + return mesMoldMapper.selectBy(reqVO); + } + private void validateMoldExists(Long id) { + if (mesMoldMapper.selectById(id) == null) { + throw exception(MOLD_NOT_EXISTS); + } + } + + private void deleteMoldByBrandId(Long brandId) { + mesMoldMapper.deleteByBrandId(brandId); + } + + // ==================== 子表(模具产品) ==================== + @Resource + private MesMoldBrandProductMapper mesMoldBrandProductMapper; + @Override + public PageResult getMoldBrandProductPage(PageParam pageReqVO, Long brandId) { + return mesMoldBrandProductMapper.selectPage(pageReqVO, brandId); + } + @Override + public List buildProduct(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map map = productService.getProductMap( + convertSet(list, MesMoldBrandProductDO::getProductId)); + return BeanUtils.toBean(list, MoldProductRespVO.class, item -> { + MapUtils.findAndThen(map, item.getProductId(), + product -> item.setProductName(product.getName())); + }); + } + @Override + public Long createMoldBrandProduct(MesMoldBrandProductDO moldBrandProduct) { + MesMoldBrandProductDO resVo = new MesMoldBrandProductDO().setBrandId(moldBrandProduct.getBrandId()) + .setProductId(moldBrandProduct.getProductId()); + List list = mesMoldBrandProductMapper.selectList(resVo); + if(list!=null && list.size()>0){ + throw exception(MOLD_BRAND_PRODUCT_EXISTS); + } + mesMoldBrandProductMapper.insert(moldBrandProduct); + return moldBrandProduct.getId(); + } + + @Override + public void updateMoldBrandProduct(MesMoldBrandProductDO moldBrandProduct) { + // 校验存在 + validateMoldBrandProductExists(moldBrandProduct.getId()); + // 更新 + mesMoldBrandProductMapper.updateById(moldBrandProduct); + } + + @Override + public void deleteMoldBrandProduct(Long id) { + // 校验存在 + validateMoldBrandProductExists(id); + // 删除 + mesMoldBrandProductMapper.deleteById(id); + } + + @Override + public MesMoldBrandProductDO getMoldBrandProduct(Long id) { + return mesMoldBrandProductMapper.selectById(id); + } + + @Override + public List getAllList() { + return mesMoldMapper.selectList(); + } + + @Override + public List getMoldBrandList(Collection ids) { + return mesMoldBrandMapper.selectBatchIds(ids); + } + + private void validateMoldBrandProductExists(Long id) { + if (mesMoldBrandProductMapper.selectById(id) == null) { + throw exception(MOLD_BRAND_PRODUCT_NOT_EXISTS); + } + } + + private void deleteMoldBrandProductByBrandId(Long brandId) { + mesMoldBrandProductMapper.deleteByBrandId(brandId); + } +} \ 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/mold/MoldService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldService.java new file mode 100644 index 000000000..1c07bb51b --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldService.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.mes.service.mold; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * 模具 Service 接口 + * + * @author 内蒙必硕 + */ +public interface MoldService { + + /** + * 创建模具 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMold(@Valid MoldSaveReqVO createReqVO); + + /** + * 更新模具 + * + * @param updateReqVO 更新信息 + */ + void updateMold(@Valid MoldSaveReqVO updateReqVO); + + /** + * 删除模具 + * + * @param id 编号 + */ + void deleteMold(Long id); + + /** + * 获得模具 + * + * @param id 编号 + * @return 模具 + */ + MesMoldDO getMold(Long id); + + /** + * 获得模具分页 + * + * @param pageReqVO 分页查询 + * @return 模具分页 + */ + PageResult getMoldPage(MoldPageReqVO pageReqVO); + List getList(Collection ids); + default Map getMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getList(ids), MesMoldDO::getId); + } + + /** + * 校验模具们的有效性 + * + * @param ids 编号数组 + * @return 模具列表 + */ + List validMoldList(Collection ids); + + /** + * 获得产品 VO 列表 + * + * @param ids 编号数组 + * @return 产品 VO 列表 + */ + List getMoldVOList(Collection ids); + + /** + * 获得模具 VO Map + * + * @param ids 编号数组 + * @return 模具 VO Map + */ + default Map getMoldVOMap(Collection ids) { + if(ids.isEmpty())return new HashMap<>(); + return convertMap(getMoldVOList(ids), MoldRespVO::getId); + } + + List buildMoldVOList(List list); +} \ 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/mold/MoldServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldServiceImpl.java new file mode 100644 index 000000000..040415cc8 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/mold/MoldServiceImpl.java @@ -0,0 +1,104 @@ +package cn.iocoder.yudao.module.mes.service.mold; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.mold.vo.MoldSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.MOLD_NOT_EXISTS; + +/** + * 模具 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service("mesMoldService") +@Validated +public class MoldServiceImpl implements MoldService { + + @Resource + private MesMoldMapper mesMoldMapper; + + @Override + public Long createMold(MoldSaveReqVO createReqVO) { + // 插入 + MesMoldDO mold = BeanUtils.toBean(createReqVO, MesMoldDO.class); + mesMoldMapper.insert(mold); + // 返回 + return mold.getId(); + } + + @Override + public void updateMold(MoldSaveReqVO updateReqVO) { + // 校验存在 + validateMoldExists(updateReqVO.getId()); + // 更新 + MesMoldDO updateObj = BeanUtils.toBean(updateReqVO, MesMoldDO.class); + mesMoldMapper.updateById(updateObj); + } + + @Override + public void deleteMold(Long id) { + // 校验存在 + validateMoldExists(id); + // 删除 + mesMoldMapper.deleteById(id); + } + + private void validateMoldExists(Long id) { + if (mesMoldMapper.selectById(id) == null) { + throw exception(MOLD_NOT_EXISTS); + } + } + + @Override + public MesMoldDO getMold(Long id) { + return mesMoldMapper.selectById(id); + } + + @Override + public PageResult getMoldPage(MoldPageReqVO pageReqVO) { + return mesMoldMapper.selectPage(pageReqVO, pageReqVO.getBrandId()); + } + @Override + public List getList(Collection ids) { + return mesMoldMapper.selectBatchIds(ids); + } + + @Override + public List validMoldList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return mesMoldMapper.selectBatchIds(ids); + } + + @Override + public List getMoldVOList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + List list = mesMoldMapper.selectBatchIds(ids); + return buildMoldVOList(list); + } + + @Override + public List buildMoldVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + return BeanUtils.toBean(list, MoldRespVO.class); + } +} \ 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/moldrecord/MoldRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrecord/MoldRecordServiceImpl.java index cf93c01fb..e2e4d980c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrecord/MoldRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrecord/MoldRecordServiceImpl.java @@ -4,10 +4,10 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; -import cn.iocoder.yudao.module.erp.service.mold.MoldBrandService; -import cn.iocoder.yudao.module.erp.service.mold.MoldService; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.service.mold.MoldBrandService; +import cn.iocoder.yudao.module.mes.service.mold.MoldService; import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordRespVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrecord.vo.MoldRecordSaveReqVO; @@ -129,9 +129,9 @@ public class MoldRecordServiceImpl implements MoldRecordService { Map userMap = userService.getUserMap( convertSet(list, MoldRecordDO::getUserId)); - Map brandMap = moldBrandService.getMap( + Map brandMap = moldBrandService.getMap( convertSet(list, MoldRecordDO::getBrandId)); - Map moldMap = moldService.getMap( + Map moldMap = moldService.getMap( convertSet(list, MoldRecordDO::getMoldId)); Map machineMap = machineComponentService.getMap( diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java index 470374f64..029daf58b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java @@ -1,8 +1,10 @@ package cn.iocoder.yudao.module.mes.service.moldrepair; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper; @@ -11,14 +13,14 @@ import javax.validation.Valid; import java.util.List; /** - * 设备维修记录 Service 接口 + * 模具维修记录 Service 接口 * * @author 内蒙必硕 */ public interface MoldRepairService { /** - * 创建设备维修记录 + * 创建模具维修记录 * * @param createReqVO 创建信息 * @return 编号 @@ -26,43 +28,51 @@ public interface MoldRepairService { Long createMoldRepair(@Valid MoldRepairSaveReqVO createReqVO); /** - * 更新设备维修记录 + * 更新模具维修记录 * * @param updateReqVO 更新信息 */ void updateMoldRepair(@Valid MoldRepairSaveReqVO updateReqVO); /** - * 删除设备维修记录 + * 删除模具维修记录 * * @param id 编号 */ void deleteMoldRepair(List idList); /** - * 获得设备维修记录 + * 获得模具维修记录 * * @param id 编号 - * @return 设备维修记录 + * @return 模具维修记录 */ MoldRepairDO getMoldRepair(Long id); /** - * 获得设备维修记录分页 + * 获得模具维修记录分页 * * @param pageReqVO 分页查询 - * @return 设备维修记录分页 + * @return 模具维修记录分页 */ PageResult getMoldRepairPage(MoldRepairPageReqVO pageReqVO); - // ==================== 子表(设备维修记录行) ==================== + // ==================== 子表(模具维修记录行) ==================== /** - * 获得设备维修记录行列表 + * 获得模具维修记录行列表 * * @param repairId 维修单ID - * @return 设备维修记录行列表 + * @return 模具维修记录行列表 */ List getMoldRepairLineListByRepairId(Long repairId); -} \ No newline at end of file + void updateRepairLine(@Valid MoldRepairLineSaveReqVO updateReqVO); + + void batchUpdateTicketResults(@Valid List updateReqVOList); + + void updateMoldRepairStatus(@Valid MoldRepairUpdateReqVO updateReqVO); + + List getRepairListByMoldId(Long moldId, String startTime, String endTime, String ids); +} + diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java index 92fcf866d..c6b3cce13 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java @@ -2,22 +2,34 @@ package cn.iocoder.yudao.module.mes.service.moldrepair; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.enums.RepairResultEnum; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.devicetype.DeviceTypeDO; +import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums.JobResultEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.moldrepair.MoldRepairMapper; import cn.iocoder.yudao.module.mes.service.moldrepair.MoldRepairService; +import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.List; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -29,7 +41,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; /** - * 设备维修记录 Service 实现类 + * 模具维修记录 Service 实现类 * * @author 内蒙必硕 */ @@ -53,7 +65,7 @@ public class MoldRepairServiceImpl implements MoldRepairService { ); if (count > 0) { - throw exception(DV_REPAIR_CODE_EXISTS); + throw exception(MOLD_REPAIR_CODE_EXISTS); } // 插入 MoldRepairDO moldRepair = BeanUtils.toBean(createReqVO, MoldRepairDO.class); @@ -79,7 +91,7 @@ public class MoldRepairServiceImpl implements MoldRepairService { ); if (count > 0) { - throw exception(DV_REPAIR_CODE_EXISTS); + throw exception(MOLD_REPAIR_CODE_EXISTS); } // 更新 @@ -106,7 +118,7 @@ public class MoldRepairServiceImpl implements MoldRepairService { private void validateMoldRepairExists(Long id) { if (moldRepairMapper.selectById(id) == null) { - throw exception(DV_REPAIR_NOT_EXISTS); + throw exception(MOLD_REPAIR_NOT_EXISTS); } } @@ -120,7 +132,7 @@ public class MoldRepairServiceImpl implements MoldRepairService { return moldRepairMapper.selectPage(pageReqVO); } - // ==================== 子表(设备维修记录行) ==================== + // ==================== 子表(模具维修记录行) ==================== @Override public List getMoldRepairLineListByRepairId(Long repairId) { @@ -174,4 +186,233 @@ public class MoldRepairServiceImpl implements MoldRepairService { moldRepairLineMapper.deleteByRepairId(repairId); } + + + + @Override + public void updateRepairLine(MoldRepairLineSaveReqVO updateReqVO) { + + // 校验存在 + validateMoldRepairLineExists(updateReqVO.getId()); + // 更新 + MoldRepairLineDO updateObj = BeanUtils.toBean(updateReqVO, MoldRepairLineDO.class); + moldRepairLineMapper.updateById(updateObj); + + + + } + + @Override + public void batchUpdateTicketResults(List updateReqVOList) { + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + // 1. 数据验证 + validateBatchUpdateData(updateReqVOList); + + // 2. 批量更新 + List updateList = new ArrayList<>(); + LocalDateTime now = LocalDateTime.now(); + + for (MoldRepairLineSaveReqVO vo : updateReqVOList) { + // 转换为DO + MoldRepairLineDO updateDO = BeanUtils.toBean(vo, MoldRepairLineDO.class); + updateDO.setUpdateTime(now); + updateList.add(updateDO); + } + + // 3. 执行批量更新 + moldRepairLineMapper.updateBatch(updateList); + + //4. 判断是否全部已检验 + handleInspectionResult(updateReqVOList); + } + + @Override + public void updateMoldRepairStatus(MoldRepairUpdateReqVO updateReqVO) { + + MoldRepairDO moldRepairDO = moldRepairMapper.selectById(updateReqVO.getId()); + if ( moldRepairDO == null) { + throw exception(MOLD_REPAIR_NOT_EXISTS); + } + moldRepairDO.setRequireDate(updateReqVO.getRequireDate()); + moldRepairDO.setFinishDate(updateReqVO.getFinishDate()); + moldRepairDO.setConfirmDate(updateReqVO.getConfirmDate()); + moldRepairDO.setRepairResult(updateReqVO.getRepairResult()); + moldRepairMapper.updateById(moldRepairDO); + batchUpdateTicketResults(updateReqVO.getUpdateReqVOList()); + + } + + @Override + public List getRepairListByMoldId(Long moldId, String startTime, String endTime, String ids) { + + List moldRepairLineRespVOS = new ArrayList<>(); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(MoldRepairDO::getMoldId, moldId); + + + + // 处理开始时间 + if (StringUtils.isNotBlank(startTime)) { + try { + LocalDateTime parseToLocalDateTime = parseToLocalDateTime(startTime); + wrapper.ge(MoldRepairDO::getFinishDate, parseToLocalDateTime); + } catch (Exception e) { + log.error("开始时间格式错误: {}, 异常: {}", startTime, e.getMessage(), e); + } + } + + // 处理结束时间 + if (StringUtils.isNotBlank(endTime)) { + try { + LocalDateTime parseToLocalDateTime = parseToLocalDateTime(endTime); + wrapper.le(MoldRepairDO::getFinishDate, parseToLocalDateTime); + } catch (Exception e) { + log.error("结束时间格式错误: {}, 异常: {}", startTime, e.getMessage(), e); + } + } + + List moldRepairDOS = moldRepairMapper.selectList(wrapper); + + for (MoldRepairDO moldRepairDO : moldRepairDOS) { + + LambdaQueryWrapper moldRepairLineDOLambdaQueryWrapper = Wrappers.lambdaQuery() + .eq(MoldRepairLineDO::getRepairId, moldRepairDO.getId()) + .orderByDesc(MoldRepairLineDO::getCreateTime); + + List moldRepairLineDOS = moldRepairLineMapper.selectList(moldRepairLineDOLambdaQueryWrapper); + + if (!moldRepairLineDOS.isEmpty()) { + List moldRepairLineRespVOList = moldRepairLineDOS.stream() + .map(doItem -> { + MoldRepairLineRespVO vo = new MoldRepairLineRespVO(); + BeanUtils.copyProperties(doItem, vo); + vo.setRepairCode(moldRepairDO.getRepairCode()); + vo.setRepairName(moldRepairDO.getRepairName()); + vo.setFinishDate(moldRepairDO.getFinishDate()); + // 设置维修结果描述 + vo.setRepairResult(RepairResultEnum.getDescByCode(doItem.getResult())); + return vo; + }) + .collect(Collectors.toList()); + moldRepairLineRespVOS.addAll(moldRepairLineRespVOList); + } + } + + // 在最终结果上过滤ids + if (StringUtils.isNotBlank(ids)) { + List idList = Arrays.stream(ids.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toList()); + if (!idList.isEmpty()) { + moldRepairLineRespVOS = moldRepairLineRespVOS.stream() + .filter(vo -> idList.contains(vo.getId())) // 假设vo有getId()方法 + .collect(Collectors.toList()); + } + } + + + return moldRepairLineRespVOS; + } + + + private LocalDateTime parseToLocalDateTime(String timeStr) { + if (StringUtils.isBlank(timeStr)) { + return null; + } + + timeStr = timeStr.trim(); + + try { + // 尝试解析 yyyy-MM-dd HH:mm:ss + if (timeStr.length() == 19) { + return LocalDateTime.parse(timeStr, + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + // 尝试解析 yyyy-MM-dd + else if (timeStr.length() == 10) { + return LocalDate.parse(timeStr, + DateTimeFormatter.ofPattern("yyyy-MM-dd")) + .atStartOfDay(); + } + // 尝试解析 yyyy/MM/dd HH:mm:ss + else if (timeStr.contains("/")) { + return LocalDateTime.parse(timeStr.replace("/", "-"), + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + // 尝试ISO格式 + else { + return LocalDateTime.parse(timeStr, + DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } + } catch (Exception e) { + throw new IllegalArgumentException("时间格式不支持: " + timeStr, e); + } + } + private void handleInspectionResult(List updateReqVOList) { + + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + // 检查是否有未填写的 + boolean hasPending = updateReqVOList.stream() + .anyMatch(vo -> vo.getResult() == null || vo.getResult().equals(JobResultEnum.PENDING.getCode())); + + if (hasPending) { + return; + } + MoldRepairDO moldRepairDO = moldRepairMapper.selectById(updateReqVOList.get(0).getRepairId()); + if (moldRepairDO == null ){ + throw exception(MOLD_REPAIR_NOT_EXISTS); + } + //设置为已完成 + moldRepairDO.setStatus(JobResultEnum.PASS.getCode()); + // 检查是否有不通过的 + boolean hasFail = updateReqVOList.stream() + .anyMatch(vo -> vo.getResult() != null && vo.getResult().equals(JobResultEnum.FAIL.getCode())); + if (hasFail) { + moldRepairDO.setRepairStatus(JobResultEnum.FAIL.getCode()); + + } else { + moldRepairDO.setRepairStatus(JobResultEnum.PASS.getCode()); + } + moldRepairMapper.updateById(moldRepairDO); + + } + + private void validateBatchUpdateData(List updateReqVOList) { + + + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(updateReqVOList)) { + return; + } + + Set idSet = new HashSet<>(); + + for (int i = 0; i < updateReqVOList.size(); i++) { + MoldRepairLineSaveReqVO vo = updateReqVOList.get(i); + + // 验证ID不能为空 + if (vo.getId() == null) { + throw exception(MOLD_REPAIR_LINE_ID_NOT_EXISTS); + } + + idSet.add(vo.getId()); + + // 调用单个验证逻辑 + validateMoldRepairLineExists(vo.getId()); + } + } + + private void validateMoldRepairLineExists(Long id) { + if (moldRepairLineMapper.selectById(id) == null) { + throw exception(MOLD_REPAIR_LINE_NOT_EXISTS); + } + } } \ 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/moldrepairtems/MoldRepairTemsService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsService.java index 6cc2add26..82ee1d370 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsService.java @@ -4,7 +4,7 @@ import java.util.*; import javax.validation.*; import cn.iocoder.yudao.module.mes.controller.admin.moldrepairtems.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepairtems.MoldRepairTemsDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsServiceImpl.java index bb121e4da..9936a4609 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepairtems/MoldRepairTemsServiceImpl.java @@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.mes.service.moldrepairtems; //import cn.iocoder.yudao.module.iot.controller.admin.mold.vo.LineMoldRespVO; //import cn.iocoder.yudao.module.iot.dal.dataobject.moldmodel.MoldModelDO; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldBrandDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; import cn.iocoder.yudao.module.mes.dal.mysql.criticalcomponent.CriticalComponentMapper; -import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; import cn.iocoder.yudao.module.mes.service.moldrepairtems.MoldRepairTemsService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -46,7 +46,7 @@ public class MoldRepairTemsServiceImpl implements MoldRepairTemsService { @Resource - private MoldMapper moldMapper; + private MesMoldMapper mesMoldMapper; @Resource private CriticalComponentMapper criticalComponentMapper; @@ -132,7 +132,7 @@ public class MoldRepairTemsServiceImpl implements MoldRepairTemsService { // @Override // public List getComponentList(Long moldId) { // -// MoldDO moldDO = moldMapper.selectById(moldId); +// MesMoldDO moldDO = mesMoldMapper.selectById(moldId); // if(moldDO == null ){ // throw exception(DEVICE_LEDGER_NOT_EXISTS); // } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java index 81c43e075..022a66488 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.mes.service.moldtaskmanagement; -import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldplanmaintenance.MoldPlanMaintenanceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.subjectmoldplan.SubjectMoldPlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; -import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper; import cn.iocoder.yudao.module.mes.dal.mysql.moldplanmaintenance.MoldPlanMaintenanceMapper; import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper; @@ -56,7 +56,7 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService private MoldTicketResultsMapper moldticketResultsMapper; @Resource - private MoldMapper moldMapper; + private MesMoldMapper mesMoldMapper; @Resource private MoldPlanMaintenanceMapper moldplanMaintenanceMapper; @@ -178,7 +178,7 @@ public PageResult getMoldTaskManagementPage(MoldTaskManage for (Long moldId : idList) { MoldTicketManagementDO moldticketManagementDO = new MoldTicketManagementDO(); - MoldDO moldDO = moldMapper.selectById(moldId); + MesMoldDO moldDO = mesMoldMapper.selectById(moldId); moldticketManagementDO.setTaskId(moldtaskManagementDO.getId()); moldticketManagementDO.setPlanNo(generatePrefixedOrderNo()); moldticketManagementDO.setPlanId(moldtaskManagementDO.getProjectForm()); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java index 454271fbc..238f9597b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; + /** * 项目方案关联 Service 接口 @@ -53,4 +55,8 @@ public interface MoldTicketManagementService { PageResult getMoldTicketManagementPage(MoldTicketManagementPageReqVO pageReqVO); void batchUpdateJobStatus(@Valid MoldTicketManagementBatchUpdateReqVO reqVO); + + List getInspectionByMoldId(Long id, String startTime, String endTime, String ids); + + List getMaintenanceByMoldId(Long id, String startTime, String endTime, String ids); } \ 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/moldticketmanagement/MoldTicketManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java index 3b5988428..f4c257b1f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java @@ -1,7 +1,19 @@ package cn.iocoder.yudao.module.mes.service.moldticketmanagement; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; +import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.enums.MoldPlanTypeEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketresults.MoldTicketResultsDO; +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.moldticketresults.MoldTicketResultsMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; import cn.iocoder.yudao.module.mes.service.moldticketmanagement.MoldTicketManagementService; import com.alibaba.excel.util.StringUtils; +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; @@ -32,6 +44,12 @@ public class MoldTicketManagementServiceImpl implements MoldTicketManagementServ @Resource private MoldTicketManagementMapper moldticketManagementMapper; + @Resource + @Lazy + private MesMoldMapper mesMoldMapper; + @Resource + @Lazy + private MoldTicketResultsMapper moldTicketResultsMapper; @Override public Long createMoldTicketManagement(MoldTicketManagementSaveReqVO createReqVO) { @@ -88,6 +106,32 @@ public class MoldTicketManagementServiceImpl implements MoldTicketManagementServ moldticketManagementMapper.batchUpdateJobStatus(idList, reqVO.getJobStatus()); } + + @Override + public List getInspectionByMoldId(Long id, String startTime, String endTime, String ids) { + MesMoldDO moldDO = mesMoldMapper.selectById(id); + //点检列表 + List inspectionList = moldTicketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.INSPECTION.getCode(),startTime,endTime,ids); + if(CollectionUtils.isNotEmpty(inspectionList)){ + moldDO.setInspectionList(inspectionList); + } + + return inspectionList; + } + + @Override + public List getMaintenanceByMoldId(Long id,String startTime,String endTime,String ids) { + MesMoldDO moldDO = mesMoldMapper.selectById(id); + + //保养列表 + List inspectionList = moldTicketResultsMapper.findByMoldIdAndPlanType(id, MoldPlanTypeEnum.MAINTENANCE.getCode(),startTime,endTime,ids); + if(CollectionUtils.isNotEmpty(inspectionList)){ + moldDO.setInspectionList(inspectionList); + } + + return inspectionList; + } + /** * 解析逗号分隔的ID字符串 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/moldticketresults/MoldTicketResultsMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/moldticketresults/MoldTicketResultsMapper.xml index 17217e3e3..2797b9101 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/moldticketresults/MoldTicketResultsMapper.xml +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/moldticketresults/MoldTicketResultsMapper.xml @@ -12,19 +12,33 @@ - \ No newline at end of file + From 876dcdd7ca4bdf751e7797432d5e39f10b7604b3 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 22 Jan 2026 18:11:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AF=B9=E6=AF=8F=E4=B8=AA=E7=82=B9=E4=BD=8D?= =?UTF-8?q?=E7=9A=84=E8=A7=84=E5=88=99=E5=88=A4=E6=96=AD=E5=AD=98=E5=85=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/enums/DeviceBasicStatusEnum.java | 78 +++ .../admin/device/enums/DeviceStatusEnum.java | 72 ++ .../device/scheduled/coretask/DeviceTask.java | 657 +++++++++++++++--- .../scheduler/TaskSchedulerManager.java | 4 +- .../DeviceModelRulesController.java | 1 - .../devicemodelrules/vo/PointRulesRespVO.java | 2 +- .../DeviceOperationRecordDO.java | 25 + .../DeviceContactModelServiceImpl.java | 3 +- .../devicemodel/DeviceModelServiceImpl.java | 17 +- .../vo/TicketManagementRespVO.java | 2 +- .../deviceledger/DeviceLedgerServiceImpl.java | 58 +- 11 files changed, 791 insertions(+), 128 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceBasicStatusEnum.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceBasicStatusEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceBasicStatusEnum.java new file mode 100644 index 000000000..07293706b --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceBasicStatusEnum.java @@ -0,0 +1,78 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备运行报警状态枚举 + */ +@Getter +@AllArgsConstructor +public enum DeviceBasicStatusEnum { + /** + * 运行状态 + */ + RUNNING("1", "运行", "RUNNING"), + + /** + * 报警状态 + */ + ALARM("2", "报警", "ALARM"); + + /** + * 状态编码 + */ + private final String code; + + /** + * 状态名称 + */ + private final String name; + + /** + * 状态描述 + */ + private final String description; + + /** + * 根据编码获取枚举 + */ + public static DeviceBasicStatusEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (DeviceBasicStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + /** + * 根据描述获取枚举 + */ + public static DeviceBasicStatusEnum getByDescription(String description) { + if (description == null || description.trim().isEmpty()) { + return null; + } + for (DeviceBasicStatusEnum status : values()) { + if (status.getDescription().equalsIgnoreCase(description.trim())) { + return status; + } + } + return null; + } + + /** + * 检查编码是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + @Override + public String toString() { + return this.name; + } +} \ 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/device/enums/DeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java new file mode 100644 index 000000000..de1cbd4e7 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备状态枚举 + */ +@Getter +@AllArgsConstructor +public enum DeviceStatusEnum { + + /** + * 离线 + */ + OFFLINE("0", "离线", "设备离线"), + + /** + * 运行 + */ + RUNNING("1", "运行", "设备正常运行"), + + /** + * 待机中(不运行、没故障) + */ + STANDBY("2", "待机中", "设备待机,无故障"), + + /** + * 故障中(故障且待机) + */ + FAULT_STANDBY("3", "故障中", "设备故障且处于待机状态"), + + /** + * 报警中(故障且运行) + */ + ALARM_RUNNING("4", "报警中", "设备故障但仍在运行"); + + /** + * 状态编码 + */ + private final String code; + + /** + * 状态名称 + */ + private final String name; + + /** + * 状态描述 + */ + private final String description; + + /** + * 根据状态码获取枚举 + */ + public static DeviceStatusEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (DeviceStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + + + + +} \ 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/device/scheduled/coretask/DeviceTask.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java index d93f949fc..047d87bf7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java @@ -2,16 +2,27 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.coretask; import cn.iocoder.yudao.framework.common.util.opc.OpcUtils; +import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceBasicStatusEnum; +import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task; +import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO; import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactModelMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -21,6 +32,11 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; @Component @Slf4j @@ -36,13 +52,51 @@ public class DeviceTask implements Task { @Resource private TDengineService tDengineService; + @Resource + private DevicePointRulesMapper devicePointRulesMapper; + + @Resource + private DeviceOperationRecordMapper deviceOperationRecordMapper; + @Override public String getTaskType() { return TaskTypeEnum.DEVICE.getCode(); } + +// static { +// // 定期清理过期连接 +// ScheduledExecutorService cleanupExecutor = Executors.newSingleThreadScheduledExecutor(); +// cleanupExecutor.scheduleAtFixedRate(DeviceTask::cleanupExpiredConnections, +// CLEANUP_INTERVAL, CLEANUP_INTERVAL, TimeUnit.MILLISECONDS); +// } + +// // 会话信息 +// private static class SessionInfo { +// long lastUsedTime; +// String deviceUrl; +// String username; +// +// SessionInfo(String deviceUrl, String username) { +// this.deviceUrl = deviceUrl; +// this.username = username; +// this.lastUsedTime = System.currentTimeMillis(); +// } +// +// boolean isExpired() { +// return System.currentTimeMillis() - lastUsedTime > CONNECTION_TIMEOUT; +// } +// +// void updateLastUsed() { +// this.lastUsedTime = System.currentTimeMillis(); +// } +// } + + @Override public void execute(Long taskId, String taskParam) { + Long deviceId = taskId - 1000000L; + try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTime = sdf.format(new Date()); @@ -62,6 +116,9 @@ public class DeviceTask implements Task { } catch (Exception e) { logger.error("执行设备任务异常,任务ID: {}", taskId, e); + } finally { + //确保出问题不会打满opcv服务器连接数 + OpcUtils.disconnect(); } } @@ -69,128 +126,560 @@ public class DeviceTask implements Task { * 具体的设备执行逻辑 */ private void executeDeviceLogic(Long sourceDeviceId, String param) { - logger.info("执行设备 {} 的具体逻辑,参数: {}", sourceDeviceId, param); + logger.info("执行设备逻辑,源设备ID: {},参数: {}", sourceDeviceId, param); + + // 1. 计算实际设备ID Long deviceId = sourceDeviceId - 1000000L; - logger.info("处理后id:{} ", deviceId ); + logger.info("处理后设备ID: {}", deviceId); - // 1. 参数校验 - if (deviceId == null){ - logger.error("设备ID不能为空"); + if (deviceId == null) { throw new RuntimeException("设备ID不能为空"); } - // 2. 查询设备信息 - DeviceDO deviceDO = deviceMapper.selectById(deviceId); - if (deviceDO == null) { - logger.error("设备不存在,设备ID: {}", deviceId); - throw new RuntimeException("设备不存在,设备ID: " + deviceId); + // 2. 获取设备信息 + DeviceDO device = getDeviceInfo(deviceId); + + // 3. 连接OPC服务器 + connectOpcServer(device); + + // 4. 处理数据读取和入库 + processDeviceData(deviceId, device); + + // 5. 断开连接 + OpcUtils.disconnect(); + } + + /** + * 具体的设备执行逻辑 + */ +// private void executeDeviceLogic(Long sourceDeviceId, String param) { +// logger.info("执行设备逻辑,源设备ID: {},参数: {}", sourceDeviceId, param); +// +// // 1. 计算实际设备ID +// Long deviceId = sourceDeviceId - 1000000L; +// logger.info("处理后设备ID: {}", deviceId); +// +// if (deviceId == null) { +// throw new RuntimeException("设备ID不能为空"); +// } +// +// // 2. 获取设备信息 +// DeviceDO device = getDeviceInfo(deviceId); +// +// // 3. 连接OPC服务器 +// connectOpcServer(device); +// +// // 4. 处理数据读取和入库 +// processDeviceData(deviceId, device); +// +// // 5. 断开连接 +// OpcUtils.disconnect(); +// } + + /** + * 获取设备信息 + */ + private DeviceDO getDeviceInfo(Long deviceId) { + DeviceDO device = deviceMapper.selectById(deviceId); + + if (device == null) { + throw new RuntimeException("设备不存在,ID: " + deviceId); } - if (deviceDO.getUrl() == null || deviceDO.getUrl().trim().isEmpty()) { - logger.error("设备URL不能为空,设备ID: {}", deviceId); - throw new RuntimeException("设备URL不能为空"); + if (StringUtils.isBlank(device.getUrl())) { + throw new RuntimeException("设备URL不能为空,ID: " + deviceId); } - // 3. 连接OPC服务器 - String username = deviceDO.getUsername() != null ? deviceDO.getUsername() : ""; - String password = deviceDO.getPassword() != null ? deviceDO.getPassword() : ""; + return device; + } - boolean connected = OpcUtils.connect(deviceDO.getUrl(), username, password, 10); + /** + * 连接OPC服务器 + */ + private void connectOpcServer(DeviceDO device) { + String username = StringUtils.defaultString(device.getUsername()); + String password = StringUtils.defaultString(device.getPassword()); + + boolean connected = OpcUtils.connect(device.getUrl(), username, password, 10); if (!connected) { - logger.error("连接OPC服务器失败,设备ID: {},URL: {}", deviceId, deviceDO.getUrl()); - throw new RuntimeException("连接OPC服务器失败"); + throw new RuntimeException("连接OPC服务器失败,URL: " + device.getUrl()); } + } - // 4. 查询设备点位配置 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DeviceContactModelDO::getDeviceId, deviceId); - - List deviceContactModelDOS = deviceContactModelMapper.selectList(queryWrapper); - - // 5. 判断是否有点位数据 - if (deviceContactModelDOS == null || deviceContactModelDOS.isEmpty()) { - logger.warn("设备 {} 没有配置数据点位,跳过数据读取", deviceId); + /** + * 处理设备数据 + */ + private void processDeviceData(Long deviceId, DeviceDO device) { + // 1. 查询点位配置 + List points = getDevicePoints(deviceId); + if (CollectionUtils.isEmpty(points)) { + logger.warn("设备 {} 未配置点位", deviceId); return; } - logger.info("设备 {} 共有 {} 个点位需要读取", deviceId, deviceContactModelDOS.size()); + logger.info("设备 {} 需要读取 {} 个点位", deviceId, points.size()); - // 6. 读取OPC数据 + // 2. 读取并处理数据 int successCount = 0; List validDataList = new ArrayList<>(); - for (DeviceContactModelDO deviceContactModelDO : deviceContactModelDOS) { - try { - // 判断点位地址是否有效 - String address = deviceContactModelDO.getAddress(); - if (address == null || address.trim().isEmpty()) { - logger.warn("点位ID {} 的地址为空,跳过", deviceContactModelDO.getId()); - continue; - } + for (DeviceContactModelDO point : points) { + processSinglePoint(point, validDataList,device); + if (point.getAddressValue() != null) { + successCount++; + } + } + + // 3. 入库处理 + if (!validDataList.isEmpty()) { + saveToDatabase(deviceId, validDataList, successCount); + } else { + logger.warn("设备 {} 未读取到有效数据", deviceId); + } + } + + /** + * 获取设备点位 + */ + private List getDevicePoints(Long deviceId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(DeviceContactModelDO::getDeviceId, deviceId); + return deviceContactModelMapper.selectList(query); + } + + /** + * 处理单个点位 + */ + private void processSinglePoint(DeviceContactModelDO point, List validDataList, DeviceDO device) { + try { + String address = StringUtils.trimToEmpty(point.getAddress()); + if (address.isEmpty()) { + logger.warn("点位ID {} 地址为空", point.getId()); + return; + } + + Object value = OpcUtils.readValue(address); +// if (value == null) { + logger.warn("读取点位 {} ,地址: {}", point.getId(), address); +// } else { + String processedValue = processOpcValue(value); + + //判断规则 + judgmentRules(processedValue,point.getAttributeCode(),device,point.getId()); + point.setAddressValue(processedValue.isEmpty() ? null : processedValue); + +// } + + validDataList.add(point); + } catch (Exception e) { + logger.error("处理点位 {} 异常,地址: {}", + point.getId(), point.getAddress(), e); + } + } + + + + /** + * 处理OPC值 + */ + private String processOpcValue(Object value) { + if (value == null) { + return ""; + } + + if (value instanceof String) { + return ((String) value).trim(); + } + + return value.toString(); + } - // 读取OPC值 - Object addressValue = OpcUtils.readValue(address); - - if (addressValue == null) { - logger.warn("读取点位 {} 的值返回null,地址: {}", - deviceContactModelDO.getId(), address); - } else { - // 值验证 - if (addressValue instanceof String) { - String strValue = (String) addressValue; - if (strValue.trim().isEmpty()) { - logger.warn("读取点位 {} 的值为空字符串", deviceContactModelDO.getId()); - deviceContactModelDO.setAddressValue(""); - } else { - deviceContactModelDO.setAddressValue(addressValue); - successCount++; - } + /** + * 保存到数据库 + */ + private void saveToDatabase(Long deviceId, List dataList, int successCount) { + try { + String json = JSON.toJSONString(dataList); + boolean inserted = tDengineService.insertDeviceData(deviceId, json); + + if (inserted) { + logger.info("设备 {} 数据入库成功,总数: {},有效: {}", + deviceId, dataList.size(), successCount); + } else { + logger.error("设备 {} 数据入库失败", deviceId); + } + } catch (Exception e) { + logger.error("设备 {} 数据入库异常", deviceId, e); + } + } + + private void judgmentRules(String processedValue, String attributeCode, DeviceDO device,Long modelId) { + if (StringUtils.isBlank(processedValue)) { + logger.warn("待判断的值为空,编码attributeCode: {}, deviceId: {}", attributeCode, device.getId()); +// return; + } + + // 1. 查询设备规则 + List devicePointRulesDOList = devicePointRulesMapper.selectList( + Wrappers.lambdaQuery() + .eq(DevicePointRulesDO::getDeviceId, device.getId())); + + if (CollectionUtils.isEmpty(devicePointRulesDOList)) { + logger.debug("设备 {} 未配置规则", device.getId()); + return; + } + + // 2. 遍历规则 + for (DevicePointRulesDO devicePointRulesDO : devicePointRulesDOList) { + if (StringUtils.isBlank(devicePointRulesDO.getFieldRule())) { + continue; + } + + // 3. 解析规则列表 + List pointRulesVOList = JSON.parseArray( + devicePointRulesDO.getFieldRule(), PointRulesRespVO.class); + + if (CollectionUtils.isEmpty(pointRulesVOList)) { + continue; + } + + // 4. 找到对应modelId的规则并进行判断 + for (PointRulesRespVO pointRulesRespVO : pointRulesVOList) { + if (pointRulesRespVO.getCode() != null && + pointRulesRespVO.getCode().equals(attributeCode)) { + + boolean matched = matchRule(processedValue, pointRulesRespVO); + + if (matched) { + logger.info("规则匹配成功: modelId={}, value={}, rule={}", + attributeCode, processedValue, + JSON.toJSONString(pointRulesRespVO)); + + // 执行匹配成功后的逻辑 + handleMatchedSuccessRule(devicePointRulesDO,pointRulesRespVO, processedValue, device, attributeCode,modelId); + break; } else { - deviceContactModelDO.setAddressValue(addressValue); - successCount++; + logger.debug("规则不匹配: modelId={}, value={}, rule={}", + attributeCode, processedValue, + JSON.toJSONString(pointRulesRespVO)); + // 执行匹配失败后的逻辑 + handleMatchedFailureRule(devicePointRulesDO,pointRulesRespVO, processedValue, device, attributeCode); + } } + } + } + } - validDataList.add(deviceContactModelDO); + private void handleMatchedFailureRule(DevicePointRulesDO devicePointRulesDO,PointRulesRespVO pointRulesRespVO, String processedValue, DeviceDO device, String attributeCode) { + //TODO 离线待优化 +// if (devicePointRulesDO.getIdentifier().equals(DeviceBasicStatusEnum.RUNNING.getCode())){ +// DeviceOperationRecordDO record = new DeviceOperationRecordDO(); +// record.setDeviceId(device.getId()); +// record.setModelId(modelId); +// record.setRule(pointRulesRespVO.getRule()); +// record.setAddressValue(processedValue); +// record.setRecordType(getRecordType(devicePointRulesDO)); +// record.setRuleId(devicePointRulesDO.getId()); +// +// } - } catch (Exception e) { - logger.error("读取点位 {} 异常,地址: {}", - deviceContactModelDO.getId(), - deviceContactModelDO.getAddress(), e); - } - } + } + + private void handleMatchedSuccessRule(DevicePointRulesDO devicePointRulesDO, + PointRulesRespVO pointRulesRespVO, + String processedValue, + DeviceDO device, + String attributeCode, + Long modelId) { + + DeviceOperationRecordDO record = new DeviceOperationRecordDO(); + record.setDeviceId(device.getId()); + record.setModelId(modelId); + record.setRule(pointRulesRespVO.getRule()); + record.setAddressValue(processedValue); + record.setRecordType(getRecordType(devicePointRulesDO)); + record.setRuleId(devicePointRulesDO.getId()); + //TODO 创建人和更新人为内置默认管理员 + record.setCreator("1"); + record.setUpdater("1"); + + + // 处理累计时间 + calculateAndSetTotalTime(record, pointRulesRespVO.getRule(), device.getSampleCycle()); + + deviceOperationRecordMapper.insert(record); + } - // 7. 判断是否有有效数据 - if (validDataList.isEmpty()) { - logger.warn("设备 {} 没有读取到任何有效数据,跳过入库", deviceId); + private void calculateAndSetTotalTime(DeviceOperationRecordDO record, String ruleCode, Double sampleCycle) { + if (!isTimeRelatedStatus(ruleCode)) { return; } - logger.info("设备 {} 成功读取 {} 个点位数据,总计 {} 个点位", - deviceId, successCount, validDataList.size()); + DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne( + Wrappers.lambdaQuery() + .eq(DeviceOperationRecordDO::getRule, ruleCode) + .orderByDesc(DeviceOperationRecordDO::getCreateTime) + .last("LIMIT 1") + ); + + if (ruleCode.equals(DeviceStatusEnum.RUNNING.getCode())) { + Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null) + ? lastRecord.getTotalRunningTime() + sampleCycle + : sampleCycle; + record.setTotalRunningTime(totalTime); + + } else if (ruleCode.equals(DeviceStatusEnum.STANDBY.getCode())) { + Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null) + ? lastRecord.getTotalStandbyTime() + sampleCycle + : sampleCycle; + record.setTotalStandbyTime(totalTime); + + } else if (ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode())) { + Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null) + ? lastRecord.getTotalFaultTime() + sampleCycle + : sampleCycle; + record.setTotalFaultTime(totalTime); + + } else if (ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode())) { + Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null) + ? lastRecord.getTotalWarningTime() + sampleCycle + : sampleCycle; + record.setTotalWarningTime(totalTime); + } + } + + private Integer getRecordType(DevicePointRulesDO devicePointRulesDO) { + return devicePointRulesDO.getIdentifier() + .equals(DeviceBasicStatusEnum.RUNNING.getDescription()) + ? Integer.parseInt(DeviceBasicStatusEnum.RUNNING.getCode()) + : Integer.parseInt(DeviceBasicStatusEnum.ALARM.getCode()); + } + + private boolean isTimeRelatedStatus(String ruleCode) { + return ruleCode.equals(DeviceStatusEnum.RUNNING.getCode()) || + ruleCode.equals(DeviceStatusEnum.STANDBY.getCode()) || + ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode()) || + ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode()); + } + + + /** + * 判断值是否符合规则 + * 支持操作符: EQ(等于), NE(不等于), GT(大于), GE(大于等于), + * LT(小于), LE(小于等于), TRUE(为真), FALSE(为假) + */ + private boolean matchRule(String value, PointRulesRespVO rule) { + if (StringUtils.isBlank(value) || rule == null || + StringUtils.isBlank(rule.getOperator())) { + return false; + } try { - // 8. 数据入库 - String json = JSON.toJSONString(validDataList); - boolean insertSuccess = tDengineService.insertDeviceData(deviceId, json); + String operator = rule.getOperator().toUpperCase(); + String inputValue = value.trim().toLowerCase(); + String ruleValue = StringUtils.trimToEmpty(rule.getOperatorRule()); - if (insertSuccess) { - logger.info("设备 {} 数据成功插入TDengine,数据量: {}", deviceId, validDataList.size()); + // 1. 处理布尔值判断 + if ("TRUE".equals(operator) || "FALSE".equals(operator)) { + return matchBooleanRule(inputValue, operator); + } - } else { - logger.error("设备 {} 数据插入TDengine失败", deviceId); + // 2. 如果operatorRule为空,且不是布尔操作符,则返回false + if (StringUtils.isBlank(ruleValue)) { + logger.warn("规则比较值为空,但操作符不是布尔类型: operator={}", operator); + return false; } - } catch (Exception e) { - logger.error("设备 {} 数据入库异常", deviceId, e); - } finally { - // 9. 确保断开连接 - try { - OpcUtils.disconnect(); - } catch (Exception e) { - logger.error("断开OPC连接异常,设备ID: {}", deviceId, e); + ruleValue = ruleValue.trim(); + + // 3. 尝试数值比较 + if (isNumeric(inputValue) && isNumeric(ruleValue)) { + Double num1 = Double.parseDouble(inputValue); + Double num2 = Double.parseDouble(ruleValue); + + return compareNumbers(num1, num2, operator); + } + // 4. 字符串比较 + else { + return compareStrings(inputValue, ruleValue, operator); } + + } catch (Exception e) { + logger.error("规则匹配异常: value={}, rule={}, error={}", + value, JSON.toJSONString(rule), e.getMessage()); + return false; } } + + /** + * 处理布尔值判断 + */ + private boolean matchBooleanRule(String value, String operator) { + // 常见布尔值表示 + boolean booleanValue = parseBoolean(value); + + if ("TRUE".equals(operator)) { + return booleanValue; + } else if ("FALSE".equals(operator)) { + return !booleanValue; + } + + return false; + } + + /** + * 解析字符串为布尔值 + * 支持: true, false, 1, 0, yes, no, on, off等 + */ + private boolean parseBoolean(String value) { + if (StringUtils.isBlank(value)) { + return false; + } + + String lowerValue = value.toLowerCase(); + + // 常见真值表示 + if ("true".equals(lowerValue) || + "1".equals(lowerValue) || + "yes".equals(lowerValue) || + "on".equals(lowerValue) || + "是".equals(lowerValue) || // 中文支持 + "成功".equals(lowerValue)) { + return true; + } + + // 常见假值表示 + if ("false".equals(lowerValue) || + "0".equals(lowerValue) || + "no".equals(lowerValue) || + "off".equals(lowerValue) || + "否".equals(lowerValue) || // 中文支持 + "失败".equals(lowerValue)) { + return false; + } + + // 尝试转换为布尔值 + try { + return Boolean.parseBoolean(lowerValue); + } catch (Exception e) { + logger.warn("无法解析为布尔值: {}", value); + return false; + } + } + + /** + * 数值比较 + */ + private boolean compareNumbers(Double value, Double ruleValue, String operator) { + switch (operator) { + case "EQ": return Math.abs(value - ruleValue) < 0.000001; // 处理浮点数精度 + case "NE": return Math.abs(value - ruleValue) >= 0.000001; + case "GT": return value > ruleValue; + case "GE": return value >= ruleValue; + case "LT": return value < ruleValue; + case "LE": return value <= ruleValue; + default: + logger.warn("不支持的操作符: {}", operator); + return false; + } + } + + /** + * 字符串比较 + */ + private boolean compareStrings(String value, String ruleValue, String operator) { + switch (operator) { + case "EQ": return value.equals(ruleValue); + case "NE": return !value.equals(ruleValue); + case "GT": return value.compareTo(ruleValue) > 0; + case "GE": return value.compareTo(ruleValue) >= 0; + case "LT": return value.compareTo(ruleValue) < 0; + case "LE": return value.compareTo(ruleValue) <= 0; + default: + logger.warn("不支持的操作符: {}", operator); + return false; + } + } + + /** + * 判断字符串是否为数字 + */ + private boolean isNumeric(String str) { + if (StringUtils.isBlank(str)) { + return false; + } + try { + Double.parseDouble(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * 使用连接池执行任务 + */ +// private void executeWithConnectionPool(Long deviceId, DeviceDO device) { +// SessionInfo sessionInfo = connectionPool.get(deviceId); +// +// // 检查是否可复用现有连接 +// if (sessionInfo != null && !sessionInfo.isExpired() && OpcUtils.isConnected()) { +// log.debug("复用现有连接,设备ID: {}", deviceId); +// sessionInfo.updateLastUsed(); +// } else { +// // 需要创建新连接 +// if (sessionInfo != null) { +// // 清理过期连接 +// connectionPool.remove(deviceId); +// OpcUtils.disconnect(); +// } +// +// log.info("创建新OPC连接,设备ID: {}", deviceId); +// if (!OpcUtils.connect(device.getUrl(), device.getUsername(), device.getPassword(), 10)) { +// throw new RuntimeException("OPC连接失败: " + device.getUrl()); +// } +// +// // 记录新会话 +// sessionInfo = new SessionInfo(device.getUrl(), device.getUsername()); +// connectionPool.put(deviceId, sessionInfo); +// } +// +// try { +// // 执行数据采集 +// processDeviceData(deviceId, device); +// } catch (Exception e) { +// // 发生异常时清理连接 +// connectionPool.remove(deviceId); +// OpcUtils.disconnect(); +// throw e; +// } +// } +// +// /** +// * 清理过期连接 +// */ +// private static void cleanupExpiredConnections() { +// int initialSize = connectionPool.size(); +// if (initialSize == 0) return; +// +// connectionPool.entrySet().removeIf(entry -> { +// SessionInfo session = entry.getValue(); +// if (session != null && session.isExpired()) { +// log.debug("清理过期连接,设备ID: {}", entry.getKey()); +// OpcUtils.disconnect(); +// return true; +// } +// return false; +// }); +// +// int finalSize = connectionPool.size(); +// if (initialSize != finalSize) { +// log.info("连接池清理完成: {} -> {}", initialSize, finalSize); +// } +// } + + + } \ 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/device/scheduled/scheduler/TaskSchedulerManager.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java index 239d0cb37..37b7bde87 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java @@ -162,9 +162,7 @@ public class TaskSchedulerManager { } } - /** - * 停止任务 - */ + // TaskSchedulerManager.java public boolean stopTask(Long taskId) { try { ScheduledFuture future = runningTasks.get(taskId); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/DeviceModelRulesController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/DeviceModelRulesController.java index 869693f3d..324fba6cb 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/DeviceModelRulesController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/DeviceModelRulesController.java @@ -91,7 +91,6 @@ public class DeviceModelRulesController { } } - return success(modelRulesRespVOPageResult); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/vo/PointRulesRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/vo/PointRulesRespVO.java index 737214e75..a62575a28 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/vo/PointRulesRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicemodelrules/vo/PointRulesRespVO.java @@ -11,7 +11,7 @@ public class PointRulesRespVO { private String rule; @Schema(description = "点位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10916") - private Long id; + private String code; @Schema(description = "符号") private String operator; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/deviceoperationrecord/DeviceOperationRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/deviceoperationrecord/DeviceOperationRecordDO.java index 7211335d5..22536c09c 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/deviceoperationrecord/DeviceOperationRecordDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/deviceoperationrecord/DeviceOperationRecordDO.java @@ -48,4 +48,29 @@ public class DeviceOperationRecordDO extends BaseDO { */ private Integer recordType; + /** + * 规则Id + */ + private Long ruleId; + + /** + * 运行总时长 + */ + private Double totalRunningTime; + + /** + * 待机总时长 + */ + private Double totalStandbyTime; + + /** + * 故障总时长 + */ + private Double totalFaultTime; + + /** + * 报警总时长 + */ + private Double totalWarningTime; + } \ 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/devicecontactmodel/DeviceContactModelServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java index a57283a11..7621f5f28 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java @@ -76,7 +76,8 @@ public class DeviceContactModelServiceImpl implements DeviceContactModelService @Override public List getDeviceContactModelList(Long id) { - return deviceContactModelMapper.selectList(Wrappers.lambdaQuery().eq(DeviceContactModelDO::getDeviceId,id)); + return deviceContactModelMapper.selectList(Wrappers.lambdaQuery().eq(DeviceContactModelDO::getDeviceId,id) + .orderByDesc(DeviceContactModelDO::getCreateTime)); } } \ 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/devicemodel/DeviceModelServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodel/DeviceModelServiceImpl.java index 2a0f46ef7..ec526887d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodel/DeviceModelServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodel/DeviceModelServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelrules.DeviceModelRulesMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.checkerframework.checker.units.qual.A; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -82,13 +83,13 @@ public class DeviceModelServiceImpl implements DeviceModelService { deviceModelRulesDO.setDefaultValue("运行"); deviceModelRulesDO.setModelId(id); deviceModelRulesDOList.add(deviceModelRulesDO); - - DeviceModelRulesDO deviceModelRulesDO1 = new DeviceModelRulesDO(); - deviceModelRulesDO1.setIdentifier("ALARM"); - deviceModelRulesDO1.setFieldName("报警"); - deviceModelRulesDO1.setDefaultValue("报警"); - deviceModelRulesDO1.setModelId(id); - deviceModelRulesDOList.add(deviceModelRulesDO1); +// +// DeviceModelRulesDO deviceModelRulesDO1 = new DeviceModelRulesDO(); +// deviceModelRulesDO1.setIdentifier("ALARM"); +// deviceModelRulesDO1.setFieldName("报警"); +// deviceModelRulesDO1.setDefaultValue("报警"); +// deviceModelRulesDO1.setModelId(id); +// deviceModelRulesDOList.add(deviceModelRulesDO1); deviceModelRulesMapper.insertBatch(deviceModelRulesDOList); @@ -151,7 +152,7 @@ public class DeviceModelServiceImpl implements DeviceModelService { @Override public List getDeviceModelList() { - return deviceModelMapper.selectList(); + return deviceModelMapper.selectList(Wrappers.lambdaQuery().orderByDesc(DeviceModelDO::getCreateTime)); } @Override 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 index bd7b55754..cdf54d4fb 100644 --- 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 @@ -72,7 +72,7 @@ public class TicketManagementRespVO extends BaseDO { /** * 作业结束时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd") @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime taskEndTime; 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 b8042213b..d3b6f27c9 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 @@ -145,35 +145,35 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { Map> dvRepairDOMap=new HashMap<>(); //TODO 待修改迁移 - //点检列表 - List inspectionList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.INSPECTION.getCode(),null,null,null); - if(CollectionUtils.isNotEmpty(inspectionList)){ - deviceLedgerDO.setInspectionList(inspectionList); - } - - //保养列表 - List maintainList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.MAINTENANCE.getCode(),null,null,null); - if(CollectionUtils.isNotEmpty(maintainList)){ - deviceLedgerDO.setMaintainList(maintainList); - } - - //维修列表 - List dvRepairDOS = dvRepairMapperRepair.selectList( - Wrappers.lambdaQuery() - .eq(DvRepairDO::getDeviceId, id)); - - for (DvRepairDO dvRepairDO : dvRepairDOS) { - List dvRepairLineDOS = dvRepairLineMapper.selectList(Wrappers.lambdaQuery() - .eq(DvRepairLineDO::getRepairId, dvRepairDO.getId()) - .orderByDesc(DvRepairLineDO::getCreateTime)); - if (!dvRepairLineDOS.isEmpty()) { - dvRepairDOMap.put(dvRepairDO.getRepairName(), dvRepairLineDOS); - } - } - - if(CollectionUtils.isNotEmpty(dvRepairDOMap)){ - deviceLedgerDO.setRepairList(dvRepairDOMap); - } +// //点检列表 +// List inspectionList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.INSPECTION.getCode(),null,null,null); +// if(CollectionUtils.isNotEmpty(inspectionList)){ +// deviceLedgerDO.setInspectionList(inspectionList); +// } + +// //保养列表 +// List maintainList = ticketResultsMapper.findByDeviceIdAndPlanType(id, PlanTypeEnum.MAINTENANCE.getCode(),null,null,null); +// if(CollectionUtils.isNotEmpty(maintainList)){ +// deviceLedgerDO.setMaintainList(maintainList); +// } +// +// //维修列表 +// List dvRepairDOS = dvRepairMapperRepair.selectList( +// Wrappers.lambdaQuery() +// .eq(DvRepairDO::getDeviceId, id)); +// +// for (DvRepairDO dvRepairDO : dvRepairDOS) { +// List dvRepairLineDOS = dvRepairLineMapper.selectList(Wrappers.lambdaQuery() +// .eq(DvRepairLineDO::getRepairId, dvRepairDO.getId()) +// .orderByDesc(DvRepairLineDO::getCreateTime)); +// if (!dvRepairLineDOS.isEmpty()) { +// dvRepairDOMap.put(dvRepairDO.getRepairName(), dvRepairLineDOS); +// } +// } +// +// if(CollectionUtils.isNotEmpty(dvRepairDOMap)){ +// deviceLedgerDO.setRepairList(dvRepairDOMap); +// } //关键件列表 From e425c12f8bae06eb7cee7f9424959d934071e129 Mon Sep 17 00:00:00 2001 From: 86158 <461356067@qq.com> Date: Fri, 23 Jan 2026 13:37:33 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E5=8F=AF=E8=A7=86?= =?UTF-8?q?=E5=8C=96=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/mes/enums/ErrorCodeConstants.java | 2 + .../admin/goview/GoviewController.java | 95 +++++++++++++++++++ .../admin/goview/vo/GoviewPageReqVO.java | 40 ++++++++ .../admin/goview/vo/GoviewRespVO.java | 47 +++++++++ .../admin/goview/vo/GoviewSaveReqVO.java | 33 +++++++ .../moldrepair/MoldRepairController.java | 6 +- .../mes/dal/dataobject/goview/GoviewDO.java | 55 +++++++++++ .../mes/dal/mysql/goview/GoviewMapper.java | 32 +++++++ .../mes/service/goview/GoviewService.java | 55 +++++++++++ .../mes/service/goview/GoviewServiceImpl.java | 74 +++++++++++++++ .../resources/mapper/goview/GoviewMapper.xml | 12 +++ 11 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/GoviewController.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewPageReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewRespVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewSaveReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/goview/GoviewDO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/goview/GoviewMapper.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewService.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewServiceImpl.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/goview/GoviewMapper.xml 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 81a09dc56..9dbbea757 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 @@ -120,6 +120,8 @@ public interface ErrorCodeConstants { ErrorCode ZJ_TASK_NOT_EXISTS = new ErrorCode(5_0094, "检验任务不存在"); ErrorCode ZJ_TASK_RESULTS_NOT_EXISTS = new ErrorCode(5_0095, "检验任务-检验结果不存在"); + ErrorCode GOVIEW_NOT_EXISTS = new ErrorCode(5_0100, "可视化大屏不存在"); + //======================================设备管理相关 1002000000================================================= diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/GoviewController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/GoviewController.java new file mode 100644 index 000000000..d70d21ac7 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/GoviewController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.mes.controller.admin.goview; + +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.goview.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO; +import cn.iocoder.yudao.module.mes.service.goview.GoviewService; + +@Tag(name = "管理后台 - 可视化大屏") +@RestController +@RequestMapping("/mes/goview") +@Validated +public class GoviewController { + + @Resource + private GoviewService goviewService; + + @PostMapping("/create") + @Operation(summary = "创建可视化大屏") + @PreAuthorize("@ss.hasPermission('mes:goview:create')") + public CommonResult createGoview(@Valid @RequestBody GoviewSaveReqVO createReqVO) { + return success(goviewService.createGoview(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新可视化大屏") + @PreAuthorize("@ss.hasPermission('mes:goview:update')") + public CommonResult updateGoview(@Valid @RequestBody GoviewSaveReqVO updateReqVO) { + goviewService.updateGoview(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除可视化大屏") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:goview:delete')") + public CommonResult deleteGoview(@RequestParam("id") Long id) { + goviewService.deleteGoview(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得可视化大屏") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:goview:query')") + public CommonResult getGoview(@RequestParam("id") Long id) { + GoviewDO goview = goviewService.getGoview(id); + return success(BeanUtils.toBean(goview, GoviewRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得可视化大屏分页") + @PreAuthorize("@ss.hasPermission('mes:goview:query')") + public CommonResult> getGoviewPage(@Valid GoviewPageReqVO pageReqVO) { + PageResult pageResult = goviewService.getGoviewPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, GoviewRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出可视化大屏 Excel") + @PreAuthorize("@ss.hasPermission('mes:goview:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportGoviewExcel(@Valid GoviewPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = goviewService.getGoviewPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "可视化大屏.xls", "数据", GoviewRespVO.class, + BeanUtils.toBean(list, GoviewRespVO.class)); + } + +} \ 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/goview/vo/GoviewPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewPageReqVO.java new file mode 100644 index 000000000..badaf2957 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewPageReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.mes.controller.admin.goview.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 GoviewPageReqVO extends PageParam { + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "启用状态") + private Long state; + + @Schema(description = "图片路径") + private String indexImage; + + @Schema(description = "路由路径") + private String route; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "内容") + private String content; + +} \ 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/goview/vo/GoviewRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewRespVO.java new file mode 100644 index 000000000..727ab9cc2 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.mes.controller.admin.goview.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 GoviewRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11354") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "名称", example = "赵六") + @ExcelProperty("名称") + private String name; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "启用状态") + @ExcelProperty("启用状态") + private Long state; + + @Schema(description = "图片路径") + @ExcelProperty("图片路径") + private String indexImage; + + @Schema(description = "路由路径") + @ExcelProperty("路由路径") + private String route; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "内容") + @ExcelProperty("内容") + private String content; + +} \ 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/goview/vo/GoviewSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewSaveReqVO.java new file mode 100644 index 000000000..8f659c22d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/goview/vo/GoviewSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.goview.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 GoviewSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11354") + private Long id; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "启用状态") + private Long state; + + @Schema(description = "图片路径") + private String indexImage; + + @Schema(description = "路由路径") + private String route; + + @Schema(description = "内容") + private String content; + +} \ 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/moldrepair/MoldRepairController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java index 134291575..479175938 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldrepair/MoldRepairController.java @@ -157,7 +157,7 @@ public class MoldRepairController { @PutMapping("/batchUpdate") @Operation(summary = "批量更新维修检验结果") - @PreAuthorize("@ss.hasPermission('mes:ticket-results:update')") + @PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:update')") public CommonResult batchUpdateTicketResults( @Valid @RequestBody List updateReqVOList) { moldRepairService.batchUpdateTicketResults(updateReqVOList); @@ -168,7 +168,7 @@ public class MoldRepairController { @GetMapping("/getRepairListByMoldId") @Operation(summary = "根据模具Id获得维修历史记录") @Parameter(name = "moldId", description = "模具Id", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:ticket-management:query')") + @PreAuthorize("@ss.hasPermission('mes:mold_ticket-management:query')") public CommonResult> getRepairListByMoldId(@RequestParam("moldId") Long moldId, @RequestParam(name = "startTime",required = false) String startTime, @RequestParam(name = "endTime",required = false) String endTime) { @@ -180,7 +180,7 @@ public class MoldRepairController { @GetMapping("/export-repair-excel") @Operation(summary = "导出维修历史记录 Excel") - @PreAuthorize("@ss.hasPermission('mes:ticket-results:export')") + @PreAuthorize("@ss.hasPermission('mes:mold_ticket-results:export')") @ApiAccessLog(operateType = EXPORT) public void exportRepairExcel(@RequestParam("moldId") Long moldId, @RequestParam(name = "ids",required = false) String ids, diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/goview/GoviewDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/goview/GoviewDO.java new file mode 100644 index 000000000..69bd2918e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/goview/GoviewDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.goview; + +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_goview") +@KeySequence("mes_goview_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GoviewDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 名称 + */ + private String name; + /** + * 备注 + */ + private String remark; + /** + * 启用状态 + */ + private Long state; + /** + * 图片路径 + */ + private String indexImage; + /** + * 路由路径 + */ + private String route; + /** + * 内容 + */ + private String content; + +} \ 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/goview/GoviewMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/goview/GoviewMapper.java new file mode 100644 index 000000000..40b5612a6 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/goview/GoviewMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.goview; + +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.goview.GoviewDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*; + +/** + * 可视化大屏 Mapper + * + * @author 必硕科技 + */ +@Mapper +public interface GoviewMapper extends BaseMapperX { + + default PageResult selectPage(GoviewPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(GoviewDO::getName, reqVO.getName()) + .eqIfPresent(GoviewDO::getRemark, reqVO.getRemark()) + .eqIfPresent(GoviewDO::getState, reqVO.getState()) + .eqIfPresent(GoviewDO::getIndexImage, reqVO.getIndexImage()) + .eqIfPresent(GoviewDO::getRoute, reqVO.getRoute()) + .betweenIfPresent(GoviewDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(GoviewDO::getContent, reqVO.getContent()) + .orderByDesc(GoviewDO::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/goview/GoviewService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewService.java new file mode 100644 index 000000000..92b553e86 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.mes.service.goview; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.mes.controller.admin.goview.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 可视化大屏 Service 接口 + * + * @author 必硕科技 + */ +public interface GoviewService { + + /** + * 创建可视化大屏 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createGoview(@Valid GoviewSaveReqVO createReqVO); + + /** + * 更新可视化大屏 + * + * @param updateReqVO 更新信息 + */ + void updateGoview(@Valid GoviewSaveReqVO updateReqVO); + + /** + * 删除可视化大屏 + * + * @param id 编号 + */ + void deleteGoview(Long id); + + /** + * 获得可视化大屏 + * + * @param id 编号 + * @return 可视化大屏 + */ + GoviewDO getGoview(Long id); + + /** + * 获得可视化大屏分页 + * + * @param pageReqVO 分页查询 + * @return 可视化大屏分页 + */ + PageResult getGoviewPage(GoviewPageReqVO pageReqVO); + +} \ 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/goview/GoviewServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewServiceImpl.java new file mode 100644 index 000000000..456e03b54 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/goview/GoviewServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.service.goview; + +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.goview.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.goview.GoviewDO; +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.goview.GoviewMapper; + +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 GoviewServiceImpl implements GoviewService { + + @Resource + private GoviewMapper goviewMapper; + + @Override + public Long createGoview(GoviewSaveReqVO createReqVO) { + // 插入 + GoviewDO goview = BeanUtils.toBean(createReqVO, GoviewDO.class); + goviewMapper.insert(goview); + // 返回 + return goview.getId(); + } + + @Override + public void updateGoview(GoviewSaveReqVO updateReqVO) { + // 校验存在 + validateGoviewExists(updateReqVO.getId()); + // 更新 + GoviewDO updateObj = BeanUtils.toBean(updateReqVO, GoviewDO.class); + goviewMapper.updateById(updateObj); + } + + @Override + public void deleteGoview(Long id) { + // 校验存在 + validateGoviewExists(id); + // 删除 + goviewMapper.deleteById(id); + } + + private void validateGoviewExists(Long id) { + if (goviewMapper.selectById(id) == null) { + throw exception(GOVIEW_NOT_EXISTS); + } + } + + @Override + public GoviewDO getGoview(Long id) { + return goviewMapper.selectById(id); + } + + @Override + public PageResult getGoviewPage(GoviewPageReqVO pageReqVO) { + return goviewMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/goview/GoviewMapper.xml b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/goview/GoviewMapper.xml new file mode 100644 index 000000000..15a98f922 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/resources/mapper/goview/GoviewMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file From 27778698a27aa60847335a9643ad9ba2ea6af3d9 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 23 Jan 2026 14:45:45 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=87=87=E9=9B=86=E8=AE=BE=E5=A4=87=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81=E3=80=81=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/device/DeviceController.java | 15 +++-- .../admin/device/enums/DeviceStatusEnum.java | 2 +- .../device/scheduled/coretask/DeviceTask.java | 44 ++++++------- .../admin/device/vo/DeviceRespVO.java | 19 +++++- .../DeviceOperationRecordController.java | 29 +++++++++ .../utils/TimeConverterUtil.java | 63 +++++++++++++++++++ .../vo/DeviceTotalTimeRecordReqVO.java | 32 ++++++++++ .../vo/DeviceTotalTimeRecordRespVO.java | 43 +++++++++++++ .../DeviceOperationRecordMapper.java | 5 ++ .../iot/service/device/DeviceService.java | 2 +- .../iot/service/device/DeviceServiceImpl.java | 45 ++++++++++--- .../DeviceOperationRecordService.java | 2 + .../DeviceOperationRecordServiceImpl.java | 63 +++++++++++++++++++ .../DeviceOperationRecordMapper.xml | 31 +++++++++ 14 files changed, 353 insertions(+), 42 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index 6c9cb258e..d4d4cfa6d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -96,8 +96,8 @@ public class DeviceController { @Operation(summary = "获得物联设备分页") @PreAuthorize("@ss.hasPermission('iot:device:query')") public CommonResult> getDevicePage(@Valid DevicePageReqVO pageReqVO) { - PageResult pageResult = deviceService.getDevicePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DeviceRespVO.class)); + PageResult pageResult = deviceService.getDevicePage(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") @@ -107,17 +107,16 @@ public class DeviceController { public void exportDeviceExcel(@Valid DevicePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceService.getDevicePage(pageReqVO).getList(); + List list = deviceService.getDevicePage(pageReqVO).getList(); // 导出 Excel - ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class, - BeanUtils.toBean(list, DeviceRespVO.class)); + ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,list); } @GetMapping("/deviceList") @PreAuthorize("@ss.hasPermission('iot:device:query')") - public CommonResult> deviceList(@Valid DevicePageReqVO pageReqVO) { + public CommonResult> deviceList(@Valid DevicePageReqVO pageReqVO) { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceService.getDevicePage(pageReqVO).getList(); - return success(BeanUtils.toBean(list, DeviceDO.class)); + List list = deviceService.getDevicePage(pageReqVO).getList(); + return success(list); } @PostMapping("/connect") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java index de1cbd4e7..9c31b6f8a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java @@ -53,7 +53,7 @@ public enum DeviceStatusEnum { /** * 根据状态码获取枚举 */ - public static DeviceStatusEnum getByCode(Integer code) { + public static DeviceStatusEnum getByCode(String code) { if (code == null) { return null; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java index 047d87bf7..c0791e532 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java @@ -417,36 +417,36 @@ public class DeviceTask implements Task { return; } - DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne( - Wrappers.lambdaQuery() - .eq(DeviceOperationRecordDO::getRule, ruleCode) - .orderByDesc(DeviceOperationRecordDO::getCreateTime) - .last("LIMIT 1") - ); +// DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne( +// Wrappers.lambdaQuery() +// .eq(DeviceOperationRecordDO::getRule, ruleCode) +// .orderByDesc(DeviceOperationRecordDO::getCreateTime) +// .last("LIMIT 1") +// ); if (ruleCode.equals(DeviceStatusEnum.RUNNING.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null) - ? lastRecord.getTotalRunningTime() + sampleCycle - : sampleCycle; - record.setTotalRunningTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null) +// ? lastRecord.getTotalRunningTime() + sampleCycle +// : sampleCycle; + record.setTotalRunningTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.STANDBY.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null) - ? lastRecord.getTotalStandbyTime() + sampleCycle - : sampleCycle; - record.setTotalStandbyTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null) +// ? lastRecord.getTotalStandbyTime() + sampleCycle +// : sampleCycle; + record.setTotalStandbyTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null) - ? lastRecord.getTotalFaultTime() + sampleCycle - : sampleCycle; - record.setTotalFaultTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null) +// ? lastRecord.getTotalFaultTime() + sampleCycle +// : sampleCycle; + record.setTotalFaultTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null) - ? lastRecord.getTotalWarningTime() + sampleCycle - : sampleCycle; - record.setTotalWarningTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null) +// ? lastRecord.getTotalWarningTime() + sampleCycle +// : sampleCycle; + record.setTotalWarningTime(sampleCycle); } } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java index 247b7e6a5..6a31a1d11 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java @@ -3,6 +3,11 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo; import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO; import com.alibaba.excel.annotation.write.style.ColumnWidth; +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 io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -102,6 +107,16 @@ public class DeviceRespVO { @ExcelProperty("密码") private String password; - @Schema(description = "点位规则") - private List pointRulesVOList; + @Schema(description = "运行状态") + @ExcelProperty("运行状态") + private String operatingStatus; + + + @Schema(description = "采集时间") + @ExcelProperty("采集时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime collectionTime; + } \ 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/deviceoperationrecord/DeviceOperationRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java index d16e8d3ef..d38edb45e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java @@ -11,6 +11,9 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.io.IOException; @@ -92,4 +95,30 @@ public class DeviceOperationRecordController { BeanUtils.toBean(list, DeviceOperationRecordRespVO.class)); } + @GetMapping("/deviceOperationPage") + @Operation(summary = "设备运行报表") + @PreAuthorize("@ss.hasPermission('mes:repair-tems:query')") + public CommonResult> deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO) { + PageResult pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO); + return success(pageResult); + } + + + @GetMapping("/export-device-operation-report") + @Operation(summary = "导出设备运行报表记录 Excel") + @PreAuthorize("@ss.hasPermission('iot:device-operation-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDeviceOperationReport(@Valid DeviceTotalTimeRecordReqVO pageReqVO, + HttpServletResponse response) throws IOException { + PageResult pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("设备运行报表记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("设备运行报表记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + // 导出 Excel + ExcelUtils.write(response, "设备运行报表记录.xls", "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList()); + } } \ 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/deviceoperationrecord/utils/TimeConverterUtil.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java new file mode 100644 index 000000000..69d413c22 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils; + +import org.springframework.stereotype.Component; + +@Component +public class TimeConverterUtil { + + private static final int SECONDS_PER_HOUR = 3600; + + /** + * 秒转小时(保留2位小数) + */ + public static double secondsToHours(double seconds) { + if (seconds <= 0) { + return 0.0; + } + double hours = seconds / SECONDS_PER_HOUR; + return formatDouble(hours, 2); + } + + /** + * 秒转小时(自定义小数位数) + */ + public static double secondsToHours(double seconds, int scale) { + if (seconds <= 0) { + return 0.0; + } + double hours = seconds / SECONDS_PER_HOUR; + return formatDouble(hours, scale); + } + + /** + * 计算稼动率 + * 稼动率 = 运行时间 / (运行时间 + 待机时间 + 故障时间 + 警告时间) * 100% + */ + public static double calculateUtilizationRate(double runningTime, double standbyTime, + double faultTime, double warningTime) { + double totalTime = runningTime + standbyTime + faultTime + warningTime; + if (totalTime <= 0) { + return 0.0; + } + double rate = runningTime / totalTime * 100; + return formatDouble(rate, 2); + } + + /** + * 格式化小数 + */ + public static double formatDouble(double value, int scale) { + if (scale < 0) { + scale = 2; + } + double factor = Math.pow(10, scale); + return Math.round(value * factor) / factor; + } + + /** + * 获取百分比字符串 + */ + public static String getPercentString(double value) { + return formatDouble(value, 2) + "%"; + } +} \ 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/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java new file mode 100644 index 000000000..0032afc7d --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; + + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 运行记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceTotalTimeRecordReqVO extends PageParam{ + + @Schema(description = "设备编码") + private String deviceCode; + + @Schema(description = "设备名称") + private String deviceName; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + + @Schema(description = "ids导出集合用") + private String ids; + +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java new file mode 100644 index 000000000..f1db9a33c --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 运行设备报表时间记录 Request VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceTotalTimeRecordRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") + private Long id; + + @Schema(description = "设备编码") + @ExcelProperty("设备编码") + private String deviceCode; + + @Schema(description = "设备名称") + @ExcelProperty("设备名称") + private String deviceName; + + @Schema(description = "运行时间(小时)") + @ExcelProperty("运行时间(小时)") + private double totalRunningTime; + + @Schema(description = "待机时间(小时)") + @ExcelProperty("待机时间(小时)") + private double totalStandbyTime; + + @Schema(description = "故障时间(小时)") + @ExcelProperty("故障时间(小时)") + private double totalFaultTime; + + @Schema(description = "警告时间(小时)") + @ExcelProperty("警告时间(小时)") + private double totalWarningTime; + + @Schema(description = "稼动率") + @ExcelProperty("稼动率") + private String utilizationRate; +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java index f5c7c17ac..da1956d73 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java @@ -6,8 +6,11 @@ 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.deviceoperationrecord.DeviceOperationRecordDO; +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.deviceoperationrecord.vo.*; +import org.apache.ibatis.annotations.Param; /** * 运行记录 Mapper @@ -28,4 +31,6 @@ public interface DeviceOperationRecordMapper extends BaseMapperX deviceOperationPage(Page page,@Param("pageReqVO") DeviceTotalTimeRecordReqVO 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/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index d75f6ceb4..435cdf6a7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -69,7 +69,7 @@ public interface DeviceService { * @param pageReqVO 分页查询 * @return 物联设备分页 */ - PageResult getDevicePage(DevicePageReqVO pageReqVO); + PageResult getDevicePage(DevicePageReqVO pageReqVO); List selectList(DevicePageReqVO reqVO); // ==================== 子表(设备属性) ==================== diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 051805853..26102ba00 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -6,6 +6,7 @@ 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.common.util.opc.OpcUtils; +import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.utils.CronExpressionUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; @@ -16,6 +17,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttr import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceModelAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelrules.DeviceModelRulesDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO; import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; @@ -25,6 +27,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactMod import cn.iocoder.yudao.module.iot.dal.mysql.devicemodel.DeviceModelMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelrules.DeviceModelRulesMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper; import cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord.MqttDataRecordMapper; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; @@ -102,6 +105,9 @@ public class DeviceServiceImpl implements DeviceService { @Resource private DevicePointRulesMapper devicePointRulesMapper; + @Resource + private DeviceOperationRecordMapper deviceOperationRecordMapper; + @Override @Transactional(rollbackFor = Exception.class) @@ -231,12 +237,12 @@ public class DeviceServiceImpl implements DeviceService { DeviceRespVO deviceRespVO = BeanUtils.toBean(deviceDO, DeviceRespVO.class); List devicePointRulesDOList = devicePointRulesMapper.selectList(Wrappers.lambdaQuery() .eq(DevicePointRulesDO::getDeviceId, id)); - - //设置点位规则 - if (!devicePointRulesDOList.isEmpty()){ - - deviceRespVO.setPointRulesVOList(devicePointRulesDOList); - } +// +// //设置点位规则 +// if (!devicePointRulesDOList.isEmpty()){ +// +// deviceRespVO.setPointRulesVOList(devicePointRulesDOList); +// } return deviceRespVO; @@ -250,8 +256,31 @@ public class DeviceServiceImpl implements DeviceService { return deviceMapper.selectByTopic(topic); } @Override - public PageResult getDevicePage(DevicePageReqVO pageReqVO) { - return deviceMapper.selectPage(pageReqVO); + public PageResult getDevicePage(DevicePageReqVO pageReqVO) { + + PageResult deviceDOPageResult = deviceMapper.selectPage(pageReqVO); + PageResult deviceRespVOPageResult = BeanUtils.toBean(deviceDOPageResult, DeviceRespVO.class); + + List ruleCodes = Arrays.stream(DeviceStatusEnum.values()) + .map(DeviceStatusEnum::getCode) + .collect(Collectors.toList()); + + for (DeviceRespVO deviceRespVO : deviceRespVOPageResult.getList()) { + + DeviceOperationRecordDO deviceOperationRecordDO = deviceOperationRecordMapper.selectOne(Wrappers.lambdaQuery() + .eq(DeviceOperationRecordDO::getDeviceId, deviceRespVO.getId()) + .in(DeviceOperationRecordDO::getRule, ruleCodes) + .orderByDesc(DeviceOperationRecordDO::getCreateTime) + .last("LIMIT 1")); + if(deviceOperationRecordDO !=null){ + deviceRespVO.setOperatingStatus(DeviceStatusEnum.getByCode(deviceOperationRecordDO.getRule()).getName()); + deviceRespVO.setCollectionTime(deviceOperationRecordDO.getCreateTime()); + } + + + } + + return deviceRespVOPageResult; } @Override diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java index 5e3af1883..6ef733e47 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java @@ -52,4 +52,6 @@ public interface DeviceOperationRecordService { */ PageResult getDeviceOperationRecordPage(DeviceOperationRecordPageReqVO pageReqVO); + PageResult deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO 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/deviceoperationrecord/DeviceOperationRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java index 52469c3c0..3eae7cdf6 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java @@ -1,5 +1,9 @@ package cn.iocoder.yudao.module.iot.service.deviceoperationrecord; +import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils.TimeConverterUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -24,6 +28,7 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; */ @Service @Validated +@Slf4j public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordService { @Resource @@ -71,4 +76,62 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe return deviceOperationRecordMapper.selectPage(pageReqVO); } + @Override + public PageResult deviceOperationPage(DeviceTotalTimeRecordReqVO pageReqVO) { + + Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + IPage deviceOperationRecordRespVOIPage = deviceOperationRecordMapper.deviceOperationPage(page,pageReqVO); + // 计算和转换 + if (deviceOperationRecordRespVOIPage != null && !deviceOperationRecordRespVOIPage.getRecords().isEmpty()) { + calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords()); + } + + + return new PageResult<>(deviceOperationRecordRespVOIPage.getRecords(), deviceOperationRecordRespVOIPage.getTotal()); + + } + + private void calculateAndSetConvertedValues(List records) { + for (DeviceTotalTimeRecordRespVO record : records) { + try { + // 获取原始秒数 + double runningTimeSec = record.getTotalRunningTime(); + double standbyTimeSec = record.getTotalStandbyTime(); + double faultTimeSec = record.getTotalFaultTime(); + double warningTimeSec = record.getTotalWarningTime(); + + // 1. 转换为小时 + double runningHours = TimeConverterUtil.secondsToHours(runningTimeSec, 2); + double standbyHours = TimeConverterUtil.secondsToHours(standbyTimeSec, 2); + double faultHours = TimeConverterUtil.secondsToHours(faultTimeSec, 2); + double warningHours = TimeConverterUtil.secondsToHours(warningTimeSec, 2); + + // 2. 计算稼动率 + double utilizationRate = TimeConverterUtil.calculateUtilizationRate( + runningTimeSec, standbyTimeSec, faultTimeSec, warningTimeSec + ); + + // 3. 设置转换后的值(将原来的秒数值覆盖为小时值) + record.setTotalRunningTime(runningHours); + record.setTotalStandbyTime(standbyHours); + record.setTotalFaultTime(faultHours); + record.setTotalWarningTime(warningHours); + record.setUtilizationRate(TimeConverterUtil.getPercentString(utilizationRate)); + + } catch (Exception e) { + log.error("计算设备{}时间转换时出错: {}", record.getDeviceCode(), e.getMessage()); + // 设置默认值 + setDefaultValues(record); + } + } + } + + private void setDefaultValues(DeviceTotalTimeRecordRespVO record) { + record.setTotalRunningTime(0.0); + record.setTotalStandbyTime(0.0); + record.setTotalFaultTime(0.0); + record.setTotalWarningTime(0.0); + record.setUtilizationRate("0%"); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml index cbcab4b99..bc33e7e71 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml @@ -9,4 +9,35 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + \ No newline at end of file From 41f35456ece398e3fdf1b8ac4f8c510f9ba21fc2 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 23 Jan 2026 16:14:07 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=8A=A5=E8=A1=A8=E6=97=B6=E9=97=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E6=96=B0=E5=A2=9E=E9=A6=96=E9=A1=B5=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/device/DeviceController.java | 10 ++++ .../vo/DeviceOperationStatusRespVO.java | 36 ++++++++++++++ .../DeviceOperationRecordController.java | 2 +- .../vo/DeviceTotalTimeRecordRespVO.java | 15 +++++- .../iot/dal/mysql/device/DeviceMapper.java | 2 + .../iot/service/device/DeviceService.java | 1 + .../iot/service/device/DeviceServiceImpl.java | 48 +++++++++++++++++++ .../DeviceOperationRecordServiceImpl.java | 13 ++++- .../resources/mapper/device/DeviceMapper.xml | 27 +++++++++++ 9 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index d4d4cfa6d..9c9bcad42 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -172,6 +172,16 @@ public class DeviceController { } + @GetMapping("/getDeviceOperationalStatus") + @Operation(summary = "获取首页设备运行状态") + @PreAuthorize("@ss.hasPermission('iot:device:query')") + public CommonResult getDeviceOperationalStatus() throws JsonProcessingException { + DeviceOperationStatusRespVO deviceOperationalStatus=deviceService.getDeviceOperationalStatus(); + return success(deviceOperationalStatus); + } + + + // ==================== 子表(设备属性) ==================== @GetMapping("/device-attribute/page") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java new file mode 100644 index 000000000..da9353300 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 设备运行状态 Resp VO") +@Data +@ToString(callSuper = true) +public class DeviceOperationStatusRespVO { + + @Schema(description = "总设备数") + private int totalDevices; + + @Schema(description = "运行") + private int runningCount; + + @Schema(description = "待机中(不运行、没故障)") + private int standbyCount; + + @Schema(description = "故障中(故障且待机)") + private int faultCount; + + @Schema(description = "报警中(故障且运行)") + private int warningCount; + + @Schema(description = "利用率") + private String utilizationRate; + + @Schema(description = "故障率") + private String faultRate; + +} + + diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java index d38edb45e..b171cd233 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java @@ -119,6 +119,6 @@ public class DeviceOperationRecordController { // 导出Excel String fileName = String.format("设备运行报表记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 导出 Excel - ExcelUtils.write(response, "设备运行报表记录.xls", "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList()); + ExcelUtils.write(response, fileName, "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList()); } } \ 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/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java index f1db9a33c..bdb6da6a7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -10,8 +11,8 @@ import lombok.Data; @ExcelIgnoreUnannotated public class DeviceTotalTimeRecordRespVO { - @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") - private Long id; +// @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") +// private Long id; @Schema(description = "设备编码") @ExcelProperty("设备编码") @@ -40,4 +41,14 @@ public class DeviceTotalTimeRecordRespVO { @Schema(description = "稼动率") @ExcelProperty("稼动率") private String utilizationRate; + + @Schema(description = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty("开始时间") + private String startTime; + + @Schema(description = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty("结束时间") + private String endTime; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java index bf003757d..ad6b08171 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceOperationStatusRespVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRequestVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRespVO; @@ -96,4 +97,5 @@ public interface DeviceMapper extends BaseMapperX { IPage lineDevicePage(Page page, @Param("pageReqVO") LineDeviceRequestVO pageReqVO); + DeviceOperationStatusRespVO getDeviceOperationalStatus(); } \ 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/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index 435cdf6a7..e8d12c080 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -131,4 +131,5 @@ public interface DeviceService { Boolean scheduledStop(Long id); + DeviceOperationStatusRespVO getDeviceOperationalStatus(); } \ 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/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 26102ba00..0b118b934 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -788,4 +788,52 @@ public class DeviceServiceImpl implements DeviceService { } } + @Override + public DeviceOperationStatusRespVO getDeviceOperationalStatus() { + + DeviceOperationStatusRespVO deviceOperationalStatus= deviceMapper.getDeviceOperationalStatus(); + + // 计算利用率 + calculateUtilizationRate(deviceOperationalStatus); + + // 计算故障率 + calculateFaultRate(deviceOperationalStatus); + + return deviceOperationalStatus; + } + /** + * 计算利用率 + * 利用率 = 运行数量 / 设备总数 * 100% + */ + private void calculateUtilizationRate(DeviceOperationStatusRespVO statusVO) { + int totalDevices = statusVO.getTotalDevices(); + int runningCount = statusVO.getRunningCount(); + + double utilizationRate = 0.0; + if (totalDevices > 0) { + utilizationRate = (double) runningCount / totalDevices * 100; + } + + // 格式化百分比,保留2位小数 + String formattedRate = String.format("%.2f%%", utilizationRate); + statusVO.setUtilizationRate(formattedRate); + } + + /** + * 计算故障率 + * 故障率 = 故障数量 / 设备总数 * 100% + */ + private void calculateFaultRate(DeviceOperationStatusRespVO statusVO) { + int totalDevices = statusVO.getTotalDevices(); + int faultCount = statusVO.getFaultCount(); + + double faultRate = 0.0; + if (totalDevices > 0) { + faultRate = (double) faultCount / totalDevices * 100; + } + + // 格式化百分比,保留2位小数 + String formattedRate = String.format("%.2f%%", faultRate); + statusVO.setFaultRate(formattedRate); + } } \ 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/deviceoperationrecord/DeviceOperationRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java index 3eae7cdf6..4c0b1ed69 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils. import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -83,7 +84,7 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe IPage deviceOperationRecordRespVOIPage = deviceOperationRecordMapper.deviceOperationPage(page,pageReqVO); // 计算和转换 if (deviceOperationRecordRespVOIPage != null && !deviceOperationRecordRespVOIPage.getRecords().isEmpty()) { - calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords()); + calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords(),pageReqVO); } @@ -91,9 +92,17 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe } - private void calculateAndSetConvertedValues(List records) { + private void calculateAndSetConvertedValues(List records,DeviceTotalTimeRecordReqVO deviceTotalTimeRecordReqVO) { for (DeviceTotalTimeRecordRespVO record : records) { try { + //添加时间字段 + if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getStartTime())){ + record.setStartTime(deviceTotalTimeRecordReqVO.getStartTime()); + } + if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getEndTime())){ + record.setEndTime(deviceTotalTimeRecordReqVO.getEndTime()); + } + // 获取原始秒数 double runningTimeSec = record.getTotalRunningTime(); double standbyTimeSec = record.getTotalStandbyTime(); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml index 576409436..dac8d6d14 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml @@ -45,4 +45,31 @@ order by mo.create_time desc + + \ No newline at end of file