Browse Source

充值消费统计

yq 2 years ago
parent
commit
76e887934f

+ 24 - 0
src/main/java/com/usky/dxtop/controller/web/business/StaffController.java

@@ -9,6 +9,9 @@ import com.usky.dxtop.service.DeptService;
 import com.usky.dxtop.service.DreUserService;
 import com.usky.dxtop.service.StaffRadioService;
 import com.usky.dxtop.service.StaffService;
+import com.usky.dxtop.service.vo.ChargeAndDishVO;
+import com.usky.dxtop.service.vo.ChargeRequest;
+import com.usky.dxtop.service.vo.DishRequest;
 import com.usky.dxtop.service.vo.StaffRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -132,4 +135,25 @@ public class StaffController {
         return ApiResult.success();
     }
 
+    /**
+     * 充值和消费记录
+     * @param chargeRequest
+     * @return
+     */
+    @PostMapping("/getChargeDishVo")
+    public ApiResult<CommonPage<ChargeAndDishVO>> getChargeDishVo(@RequestBody ChargeRequest chargeRequest){
+        return ApiResult.success(staffService.collectByMonth(chargeRequest));
+    }
+
+
+    /**
+     * 导出充值和消费记录
+     * @param chargeRequest
+     * @return
+     */
+    @PostMapping("/exportChargeAndDish")
+    public ApiResult<String> exportChargeAndDish(@RequestBody ChargeRequest chargeRequest){
+        return ApiResult.success(staffService.exportChargeAndDish(chargeRequest));
+    }
+
 }

+ 1 - 1
src/main/java/com/usky/dxtop/framework/config/SecurityConfig.java

@@ -103,7 +103,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                         "/dxtop/staff/one","/dxtop/staff/cardBalance","/dxtop/charge/cordPage","/dxtop/charge","/dxtop/dish",
                         "/dxtop/staff","/offSendMessage","/offOpenId","/loginByCenter","/aliWeather","/dreMenu/**","/dreOrder/**",
                         "/dreOrderDetail/**","/system/config/configKey/**","/dreOrderNoticeLog/updateByUser","/dxtop/staff/page","/dreUser/page"
-                        ,"/loginBySa"
+                        ,"/loginBySa","/dxtop/staff/getChargeDishVo","/dxtop/staff/exportChargeAndDish"
                         ).permitAll()
                 .antMatchers(
                         HttpMethod.GET,

+ 6 - 0
src/main/java/com/usky/dxtop/mapper/StaffMapper.java

@@ -5,10 +5,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.dxtop.model.Staff;
+import com.usky.dxtop.service.vo.ChargeAndDishVO;
+import com.usky.dxtop.service.vo.ChargeRequest;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -39,4 +42,7 @@ public interface StaffMapper extends BaseMapper<Staff> {
     List<Staff> selectListByPhones(@Param("phoneList")List<String> phoneList);
 
 
+    Page<ChargeAndDishVO> selectCollectByMonth(IPage<ChargeAndDishVO> page,
+                                               @Param("cr") ChargeRequest chargeRequest);
+
 }

+ 14 - 0
src/main/java/com/usky/dxtop/service/StaffService.java

@@ -1,13 +1,18 @@
 package com.usky.dxtop.service;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+
 import com.usky.dxtop.common.core.page.CommonPage;
 import com.usky.dxtop.model.Staff;
+import com.usky.dxtop.service.vo.ChargeAndDishVO;
+import com.usky.dxtop.service.vo.ChargeRequest;
 import com.usky.dxtop.service.vo.StaffRequest;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -35,4 +40,13 @@ public interface StaffService extends IService<Staff> {
 
 
     List<Staff> selectStaffByPhoneList(List<String> phoneList);
+
+
+    CommonPage<ChargeAndDishVO> collectByMonth(ChargeRequest chargeRequest);
+
+
+    String exportChargeAndDish(ChargeRequest chargeRequest);
+
+
+
 }

+ 105 - 7
src/main/java/com/usky/dxtop/service/impl/StaffServiceImpl.java

@@ -1,33 +1,44 @@
 package com.usky.dxtop.service.impl;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.usky.dxtop.common.core.domain.model.LoginUser;
 import com.usky.dxtop.common.core.page.CommonPage;
 import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.common.utils.DateUtils;
+import com.usky.dxtop.common.utils.ExcelUtils;
+import com.usky.dxtop.common.utils.SecurityUtils;
 import com.usky.dxtop.common.utils.StringUtils;
 import com.usky.dxtop.common.utils.file.ImageUtils;
 import com.usky.dxtop.common.utils.sign.Base64;
 import com.usky.dxtop.mapper.StaffMapper;
-import com.usky.dxtop.model.MsgLog;
-import com.usky.dxtop.model.Staff;
+import com.usky.dxtop.model.*;
+import com.usky.dxtop.service.ISysAsyncTaskService;
 import com.usky.dxtop.service.MsgLogService;
 import com.usky.dxtop.service.StaffService;
+import com.usky.dxtop.service.SysFileService;
 import com.usky.dxtop.service.config.rabbitmq.RabbitmqUtils;
 import com.usky.dxtop.service.constant.MsgLogBusinessCode;
+import com.usky.dxtop.service.emun.AsyncResultType;
 import com.usky.dxtop.service.emun.RabbitmqBeenCode;
-import com.usky.dxtop.service.vo.StaffRequest;
+import com.usky.dxtop.service.vo.*;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -44,6 +55,12 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
     private MsgLogService msgLogService;
 
 
+    @Autowired
+    private ISysAsyncTaskService sysAsyncTaskService;
+
+    @Autowired
+    private SysFileService sysFileService;
+
     @Override
     public CommonPage<Staff> page(StaffRequest staffRequest) {
         IPage<Staff> page = new Page<>(staffRequest.getCurrent(), staffRequest.getSize());
@@ -157,4 +174,85 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
     public List<Staff> selectStaffByPhoneList(List<String> phoneList) {
         return baseMapper.selectListByPhones(phoneList);
     }
+
+    @Override
+    public CommonPage<ChargeAndDishVO> collectByMonth(ChargeRequest chargeRequest) {
+        IPage<ChargeAndDishVO> page = new Page<>(chargeRequest.getCurrent(), chargeRequest.getSize());
+        page = baseMapper.selectCollectByMonth(page,chargeRequest);
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+
+    }
+
+    @Override
+    public String exportChargeAndDish(ChargeRequest chargeRequest) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), "充值消费统计");
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((StaffServiceImpl) AopContext.currentProxy()).syncChargeAndDish(taskId,chargeRequest);
+        return String.valueOf(taskId);
+    }
+
+
+    @Async
+    public void syncChargeAndDish(Long taskId, ChargeRequest chargeRequest){
+        Workbook workbook = null;
+        try {
+            ExportParams params = new ExportParams(null, "充值消费统计");
+            workbook = ExcelExportUtil.exportBigExcel(params, ChargeAndDishVO.class,
+                    (o, i) -> {
+                        chargeRequest.setCurrent(i);
+                        chargeRequest.setSize(30);
+                        CommonPage<ChargeAndDishVO> page = this.collectByMonth(chargeRequest);
+                        return Collections.singletonList(page.getRecords());
+                    },null);
+            if (null != workbook) {
+                String fileName = String.format("%s.xls", "充值消费记录统计");
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderFile(multipartFile,taskId);
+            } else {
+                sysAsyncTaskService.sendResult(taskId, false, "表格数据为空", AsyncResultType.TEXT);
+            }
+        } catch (Exception e) {
+            log.error("导出文件失败", e);
+            sysAsyncTaskService.sendResult(taskId, false, "导出文件失败", AsyncResultType.TEXT);
+        } finally {
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    log.error("===export spec=== 关闭workbook失败", e);
+                }
+            }
+        }
+    }
+
+
+
+    public void uploadOrderFile(MultipartFile multipartFile, Long taskId){
+        List<MultipartFile> list = new ArrayList<>();
+        list.add(multipartFile);
+        String batchNo = sysFileService.generateBatchNo();
+        SysFile sysFile = new SysFile();
+        sysFile.setBatchNo(batchNo);
+        sysFile.setFiles(list);
+        sysFile.setUploadType(SysFileServiceImpl.FILE);
+        sysFile.setBusinessType("充值消费记录");
+        sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
+        List<SysFile> sysFileList = sysFileService.addFile(sysFile);
+        long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
+        if (count > 0) {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+            return;
+        }
+        List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
+        boolean active = sysFileService.active(batchNo,idList);
+        if (active) {
+            sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
+        } else {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+        }
+    }
 }

+ 49 - 0
src/main/java/com/usky/dxtop/service/vo/ChargeAndDishVO.java

@@ -0,0 +1,49 @@
+package com.usky.dxtop.service.vo;
+
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.usky.dxtop.service.StaffService;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ChargeAndDishVO {
+
+
+    /**
+     * 时间
+     */
+    @Excel(name = "时间", height = 6, width = 20)
+    private String creTime;
+    /**
+     * 用户名称
+     */
+    @Excel(name = "用户名称", height = 6, width = 20)
+    private String userName;
+    /**
+     * 部门
+     */
+    @Excel(name = "部门", height = 6, width = 20)
+    private String dept;
+    /**
+     * 手机号
+     */
+    @Excel(name = "手机号", height = 6, width = 20)
+    private String contacts;
+    /**
+     * 充值金额
+     */
+    @Excel(name = "充值金额", height = 6, width = 20)
+    private BigDecimal camt;
+    /**
+     * 消费金额
+     */
+    @Excel(name = "消费金额", height = 6, width = 20)
+    private BigDecimal damt;
+    /**
+     * 余额
+     */
+    @Excel(name = "余额", height = 6, width = 20)
+    private BigDecimal balance;
+}

+ 29 - 0
src/main/resources/mapper/StaffMapper.xml

@@ -68,5 +68,34 @@
             #{phone}
         </foreach>
     </select>
+    <select id="selectCollectByMonth" resultType="com.usky.dxtop.service.vo.ChargeAndDishVO">
+        SELECT a1.*,s.name as userName,s.dept as dept,s.contacts as contacts
+        FROM
+            staff as s
+                INNER JOIN
+            (SELECT DATE_FORMAT(creTime,'%Y-%m') as creTime,card,sum(camt) as camt,sum(damt) as damt,
+                    SUBSTRING_INDEX(group_concat(balance order by creTime desc),',',1) as balance
+             FROM
+                 (
+                     SELECT create_time as creTime,amt as camt,0 as damt,card ,balance
+                     FROM charge as c
+                     UNION all
+                     SELECT create_time as creTime,0 as camt,amt as damt,card,balance
+                     FROM dish as d
+                 ) as a
+        <where>
+            <if test="cr.startTime !=null and cr.endTime != null">
+                and a.creTime between #{cr.startTime} and #{cr.endTime}
+            </if>
+        </where>
+             GROUP BY DATE_FORMAT(creTime,'%Y-%m'),card) as a1
+            on s.card_id = a1.card
+        <where>
+            <if test="cr.nameOrPhone !=null">
+                and s.name like CONCAT('%',#{cr.nameOrPhone},'%')
+                or s.contacts like CONCAT('%',#{cr.nameOrPhone},'%')
+            </if>
+        </where>
+    </select>
 
 </mapper>