fanzherong_v 3 weeks ago
parent
commit
60586ac770

+ 6 - 0
snowy-admin-web/src/api/biz/consumptionRecordApi.js

@@ -52,6 +52,12 @@ export default {
 			responseType: 'blob'
 		})
 	},
+	//导出消费记录
+	exportConsumption(data){
+		return request('exportConsumption', data, 'get', {
+			responseType: 'blob'
+		})
+	},
 	warnPage(data){
 		return request('warnPage',data,'get')
 	}

+ 44 - 3
snowy-admin-web/src/views/biz/consumptionrecord/index.vue

@@ -3,8 +3,8 @@
 		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
 			<a-row :gutter="24">
 				<a-col :span="6">
-					<a-form-item label="会员姓名" name="userName">
-						<a-input v-model:value="searchFormState.userName" placeholder="会员姓名查询" allow-clear />
+					<a-form-item label="会员姓名" name="searchKey">
+						<a-input v-model:value="searchFormState.searchKey" placeholder="会员姓名或手机号查询" allow-clear />
 					</a-form-item>
 				</a-col>
 				<a-col :span="6">
@@ -66,6 +66,12 @@
 						<template #icon><plus-outlined /></template>
 						新增
 					</a-button>
+					<a-button @click="exportConsumption" v-if="hasPerm('consumptionExport')">
+						<template #icon>
+							<export-outlined/>
+						</template>
+						导出
+					</a-button>
 				</a-space>
 			</template>
 			<template #bodyCell="{ column, record,index }">
@@ -108,11 +114,16 @@
 	import consumptionRecordApi from '@/api/biz/consumptionRecordApi'
 	import tool from '@/utils/tool'
 	import bizOrgApi from '@/api/biz/bizOrgApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import downloadUtil from '@/utils/downloadUtil'
 
 	const tableRef = ref()
 	const formRef = ref()
 
 	const searchFormRef = ref()
+	const submitLoading = ref(false)
 	let searchFormState = reactive({})
 	// 查询区域显示更多控制
 	const advanced = ref(false)
@@ -215,7 +226,7 @@
 	}
 	const loadData = (parameter) => {
 		const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
-		// planTime范围查询条件重载
+		// 时间范围查询条件重载
 		if (searchFormParam.consumptionTime) {
 			searchFormParam.consumptionTimeBegin = searchFormParam.consumptionTime[0]
 			searchFormParam.consumptionTimeEnd = searchFormParam.consumptionTime[1]
@@ -225,6 +236,36 @@
 			return data
 		})
 	}
+
+	//导出
+	const exportConsumption = () => {
+		Modal.confirm({
+			title: '确定要导出记录吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
+				// 时间范围查询条件重载
+				if (searchFormParam.consumptionTime) {
+					searchFormParam.consumptionTimeBegin = searchFormParam.consumptionTime[0]
+					searchFormParam.consumptionTimeEnd = searchFormParam.consumptionTime[1]
+					delete searchFormParam.consumptionTime
+				}
+
+				consumptionRecordApi
+					.exportConsumption(Object.assign(searchFormParam))
+					.then((res) => {
+						downloadUtil.resultDownload(res)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
 	// 重置
 	const reset = () => {
 		searchFormRef.value.resetFields()

+ 11 - 0
snowy-admin-web/src/views/biz/recommendrecord/index.vue

@@ -7,6 +7,11 @@
 						<a-input v-model:value="searchFormState.searchKey" placeholder="请输入推荐人姓名或手机号" />
 					</a-form-item>
 				</a-col>
+				<a-col :span="6">
+					<a-form-item label="推荐时间:" name="recommendTime">
+						<a-range-picker v-model:value="searchFormState.recommendTime" value-format="YYYY-MM-DD" show-date />
+					</a-form-item>
+				</a-col>
 				<a-col :span="6">
 					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
 					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
@@ -75,6 +80,12 @@
 	]
 	const loadData = (parameter) => {
 		const searchFormParam = cloneDeep(searchFormState.value)
+		// planTime范围查询条件重载
+		if (searchFormParam.recommendTime) {
+			searchFormParam.recommendTimeBegin = searchFormParam.recommendTime[0]
+			searchFormParam.recommendTimeEnd = searchFormParam.recommendTime[1]
+			delete searchFormParam.recommendTime
+		}
 		return bizRecommendRecordApi.bizRecommendRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})

+ 10 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/controller/ConsumptionRecordController.java

@@ -226,6 +226,16 @@ public class ConsumptionRecordController {
         consumptionRecordService.exportRecord(consumptionRecordPageParam,response);
     }
 
+    /**
+     * 导出消费记录报表
+     */
+    @Operation(summary = "导出消费记录报表")
+    @SaCheckPermission("/biz/consumptionrecord/exportConsumption")
+    @GetMapping(value = "/biz/consumptionrecord/exportConsumption", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+    public void exportConsumption(ConsumptionRecordPageParam consumptionRecordPageParam, HttpServletResponse response) throws IOException {
+        consumptionRecordService.exportConsumption(consumptionRecordPageParam,response);
+    }
+
     /**
      * 预警记录
      * @param consumptionRecordPageParam

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/mapper/ConsumptionRecordMapper.java

@@ -34,6 +34,8 @@ import java.util.Map;
 public interface ConsumptionRecordMapper extends BaseMapper<ConsumptionRecord> {
     Page<ConsumptionRecord> getPageList(@Param("page") Page<ConsumptionRecord> page, @Param("ew") QueryWrapper<ConsumptionRecord> ew);
 
+    List<ConsumptionRecord> getPageList(@Param("ew") QueryWrapper<ConsumptionRecord> ew);
+
     Page<BizMemberUserResult> getWarnPageList(@Param("page") Page<ConsumptionRecord> page, @Param("ew") QueryWrapper<ConsumptionRecord> ew);
 
     ConsumptionResult getRecordTotal(@Param("ew") QueryWrapper<ConsumptionRecord> ew);

+ 63 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/param/ConsumptionExportResult.java

@@ -0,0 +1,63 @@
+package vip.xiaonuo.biz.modular.consumptionrecord.param;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class ConsumptionExportResult {
+    /** 会员姓名 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "会员姓名"})
+    private String userName;
+
+    /** 会员手机号*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "会员手机号"})
+    private String phone;
+
+    /**消费操作*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "消费操作"})
+    private String consumptionOperate;
+
+    /**原账户糕点*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "原账户糕点"})
+    private BigDecimal accountBalance;
+
+    /**原账户积分*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "原账户积分"})
+    private BigDecimal voucherBalance;
+
+    /**消费糕点或积分*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "消费糕点或积分"})
+    private BigDecimal consumptionMoney;
+
+    /**消费日期*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "消费日期"})
+    private Date consumptionTime;
+
+    /**消费门店*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "消费门店"})
+    private String orgName;
+
+    /**操作人*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "操作人"})
+    private String createUserName;
+
+    /** 说明 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"消费记录报表", "说明"})
+    private String consumptionRemark;
+}

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/service/ConsumptionRecordService.java

@@ -102,4 +102,6 @@ public interface ConsumptionRecordService extends IService<ConsumptionRecord> {
 
     void exportRecord(ConsumptionRecordPageParam consumptionRecordPageParam, HttpServletResponse response) throws IOException;
 
+    void exportConsumption(ConsumptionRecordPageParam consumptionRecordPageParam, HttpServletResponse response) throws IOException;
+
 }

+ 88 - 22
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/service/impl/ConsumptionRecordServiceImpl.java

@@ -22,6 +22,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fhs.trans.service.impl.TransService;
 import com.google.common.collect.Maps;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
@@ -29,6 +30,7 @@ import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.checkerframework.checker.units.qual.C;
+import org.jacoco.agent.rt.internal_43f5073.core.data.IncompatibleExecDataVersionException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
@@ -75,8 +77,34 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
     @Resource
     private DevConfigApi devConfigApi;
 
+    @Resource
+    private TransService transService;
+
     @Override
     public Page<ConsumptionRecord> page(ConsumptionRecordPageParam consumptionRecordPageParam) {
+        QueryWrapper<ConsumptionRecord> queryWrapper = getWrapper(consumptionRecordPageParam);
+        Page<ConsumptionRecord> pageList = this.getBaseMapper().getPageList(CommonPageRequest.defaultPage(), queryWrapper);
+        for(ConsumptionRecord consumptionRecord : pageList.getRecords()){
+            if(ObjectUtil.isNotEmpty(consumptionRecord.getPhone())){
+                consumptionRecord.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(consumptionRecord.getPhone()));
+            }
+            if(StringUtils.equals(consumptionRecord.getConsumptionOperate(),"3") || StringUtils.equals(consumptionRecord.getConsumptionOperate(),"4")){
+                //消费结算,设置下说明
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"1")){
+                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"2")){
+                    consumptionRecord.setConsumptionRemark("糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"3")){
+                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个"+",糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+            }
+        }
+        return pageList;
+    }
+
+    public QueryWrapper<ConsumptionRecord> getWrapper(ConsumptionRecordPageParam consumptionRecordPageParam){
         QueryWrapper<ConsumptionRecord> queryWrapper = new QueryWrapper<ConsumptionRecord>().checkSqlInjection();
         if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getUserName())){
             queryWrapper.like("su.name",consumptionRecordPageParam.getUserName());
@@ -98,10 +126,14 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
         if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getRecordId())){
             List<String> idList = Lists.newArrayList();
             bizUserService.list(new QueryWrapper<BizUser>().lambda().
-                    eq(BizUser::getReferralUser, consumptionRecordPageParam.getRecordId())).
+                            eq(BizUser::getReferralUser, consumptionRecordPageParam.getRecordId())).
                     forEach(user->idList.add(user.getId()));
             queryWrapper.in("cr.user_id",idList);
         }
+        if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getSearchKey())){
+            queryWrapper.and(wrapper->wrapper.like("su.NAME",consumptionRecordPageParam.getSearchKey()).or().
+                    like("su.ACCOUNT",consumptionRecordPageParam.getSearchKey()));
+        }
         // 校验数据范围
         List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
         if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
@@ -111,25 +143,7 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
         }
         queryWrapper.eq("cr.DELETE_FLAG","NOT_DELETE");
         queryWrapper.orderByDesc("cr.create_time");
-        Page<ConsumptionRecord> pageList = this.getBaseMapper().getPageList(CommonPageRequest.defaultPage(), queryWrapper);
-        for(ConsumptionRecord consumptionRecord : pageList.getRecords()){
-            if(ObjectUtil.isNotEmpty(consumptionRecord.getPhone())){
-                consumptionRecord.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(consumptionRecord.getPhone()));
-            }
-            if(StringUtils.equals(consumptionRecord.getConsumptionOperate(),"3") || StringUtils.equals(consumptionRecord.getConsumptionOperate(),"4")){
-                //消费结算,设置下说明
-                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"1")){
-                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个");
-                }
-                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"2")){
-                    consumptionRecord.setConsumptionRemark("糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
-                }
-                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"3")){
-                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个"+",糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
-                }
-            }
-        }
-        return pageList;
+        return queryWrapper;
     }
 
     @Override
@@ -676,6 +690,9 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
         List<Map<String, Object>> mapList = getList(consumptionRecordPageParam);
         String fileName = "汇总统计报表.xlsx";
         List<ConsumptionRecordExportResult> list = Lists.newArrayList();
+        Integer orderNumber = 0;
+        BigDecimal consumptionMoney = new BigDecimal(0);
+        BigDecimal pointMoney = new BigDecimal(0);
         for(Map<String,Object> map:mapList){
             ConsumptionRecordExportResult consumeRecordExportResult = new ConsumptionRecordExportResult();
             consumeRecordExportResult.setName(MapUtils.getString(map,"name"));
@@ -683,12 +700,61 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
             consumeRecordExportResult.setOrderCount(MapUtils.getInteger(map,"orderCount"));
             consumeRecordExportResult.setAccountMoney(new BigDecimal(MapUtils.getString(map,"accountMoney")));
             consumeRecordExportResult.setVoucherMoney(new BigDecimal(MapUtils.getString(map,"voucherMoney")));
-            consumeRecordExportResult.setUserCount(MapUtils.getInteger(map,"userCount"));
+            //consumeRecordExportResult.setUserCount(MapUtils.getInteger(map,"userCount"));
             list.add(consumeRecordExportResult);
-        }
+            orderNumber+=MapUtils.getInteger(map,"orderCount");
+            consumptionMoney = consumptionMoney.add(new BigDecimal(MapUtils.getString(map,"accountMoney")));
+            pointMoney = pointMoney.add(new BigDecimal(MapUtils.getString(map,"voucherMoney")));
+        }
+        ConsumptionRecordExportResult consumeRecordExportResult = new ConsumptionRecordExportResult();
+        consumeRecordExportResult.setName("统计");
+        consumeRecordExportResult.setOrderCount(orderNumber);
+        consumeRecordExportResult.setAccountMoney(consumptionMoney);
+        consumeRecordExportResult.setVoucherMoney(pointMoney);
+        QueryWrapper<ConsumptionRecord> customQueryWrapper = getCustomQueryWrapper(consumptionRecordPageParam);
+        UserBalanceResult result = this.getBaseMapper().queryBalanceTotal(customQueryWrapper);
+        consumeRecordExportResult.setUserCount(result.getUserCount());
+        list.add(consumeRecordExportResult);
+
         CommonExportUtil.export(fileName, ConsumptionRecordExportResult.class,list,response,"汇总统计报表");
     }
 
+    @Override
+    public void exportConsumption(ConsumptionRecordPageParam consumptionRecordPageParam, HttpServletResponse response) throws IOException {
+        QueryWrapper<ConsumptionRecord> queryWrapper = getWrapper(consumptionRecordPageParam);
+        List<ConsumptionRecord> recordList = this.getBaseMapper().getPageList(queryWrapper);
+        if(ObjectUtil.isEmpty(recordList)){
+            throw new CommonException("无数据可导出!");
+        }
+        for(ConsumptionRecord consumptionRecord : recordList){
+            if(ObjectUtil.isNotEmpty(consumptionRecord.getPhone())){
+                consumptionRecord.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(consumptionRecord.getPhone()));
+            }
+            if(StringUtils.equals(consumptionRecord.getConsumptionOperate(),"3") || StringUtils.equals(consumptionRecord.getConsumptionOperate(),"4")){
+                //消费结算,设置下说明
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"1")){
+                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"2")){
+                    consumptionRecord.setConsumptionRemark("糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"3")){
+                    consumptionRecord.setConsumptionRemark("积分消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"个"+",糕点消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"个");
+                }
+            }
+        }
+        transService.transBatch(recordList);
+        String fileName = "消费记录报表.xlsx";
+        List<ConsumptionExportResult> list = Lists.newArrayList();
+        for(ConsumptionRecord consumptionRecord : recordList){
+            ConsumptionExportResult consumptionExportResult = new ConsumptionExportResult();
+            BeanUtil.copyProperties(consumptionRecord, consumptionExportResult);
+            consumptionExportResult.setConsumptionOperate((String) consumptionRecord.getTransMap().get("consumptionOperateName"));
+            list.add(consumptionExportResult);
+        }
+        CommonExportUtil.export(fileName, ConsumptionExportResult.class,list,response,"消费记录报表");
+    }
+
 
     public static void main(String[] args) {
         System.out.printf("加密后手机号:"+CommonCryptogramUtil.doSm4CbcEncrypt("15240260262"));

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/recommendrecord/param/BizRecommendRecordPageParam.java

@@ -48,4 +48,10 @@ public class BizRecommendRecordPageParam {
     @Schema(description = "关键词")
     private String searchKey;
 
+    /**推荐开始时间*/
+    private String recommendTimeBegin;
+
+    /**推荐结束时间*/
+    private String recommendTimeEnd;
+
 }

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/recommendrecord/service/impl/BizRecommendRecordServiceImpl.java

@@ -58,6 +58,12 @@ public class BizRecommendRecordServiceImpl extends ServiceImpl<BizRecommendRecor
         if (ObjectUtil.isEmpty(loginUserDataScope)) {
             queryWrapper.eq("t.recommend_user_id", StpLoginUserUtil.getLoginUser().getId());
         }
+        //时间查询
+        if(ObjectUtil.isNotEmpty(bizRecommendRecordPageParam.getRecommendTimeBegin()) &&
+                ObjectUtil.isNotEmpty(bizRecommendRecordPageParam.getRecommendTimeEnd())){
+            queryWrapper.between("t.create_time",bizRecommendRecordPageParam.getRecommendTimeBegin()+" 00:00:00",
+                    bizRecommendRecordPageParam.getRecommendTimeEnd()+" 23:59:59");
+        }
         queryWrapper.eq("t.delete_flag", CommonDeleteFlagEnum.NOT_DELETE);
         queryWrapper.orderByDesc("t.create_time");
         Page<BizRecommendRecord> page = baseMapper.page(CommonPageRequest.defaultPage(), queryWrapper);