diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java index e29292dd83..ee5d5c3be6 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java @@ -24,6 +24,7 @@ public class CommonResult implements Serializable { * @see ErrorCode#getCode() */ private Integer code; + private Integer status = 0; /** * 返回数据 */ diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java index ae66baa4e3..cdcfb37b6a 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java @@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; 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.*; @@ -40,14 +39,14 @@ public class ErpProductUnitController { @PostMapping("/create") @Operation(summary = "创建产品单位") - @PreAuthorize("@ss.hasPermission('erp:product-unit:create')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:create')") public CommonResult createProductUnit(@Valid @RequestBody ErpProductUnitSaveReqVO createReqVO) { return success(productUnitService.createProductUnit(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新产品单位") - @PreAuthorize("@ss.hasPermission('erp:product-unit:update')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:update')") public CommonResult updateProductUnit(@Valid @RequestBody ErpProductUnitSaveReqVO updateReqVO) { productUnitService.updateProductUnit(updateReqVO); return success(true); @@ -56,7 +55,7 @@ public class ErpProductUnitController { @DeleteMapping("/delete") @Operation(summary = "删除产品单位") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('erp:product-unit:delete')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:delete')") public CommonResult deleteProductUnit(@RequestParam("id") Long id) { productUnitService.deleteProductUnit(id); return success(true); @@ -65,7 +64,7 @@ public class ErpProductUnitController { @GetMapping("/get") @Operation(summary = "获得产品单位") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:product-unit:query')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:query')") public CommonResult getProductUnit(@RequestParam("id") Long id) { ErpProductUnitDO productUnit = productUnitService.getProductUnit(id); return success(BeanUtils.toBean(productUnit, ErpProductUnitRespVO.class)); @@ -73,7 +72,7 @@ public class ErpProductUnitController { @GetMapping("/page") @Operation(summary = "获得产品单位分页") - @PreAuthorize("@ss.hasPermission('erp:product-unit:query')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:query')") public CommonResult> getProductUnitPage(@Valid ErpProductUnitPageReqVO pageReqVO) { PageResult pageResult = productUnitService.getProductUnitPage(pageReqVO); return success(BeanUtils.toBean(pageResult, ErpProductUnitRespVO.class)); @@ -88,7 +87,7 @@ public class ErpProductUnitController { @GetMapping("/export-excel") @Operation(summary = "导出产品单位 Excel") - @PreAuthorize("@ss.hasPermission('erp:product-unit:export')") + //@PreAuthorize("@ss.hasPermission('erp:product-unit:export')") @ApiAccessLog(operateType = EXPORT) public void exportProductUnitExcel(@Valid ErpProductUnitPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java index e2a45aec01..8681366cdf 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 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.*; @@ -53,14 +52,14 @@ public class ErpStockCheckController { @PostMapping("/create") @Operation(summary = "创建库存调拨单") - @PreAuthorize("@ss.hasPermission('erp:stock-check:create')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:create')") public CommonResult createStockCheck(@Valid @RequestBody ErpStockCheckSaveReqVO createReqVO) { return success(stockCheckService.createStockCheck(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新库存调拨单") - @PreAuthorize("@ss.hasPermission('erp:stock-check:update')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:update')") public CommonResult updateStockCheck(@Valid @RequestBody ErpStockCheckSaveReqVO updateReqVO) { stockCheckService.updateStockCheck(updateReqVO); return success(true); @@ -68,7 +67,7 @@ public class ErpStockCheckController { @PutMapping("/update-status") @Operation(summary = "更新库存调拨单的状态") - @PreAuthorize("@ss.hasPermission('erp:stock-check:update-status')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:update-status')") public CommonResult updateStockCheckStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { stockCheckService.updateStockCheckStatus(id, status); @@ -78,7 +77,7 @@ public class ErpStockCheckController { @DeleteMapping("/delete") @Operation(summary = "删除库存调拨单") @Parameter(name = "ids", description = "编号数组", required = true) - @PreAuthorize("@ss.hasPermission('erp:stock-check:delete')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:delete')") public CommonResult deleteStockCheck(@RequestParam("ids") List ids) { stockCheckService.deleteStockCheck(ids); return success(true); @@ -87,7 +86,7 @@ public class ErpStockCheckController { @GetMapping("/get") @Operation(summary = "获得库存调拨单") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:stock-check:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:query')") public CommonResult getStockCheck(@RequestParam("id") Long id) { ErpStockCheckDO stockCheck = stockCheckService.getStockCheck(id); if (stockCheck == null) { @@ -104,7 +103,7 @@ public class ErpStockCheckController { @GetMapping("/page") @Operation(summary = "获得库存调拨单分页") - @PreAuthorize("@ss.hasPermission('erp:stock-check:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:query')") public CommonResult> getStockCheckPage(@Valid ErpStockCheckPageReqVO pageReqVO) { PageResult pageResult = stockCheckService.getStockCheckPage(pageReqVO); return success(buildStockCheckVOPageResult(pageResult)); @@ -112,7 +111,7 @@ public class ErpStockCheckController { @GetMapping("/export-excel") @Operation(summary = "导出库存调拨单 Excel") - @PreAuthorize("@ss.hasPermission('erp:stock-check:export')") + //@PreAuthorize("@ss.hasPermission('erp:stock-check:export')") @ApiAccessLog(operateType = EXPORT) public void exportStockCheckExcel(@Valid ErpStockCheckPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java index b63f82d7df..250926caff 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java @@ -20,7 +20,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; 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.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -59,7 +58,7 @@ public class ErpStockController { @Parameter(name = "productId", description = "产品编号", example = "10"), // 方案二:传递 productId + warehouseId @Parameter(name = "warehouseId", description = "仓库编号", example = "2") }) - @PreAuthorize("@ss.hasPermission('erp:stock:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock:query')") public CommonResult getStock(@RequestParam(value = "id", required = false) Long id, @RequestParam(value = "productId", required = false) Long productId, @RequestParam(value = "warehouseId", required = false) Long warehouseId) { @@ -76,7 +75,7 @@ public class ErpStockController { @GetMapping("/page") @Operation(summary = "获得产品库存分页") - @PreAuthorize("@ss.hasPermission('erp:stock:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock:query')") public CommonResult> getStockPage(@Valid ErpStockPageReqVO pageReqVO) { PageResult pageResult = stockService.getStockPage(pageReqVO); return success(buildStockVOPageResult(pageResult)); @@ -84,7 +83,7 @@ public class ErpStockController { @GetMapping("/export-excel") @Operation(summary = "导出产品库存 Excel") - @PreAuthorize("@ss.hasPermission('erp:stock:export')") + //@PreAuthorize("@ss.hasPermission('erp:stock:export')") @ApiAccessLog(operateType = EXPORT) public void exportStockExcel(@Valid ErpStockPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java index ae48435faf..22bfbee434 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java @@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.lang3.StringUtils; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -65,14 +64,14 @@ public class ErpStockInController { @PostMapping("/create") @Operation(summary = "创建其它入库单") - @PreAuthorize("@ss.hasPermission('erp:stock-in:create')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:create')") public CommonResult createStockIn(@Valid @RequestBody ErpStockInSaveReqVO createReqVO) { return success(stockInService.createStockIn(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新其它入库单") - @PreAuthorize("@ss.hasPermission('erp:stock-in:update')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:update')") public CommonResult updateStockIn(@Valid @RequestBody ErpStockInSaveReqVO updateReqVO) { stockInService.updateStockIn(updateReqVO); return success(true); @@ -80,7 +79,7 @@ public class ErpStockInController { @PutMapping("/update-status") @Operation(summary = "更新其它入库单的状态") - @PreAuthorize("@ss.hasPermission('erp:stock-in:update-status')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:update-status')") public CommonResult updateStockInStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { stockInService.updateStockInStatus(id, status); @@ -90,7 +89,7 @@ public class ErpStockInController { @DeleteMapping("/delete") @Operation(summary = "删除其它入库单") @Parameter(name = "ids", description = "编号数组", required = true) - @PreAuthorize("@ss.hasPermission('erp:stock-in:delete')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:delete')") public CommonResult deleteStockIn(@RequestParam("ids") List ids) { stockInService.deleteStockIn(ids); return success(true); @@ -99,7 +98,7 @@ public class ErpStockInController { @GetMapping("/get") @Operation(summary = "获得其它入库单") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:stock-in:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:query')") public CommonResult getStockIn(@RequestParam("id") Long id) { ErpStockInDO stockIn = stockInService.getStockIn(id); if (stockIn == null) { @@ -119,7 +118,7 @@ public class ErpStockInController { @GetMapping("/page") @Operation(summary = "获得其它入库单分页") - @PreAuthorize("@ss.hasPermission('erp:stock-in:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:query')") public CommonResult> getStockInPage(@Valid ErpStockInPageReqVO pageReqVO) { if(StringUtils.isEmpty(pageReqVO.getInType())){ List list = new ArrayList<>(); @@ -135,7 +134,7 @@ public class ErpStockInController { @GetMapping("/export-excel") @Operation(summary = "导出其它入库单 Excel") - @PreAuthorize("@ss.hasPermission('erp:stock-in:export')") + //@PreAuthorize("@ss.hasPermission('erp:stock-in:export')") @ApiAccessLog(operateType = EXPORT) public void exportStockInExcel(@Valid ErpStockInPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java index 72d67d2108..1c7f14c1f7 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java @@ -23,7 +23,6 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 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.*; @@ -58,14 +57,14 @@ public class ErpStockMoveController { @PostMapping("/create") @Operation(summary = "创建库存调拨单") - @PreAuthorize("@ss.hasPermission('erp:stock-move:create')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:create')") public CommonResult createStockMove(@Valid @RequestBody ErpStockMoveSaveReqVO createReqVO) { return success(stockMoveService.createStockMove(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新库存调拨单") - @PreAuthorize("@ss.hasPermission('erp:stock-move:update')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:update')") public CommonResult updateStockMove(@Valid @RequestBody ErpStockMoveSaveReqVO updateReqVO) { stockMoveService.updateStockMove(updateReqVO); return success(true); @@ -73,7 +72,7 @@ public class ErpStockMoveController { @PutMapping("/update-status") @Operation(summary = "更新库存调拨单的状态") - @PreAuthorize("@ss.hasPermission('erp:stock-move:update-status')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:update-status')") public CommonResult updateStockMoveStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { stockMoveService.updateStockMoveStatus(id, status); @@ -83,7 +82,7 @@ public class ErpStockMoveController { @DeleteMapping("/delete") @Operation(summary = "删除库存调拨单") @Parameter(name = "ids", description = "编号数组", required = true) - @PreAuthorize("@ss.hasPermission('erp:stock-move:delete')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:delete')") public CommonResult deleteStockMove(@RequestParam("ids") List ids) { stockMoveService.deleteStockMove(ids); return success(true); @@ -92,7 +91,7 @@ public class ErpStockMoveController { @GetMapping("/get") @Operation(summary = "获得库存调拨单") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:stock-move:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:query')") public CommonResult getStockMove(@RequestParam("id") Long id) { ErpStockMoveDO stockMove = stockMoveService.getStockMove(id); if (stockMove == null) { @@ -112,7 +111,7 @@ public class ErpStockMoveController { @GetMapping("/page") @Operation(summary = "获得库存调拨单分页") - @PreAuthorize("@ss.hasPermission('erp:stock-move:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:query')") public CommonResult> getStockMovePage(@Valid ErpStockMovePageReqVO pageReqVO) { PageResult pageResult = stockMoveService.getStockMovePage(pageReqVO); return success(buildStockMoveVOPageResult(pageResult)); @@ -120,7 +119,7 @@ public class ErpStockMoveController { @GetMapping("/export-excel") @Operation(summary = "导出库存调拨单 Excel") - @PreAuthorize("@ss.hasPermission('erp:stock-move:export')") + //@PreAuthorize("@ss.hasPermission('erp:stock-move:export')") @ApiAccessLog(operateType = EXPORT) public void exportStockMoveExcel(@Valid ErpStockMovePageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java index 5209eb10d7..c6bf25f357 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 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.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -58,7 +57,7 @@ public class ErpStockRecordController { @GetMapping("/get") @Operation(summary = "获得产品库存明细") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:stock-record:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-record:query')") public CommonResult getStockRecord(@RequestParam("id") Long id) { ErpStockRecordDO stockRecord = stockRecordService.getStockRecord(id); return success(BeanUtils.toBean(stockRecord, ErpStockRecordRespVO.class)); @@ -66,7 +65,7 @@ public class ErpStockRecordController { @GetMapping("/page") @Operation(summary = "获得产品库存明细分页") - @PreAuthorize("@ss.hasPermission('erp:stock-record:query')") + //@PreAuthorize("@ss.hasPermission('erp:stock-record:query')") public CommonResult> getStockRecordPage(@Valid ErpStockRecordPageReqVO pageReqVO) { PageResult pageResult = stockRecordService.getStockRecordPage(pageReqVO); return success(buildStockRecrodVOPageResult(pageResult)); @@ -74,7 +73,7 @@ public class ErpStockRecordController { @GetMapping("/export-excel") @Operation(summary = "导出产品库存明细 Excel") - @PreAuthorize("@ss.hasPermission('erp:stock-record:export')") + //@PreAuthorize("@ss.hasPermission('erp:stock-record:export')") @ApiAccessLog(operateType = EXPORT) public void exportStockRecordExcel(@Valid ErpStockRecordPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java index 9de214b80c..19fb1b0c88 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java @@ -16,7 +16,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; 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.*; @@ -41,14 +40,14 @@ public class ErpWarehouseController { @PostMapping("/create") @Operation(summary = "创建仓库") - @PreAuthorize("@ss.hasPermission('erp:warehouse:create')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:create')") public CommonResult createWarehouse(@Valid @RequestBody ErpWarehouseSaveReqVO createReqVO) { return success(warehouseService.createWarehouse(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新仓库") - @PreAuthorize("@ss.hasPermission('erp:warehouse:update')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:update')") public CommonResult updateWarehouse(@Valid @RequestBody ErpWarehouseSaveReqVO updateReqVO) { warehouseService.updateWarehouse(updateReqVO); return success(true); @@ -69,7 +68,7 @@ public class ErpWarehouseController { @DeleteMapping("/delete") @Operation(summary = "删除仓库") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('erp:warehouse:delete')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:delete')") public CommonResult deleteWarehouse(@RequestParam("id") Long id) { warehouseService.deleteWarehouse(id); return success(true); @@ -78,7 +77,7 @@ public class ErpWarehouseController { @GetMapping("/get") @Operation(summary = "获得仓库") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:warehouse:query')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:query')") public CommonResult getWarehouse(@RequestParam("id") Long id) { ErpWarehouseDO warehouse = warehouseService.getWarehouse(id); return success(BeanUtils.toBean(warehouse, ErpWarehouseRespVO.class)); @@ -86,7 +85,7 @@ public class ErpWarehouseController { @GetMapping("/page") @Operation(summary = "获得仓库分页") - @PreAuthorize("@ss.hasPermission('erp:warehouse:query')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:query')") public CommonResult> getWarehousePage(@Valid ErpWarehousePageReqVO pageReqVO) { PageResult pageResult = warehouseService.getWarehousePage(pageReqVO); return success(BeanUtils.toBean(pageResult, ErpWarehouseRespVO.class)); @@ -102,7 +101,7 @@ public class ErpWarehouseController { @GetMapping("/export-excel") @Operation(summary = "导出仓库 Excel") - @PreAuthorize("@ss.hasPermission('erp:warehouse:export')") + //@PreAuthorize("@ss.hasPermission('erp:warehouse:export')") @ApiAccessLog(operateType = EXPORT) public void exportWarehouseExcel(@Valid ErpWarehousePageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java index b5b8fb3429..1e1c715cc2 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java @@ -232,10 +232,10 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { if (item.getOutCount().equals(outCount)) { return; } - if (outCount.compareTo(item.getCount()) > 0) { - throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED, - productService.getProduct(item.getProductId()).getName(), item.getCount()); - } +// if (outCount.compareTo(item.getCount()) > 0) { +// throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED, +// productService.getProduct(item.getProductId()).getName(), item.getCount()); +// } saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setOutCount(outCount)); }); // 2. 更新销售订单 diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java index e74adc4194..a0251fad9d 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java @@ -104,6 +104,8 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())) .setOrderNo(saleOrder.getNo()).setCustomerId(saleOrder.getCustomerId()); calculateTotalPrice(saleOut, saleOutItems); + if(saleOut.getReceiptPrice()==null) + saleOut.setReceiptPrice(BigDecimal.ZERO); saleOutMapper.insert(saleOut); // 2.2 插入出库项 saleOutItems.forEach(o -> o.setOutId(saleOut.getId())); diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java index 6ad5e4bbe9..7cd1e81ef9 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java @@ -10,6 +10,8 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; public interface ErrorCodeConstants { ErrorCode DEVICE_NOT_EXISTS = new ErrorCode(1_003_000_000, "设备不存在"); + ErrorCode DEVICE_EXISTS = new ErrorCode(1_003_000_000, "同名或同主题设备已存在"); + ErrorCode DEVICE_ATTRIBUTE_NOT_EXISTS = new ErrorCode(1_003_000_000, "设备属性不存在"); ErrorCode FORMULA_NOT_EXISTS = new ErrorCode(1_003_000_000, "公式不存在"); ErrorCode FORMULA_DETAIL_NOT_EXISTS = new ErrorCode(1_003_000_000, "公式明细不存在"); diff --git a/yudao-module-iot/yudao-module-iot-biz/pom.xml b/yudao-module-iot/yudao-module-iot-biz/pom.xml index f04cdf4d4a..a6b86a4a21 100644 --- a/yudao-module-iot/yudao-module-iot-biz/pom.xml +++ b/yudao-module-iot/yudao-module-iot-biz/pom.xml @@ -76,5 +76,12 @@ org.apache.httpcomponents httpclient + + + com.alibaba + QLExpress + 3.3.3 + + diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/AlertTypeEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/AlertTypeEnum.java new file mode 100644 index 0000000000..1a78c93a94 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/AlertTypeEnum.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum AlertTypeEnum { + + 联动("联动"), + 属性("属性"), + 设备("设备"), + 产品("产品"); + + private final String value; + + // 一个可选的方法,用于根据整数值获取对应的枚举实例 + public static AlertTypeEnum fromValue(String value) { + for (AlertTypeEnum status : AlertTypeEnum.values()) { + if (status.getValue().equals(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown value: " + value); + } + +} \ 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/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index 2fce04b234..ed5c6f5af7 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 @@ -9,8 +9,8 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceRespVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; -import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattribute.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.service.device.DeviceService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/mqttdatarecord/MqttDataService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/mqttdatarecord/MqttDataService.java new file mode 100644 index 0000000000..26d47fec51 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/mqttdatarecord/MqttDataService.java @@ -0,0 +1,122 @@ +package cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord; + +import cn.iocoder.yudao.module.iot.controller.admin.alertrecord.vo.AlertRecordPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.AlertDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.alertrecord.AlertRecordDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.mysql.alert.AlertMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.alertrecord.AlertRecordMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceAttributeMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.formula.FormulaRecordMapper; +import cn.iocoder.yudao.module.iot.framework.constant.Constants; +import cn.iocoder.yudao.module.iot.framework.constant.DeviceStatusEnum; +import cn.iocoder.yudao.module.iot.framework.util.FormulaCalculator; +import cn.iocoder.yudao.module.iot.service.device.DeviceService; +import cn.iocoder.yudao.module.iot.service.mqttrecord.MqttRecordService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Service +@EnableAsync +@EnableScheduling +public class MqttDataService { + @Resource + private FormulaRecordMapper formulaRecordMapper; + @Resource + private DeviceService deviceService; + @Resource + private DeviceMapper deviceMapper; + @Resource + private MqttRecordService mqttRecordService; + @Resource + private DeviceAttributeMapper attributeMapper; + @Resource + private AlertMapper alertMapper; + @Resource + private AlertRecordMapper alertRecordMapper; + /**定时检查设备状态*/ + //@Scheduled(fixedDelay = 2000) + public void checkDeviceStatus() { + DevicePageReqVO respVO = new DevicePageReqVO().setStatus(DeviceStatusEnum.在线.getValue()).setIsEnable(true); + List deviceList = deviceService.selectList(respVO); + for (DeviceDO device : deviceList) { + if(device.getLastOnlineTime()==null){ + device.setStatus(DeviceStatusEnum.离线.getValue()); + deviceMapper.updateById(device); + }else { + Duration duration = Duration.between(device.getLastOnlineTime(), LocalDateTime.now()); + //long seconds = duration.getSeconds(); + long millis = duration.toMillis(); + long second = device.getOffLineDuration()==null? Constants.DEVICE_OFFLINE_SECOND : device.getOffLineDuration(); + if(millis > second*1000){//认为设备已经离线 + device.setStatus(DeviceStatusEnum.离线.getValue()); + deviceMapper.updateById(device); + } + } + } + } + @Async + public void updateDeviceStatus(DeviceDO deviceDO){ + deviceDO.setStatus(DeviceStatusEnum.在线.getValue()); + deviceDO.setLastOnlineTime(LocalDateTime.now()); + deviceMapper.updateById(deviceDO); + } + @Async + public void checkDeviceAlert(Map value, DeviceDO deviceDO){ + DeviceAttributeDO reqVO = new DeviceAttributeDO().setDeviceId(deviceDO.getId()).setAlertId(1L).setIsEnable(true); + List attributeList = attributeMapper.selectAlertList(reqVO); + if(attributeList!=null){ + //拿到该设备关联有告警的属性,进行逻辑计算 + for (DeviceAttributeDO attr : attributeList) { + if(StringUtils.isBlank(value.get(attr.getAttributeName())))continue; + + AlertDO alertDO = alertMapper.selectById(attr.getAlertId()); + //告警设置有效 + if (alertDO!=null && alertDO.getIsEnable() && !alertDO.getConditionFormula().isEmpty()){ + //允许重复报警 + if(alertDO.getIsRepeat() || alertDO.getNoRepeatDuration()==null || alertDO.getNoRepeatDuration() < 1){ + insertRecord(value,alertDO,attr); + }else{//不允许重复报警,检查下次报警间隔,以 告警id和属性id查找上次报警记录 + AlertRecordPageReqVO pageReqVO = new AlertRecordPageReqVO().setAlertId(alertDO.getId()).setDataId(attr.getId()); + AlertRecordDO last = alertRecordMapper.selectLastOne(pageReqVO); + if(last==null){ + insertRecord(value,alertDO,attr); + }else{ + Duration duration = Duration.between(last.getCreateTime(), LocalDateTime.now()); + //long seconds = duration.getSeconds(); + long millis = duration.toMillis(); + //可以继续报警了 + if(millis > alertDO.getNoRepeatDuration()*1000){ + insertRecord(value,alertDO,attr); + } + } + } + } + } + } + } + + private void insertRecord(Map value, AlertDO alertDO,DeviceAttributeDO attr){ + boolean result = FormulaCalculator.calFormulaBoolean(alertDO.getConditionFormula(), + Constants.DefaultFormulaVar,value.get(attr.getAttributeName())); + //触发告警 + if(result){ + AlertRecordDO recordDO = new AlertRecordDO(alertDO); + recordDO.setData(attr); + recordDO.setDataValue(value.get(attr.getAttributeName())); + alertRecordMapper.insert(recordDO); + } + } +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alertrecord/AlertRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alertrecord/AlertRecordDO.java index c8d5dcbaec..7382ed062e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alertrecord/AlertRecordDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alertrecord/AlertRecordDO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.alertrecord; +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.AlertDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import lombok.*; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -35,13 +37,11 @@ public class AlertRecordDO extends BaseDO { /** * 告警类型 * - * 枚举 {@link TODO iot_alert_type 对应的类} */ private String alertType; /** * 告警等级 * - * 枚举 {@link TODO iot_alert_level 对应的类} */ private String alertLevel; /** @@ -63,7 +63,6 @@ public class AlertRecordDO extends BaseDO { /** * 数据类型 * - * 枚举 {@link TODO iot_device_data_type 对应的类} */ private String dataType; /** @@ -85,7 +84,6 @@ public class AlertRecordDO extends BaseDO { /** * 重复告警 * - * 枚举 {@link TODO infra_boolean_string 对应的类} */ private Boolean isRepeat; /** @@ -105,4 +103,25 @@ public class AlertRecordDO extends BaseDO { */ private String dataName; + public AlertRecordDO(AlertDO alertDO){ + this.alertId = alertDO.getId(); + this.alertCode = alertDO.getAlertCode(); + this.alertName = alertDO.getAlertName(); + this.alertType = alertDO.getAlertType(); + this.alertLevel = alertDO.getAlertLevel(); + this.alertAudio = alertDO.getAlertAudio(); + this.isRepeat = alertDO.getIsRepeat(); + this.content = alertDO.getContent(); + this.conditionFormula = alertDO.getConditionFormula(); + this.conditionInfo = alertDO.getConditionInfo(); + } + //属性报警时 + public void setData(DeviceAttributeDO attributeDO){ + this.dataId = attributeDO.getId(); + this.dataCode = attributeDO.getAttributeCode(); + this.dataName = attributeDO.getAttributeName(); + this.dataType = attributeDO.getDataType(); + this.dataUnit = attributeDO.getDataUnit(); + this.dataTypeRemark = attributeDO.getDataTypeRemark(); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java index 6e5ad3e75c..b09433baa7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/DeviceAttributeDO.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.iot.dal.dataobject.deviceattribute; +package cn.iocoder.yudao.module.iot.dal.dataobject.device; -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; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.sun.xml.bind.v2.TODO; +import lombok.*; /** * 设备属性 DO diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alertrecord/AlertRecordMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alertrecord/AlertRecordMapper.java index 48e01adabc..b9b4598dc7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alertrecord/AlertRecordMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alertrecord/AlertRecordMapper.java @@ -6,6 +6,7 @@ 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.alertrecord.vo.AlertRecordPageReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.alertrecord.AlertRecordDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; /** @@ -48,4 +49,12 @@ public interface AlertRecordMapper extends BaseMapperX { default int deleteByAlertId(Long alertId) { return delete(AlertRecordDO::getAlertId, alertId); } + + default AlertRecordDO selectLastOne(AlertRecordPageReqVO reqVO) { + return selectOne(new QueryWrapper() + .eq(reqVO.getAlertId()!=null,"alert_id", reqVO.getAlertId()) + .eq(reqVO.getDataId()!=null,"data_id", reqVO.getDataId()) + .orderByDesc("id") + .last("limit 1")); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java index 48f71e63e9..7e02645b41 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceAttributeMapper.java @@ -1,14 +1,14 @@ -package cn.iocoder.yudao.module.iot.dal.mysql.deviceattribute; +package cn.iocoder.yudao.module.iot.dal.mysql.device; -import java.util.*; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattribute.DeviceAttributeDO; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 设备属性 Mapper * @@ -27,4 +27,24 @@ public interface DeviceAttributeMapper extends BaseMapperX { return delete(DeviceAttributeDO::getDeviceId, deviceId); } + default List selectList(DeviceAttributeDO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAttributeDO::getDeviceId, reqVO.getDeviceId()) + .likeIfPresent(DeviceAttributeDO::getAttributeName, reqVO.getAttributeName()) + .eqIfPresent(DeviceAttributeDO::getAlertId, reqVO.getAlertId()) + .eqIfPresent(DeviceAttributeDO::getGatewayId, reqVO.getGatewayId()) + .eqIfPresent(DeviceAttributeDO::getIsEnable, reqVO.getIsEnable()) + .eqIfPresent(DeviceAttributeDO::getIoType, reqVO.getIoType()) + .orderByDesc(DeviceAttributeDO::getId)); + } + default List selectAlertList(DeviceAttributeDO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAttributeDO::getDeviceId, reqVO.getDeviceId()) + .likeIfPresent(DeviceAttributeDO::getAttributeName, reqVO.getAttributeName()) + .eqIfPresent(DeviceAttributeDO::getGatewayId, reqVO.getGatewayId()) + .eqIfPresent(DeviceAttributeDO::getIsEnable, reqVO.getIsEnable()) + .eqIfPresent(DeviceAttributeDO::getIoType, reqVO.getIoType()) + .gtIfPresent(DeviceAttributeDO::getAlertId, 0) + .orderByDesc(DeviceAttributeDO::getId)); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/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 e2cbd8df8d..6989d880d8 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 @@ -48,4 +48,26 @@ public interface DeviceMapper extends BaseMapperX { default List selectByGatewayId(Long gatewayId) { return selectList(DeviceDO::getGatewayId, gatewayId); } + default DeviceDO selectByName(String name) { + return selectOne(DeviceDO::getDeviceName,name); + } + default DeviceDO selectByTopic(String topic) { + return selectOne(DeviceDO::getReadTopic,topic); + } + default List selectList(DevicePageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceDO::getDeviceCode, reqVO.getDeviceCode()) + .likeIfPresent(DeviceDO::getDeviceName, reqVO.getDeviceName()) + .eqIfPresent(DeviceDO::getDeviceType, reqVO.getDeviceType()) + .eqIfPresent(DeviceDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceDO::getReadTopic, reqVO.getReadTopic()) + .eqIfPresent(DeviceDO::getWriteTopic, reqVO.getWriteTopic()) + .eqIfPresent(DeviceDO::getGatewayId, reqVO.getGatewayId()) + .eqIfPresent(DeviceDO::getDeviceBrandId, reqVO.getDeviceBrandId()) + .eqIfPresent(DeviceDO::getOffLineDuration, reqVO.getOffLineDuration()) + .betweenIfPresent(DeviceDO::getLastOnlineTime, reqVO.getLastOnlineTime()) + .eqIfPresent(DeviceDO::getRemark, reqVO.getRemark()) + .eqIfPresent(DeviceDO::getIsEnable, reqVO.getIsEnable()) + .orderByDesc(DeviceDO::getId)); + } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/Constants.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/Constants.java index 890984c8c7..b213aaf98a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/Constants.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/Constants.java @@ -1,6 +1,17 @@ package cn.iocoder.yudao.module.iot.framework.constant; public class Constants { + //mqtt时间默认格式 public final static String MQTT_timestamp_format = "yyyy-MM-dd HH:mm:ss.SSS"; + //iot设备默认离线时长,秒;距离上次超过这个时间 + public final static int DEVICE_OFFLINE_SECOND = 30; + + /** + * 默认逻辑表达式的变量名称 + */ + public final static String DefaultFormulaVar = "data"; + + + } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceStatusEnum.java new file mode 100644 index 0000000000..bc639280ae --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/constant/DeviceStatusEnum.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.iot.framework.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DeviceStatusEnum { + + 不可用("3"), + 离线("2"), + 在线("1"); + + private final String value; + + // 一个可选的方法,用于根据整数值获取对应的枚举实例 + public static DeviceStatusEnum fromValue(String value) { + for (DeviceStatusEnum status : DeviceStatusEnum.values()) { + if (status.getValue().equals(value)) { + return status; + } + } + throw new IllegalArgumentException("Unknown value: " + value); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/CheckDeviceOfflineJob.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/CheckDeviceOfflineJob.java new file mode 100644 index 0000000000..ff2ae409c7 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/CheckDeviceOfflineJob.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.iot.framework.util; + +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.framework.constant.Constants; +import cn.iocoder.yudao.module.iot.framework.constant.DeviceStatusEnum; +import cn.iocoder.yudao.module.iot.service.device.DeviceService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 定时检查设备mqtt消息是否离线,离线定义为默认时间内没有新消息 + * + * @author j-sentinel + */ +@Component +@Slf4j +public class CheckDeviceOfflineJob implements JobHandler { + + @Resource + private DeviceMapper deviceMapper; + @Resource + private DeviceService deviceService; + + @Override + @TenantIgnore + public String execute(String param) { + DevicePageReqVO respVO = new DevicePageReqVO().setStatus(DeviceStatusEnum.在线.getValue()).setIsEnable(true); + List deviceList = deviceService.selectList(respVO); + int count = 0; + for (DeviceDO device : deviceList) { + if(device.getLastOnlineTime()==null){ + device.setStatus(DeviceStatusEnum.离线.getValue()); + deviceMapper.updateById(device); + count++; + }else { + Duration duration = Duration.between(device.getLastOnlineTime(), LocalDateTime.now()); + //long seconds = duration.getSeconds(); + long millis = duration.toMillis(); + long second = device.getOffLineDuration()==null? Constants.DEVICE_OFFLINE_SECOND : device.getOffLineDuration(); + if(millis > second*1000){//认为设备已经离线 + device.setStatus(DeviceStatusEnum.离线.getValue()); + deviceMapper.updateById(device); + count++; + } + } + } + log.info("[job execute][定时检查设备mqtt消息是否离线,数量 ({}) 个]", count); + return String.format("定时检查设备mqtt消息是否离线,数量 %s 个", count); + } + +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/FormulaCalculator.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/FormulaCalculator.java new file mode 100644 index 0000000000..f06926c756 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/util/FormulaCalculator.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.iot.framework.util; + +import com.ql.util.express.DefaultContext; +import com.ql.util.express.ExpressRunner; + +import java.util.Map; + + +public class FormulaCalculator { + + public static String calFormula(String formula){ + ExpressRunner runner = new ExpressRunner(); + DefaultContext context = new DefaultContext(); + try { + Object result = runner.execute(formula, context, null, false, false); + return result.toString(); + } catch (Exception e) { + System.out.println("---计算出错!:"+formula); + } + return ""; + } + public static String calFormula(String formula,String key,String value){ + formula = formula.replace(key,value); + return calFormula(formula); + } + public static String calFormula(String formula, Map map){ + for (String key: map.keySet()){ + formula = formula.replaceAll(key, map.get(key)); + } + return calFormula(formula); + } + public static Boolean calFormulaBoolean(String formula,String key,String value) { + formula = formula.replace(key,value); + String result = calFormula(formula); + if("true".equals(result)) + return true; + return false; + } + public static Boolean calFormulaBoolean(String formula, Map map) { + for (String key: map.keySet()){ + formula = formula.replaceAll(key, map.get(key)); + } + String result = calFormula(formula); + if("true".equals(result)) + return true; + return false; + } + + public static void main(String[] args) throws Exception { + String formula = "2 == 1"; + ExpressRunner runner = new ExpressRunner(); + DefaultContext context = new DefaultContext(); + context.put("a", 1); + context.put("b", 2); + context.put("c", 3); + //下面五个参数意义分别是 表达式,上下文,errorList,是否缓存,是否输出日志 + Object result = runner.execute("a+b+c", context, null, true, false); + System.out.println("a+b+c=" + result); + //下面五个参数意义分别是 表达式,上下文,errorList,是否缓存,是否输出日志 + Object result2 = runner.execute(formula, context, null, true, false); + System.out.println("formula=" + result2); + + //下面五个参数意义分别是 表达式,上下文,errorList,是否缓存,是否输出日志 + DefaultContext context3 = new DefaultContext(); + context3.put("a", "1"); + context3.put("b", "2"); + context3.put("c", "3"); + Object result3 = runner.execute("1+2+3==6", context3, null, true, false); + System.out.println("a+b+c=" + result3); + } +} 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 80f6430475..9309810793 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 @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.iot.service.device; -import java.util.*; -import javax.validation.*; -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; -import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; -import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattribute.DeviceAttributeDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; + +import javax.validation.Valid; +import java.util.List; /** * 物联设备 Service 接口 @@ -44,7 +46,8 @@ public interface DeviceService { * @return 物联设备 */ DeviceDO getDevice(Long id); - + DeviceDO getDeviceByName(String name); + DeviceDO getDeviceByTopic(String topic); /** * 获得物联设备分页 * @@ -52,7 +55,7 @@ public interface DeviceService { * @return 物联设备分页 */ 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 796787a97d..44dacc6486 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 @@ -7,11 +7,14 @@ import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceSaveReqVO; import cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord.vo.MqttDataRecordPageReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; -import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattribute.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO; import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; -import cn.iocoder.yudao.module.iot.dal.mysql.deviceattribute.DeviceAttributeMapper; import cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord.MqttDataRecordMapper; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceAttributeMapper; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -21,8 +24,7 @@ import java.time.LocalDateTime; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_ATTRIBUTE_NOT_EXISTS; -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_NOT_EXISTS; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; /** * 物联设备 Service 实现类 @@ -42,6 +44,12 @@ public class DeviceServiceImpl implements DeviceService { private MqttDataRecordMapper mqttDataRecordMapper; @Override public Long createDevice(DeviceSaveReqVO createReqVO) { + if(StringUtils.isNotBlank(createReqVO.getReadTopic())){ + DeviceDO temp = deviceMapper.selectByTopic(createReqVO.getReadTopic()); + if (temp!=null){ + throw exception(DEVICE_EXISTS); + } + } // 插入 DeviceDO device = BeanUtils.toBean(createReqVO, DeviceDO.class); deviceMapper.insert(device); @@ -100,12 +108,23 @@ public class DeviceServiceImpl implements DeviceService { public DeviceDO getDevice(Long id) { return deviceMapper.selectById(id); } - + @Override + public DeviceDO getDeviceByName(String name) { + return deviceMapper.selectByName(name); + } + @Override + public DeviceDO getDeviceByTopic(String topic) { + return deviceMapper.selectByTopic(topic); + } @Override public PageResult getDevicePage(DevicePageReqVO pageReqVO) { return deviceMapper.selectPage(pageReqVO); } + @Override + public List selectList(DevicePageReqVO reqVO){ + return deviceMapper.selectList(reqVO); + } // ==================== 子表(设备属性) ==================== @Override diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mqtt/MqttServerDataController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mqtt/MqttServerDataController.java index ab3952e5d9..a890b40116 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mqtt/MqttServerDataController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/mqtt/MqttServerDataController.java @@ -1,10 +1,16 @@ package cn.iocoder.yudao.module.mes.controller.admin.mqtt; +import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord.MqttDataService; import cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord.vo.MqttDataRecordPageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.mqttrecord.vo.MqttRecordSaveReqVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.formula.FormulaRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO; +import cn.iocoder.yudao.module.iot.dal.mysql.formula.FormulaRecordMapper; import cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord.MqttDataRecordMapper; +import cn.iocoder.yudao.module.iot.service.device.DeviceService; import cn.iocoder.yudao.module.iot.service.mqttrecord.MqttRecordService; import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.Operation; @@ -31,6 +37,11 @@ public class MqttServerDataController { private MqttDataRecordMapper mqttDataRecordMapper; @Resource private MqttRecordService mqttRecordService; + @Resource + private DeviceService deviceService; + @Resource + private MqttDataService mqttDataService; + @PostMapping("/create") @Operation(summary = "创建设备数据记录") public CommonResult createMqttDataRecord(@RequestBody MqttDataSaveVO saveVO) { @@ -39,23 +50,36 @@ public class MqttServerDataController { List list = new ArrayList<>(); boolean valid = false; for (String key: saveVO.getPayload().keySet()) { - MqttDataRecordDO recordDO = new MqttDataRecordDO().setDeviceName(saveVO.getTopic()) - .setAttribute(key).setAttrValue(saveVO.getPayload().get(key)); - list.add(recordDO); + String value = saveVO.getPayload().get(key); //检查值是否有效,有可能都是空值那就不存 - if(StringUtils.isNotBlank(recordDO.getAttrValue())) + if(StringUtils.isNotBlank(value)) valid = true; + else continue; + + MqttDataRecordDO recordDO = new MqttDataRecordDO().setDeviceName(saveVO.getTopic()) + .setAttribute(key).setAttrValue(value); + list.add(recordDO); + } if(list.size()>0 && valid){ //保存单个值 mqttDataRecordMapper.insertBatch(list); //保存原值 MqttRecordSaveReqVO createReqVO = new MqttRecordSaveReqVO(); - createReqVO.setDeviceCode(saveVO.getTopic()); + //createReqVO.setDeviceCode(saveVO.getTopic()); + createReqVO.setDeviceName(saveVO.getTopic()); createReqVO.setGatewayCode(""); createReqVO.setDeviceDataTime(LocalDateTime.now()); createReqVO.setDeviceData(JSON.toJSONString(saveVO.getPayload())); mqttRecordService.createMqttRecord(createReqVO); + + DeviceDO deviceDO = deviceService.getDeviceByTopic(saveVO.getTopic()); + if(deviceDO!=null){ + //告警检测 + mqttDataService.checkDeviceAlert(saveVO.getPayload(), deviceDO); + //更新iot设备在线状态 + mqttDataService.updateDeviceStatus(deviceDO); + } } } return success(1L); @@ -80,4 +104,44 @@ public class MqttServerDataController { public CommonResult getSum(MqttDataRecordPageReqVO reqVO) { return success(mqttDataRecordMapper.selectSum(reqVO)); } + @Resource + private FormulaRecordMapper formulaRecordMapper; + @PostMapping("/getSimulateValue") + @Operation(summary = "模拟数据最新值") + public CommonResult getSimulateValue(@RequestParam("random")int random,@RequestParam("type")String type + ,@RequestParam("id")Long id,@RequestParam("plusValue") double plusValue) { + if(id!=null){ + FormulaRecordDO recordDO = formulaRecordMapper.selectById(id); + if(recordDO==null)return success(BigDecimal.ZERO.doubleValue()); + if(random == 1){ + if(type.equals("int")){ + int i = RandomUtil.randomInt(1,10); + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(i))); + } + if(type.equals("double")){ + double i = RandomUtil.randomDouble(1,10); + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(i))); + } + } + else{ + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(plusValue))); + } + formulaRecordMapper.updateById(recordDO); + return success(recordDO.getDataValue().doubleValue()); + } + return success(BigDecimal.ZERO.doubleValue()); + } + @GetMapping("/setSimulateValue") + @Operation(summary = "设置模拟数据默认值") + public CommonResult setSimulateValue(@RequestParam("id")Long id,@RequestParam("resetValue") double resetValue) { + if(id!=null){ + FormulaRecordDO recordDO = formulaRecordMapper.selectById(id); + if(recordDO==null)return success("操作失败"); + + recordDO.setDataValue(BigDecimal.valueOf(resetValue)); + formulaRecordMapper.updateById(recordDO); + return success("操作失败"); + } + return success("操作失败"); + } } \ 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/producereport/vo/ProduceReportPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportPageReqVO.java index a2ea1f4217..6cc18d8c83 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportPageReqVO.java @@ -60,5 +60,8 @@ public class ProduceReportPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] reportDate; + @Schema(description = "加班时长") + private BigDecimal plusTime; + private List userIds; } \ 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/producereport/vo/ProduceReportRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportRespVO.java index b578eeaf90..f6769c7480 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportRespVO.java @@ -75,5 +75,7 @@ public class ProduceReportRespVO { @DictFormat("mes_produce_report_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private String reportType; - + @Schema(description = "加班时长") + @ExcelProperty("加班时长") + private BigDecimal plusTime; } \ 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/producereport/vo/ProduceReportSaveReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportSaveReqVO.java index 2cc8da0488..1468859790 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/producereport/vo/ProduceReportSaveReqVO.java @@ -58,4 +58,7 @@ public class ProduceReportSaveReqVO { private List produceReportDetails; @Schema(description = "报工日期字符串") private String reportDateString; + + @Schema(description = "加班时长") + private BigDecimal plusTime; } \ 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/producereport/ProduceReportDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/producereport/ProduceReportDO.java index eb34db1f99..775f7f24d6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/producereport/ProduceReportDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/producereport/ProduceReportDO.java @@ -1,13 +1,14 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.producereport; +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 com.sun.xml.bind.v2.TODO; import lombok.*; -import java.util.*; + import java.math.BigDecimal; import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; /** * 生产报工单 DO @@ -86,4 +87,6 @@ public class ProduceReportDO extends BaseDO { */ private LocalDateTime reportDate; + //@ExcelProperty("加班时长") + private BigDecimal plusTime; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/web/ScheduledService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/web/ScheduledService.java new file mode 100644 index 0000000000..629da9bf71 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/framework/web/ScheduledService.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.framework.web; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.module.iot.dal.dataobject.formula.FormulaRecordDO; +import cn.iocoder.yudao.module.iot.dal.mysql.formula.FormulaRecordMapper; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +@Component +@EnableScheduling +public class ScheduledService { + @Resource + private FormulaRecordMapper formulaRecordMapper; + /**定时读取PLC*/ + //@Scheduled(fixedDelay = 1000) + public void readPLCJob() { + System.out.println("-------定时读取PLC-------"); + } + + private void dealRecord(Long id, String type, boolean random, double plusValue, int min, int max){ + if(id!=null){ + FormulaRecordDO recordDO = formulaRecordMapper.selectById(id); + if(recordDO==null)return; + if(random){ + if(type.equals("int")){ + int i = RandomUtil.randomInt(min,max); + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(i))); + } + if(type.equals("double")){ + double i = RandomUtil.randomDouble(min,max); + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(i))); + } + } + else{ + recordDO.setDataValue(recordDO.getDataValue().add(BigDecimal.valueOf(plusValue))); + } + formulaRecordMapper.updateById(recordDO); + } + } +} diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 402c7d0af4..6a4dc189ea 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -1,5 +1,5 @@ server: - port: 48080 + port: 48081 --- #################### 数据库相关配置 #################### @@ -8,7 +8,7 @@ spring: autoconfigure: exclude: - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 - - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 +# - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 @@ -49,6 +49,8 @@ spring: master: name: besure_neimeng url: jdbc:mysql://47.106.185.127:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + + #url: jdbc:mysql://111.67.199.122:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 username: besure_user1 password: zpW5:,LGHACh diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 1a0bc27bee..2c0a9e6d1d 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -310,6 +310,8 @@ yudao: - iot_device - iot_mqtt_record - iot_mqtt_data_record + - iot_device + - iot_device_attribute - mes_view_task_product_summary - mes_view_report_plan_summary - mes_view_report_user_date_summary