郑永安
2023-06-19 2fcd97552d16718cc7997629fd637a73a5a4483f
src/main/java/com/gk/firework/Service/ServiceImpl/SaleOrderDetailServiceImpl.java
对比新文件
@@ -0,0 +1,615 @@
package com.gk.firework.Service.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gk.firework.Domain.*;
import com.gk.firework.Domain.Exception.BusinessException;
import com.gk.firework.Domain.Utils.PageInfo;
import com.gk.firework.Domain.Utils.StringUtils;
import com.gk.firework.Domain.Vo.*;
import com.gk.firework.Mapper.SaleOrderDetailInfoMapper;
import com.gk.firework.Service.*;
import com.spire.doc.interfaces.IField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
 * @author : jingjy
 * @date : 2021/3/30 17:34
 */
@Service("SaleOrderDetailService")
public class SaleOrderDetailServiceImpl extends ServiceImpl<SaleOrderDetailInfoMapper, SaleOrderDetailInfo> implements SaleOrderDetailService {
    @Autowired
    SaleOrderDetailInfoMapper saleOrderDetailInfoMapper;
    @Autowired
    SaleOrderService saleOrderService;
    @Autowired
    EnterpriseService enterpriseService;
    @Autowired
    ProductService productService;
    @Autowired
    private EntryDetailService entryDetailService;
    @Autowired
    private EntryService entryService;
    @Autowired
    private StockService stockService;
    @Autowired
    UserService userService;
    @Autowired
    DistrictService districtService;
    @Override
    public void selectByCustomId(PageInfo pageInfo) {
        Page<SaleDetailVo> page = new Page<>(pageInfo.getPageIndex(), pageInfo.getPageSize());
        List<OrderItem> orderItems = new ArrayList<>();
        OrderItem orderItem = new OrderItem();
        if (StringUtils.isNotBlank(pageInfo.getSort()) && StringUtils.isNotBlank(pageInfo.getOrder())) {
            orderItem.setAsc(pageInfo.getOrder().equalsIgnoreCase("ascending"));
            orderItem.setColumn(pageInfo.getSort());
        }else {
            orderItem.setAsc(false);
            orderItem.setColumn("createdat");
        }
        orderItems.add(orderItem);
        page.setOrders(orderItems);
        List<SaleDetailVo> list = saleOrderDetailInfoMapper.selectByCustomId(page,pageInfo.getCondition());
        pageInfo.setResult(list);
        pageInfo.setTotalCount(page.getTotal());
    }
    /**
     * @Description: 近n天销售数据统计
     * @date 2021/4/16 16:21
     */
    @Override
    public List<Map> getSaleDataInDays(Integer days) {
        Date startTime = moveForwardDays(days);
        int[] index = new int[days];
        for (int i = 0; i < days; i++) {
            index[i] = i + 1;
        }
        return saleOrderDetailInfoMapper.getSaleDataInDays(startTime,null,index);
    }
    /**
     * @Description: 销售数量按地区统计 n天 默认90
     * @date 2021/4/16 16:21
     */
    @Override
    public List<Map> getSaleDataAreaInDays(Integer days) {
        Date startTime = moveForwardDays(days);
        Map<String, Object> params = new HashMap<>();
        params.put("province", "新疆维吾尔自治区");
        return saleOrderDetailInfoMapper.getSaleDataAreaInDays(startTime,null,params);
    }
    /**
     * @Description: 销售数量按品种统计 n天 默认90
     * @date 2021/4/16 17:03
     */
    @Override
    public List<Map> getSaleDataProductTypeInDays(Integer days) {
        Date startTime = moveForwardDays(days);
        return saleOrderDetailInfoMapper.getSaleDataProductTypeInDays(startTime,null);
    }
    /**
    * @Description: 销售量同年对比
    * @date 2021/4/22 15:13
    */
    @Override
    public Map getSaleDataCompareInYear(String province, String city) {
        //今年数据
        Calendar cal = Calendar.getInstance();
        int thisYear = cal.get(Calendar.YEAR);
        List<Map> thisYearData = this.getSaleDataInYear(province, city, thisYear);
        //去年数据
        cal.add(Calendar.YEAR, -1);
        int lastYear = cal.get(Calendar.YEAR);
        List<Map> lastYearData = this.getSaleDataInYear(province, city, lastYear);
        //生成结果
        Map<Object, Object> result = new HashMap<>();
        result.put(thisYear, thisYearData);
        result.put(lastYear, lastYearData);
        return result;
    }
    /**
    * @Description: 获取{xxxx}年的销售数据
    * @date 2021/4/22 15:50
    */
    @Override
    public List<Map> getSaleDataInYear(String province, String city, Integer year) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", province);
        params.put("city", city);
        params.put("year", year);
        return saleOrderDetailInfoMapper.getSaleDataInYear(params);
    }
    /**
    * @Description: 进货量同年对比
    * @date 2021/4/23 9:28
    */
    @Override
    public Map getInboundCompareInYear(String province, String city) {
        //今年数据
        Calendar cal = Calendar.getInstance();
        int thisYear = cal.get(Calendar.YEAR);
        List<Map> thisYearData = this.getInboundInYear(province, city, thisYear);
        //去年数据
        cal.add(Calendar.YEAR, -1);
        int lastYear = cal.get(Calendar.YEAR);
        List<Map> lastYearData = this.getInboundInYear(province, city, lastYear);
        //生成结果
        Map<Object, Object> result = new HashMap<>();
        result.put(thisYear, thisYearData);
        result.put(lastYear, lastYearData);
        return result;
    }
    /**
    * @Description: 获取{xxxx}年的进货量
    * @date 2021/4/23 9:31
    */
    @Override
    public List<Map> getInboundInYear(String province, String city, Integer year) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", province);
        params.put("city", city);
        params.put("year", year);
        return saleOrderDetailInfoMapper.getInboundInYear(params);
    }
    @Override
    public List<SaleOrderDetailInfo> selectByOrderCode(String code) {
        LambdaQueryWrapper<SaleOrderDetailInfo>wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SaleOrderDetailInfo::getOrdercode,code);
        return saleOrderDetailInfoMapper.selectList(wrapper);
    }
    /**
     * @Description: 标题数据 (零售店数量 今日销售数量 今年销售总量 今年购买人次)
     * @date 2021/4/25 9:44
     */
    @Override
    public Map getTitleData() {
        //1.零售店数量
        int saleShopNum = enterpriseService.getSaleNum();
        //2.今日销售数量
        int thisDaySaleNum = saleOrderDetailInfoMapper.getSaleNumThisDay();
        //3.今年销售数量
        int thisYearSaleNum = saleOrderDetailInfoMapper.getSaleNumThisYear();
        //今年购买人数
        int thisYearPurchasersNum = saleOrderDetailInfoMapper.getPurchasersNum();
        Map<String, Integer> result = new HashMap<>();
        result.put("saleShopNum", saleShopNum);
        result.put("thisDaySaleNum", thisDaySaleNum);
        result.put("thisYearSaleNum", thisYearSaleNum);
        result.put("thisYearPurchasersNum", thisYearPurchasersNum);
        return result;
    }
    @Override
    public IPage getCityInAndOut(Page<Map> page, Map filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("province", "新疆维吾尔自治区");
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<Map> list = saleOrderDetailInfoMapper.selectCityInAndOut(page, params);
        page.setRecords(list);
        return page;
    }
    @Override
    public IPage getGenderSale(Page<Map> page, Map filter, UserInfo userInfo) {
        Map<String, Object> params = new HashMap<>();
        //可视权限
        UserInfo user = userService.getById(userInfo.getId());
        if (user.getCompanynumber() != null) {
            params.put("enterprisenumber", user.getCompanynumber());
        }else {
            if (StringUtils.isNotBlank(user.getProvince())) {
                params.put("province", user.getProvince());
            }
            if (StringUtils.isNotBlank(user.getCity())) {
                params.put("city", user.getCity());
            }
            if (StringUtils.isNotBlank(user.getArea())) {
                params.put("district", user.getArea());
            }
            if (StringUtils.isNotBlank(user.getTown())) {
                params.put("street", user.getTown());
            }
            if (StringUtils.isNotBlank(user.getCommunity())) {
                params.put("committee", user.getCommunity());
            }
        }
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("producttype", filter.get("producttype"));
        params.put("secondarytype", filter.get("secondarytype"));
        params.put("productname", filter.get("productname"));
        params.put("provinceFilter", filter.get("province"));
        params.put("cityFilter", filter.get("city"));
        params.put("districtFilter", filter.get("district"));
        params.put("streetFilter", filter.get("street"));
        params.put("committeeFilter", filter.get("committee"));
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        List<Map> records =  saleOrderDetailInfoMapper.getGenderSale(page,params);
        return page.setRecords(records);
    }
    @Override
    public IPage getRaceSale(Page<Map> page, Map filter, UserInfo userInfo) {
        Map<String, Object> params = new HashMap<>();
        UserInfo user = userService.getById(userInfo.getId());
        {
            params.put("enterprisenumber", user.getCompanynumber());
            params.put("province", user.getProvince());
            params.put("city", user.getCity());
            params.put("district", user.getArea());
            params.put("street", user.getTown());
            params.put("committee", user.getCommunity());
        }
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("producttype", filter.get("producttype"));
        params.put("secondarytype", filter.get("secondarytype"));
        params.put("productname", filter.get("productname"));
        params.put("provinceFilter", filter.get("province"));
        params.put("cityFilter", filter.get("city"));
        params.put("districtFilter", filter.get("city"));
        params.put("streetFilter", filter.get("street"));
        params.put("committeeFilter", filter.get("committee"));
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        List<Map> records =  saleOrderDetailInfoMapper.getRaceSale(page,params);
        return page.setRecords(records);
    }
    @Override
    public List<Map> getGenerationSale(Map filter, UserInfo userInfo) {
        UserInfo user = userService.getById(userInfo.getId());
        String[] generations = {"0-20", "20-30", "30-40", "40-50", "50-60", "60-70", "70"};
        List<Map> table = new ArrayList<>();
        Map<String, Object> row = null;
        for (String generation : generations) {
            Integer head = null;
            Integer tail = null;
            String[] split = generation.split("-");
            head = Integer.valueOf(split[0]);
            if (split.length > 1) {
                tail = Integer.valueOf(split[1]);
            }
            int num = this.getSaleInfoByGeneration(head,tail,filter,user);
            row = new HashMap<>();
            row.put("generation", generation);
            row.put("num", num);
            table.add(row);
        }
        return table;
    }
    /**
    * @Description: 年龄段购买数量
    * @date 2021/5/15 17:05
    */
    @Override
    public int getSaleInfoByGeneration(Integer head, Integer tail, Map filter,UserInfo user) {
        Map<String, Object> params = new HashMap<>();
        {
            params.put("enterprisenumber", user.getCompanynumber());
            params.put("province", user.getProvince());
            params.put("city", user.getCity());
            params.put("district", user.getArea());
            params.put("street", user.getTown());
            params.put("committee", user.getCommunity());
        }
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("producttype", filter.get("producttype"));
        params.put("secondarytype", filter.get("secondarytype"));
        params.put("productname", filter.get("productname"));
        params.put("provinceFilter", filter.get("province"));
        params.put("cityFilter", filter.get("city"));
        params.put("districtFilter", filter.get("city"));
        params.put("streetFilter", filter.get("street"));
        params.put("committeeFilter", filter.get("committee"));
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        //年龄段头尾
        params.put("head", head);
        params.put("tail", tail);
        return saleOrderDetailInfoMapper.getSaleInfoByGeneration(params);
    }
    @Override
    public List<SaleDetailVo> getDetailList(String directionCode) {
        if (StringUtils.isBlank(directionCode)|| FireworkDeal.isNotDirectionCode(directionCode)) {
            throw new BusinessException("流向码不符合规则");
        }
        List<String>  codes= new ArrayList<>();
        //22位
        if (FireworkDeal.is22Characters(directionCode)){
            DirectionDetail directionDetail = FireworkDeal.dealDirectionCode(directionCode);
            List<ProductVo> productVos = new ArrayList<>();
            ProductVo productVo = productService.selectVoByDirection(directionCode);
            FireworkDeal.getProductVos(directionCode,directionDetail,directionDetail,productVos,productVo);
            if (productVos.size() > 0) {
                for (ProductVo product : productVos) {
                    codes.add(product.getDirectionCode());
                }
            }
        }else{
            //19位
            codes.add(directionCode);
        }
        if (codes.size() < 1) {
            throw new BusinessException("流向码有误");
        }
        //循环查询
        List<SaleDetailVo> details = new ArrayList<>();
        for (String code : codes) {
            SaleDetailVo saleDetailVo = saleOrderDetailInfoMapper.selectOneByDirectionCode(code);
            if (saleDetailVo != null) {
                details.add(saleDetailVo);
            }
        }
        return details;
    }
    @Override
    @Transactional
    public void returnAndStorage(String directionCodes, String userId, String auth) {
        if (StringUtils.isBlank(userId)) {
            throw new BusinessException("用户信息不能为空");
        }
        UserInfo userInfo = userService.getById(userId);
        if (userInfo == null) {
            throw new BusinessException("用户不存在");
        }
        List<String> directionCodeList = new ArrayList<>();
        if (FireworkDeal.is22Characters(directionCodes)){
            DirectionDetail directionDetail = FireworkDeal.dealDirectionCode(directionCodes);
            List<ProductVo> productVos = new ArrayList<>();
            ProductVo productVo = productService.selectVoByDirection(directionCodes);
            FireworkDeal.getProductVos(directionCodes,directionDetail,directionDetail,productVos,productVo);
            if (productVos.size() > 0) {
                for (ProductVo product : productVos) {
                    directionCodeList.add(product.getDirectionCode());
                }
            }
        }else{
            //19位
            directionCodeList.add(directionCodes);
        }
        if (directionCodeList.size() < 1) {
            throw new BusinessException("流向码有误");
        }
        for (String directionCode : directionCodeList) {
            if (StringUtils.isBlank(directionCode) || FireworkDeal.isNotDirectionCode(directionCode)) {
                throw new BusinessException("流向码不符合规则,退货失败!");
            }
            StockInfo stockInfo = stockService.selectStockByDirection(directionCode);
//        if (stockInfo == null || !stockInfo.getOwner().equals(customerInfo.getId().toString())) {
//            msg.setCode(ErrorCode.ERROR_CODE);
//            msg.setMessage("库存状态异常,退货失败!");
//            return msg;
//        }
            ProductInfo productInfo = productService.selectByDirection(directionCode.substring(0, 10));
            // 创建入库单,type为2,创建入库明细,修改stock
            EntryOrderInfo entryOrderInfo = entryService.generateEntryOrderInfo(EntryUtils.TH_ENTRY, userInfo, new Date(), "", auth);
            EntryDetailInfo entryDetailInfo = new EntryDetailInfo(entryOrderInfo.getCode(), directionCode, productInfo.getDirectionCode(),
                    productInfo.getName(), productInfo.getManufacturer(), new Date(),userInfo.getCompanynumber());
            entryOrderInfo.setNum(1);
            entryDetailInfo.setNum(1);
            //查找未退货的商品记录
            SaleOrderDetailInfo detailInfo = saleOrderService.selectOrderByDirectionReturnflag(directionCode,(byte) 0, null);
            if (detailInfo == null) {
                throw new BusinessException("条码:" + directionCode + ",已退货入库或者记录不存在");
            }
            Byte flag = 1;
            detailInfo.setReturnflag(flag);
            this.updateById(detailInfo);
            int i = stockService.doReturn(stockInfo,userInfo,null, new Date());
            if (i != 1){
                throw new BusinessException("更新失败");
            }else {
                entryService.save(entryOrderInfo);
                entryDetailService.save(entryDetailInfo);
            }
        }
    }
    @Override
    public IPage selectSaleNumInfo(Page<SaleNumVo> page, Map<String, Object> filter, UserInfo user) {
        List<SaleNumVo> records = saleOrderDetailInfoMapper.selectSaleNumInfo(page, filter);
        page.setRecords(records);
        return page;
    }
    @Override
    public IPage selectSaleNumInfoDetail(Page<SaleOrderDetailInfo> page, Map<String, Object> filter, UserInfo user) {
        List<SaleOrderDetailInfo> records = saleOrderDetailInfoMapper.selectSaleNumInfoDetail(page, filter);
        page.setRecords(records);
        return page;
    }
    @Override
    public IPage getCityInAndOutDetail(Page<Map> page, Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("province", "新疆维吾尔自治区");
        params.put("city", filter.get("city"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<Map> list = saleOrderDetailInfoMapper.selectCityInAndOutDetail(page, params);
        return page.setRecords(list);
    }
    @Override
    public List<Map> getCityInAndOutExport(Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("province", "新疆维吾尔自治区");
        params.put("safetysupervision", filter.get("safetysupervision"));
        return saleOrderDetailInfoMapper.selectCityInAndOut(params);
    }
    @Override
    public IPage selectCityTypeSale(Page<Map> page, Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", "新疆维吾尔自治区");
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<String> list = productService.selectTypes();
        List<Map> res =  saleOrderDetailInfoMapper.selectCityTypeSale(page,params,list);
        Map totalRow = saleOrderDetailInfoMapper.selectAllType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return page.setRecords(result);
    }
    @Override
    public List<Map> selectCityTypeSaleExport(Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", "新疆维吾尔自治区");
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<String> list = productService.selectTypes();
        List<Map> res = saleOrderDetailInfoMapper.selectCityTypeSale(params, list);
        Map totalRow = saleOrderDetailInfoMapper.selectAllType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return result;
    }
    @Override
    public IPage selectEnterpriseTypeSale(Page<Map> page, Map<String, Object> filter, UserInfo user) {
        Map<String, Object> params = new HashMap<>();
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        params.put("province", filter.get("province"));
        params.put("city", filter.get("city"));
        params.put("district", filter.get("district"));
        List<String> list = productService.selectTypes();
        List<Map> res =  saleOrderDetailInfoMapper.selectEnterpriseTypeSale(page,params,list);
        //合计行
        Map totalRow = saleOrderDetailInfoMapper.selectAllType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return page.setRecords(result);
    }
    @Override
    public List<Map> selectExportEnterpriseTypeSale(Map<String, Object> filter, UserInfo user) {
        Map<String, Object> params = new HashMap<>();
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        params.put("province", filter.get("province"));
        params.put("city", filter.get("city"));
        params.put("district", filter.get("district"));
        List<String> list = productService.selectTypes();
        List<Map> res =  saleOrderDetailInfoMapper.selectEnterpriseTypeSale(params,list);
        //合计行
        Map totalRow = saleOrderDetailInfoMapper.selectAllType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return result;
    }
    private Date moveForwardDays(Integer days) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());
        //当前日期往前推days天
        calendar.add(Calendar.DATE, -days);
        return calendar.getTime();
    }
    @Override
    public IPage selectDistrictTypeSale(Page<Map> page, Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", "新疆维吾尔自治区");
        params.put("city", filter.get("city"));
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<String> list = productService.selectTypes();
        List<Map> res =  saleOrderDetailInfoMapper.selectDistrictTypeSale(page,params,list);
        Map totalRow = saleOrderDetailInfoMapper.selectAllDistrictType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return page.setRecords(result);
    }
    @Override
    public List<Map> selectDistrictTypeSaleExport(Map<String, Object> filter) {
        Map<String, Object> params = new HashMap<>();
        params.put("province", "新疆维吾尔自治区");
        params.put("city", filter.get("city"));
        params.put("starttime", filter.get("starttime"));
        params.put("endtime", filter.get("endtime"));
        params.put("enterprisename", filter.get("enterprisename"));
        params.put("safetysupervision", filter.get("safetysupervision"));
        List<String> list = productService.selectTypes();
        List<Map> res = saleOrderDetailInfoMapper.selectDistrictTypeSale(params, list);
        Map totalRow = saleOrderDetailInfoMapper.selectAllDistrictType(list, params);
        ArrayList<Map> result = new ArrayList<>(res);
        result.add(totalRow);
        return result;
    }
    @Override
    public void saveBatchOrderDetailInfo(List<SaleOrderDetailInfo> detailInfoList) {
        if (detailInfoList == null || detailInfoList.size() == 0) {
            throw new BusinessException("系统参数为空");
        }
        int i = saleOrderDetailInfoMapper.saveBatchOrderDetailInfo(detailInfoList);
    }
}