package com.szwl.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.szwl.constant.ConfigConsts; import com.szwl.exception.MyException; import com.szwl.feign.SzwlFeign; import com.szwl.model.bean.ChartBean; import com.szwl.model.bean.ChartColumn; import com.szwl.model.bean.OrderDaoChuDTO; import com.szwl.model.bo.ChartType; import com.szwl.model.bo.R; import com.szwl.model.dto.OrderDto; import com.szwl.model.entity.TAdmin; import com.szwl.model.entity.TAdminEquipment; import com.szwl.model.entity.TEquipment; import com.szwl.model.entity.TOrder; import com.szwl.mapper.TOrderMapper; import com.szwl.model.excel.NewOrderTarget; import com.szwl.model.excel.OrderTarget; import com.szwl.model.query.OrderDaoChuParam; import com.szwl.model.query.OrderStatisticsDTO; import com.szwl.model.query.StatisticsParam; import com.szwl.model.utils.DateUtils; import com.szwl.service.TOrderService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.szwl.util.YunPianSms; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** *

* 服务实现类 *

* * @author wuhs * @since 2022-06-14 */ @Service public class TOrderServiceImpl extends ServiceImpl implements TOrderService { @Resource TOrderMapper tOrderMapper; @Autowired SzwlFeign szwlFeign; private static final String appid = "07784f5fedb508046c841b391005b7de"; //首页统计 @Override public ChartColumn getStatistics(StatisticsParam param) { List list = new ArrayList<>(); String msg = ""; SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //使用SimpleDateFormat的parse()方法生成Date Date start = sf.parse(param.getStartDate()); Date end = sf.parse(param.getEndDate()); SimpleDateFormat endsf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); param.setStartDate(endsf.format(start)); param.setEndDate(endsf.format(end)); } catch (ParseException e) { e.printStackTrace(); } if (ChartType.day.toString().equals(param.getChartType())) { list = tOrderMapper.getDayStatistics(param); msg = "日统计"; } if (ChartType.week.toString().equals(param.getChartType())) { list = tOrderMapper.getWeekStatistics(param); msg = "周统计"; } if (ChartType.month.toString().equals(param.getChartType())) { list = tOrderMapper.getMonthStatistics(param); msg = "月统计"; } if (ChartType.year.toString().equals(param.getChartType())) { list = tOrderMapper.getYearStatistics(param); msg = "年统计"; } // if (CollectionUtils.isEmpty(list)) { // throw new MyException("获取" + msg + "数据为空"); // } ChartColumn chartColumn = new ChartColumn(list); return chartColumn; } //机器排行统计 @Override public ChartColumn getEquipmentStatistics(StatisticsParam param) { List list = new ArrayList<>(); String msg = ""; if (ChartType.day.toString().equals(param.getChartType())) { msg = "日统计"; } if (ChartType.week.toString().equals(param.getChartType())) { msg = "周统计"; } if (ChartType.month.toString().equals(param.getChartType())) { msg = "月统计"; } if (ChartType.year.toString().equals(param.getChartType())) { msg = "年统计"; } if("1".equals(param.getChangeType())){ // 花型统计 list = tOrderMapper.getProductNameStatistics(param); }else{ list = tOrderMapper.getEquipmentStatistics(param); if(list.size()>0){ for(ChartBean chartBean:list){ String categorie = chartBean.getCategorie(); TEquipment tEquipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId())); if(StringUtils.isNotEmpty(tEquipment.getName())){ chartBean.setCategorie(tEquipment.getName()); }else { chartBean.setCategorie(categorie.substring(categorie.length()-6,categorie.length())); } } } } if (CollectionUtils.isEmpty(list)) { throw new MyException("获取" + msg + "数据为空"); } ChartColumn chartColumn = new ChartColumn(list); return chartColumn; } @Override public List orderDaoChu(String begin, String end, Long adminId, String clientId, String type, String companyType, long current, long size) { OrderDaoChuParam daoChuParam = new OrderDaoChuParam(); daoChuParam.setAdminId(adminId); daoChuParam.setBegin(begin); daoChuParam.setEnd(end); daoChuParam.setClientId(clientId); daoChuParam.setType(type); daoChuParam.setCurrent(current-1); daoChuParam.setSize(size); daoChuParam.setCompanyType(companyType); return tOrderMapper.getOrderDaoCu(daoChuParam); } @Override public List findById(TAdmin admin, List list) throws ParseException { List list1 = new ArrayList<>(); for (TOrder order : list) { if(!order.getProductName().equals("优惠码")){ OrderTarget orderTarget = new OrderTarget(); orderTarget.setSn(order.getSn()); orderTarget.setProductName(order.getProductName()); if(order.getRefundAmount() != null) { orderTarget.setPrice(order.getPrice().subtract(order.getRefundAmount()).setScale(2)); } else { orderTarget.setPrice(order.getPrice()); } orderTarget.setClientId(order.getClientId()); orderTarget.setName(admin.getUsername()); // 格式化时间 if(order.getPayDate()!=null) { String formatPayDate = DateUtils.formatDate(order.getPayDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss); orderTarget.setPayDate(formatPayDate); } if(order.getRefundDate()!=null) { String formatRefundDate = DateUtils.formatDate(order.getRefundDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss); orderTarget.setRefundDate(formatRefundDate); } Integer status = order.getStatus(); if (status == 0) { orderTarget.setStatus("未支付"); } else if (status == 1) { orderTarget.setStatus("已支付"); } else if (status == 3) { orderTarget.setStatus("已退款"); } else { orderTarget.setStatus(String.valueOf(status)); } if (order.getAgencyProportion()!=null) { orderTarget.setAgencyProportion(String.valueOf(order.getAgencyProportion())); } if (order.getMerchantProportion()!=null) { orderTarget.setMerchantProportion(String.valueOf(order.getMerchantProportion())); } if (order.getPersonageProportion()!=null) { orderTarget.setPersonageProportion(String.valueOf(order.getPersonageProportion())); } if ("WEIXIN_NATIVE".equals(order.getFrpCode())) { orderTarget.setFrp_code("微信主扫支付"); } else if("ALIPAY_NATIVE".equals(order.getFrpCode())){ orderTarget.setFrp_code("支付宝主扫支付"); }else if("WEIXIN_CARD".equals(order.getFrpCode())){ orderTarget.setFrp_code("微信被扫支付"); }else if("ALIPAY_CARD".equals(order.getFrpCode())){ orderTarget.setFrp_code("支付宝被扫支付"); }else { orderTarget.setFrp_code(order.getFrpCode()); } if(StringUtils.isEmpty(orderTarget.getFrp_code())){ orderTarget.setFrp_code(order.getFrpCode()); } list1.add(orderTarget); } } return list1; } @Override public List findByTime(String clientId, Date startTime, Date endTime, Integer unit) { return tOrderMapper.findByTime(clientId,startTime,endTime,unit); } @Override public String setMessage(Long id, String customerPhone) { TOrder order = tOrderMapper.selectById(id); if(order != null) { String companyType = order.getCompanyType(); String clientId = order.getClientId(); String sn = order.getSn(); TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId())); if (equipment == null) { return "设备不存在"; } String operationalPhone = equipment.getOperationalPhone(); String phone = null; //判断是否有机器运营者,作为短信接收通知人 if(!StringUtils.isEmpty(operationalPhone)){ //直接发送到机器运营者 phone = operationalPhone; }else{ //直接发送到账户拥有者手机 TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(equipment.getAdminId()))); if(admin != null){ if(!StringUtils.isEmpty(admin.getPhone())){ phone = admin.getPhone(); } } else { return "账户不存在"; } } if(!StringUtils.isEmpty(phone)){ //发短信 try { String price = String.valueOf(order.getPrice()); Date payDate = order.getPayDate(); String pattern = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); String paytime = simpleDateFormat.format(payDate); String clientId6 = clientId.substring(clientId.length() - 6); if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) { // 如果是七云科技的用户 YunPianSms.sendSms(appid, getScMessage(sn, price, paytime, equipment.getName(), clientId6, customerPhone), phone); } else { // 如果是申泽智能的用户 YunPianSms.sendSms(appid, getSzMessage(sn, price, paytime, equipment.getName(), clientId6, customerPhone), phone); } } catch (Exception e) { } } else { return "设备运营者手机号为空"; } } return ConfigConsts.SUCCESS; } @Override public List exportOrderData(TAdmin admin, List list) { List orderTargets = new ArrayList<>(); for (TOrder order : list) { if(!order.getProductName().equals("优惠码")){ NewOrderTarget orderTarget = new NewOrderTarget(); orderTarget.setSn(order.getSn()); orderTarget.setProductName(order.getProductName()); if(order.getRefundAmount() != null) { orderTarget.setPrice(order.getPrice().subtract(order.getRefundAmount()).setScale(2)); } else { orderTarget.setPrice(order.getPrice()); } orderTarget.setClientId(order.getClientId()); orderTarget.setName(admin.getUsername()); // 格式化时间 if(order.getPayDate()!=null) { String formatPayDate = DateUtils.formatDate(order.getPayDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss); orderTarget.setPayDate(formatPayDate); } if(order.getRefundDate()!=null) { String formatRefundDate = DateUtils.formatDate(order.getRefundDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss); orderTarget.setRefundDate(formatRefundDate); } Integer status = order.getStatus(); if (status == 0) { orderTarget.setStatus("未支付"); } else if (status == 1) { orderTarget.setStatus("已支付"); } else if (status == 3) { orderTarget.setStatus("已退款"); } else { orderTarget.setStatus(String.valueOf(status)); } if (order.getAgencyProportion()!=null) { orderTarget.setAgencyProportion(String.valueOf(order.getAgencyProportion())); } if (order.getMerchantProportion()!=null) { orderTarget.setMerchantProportion(String.valueOf(order.getMerchantProportion())); } if (order.getPersonageProportion()!=null) { orderTarget.setPersonageProportion(String.valueOf(order.getPersonageProportion())); } if ("WEIXIN_NATIVE".equals(order.getFrpCode())) { orderTarget.setFrp_code("微信主扫支付"); } else if("ALIPAY_NATIVE".equals(order.getFrpCode())){ orderTarget.setFrp_code("支付宝主扫支付"); }else if("WEIXIN_CARD".equals(order.getFrpCode())){ orderTarget.setFrp_code("微信被扫支付"); }else if("ALIPAY_CARD".equals(order.getFrpCode())){ orderTarget.setFrp_code("支付宝被扫支付"); }else { orderTarget.setFrp_code(order.getFrpCode()); } if(StringUtils.isEmpty(orderTarget.getFrp_code())){ orderTarget.setFrp_code(order.getFrpCode()); } orderTargets.add(orderTarget); } } return orderTargets; } @Override public void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException { //判断当前账号状态 TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(orderDto.getAdminId())); LambdaQueryWrapper query = Wrappers.lambdaQuery(); if (!orderDto.getUserName().equals("admin")) { if (StringUtils.isNotEmpty(orderDto.getUserName())) { TAdmin data = R.getDataIfSuccess(szwlFeign.getAdminByUsername(orderDto.getUserName())); if (data == null || data.getId() == null) { return; } if (data.getIsAdmined()) { query.eq(TOrder::getAdminId, data.getId()); } else { if (data.getParentId() != 1) { query.eq(TOrder::getAdminId, data.getParentId()); //查找子账户所管理的机器 TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(orderDto.getAdminId())); if (!adminEquipment.getType().equals("0")) { List list = R.getDataIfSuccess(szwlFeign.getClientIds(orderDto.getAdminId())); if (list == null || list.size() == 0) { return; } query.in(TOrder::getClientId, list); } } } } else { //adminType="all"时,代表查全部下级 子账户没有这个权限 公司人员默认查所有人 if (StringUtils.isNotEmpty(orderDto.getAdminType())) { if (admin.getIsAdmined() && admin.getType() > 1) { if (admin.getType() > 1) { if (orderDto.getAdminType().equals("all")) { //查找所有下级 List admidIdList = R.getDataIfSuccess(szwlFeign.getAdminIdList(orderDto.getAdminId())); query.in(TOrder::getAdminId, admidIdList); } } } else { if (admin.getType() > 1) { //登录账户为子账户 不查下级 只查对应机器的订单 TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId()))); if (adminEquipment.getType().equals("0")) { //全部机器 TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId()))); query.eq(TOrder::getAdminId, upAdmin.getId()); } else { String equipmentIds = adminEquipment.getEquipmentIds(); List equipmentIdList = JSON.parseArray(equipmentIds, String.class); query.in(TOrder::getClientId, equipmentIdList); } } } } else { //判断当前账号状态 公司还是商家 if (admin.getType() > 1) { //商家 判断是否子账户 if (admin.getIsAdmined()) { //商家自己 query.eq(TOrder::getAdminId, orderDto.getAdminId()); } else { //商家 子账户 //登录账户为子账户 不查下级 只查对应机器的订单 TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId()))); if (adminEquipment.getType().equals("0")) { //全部机器 TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId()))); query.eq(TOrder::getAdminId, upAdmin.getId()); } else { String equipmentIds = adminEquipment.getEquipmentIds(); List equipmentIdList = JSON.parseArray(equipmentIds, String.class); query.in(TOrder::getClientId, equipmentIdList); } } } } } } if (StringUtils.isNotEmpty(orderDto.getPayType())) { query.eq(TOrder::getFrpCode, orderDto.getPayType()); } if (StringUtils.isNotEmpty(orderDto.getClientId())) { TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(orderDto.getClientId())); //判断机器是否属于这个登陆账号 if (admin.getType() > 1) { //商家 if (equipment.getAdminId().toString().equals(admin.getId().toString())) { query.eq(TOrder::getEquipmentId, equipment.getId()); } } else { query.eq(TOrder::getEquipmentId, equipment.getId()); } } if (StringUtils.isNotEmpty(orderDto.getEquipmentId())) { query.eq(TOrder::getEquipmentId, orderDto.getEquipmentId()); } if (StringUtils.isNotEmpty(orderDto.getStatus())) { query.eq(TOrder::getStatus, orderDto.getStatus()); } if (StringUtils.isNotEmpty(orderDto.getDateType())) { if (orderDto.getDateType().equals("0")) { //创建时间 if (begin != null && end != null) { query.gt(TOrder::getCreateDate, begin); query.lt(TOrder::getCreateDate, end); } } if (orderDto.getDateType().equals("1")) { //退款时间 if (begin != null && end != null) { query.gt(TOrder::getRefundDate, begin); query.lt(TOrder::getRefundDate, end); } } } // 公司平台 // 申泽平台管理员 String companyType = orderDto.getCompanyType(); if (admin.getId() == 2738) { companyType = "0"; } // 七云平台管理员 if (admin.getId() == 2739) { companyType = "1"; } if (StringUtils.isNotEmpty(companyType)) { if (companyType.equals("0")) { String finalCompanyType = companyType; query.nested(q -> q.isNull(TOrder::getCompanyType).or() .eq(TOrder::getCompanyType, finalCompanyType)); } else { query.eq(TOrder::getCompanyType, companyType); } } String machineType = orderDto.getMachineType(); if (StringUtils.isNotEmpty(machineType)) { if (machineType.equals("0")) { query.nested(q -> q.isNull(TOrder::getMachineType).or() .eq(TOrder::getMachineType, machineType)); } else { query.eq(TOrder::getMachineType, machineType); } } // 查询总数 int pageSize = 1000; int total = count(query); // 总页数 int totalPages = (total + pageSize - 1) / pageSize; // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/octet-stream; charset=UTF-8"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 String fileName = URLEncoder.encode("订单记录-" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 创建ExcelWriter对象 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), NewOrderTarget.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); // 创建 Sheet 对象 WriteSheet writeSheet = EasyExcel.writerSheet(0, "订单").build(); // 创建 CountDownLatch 对象 CountDownLatch countDownLatch = new CountDownLatch(totalPages); // 创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(10); // 循环写入数据 for (int i = 1; i <= totalPages; i++) { int page = i; executorService.submit(() -> { try { Page orderPage = new Page<>(page, pageSize); Page pageList = page(orderPage, query); List list = pageList.getRecords(); // 写入数据 List orderTargetList = exportOrderData(admin, list); synchronized (excelWriter) { excelWriter.write(orderTargetList, writeSheet); } } catch (Exception e) { // 异常处理 e.printStackTrace(); } finally { // 计数器减一 countDownLatch.countDown(); } }); } // 等待所有线程执行完毕 try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 关闭 ExcelWriter 对象 excelWriter.finish(); // 关闭线程池 executorService.shutdown(); } private String getSzMessage(String sn, String price, String payTime,String equipmentName,String clientId,String customerPhone) { String message = ""; if(StringUtils.isNotEmpty(customerPhone)&&customerPhone.length()>3){ message = "【申泽智能】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:" +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+ ",价格:"+price+"元,订单支付时间:"+payTime+",消费者联系方式:"+customerPhone+ "。如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。"; }else { message = "【申泽智能】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:" +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+ ",价格:"+price+"元,订单支付时间:"+payTime+",该投诉消费者没有留联系方式,如需核实,请把你的联系方式反馈给我们,我们会把你的联系方式通知到消费者手上,让消费者联系您。" + "如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。"; } return message; } private String getScMessage(String sn, String price, String payTime,String equipmentName,String clientId,String customerPhone) { String message = ""; if(StringUtils.isNotEmpty(customerPhone)&&customerPhone.length()>3){ message = "【七云科技】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:" +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+ ",价格:"+price+"元,订单支付时间:"+payTime+",消费者联系方式:"+customerPhone+ "。如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。"; }else { message = "【七云科技】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:" +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+ ",价格:"+price+"元,订单支付时间:"+payTime+",该投诉消费者没有留联系方式,如需核实,请把你的联系方式反馈给我们,我们会把你的联系方式通知到消费者手上,让消费者联系您。" + "如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。"; } return message; } }