sql/migration_device_ledger_enable_status.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ -- 设å¤å°è´¦ï¼åæ¾ä½ç½®æ¹ä¸ºå¯ç¨/åç¨ç¶æ -- åç¨è®¾å¤ä¸åä¸å·¡æ£ï¼å®æ¶å·¡æ£ä»»å¡çææ¶ä¼è·³è¿ï¼ ALTER TABLE device_ledger ADD COLUMN is_enabled tinyint(1) NOT NULL DEFAULT 1 COMMENT 'æ¯å¦å¯ç¨ 1å¯ç¨ 0åç¨' AFTER status; src/main/java/com/ruoyi/approve/pojo/ApprovalTask.java
@@ -89,6 +89,13 @@ private Byte isRead; /** * èç¹å®¡æ¹æ¹å¼ï¼AND-ä¼ç¾ OR-æç¾ï¼ï¼éä»»å¡è¡¨å段ï¼å表å±ç¤ºæ¶ç±èç¹å®ä¾åå¡« */ @Schema(description ="èç¹å®¡æ¹æ¹å¼ AND-ä¼ç¾ OR-æç¾") @TableField(exist = false) private String approveType; /** * å建人 */ @Schema(description ="å建人") src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -149,10 +149,23 @@ .eq(ApprovalTask::getDeleted, 0) ).stream().collect(Collectors.groupingBy(ApprovalTask::getInstanceId)); // ä»»å¡è¡¨æ¬èº«ä¸åå®¡æ¹æ¹å¼ï¼æèç¹å®ä¾åå¡«ä¼ç¾/æç¾ï¼é¿å å端ç»ä¸æ¾ç¤ºä¸ºä¼ç¾ Map<Long, String> nodeApproveTypeMap = approvalInstanceNodeService.list( Wrappers.<ApprovalInstanceNode>lambdaQuery() .in(ApprovalInstanceNode::getInstanceId, instanceIds) .eq(ApprovalInstanceNode::getDeleted, 0) ).stream().collect(Collectors.toMap( ApprovalInstanceNode::getId, node -> node.getApproveType() == null ? "" : node.getApproveType(), (existing, replacement) -> existing )); for (ApprovalInstanceVo vo : records) { vo.setIsApprove(approveProcessConfigNodeUtils.isCurrentApprover(vo.getId(), currentUserId)); vo.setRecords(recordMap.getOrDefault(vo.getId(), new ArrayList<>())); vo.setTasks(taskMap.getOrDefault(vo.getId(), new ArrayList<>())); List<ApprovalTask> instanceTasks = taskMap.getOrDefault(vo.getId(), new ArrayList<>()); instanceTasks.forEach(task -> task.setApproveType(nodeApproveTypeMap.get(task.getNodeId()))); vo.setTasks(instanceTasks); vo.setStorageBlobVOList(fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum.APPROVAL_INSTANCE, vo.getId())); } src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -465,37 +465,37 @@ { val = Convert.toBigDecimal(val); } else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } } else if (LocalDate.class == fieldType) { if (val instanceof String) { Date date = DateUtils.parseDate(val); val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date); } else if (val instanceof Date) { val = DateUtils.toLocalDate((Date) val); } else if (val instanceof Double) { val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val)); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } { val = DateUtil.getJavaDate((Double) val); } } else if (LocalDate.class == fieldType) { if (val instanceof String) { Date date = DateUtils.parseDate(val); val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date); } else if (val instanceof Date) { val = DateUtils.toLocalDate((Date) val); } else if (val instanceof Double) { val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val)); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } if (StringUtils.isNotNull(fieldType)) { String propertyName = field.getName(); @@ -535,7 +535,11 @@ ReflectUtils.invokeSetter(entity, propertyName, val); } } list.add(entity); // è¡¨å¤´ä¸æ¨¡æ¿ä¸ä¸è´æ¶è¿ä¸è¡å¯è½æ²¡æå¹é å°ä»»ä½å段ï¼entity 为 nullï¼è·³è¿ä»¥å è°ç¨æ¹ç©ºæé if (entity != null) { list.add(entity); } } } return list; @@ -667,24 +671,24 @@ val = Convert.toFloat(val); } else if (BigDecimal.class == fieldType) { val = Convert.toBigDecimal(val); } else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } } else if (LocalDate.class == fieldType) { if (val instanceof String) { Date date = DateUtils.parseDate(val); val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date); } else if (val instanceof Date) { val = DateUtils.toLocalDate((Date) val); } else if (val instanceof Double) { val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val)); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } } else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } } else if (LocalDate.class == fieldType) { if (val instanceof String) { Date date = DateUtils.parseDate(val); val = StringUtils.isNull(date) ? null : DateUtils.toLocalDate(date); } else if (val instanceof Date) { val = DateUtils.toLocalDate((Date) val); } else if (val instanceof Double) { val = DateUtils.toLocalDate(DateUtil.getJavaDate((Double) val)); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } if (StringUtils.isNotNull(fieldType)) { String propertyName = field.getName(); @@ -714,7 +718,11 @@ ReflectUtils.invokeSetter(entity, propertyName, val); } } list.add(entity); // è¡¨å¤´ä¸æ¨¡æ¿ä¸ä¸è´æ¶è¿ä¸è¡å¯è½æ²¡æå¹é å°ä»»ä½å段ï¼entity 为 nullï¼è·³è¿ä»¥å è°ç¨æ¹ç©ºæé if (entity != null) { list.add(entity); } } } return list; src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
@@ -135,6 +135,12 @@ @Schema(description = "ç¶æ") private String status; /** * æ¯å¦å¯ç¨ 1-å¯ç¨ 0-åç¨ï¼åç¨è®¾å¤ä¸åä¸å·¡æ£ */ @Schema(description = "æ¯å¦å¯ç¨ 1-å¯ç¨ 0-åç¨") private Integer isEnabled; @Schema(description = "计åè¿è¡æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/device/execl/DeviceLedgerExeclDto.java
@@ -82,6 +82,12 @@ /** * æ¯å¦å¯ç¨ 1-å¯ç¨ 0-åç¨ */ @Excel(name = "å¯ç¨ç¶æ", sort = 9, readConverterExp = "1=å¯ç¨,0=åç¨") private Integer isEnabled; /** * å½å ¥äºº */ @Excel(name = "å½å ¥äºº",sort = 9) src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
@@ -124,6 +124,12 @@ @Schema(description = "ç¶æ") private String status; /** * æ¯å¦å¯ç¨ 1-å¯ç¨ 0-åç¨ï¼åç¨è®¾å¤ä¸åä¸å·¡æ£ */ @Schema(description = "æ¯å¦å¯ç¨ 1-å¯ç¨ 0-åç¨") private Integer isEnabled; @Schema(description = "计åè¿è¡æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; @@ -23,6 +24,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -143,29 +145,59 @@ } @Override @Transactional(rollbackFor = Exception.class) public Boolean importData(MultipartFile file) throws IOException { ExcelUtil<DeviceLedgerExeclDto> util = new ExcelUtil<DeviceLedgerExeclDto>(DeviceLedgerExeclDto.class); List<DeviceLedgerExeclDto> userList = util.importExcel(file.getInputStream()); userList.forEach(c -> { DeviceLedger deviceLedger = new DeviceLedger(); SysUser sysUser = sysUserMapper.selectUserByUserName(c.getCreateUser()); if (sysUser!=null) { deviceLedger.setCreateUser(sysUser.getUserId().intValue()); }else { deviceLedger.setCreateUser(SecurityUtils.getUserId().intValue()); if (userList == null || userList.isEmpty()) { // è¡¨å¤´ä¸æ¨¡æ¿ä¸ä¸è´æ¶è§£æä¸å°ä»»ä½æ°æ®ï¼æç¡®æç¤ºï¼é¿å å端åªçå°âå¯¼å ¥æåâå´æ²¡æä»»ä½æ°æ® throw new ServiceException("æªè¯»åå°å¯å¯¼å ¥çæ°æ®ï¼è¯·ç¡®è®¤æä»¶è¡¨å¤´ä¸å¯¼å ¥æ¨¡æ¿ä¸è´åéè¯"); } int importCount = 0; for (int i = 0; i < userList.size(); i++) { DeviceLedgerExeclDto c = userList.get(i); if (c == null) { continue; } BeanUtils.copyProperties(c,deviceLedger); // éè¿å«ç¨åä»·ãæ°éãç¨ç计ç®å«ç¨æ»ä»·ï¼ä¸å«ç¨æ»ä»· deviceLedger.setTaxIncludingPriceTotal(c.getTaxIncludingPriceUnit()); deviceLedger.setNumber(BigDecimal.ONE); deviceLedger.setPlanRuntimeTime(DateUtils.toLocalDate(c.getPlanRuntimeTime())); // 计ç®ä¸å«ç¨æ»ä»·ï¼å¤çç©ºå¼æ åµ if (deviceLedger.getTaxIncludingPriceTotal() != null && c.getTaxRate() != null) { deviceLedger.setUnTaxIncludingPriceTotal(deviceLedger.getTaxIncludingPriceTotal().divide(BigDecimal.ONE.add(c.getTaxRate()), 2, RoundingMode.HALF_UP)); DeviceLedger deviceLedger; try { deviceLedger = buildDeviceLedger(c); } catch (Exception e) { throw new ServiceException("第" + (i + 2) + "è¡æ°æ®æè¯¯ï¼" + e.getMessage()); } deviceLedgerMapper.insert(deviceLedger); }); try { deviceLedgerMapper.insert(deviceLedger); } catch (Exception e) { throw new ServiceException("第" + (i + 2) + "è¡ä¿å失败ï¼" + e.getMessage()); } importCount++; } if (importCount == 0) { throw new ServiceException("æªè¯»åå°å¯å¯¼å ¥çæ°æ®ï¼è¯·ç¡®è®¤æä»¶è¡¨å¤´ä¸å¯¼å ¥æ¨¡æ¿ä¸è´åéè¯"); } return true; } /** * å°å¯¼å ¥è¡è½¬æ¢ä¸ºè®¾å¤å°è´¦å®ä½ */ private DeviceLedger buildDeviceLedger(DeviceLedgerExeclDto c) { DeviceLedger deviceLedger = new DeviceLedger(); SysUser sysUser = sysUserMapper.selectUserByUserName(c.getCreateUser()); if (sysUser != null) { deviceLedger.setCreateUser(sysUser.getUserId().intValue()); } else { deviceLedger.setCreateUser(SecurityUtils.getUserId().intValue()); } BeanUtils.copyProperties(c, deviceLedger); // éè¿å«ç¨åä»·ãæ°éãç¨ç计ç®å«ç¨æ»ä»·ï¼ä¸å«ç¨æ»ä»· deviceLedger.setTaxIncludingPriceTotal(c.getTaxIncludingPriceUnit()); deviceLedger.setNumber(BigDecimal.ONE); deviceLedger.setPlanRuntimeTime(DateUtils.toLocalDate(c.getPlanRuntimeTime())); // 计ç®ä¸å«ç¨æ»ä»·ï¼å¤çç©ºå¼æ åµ if (deviceLedger.getTaxIncludingPriceTotal() != null && c.getTaxRate() != null) { deviceLedger.setUnTaxIncludingPriceTotal(deviceLedger.getTaxIncludingPriceTotal().divide(BigDecimal.ONE.add(c.getTaxRate()), 2, RoundingMode.HALF_UP)); } return deviceLedger; } } src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -203,6 +203,10 @@ if (deviceLedger == null) { throw new IllegalArgumentException("æé设å¤ä¸åå¨ï¼è¯·éæ°éæ©"); } boolean deviceChanged = oldInspectionTask == null || !Objects.equals(oldInspectionTask.getTaskId(), taskId); if (deviceChanged && Integer.valueOf(0).equals(deviceLedger.getIsEnabled())) { throw new IllegalArgumentException("æé设å¤å·²åç¨ï¼ä¸è½å®æå·¡æ£"); } } private void validateInspectionInput(InspectionTaskDto inspectionTaskDto, InspectionTask oldInspectionTask) { src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -56,9 +56,11 @@ // throw new JobExecutionException("宿¶ä»»å¡å·²ç¦ç¨: " + taskId); // } // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ - è¿å°±æ¯æ¨æä¾ç代ç åºè¯¥æ¾çä½ç½® InspectionTask inspectionTask = createInspectionTask(timingTask); inspectionTaskMapper.insert(inspectionTask); // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ï¼è®¾å¤å·²åç¨æ¶è·³è¿ï¼ä¸çæå·¡æ£ä»»å¡ if (!isDeviceDisabled(timingTask.getTaskId())) { InspectionTask inspectionTask = createInspectionTask(timingTask); inspectionTaskMapper.insert(inspectionTask); } // 3. æ´æ°å®æ¶ä»»å¡çæ§è¡æ¶é´ if (!tasks.isEmpty()) { @@ -97,6 +99,21 @@ } } /** * è®¾å¤æ¯å¦å·²åç¨ï¼åç¨è®¾å¤ä¸åä¸å·¡æ£ï¼ */ private boolean isDeviceDisabled(Integer deviceId) { if (deviceId == null || deviceId <= 0) { return false; } List<Integer> enabledList = jdbcTemplate.queryForList( "SELECT is_enabled FROM device_ledger WHERE id = ?", Integer.class, deviceId); if (enabledList.isEmpty() || enabledList.get(0) == null) { return false; } return enabledList.get(0) == 0; } // è¿å°±æ¯æ¨æä¾ç代ç å°è£ æçæ¹æ³ private InspectionTask createInspectionTask(TimingTask timingTask) { InspectionTask inspectionTask = new InspectionTask(); src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.inspectiontask.dto.TimingTaskDto; import com.ruoyi.inspectiontask.mapper.TimingTaskMapper; import com.ruoyi.inspectiontask.pojo.TimingTask; @@ -191,9 +192,14 @@ if (taskId == null || taskId <= 0) { return; } if (deviceLedgerMapper.selectById(taskId.longValue()) == null) { DeviceLedger deviceLedger = deviceLedgerMapper.selectById(taskId.longValue()); if (deviceLedger == null) { throw new IllegalArgumentException("æé设å¤ä¸åå¨ï¼è¯·éæ°éæ©"); } boolean deviceChanged = oldTimingTask == null || !Objects.equals(oldTimingTask.getTaskId(), taskId); if (deviceChanged && Integer.valueOf(0).equals(deviceLedger.getIsEnabled())) { throw new IllegalArgumentException("æé设å¤å·²åç¨ï¼ä¸è½å®æå·¡æ£"); } } public LocalDateTime calculateFirstExecutionTime(TimingTask task) { src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -113,18 +113,25 @@ select app.id, app.payment_amount, pl.id as purchase_ledger_id -- ä¼å æå ¥åºåå ³èéè´ååï¼å ¥åºåæªå®¡æ ¸/ä¸å卿¶ï¼åéæä»æ¬¾ç³è¯·ä¸çéè´ååå·å ³èï¼ -- é¿å âæ°å¢ä»æ¬¾âæååæç»ä¸çä¸å°è¯¥ç¬ä»æ¬¾ COALESCE( (select min(pl_sir.id) from stock_in_record sir left join quality_inspect qi on sir.record_type = 10 and sir.record_id = qi.id left join purchase_ledger pl_sir on pl_sir.id = if(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id) where find_in_set(sir.id, apa.stock_in_record_ids) > 0 and sir.approval_status = 1 and sir.record_type in ('7','10')), (select pl_no.id from purchase_ledger pl_no where pl_no.purchase_contract_number = apa.payment_content order by pl_no.id limit 1) ) as purchase_ledger_id from account_purchase_payment app left join account_payment_application apa on app.account_payment_application_id = apa.id left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0 -- 10 ç±»åæå ³èè´¨æ£è¡¨ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id -- å¨æå ³èéè´ï¼èªå¨éé 7 å 10ï¼ LEFT JOIN purchase_ledger pl ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id) WHERE sir.approval_status = 1 AND sir.record_type IN ('7','10') group by app.id, pl.id ) t left join purchase_ledger pl on t.purchase_ledger_id = pl.id group by pl.id src/main/resources/mapper/device/DeviceLedgerMapper.xml
@@ -16,6 +16,7 @@ dl.unit, dl.number, dl.status, dl.is_enabled, dl.plan_runtime_time, dl.start_runtime_time, dl.end_runtime_time, @@ -105,10 +106,13 @@ dl.device_brand, dl.type, dl.area_id, dl.is_enabled, da.name AS area_name FROM device_ledger dl left join device_area da on dl.area_id = da.id <where> <!-- åç¨è®¾å¤ä¸åä¸å·¡æ£ï¼éæ©è®¾å¤æ¶åªè¿åå¯ç¨è®¾å¤ --> AND COALESCE(dl.is_enabled, 1) = 1 <if test="areaId != null"> AND ( dl.area_id = #{areaId} src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -33,7 +33,8 @@ WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >0 THEN 1 ELSE 0 END as has_sufficient_stock, NULL as no_quantity, -- å¾ åè´§æ°é = è®¢åæ°é - å·²åè´§æ°é - 审æ¹ä¸/å¾ å®¡æ ¸æ°éï¼æå°ä¸º 0 GREATEST(IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0) - IFNULL(t5.pending_approval_quantity, 0), 0) as no_quantity, IFNULL(t3.shipped_quantity, 0) as shipped_quantity, IFNULL(t6.return_quantity, 0) as return_quantity, IFNULL(t4.approved_stock_in_num, 0) as approved_stock_in_num,