|  | @@ -1,8 +1,12 @@
 | 
	
		
			
				|  |  |  package org.jeecg.modules.saleCode.controller;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import java.io.OutputStream;
 | 
	
		
			
				|  |  |  import java.io.UnsupportedEncodingException;
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  |  import java.net.URLDecoder;
 | 
	
		
			
				|  |  | +import java.net.URLEncoder;
 | 
	
		
			
				|  |  | +import java.nio.charset.StandardCharsets;
 | 
	
		
			
				|  |  |  import java.util.ArrayList;
 | 
	
		
			
				|  |  |  import java.util.Arrays;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
	
		
			
				|  | @@ -13,14 +17,28 @@ import java.util.HashMap;
 | 
	
		
			
				|  |  |  import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  |  import javax.servlet.http.HttpServletResponse;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import com.alibaba.excel.EasyExcel;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.ExcelWriter;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.enums.WriteDirectionEnum;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.support.ExcelTypeEnum;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.write.metadata.WriteSheet;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.write.metadata.fill.FillConfig;
 | 
	
		
			
				|  |  | +import com.alibaba.excel.write.metadata.fill.FillWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang.StringUtils;
 | 
	
		
			
				|  |  |  import org.jeecg.common.aspect.annotation.PermissionData;
 | 
	
		
			
				|  |  | -import org.jeecg.modules.baseCode.service.ISerialPatternService;
 | 
	
		
			
				|  |  | +import org.jeecg.common.util.DateUtils;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.baseCode.entity.*;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.baseCode.service.*;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.cuspCode.entity.CuspCustomerProfile;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.cuspCode.service.ICuspCustomerProfileService;
 | 
	
		
			
				|  |  |  import org.jeecg.modules.saleCode.entity.*;
 | 
	
		
			
				|  |  | -import org.jeecg.modules.saleCode.service.ISaleInvoiceService;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.saleCode.service.*;
 | 
	
		
			
				|  |  |  import org.jeecg.modules.saleCode.vo.SaleDeliveryAlert;
 | 
	
		
			
				|  |  |  import org.jeecg.modules.storeCode.entity.StoreSaleOut;
 | 
	
		
			
				|  |  |  import org.jeecg.modules.storeCode.service.IStoreSaleOutService;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.system.entity.SysUser;
 | 
	
		
			
				|  |  | +import org.jeecg.modules.system.service.ISysUserService;
 | 
	
		
			
				|  |  |  import org.jeecgframework.poi.excel.ExcelImportUtil;
 | 
	
		
			
				|  |  |  import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 | 
	
		
			
				|  |  |  import org.jeecgframework.poi.excel.entity.ExportParams;
 | 
	
	
		
			
				|  | @@ -33,11 +51,9 @@ import org.jeecg.common.system.query.QueryGenerator;
 | 
	
		
			
				|  |  |  import org.jeecg.common.system.query.QueryRuleEnum;
 | 
	
		
			
				|  |  |  import org.jeecg.common.util.oConvertUtils;
 | 
	
		
			
				|  |  |  import org.jeecg.modules.saleCode.vo.SaleDeliveryPage;
 | 
	
		
			
				|  |  | -import org.jeecg.modules.saleCode.service.ISaleDeliveryService;
 | 
	
		
			
				|  |  | -import org.jeecg.modules.saleCode.service.ISaleDeliveryShipService;
 | 
	
		
			
				|  |  | -import org.jeecg.modules.saleCode.service.ISaleDeliveryDetailsService;
 | 
	
		
			
				|  |  |  import org.springframework.beans.BeanUtils;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Value;
 | 
	
		
			
				|  |  |  import org.springframework.web.bind.annotation.*;
 | 
	
		
			
				|  |  |  import org.springframework.web.servlet.ModelAndView;
 | 
	
		
			
				|  |  |  import org.springframework.web.multipart.MultipartFile;
 | 
	
	
		
			
				|  | @@ -76,6 +92,27 @@ public class SaleDeliveryController {
 | 
	
		
			
				|  |  |      private ISerialPatternService serialPatternService;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private IStoreSaleOutService storeSaleOutService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IBaseTemplatesService baseTemplatesService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private ISysUserService sysUserService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IBaseProductClassService baseProductClassService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private ICuspCustomerProfileService cuspCustomerProfileService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IBaseShipArchiveService baseShipArchiveService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IBaseProductArchiveService baseProductArchiveService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IBaseProjectArchiveService baseProjectArchiveService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private ISaleOrderProductService saleOrderProductService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private ISaleOrderService saleOrderService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Value(value = "${jeecg.path.upload}")
 | 
	
		
			
				|  |  | +    private String uploadpath;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 分页列表查询
 | 
	
	
		
			
				|  | @@ -556,5 +593,175 @@ public class SaleDeliveryController {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return Result.OK("文件导入失败!");
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 导出箱单
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @RequestMapping(value = "/exportDeliverBillXls")
 | 
	
		
			
				|  |  | +    public void exportDeliverBillXls(HttpServletResponse response, SaleDelivery saleDelivery) throws Exception {
 | 
	
		
			
				|  |  | +        exportByDeliver("箱单", saleDelivery.getId(), response);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 导出随货发票
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @RequestMapping(value = "/exportInvoiceBillXls")
 | 
	
		
			
				|  |  | +    public void exportInvoiceBillXls(HttpServletResponse response, SaleDelivery saleDelivery) throws Exception {
 | 
	
		
			
				|  |  | +        exportByDeliver("随货发票", saleDelivery.getId(), response);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void exportByDeliver(String templateName, String id, HttpServletResponse response){
 | 
	
		
			
				|  |  | +        BaseTemplates templates = baseTemplatesService.getByTemplateType(templateName);
 | 
	
		
			
				|  |  | +        SaleDelivery saleDelivery = saleDeliveryService.getById(id);
 | 
	
		
			
				|  |  | +        List<SaleDeliveryDetails> deliveryDetailsList = saleDeliveryDetailsService.selectByMainId(id);
 | 
	
		
			
				|  |  | +        List<SaleDeliveryShip> deliveryShipList = saleDeliveryShipService.selectByMainId(id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (templates != null) {
 | 
	
		
			
				|  |  | +            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
 | 
	
		
			
				|  |  | +            response.setCharacterEncoding("utf-8");
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                String fileName = URLEncoder.encode(saleDelivery.getBillCode(), "UTF-8").replaceAll("\\+", "%20");
 | 
	
		
			
				|  |  | +                response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                String filePath = uploadpath + templates.getTemplateFile();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //填写合同单号和模板, getOutputStream浏览器下载方法写在下方
 | 
	
		
			
				|  |  | +                ExcelWriter excelWriter = EasyExcel.write(this.getOutputStream(fileName, response)).withTemplate(filePath).build();
 | 
	
		
			
				|  |  | +                WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet1").build();
 | 
	
		
			
				|  |  | +                String productionClass = saleDelivery.getProductionClass();
 | 
	
		
			
				|  |  | +                if (StringUtils.isNotBlank(productionClass)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    BaseProductClass classEnt = baseProductClassService.getById(productionClass);
 | 
	
		
			
				|  |  | +                    if (classEnt != null) {
 | 
	
		
			
				|  |  | +                        saleDelivery.setProductionClass(classEnt.getName());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                String getQuotationCustomer = saleDelivery.getCustomer();
 | 
	
		
			
				|  |  | +                if (StringUtils.isNotBlank(getQuotationCustomer)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    CuspCustomerProfile classEnt = cuspCustomerProfileService.getById(getQuotationCustomer);
 | 
	
		
			
				|  |  | +                    if (classEnt != null) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        saleDelivery.setContacts(classEnt.getContacts());
 | 
	
		
			
				|  |  | +                        saleDelivery.setPhone(classEnt.getPhone());
 | 
	
		
			
				|  |  | +                        saleDelivery.setEmail(classEnt.getEmail());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                // 获取计产品档案
 | 
	
		
			
				|  |  | +                List<BaseProductArchive> productArchiveList = new ArrayList<>();
 | 
	
		
			
				|  |  | +                if (oConvertUtils.listIsNotEmpty(deliveryDetailsList)){
 | 
	
		
			
				|  |  | +                    LambdaQueryWrapper<BaseProductArchive> productWrapper = new LambdaQueryWrapper<>();
 | 
	
		
			
				|  |  | +                    productWrapper.in(BaseProductArchive::getId, deliveryDetailsList.stream().map(SaleDeliveryDetails::getProductId).collect(Collectors.toList()));
 | 
	
		
			
				|  |  | +                    productArchiveList = baseProductArchiveService.list(productWrapper);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                // 获取销售订单行
 | 
	
		
			
				|  |  | +                List<SaleOrderProduct> saleOrderProductList = new ArrayList<>();
 | 
	
		
			
				|  |  | +                if (oConvertUtils.listIsNotEmpty(deliveryDetailsList)){
 | 
	
		
			
				|  |  | +                    LambdaQueryWrapper<SaleOrderProduct> productWrapper = new LambdaQueryWrapper<>();
 | 
	
		
			
				|  |  | +                    productWrapper.in(SaleOrderProduct::getId, deliveryDetailsList.stream().map(SaleDeliveryDetails::getSourceId).collect(Collectors.toList()));
 | 
	
		
			
				|  |  | +                    saleOrderProductList = saleOrderProductService.list(productWrapper);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                // 获取销售订单
 | 
	
		
			
				|  |  | +                if (oConvertUtils.isNotEmpty(saleDelivery.getSourceCode())){
 | 
	
		
			
				|  |  | +                    LambdaQueryWrapper<SaleOrder> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
	
		
			
				|  |  | +                    orderLambdaQueryWrapper.eq(SaleOrder::getBillCode, saleDelivery.getSourceCode());
 | 
	
		
			
				|  |  | +                    SaleOrder saleOrder = saleOrderService.getOne(orderLambdaQueryWrapper);
 | 
	
		
			
				|  |  | +                    if (saleOrder != null){
 | 
	
		
			
				|  |  | +                        saleDelivery.setPaymentTerms(saleOrder.getPaymentTerms());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 产品设置
 | 
	
		
			
				|  |  | +                int rowNum = 1;
 | 
	
		
			
				|  |  | +                BigDecimal deliverMoney = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                for(SaleDeliveryDetails o:deliveryDetailsList){
 | 
	
		
			
				|  |  | +                    BigDecimal amount = o.getMoney() == null ? BigDecimal.ZERO: o.getMoney();
 | 
	
		
			
				|  |  | +                    deliverMoney = deliverMoney.add(amount);
 | 
	
		
			
				|  |  | +                    o.setRowNumber(rowNum++);
 | 
	
		
			
				|  |  | +                    if (o.getDeliveryTime() != null){
 | 
	
		
			
				|  |  | +                        o.setDeliverDateText(DateUtils.date2Str(o.getDeliveryTime(), DateUtils.date_sdf.get()));
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    BaseProductArchive findProduct = productArchiveList.stream().filter(e->e.getId().equals(o.getProductId())).findFirst().orElse(null);
 | 
	
		
			
				|  |  | +                    if (findProduct != null){
 | 
	
		
			
				|  |  | +                        o.setUnit(findProduct.getMeasurementUnit());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    SaleOrderProduct saleOrderProduct = saleOrderProductList.stream().filter(e->e.getId().equals(o.getSourceId())).findFirst().orElse(null);
 | 
	
		
			
				|  |  | +                    if (saleOrderProduct != null){
 | 
	
		
			
				|  |  | +                        if (oConvertUtils.isNotEmpty(saleOrderProduct.getDiscount())){
 | 
	
		
			
				|  |  | +                            o.setDiscountText(saleOrderProduct.getDiscount().intValue()+"%");
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                deliverMoney = deliverMoney.setScale(2);
 | 
	
		
			
				|  |  | +                saleDelivery.setDeliveryMoney(deliverMoney);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                String shipname = "";
 | 
	
		
			
				|  |  | +                String imo = "";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if(oConvertUtils.listIsNotEmpty(deliveryShipList)){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    shipname = deliveryShipList.stream().map(SaleDeliveryShip::getShipName).distinct().collect(Collectors.joining());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    LambdaQueryWrapper<BaseShipArchive> shipArchiveLambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
	
		
			
				|  |  | +                    shipArchiveLambdaQueryWrapper.in(BaseShipArchive::getId,deliveryShipList.stream().map(SaleDeliveryShip::getShipId).collect(Collectors.joining()));
 | 
	
		
			
				|  |  | +                    List<BaseShipArchive> baseShipArchiveList = baseShipArchiveService.list(shipArchiveLambdaQueryWrapper);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if(oConvertUtils.listIsNotEmpty(baseShipArchiveList)){
 | 
	
		
			
				|  |  | +                        imo = baseShipArchiveList.stream().map(BaseShipArchive::getImo).distinct().collect(Collectors.joining());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                saleDelivery.setShipName(shipname);
 | 
	
		
			
				|  |  | +                saleDelivery.setImo(imo);
 | 
	
		
			
				|  |  | +                // 项目名称
 | 
	
		
			
				|  |  | +                if (saleDelivery.getProject() != null){
 | 
	
		
			
				|  |  | +                    BaseProjectArchive projectArchive = baseProjectArchiveService.getById(saleDelivery.getProject());
 | 
	
		
			
				|  |  | +                    if (projectArchive != null){
 | 
	
		
			
				|  |  | +                        saleDelivery.setContactsNo(projectArchive.getName());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if(deliveryDetailsList.size() > 0){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    saleDelivery.setQualityGrade(deliveryDetailsList.get(0).getQualityGrade());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //
 | 
	
		
			
				|  |  | +                saleDelivery.setBillDateText(DateUtils.date2Str(saleDelivery.getDeliveryDate(), DateUtils.date_sdf.get()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 制单人信息
 | 
	
		
			
				|  |  | +                SysUser sysUser = sysUserService.getUserByName(saleDelivery.getCreateBy());
 | 
	
		
			
				|  |  | +                saleDelivery.setSalesPhone(sysUser.getPhone());
 | 
	
		
			
				|  |  | +                saleDelivery.setSalesEmail(sysUser.getEmail());
 | 
	
		
			
				|  |  | +                // 组合填充时,因为多组填充的数据量不确定,需要在多组填充完之后另起一行
 | 
	
		
			
				|  |  | +                FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(Boolean.TRUE).build();
 | 
	
		
			
				|  |  | +                excelWriter.fill(new FillWrapper(deliveryDetailsList), fillConfig, writeSheet);
 | 
	
		
			
				|  |  | +                excelWriter.fill(saleDelivery, writeSheet);
 | 
	
		
			
				|  |  | +                excelWriter.finish();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            } catch (Exception ex) {
 | 
	
		
			
				|  |  | +                ex.printStackTrace();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 这是ExcelUtil.getOutputStream
 | 
	
		
			
				|  |  | +     * 这里就是将文件下载交给了浏览器
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
 | 
	
		
			
				|  |  | +        // 这里文件名如果涉及中文一定要使用URL编码,否则会乱码
 | 
	
		
			
				|  |  | +        String exportFileName = URLEncoder.encode(fileName + ExcelTypeEnum.XLSX.getValue(), StandardCharsets.UTF_8.toString());
 | 
	
		
			
				|  |  | +        response.setContentType("application/force-download");
 | 
	
		
			
				|  |  | +        response.setHeader("Content-Disposition", "attachment;filename=" + exportFileName);
 | 
	
		
			
				|  |  | +        return response.getOutputStream();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |