| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
| 2026-03-26 | gongchunyi | ![]() |
doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -38,4 +38,27 @@ ADD COLUMN remark VARCHAR(500) DEFAULT NULL COMMENT '夿³¨'; ALTER TABLE sales_ledger_product_process CHANGE COLUMN remark code VARCHAR(255) COMMENT 'ç¼ç '; CHANGE COLUMN remark code VARCHAR(255) COMMENT 'ç¼ç '; ALTER TABLE `product-inventory-management-hbtmblc`.`sales_ledger_product` MODIFY COLUMN `width` decimal(20, 15) NULL DEFAULT NULL COMMENT '宽(mm)' AFTER `is_checked`, MODIFY COLUMN `height` decimal(20, 15) NULL DEFAULT NULL COMMENT 'é«(mm)' AFTER `width`, MODIFY COLUMN `actual_piece_area` decimal(20, 15) NULL DEFAULT NULL COMMENT 'å®é åçé¢ç§¯(ã¡)' AFTER `height`, MODIFY COLUMN `actual_total_area` decimal(20, 15) NULL DEFAULT NULL COMMENT 'å®é æ»é¢ç§¯(ã¡)' AFTER `actual_piece_area`, MODIFY COLUMN `settle_piece_area` decimal(20, 15) NULL DEFAULT NULL COMMENT 'ç»ç®åçé¢ç§¯(ã¡)' AFTER `actual_total_area`, MODIFY COLUMN `settle_total_area` decimal(20, 15) NULL DEFAULT NULL COMMENT 'ç»ç®æ»é¢ç§¯(ã¡)' AFTER `settle_piece_area`, ADD COLUMN `perimeter` decimal(20, 15) NULL COMMENT 'å¨é¿' AFTER `settle_total_area`, ADD COLUMN `heavy_box` decimal(20, 15) NULL COMMENT 'éç®±' AFTER `perimeter`; ALTER TABLE `product-inventory-management-hbtmblc`.`process_route` MODIFY COLUMN `product_model_id` bigint NULL DEFAULT 0 COMMENT '产åid' AFTER `id`, MODIFY COLUMN `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT 'æè¿°' AFTER `product_model_id`, ADD COLUMN `is_default` tinyint(1) NULL COMMENT 'æ¯å¦é»è®¤(0-å¦,1-æ¯)' AFTER `bom_id`; ALTER TABLE `product-inventory-management-hbtmblc`.`process_route` ADD COLUMN `process_route_name` varchar(255) NULL COMMENT 'å·¥èºè·¯çº¿åç§°' AFTER `product_model_id`; ALTER TABLE `product-inventory-management-hbtmblc`.`process_route_item` MODIFY COLUMN `product_model_id` bigint NULL DEFAULT 0 COMMENT '产åid' AFTER `route_id`, MODIFY COLUMN `process_id` bigint NULL DEFAULT 0 COMMENT 'å·¥åºid' AFTER `product_model_id`, ADD COLUMN `process_name` varchar(255) NULL COMMENT 'å·¥åºåç§°' AFTER `process_id`; src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -9,6 +9,7 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -116,4 +117,11 @@ public List customerList(Customer customer) { return customerService.customerList(customer); } @GetMapping("/regions") @ApiOperation("è·å客æ·å°åº") public AjaxResult getRegions() { List<String> regionsList = customerService.regionsList(); return AjaxResult.success(regionsList); } } src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -80,7 +80,7 @@ /** * èç³»çµè¯ */ @Excel(name = "èç³»çµè¯",cellType = Excel.ColumnType.STRING) @Excel(name = "èç³»çµè¯", cellType = Excel.ColumnType.STRING) private String contactPhone; /** @@ -93,7 +93,7 @@ * ç»´æ¤æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "ç»´æ¤æ¶é´" , width = 30, dateFormat = "yyyy-MM-dd") @Excel(name = "ç»´æ¤æ¶é´", width = 30, dateFormat = "yyyy-MM-dd") private Date maintenanceTime; @TableField(fill = FieldFill.INSERT) @@ -116,4 +116,8 @@ @ApiModelProperty(value = "弿·è¡å·") @Excel(name = "弿·è¡å·") private String bankCode; @ApiModelProperty("å°åº") @Excel(name = "å°åº") private String regions; } src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -39,10 +39,16 @@ /** * åä½ */ @Excel(name = "åä½") // @Excel(name = "åä½") private String unit; /** * åä½ */ @Excel(name = "å度") private BigDecimal thickness; /** * çäº§çæº */ @Excel(name = "çäº§çæº") src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -78,4 +78,7 @@ List<Customer> selectCustomerLists(Customer customer); AjaxResult importData(MultipartFile file); List<String> regionsList(); } src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -276,6 +276,17 @@ ).collect(Collectors.toList()); } @Override public List<String> regionsList() { return this.baseMapper.selectObjs(new QueryWrapper<Customer>() .select("DISTINCT regions") .isNotNull("regions") .ne("regions", "") ).stream() .map(Object::toString) .collect(Collectors.toList()); } /** * ä¸å线å½å转驼峰å½å */ src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
@@ -44,4 +44,11 @@ public R delete(@PathVariable("ids") Long[] ids) { return R.ok(processRouteService.batchDelete(Arrays.asList(ids))); } @ApiOperation("é»è®¤å·¥èºè·¯çº¿") @PutMapping("/default/{id}") public R updateDefault(@PathVariable("id") Long id) { processRouteService.updateDefault(id); return R.ok(); } } src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
@@ -35,7 +35,8 @@ @PostMapping () @ApiOperation("æ°å¢ä¿®æ¹") public R addOrUpdate(@RequestBody ProcessRouteItem processRouteItem) { return R.ok(processRouteItemService.saveOrUpdate(processRouteItem)); processRouteItemService.saveOrUpdateRouteItem(processRouteItem); return R.ok(); } @PostMapping ("/sort") src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
@@ -9,9 +9,6 @@ @Data public class ProcessRouteItemDto extends ProcessRouteItem { @ApiModelProperty(value = "å·¥åºåç§°") private String processName; @ApiModelProperty(value = "å·¥èºè·¯çº¿åç§°") private String routeName; src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -24,6 +24,12 @@ @ApiModelProperty(value = "æè¿°") private String description; @ApiModelProperty(value = "å·¥èºè·¯çº¿åç§°") private String processRouteName; @ApiModelProperty(value = "æ¯å¦é»è®¤(0-å¦,1-æ¯)") private Integer isDefault; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
@@ -21,8 +21,11 @@ @ApiModelProperty(value = "å·¥åºid") private Long processId; @ApiModelProperty(value ="产åid") @ApiModelProperty(value = "产åid") private Long productModelId; @ApiModelProperty(value = "å·¥åºåç§°") private String processName; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) @@ -34,11 +37,11 @@ @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value ="æå¨æåº") @ApiModelProperty(value = "æå¨æåº") private Integer dragSort; @ApiModelProperty(value ="æ¯å¦è´¨æ£") @ApiModelProperty(value = "æ¯å¦è´¨æ£") private Boolean isQuality; } src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java
@@ -15,4 +15,6 @@ int sort(ProcessRouteItem processRouteItem); String batchDelete(Long id); void saveOrUpdateRouteItem(ProcessRouteItem processRouteItem); } src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -16,4 +16,6 @@ Integer saveProcessRoute(ProcessRoute processRoute); int batchDelete(List<Long> ids); void updateDefault(Long id); } src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
@@ -1,9 +1,9 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.production.dto.ProcessRouteItemDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.pojo.ProcessRouteItem; @@ -21,11 +21,11 @@ public class ProcessRouteItemServiceImpl extends ServiceImpl<ProcessRouteItemMapper, ProcessRouteItem> implements ProcessRouteItemService { @Autowired private ProcessRouteItemMapper processRouteItemMapper; private ProcessRouteItemMapper processRouteItemMapper; @Override public List<ProcessRouteItemDto> listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) { return processRouteItemMapper.listProcessRouteItemDto( processRouteItemDto); return processRouteItemMapper.listProcessRouteItemDto(processRouteItemDto); } //æåº @@ -42,14 +42,14 @@ if (targetPosition != null && targetPosition >= 0) { // ç§»å¨å ç´ å°æ°çä½ç½® processRouteItems.remove(oldProcessRouteItem); processRouteItems.add(targetPosition-1, oldProcessRouteItem); processRouteItems.add(targetPosition - 1, oldProcessRouteItem); // æ´æ°ææåå½±åçæåºå段 for (int i = 0; i < processRouteItems.size(); i++) { ProcessRouteItem item = processRouteItems.get(i); if (!item.getId().equals(oldProcessRouteItem.getId())) { // æ£æ¥æ¯å¦éè¦æ´æ°æåºå¼ if (item.getDragSort() != i+1) { item.setDragSort(i+1); if (item.getDragSort() != i + 1) { item.setDragSort(i + 1); processRouteItemMapper.updateById(item); } } else { @@ -61,6 +61,26 @@ return 1; } return 0; } @Override public void saveOrUpdateRouteItem(ProcessRouteItem processRouteItem) { if (processRouteItem == null) { throw new ServiceException("æ°å¢/ä¿®æ¹å¤±è´¥,æ°æ®ä¸è½ä¸ºç©º"); } // 妿id为nullåæ°å¢,å¦åå°±æ´æ° if (processRouteItem.getId() == null) { // æ¥è¯¢åºå½åæå¤å°ä¸ªåé Long selectCount = baseMapper.selectCount(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRouteItem.getRouteId())); if (selectCount == null) { selectCount = 0L; } processRouteItem.setDragSort((int) (selectCount + 1)); baseMapper.insert(processRouteItem); return; } baseMapper.updateById(processRouteItem); } @Override @@ -80,8 +100,8 @@ // éæ°è®¾ç½®æåºå¼ï¼ä½¿åºå·è¿ç» for (int i = 0; i < processRouteItems.size(); i++) { ProcessRouteItem item = processRouteItems.get(i); if (!item.getDragSort().equals(i+1)) { item.setDragSort(i+1); if (!item.getDragSort().equals(i + 1)) { item.setDragSort(i + 1); processRouteItemMapper.updateById(item); } } src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -1,9 +1,12 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.StringUtils; import com.ruoyi.production.dto.ProcessRouteDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProcessRouteMapper; @@ -14,6 +17,9 @@ import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.service.ProcessRouteService; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.service.ISalesLedgerProcessRouteService; import com.ruoyi.sales.service.ISalesLedgerProductProcessService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +35,9 @@ @AllArgsConstructor @Slf4j public class ProcessRouteServiceImpl extends ServiceImpl<ProcessRouteMapper, ProcessRoute> implements ProcessRouteService { @Autowired private ISalesLedgerProcessRouteService salesLedgerProcessRouteService; @Autowired private ProcessRouteMapper processRouteMapper; @@ -47,6 +56,12 @@ @Override public Integer saveProcessRoute(ProcessRoute processRoute) { if (processRoute == null) { throw new ServiceException("å·¥èºè·¯çº¿æ°å¢å¤±è´¥,æ°æ®ä¸è½ä¸ºç©º"); } if (StringUtils.isEmpty(processRoute.getProcessRouteName())) { throw new ServiceException("å·¥èºè·¯çº¿æ°å¢å¤±è´¥,åç§°ä¸è½ä¸ºç©º"); } this.save(processRoute); String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String idStr = String.format("%06d", processRoute.getId()); @@ -59,12 +74,30 @@ @Override public int batchDelete(List<Long> ids) { //å 夿æ¯å¦å·²ç»å¼ç¨äº List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids)); if (productOrders.size()>0){ throw new RuntimeException("该工èºè·¯çº¿ç产已å¼ç¨ï¼ä¸è½å é¤"); List<SalesLedgerProcessRoute> list = salesLedgerProcessRouteService.list(new LambdaQueryWrapper<SalesLedgerProcessRoute>().in(SalesLedgerProcessRoute::getProcessRouteId, ids)); if (list != null && list.size() > 0) { throw new ServiceException("该工èºè·¯çº¿å·²è¢«å¼ç¨ä¸è½å é¤"); } //å é¤å·¥èºè·¯çº¿è¯¦æ processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids)); return processRouteMapper.deleteBatchIds(ids); } @Override @Transactional(rollbackFor = Exception.class) public void updateDefault(Long id) { ProcessRoute currentRoute = this.getById(id); if (currentRoute == null) { throw new ServiceException("å·¥èºè·¯çº¿ä¸åå¨"); } if (Integer.valueOf(1).equals(currentRoute.getIsDefault())) { return; } this.update(Wrappers.<ProcessRoute>lambdaUpdate() .set(ProcessRoute::getIsDefault, 0) .eq(ProcessRoute::getIsDefault, 1)); this.update(Wrappers.<ProcessRoute>lambdaUpdate() .set(ProcessRoute::getIsDefault, 1) .eq(ProcessRoute::getId, id)); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -17,6 +17,7 @@ import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.service.ICommonFileService; import com.ruoyi.sales.service.ISalesLedgerService; import io.swagger.annotations.Api; @@ -120,12 +121,12 @@ startPage(); List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); // 计ç®å·²å¼ç¥¨éé¢/æªå¼ç¥¨éé¢(已填åå票éé¢ä¸ºå) if(CollectionUtils.isEmpty(list)){ if (CollectionUtils.isEmpty(list)) { return getDataTable(list); } List<Long> salesLedgerIds = list.stream().map(SalesLedger::getId).collect(Collectors.toList()); List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){ if (CollectionUtils.isEmpty(invoiceLedgerDtoList)) { return getDataTable(list); } for (SalesLedger salesLedger : list) { @@ -154,10 +155,10 @@ @Log(title = "éå®å°è´¦", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { Page page = new Page(-1,-1); Page page = new Page(-1, -1); IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto); ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class); if(salesLedgerIPage == null){ if (salesLedgerIPage == null) { util.exportExcel(response, new ArrayList<>(), "éå®å°è´¦æ°æ®"); return; } @@ -186,6 +187,16 @@ @PostMapping("/addOrUpdateSalesLedger") public AjaxResult add(@RequestBody SalesLedgerDto salesLedgerDto) { return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto)); } /** * éå®è®¢åç»å®å·¥èºè·¯çº¿ */ @PostMapping("/saleProcessBind") @ApiOperation("éå®è®¢åç»å®å·¥èºè·¯çº¿") public AjaxResult saleProcessBind(@RequestBody SalesLedgerProcessRoute salesLedgerProcessRoute) { salesLedgerService.saleProcessBind(salesLedgerProcessRoute); return AjaxResult.success(); } /** @@ -249,7 +260,7 @@ * è¿åå¹´å¼ç¥¨,忬¾éé¢ */ @GetMapping("/getAmountHalfYear") public AjaxResult getAmountHalfYear(@RequestParam(value = "type",defaultValue = "1") Integer type) { public AjaxResult getAmountHalfYear(@RequestParam(value = "type", defaultValue = "1") Integer type) { return AjaxResult.success(salesLedgerService.getAmountHalfYear(type)); } src/main/java/com/ruoyi/sales/controller/SalesLedgerProcessRouteController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.sales.controller; import io.swagger.annotations.ApiModel; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * éå®è®¢åç»å®çå·¥èºè·¯çº¿ å端æ§å¶å¨ * </p> * * @author deslrey * @since 2026-03-26 */ @RestController @RequestMapping("/salesLedgerProcessRoute") @ApiModel(value = "SalesLedgerProcessRouteController", description = "éå®è®¢åç»å®çå·¥èºè·¯çº¿") public class SalesLedgerProcessRouteController { } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -29,6 +29,7 @@ private String customerName; private String entryPerson; private String remarks; private String customerRemarks; private String attachmentMaterials; @TableField(exist = false) src/main/java/com/ruoyi/sales/mapper/SalesLedgerProcessRouteMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.sales.mapper; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * éå®è®¢åç»å®çå·¥èºè·¯çº¿ Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-26 */ public interface SalesLedgerProcessRouteMapper extends BaseMapper<SalesLedgerProcessRoute> { } src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -89,6 +89,12 @@ private String remarks; /** * 客æ·å¤æ³¨ */ @Excel(name = "客æ·å¤æ³¨") private String customerRemarks; /** * éä»¶ææï¼å卿件åçç¸å ³ä¿¡æ¯ */ private String attachmentMaterials; src/main/java/com/ruoyi/sales/pojo/SalesLedgerProcessRoute.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.ruoyi.sales.pojo; import com.baomidou.mybatisplus.annotation.*; import java.time.LocalDateTime; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * éå®è®¢åç»å®çå·¥èºè·¯çº¿ * </p> * * @author deslrey * @since 2026-03-26 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("sales_ledger_process_route") @ApiModel(value = "SalesLedgerProcessRoute对象", description = "éå®è®¢åç»å®çå·¥èºè·¯çº¿") public class SalesLedgerProcessRoute implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主é®") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "éå®å°è´¦ID") private Long salesLedgerId; @ApiModelProperty(value = "å·¥èºè·¯çº¿ID") private Long processRouteId; @ApiModelProperty(value = "夿³¨") private String remark; @ApiModelProperty(value = "æå¨æåº") private Integer dragSort; @ApiModelProperty(value = "å·¥èºè·¯çº¿èç¹ID") private Long processRouteItemId; @ApiModelProperty(value = "åå»ºæ¥æ") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -270,6 +270,24 @@ @ApiModelProperty("ç»ç®æ»é¢ç§¯(ã¡)") private BigDecimal settleTotalArea; /** * å¨é¿ */ @ApiModelProperty("å¨é¿(cm)") private BigDecimal perimeter; /** * éç®± */ @ApiModelProperty("éç®±") private BigDecimal heavyBox; /** * 楼å±ç¼å· */ @ApiModelProperty("楼å±ç¼å·") private String floorCode; @TableField(exist = false) @ApiModelProperty("éå®äº§åé¢å¤å å·¥") private List<SalesLedgerProductProcess> salesProductProcessList; src/main/java/com/ruoyi/sales/pojo/SalesLedgerProductProcessBind.java
@@ -32,7 +32,7 @@ private Integer id; @ApiModelProperty(value = "éå®å°è´¦äº§åä¿¡æ¯ID") private Integer salesLedgerProductId; private Long salesLedgerProductId; @ApiModelProperty(value = "éå®äº§åå å·¥æç»ID") private Integer salesLedgerProductProcessId; src/main/java/com/ruoyi/sales/service/ISalesLedgerProcessRouteService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.sales.service; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * éå®è®¢åç»å®çå·¥èºè·¯çº¿ æå¡ç±» * </p> * * @author deslrey * @since 2026-03-26 */ public interface ISalesLedgerProcessRouteService extends IService<SalesLedgerProcessRoute> { } src/main/java/com/ruoyi/sales/service/ISalesLedgerProductProcessBindService.java
@@ -1,7 +1,10 @@ package com.ruoyi.sales.service; import com.ruoyi.sales.pojo.SalesLedgerProductProcess; import com.ruoyi.sales.pojo.SalesLedgerProductProcessBind; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> @@ -13,4 +16,6 @@ */ public interface ISalesLedgerProductProcessBindService extends IService<SalesLedgerProductProcessBind> { void updateProductProcessBind(List<SalesLedgerProductProcess> list, Long salesLedgerProductId); } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -10,6 +10,7 @@ import com.ruoyi.sales.dto.MonthlyAmountDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.springframework.web.multipart.MultipartFile; @@ -54,4 +55,6 @@ List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId); IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page); void saleProcessBind(SalesLedgerProcessRoute salesLedgerProcessRoute); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProcessRouteServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.sales.service.impl; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.mapper.SalesLedgerProcessRouteMapper; import com.ruoyi.sales.service.ISalesLedgerProcessRouteService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <p> * éå®è®¢åç»å®çå·¥èºè·¯çº¿ æå¡å®ç°ç±» * </p> * * @author deslrey * @since 2026-03-26 */ @Slf4j @Service public class SalesLedgerProcessRouteServiceImpl extends ServiceImpl<SalesLedgerProcessRouteMapper, SalesLedgerProcessRoute> implements ISalesLedgerProcessRouteService { } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductProcessBindServiceImpl.java
@@ -1,10 +1,14 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.sales.pojo.SalesLedgerProductProcess; import com.ruoyi.sales.pojo.SalesLedgerProductProcessBind; import com.ruoyi.sales.mapper.SalesLedgerProductProcessBindMapper; import com.ruoyi.sales.service.ISalesLedgerProductProcessBindService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -17,4 +21,19 @@ @Service public class SalesLedgerProductProcessBindServiceImpl extends ServiceImpl<SalesLedgerProductProcessBindMapper, SalesLedgerProductProcessBind> implements ISalesLedgerProductProcessBindService { @Override public void updateProductProcessBind(List<SalesLedgerProductProcess> list, Long salesLedgerProductId) { if (list == null || list.isEmpty()) { return; } // å æ¸ 空åæå ¥ baseMapper.delete(new LambdaQueryWrapper<SalesLedgerProductProcessBind>().in(SalesLedgerProductProcessBind::getSalesLedgerProductId, salesLedgerProductId)); list.forEach(s -> { SalesLedgerProductProcessBind salesLedgerProductProcessBind = new SalesLedgerProductProcessBind(); salesLedgerProductProcessBind.setSalesLedgerProductId(salesLedgerProductId); salesLedgerProductProcessBind.setSalesLedgerProductProcessId(s.getId()); salesLedgerProductProcessBind.setQuantity(s.getQuantity()); baseMapper.insert(salesLedgerProductProcessBind); }); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -24,9 +24,8 @@ import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerProductProcessBindService; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.pojo.StockInventory; @@ -84,7 +83,7 @@ private StockUtils stockUtils; private final ISalesLedgerProductProcessBindService salesLedgerProductProcessBindService; @Autowired private ProductStructureMapper productStructureMapper; @@ -104,14 +103,14 @@ // queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId()) // .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct); if(!CollectionUtils.isEmpty(salesLedgerProducts)){ if (!CollectionUtils.isEmpty(salesLedgerProducts)) { salesLedgerProducts.forEach(item -> { // åè´§ä¿¡æ¯ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerProductId, item.getId()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if(shippingInfo != null){ if (shippingInfo != null) { item.setShippingDate(shippingInfo.getShippingDate()); item.setShippingCarNumber(shippingInfo.getShippingCarNumber()); item.setShippingStatus(shippingInfo.getStatus()); @@ -131,8 +130,8 @@ BigDecimal noInvoiceNum = BigDecimal.ZERO; BigDecimal noInvoiceAmount = BigDecimal.ZERO; for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) { if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){ invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) { invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount()); } } @@ -166,7 +165,7 @@ //å é¤åè´§ä¿¡æ¯ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids))); if(!CollectionUtils.isEmpty(shippingInfos)){ if (!CollectionUtils.isEmpty(shippingInfos)) { shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); } @@ -203,12 +202,12 @@ @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { // å¾ åæ¬¾ï¼ä»æ¬¾ if(salesLedgerProduct.getType().equals(1)){ if (salesLedgerProduct.getType().equals(1)) { salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); //æªå¼ç¥¨æ°é+éé¢ salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); }else{ } else { salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal())); // æªæ¥ç¥¨æ°é+éé¢ salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); @@ -258,6 +257,9 @@ PurchaseLedger.class ); } // æ¸ ç©ºéå®äº§åç»å®çå å·¥ salesLedgerProductProcessBindService.updateProductProcessBind(salesLedgerProduct.getSalesProductProcessList(), salesLedgerProduct.getId()); } return result; } @@ -279,7 +281,7 @@ List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)); if (processRoutes.size()>0){ if (processRoutes.size() > 0) { ProcessRoute processRoute = processRoutes.get(0); //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); @@ -316,7 +318,7 @@ } } // çæå®æ´çå·¥åå· String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber); String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); @@ -431,9 +433,9 @@ IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // å¤æç¶æ if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){ if (item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0) { item.setStatusName("已宿仿¬¾"); }else{ } else { item.setStatusName("æªå®æä»æ¬¾"); } }); @@ -445,9 +447,9 @@ IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // å¤æç¶æ if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){ if (item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0) { item.setStatusName("已宿仿¬¾"); }else{ } else { item.setStatusName("æªå®æä»æ¬¾"); } }); @@ -488,6 +490,7 @@ throw new RuntimeException("å¨ææ´æ°ä¸»è¡¨éé¢å¤±è´¥", e); } } @Override public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) { //è·åäº§åææ°çå·¥èºè·¯çº¿ @@ -506,7 +509,7 @@ //æéæ°é BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity()); BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING); BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING); if (subtract.compareTo(BigDecimal.ZERO) <= 0) { count++; stringBuffer.append(productStructureDto.getProductName()) @@ -517,9 +520,9 @@ .append(System.lineSeparator()); } } if (count>0) { if (count > 0) { return R.fail(stringBuffer.toString()); }else { } else { return R.ok(); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -15,6 +15,7 @@ import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.EnumUtil; @@ -26,6 +27,8 @@ import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; @@ -37,6 +40,7 @@ import com.ruoyi.sales.dto.*; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerProcessRouteService; import com.ruoyi.sales.service.ISalesLedgerProductProcessBindService; import com.ruoyi.sales.service.ISalesLedgerProductProcessService; import com.ruoyi.sales.service.ISalesLedgerService; @@ -116,6 +120,8 @@ private final ISalesLedgerProductProcessService salesLedgerProductProcessService; private final ISalesLedgerProductProcessBindService salesLedgerProductProcessBindService; private final ISalesLedgerProcessRouteService salesLedgerProcessRouteService; @Autowired private SysDeptMapper sysDeptMapper; @@ -521,6 +527,38 @@ return salesLedgerDtoIPage; } @Override @Transactional(rollbackFor = Exception.class) public void saleProcessBind(SalesLedgerProcessRoute salesLedgerProcessRoute) { if (salesLedgerProcessRoute == null) { throw new ServiceException("ç»å®å¤±è´¥,æ°æ®ä¸è½ä¸ºç©º"); } SalesLedger salesLedger = baseMapper.selectById(salesLedgerProcessRoute.getSalesLedgerId()); if (salesLedger == null) { throw new ServiceException("ç»å®å¤±è´¥,éå®è®¢åä¸åå¨"); } ProcessRoute processRoute = processRouteMapper.selectById(salesLedgerProcessRoute.getProcessRouteId()); if (processRoute == null) { throw new ServiceException("ç»å®å¤±è´¥,å·¥èºè·¯çº¿ä¸åå¨"); } // æ¸ é¤å·²ç»å®çæ°æ® salesLedgerProcessRouteService.remove(new LambdaQueryWrapper<SalesLedgerProcessRoute>().eq(SalesLedgerProcessRoute::getSalesLedgerId, salesLedger.getId()).eq(SalesLedgerProcessRoute::getProcessRouteId, processRoute.getId())); // å°æ°æ®è¿ç§»å°sales_ledger_process_route List<ProcessRouteItem> routeItems = processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId())); SalesLedgerProcessRoute ledgerProcessRoute; List<SalesLedgerProcessRoute> salesLedgerProcessRouteList = new ArrayList<>(); for (ProcessRouteItem routeItem : routeItems) { ledgerProcessRoute = new SalesLedgerProcessRoute(); ledgerProcessRoute.setProcessRouteId(processRoute.getId()); ledgerProcessRoute.setSalesLedgerId(salesLedger.getId()); ledgerProcessRoute.setProcessRouteItemId(routeItem.getId()); salesLedgerProcessRouteList.add(ledgerProcessRoute); } salesLedgerProcessRouteService.saveBatch(salesLedgerProcessRouteList); } /** * ä¸å线å½å转驼峰å½å */ @@ -754,17 +792,8 @@ for (SalesLedgerProduct product : updateList) { product.setType(type.getCode()); salesLedgerProductMapper.updateById(product); // å®ç°å é¤ç»å®çå ¨é¨å å·¥ salesLedgerProductProcessBindService.remove(new LambdaQueryWrapper<SalesLedgerProductProcessBind>().eq(SalesLedgerProductProcessBind::getSalesLedgerProductId, product.getId())); // ç»å®äº§åé¢å¤å å·¥ List<SalesLedgerProductProcess> salesProductProcessList = product.getSalesProductProcessList(); salesProductProcessList.forEach(s -> { SalesLedgerProductProcessBind processBind = new SalesLedgerProductProcessBind(); processBind.setSalesLedgerProductId(Math.toIntExact(product.getId())); processBind.setSalesLedgerProductProcessId(s.getId()); processBind.setQuantity(s.getQuantity()); salesLedgerProductProcessBindService.save(processBind); }); // æ¸ ç©ºéå®äº§åç»å®çå å·¥ salesLedgerProductProcessBindService.updateProductProcessBind(product.getSalesProductProcessList(), product.getId()); } } // æ§è¡æå ¥æä½ @@ -776,14 +805,8 @@ salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); // ç»å®äº§åé¢å¤å å·¥ List<SalesLedgerProductProcess> salesProductProcessList = salesLedgerProduct.getSalesProductProcessList(); salesProductProcessList.forEach(s -> { SalesLedgerProductProcessBind processBind = new SalesLedgerProductProcessBind(); processBind.setSalesLedgerProductId(Math.toIntExact(salesLedgerProduct.getId())); processBind.setSalesLedgerProductProcessId(s.getId()); processBind.setQuantity(s.getQuantity()); salesLedgerProductProcessBindService.save(processBind); }); // æ¸ ç©ºéå®äº§åç»å®çå å·¥ salesLedgerProductProcessBindService.updateProductProcessBind(salesLedgerProduct.getSalesProductProcessList(), salesLedgerProduct.getId()); // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -9,6 +9,7 @@ <result column="product_id" property="productId" /> <result column="model" property="model" /> <result column="unit" property="unit" /> <result column="thickness" property="thickness" /> <result column="speculative_trading_name" property="speculativeTradingName" /> <result column="tenant_id" property="tenantId" /> <result column="product_name" property="productName" /> src/main/resources/mapper/production/ProcessRouteItemMapper.xml
@@ -7,6 +7,7 @@ <result property="routeId" column="route_id"/> <result property="processId" column="process_id"/> <result property="productModelId" column="product_model_id"/> <result property="processName" column="process_name"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> @@ -14,22 +15,9 @@ </resultMap> <select id="listProcessRouteItemDto" resultType="com.ruoyi.production.dto.ProcessRouteItemDto"> select pri.*, pr.description , pp.name as process_name, pm.speculative_trading_name, pm.product_id, pm.model, p.product_name, pm.unit from process_route_item pri left join product_model pm on pri.product_model_id = pm.id left join product_process pp on pp.id = pri.process_id left join product p on p.id = pm.product_id left join process_route pr on pr.id = pri.route_id where pri.route_id = #{c.routeId} select * from process_route_item pri where pri.route_id = #{c.routeId} order by pri.drag_sort </select> </mapper> src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -4,25 +4,19 @@ <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRoute"> <id property="id" column="id"/> <result property="productModelId" column="product_model_id"/> <result property="description" column="description"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> <id property="id" column="id"/> <result property="productModelId" column="product_model_id"/> <result property="description" column="description"/> <result property="processRouteName" column="process_route_name"/> <result property="isDefault" column="is_default"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> </resultMap> <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto"> select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no select * from process_route ps left join product_bom pb on ps.bom_id = pb.id left join product_model pm on ps.product_model_id = pm.id left join product p on pm.product_id = p.id <where> <if test="c.model != null and c.model != ''"> and pm.model like concat('%',#{c.model},'%') </if> </where> order by ps.id asc order by ps.id </select> </mapper> src/main/resources/mapper/sales/SalesLedgerProcessRouteMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.sales.mapper.SalesLedgerProcessRouteMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.sales.pojo.SalesLedgerProcessRoute"> <id column="id" property="id" /> <result column="sales_ledger_id" property="salesLedgerId" /> <result column="process_route_id" property="processRouteId" /> <result column="remark" property="remark" /> <result column="drag_sort" property="dragSort" /> <result column="process_route_item_id" property="processRouteItemId" /> <result column="create_time" property="createTime" /> <result column="tenant_id" property="tenantId" /> </resultMap> </mapper>