yzc 10 месяцев назад
Родитель
Сommit
02fa94ad32

+ 8 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/production/ProduceOrderDetailController.java

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 
@@ -107,5 +108,12 @@ public class ProduceOrderDetailController {
         produceOrderDetailService.editBeginWork(dto);
     }
 
+    /**
+     * 生产开工确认
+     */
+    @PostMapping("/exportExcel")
+    public void editBeginWork(@RequestBody ProduceOrderDetailSelectDto dto, HttpServletResponse httpServletResponse) {
+        produceOrderDetailService.exportExcel(dto, httpServletResponse);
+    }
 
 }

+ 106 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/ProduceOrderDetailExcelBo.java

@@ -0,0 +1,106 @@
+package com.fjhx.mes.entity.production;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ProduceOrderDetailExcelBo {
+    private String customerName;
+    /**
+     * 业务员名称
+     */
+    private String saleUserName;
+    /**
+     * 生产公司Id
+     */
+    private String companyName;
+    /**
+     * 订单变化
+     */
+    private String orderCode;
+    /**
+     * 订单归属   1归属工厂、2归属业务
+     */
+    private String contractBelongType;
+    /**
+     * 分类名称
+     */
+    private String productClassifyNames;
+    /**
+     * 产品编号
+     */
+    private String productCode;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+    private String productColor;
+    /**
+     * 原材料长
+     */
+    private BigDecimal rawMaterialLength;
+    /**
+     * 正面纹路
+     */
+    private String productFrontalTexture;
+    /**
+     * 反面纹路
+     */
+    private String productReverseTexture;
+    /**
+     * LOGO长
+     */
+    private BigDecimal productLogoLength;
+    /**
+     * 订单创建时间
+     */
+    private Date orderCreateTime;
+    /**
+     * 订单数量
+     */
+    private BigDecimal quantity;
+    private BigDecimal finishQuantity;
+
+    //欠量
+//    ------------------
+    private String remark;
+    /**
+     * 交期
+     */
+    private Date deliveryPeriod;
+    /**
+     * 欠料状态
+     */
+    private Integer lackStatus;
+    //进度达成率
+    private String code;
+
+    /**
+     * 业务公司名称
+     */
+    private String contractCompanyName;
+    private String contractDeptName;
+    /**
+     * 合同类型
+     */
+    private Integer contractType;
+    /**
+     * 是否逾期
+     */
+    private Integer isOverdue;
+    /**
+     * 生产状态 0未开始 1进行中 2已完成
+     */
+    private Integer produceStatus;
+    /**
+     * 生产指示
+     */
+    private String prodTag;
+    private Date finishTime;
+    /**
+     * 生产用时
+     */
+    private Long usageTime;
+
+
+}

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/ProduceOrderDetailService.java

@@ -8,6 +8,7 @@ import com.fjhx.mes.entity.production.po.ProductionOrderDetail;
 import com.fjhx.mes.entity.production.vo.ProductionOrderDetailVo;
 import com.ruoyi.common.core.service.BaseService;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 
@@ -70,4 +71,9 @@ public interface ProduceOrderDetailService extends BaseService<ProductionOrderDe
      * 生产开工确认
      */
     void editBeginWork(ProductionOrderDetailDto dto);
+
+    /**
+     * 导出Excel
+     */
+    void exportExcel(ProduceOrderDetailSelectDto dto, HttpServletResponse httpServletResponse);
 }

+ 125 - 4
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderDetailServiceImpl.java

@@ -3,6 +3,9 @@ package com.fjhx.mes.service.production.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.util.DateUtils;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,10 +19,7 @@ import com.fjhx.item.service.product.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.production.dto.ProduceOrderDetailSelectDto;
 import com.fjhx.mes.entity.production.dto.ProductionOrderDetailDto;
-import com.fjhx.mes.entity.production.po.ProductionOrder;
-import com.fjhx.mes.entity.production.po.ProductionOrderDetail;
-import com.fjhx.mes.entity.production.po.ProductionScheduling;
-import com.fjhx.mes.entity.production.po.ProductionTaskProgress;
+import com.fjhx.mes.entity.production.po.*;
 import com.fjhx.mes.entity.production.vo.ProductionOrderDetailVo;
 import com.fjhx.mes.entity.production.vo.ProductionSchedulingVo;
 import com.fjhx.mes.entity.production.vo.ProductionTaskProgressVo;
@@ -27,21 +27,30 @@ import com.fjhx.mes.mapper.production.ProduceOrderDetailMapper;
 import com.fjhx.mes.mapper.production.ProductionTaskProgressMapper;
 import com.fjhx.mes.service.production.ProduceOrderDetailService;
 import com.fjhx.mes.service.production.ProduceOrderService;
+import com.fjhx.mes.service.production.ProductionProcessesService;
 import com.fjhx.mes.service.production.ProductionSchedulingService;
 import com.fjhx.sale.entity.contract.po.ContractProductBom;
 import com.fjhx.sale.entity.contract.vo.ContractProductBomVo;
 import com.fjhx.sale.service.contract.ContractProductBomService;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.tenant.utils.DeptUstil;
+import com.fjhx.tenant.utils.DictUtils;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.UserUtil;
+import org.apache.commons.codec.Charsets;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -76,6 +85,8 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
     private CustomerService customerService;
     @Autowired
     private ProductClassifyService productClassifyService;
+    @Resource
+    private ProductionProcessesService productionProcessesService;
 
     @Override
     public Page<ProductionOrderDetailVo> getPage(ProduceOrderDetailSelectDto dto) {
@@ -517,4 +528,114 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
         this.updateById(dto);
     }
 
+    @Override
+    public void exportExcel(ProduceOrderDetailSelectDto dto, HttpServletResponse response) {
+        dto.setPageSize(9999);
+        List<ProductionOrderDetailVo> records = getPage(dto).getRecords();
+
+        Map<String, String> frontLineMap = DictUtils.getDictMap("front_lines");
+        Map<String, String> backLineMap = DictUtils.getDictMap("back_lines");
+        Map<String, String> contractProdTagMap = DictUtils.getDictMap("contract_prod_tag");
+
+        //工序获取
+        List<ProductionProcesses> ppList = productionProcessesService.list(q -> q.eq(ProductionProcesses::getIsShow, 1));
+
+
+        //数据处理
+        List<List<Object>> writeList = new ArrayList<List<Object>>();
+        for (ProductionOrderDetailVo record : records) {
+            List<Object> item = new ArrayList<>();
+            item.add(record.getCustomerName());
+            item.add(record.getSaleUserName());
+            item.add(record.getCompanyName());
+            item.add(record.getOrderCode());
+            item.add(record.getContractBelongType() == "1" ? "归属工厂" : "归属业务");
+            item.add(record.getProductClassifyNames());
+            item.add(record.getProductCode());
+            item.add(record.getProductName());
+            item.add(record.getProductColor());
+            String productLength = "", productWidth = "", productHeight = "";
+            if (ObjectUtil.isNotEmpty(record.getProductLength())) {
+                productLength = String.valueOf(record.getProductLength().setScale(2));
+            }
+            if (ObjectUtil.isNotEmpty(record.getProductWidth())) {
+                productWidth = String.valueOf(record.getProductWidth().setScale(2));
+            }
+            if (ObjectUtil.isNotEmpty(record.getProductHeight())) {
+                productHeight = String.valueOf(record.getProductHeight().setScale(2));
+            }
+            item.add(String.format("%s*%s*%s", productLength, productWidth, productHeight));
+            item.add(frontLineMap.get(record.getProductFrontalTexture()));
+            item.add(backLineMap.get(record.getProductReverseTexture()));
+            String logoLength = "", logoWidth = "";
+            if (ObjectUtil.isNotEmpty(record.getProductLogoLength())) {
+                logoLength = String.valueOf(record.getProductLogoLength().setScale(2));
+            }
+            if (ObjectUtil.isNotEmpty(record.getProductLogoWidth())) {
+                logoWidth = String.valueOf(record.getProductLogoWidth().setScale(2));
+            }
+            item.add(String.format("%s*%s", logoLength, logoWidth));
+            item.add(DateUtil.format(record.getOrderCreateTime(), "yyyy-MM-dd"));
+            item.add(record.getQuantity());
+            item.add(record.getFinishQuantity());
+            item.add(record.getQuantity().subtract(record.getFinishQuantity()));
+            item.add(record.getRemark());
+            item.add(DateUtil.format(record.getDeliveryPeriod(), "yyyy-MM-dd"));
+            item.add(record.getLackStatus() == 1 ? "欠料" : "未欠料");
+            item.add(record.getFinishQuantity().divide(record.getQuantity(), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
+            item.add(record.getCode());
+            item.add(record.getContractCompanyName());
+            item.add(record.getContractDeptName());
+            Integer contractType = record.getContractType();
+            item.add(contractType == 1 ? "外贸订单(退税)" : contractType == 2 ? "内销订单" : contractType == 3 ? "打样订单" : contractType == 4 ? "外贸订单(不退税)" : contractType);
+            item.add(record.getIsOverdue() == 1 ? "逾期" : "未逾期");
+            Integer produceStatus = record.getProduceStatus();
+            item.add(produceStatus == 0 ? "未开始" : produceStatus == 1 ? "生产中" : produceStatus == 2 ? "生产完成" : produceStatus == 5 ? "出库中" : produceStatus == 10 ? "已出库" : produceStatus == 88 ? "作废" : produceStatus == 99 ? "终止" : produceStatus);
+            StringJoiner tagNames = new StringJoiner(",");
+            for (String tag : ObjectUtil.defaultIfNull(record.getProdTag(), "").split(",")) {
+                tagNames.add(contractProdTagMap.getOrDefault(tag, tag));
+            }
+            item.add(tagNames.toString());
+            item.add(DateUtil.format(record.getFinishTime(), "yyyy-MM-dd"));
+            item.add(record.getUsageTime());
+
+            //动态工序部分
+            List<ProductionTaskProgressVo> progressList = record.getProductionTaskProgressList();
+            Map<Long, ProductionTaskProgressVo> progressMap = progressList
+                    .stream().collect(Collectors.toMap(ProductionTaskProgressVo::getProcessesId, Function.identity()));
+            for (ProductionProcesses productionProcesses : ppList) {
+                ProductionTaskProgressVo pTpv = progressMap.get(productionProcesses.getId());
+                if (ObjectUtil.isNotEmpty(pTpv)) {
+                    item.add(pTpv.getSchedulingCount() + "/" + pTpv.getFinishQuantity().intValue());
+                } else {
+                    item.add("-");
+                }
+            }
+
+            writeList.add(item);
+        }
+
+        //标题
+        List<List<String>> headList = new ArrayList<List<String>>();
+        for (String title : Arrays.asList("客户", "业务员", "订单组别", "订单编号", "归属业务", "产品类别", "产品编码", "产品名称", "产品颜色", "规格尺寸(cm)", "正面纹路", "背面纹路", "LOGO尺寸", "下单日期", "订单数量", "已完成", "欠量", "进度说明", "出货交期", "欠料状态", "进度达成率", "生产订单号", "业务公司", "业务部门", "订单类型", "是否逾期", "生产状态", "生产指示", "完成时间", "生产用时")) {
+            headList.add(Arrays.asList(title));
+        }
+        for (ProductionProcesses productionProcesses : ppList) {
+            headList.add(Arrays.asList(productionProcesses.getName() + "(排程/完成)"));
+        }
+
+
+        //导出
+        try {
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding(Charsets.UTF_8.name());
+            String fileName = DateUtils.format(new Date(), DateUtils.DATE_FORMAT_14) + "导出数据";
+            fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream()).sheet().head(headList).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(writeList);
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
 }