doc/20260520_Ê×Ò³Éú²ú¿´°åǰ¶ËÁªµ÷Îĵµ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,160 @@ # é¦é¡µçäº§çæ¿å端èè°ææ¡£ æ´æ°æ¶é´ï¼2026-05-20 模åï¼`/home`ï¼é¦é¡µï¼ ## 1. æ¥å£æ¸ å 1. `GET /home/productionOverview`ï¼ç产æ»è§ 2. `GET /home/productionRealtimeBoard`ï¼çäº§å®æ¶çæ¿ 3. `GET /home/productionOrderProgress`ï¼ç产订åè¿åº¦ 4. `GET /home/todayProductionPlan`ï¼ä»æ¥çäº§è®¡å æææ¥å£ç»ä¸è¿å `AjaxResult`ï¼ ```json { "code": 200, "msg": "æä½æå", "data": {} } ``` ## 2. ç产æ»è§ ### 2.1 è¯·æ± ```http GET /home/productionOverview ``` ### 2.2 è¿å `data` ```json { "totalOutput": 1280.00, "totalScrap": 25.00, "yieldRate": 98.08 } ``` åæ®µè¯´æï¼ - `totalOutput`ï¼ç´¯è®¡äº§åºï¼ä»¶ï¼åæ ¼æ°ï¼ - `totalScrap`ï¼ç´¯è®¡æ¥åºï¼ä»¶ï¼ - `yieldRate`ï¼è¯çï¼0-100ï¼å端å±ç¤ºæ¶å¯æ¼æ¥ `%`ï¼ ## 3. çäº§å®æ¶çæ¿ ### 3.1 è¯·æ± ```http GET /home/productionRealtimeBoard ``` ### 3.2 è¿å `data` ```json { "deviceOee": { "value": 74.00, "compareYesterday": 2.50 }, "orderAchievementRate": { "value": 81.30, "compareYesterday": -1.20 }, "defectRate": { "value": 1.40, "compareYesterday": 0.30 } } ``` åæ®µè¯´æï¼ - `value`ï¼å½æ¥ææ å¼ï¼0-100ï¼ - `compareYesterday`ï¼è¾æ¨æ¥ååå¼ï¼å¯æ£å¯è´ï¼åç«¯ææ£è´å³å®ç®å¤´æ¹ååé¢è²ï¼ ## 4. ç产订åè¿åº¦ ### 4.1 è¯·æ± ```http GET /home/productionOrderProgress?tab=all&pageNum=1&pageSize=10 ``` åæ°ï¼ - `tab`ï¼`all` / `inProgress` / `completed` / `paused` - `pageNum`ï¼é¡µç ï¼é»è®¤ `1`ï¼ - `pageSize`ï¼æ¯é¡µæ¡æ°ï¼é»è®¤ `10`ï¼æå¤§ `50`ï¼ ### 4.2 è¿å `data` ```json { "tab": "all", "total": 24, "pageNum": 1, "pageSize": 10, "inProgressCount": 6, "completedCount": 12, "pausedCount": 2, "records": [ { "orderNo": "MO-20260518-001", "productName": "æºè½æ§å¶å¨", "plannedQuantity": 1000.00, "completedQuantity": 860.00, "completionRate": 86.00, "dueDate": "2026-05-20", "status": 2, "statusLabel": "è¿è¡ä¸" } ] } ``` åæ®µè¯´æï¼ - `completionRate`ï¼å®æçï¼0-100ï¼ - `status`ï¼åç«¯ç¶æç ï¼`1`å¾ å¼å§ï¼`2`è¿è¡ä¸ï¼`3`已宿ï¼`4`å·²æåï¼ - `statusLabel`ï¼ç¶æä¸æå±ç¤ºå¼ ## 5. 仿¥ç产计å ### 5.1 è¯·æ± ```http GET /home/todayProductionPlan?limit=4 ``` åæ°ï¼ - `limit`ï¼è¿åæ¡æ°ï¼é»è®¤ `4`ï¼æå¤§ `20`ï¼ ### 5.2 è¿å `data` ```json { "total": 9, "records": [ { "orderNo": "MO-20260518-004", "productName": "ç»æä»¶A", "plannedQuantity": 1200.00, "dueDate": "2026-05-15", "status": 2, "statusLabel": "è¿è¡ä¸" } ] } ``` ## 6. å端å±ç¤ºçº¦å® - ç¾åæ¯å段ç»ä¸æ¯æ°å¼ï¼å¦ `74.00`ï¼ï¼å端èªè¡æ¼æ¥ `%`ã - æææ°å¼ä¿ç两ä½å°æ°ã - `dueDate` å¯è½ä¸º `null`ï¼å端éå åºå±ç¤ºï¼å¦ `--`ï¼ã - `compareYesterday` æ£è´é½å¯è½åºç°ï¼å»ºè®®æ `>0` ä¸åã`<0` ä¸éã`=0` æå¹³å¤çã doc/20260520_Ê×Ò³Éú²ú¿´°åÐÔÄÜÓÅ»¯Ç°¶Ë±ä¸üÎĵµ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ # é¦é¡µçäº§çæ¿æ§è½ä¼ååç«¯åæ´ææ¡£ æ´æ°æ¶é´ï¼2026-05-20 éç¨é¡µé¢ï¼é¦é¡µ æ¶ååºåï¼ 1. ç产订åè¿åº¦ 2. 仿¥ç产计å ## 1. æ¬æ¬¡ä¼åç®æ éå¯¹å¤§æ°æ®éåºæ¯ï¼è®¢åæ°éå¤ãç产åå²é¿ï¼ä¼åæ¥è¯¢æ§è½ï¼éä½é¦é¡µæ¥å£ååºæ¶é´åå åå ç¨ã ## 2. æ¶åæ¥å£ 1. `GET /home/productionOrderProgress` 2. `GET /home/todayProductionPlan` ## 3. å端æ¯å¦éè¦æ¹ä»£ç ç»è®ºï¼**æ å¼ºå¶æ¹å¨ï¼æ¥å£å ¥åä¸è¿åç»æä¿æå ¼å®¹**ã ä½ ç°æé¡µé¢å¯ä»¥ç´æ¥èè°ï¼ä¸éè¦æ¹å段æ å°ã ## 4. æ¥å£è¯´æï¼ä¿æä¸åï¼ ### 4.1 ç产订åè¿åº¦ 请æ±ï¼ ```http GET /home/productionOrderProgress?tab=all&pageNum=1&pageSize=10 ``` åæ°ï¼ - `tab`ï¼`all` / `inProgress` / `completed` / `paused` - `pageNum`ï¼é¡µç ï¼é»è®¤ `1` - `pageSize`ï¼æ¯é¡µæ¡æ°ï¼é»è®¤ `10`ï¼æå¤§ `50` è¿å `data`ï¼ç»æä¸åï¼ï¼ ```json { "tab": "all", "total": 1200, "pageNum": 1, "pageSize": 10, "inProgressCount": 180, "completedCount": 900, "pausedCount": 20, "records": [ { "orderNo": "MO-20260518-001", "productName": "æºè½æ§å¶å¨", "plannedQuantity": 1000.00, "completedQuantity": 860.00, "completionRate": 86.00, "dueDate": "2026-05-20", "status": 2, "statusLabel": "è¿è¡ä¸" } ] } ``` ### 4.2 仿¥ç产计å 请æ±ï¼ ```http GET /home/todayProductionPlan?limit=4 ``` åæ°ï¼ - `limit`ï¼è¿åæ¡æ°ï¼é»è®¤ `4`ï¼æå¤§ `20` è¿å `data`ï¼ç»æä¸åï¼ï¼ ```json { "total": 230, "records": [ { "orderNo": "MO-20260518-004", "productName": "ç»æä»¶A", "plannedQuantity": 1200.00, "dueDate": "2026-05-15", "status": 2, "statusLabel": "è¿è¡ä¸" } ] } ``` ## 5. å端ä¼åç¹ï¼ä¾åç«¯ç¥æï¼ 1. 订åè¿åº¦ä¸ä»æ¥è®¡åæ¹ä¸ºè½»é SQLï¼ä» æ¥è¯¢é¦é¡µå¿ éåæ®µã 2. 廿äºé¦é¡µæ¥è¯¢è·¯å¾ä¸ä¸å¿ è¦çå¤§å ³èãå¾çå¡«å åå¯¹è±¡è£ é ã 3. ç¶æç»è®¡æ¹ä¸ºæ°æ®åºèå计æ°ï¼ä¸åéæ¡æå计ç®ã 4. å页䏿¡æ°ä¸éä¿çï¼`pageSize <= 50`, `limit <= 20`ï¼ã ## 6. å端建议 1. 忢 `tab` æ¶ä¿çç°æè°ç¨æ¹å¼å³å¯ã 2. `dueDate` å¯è½ä¸ºç©ºï¼ç»§ç»æ `--` å åºå±ç¤ºã 3. ç¾åæ¯å段ä»ä¸ºæ°å¼ï¼å端继ç»è¿½å `%` å±ç¤ºã src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -1,6 +1,10 @@ package com.ruoyi.home.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.dto.MapDto; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; @@ -9,6 +13,9 @@ import com.ruoyi.home.annotation.DefaultType; import com.ruoyi.home.dto.*; import com.ruoyi.home.service.HomeService; import com.ruoyi.production.mapper.ProductionOrderMapper; import com.ruoyi.production.mapper.ProductionProductOutputMapper; import com.ruoyi.production.pojo.ProductionOrder; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.AllArgsConstructor; @@ -17,9 +24,18 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; /** * @author :yys @@ -32,293 +48,608 @@ public class HomeController extends BaseController { private final HomeService homeService; private final ProductionOrderMapper productionOrderMapper; private final ProductionProductOutputMapper productionProductOutputMapper; private final DeviceLedgerMapper deviceLedgerMapper; private final DeviceRepairMapper deviceRepairMapper; private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final Integer ORDER_STATUS_WAIT = 1; private static final Integer ORDER_STATUS_RUNNING = 2; private static final Integer ORDER_STATUS_COMPLETED = 3; private static final Integer ORDER_STATUS_PAUSED = 4; /********************************************************åºç¡ç±»*****************************************************/ @GetMapping("/todos") @Log(title = "å¾ åäºé¡¹", businessType = BusinessType.OTHER) @Operation(summary = "å¾ åäºé¡¹") public AjaxResult todos(ApproveProcess req) throws ParseException { public R todos(ApproveProcess req) throws ParseException { List<ApproveProcess> approveProcessList = homeService.todos(); return AjaxResult.success(approveProcessList); return R.ok(approveProcessList); } @GetMapping("/approveAndDeviceTodos") @Operation(summary = "审æ¹ååï¼è®¾å¤æ¥ä¿®å¾ åäºé¡¹") public AjaxResult approveAndDeviceTodos(){ public R approveAndDeviceTodos(){ Map<String, Object> map = homeService.approveAndDeviceTodos(); return AjaxResult.success(map); return R.ok(map); } @GetMapping("/noticesCount") @Operation(summary = "æªè¿æçå ¬åæ°é") public AjaxResult noticesCount(){ public R noticesCount(){ Long count = homeService.noticesCount(); return AjaxResult.success(count); return R.ok(count); } @GetMapping("/deptStaffDistribution") @Operation(summary = "åé¨é¨äººååå¸") public AjaxResult deptStaffDistribution() { public R deptStaffDistribution() { DeptStaffDistributionDto dto = homeService.deptStaffDistribution(); return AjaxResult.success(dto); return R.ok(dto); } @GetMapping("/summaryStatistics") @Operation(summary = "åå·¥-客æ·-ä¾åºåæ»æ°") public AjaxResult summaryStatistics() { public R summaryStatistics() { HomeSummaryDto homeSummaryDto = homeService.summaryStatistics(); return AjaxResult.success(homeSummaryDto); return R.ok(homeSummaryDto); } /********************************************************è¥ééè´ç±»**************************************************/ @GetMapping("/supplierPurchaseRanking") @Operation(summary = "ä¾åºåéè´æå") public AjaxResult supplierPurchaseRanking(@DefaultType Integer type) { public R supplierPurchaseRanking(@DefaultType Integer type) { List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/customerRevenueAnalysis") @Operation(summary = "客æ·è¥æ¶è´¡ç®æ°å¼åæ") public AjaxResult customerRevenueAnalysis(Long customerId, @DefaultType Integer type) { public R customerRevenueAnalysis(Long customerId, @DefaultType Integer type) { CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type); return AjaxResult.success(dto); return R.ok(dto); } @GetMapping("/customerContributionRanking") @Operation(summary = "客æ·éé¢è´¡ç®æå") public AjaxResult customerContributionRanking(@DefaultType Integer type) { public R customerContributionRanking(@DefaultType Integer type) { List<CustomerContributionRankingDto> list = homeService.customerContributionRanking(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/productSalesAnalysis") @Operation(summary = "å产åéå®éé¢åæ") public AjaxResult productSalesAnalysis() { public R productSalesAnalysis() { List<MapDto> list = homeService.productSalesAnalysis(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/rawMaterialPurchaseAmountRatio") @Operation(summary = "åææéè´éé¢å æ¯") public AjaxResult rawMaterialPurchaseAmountRatio(){ public R rawMaterialPurchaseAmountRatio(){ List<MapDto> list = homeService.rawMaterialPurchaseAmountRatio(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/business") @Log(title = "éå®-éè´-åºåæ°æ®", businessType = BusinessType.OTHER) @Operation(summary = "éå®-éè´-åºåæ°æ®") public AjaxResult business(HomeBusinessDto req) { public R business(HomeBusinessDto req) { HomeBusinessDto homeBusinessDto = homeService.business(); return AjaxResult.success(homeBusinessDto); return R.ok(homeBusinessDto); } @GetMapping("/analysisCustomerContractAmounts") @Log(title = "客æ·ååéé¢åæ", businessType = BusinessType.OTHER) @Operation(summary = "客æ·ååéé¢åæ") public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) { public R analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) { AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts(); return AjaxResult.success(analysisCustomerContractAmounts); return R.ok(analysisCustomerContractAmounts); } /********************************************************ç产类*****************************************************/ @GetMapping("/inputOutputAnalysis") @Operation(summary = "æå ¥äº§åºåæ") public AjaxResult inputOutputAnalysis(@DefaultType Integer type){ public R inputOutputAnalysis(@DefaultType Integer type){ List<InputOutputAnalysisDto> list = homeService.inputOutputAnalysis(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/processOutputAnalysis") @Operation(summary = "å·¥åºäº§åºåæ") public AjaxResult processOutputAnalysis(@DefaultType Integer type){ public R processOutputAnalysis(@DefaultType Integer type){ List<MapDto> list = homeService.processOutputAnalysis(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/workOrderEfficiencyAnalysis") @Operation(summary = "å·¥åæ§è¡æçåæ") public AjaxResult workOrderEfficiencyAnalysis(@DefaultType Integer type){ public R workOrderEfficiencyAnalysis(@DefaultType Integer type){ List<WorkOrderEfficiencyDto> list = homeService.workOrderEfficiencyAnalysis(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/productionAccountingAnalysis") @Operation(summary = "çäº§æ ¸ç®åæ") public AjaxResult productionAccountingAnalysis(@DefaultType Integer type){ public R productionAccountingAnalysis(@DefaultType Integer type){ List<ProductionAccountingDto> list = homeService.productionAccountingAnalysis(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/orderCount") @Operation(summary = "è®¢åæ°") public AjaxResult orderCount(){ return AjaxResult.success(homeService.orderCount()); public R orderCount(){ return R.ok(homeService.orderCount()); } @GetMapping("/progressStatistics") @Operation(summary = "åç产订åç宿è¿åº¦ç»è®¡") public AjaxResult progressStatistics(){ public R progressStatistics(){ ProductionProgressDto productionProgressDto = homeService.productionProgress(); return AjaxResult.success(productionProgressDto); return R.ok(productionProgressDto); } @GetMapping("/workInProcessTurnover") @Operation(summary = "å¨å¶åå¨è½¬æ åµ") public AjaxResult workInProcessTurnover(){ public R workInProcessTurnover(){ ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover(); return AjaxResult.success(productionTurnoverDto); return R.ok(productionTurnoverDto); } @GetMapping("/processDataProductionStatistics") @Operation(summary = "å·¥åºæ°æ®ç产ç»è®¡æ°æ®") public AjaxResult processDataProductionStatistics(@DefaultType Integer type,@RequestParam(required = false) List<Long> processIds) { public R processDataProductionStatistics(@DefaultType Integer type,@RequestParam(required = false) List<Long> processIds) { List<processDataProductionStatisticsDto> list = homeService.processDataProductionStatistics(type, processIds); return AjaxResult.success(list); return R.ok(list); } /********************************************************è´¨éç±»*****************************************************/ @GetMapping("/productionOverview") @Operation(summary = "Production Overview") public R productionOverview() { LocalDate today = LocalDate.now(); Map<String, BigDecimal> totalStats = loadOutputStats(LocalDate.of(2000, 1, 1), today.plusDays(1)); BigDecimal totalOutput = totalStats.get("quantity"); BigDecimal totalScrap = totalStats.get("scrapQty"); BigDecimal yieldRate = calcRate(totalOutput, totalOutput.add(totalScrap)); Map<String, Object> result = new LinkedHashMap<>(); result.put("totalOutput", scale(totalOutput)); result.put("totalScrap", scale(totalScrap)); result.put("yieldRate", scale(yieldRate)); return R.ok(result); } @GetMapping("/productionRealtimeBoard") @Operation(summary = "Production Realtime Board") public R productionRealtimeBoard() { LocalDate today = LocalDate.now(); LocalDate yesterday = today.minusDays(1); BigDecimal todayDeviceOee = calcDeviceOee(today); BigDecimal yesterdayDeviceOee = calcDeviceOee(yesterday); BigDecimal todayOrderAchievementRate = calcOrderAchievementRate(today); BigDecimal yesterdayOrderAchievementRate = calcOrderAchievementRate(yesterday); BigDecimal todayDefectRate = calcDefectRate(today); BigDecimal yesterdayDefectRate = calcDefectRate(yesterday); Map<String, Object> result = new LinkedHashMap<>(); result.put("deviceOee", buildRealtimeMetric(todayDeviceOee, todayDeviceOee.subtract(yesterdayDeviceOee))); result.put("orderAchievementRate", buildRealtimeMetric(todayOrderAchievementRate, todayOrderAchievementRate.subtract(yesterdayOrderAchievementRate))); result.put("defectRate", buildRealtimeMetric(todayDefectRate, todayDefectRate.subtract(yesterdayDefectRate))); return R.ok(result); } @GetMapping("/productionOrderProgress") @Operation(summary = "Production Order Progress") public R productionOrderProgress(@RequestParam(defaultValue = "all") String tab, @RequestParam(defaultValue = "1") Long pageNum, @RequestParam(defaultValue = "10") Long pageSize) { long safePageNum = pageNum == null || pageNum < 1 ? 1 : pageNum; long safePageSize = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50); Integer status = resolveOrderStatus(tab); long offset = (safePageNum - 1) * safePageSize; List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeOrderProgressPage(status, offset, safePageSize); List<Map<String, Object>> records = new ArrayList<>(); if (rawRows != null) { for (Map<String, Object> rawRow : rawRows) { records.add(buildOrderProgressRow(rawRow)); } } long inProgressCount = 0L; long completedCount = 0L; long pausedCount = 0L; List<Map<String, Object>> statusCountRows = productionOrderMapper.countHomeOrderProgressByStatus(); if (statusCountRows != null) { for (Map<String, Object> countRow : statusCountRows) { Integer statusKey = toInteger(countRow.get("status")); long cnt = toLong(countRow.get("cnt")); if (Objects.equals(statusKey, ORDER_STATUS_RUNNING)) { inProgressCount = cnt; } else if (Objects.equals(statusKey, ORDER_STATUS_COMPLETED)) { completedCount = cnt; } else if (Objects.equals(statusKey, ORDER_STATUS_PAUSED)) { pausedCount = cnt; } } } Map<String, Object> result = new LinkedHashMap<>(); result.put("tab", tab); result.put("total", toLong(productionOrderMapper.countHomeOrderProgress(status))); result.put("pageNum", safePageNum); result.put("pageSize", safePageSize); result.put("inProgressCount", inProgressCount); result.put("completedCount", completedCount); result.put("pausedCount", pausedCount); result.put("records", records); return R.ok(result); } @GetMapping("/todayProductionPlan") @Operation(summary = "Today Production Plan") public R todayProductionPlan(@RequestParam(defaultValue = "4") Long limit) { long safeLimit = limit == null || limit < 1 ? 4 : Math.min(limit, 20); List<Map<String, Object>> records = new ArrayList<>(); List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeTodayProductionPlan(safeLimit); if (rawRows != null) { for (Map<String, Object> rawRow : rawRows) { Map<String, Object> row = new LinkedHashMap<>(); Integer rowStatus = toInteger(rawRow.get("status")); row.put("orderNo", rawRow.get("orderNo")); row.put("productName", rawRow.get("productName")); row.put("plannedQuantity", scale(toBigDecimal(rawRow.get("plannedQuantity")))); row.put("dueDate", rawRow.get("dueDate")); row.put("status", rowStatus); row.put("statusLabel", mapOrderStatusLabel(rowStatus)); records.add(row); } } Map<String, Object> result = new LinkedHashMap<>(); result.put("total", toLong(productionOrderMapper.countHomeTodayProductionPlan())); result.put("records", records); return R.ok(result); } @GetMapping("/rawMaterialDetection") @Operation(summary = "åæææ£æµ") public AjaxResult rawMaterialDetection(@DefaultType Integer type){ return AjaxResult.success(homeService.rawMaterialDetection(type)); public R rawMaterialDetection(@DefaultType Integer type){ return R.ok(homeService.rawMaterialDetection(type)); } @GetMapping("/processDetection") @Operation(summary = "è¿ç¨æ£æµ") public AjaxResult processDetection(@DefaultType Integer type){ return AjaxResult.success(homeService.processDetection(type)); public R processDetection(@DefaultType Integer type){ return R.ok(homeService.processDetection(type)); } @GetMapping("/factoryDetection") @Operation(summary = "æååºåæ£æµ") public AjaxResult factoryDetection(@DefaultType Integer type){ return AjaxResult.success(homeService.factoryDetection(type)); public R factoryDetection(@DefaultType Integer type){ return R.ok(homeService.factoryDetection(type)); } @GetMapping("/qualityInspectionCount") @Operation(summary = "è´¨éæ£éªæ°é") public AjaxResult qualityInspectionCount(){ public R qualityInspectionCount(){ QualityInspectionCountDto qualityInspectionCountDto = homeService.qualityInspectionCount(); return AjaxResult.success(qualityInspectionCountDto); return R.ok(qualityInspectionCountDto); } @GetMapping("/nonComplianceWarning") @Operation(summary = "ä¸åæ ¼é¢è¦") public AjaxResult nonComplianceWarning(){ public R nonComplianceWarning(){ NonComplianceWarningDto nonComplianceWarningDto = homeService.nonComplianceWarning(); return AjaxResult.success(nonComplianceWarningDto); return R.ok(nonComplianceWarningDto); } @GetMapping("/completedInspectionCount") @Operation(summary = "宿æ£éªæ°") public AjaxResult completedInspectionCount(){ public R completedInspectionCount(){ List<CompletedInspectionCountDto> list = homeService.completedInspectionCount(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/unqualifiedProductRanking") @Operation(summary = "ä¸åæ ¼äº§åæå") public AjaxResult unqualifiedProductRanking(){ public R unqualifiedProductRanking(){ List<UnqualifiedProductRankDto> list = homeService.unqualifiedProductRanking(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/unqualifiedProductProcessingAnalysis") @Operation(summary = "ä¸åæ ¼æ£åå¤çåæ") public AjaxResult unqualifiedProductProcessingAnalysis(){ public R unqualifiedProductProcessingAnalysis(){ List<MapDto> list = homeService.unqualifiedProductProcessingAnalysis(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/qualityStatistics") @Log(title = "è´¨éåæ", businessType = BusinessType.OTHER) @Operation(summary = "è´¨éåæ") public AjaxResult qualityStatistics(QualityStatisticsDto req) { public R qualityStatistics(QualityStatisticsDto req) { QualityStatisticsDto qualityStatisticsDto = homeService.qualityStatistics(); return AjaxResult.success(qualityStatisticsDto); return R.ok(qualityStatisticsDto); } @GetMapping("/qualityInspectionStatistics") @Operation(summary = "è´¨éç»è®¡") public AjaxResult qualityInspectionStatistics(@DefaultType Integer type) { public R qualityInspectionStatistics(@DefaultType Integer type) { QualityStatisticsDto dto = homeService.qualityInspectionStatistics(type); return AjaxResult.success(dto); return R.ok(dto); } /********************************************************è´¢å¡ç±»*****************************************************/ @GetMapping("/incomeExpenseAnalysis") @Operation(summary = "æ¯æ¶å¯¹æ¯åæ") public AjaxResult incomeExpenseAnalysis(@DefaultType Integer type) { public R incomeExpenseAnalysis(@DefaultType Integer type) { List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type); return AjaxResult.success(result); return R.ok(result); } @GetMapping("/profitTrendAnalysis") @Operation(summary = "婿¶¦è¶å¿åæ") public AjaxResult profitTrendAnalysis(){ public R profitTrendAnalysis(){ List<MapDto> list = homeService.profitTrendAnalysis(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/expenseCompositionAnalysis") @Operation(summary = "ææåæ") public AjaxResult expenseCompositionAnalysis(@DefaultType Integer type) { public R expenseCompositionAnalysis(@DefaultType Integer type) { List<MapDto> list = homeService.expenseCompositionAnalysis(type); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/monthlyIncome") @Operation(summary = "æåº¦æ¶å ¥") public AjaxResult monthlyIncome(){ public R monthlyIncome(){ MonthlyIncomeDto dto = homeService.monthlyIncome(); return AjaxResult.success(dto); return R.ok(dto); } @GetMapping("/monthlyExpenditure") @Operation(summary = "æåº¦æ¯åº") public AjaxResult monthlyExpenditure(){ public R monthlyExpenditure(){ MonthlyExpenditureDto dto = homeService.monthlyExpenditure(); return AjaxResult.success(dto); return R.ok(dto); } @GetMapping("/statisticsReceivablePayable") @Log(title = "åºæ¶åºä»ç»è®¡", businessType = BusinessType.OTHER) @Operation(summary = "åºæ¶åºä»ç»è®¡") public AjaxResult statisticsReceivablePayable(StatisticsReceivablePayableDto req, @DefaultType Integer type ) { public R statisticsReceivablePayable(StatisticsReceivablePayableDto req, @DefaultType Integer type ) { StatisticsReceivablePayableDto statisticsReceivablePayable = homeService.statisticsReceivablePayable(type); return AjaxResult.success(statisticsReceivablePayable); return R.ok(statisticsReceivablePayable); } /********************************************************ä»å¨ç±»*****************************************************/ @GetMapping("/productCategoryDistribution") @Operation(summary = "产å大类åå¸") public AjaxResult productCategoryDistribution() { public R productCategoryDistribution() { ProductCategoryDistributionDto dto = homeService.productCategoryDistribution(); return AjaxResult.success(dto); return R.ok(dto); } @GetMapping("/salesPurchaseStorageProductCount") @Operation(summary = "éå®-éè´-å¨åäº§åæ°") public AjaxResult salesPurchaseStorageProductCount(){ public R salesPurchaseStorageProductCount(){ List<MapDto> list = homeService.salesPurchaseStorageProductCount(); return AjaxResult.success(list); return R.ok(list); } @GetMapping("/productInOutAnalysis") @Operation(summary = "产ååºå ¥åºåæ") public AjaxResult productInOutAnalysis(@DefaultType Integer type){ public R productInOutAnalysis(@DefaultType Integer type){ List<Map<String, Object>> result = homeService.productInOutAnalysis(type); return AjaxResult.success(result); return R.ok(result); } @GetMapping("/productTurnoverDays") @Operation(summary = "产åå¨è½¬å¤©æ°") public AjaxResult productTurnoverDays(){ public R productTurnoverDays(){ List<MapDto> list = homeService.productTurnoverDays(); return AjaxResult.success(list); return R.ok(list); } private Map<String, Object> buildOrderProgressRow(Map<String, Object> rawRow) { Map<String, Object> row = new LinkedHashMap<>(); Integer rowStatus = toInteger(rawRow.get("status")); row.put("orderNo", rawRow.get("orderNo")); row.put("productName", rawRow.get("productName")); row.put("plannedQuantity", scale(toBigDecimal(rawRow.get("plannedQuantity")))); row.put("completedQuantity", scale(toBigDecimal(rawRow.get("completedQuantity")))); row.put("completionRate", scale(toBigDecimal(rawRow.get("completionRate")))); row.put("dueDate", rawRow.get("dueDate")); row.put("status", rowStatus); row.put("statusLabel", mapOrderStatusLabel(rowStatus)); return row; } private Integer resolveOrderStatus(String tab) { if (tab == null) { return null; } String normalized = tab.trim().toLowerCase(); if ("inprogress".equals(normalized)) { return ORDER_STATUS_RUNNING; } if ("completed".equals(normalized)) { return ORDER_STATUS_COMPLETED; } if ("paused".equals(normalized)) { return ORDER_STATUS_PAUSED; } return null; } private String mapOrderStatusLabel(Integer status) { if (Objects.equals(status, ORDER_STATUS_WAIT)) { return "å¾ å¼å§"; } if (Objects.equals(status, ORDER_STATUS_RUNNING)) { return "è¿è¡ä¸"; } if (Objects.equals(status, ORDER_STATUS_COMPLETED)) { return "已宿"; } if (Objects.equals(status, ORDER_STATUS_PAUSED)) { return "å·²æå"; } return "æªç¥"; } private Map<String, BigDecimal> loadOutputStats(LocalDate startDate, LocalDate endDateExclusive) { String start = startDate.atStartOfDay().format(DATE_TIME_FORMATTER); String end = endDateExclusive.atStartOfDay().format(DATE_TIME_FORMATTER); BigDecimal quantity = BigDecimal.ZERO; BigDecimal scrapQty = BigDecimal.ZERO; List<Map<String, Object>> rows = productionProductOutputMapper.selectDailyOutputStats(start, end); if (rows != null) { for (Map<String, Object> row : rows) { quantity = quantity.add(toBigDecimal(row.get("quantity"))); scrapQty = scrapQty.add(toBigDecimal(row.get("scrapQty"))); } } Map<String, BigDecimal> stats = new LinkedHashMap<>(); stats.put("quantity", quantity); stats.put("scrapQty", scrapQty); return stats; } private BigDecimal calcDeviceOee(LocalDate day) { long totalDeviceCount = deviceLedgerMapper.selectCount(new LambdaQueryWrapper<>()); if (totalDeviceCount <= 0) { return BigDecimal.ZERO; } Date start = Date.from(day.atStartOfDay(ZoneId.systemDefault()).toInstant()); Date end = Date.from(day.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant()); List<DeviceRepair> repairList = deviceRepairMapper.selectList(new LambdaQueryWrapper<DeviceRepair>() .select(DeviceRepair::getDeviceLedgerId) .ge(DeviceRepair::getRepairTime, start) .lt(DeviceRepair::getRepairTime, end) .in(DeviceRepair::getStatus, 0, 3)); long repairingDeviceCount = repairList == null ? 0 : repairList.stream() .map(DeviceRepair::getDeviceLedgerId) .filter(Objects::nonNull) .distinct() .count(); long availableDeviceCount = Math.max(totalDeviceCount - repairingDeviceCount, 0); return new BigDecimal(availableDeviceCount) .multiply(new BigDecimal("100")) .divide(new BigDecimal(totalDeviceCount), 2, RoundingMode.HALF_UP); } private BigDecimal calcOrderAchievementRate(LocalDate day) { List<ProductionOrder> orderList = productionOrderMapper.selectList(new LambdaQueryWrapper<ProductionOrder>() .select(ProductionOrder::getQuantity, ProductionOrder::getCompleteQuantity) .ge(ProductionOrder::getCreateTime, day.atStartOfDay()) .lt(ProductionOrder::getCreateTime, day.plusDays(1).atStartOfDay()) .ne(ProductionOrder::getStatus, ORDER_STATUS_PAUSED)); BigDecimal totalQuantity = BigDecimal.ZERO; BigDecimal totalCompleteQuantity = BigDecimal.ZERO; if (orderList != null) { for (ProductionOrder order : orderList) { totalQuantity = totalQuantity.add(zeroIfNull(order.getQuantity())); totalCompleteQuantity = totalCompleteQuantity.add(zeroIfNull(order.getCompleteQuantity())); } } return calcRate(totalCompleteQuantity, totalQuantity); } private BigDecimal calcDefectRate(LocalDate day) { Map<String, BigDecimal> stats = loadOutputStats(day, day.plusDays(1)); BigDecimal quantity = stats.get("quantity"); BigDecimal scrapQty = stats.get("scrapQty"); return calcRate(scrapQty, quantity.add(scrapQty)); } private Map<String, Object> buildRealtimeMetric(BigDecimal value, BigDecimal change) { Map<String, Object> metric = new LinkedHashMap<>(); metric.put("value", scale(value)); metric.put("compareYesterday", scale(change)); return metric; } private BigDecimal calcRate(BigDecimal numerator, BigDecimal denominator) { if (denominator == null || denominator.compareTo(BigDecimal.ZERO) <= 0) { return BigDecimal.ZERO; } return zeroIfNull(numerator) .multiply(new BigDecimal("100")) .divide(denominator, 2, RoundingMode.HALF_UP); } private BigDecimal toBigDecimal(Object value) { if (value == null) { return BigDecimal.ZERO; } if (value instanceof BigDecimal) { return (BigDecimal) value; } if (value instanceof Number) { return BigDecimal.valueOf(((Number) value).doubleValue()); } try { return new BigDecimal(String.valueOf(value)); } catch (Exception ex) { return BigDecimal.ZERO; } } private Integer toInteger(Object value) { if (value == null) { return null; } if (value instanceof Integer) { return (Integer) value; } if (value instanceof Number) { return ((Number) value).intValue(); } try { return Integer.valueOf(String.valueOf(value)); } catch (Exception ex) { return null; } } private long toLong(Object value) { if (value == null) { return 0L; } if (value instanceof Long) { return (Long) value; } if (value instanceof Number) { return ((Number) value).longValue(); } try { return Long.parseLong(String.valueOf(value)); } catch (Exception ex) { return 0L; } } private BigDecimal zeroIfNull(BigDecimal value) { return value == null ? BigDecimal.ZERO : value; } private BigDecimal scale(BigDecimal value) { return zeroIfNull(value).setScale(2, RoundingMode.HALF_UP); } } src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
@@ -12,6 +12,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Map; /** * <p> @@ -39,4 +40,16 @@ Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate); List<Map<String, Object>> selectHomeOrderProgressPage(@Param("status") Integer status, @Param("offset") Long offset, @Param("size") Long size); Long countHomeOrderProgress(@Param("status") Integer status); List<Map<String, Object>> countHomeOrderProgressByStatus(); List<Map<String, Object>> selectHomeTodayProductionPlan(@Param("size") Long size); Long countHomeTodayProductionPlan(); } src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; @@ -10,6 +10,7 @@ import com.ruoyi.quality.service.IQualityInspectFileService; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springframework.util.CollectionUtils; @@ -37,8 +38,9 @@ * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody QualityInspectDto qualityInspectDto) { return AjaxResult.success(qualityInspectService.add(qualityInspectDto)); @Operation(summary = "æ°å¢æ£éª") public R<?> add(@RequestBody QualityInspectDto qualityInspectDto) { return R.ok(qualityInspectService.add(qualityInspectDto)); } /** @@ -48,9 +50,10 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) { @Operation(summary = "å 餿£éª") public R<?> delQualityInspect(@RequestBody List<Integer> ids) { if (CollectionUtils.isEmpty(ids)) { return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); return R.fail("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } //å¦æå·²ç»æäº¤å°±ä¸å 许å é¤ List<QualityInspect> qualityInspects = qualityInspectService.listByIds(ids); @@ -66,7 +69,7 @@ qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery() .in(QualityInspectFile::getInspectId, ids)); //å 餿£éªå return AjaxResult.success(qualityInspectService.removeBatchByIds(ids)); return R.ok(qualityInspectService.removeBatchByIds(ids)); } /** @@ -76,8 +79,9 @@ * @return */ @GetMapping("/{id}") public AjaxResult QualityInspectDetail(@PathVariable("id") Integer id) { return AjaxResult.success(qualityInspectService.getDetailById(id)); @Operation(summary = "æ£éªè¯¦æ ") public R<?> QualityInspectDetail(@PathVariable("id") Integer id) { return R.ok(qualityInspectService.getDetailById(id)); } /** @@ -87,8 +91,9 @@ * @return */ @PostMapping("/update") public AjaxResult update(@RequestBody QualityInspectDto qualityInspectDto) { return AjaxResult.success(qualityInspectService.updateQualityInspect(qualityInspectDto)); @Operation(summary = "ä¿®æ¹æ£éª") public R<?> update(@RequestBody QualityInspectDto qualityInspectDto) { return R.ok(qualityInspectService.updateQualityInspect(qualityInspectDto)); } /** @@ -99,8 +104,9 @@ * @return */ @GetMapping("/listPage") public AjaxResult qualityInspectListPage(Page page, QualityInspectDto qualityInspect) { return AjaxResult.success(qualityInspectService.qualityInspectListPage(page, qualityInspect)); @Operation(summary = "å页æ¥è¯¢æ£éª") public R<?> qualityInspectListPage(Page page, QualityInspectDto qualityInspect) { return R.ok(qualityInspectService.qualityInspectListPage(page, qualityInspect)); } /** @@ -110,6 +116,7 @@ * @param qualityInspect */ @PostMapping("/export") @Operation(summary = "å¯¼åºæ£éª") public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) { qualityInspectService.qualityInspectExport(response, qualityInspect); } @@ -121,8 +128,9 @@ * @return */ @PostMapping("/submit") public AjaxResult submit(@RequestBody QualityInspect qualityInspect) { return AjaxResult.success(qualityInspectService.submit(qualityInspect)); @Operation(summary = "æäº¤æ£éª") public R<?> submit(@RequestBody QualityInspect qualityInspect) { return R.ok(qualityInspectService.submit(qualityInspect)); } /** @@ -132,6 +140,7 @@ * @param qualityInspect */ @PostMapping("/down") @Operation(summary = "ä¸è½½æ£éª") public void down(HttpServletResponse response, @RequestBody QualityInspect qualityInspect) { qualityInspectService.down(response, qualityInspect); } src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java
@@ -2,13 +2,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.service.IQualityInspectFileService; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import io.swagger.v3.oas.annotations.Operation; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -32,8 +33,9 @@ * @return */ @GetMapping("/{inspectId}") public AjaxResult QualityInspectParamDetail(@PathVariable("inspectId") Integer inspectId) { return AjaxResult.success(qualityInspectParamService.qualityInspectParamDetail(inspectId)); @Operation(summary = "æ£éªåæ°é¡¹è¯¦æ ") public R<?> QualityInspectParamDetail(@PathVariable("inspectId") Integer inspectId) { return R.ok(qualityInspectParamService.qualityInspectParamDetail(inspectId)); } @@ -43,8 +45,9 @@ * @return */ @PostMapping("/update") public AjaxResult update(@RequestBody List<QualityInspectParam> qualityInspectParams) { return AjaxResult.success(qualityInspectParamService.updateBatchById(qualityInspectParams)); @Operation(summary = "ä¿®æ¹æ£éªåæ°é¡¹") public R<?> update(@RequestBody List<QualityInspectParam> qualityInspectParams) { return R.ok(qualityInspectParamService.updateBatchById(qualityInspectParams)); } /** @@ -53,11 +56,12 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { @Operation(summary = "å 餿£éªåæ°é¡¹") public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); return R.fail("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(qualityInspectParamService.removeBatchByIds(ids)); return R.ok(qualityInspectParamService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java
@@ -1,8 +1,10 @@ package com.ruoyi.quality.controller; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.pojo.QualityTestStandardBinding; import com.ruoyi.quality.service.QualityTestStandardBindingService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -20,6 +22,7 @@ @RestController @RequestMapping("/qualityTestStandardBinding") @AllArgsConstructor @Tag(name = "æ£æµæ å主表ä¸äº§åå ³è表") public class QualityTestStandardBindingController { private QualityTestStandardBindingService qualityTestStandardBindingService; @@ -31,8 +34,9 @@ * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody List<QualityTestStandardBinding> qualityTestStandardBindings) { return AjaxResult.success(qualityTestStandardBindingService.add(qualityTestStandardBindings)); @Operation(summary = "æ°å¢æ£æµæ å主表ä¸äº§åå ³è表") public R<?> add(@RequestBody List<QualityTestStandardBinding> qualityTestStandardBindings) { return R.ok(qualityTestStandardBindingService.add(qualityTestStandardBindings)); } /** @@ -42,11 +46,12 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) { @Operation(summary = "å 餿£æµæ å主表ä¸äº§åå ³è表") public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) { if (CollectionUtils.isEmpty(ids)) { return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); return R.fail("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(qualityTestStandardBindingService.removeBatchByIds(ids)); return R.ok(qualityTestStandardBindingService.removeBatchByIds(ids)); } /** @@ -55,8 +60,9 @@ * @return */ @GetMapping("/list") public AjaxResult listBinding(Long testStandardId) { return AjaxResult.success(qualityTestStandardBindingService.listBinding(testStandardId)); @Operation(summary = "æ£æµææ ç»´æ¤æ¥è¯¢") public R<?> listBinding(Long testStandardId) { return R.ok(qualityTestStandardBindingService.listBinding(testStandardId)); } } src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -2,11 +2,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.quality.service.IQualityTestStandardService; import com.ruoyi.quality.service.QualityTestStandardParamService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,6 +26,7 @@ */ @RestController @RequestMapping("/qualityTestStandard") @Tag(name = "æ£æµæ å主表") public class QualityTestStandardController { @Resource @@ -39,8 +42,9 @@ * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody QualityTestStandard qualityTestStandard) { return AjaxResult.success(qualityTestStandardService.save(qualityTestStandard)); @Operation(summary = "æ°å¢æ£æµæ å主表") public R<?> add(@RequestBody QualityTestStandard qualityTestStandard) { return R.ok(qualityTestStandardService.save(qualityTestStandard)); } /** @@ -49,11 +53,12 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) { @Operation(summary = "å 餿£æµæ å主表") public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); return R.fail("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(qualityTestStandardService.delQualityTestStandard(ids)); return R.ok(qualityTestStandardService.delQualityTestStandard(ids)); } /** @@ -62,8 +67,9 @@ * @return */ @PostMapping("/update") public AjaxResult update(@RequestBody QualityTestStandard qualityTestStandard) { return AjaxResult.success(qualityTestStandardService.updateById(qualityTestStandard)); @Operation(summary = "æ£æµæ å主表修æ¹") public R<?> update(@RequestBody QualityTestStandard qualityTestStandard) { return R.ok(qualityTestStandardService.updateById(qualityTestStandard)); } /** @@ -73,8 +79,9 @@ * @return */ @GetMapping("/listPage") public AjaxResult qualityTestStandardListPage(Page page, QualityTestStandard qualityTestStandard) { return AjaxResult.success(qualityTestStandardService.qualityTestStandardListPage(page, qualityTestStandard)); @Operation(summary = "æ£æµæ å主表å页æ¥è¯¢") public R<?> qualityTestStandardListPage(Page page, QualityTestStandard qualityTestStandard) { return R.ok(qualityTestStandardService.qualityTestStandardListPage(page, qualityTestStandard)); } /** @@ -83,8 +90,9 @@ * @return */ @PostMapping("/copyParam") public AjaxResult copyParam(@RequestBody QualityTestStandard qualityTestStandard) { return AjaxResult.success(qualityTestStandardService.copyParam(qualityTestStandard)); @Operation(summary = "æ£æµæ åå¤å¶åæ°") public R<?> copyParam(@RequestBody QualityTestStandard qualityTestStandard) { return R.ok(qualityTestStandardService.copyParam(qualityTestStandard)); } /** @@ -93,8 +101,9 @@ * @return */ @PostMapping("/qualityTestStandardAudit") public AjaxResult qualityTestStandardAudit(@RequestBody List<QualityTestStandard> qualityTestStandards) { return AjaxResult.success(qualityTestStandardService.updateBatchById(qualityTestStandards)); @Operation(summary = "æ£æµæ åæ¹éå®¡æ ¸") public R<?> qualityTestStandardAudit(@RequestBody List<QualityTestStandard> qualityTestStandards) { return R.ok(qualityTestStandardService.updateBatchById(qualityTestStandards)); } /** @@ -102,8 +111,9 @@ * @return */ @GetMapping("/getQualityTestStandardByProductId") public AjaxResult getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) { return AjaxResult.success(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process)); @Operation(summary = "æ ¹æ®äº§åidæ¥è¯¢ç¸å ³çæ£éªæ å") public R<?> getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) { return R.ok(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process)); } /** @@ -111,8 +121,9 @@ * @return */ @GetMapping("/getQualityTestStandardParamByTestStandardId") public AjaxResult getQualityTestStandardParamByTestStandardId(Long testStandardId) { return AjaxResult.success(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, testStandardId))); @Operation(summary = "æ ¹æ®æ£æµæ åidæ¥è¯¢ç¸å ³çæ£éªæ ååæ°") public R<?> getQualityTestStandardParamByTestStandardId(Long testStandardId) { return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, testStandardId))); } } src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
@@ -2,10 +2,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.quality.service.QualityTestStandardParamService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,7 @@ @RestController @RequestMapping("/qualityTestStandardParam") @AllArgsConstructor @Tag(name = "æ£æµæ ååæ°") public class QualityTestStandardParamController { private QualityTestStandardParamService qualityTestStandardParamService; @@ -34,8 +37,9 @@ * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody QualityTestStandardParam qualityTestStandardParam) { return AjaxResult.success(qualityTestStandardParamService.save(qualityTestStandardParam)); @Operation(summary = "æ°å¢æ£æµæ ååæ°") public R<?> add(@RequestBody QualityTestStandardParam qualityTestStandardParam) { return R.ok(qualityTestStandardParamService.save(qualityTestStandardParam)); } /** @@ -44,11 +48,12 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) { @Operation(summary = "å 餿£æµææ ç»´æ¤") public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); return R.fail("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(qualityTestStandardParamService.removeBatchByIds(ids)); return R.ok(qualityTestStandardParamService.removeBatchByIds(ids)); } /** @@ -57,8 +62,9 @@ * @return */ @PostMapping("/update") public AjaxResult update(@RequestBody QualityTestStandardParam qualityTestStandardParam) { return AjaxResult.success(qualityTestStandardParamService.updateById(qualityTestStandardParam)); @Operation(summary = "æ£æµææ ç»´æ¤ä¿®æ¹") public R<?> update(@RequestBody QualityTestStandardParam qualityTestStandardParam) { return R.ok(qualityTestStandardParamService.updateById(qualityTestStandardParam)); } /** @@ -66,8 +72,9 @@ * @return */ @GetMapping("/list") public AjaxResult list(Long testStandardId) { return AjaxResult.success(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId,testStandardId))); @Operation(summary = "æ£æµææ ç»´æ¤æ¥è¯¢") public R<?> list(Long testStandardId) { return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId,testStandardId))); } } src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -1,9 +1,11 @@ package com.ruoyi.quality.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityUnqualifiedService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -16,6 +18,7 @@ */ @RestController @RequestMapping("/quality/qualityUnqualified") @Tag(name = "ä¸åæ ¼ç®¡ç") public class QualityUnqualifiedController { @Resource @@ -28,9 +31,10 @@ * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody QualityUnqualified qualityUnqualified) { @Operation(summary = "æ°å¢ä¸åæ ¼ç®¡ç") public R<?> add(@RequestBody QualityUnqualified qualityUnqualified) { qualityUnqualified.setInspectState(0); return AjaxResult.success(qualityUnqualifiedService.save(qualityUnqualified)); return R.ok(qualityUnqualifiedService.save(qualityUnqualified)); } /** @@ -39,13 +43,14 @@ * @return */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { @Operation(summary = "å é¤ä¸åæ ¼ç®¡ç") public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) { qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> { if (qualityUnqualified.getInspectState()==1){ throw new RuntimeException("该ä¸åæ ¼æ°æ®å·²ç»å¤çæ æ³å é¤!"); } }); return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids)); return R.ok(qualityUnqualifiedService.removeBatchByIds(ids)); } /** @@ -54,8 +59,9 @@ * @return */ @GetMapping("/{id}") public AjaxResult QualityUnqualifiedDetail(@PathVariable("id") Integer id) { return AjaxResult.success(qualityUnqualifiedService.getUnqualified(id)); @Operation(summary = "ä¸åæ ¼ç®¡ç详æ ") public R<?> QualityUnqualifiedDetail(@PathVariable("id") Integer id) { return R.ok(qualityUnqualifiedService.getUnqualified(id)); } /** @@ -64,8 +70,9 @@ * @return */ @PostMapping("/update") public AjaxResult update(@RequestBody QualityUnqualified qualityUnqualified) { return AjaxResult.success(qualityUnqualifiedService.updateById(qualityUnqualified)); @Operation(summary = "ä¸åæ ¼ç®¡çä¿®æ¹") public R<?> update(@RequestBody QualityUnqualified qualityUnqualified) { return R.ok(qualityUnqualifiedService.updateById(qualityUnqualified)); } /** @@ -75,8 +82,9 @@ * @return */ @GetMapping("/listPage") public AjaxResult qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { return AjaxResult.success(qualityUnqualifiedService.qualityUnqualifiedListPage(page, qualityUnqualified)); @Operation(summary = "ä¸åæ ¼ç®¡çå页æ¥è¯¢") public R<?> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { return R.ok(qualityUnqualifiedService.qualityUnqualifiedListPage(page, qualityUnqualified)); } /** @@ -85,6 +93,7 @@ * @param qualityUnqualified */ @PostMapping("/export") @Operation(summary = "ä¸åæ ¼ç®¡ç导åº") public void qualityUnqualifiedExport(HttpServletResponse response,QualityUnqualified qualityUnqualified) { qualityUnqualifiedService.qualityUnqualifiedExport(response, qualityUnqualified); } @@ -95,8 +104,9 @@ * @return */ @PostMapping("/deal") public AjaxResult deal(@RequestBody QualityUnqualified qualityUnqualified) { return AjaxResult.success(qualityUnqualifiedService.deal(qualityUnqualified)); @Operation(summary = "ä¸åæ ¼ç®¡çå¤ç") public R<?> deal(@RequestBody QualityUnqualified qualityUnqualified) { return R.ok(qualityUnqualifiedService.deal(qualityUnqualified)); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -528,7 +528,10 @@ salesLedger.setTenantId(customer.getTenantId()); // 3. æ°å¢ææ´æ°ä¸»è¡¨ if (salesLedger.getId() == null) { String contractNo = generateSalesContractNo(); String contractNo = salesLedger.getSalesContractNo(); if (StringUtils.isEmpty(contractNo)) { contractNo = generateSalesContractNo(); } salesLedger.setSalesContractNo(contractNo); salesLedgerMapper.insert(salesLedger); } else { src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -212,4 +212,61 @@ and ifnull(complete_quantity, 0) < quantity </select> <select id="selectHomeOrderProgressPage" resultType="java.util.Map"> select po.nps_no as orderNo, p.product_name as productName, ifnull(po.quantity, 0) as plannedQuantity, ifnull(po.complete_quantity, 0) as completedQuantity, round(ifnull(po.complete_quantity, 0) / nullif(po.quantity, 0) * 100, 2) as completionRate, po.plan_complete_time as dueDate, po.status as status from production_order po left join product_model pm on po.product_model_id = pm.id left join product p on pm.product_id = p.id <where> <if test="status != null"> and po.status = #{status} </if> </where> order by po.id desc limit #{offset}, #{size} </select> <select id="countHomeOrderProgress" resultType="java.lang.Long"> select count(1) from production_order po <where> <if test="status != null"> and po.status = #{status} </if> </where> </select> <select id="countHomeOrderProgressByStatus" resultType="java.util.Map"> select po.status as status, count(1) as cnt from production_order po where po.status in (2, 3, 4) group by po.status </select> <select id="selectHomeTodayProductionPlan" resultType="java.util.Map"> select po.nps_no as orderNo, p.product_name as productName, ifnull(po.quantity, 0) as plannedQuantity, po.plan_complete_time as dueDate, po.status as status from production_order po left join product_model pm on po.product_model_id = pm.id left join product p on pm.product_id = p.id where po.status in (1, 2) order by case when po.status = 2 then 0 else 1 end, po.id desc limit #{size} </select> <select id="countHomeTodayProductionPlan" resultType="java.lang.Long"> select count(1) from production_order po where po.status in (1, 2) </select> </mapper>