zouyu
2023-09-27 75b2904fbaf4fab6a9fb3baf065d2c927cc7a7a2
inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java
@@ -1,26 +1,39 @@
package com.yuanchu.mom.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.yuanchu.mom.Task.SyncOrder;
import com.yuanchu.mom.mapper.SaleMapper;
import com.yuanchu.mom.mapper.SaleMaterialMapper;
import com.yuanchu.mom.pojo.Sale;
import com.yuanchu.mom.mapper.SaleMapper;
import com.yuanchu.mom.pojo.SaleMaterial;
import com.yuanchu.mom.pojo.dto.ConsignmentDto1;
import com.yuanchu.mom.pojo.dto.ConsignmentDto2;
import com.yuanchu.mom.pojo.dto.SaleDto;
import com.yuanchu.mom.pojo.dto.SaleMaterialDto;
import com.yuanchu.mom.pojo.dto.*;
import com.yuanchu.mom.pojo.vo.SaleVo;
import com.yuanchu.mom.service.SaleMaterialService;
import com.yuanchu.mom.service.SaleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.utils.easyexcel.CustemHandler;
import com.yuanchu.mom.utils.easyexcel.EasyExcelUtils;
import com.yuanchu.mom.utils.easyexcel.converter.LocalDateConverter;
import com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -38,6 +51,9 @@
    SaleMapper saleMapper;
    @Resource
    SaleMaterialService saleMaterialService;
    @Resource
    SaleMaterialMapper saleMaterialMapper;
    //查询销售单列表
@@ -48,10 +64,12 @@
    //新增销售单
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String addSale(String saleman, SaleDto saleDto) {
        Sale sale = new Sale();
        BeanUtils.copyProperties(saleDto, sale);
        sale.setSaleman(saleman);
        sale.setOrderType("手工订单");
        saleMapper.insert(sale);
        //添加销售产品单
        List<SaleMaterialDto> saleMaterialDtoList = saleDto.getSaleMaterialList();
@@ -82,6 +100,7 @@
    //根据销售单id删除
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delSale(Integer id) {
        Sale sale = saleMapper.selectById(id);
        sale.setState(0);
@@ -95,22 +114,30 @@
    //根据id批量删除
    @Override
    public void delAllSale(List<Integer> ids) {
        List<Sale> sales = saleMapper.selectBatchIds(ids);
        for (Sale sale : sales) {
            sale.setState(0);
            saleMapper.updateById(sale);
            List<SaleMaterial> saleMaterials = saleMaterialMapper.selectSaleDatil(sale.getId());
            for (SaleMaterial saleMaterial : saleMaterials) {
                saleMaterial.setState(0);
                saleMaterialMapper.updateById(saleMaterial);
            }
        }
    @Transactional(rollbackFor = Exception.class)
    public void delAllSale(String ids) {
        //批量删除销售单
        saleMapper.delAllSale(ids);
        //批量删除销售产品单
        saleMaterialMapper.delAllSale(ids);
    }
    //根据销售单id修改信息
    @Override
    public void updateSaleById(String saleman, Integer id, SaleVo saleVo) {
    @Transactional(rollbackFor = Exception.class)
    public String updateSaleById(String saleman, Integer id, SaleVo saleVo) {
        //校验,同一个产品的规格型号不能相同
        List<SaleMaterialDto> saleMaterialList = saleVo.getSaleMaterialList();
        // 使用哈希集合来判断是否存在相同字段值组合
        Set<String> seen = new HashSet<>();
        for (SaleMaterialDto saleMaterial : saleMaterialList) {
            String key = saleMaterial.getName() + "," + saleMaterial.getSpecifications();
            if (seen.contains(key)) {
                return "同一个产品的规格型号不能相同";
            } else {
                seen.add(key);
            }
        }
        Sale sale = saleMapper.selectById(id);
        sale.setSaleman(saleman);
        BeanUtils.copyProperties(saleVo, sale);
@@ -119,13 +146,15 @@
        List<SaleMaterialDto> saleMaterialDtos = saleVo.getSaleMaterialList();
        for (SaleMaterialDto saleMaterialDto : saleMaterialDtos) {
            SaleMaterial saleMaterial = new SaleMaterial();
            BeanUtils.copyProperties(saleMaterialDto,saleMaterial);
            BeanUtils.copyProperties(saleMaterialDto, saleMaterial);
            saleMaterialMapper.updateById(saleMaterial);
        }
        return "修改成功!";
    }
    //审核
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void check(String checkname, Integer id, Integer type) {
        Sale sale = saleMapper.selectById(id);
        sale.setType(type);
@@ -164,11 +193,101 @@
                .orderCode(orderNumber)
                .customerCode(sale.getCode())
                .proname(sale.getProname())
                .adress(sale.getAdress())
                .username(sale.getUsername())
                .phone(sale.getPhone())
                .messages(dto2List)
                .build();
        return consignmentDto1;
    }
    //同步销售数据
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String synchronization() {
        //当天时间的凌晨4点开始同步
        String pattern = "yyyy-MM-dd HH:mm:ss";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        String dateTime = LocalDateTime.now().with(LocalTime.of(4, 0, 0)).format(formatter);
        //获取主销售数据
        List<Map<String, Object>> order = SyncOrder.getMainOrder(dateTime);
        List<Sale> list = order.stream().map(orde -> {
            Sale sale = new Sale();
            sale.setOrderNumber(orde.get("orderNo").toString());//订单编号
            sale.setCode(String.valueOf(orde.get("customerContractNumber")));//客户合同编号
            sale.setName(orde.get("projectName").toString());//工程名称
            sale.setProname(orde.get("customerName").toString());//客户名称
            sale.setOrderName(orde.get("createdName").toString());//下单人
            sale.setSaleman(orde.get("salesmanName").toString());//业务员
            sale.setDelTime(DateUtil.parseDate(orde.get("wantedDeliveryDate").toString()));//交货日期
            sale.setCreateTime(DateUtil.parseDate(orde.get("orderDate").toString()));//下单日期
            sale.setNote(String.valueOf(orde.get("comment")));//备注
            sale.setOrderId((Integer) orde.get("id"));  //otc订单id
            sale.setOrderType(orde.get("orderClassification").toString()); //订单类型
            return sale;
        }).collect(Collectors.toList());
        //去重
        list.removeIf(sale -> ObjectUtils.isNotEmpty(saleMapper.selectOne(Wrappers.<Sale>query().eq("order_number", sale.getOrderNumber()))));
        this.saveBatch(list);
        for (Sale sale : list) {
            List<Map<String, Object>> innerOrder = SyncOrder.getInnerOrder(dateTime, sale.getOrderNumber());
            List<SaleMaterial> saleMaterials = innerOrder.stream().map(inorder -> {
                SaleMaterial saleMaterial = new SaleMaterial();
                saleMaterial.setName(inorder.get("productName").toString()); //产品名称
                saleMaterial.setSpecifications(inorder.get("specificationModel").toString()); //产品规格型号
                saleMaterial.setUnit(inorder.get("unit").toString());   //单位
                saleMaterial.setNumber((int) Double.parseDouble(inorder.get("quantity").toString()));  //数量
                saleMaterial.setPrice(inorder.get("unitPriceInclTax").toString());  //单价
                saleMaterial.setSaleId(sale.getId());  //关联 销售单id
                saleMaterial.setAdress(String.valueOf(inorder.get("shippingAddress")));  //收货地址
                saleMaterial.setUsername(String.valueOf(inorder.get("receivingContact")));  //联系人
                saleMaterial.setPhone(String.valueOf(inorder.get("receivingContactPhone")));  //手机号
                return saleMaterial;
            }).collect(Collectors.toList());
            saleMaterialService.saveBatch(saleMaterials);
        }
        return "同步成功!";
    }
    //下载附件
    @Override
    public List<String> download(Integer id) {
        Integer orderId = saleMapper.selectById(id).getOrderId();
        List<Map<String, Object>> attachment = SyncOrder.getAttachmentByOrderId(orderId);
        List<String> list = new ArrayList<>();
        if (ObjectUtils.isEmpty(attachment)) {
            list.add("该订单没有附件");
            return list;
        }
        for (Map<String, Object> attch : attachment) {
            String path = attch.get("path").toString();
            list.add(path);
        }
        return list;
    }
    @Override
    public void exportSale(ExportSaleDto dto, HttpServletResponse response) {
        try{
            List<ExportSaleTemplate> exportSaleTemplates = saleMapper.selectSaleListByExport(dto.getOrderNumber(), dto.getName(), dto.getType(), dto.getDelTime());
            for (int i = 0; i < exportSaleTemplates.size(); i++) {
                exportSaleTemplates.get(i).setId(i+1);
            }
            EasyExcel.write(EasyExcelUtils.getResponse(response,"销售订单").getOutputStream())
                    .head(ExportSaleTemplate.class)
                    .registerConverter(new LocalDateConverter())
                    .autoCloseStream(true)
                    .excelType(ExcelTypeEnum.XLS)
                    .registerWriteHandler(new CustemHandler())
                    .registerWriteHandler(EasyExcelUtils.getStyleStrategy())
                    .sheet("Sheet1")
                    .doWrite(exportSaleTemplates);
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                response.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}