|
@@ -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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|