pom.xml
@@ -333,6 +333,12 @@ <artifactId>jackson-datatype-jsr310</artifactId> </dependency> <!-- éé¢è½¬å¤§å --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.8.26</version> </dependency> </dependencies> <build> src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -8,7 +8,8 @@ CUSTOMIZATION_STOCK_OUT("1", "åæ ¼èªå®ä¹åºåº"), PRODUCTION_REPORT_STOCK_OUT("3", "ç产æ¥å·¥-åºåº"), SALE_STOCK_OUT("8", "éå®-åºåº"), SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"); SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"), DRAW_MATERIALS_STOCK_OUT("14", "ç产订å-颿åºåº"); private final String code; private final String value; @@ -18,4 +19,4 @@ this.value = value; } } } src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -114,7 +114,7 @@ @PreAuthorize("@ss.hasPermi('product:bom:export')") @ApiOperation("导åºBOMæä»¶") @Log(title = "导åºBOMæä»¶", businessType = BusinessType.EXPORT) public void exportBom(HttpServletResponse response, @RequestParam Integer bomId) { public void exportBom(HttpServletResponse response, @RequestParam Long bomId) { productBomService.exportBom(response, bomId); } src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -84,4 +84,22 @@ public R cleanRecord(@PathVariable Long id, @RequestBody Map<String, Object> cleanRecord) { return R.ok(productOrderService.cleanRecord(id, cleanRecord)); } @ApiOperation("æ¥è¯¢æææ¹å·") @GetMapping("/getProductOrderBatchNo") public R getProductOrderBatchNo() { return R.ok(productOrderService.getProductOrderBatchNo()); } @ApiOperation("æ¥è¯¢ç产订å对åºçBOMçåææ") @GetMapping("/getByBomId") public R getByBomId(Long bomId) { return R.ok(productOrderService.getByBomId(bomId)); } @ApiOperation("ç产订åé¢ææ´æ°") @PostMapping("/drawMaterials") public R drawMaterials(@RequestBody ProductOrderDto productOrderDto) { return R.ok(productOrderService.drawMaterials(productOrderDto)); } } src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -1,22 +1,12 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; import com.ruoyi.production.service.ProductStructureService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Arrays; @RequestMapping("productStructure") @RestController @@ -34,7 +24,7 @@ @ApiOperation("BOMæ¥çåé详æ ") @GetMapping("/listBybomId/{bomId}") public R listBybomId( @PathVariable("bomId") Integer bomId){ public R listBybomId( @PathVariable("bomId") Long bomId){ return R.ok(productStructureService.listBybomId(bomId)); } } src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.production.dto; import lombok.Data; import java.math.BigDecimal; @Data public class DrawMaterialDto { private Long id; private Long productModelId; private BigDecimal qualitity; private BigDecimal requisitionQty; private String productName; private String model; private String unit; } src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -6,11 +6,13 @@ import com.ruoyi.production.pojo.ProductOrder; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; @EqualsAndHashCode(callSuper = true) @Data @ExcelIgnoreUnannotated public class ProductOrderDto extends ProductOrder { @@ -59,4 +61,7 @@ private Boolean isFh; private String uidNo; @ApiModelProperty(value = "BOMç¼å·id") private Long bomId; } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -45,4 +45,7 @@ private String workOrderType; private String uidNo; @ApiModelProperty(value = "é¢æè®°å½") private String drawMaterials; } src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -1,8 +1,6 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; import org.apache.ibatis.annotations.Mapper; @@ -13,7 +11,7 @@ @Mapper public interface ProductStructureMapper extends BaseMapper<ProductStructure> { List<ProductStructureDto> listBybomId(@Param("bomId") Integer bomId); List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId); List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Integer bomId, @Param("processId") Long processId); List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Long bomId, @Param("processId") Long processId); } src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -40,5 +40,5 @@ private String processRouteCode; @ApiModelProperty(value = "BOMçID") private Integer bomId; private Long bomId; } src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -123,4 +123,10 @@ */ @ApiModelProperty(value = "æ¸ åºè®°å½") private String cleanRecord; /** * é¢æè®°å½ */ @ApiModelProperty(value = "é¢æè®°å½") private String drawMaterials; } src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
@@ -1,18 +1,13 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> @@ -53,7 +48,7 @@ private LocalDateTime updateTime; @ApiModelProperty("å ³èbomçid") private Integer bomId; private Long bomId; @ApiModelProperty("å·¥èºè·¯çº¿ç¼ç ") private String processRouteCode; src/main/java/com/ruoyi/production/service/ProductBomService.java
@@ -26,5 +26,5 @@ AjaxResult uploadBom(MultipartFile file); void exportBom(HttpServletResponse response, Integer bomId); void exportBom(HttpServletResponse response, Long bomId); } src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.basic.dto.SelectOptionDTO; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProcessRoute; @@ -29,4 +30,10 @@ int finishOrder(Long orderId); int cleanRecord(Long id, Map<String, Object> cleanRecord); List<SelectOptionDTO<String>> getProductOrderBatchNo(); List getByBomId(Long bomId); int drawMaterials(ProductOrderDto productOrderDto); } src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -1,7 +1,6 @@ package com.ruoyi.production.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.basic.dto.ProductModelDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; @@ -12,6 +11,6 @@ Boolean addProductStructureDto(ProductStructureDto productStructureDto); List<ProductStructureDto> listBybomId(Integer bomId); List<ProductStructureDto> listBybomId(Long bomId); } src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
@@ -186,7 +186,7 @@ @Override public void exportBom(HttpServletResponse response, Integer bomId) { public void exportBom(HttpServletResponse response, Long bomId) { if (bomId == null) { return; } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -4,27 +4,35 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.basic.dto.SelectOptionDTO; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.DrawMaterialDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.mapper.StockInventoryMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; @Service @@ -65,6 +73,13 @@ @Autowired private StockUtils stockUtils; @Autowired private ProductStructureMapper productStructureMapper; @Autowired private StockInventoryMapper stockInventoryMapper; @Override public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) { @@ -160,11 +175,11 @@ //妿已ç»å¼å§ç产,ä¸è½å é¤ //æ¥è¯¢ç产订åä¸çå·¥å List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)); if (productWorkOrders.size()>0){ if (productWorkOrders.size() > 0) { //夿æ¯å¦ææ¥å·¥æ°æ® List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery() .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList()))); if (productionProductMains.size()>0){ if (productionProductMains.size() > 0) { throw new RuntimeException("ç产订åå·²ç»å¼å§ç产,ä¸è½å é¤"); } //å é¤å·¥å @@ -229,4 +244,95 @@ productOrder.setCleanRecord(JSON.toJSONString(cleanRecord)); return productOrderMapper.updateById(productOrder); } @Override public List<SelectOptionDTO<String>> getProductOrderBatchNo() { List<ProductOrder> productOrders = productOrderMapper.selectList(null); return productOrders.stream().map(productOrder -> new SelectOptionDTO<>(productOrder.getBatchNo(), productOrder.getBatchNo())).collect(Collectors.toList()); } @Override public List<StockInventoryDto> getByBomId(Long bomId) { List<ProductStructureDto> structureList = productStructureMapper.listBybomId(bomId); if (CollectionUtils.isEmpty(structureList)) { return Collections.emptyList(); } Set<Long> allNodeIds = structureList.stream() .map(ProductStructureDto::getId) .collect(Collectors.toSet()); Set<Long> parentIds = structureList.stream() .filter(node -> node.getParentId() != null && node.getParentId() != 0) .map(ProductStructureDto::getParentId) .collect(Collectors.toSet()); Set<Long> leafNodeIds = new HashSet<>(allNodeIds); leafNodeIds.removeAll(parentIds); // è·åå¶åèç¹ç productModelId List<Long> productModelIds = structureList.stream() .filter(node -> leafNodeIds.contains(node.getId())) .map(ProductStructureDto::getProductModelId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (productModelIds.isEmpty()) { return Collections.emptyList(); } return stockInventoryMapper.getStockInventory(productModelIds); } @Override @Transactional(rollbackFor = Exception.class) public int drawMaterials(ProductOrderDto productOrderDto) { if (productOrderDto == null || productOrderDto.getId() == null) { throw new RuntimeException("åæ°é误"); } String jsonString = productOrderDto.getDrawMaterials(); if (StringUtils.isEmpty(jsonString)) { throw new RuntimeException("颿æç»ä¸è½ä¸ºç©º"); } List<DrawMaterialDto> drawMaterialsList; try { drawMaterialsList = JSON.parseArray(jsonString, DrawMaterialDto.class); } catch (Exception e) { throw new RuntimeException("颿æç»æ ¼å¼é误"); } if (CollectionUtils.isEmpty(drawMaterialsList)) { throw new RuntimeException("颿æç»ä¸è½ä¸ºç©º"); } // å¤çé¢æï¼æ£ååºåï¼ try { for (DrawMaterialDto drawMaterialDto : drawMaterialsList) { if (drawMaterialDto.getProductModelId() == null) { throw new RuntimeException("产ååå·IDä¸è½ä¸ºç©º"); } stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId()); } } catch (Exception e) { throw new RuntimeException("é¢æå¤±è´¥ï¼" + e.getMessage()); } // JSONå符串åå¨ String newJsonString = JSON.toJSONString(drawMaterialsList); int update = productOrderMapper.update(null, new LambdaUpdateWrapper<ProductOrder>() .eq(ProductOrder::getId, productOrderDto.getId()) .set(ProductOrder::getDrawMaterials, newJsonString)); // æ ¡éªæ´æ°ç»æ if (update == 0) { throw new RuntimeException("æ´æ°è®¢å失败"); } return update; } } src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -130,7 +130,7 @@ @Override public List<ProductStructureDto> listBybomId(Integer bomId) { public List<ProductStructureDto> listBybomId(Long bomId) { List<ProductStructureDto> list = productStructureMapper.listBybomId(bomId); Map<Long, ProductStructureDto> map = new HashMap<>(); src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
@@ -140,5 +140,6 @@ @ApiModelProperty("æ¯å¦ä¸åæ ¼å¤çèªå·±æ°å¢") @TableField(exist = false) private Boolean method; @TableField(exist = false) private String uidNo; } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -349,4 +349,10 @@ public R getSalesLedgerWithProductsLoss(Long salesLedgerId) { return R.ok(salesLedgerService.getSalesLedgerWithProductsLoss(salesLedgerId)); } @ApiOperation("导åº") @PostMapping ("/exportSaleOutbound") public void export(HttpServletResponse response, @RequestBody SalesLedger salesLedger) { salesLedgerService.export(response,salesLedger.getId()); } } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -238,4 +238,7 @@ @TableField(exist = false) private String uidNo; @ApiModelProperty(value = "æ¹å·") private String batchNo; } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.aftersalesservice.pojo.AfterSalesService; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.LossProductModelDto; @@ -13,6 +12,7 @@ import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.List; @@ -52,4 +52,6 @@ List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId); IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page); public void export(HttpServletResponse response, Long id); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,5 +1,6 @@ package com.ruoyi.sales.service.impl; import cn.hutool.core.convert.NumberChineseFormatter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -8,11 +9,15 @@ 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.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.common.exception.base.BaseException; @@ -26,6 +31,10 @@ import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; @@ -48,11 +57,14 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -879,4 +891,97 @@ throw new RuntimeException("å¨ææ´æ°ä¸»è¡¨éé¢å¤±è´¥", e); } } @Override public void export(HttpServletResponse response, Long id) { SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct(); salesLedgerProduct.setSalesLedgerId(id); salesLedgerProduct.setType(1); List<SalesLedgerProduct> list = salesLedgerProductServiceImpl.selectSalesLedgerProductList(salesLedgerProduct); List<Map<String, Object>> products = new ArrayList<>(); BigDecimal amount = BigDecimal.ZERO; for (int i = 0; i < list.size(); i++) { Map<String, Object> map = new HashMap<>(); SalesLedgerProduct product = list.get(i); map.put("index", i + 1); map.put("productCategory", product.getProductCategory()); map.put("specificationModel", product.getSpecificationModel()); map.put("unit", product.getUnit()); map.put("quantity", product.getQuantity()); map.put("taxInclusiveUnitPrice", product.getTaxInclusiveUnitPrice().setScale(2, RoundingMode.HALF_UP).toString()); map.put("taxInclusiveTotalPrice", product.getTaxInclusiveTotalPrice().setScale(2, RoundingMode.HALF_UP).toString()); map.put("batchNo", product.getBatchNo()); // æ¥è¯¢åè¯ ProductModel productModel = productModelMapper.selectById(product.getProductModelId()); if (productModel != null) { map.put("filingCertificateNo", productModel.getFilingCertificateNo()); } amount = amount.add(product.getTaxInclusiveTotalPrice()); List<ProductOrder> productOrders = productOrderMapper.selectList(new LambdaQueryWrapper<ProductOrder>() .eq(ProductOrder::getBatchNo, product.getBatchNo())); if (CollectionUtils.isEmpty(productOrders)) { throw new RuntimeException("æ¹å·ä¸åå¨"); } List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(new LambdaQueryWrapper<ProductWorkOrder>() .eq(ProductWorkOrder::getProductOrderId, productOrders.get(0).getId())); List<Long> ids = productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList()); List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, ids) .orderByDesc(ProductionProductMain::getCreateTime)); List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getId, productionProductMains.stream() .map(ProductionProductMain::getProductProcessRouteItemId).collect(Collectors.toList())) .eq(ProductProcessRouteItem::getProductModelId, product.getProductModelId()) .orderByDesc(ProductProcessRouteItem::getCreateTime)); if (CollectionUtils.isEmpty(productProcessRouteItems)) { throw new RuntimeException("çäº§æ°æ®ä¸åå¨"); } String productionDate = productProcessRouteItems.get(0).getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); if (productModel.getValidityPeriod() == null) { throw new RuntimeException("æææä¸è½ä¸ºç©º"); } String expiryDate = productProcessRouteItems.get(0).getCreateTime().plusYears(productModel.getValidityPeriod().longValue()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); map.put("productionDate", productionDate); map.put("expiryDate", expiryDate); products.add(map); } Map<String, Object> data = new HashMap<>(); data.put("products", products); data.put("amount", amount); data.put("amountBig", NumberChineseFormatter.format(amount, true, false)); SalesLedger salesLedger = salesLedgerMapper.selectById(id); data.put("customerName ", salesLedger.getCustomerName()); data.put("executionDate", salesLedger.getExecutionDate()); data.put("salesContractNo", salesLedger.getSalesContractNo()); Customer customer = customerMapper.selectById(salesLedger.getCustomerId()); data.put("companyPhone", customer.getCompanyPhone()); data.put("companyAddress", customer.getCompanyAddress()); data.put("salesman", salesLedger.getSalesman()); InputStream inputStream = this.getClass().getResourceAsStream("/static/sale-outbound.docx"); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); Configure config = Configure.builder() .bind("products", policy).build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(data); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( "éå®åºåºå", "UTF-8"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导åºå¤±è´¥"); } } } src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -3,11 +3,13 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.stock.pojo.StockInventory; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; @EqualsAndHashCode(callSuper = true) @Data public class StockInventoryDto extends StockInventory { src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -49,4 +49,6 @@ List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate); BigDecimal selectTotalByDate(@Param("now") LocalDate now); List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids); } src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -7,13 +7,14 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("stock_in_record") @ApiModel("å ¥åºç®¡ç") public class StockInRecord { public class StockInRecord implements Serializable { private static final long serialVersionUID = 1L; /** src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -16,6 +16,7 @@ <result property="manufacturingTeam" column="manufacturing_team"/> <result property="isEnd" column="is_end"/> </resultMap> <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto"> select po.*, sl.sales_contract_no, @@ -25,6 +26,7 @@ pm.unit, pm.uid_no, ppr.process_route_code, pb.id as bomId, pb.bom_no, ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus, DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff, src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -27,6 +27,7 @@ pm.unit, pm.uid_no, p.product_name AS productName, po.draw_materials as drawMaterials, po.nps_no AS productOrderNpsNo, po.is_end as productOrderIsEnd, ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus, src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -55,37 +55,37 @@ SELECT slpa.scheduling_user_id, slpa.scheduling_user_name, sum(ppout.quantity) as output_num, sum(slpa.finished_num * work_hours) as wages, IFNULL(SUM(ppout.quantity), 0) AS output_num, IFNULL(SUM(slpa.finished_num * slpa.work_hours), 0) AS wages, CONCAT( ROUND( CASE WHEN SUM(ppout.quantity) = 0 OR SUM(ppout.quantity) IS NULL THEN 0 WHEN IFNULL(SUM(ppout.quantity), 0) = 0 THEN 0 ELSE SUM(slpa.finished_num) * 100.0 / SUM(ppout.quantity) END, 2 ), '%' ) as output_rate ) AS output_rate FROM sales_ledger_production_accounting slpa LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id <where> <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''"> and slpa.scheduling_user_name = #{ew.schedulingUserName} AND slpa.scheduling_user_name = #{ew.schedulingUserName} </if> <if test="ew.entryDate != null "> and slpa.scheduling_date >= #{ew.entryDate} and slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDate}), INTERVAL 1 DAY) AND slpa.scheduling_date >= #{ew.entryDate} AND slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDate}), INTERVAL 1 DAY) </if> <if test="ew.entryDateStart != null and ew.entryDateEnd != null"> and slpa.scheduling_date >= #{ew.entryDateStart} and slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDateEnd}), INTERVAL 1 DAY) AND slpa.scheduling_date >= #{ew.entryDateStart} AND slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDateEnd}), INTERVAL 1 DAY) </if> </where> GROUP BY slpa.scheduling_user_name GROUP BY slpa.scheduling_user_id, slpa.scheduling_user_name </select> <select id="selectDailyWagesStats" resultType="java.util.Map"> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -64,7 +64,7 @@ pm.model, si.remark, pm.unit, pm.uidNo, pm.uid_no as uidNo, p.product_name from stock_inventory si left join product_model pm on si.product_model_id = pm.id @@ -95,7 +95,7 @@ select sir.*,si.qualitity as current_stock, pm.model, pm.unit, pm.uidNo, pm.uid_no as uidNo, p.product_name, su.nick_name as create_by from @@ -239,4 +239,22 @@ ORDER BY DATE(sor.create_time) ASC </select> <select id="getStockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> SELECT p.product_name, pm.model, pm.unit, si.* FROM product_model pm LEFT JOIN product p ON p.id = pm.product_id LEFT JOIN stock_inventory si ON si.product_model_id = pm.id WHERE pm.id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> ORDER BY pm.id </select> </mapper> src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -23,7 +23,7 @@ p.product_name as productName, pm.model, pm.unit, pm.uidNo, pm.uid_no as uidNo, u.nick_name as createBy FROM stock_out_record as sor LEFT JOIN product_model as pm on sor.product_model_id = pm.id src/main/resources/static/sale-outbound.docxBinary files differ