src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
@@ -36,5 +36,8 @@ IGNORE_TABLES.add("gen_table"); IGNORE_TABLES.add("gen_table_column"); IGNORE_TABLES.add("custom_storage_warning_record"); IGNORE_TABLES.add("stock_taking"); IGNORE_TABLES.add("stock_time_setting"); IGNORE_TABLES.add("env_device_command"); } } src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -30,6 +30,11 @@ @ApiModelProperty("计划保养日期") private LocalDateTime maintenancePlanTime; @ApiModelProperty("保养周期") private String maintenanceCycle; @ApiModelProperty("保养内容") private String maintenanceContent; @ApiModelProperty("实际保养人") private String maintenanceActuallyName; src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -24,6 +24,13 @@ @Excel(name = "计划保养日期", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30) @ApiModelProperty("计划保养日期") private Date maintenancePlanTime; @Excel(name = "保养周期") @ApiModelProperty("保养周期") private String maintenanceCycle; @Excel(name = "保养内容") @ApiModelProperty("保养内容") private String maintenanceContent; @ApiModelProperty("实际保养人") @Excel(name = "实际保养人") src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -31,6 +31,11 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime maintenancePlanTime; @ApiModelProperty("保养周期") private String maintenanceCycle; @ApiModelProperty("保养内容") private String maintenanceContent; @ApiModelProperty("实际保养人") private String maintenanceActuallyName; src/main/java/com/ruoyi/measuringinstrumentledger/pojo/MeasuringInstrumentLedgerRecord.java
@@ -81,6 +81,11 @@ */ @ApiModelProperty("有效期(单位天)") private Integer valid; @ApiModelProperty("下次检定日期") @TableField(exist = false) @Excel(name = "下次检定日期", width = 30, dateFormat = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date nextDate; /** src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java
@@ -9,6 +9,15 @@ import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.Map; import java.math.BigDecimal; import java.time.LocalDateTime; import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.mapper.CustomStorageWarningRecordMapper; import com.ruoyi.procurementrecord.mapper.CustomStorageMapper; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,10 +29,65 @@ @Autowired private CustomStorageWarningRecordService customStorageWarningRecordService; @Autowired private CustomStorageWarningRecordMapper warningRecordMapper; @Autowired private CustomStorageMapper customStorageMapper; @GetMapping("/pageList") @Log(title = "仓储物流-库存预警-分页查询", businessType = BusinessType.OTHER) public AjaxResult pageList(Page page, ProcurementPageDto dto){ return AjaxResult.success(customStorageWarningRecordService.listPage(page,dto)); } } /** * 生成采购建议 / 滞销处理提示(并记录到预警事件) */ @PostMapping("/generateSuggestion") @Log(title = "仓储物流-库存预警-生成建议", businessType = BusinessType.UPDATE) public AjaxResult generateSuggestion(@RequestBody Map<String, Object> body) { Object idObj = body.get("id"); if (idObj == null) return AjaxResult.error("参数不能为空"); String type = body.get("type") == null ? "采购建议" : body.get("type").toString(); Long targetId = Long.valueOf(idObj.toString()); CustomStorageWarningRecord record = warningRecordMapper.selectById(targetId); if (record == null) { com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<CustomStorageWarningRecord> w = new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>(); w.eq(CustomStorageWarningRecord::getCustomStorageId, targetId.intValue()).last("limit 1"); record = warningRecordMapper.selectOne(w); } if (record == null) { record = new CustomStorageWarningRecord(); record.setCustomStorageId(targetId.intValue()); record.setWarningStatus("已预警"); record.setWarningTime(LocalDateTime.now()); try { record.setTenantId(com.ruoyi.common.utils.SecurityUtils.getLoginUser().getTenantId()); } catch (Exception ignored) { } warningRecordMapper.insert(record); } CustomStorage storage = record.getCustomStorageId() == null ? null : customStorageMapper.selectById(record.getCustomStorageId()); String product = storage == null ? "未知商品" : (storage.getProductCategory() == null ? "" : storage.getProductCategory()) + (storage.getSpecificationModel() == null ? "" : " " + storage.getSpecificationModel()); BigDecimal current = (storage == null || storage.getInboundNum() == null) ? BigDecimal.ZERO : storage.getInboundNum(); BigDecimal warn = storage == null ? null : storage.getWarnNum(); String content; if (type.contains("采购")) { BigDecimal suggest = (warn == null ? BigDecimal.ZERO : warn).subtract(current); if (suggest.compareTo(BigDecimal.ZERO) <= 0) suggest = BigDecimal.valueOf(10); content = String.format("【采购建议】%s 当前库存 %s,最低库存阈值 %s,建议采购 %s(建议结合近30天消耗量补货)", product, current.toPlainString(), warn == null ? "-" : warn.toPlainString(), suggest.toPlainString()); } else { content = String.format("【滞销处理提示】%s 当前库存 %s,周转缓慢/库存偏高,建议:①促销或内部领用 ②转作其他用途 ③与供应商协商退换货", product, current.toPlainString()); } record.setSuggestionType(type); record.setSuggestionContent(content); record.setSuggestionTime(LocalDateTime.now()); warningRecordMapper.updateById(record); return AjaxResult.success(content); }} src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -28,5 +28,7 @@ * 供应商名称(退货出库-退回供应商时使用) */ private String supplierName; /** 领用数量 */ private String requisitionNum; } src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -125,6 +125,8 @@ */ @TableField(fill = FieldFill.INSERT) private Long tenantId; @ApiModelProperty(value = "登记人") private String registrant; /** * 预警数量 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java
@@ -48,5 +48,13 @@ private LocalDateTime expectedshortagetime; private Long tenantId; /** 建议类型 */ private String suggestionType; /** 建议内容 */ private String suggestionContent; /** 生成时间 */ private LocalDateTime suggestionTime; } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -91,5 +91,7 @@ */ @TableField(fill = FieldFill.INSERT) private Long tenantId; /** 领用数量 */ private java.math.BigDecimal requisitionNum; } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -95,4 +95,5 @@ */ @TableField(fill = FieldFill.INSERT) private Long tenantId; private String registrant; } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -80,7 +80,15 @@ .createBy(sysUser.getNickName()) .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId())) .updateTime(LocalDateTime.now()); this.save(procurementRecordOut.build()); ProcurementRecordOut saved = procurementRecordOut.build(); this.save(saved); if (StringUtils.isNotEmpty(procurementRecordOutAdd.getRequisitionNum()) && saved.getId() != null) { ProcurementRecordOut upd = ProcurementRecordOut.builder() .id(saved.getId()) .requisitionNum(new BigDecimal(procurementRecordOutAdd.getRequisitionNum())) .build(); procurementRecordOutMapper.updateById(upd); } return 0; } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -473,6 +473,9 @@ Long aLong = customStorageMapper.selectCount(null); item.setInboundBatches(aLong.equals(0L) ? "第1批次(自定义入库)" : "第"+ (aLong + 1) + "批次(自定义入库)" ); item.setCreateBy(loginUser.getNickName()); if (item.getRegistrant() == null || item.getRegistrant().trim().isEmpty()) { item.setRegistrant(loginUser.getNickName()); } item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, "")); customStorageMapper.insert(item); }); src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -37,5 +37,10 @@ */ @ApiModelProperty(value = "排产日期") private String schedulingDate; /** 生产要求 */ private String productionRequirement; /** 完成期限 */ private String completionDeadline; } src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -105,5 +105,16 @@ private BigDecimal successNum; private Long tenantId; /** 生产要求 */ @Excel(name = "生产要求") @ApiModelProperty(value = "生产要求") private String productionRequirement; /** 完成期限 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "完成期限", width = 30, dateFormat = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "完成期限") private Date completionDeadline; } src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -43,6 +43,13 @@ @Excel(name = "产品大类") @ApiModelProperty(value = "产品大类") private String productCategory; @Excel(name = "产品名称") @ApiModelProperty(value = "产品名称") private String productName; @Excel(name = "项目名称") @ApiModelProperty(value = "项目名称") private String projectName; /** * 规格型号 src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -56,6 +56,11 @@ * 派工日期 */ private LocalDate schedulingDate; /** 生产要求 */ private String productionRequirement; /** 完成期限 */ private LocalDate completionDeadline; /** * 排产状态(1-待排产 2-排产中 3-已排产) src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -106,6 +106,12 @@ .schedulingUserName(sysUser.getNickName()) .schedulingNum(productionDispatchAddDto.getSchedulingNum()) .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)) .productionRequirement(productionDispatchAddDto.getProductionRequirement()) .completionDeadline( productionDispatchAddDto.getCompletionDeadline() != null && !productionDispatchAddDto.getCompletionDeadline().isEmpty() ? LocalDate.parse(productionDispatchAddDto.getCompletionDeadline(), DateTimeFormatter.ISO_LOCAL_DATE) : null) .status(1) .build(); return salesLedgerSchedulingMapper.insert(salesLedgerScheduling); src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
@@ -36,6 +36,7 @@ private String taxRate; // 登记人 @Excel(name = "登记人") private String registrant; private String searchText; src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -197,6 +197,13 @@ private String issueDateStart; @TableField(exist = false) private String issueDateEnd; @ApiModelProperty(value = "发票金额-起始(查询用)") @TableField(exist = false) private BigDecimal invoiceAmountStart; @ApiModelProperty(value = "发票金额-结束(查询用)") @TableField(exist = false) private BigDecimal invoiceAmountEnd; @TableField(exist = false) private String supplierNameOrContractNo; src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -382,6 +382,12 @@ } queryWrapper.eq(TicketRegistration::getTenantId, SecurityUtils.getLoginUser().getTenantId()) .eq(TicketRegistration::getDeleteFlag,0); if (ticketRegistration.getInvoiceAmountStart() != null) { queryWrapper.ge(TicketRegistration::getInvoiceAmount, ticketRegistration.getInvoiceAmountStart()); } if (ticketRegistration.getInvoiceAmountEnd() != null) { queryWrapper.le(TicketRegistration::getInvoiceAmount, ticketRegistration.getInvoiceAmountEnd()); } IPage<TicketRegistration> ticketRegistrationIPage = ticketRegistrationMapper.selectPage(page, queryWrapper); // 计算已付款金额 if (CollectionUtils.isNotEmpty(ticketRegistrationIPage.getRecords())) { src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationProductDto.java
@@ -68,6 +68,11 @@ private String createTimeStart; @TableField(exist = false) private String createTimeEnd; @ApiModelProperty(value = "发票金额-开始") private BigDecimal invoiceAmountStart; @ApiModelProperty(value = "发票金额-结束") private BigDecimal invoiceAmountEnd; } src/main/java/com/ruoyi/sales/excel/InvoiceLedgerExcelDto.java
@@ -21,7 +21,7 @@ @Excel(name = "销售合同号") private String salesContractNo; @Excel(name = "") @Excel(name = "客户合同号") private String customerContractNo; @Excel(name = "客户名称") src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -198,7 +198,7 @@ return invoiceLedgerExcelDto; }).collect(Collectors.toList()); ExcelUtil<InvoiceLedgerExcelDto> util = new ExcelUtil<InvoiceLedgerExcelDto>(InvoiceLedgerExcelDto.class); util.exportExcel(response, invoiceLedgerExcelDtoList, "供应商导出"); util.exportExcel(response, invoiceLedgerExcelDtoList, "开票台账"); } /** @@ -305,7 +305,7 @@ @Override public IPage<InvoiceRegistrationProductDto> registrationProductPage(Page page, InvoiceRegistrationProductDto registrationProductDto) { IPage<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoIPage = invoiceRegistrationProductMapper.invoiceRegistrationProductPage(page, registrationProductDto); if (registrationProductDto.getStatus()) { if (Boolean.TRUE.equals(registrationProductDto.getStatus())) { invoiceRegistrationProductDtoIPage.getRecords().removeIf(invoiceRegistrationProduct -> !StringUtils.isEmpty(invoiceRegistrationProduct.getInvoiceNo())); } invoiceRegistrationProductDtoIPage.getRecords().forEach(invoiceRegistrationProductDto -> { src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -9,6 +9,8 @@ select dm.id, dm.device_ledger_id, dm.maintenance_plan_time, dm.maintenance_cycle, dm.maintenance_content, dm.maintenance_actually_time, dm.maintenance_result, dm.status, @@ -47,6 +49,8 @@ select dm.id, dm.device_ledger_id, dm.maintenance_plan_time, dm.maintenance_cycle, dm.maintenance_content, dm.maintenance_actually_time, dm.maintenance_result, dm.status, src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml
@@ -13,6 +13,7 @@ t2.model, t1.valid, t1.record_date, DATE_ADD(t1.record_date, INTERVAL t1.valid DAY) AS next_date, t1.entry_date FROM measuring_instrument_ledger_record t1 @@ -44,6 +45,7 @@ t2.model, t1.valid, t1.record_date, DATE_ADD(t1.record_date, INTERVAL t1.valid DAY) AS next_date, t1.entry_date FROM measuring_instrument_ledger_record t1 src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -71,6 +71,8 @@ T2.scheduling_user_id, T2.scheduling_user_name, T2.scheduling_date, T2.production_requirement, T2.completion_deadline, ifNull(T2.scheduling_num,0) AS schedulingNum, ifNull(T2.finished_num,0) AS successNum, t3.product_category, src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
@@ -115,6 +115,18 @@ <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''"> AND T3.invoice_date <= date_format(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d') </if> <if test="invoiceRegistrationProductDto.invoiceDateStart != null and invoiceRegistrationProductDto.invoiceDateStart != ''"> AND T3.invoice_date >= date_format(#{invoiceRegistrationProductDto.invoiceDateStart}, '%Y-%m-%d') </if> <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''"> AND T3.invoice_date <= date_format(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d') </if> <if test="invoiceRegistrationProductDto.invoiceAmountStart != null"> AND T3.invoice_total >= #{invoiceRegistrationProductDto.invoiceAmountStart} </if> <if test="invoiceRegistrationProductDto.invoiceAmountEnd != null"> AND T3.invoice_total <= #{invoiceRegistrationProductDto.invoiceAmountEnd} </if> <if test="invoiceRegistrationProductDto.createTimeStart != null "> AND T1.create_time >= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d %H:%i:%s') </if>