Compare commits

..
13 Commits
Author SHA1 Message Date
hejiayang 5307f30fd8 消费统计时间来源调整 2026-01-29 09:24:05 +08:00
hejiayang f2d53786c2 充值记录 ,按照升序排序 2026-01-08 15:40:23 +08:00
hejiayang 712f295d57 Merge remote-tracking branch 'origin/master' 2026-01-07 14:53:36 +08:00
hejiayang e39496cca1 用户余额心跳调整 2026-01-07 14:53:17 +08:00
fansongsong f48d94227b 1:调整流水明细-统计+导出 使用列表查询统一sql
2:个人消费统计调整关联sys_user_sub使用LEFT JOIN解决和消费明细统计数据不一致问题
3:调整订单生成策略避免并发场景重复问题
2025-12-26 18:32:05 +08:00
hejiayang 9be9985905 人脸激活码配置
虹软识别人脸特征码失败后,将错误信息返回给前端
2025-12-25 14:57:32 +08:00
fansongsong 950d7999cb 消费明细报表-导出,调整字段顺序7 2025-12-22 15:16:20 +08:00
hejiayang 2527c5e765 线上配置数据库调整 2025-12-22 13:47:30 +08:00
fansongsong ef4b27f560 消费明细报表-导出,调整字段顺序6 2025-12-19 16:50:43 +08:00
fansongsong 3500408271 消费明细报表-导出,调整字段顺序6 2025-12-19 11:57:56 +08:00
hejiayang 1ec8f5ad62 部门列表筛选公共方法优化 2025-12-19 11:52:48 +08:00
fansongsong 515b231718 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StBbzxOrderInfoController.java
2025-12-19 11:16:20 +08:00
fansongsong fcf1d0f5f4 消费明细报表-导出,调整字段顺序5 2025-12-19 11:14:13 +08:00
20 changed files with 307 additions and 151 deletions
@@ -87,4 +87,6 @@ public class StClientMemberTransactionRecordDTO {
@Schema(title ="餐次")
private String dinnerType;
private List<String> canteenIdList;
}
@@ -5,6 +5,8 @@ package org.jeecg.payment.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.Data;
import org.jeecg.common.system.vo.ScreenVo;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -46,5 +48,7 @@ public class StExceptionRecordDTO {
private String startDate;
private String endDate;
private String canteenId;
List<String> canteenIdList;
}
@@ -573,11 +573,10 @@
SELECT
member_id,
top_up_balance,
reward_balance,
(top_up_balance + reward_balance) AS balance
FROM
st_client_member_balance
WHERE
reward_balance
FROM st_client_member_balance
WHERE member_id IN (SELECT id FROM sys_user_sub WHERE update_time > FROM_UNIXTIME(#{timestamp}/1000))
OR
create_time > FROM_UNIXTIME(#{timestamp} / 1000)
OR update_time > FROM_UNIXTIME(#{timestamp} / 1000)
OR last_consumption_time > FROM_UNIXTIME(#{timestamp} / 1000)
@@ -13,6 +13,7 @@ import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.ScreenVo;
import org.jeecg.payment.dto.StAmountSpentEveryMemberDTO;
import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO;
import org.jeecg.payment.service.IStBbzxOrderInfoService;
@@ -26,7 +27,9 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 订单 控制器
@@ -91,7 +94,7 @@ public class StBbzxOrderInfoController {
sumResult.setRestName("总计");
sumResult.setEatDay(startDate+"~"+endDate);
statisticsTheAmountSpentList.add(sumResult);
String exportFields = "restName|食堂名称,customerPrice|消费总额(元),totalCount|消费人次,totalNum|消费人数," +
String exportFields = "restName|食堂名称,totalCount|消费人次,customerPrice|消费总额(元),totalNum|消费人数," +
"breakfastAmount|早餐消费金额(元),breakfastPerson|早餐消费次数,lunchAmount|午餐消费金额(元),lunchPerson|午餐消费次数,dinnerAmount|晚餐消费金额(元),dinnerPerson|晚餐消费次数" +
",otherAmount|其他消费金额(元),otherPerson|其他消费次数,orderPrice|结算金额(元),eatDay|消费日期";
ExcelUtils.export(response, "食堂消费统计", statisticsTheAmountSpentList, exportFields, "yyyy-MM-dd HH:mm",true);
@@ -184,7 +187,7 @@ public class StBbzxOrderInfoController {
sumResult.setDepartName(null);
sumResult.setEatDay(startDate+"~"+endDate);
statisticsTheAmountSpentList.add(sumResult);
String exportFields = "realname|姓名,customerPrice|消费总额(元),workNo|工号,departName|部门,totalCount|消费次数,totalNum|消费天数," +
String exportFields = "workNo|工号,realname|姓名,departName|部门,totalCount|消费次数,customerPrice|消费总额(元),restName|食堂名称,totalNum|消费天数," +
"breakfastAmount|早餐消费金额(元),breakfastPerson|早餐消费次数,lunchAmount|午餐消费金额(元),lunchPerson|午餐消费次数,dinnerAmount|晚餐消费金额(元),dinnerPerson|晚餐消费次数" +
",otherAmount|其他消费金额(元),otherPerson|其他消费次数,orderPrice|结算金额(元),eatDay|消费日期";
ExcelUtils.export(response, "个人消费统计", statisticsTheAmountSpentList, exportFields, "yyyy-MM-dd HH:mm",true);
@@ -292,20 +295,20 @@ public class StBbzxOrderInfoController {
query.setStartTime(query.getDates().get(0));
query.setEndTime(query.getDates().get(1));
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂
if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){
// 后期分数据权限时在解开注释,此处管理员账户能看到所有食堂数据
// ScreenVo screenVo = new ScreenVo();
// screenVo.setId(CommonConstant.INLAY_CANTEEN_ID);
// canteenIdList.add(screenVo);
} else if (sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_4)) {
//查询当前登录用户的食堂列表
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
return Result.OK();
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
query.setStatus(3);//(充值=102
return Result.OK(iStClientMemberTransactionRecordService.pageQuery(query));
}
@@ -323,20 +326,20 @@ public class StBbzxOrderInfoController {
query.setStartTime(split[0]);
query.setEndTime(split[1]);
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂
if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){
// 后期分数据权限时在解开注释,此处管理员账户能看到所有食堂数据
// ScreenVo screenVo = new ScreenVo();
// screenVo.setId(CommonConstant.INLAY_CANTEEN_ID);
// canteenIdList.add(screenVo);
} else if (sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_4)) {
//查询当前登录用户的食堂列表
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
return Result.OK();
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
query.setStatus(3);//(充值=102
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query);
StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class);
@@ -358,20 +361,20 @@ public class StBbzxOrderInfoController {
query.setStartTime(split[0]);
query.setEndTime(split[1]);
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂
if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){
// 后期分数据权限时在解开注释,此处管理员账户能看到所有食堂数据
// ScreenVo screenVo = new ScreenVo();
// screenVo.setId(CommonConstant.INLAY_CANTEEN_ID);
// canteenIdList.add(screenVo);
} else if (sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_4)) {
//查询当前登录用户的食堂列表
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
return;
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
query.setStatus(3);//(充值=102
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query);
if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(statisticsCanteenBusiness)){
@@ -384,9 +387,9 @@ public class StBbzxOrderInfoController {
// String exportFields = "serialNo|交易流水号,orderNo|交易单号,userName|姓名,phone|手机号,workNo|工号," +
// "statusName|操作类型,transactionAmount|交易金额,paymentMethodName|结账方式,storedBalance|储值金额变动(元),rewardBalance|赠送金额变动(元),availableBalance|余额," +
// "integralBalance|积分变动,createTime|交易时间,payTime|结账时间,updateStatusName|操作端,createOne|操作人";
String exportFields = "serialNo|交易流水号,orderNo|交易单号,userName|姓名,phone|手机号,workNo|工号," +
"transactionAmount|交易金额,statusName|操作类型,paymentMethodName|充值方式,availableBalance|现金余额," +
"createTime|充值时间,createOne|操作人";
String exportFields = "workNo|工号,userName|姓名,restName|充值食堂名称,transactionAmount|交易金额,statusName|操作类型," +
"availableBalance|现金余额," +
"createTime|充值时间,phone|手机号";
ExcelUtils.export(response, "充值记录", statisticsCanteenBusiness, exportFields, "yyyy-MM-dd HH:mm",true);
}
@@ -12,6 +12,7 @@ import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.ScreenVo;
import org.jeecg.payment.dto.StClientMemberChangeBalanceDTO;
import org.jeecg.payment.dto.StClientMemberTopUpDTO;
import org.jeecg.payment.dto.StClientMemberTransactionRecordDTO;
@@ -436,9 +437,20 @@ public class StClientMemberBalanceController {
query.setEndTime(query.getDates().get(1));
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
//消费=101
query.setStatus(101);
return Result.OK(iStClientMemberTransactionRecordService.pageQueryNew(query));
@@ -457,22 +469,22 @@ public class StClientMemberBalanceController {
query.setStartTime(split[0]);
query.setEndTime(split[1]);
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂
if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){
// 后期分数据权限时在解开注释,此处管理员账户能看到所有食堂数据
// ScreenVo screenVo = new ScreenVo();
// screenVo.setId(CommonConstant.INLAY_CANTEEN_ID);
// canteenIdList.add(screenVo);
} else if (sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_4)) {
//查询当前登录用户的食堂列表
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
return Result.OK();
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setStatus(1);//消费=101
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query);
query.setCanteenIdList(canteenIdList);
query.setStatus(101);
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryListNew(query);
StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class);
StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额
@@ -497,22 +509,22 @@ public class StClientMemberBalanceController {
if(StringUtils.isNotBlank(query.getEndDate())){
query.setEndTime(query.getEndDate());
}
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//餐品总库只查询内置食堂
if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){
// 后期分数据权限时在解开注释,此处管理员账户能看到所有食堂数据
// ScreenVo screenVo = new ScreenVo();
// screenVo.setId(CommonConstant.INLAY_CANTEEN_ID);
// canteenIdList.add(screenVo);
} else if (sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_4)) {
//查询当前登录用户的食堂列表
String canteenId = sysUser.getCanteenId();
query.setCanteenId(canteenId);
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
return;
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setStatus(1);//消费=101
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query);
query.setCanteenIdList(canteenIdList);
query.setStatus(101);
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryListNew(query);
StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class);
StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额
@@ -525,7 +537,7 @@ public class StClientMemberBalanceController {
// "payTime|结账时间,updateStatusName|操作端,createOne|操作人";
// "dinnerType|餐次名称,restName|食堂名称,createTime|交易时间,payTime|结账时间,updateStatusName|操作端,createOne|操作人";
String exportFields = "userName|姓名,workNo|工号,dinnerType|餐次名称,transactionAmount|交易金额,availableBalance|剩余金额,createTime|上传时间,serialNo|交易流水号,orderNo|交易单号,phone|手机号码,cardCode|卡号," +
String exportFields = "userName|姓名,workNo|工号,dinnerType|餐次名称,transactionAmount|交易金额,restName|食堂名称,availableBalance|剩余金额,createTime|上传时间,serialNo|交易流水号,orderNo|交易单号,phone|手机号码,cardCode|卡号," +
"statusName|操作类型,paymentMethodName|结账方式,businessModelName|消费类型名称,storedBalance|储值金额变动(元)," +
"updateStatusName|操作端,payTime|扣费时间";
// "dinnerType|餐次名称,restName|食堂名称,,payTime|结账时间,updateStatusName|操作端,createOne|操作人";
@@ -85,7 +85,7 @@ public class StConsumptionExceptionRecordController {
List<StExceptionRecordVo> stExceptionRecordVos = stConsumptionExceptionRecordService.exceptionRecordPageExport(query);
if(CollectionUtils.isNotEmpty(stExceptionRecordVos)){
String exportFields = "userName|姓名,phone|手机号,workNo|工号,cardCode|卡号,spendMoney|本次扣费金额,payTime|消费时间,createTime|创建时间";
String exportFields = "userName|姓名,phone|手机号,workNo|工号,cardCode|卡号,spendMoney|本次扣费金额,restName|食堂名称,payTime|消费时间,createTime|创建时间";
ExcelUtils.export(response, "异常消费流水", stExceptionRecordVos, exportFields, "yyyy-MM-dd HH:mm",true);
}
}
@@ -1,9 +1,12 @@
package org.jeecg.payment.listUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
/**
* * 订单编码码生成器,生成32位数字编码,
@@ -107,26 +110,10 @@ public class OrderUtils {
*/
public static String getOrderCodeV2() {
return ORDER_CODE + getDateTimeV2();
return getDateTime() + IdWorker.get32UUID();
}
/**
* 生成退货单号编码(调用方法)
* @param userId 网站中该用户唯一ID 防止重复
*/
public static String getReturnCode(Integer userId) {
return RETURN_ORDER + getCode(userId);
}
/**
* 生成退款单号编码(调用方法)
* @param userId 网站中该用户唯一ID 防止重复
*/
public static String getRefundCode(Integer userId) {
return REFUND_ORDER + getCode(userId);
}
}
@@ -25,7 +25,7 @@ public interface StClientMemberTransactionRecordMapper extends BaseMapper<StClie
long pageListCount(@Param("vo") StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageList2(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query);
List<StClientMemberTransactionRecordVO> pageList2( @Param("vo") StClientMemberTransactionRecordDTO query);
/**
* 列表查询
* @return
@@ -235,6 +235,7 @@
SUM(oi.order_price) orderPrice,
(SELECT COUNT(DISTINCT member_id) FROM st_bbzx_order_info WHERE eat_day = oi.eat_day and `status` = 5
and order_type = 3
AND canteen_id = oi.canteen_id
<if test="list != null and list.size() > 0">
and canteen_id IN
<foreach collection="list" item="canteenId" separator="," open="(" close=")" >
@@ -242,7 +243,7 @@
</foreach>
</if>
<if test="startDate != '' and startDate != null ">
and eat_day between #{startDate} and #{endDate}
and DATE_FORMAT(create_time,'%Y-%m-%d') between #{startDate} and #{endDate}
</if>
) AS totalNum
FROM
@@ -258,17 +259,19 @@
</foreach>
</if>
<if test="startDate != '' and startDate != null ">
and oi.eat_day between #{startDate} and #{endDate}
and DATE_FORMAT(oi.create_time,'%Y-%m-%d') between #{startDate} and #{endDate}
</if>
GROUP BY
oi.canteen_id,
oi.eat_day
oi.eat_day,
r.rest_name
order by oi.eat_day desc
</select>
<select id="statisticsTheAmountSpentEveryMember"
resultType="org.jeecg.payment.vo.StatisticsTheAmountSpentVo">
SELECT
u.realname,
sr.rest_name as restName,
pay.realname as payRealname,
u.work_no,
CONCAT(
@@ -306,8 +309,9 @@
) AS totalNum
FROM
st_bbzx_order_info oi
JOIN sys_user_sub u ON oi.member_id = u.id
JOIN sys_user_sub pay ON oi.pay_member_id = pay.id
LEFT JOIN sys_user_sub u ON oi.member_id = u.id
LEFT JOIN sys_user_sub pay ON oi.pay_member_id = pay.id
LEFT JOIN st_base_restaurant AS sr ON sr.id = oi.canteen_id
LEFT JOIN sys_pay_depart direct_depart ON pay.depart_ids = direct_depart.id AND direct_depart.del_flag = '0'
LEFT JOIN sys_pay_depart parent_depart ON direct_depart.parent_id = parent_depart.id AND parent_depart.del_flag = '0'
WHERE
@@ -129,7 +129,21 @@
#{departId}
</foreach>
</if>
order by a.create_time desc
<if test="vo.canteenIdList != null and vo.canteenIdList.size() > 0">
and a.canteen_id IN
<foreach collection="vo.canteenIdList" item="canteenId" separator="," open="(" close=")">
#{canteenId}
</foreach>
</if>
order by a.create_time
<choose>
<when test="vo.status != null and vo.status == 3 ">
asc
</when>
<otherwise>
desc
</otherwise>
</choose>
</select>
<select id="pageListCount" resultType="java.lang.Long">
@@ -185,10 +199,16 @@
<if test="vo.dinnerType != null and vo.dinnerType != ''">
and sboi.dinner_type = #{vo.dinnerType}
</if>
<if test="vo.canteenIdList != null and vo.canteenIdList.size() > 0">
and a.canteen_id IN
<foreach collection="vo.canteenIdList" item="canteenId" separator="," open="(" close=")">
#{canteenId}
</foreach>
</if>
</select>
<select id="pageList2" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO">
SELECT
SELECT DISTINCT
a.id,
a.serial_no as serialNo,
a.order_no as orderNo,
@@ -204,12 +224,14 @@
a.integral_balance as integralBalance,
a.create_time as createTime,
a.pay_time as payTime,
sr.rest_name as restName,
a.update_status as updateStatus
FROM
st_client_member_transaction_record as a
<if test="vo.dinnerType != null and vo.dinnerType != ''">
LEFT JOIN st_bbzx_order_info sboi ON a.order_no = sboi.order_no
</if>
LEFT JOIN st_base_restaurant AS sr ON sr.id = a.canteen_id
LEFT JOIN sys_user_sub AS c ON a.pay_member_id = c.id
LEFT JOIN sys_user_sub AS pay ON a.member_id = pay.id
WHERE a.is_del = 0
@@ -255,6 +277,12 @@
<if test="vo.dinnerType != null and vo.dinnerType != ''">
and sboi.dinner_type = #{vo.dinnerType}
</if>
<if test="vo.canteenIdList != null and vo.canteenIdList.size() > 0">
and a.canteen_id IN
<foreach collection="vo.canteenIdList" item="canteenId" separator="," open="(" close=")">
#{canteenId}
</foreach>
</if>
order by a.create_time desc
</select>
@@ -15,6 +15,7 @@
a.pay_time,
a.error_msg,
u.realname as userName,
sr.rest_name as restName,
CONCAT(
IFNULL(parent_depart.depart_name, ''),
IF(parent_depart.depart_name IS NOT NULL AND direct_depart.depart_name IS NOT NULL, '->', ''),
@@ -27,7 +28,7 @@
LEFT JOIN sys_user_sub AS u ON a.user_id = u.id
LEFT JOIN sys_pay_depart direct_depart ON u.depart_ids = direct_depart.id AND direct_depart.del_flag = '0'
LEFT JOIN sys_pay_depart parent_depart ON direct_depart.parent_id = parent_depart.id AND parent_depart.del_flag = '0'
LEFT JOIN st_base_restaurant AS sr ON a.canteen_id = sr.id
WHERE 1 = 1
<if test="query.phone != null and query.phone != ''">
and u.phone like CONCAT('%',#{query.phone},'%')
@@ -49,6 +50,12 @@
#{departId}
</foreach>
</if>
<if test="query.canteenIdList != null and query.canteenIdList.size() > 0">
and a.canteen_id IN
<foreach collection="query.canteenIdList" item="canteenId" separator="," open="(" close=")">
#{canteenId}
</foreach>
</if>
order by a.create_time desc
</select>
</mapper>
@@ -34,6 +34,14 @@ public interface IStClientMemberTransactionRecordService extends JeecgService<St
*/
List<StClientMemberTransactionRecordVO> queryList(StClientMemberTransactionRecordDTO query);
/**
* 列表查询导出
*
* @param query
* @return
*/
List<StClientMemberTransactionRecordVO> queryListNew(StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page, StClientMemberTransactionRecordDTO query);
InOutRecordInfoVo getOneInOutInfo(String recordId);
@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xkcoding.http.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
@@ -752,7 +753,7 @@ public class StBbzxOrderInfoServiceImpl extends JeecgServiceImpl<StBbzxOrderInfo
public StBbzxOrderInfo buildOrderInfoNew(Date dateTime,String restId,String dinnerType,String plateNumber,String userId,String memberName,String memberPhone,Integer deductionType,StClientMemberLevelDeductRuleVo levelDeductRuleVo , String remark,StRfidVo stRfidVo){
StBbzxOrderInfo stBbzxOrderInfo = new StBbzxOrderInfo();
stBbzxOrderInfo.setOrderType(3);
String orderNo = OrderUtils.getOrderCode(10);
String orderNo = OrderUtils.getOrderCodeV2();
stBbzxOrderInfo.setOrderNo(orderNo);
stBbzxOrderInfo.setSerialNo(stRfidVo.getCardCode());
stBbzxOrderInfo.setDinnerType(dinnerType);
@@ -815,7 +816,7 @@ public class StBbzxOrderInfoServiceImpl extends JeecgServiceImpl<StBbzxOrderInfo
StBbzxOrderInfo stBbzxOrderInfo = new StBbzxOrderInfo();
stBbzxOrderInfo.setDeviceCode(stRfidVo.getDeviceCode());
stBbzxOrderInfo.setOrderType(3);
String orderNo = OrderUtils.getOrderCode(10);
String orderNo = OrderUtils.getOrderCodeV2();
stBbzxOrderInfo.setOrderNo(orderNo);
stBbzxOrderInfo.setSerialNo(miniMineBalanceVo.getCardCode());
stBbzxOrderInfo.setDinnerType(dinnerType);
@@ -144,6 +144,25 @@ public class StClientMemberTransactionRecordServiceImpl extends JeecgServiceImpl
return pageList;
}
@Override
public List<StClientMemberTransactionRecordVO> queryListNew(StClientMemberTransactionRecordDTO query) {
List<StClientMemberTransactionRecordVO> pageList = baseMapper.pageList2(query);
if (CollectionUtils.isNotEmpty(pageList)) {
for (StClientMemberTransactionRecordVO model : pageList) {
model.setStatusName(MemberTransactionTypeEnum.getName(model.getStatus()));
model.setPaymentMethodName(MemberEnum.getXcxName(model.getPaymentMethod()));
model.setUpdateStatusName(null != model.getUpdateStatus() && 1 == model.getUpdateStatus() ? "前端":"后台");
if(null != model.getBusinessModel()&& 1 == model.getBusinessModel() ){
model.setBusinessModelName("定值模式");//扣费类型(1:固定扣费,2:固定+补贴扣费,3:按量扣费,4:自定义金额)
}
if(null != model.getBusinessModel()&& 4 == model.getBusinessModel() ){
model.setBusinessModelName("金额模式");//扣费类型(1:固定扣费,2:固定+补贴扣费,3:按量扣费,4:自定义金额)
}
}
}
return pageList;
}
@Override
public IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page,StClientMemberTransactionRecordDTO query) {
@@ -8,6 +8,9 @@ import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.ScreenVo;
import org.jeecg.payment.dto.StExceptionRecordDTO;
import org.jeecg.payment.entity.StConsumptionExceptionRecord;
import org.jeecg.payment.mapper.StConsumptionExceptionRecordMapper;
@@ -52,6 +55,20 @@ public class StConsumptionExceptionRecordServiceImpl extends ServiceImpl<StConsu
query.setList(allCascadeDeptIds);
}
}
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
Page<StExceptionRecordVo> page = new Page<>(query.getPageNo(), query.getPageSize());
return baseMapper.exceptionRecordPage(page, query);
}
@@ -69,6 +86,20 @@ public class StConsumptionExceptionRecordServiceImpl extends ServiceImpl<StConsu
query.setList(allCascadeDeptIds);
}
}
String canteenId = query.getCanteenId();
List<String> canteenIdList = new ArrayList<>();
if(StringUtils.isNotBlank(canteenId)){
canteenIdList.add(canteenId);
} else {
//权限校验
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<String> canteenIds = new ArrayList<>();
if(sysUser != null){
canteenIds = sysUser.getCanteenIdList().stream().map(ScreenVo::getId).collect(Collectors.toList());
canteenIdList.addAll(canteenIds);
}
}
query.setCanteenIdList(canteenIdList);
return baseMapper.exceptionRecordPage(query);
}
@@ -149,6 +149,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId);
@@ -215,6 +217,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId);
@@ -285,6 +289,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId);
@@ -329,7 +335,7 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
*/
@GetMapping(value = "/updateAllUserFaceImg")
public Result<String> updateAllUserFaceImg(@RequestParam(name = "type", required = false,defaultValue = "0") Integer type){
return Result.OK(swUserFaceimgService.updateAllUserFaceImg(type));
return swUserFaceimgService.updateAllUserFaceImg(type);
}
public Result<?> saveFaceImgSubLocalUpload(@RequestBody Map map) {
@@ -361,6 +367,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
}else{
return Result.error("人脸特征码提取失败!");
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId);
@@ -516,6 +524,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId);
@@ -46,5 +46,5 @@ public interface ISwUserFaceimgService extends IService<SwUserFaceimg> {
*/
void sendPaymentGateUserInfo(UserFaceInfo userFaceInfo, Integer type, Boolean isConfirm, String userId) ;
String updateAllUserFaceImg(Integer type);
Result<String> updateAllUserFaceImg(Integer type);
}
@@ -307,6 +307,8 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature);
}
} else {
continue;
}
slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setCardNumber(cardNo);
@@ -411,7 +413,7 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
}
//此方法是为了更新人脸特征数据 , 因为初始化数据 进去的人脸特征识别有问题, 现通过程序重新识别生成特征码并更新
@Override
public String updateAllUserFaceImg(Integer type){
public Result<String> updateAllUserFaceImg(Integer type){
if(type == 1){
//正式员工人脸表
@@ -436,11 +438,13 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
swUserFaceimg.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
}
this.updateBatchById(list);
}
return "此次操作更新人脸主表数据"+ list.size()+"条数据";
return Result.OK("此次操作更新人脸主表数据"+ list.size()+"条数据");
}else {
//子用户
//正式员工人脸表
@@ -464,11 +468,13 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
faceimgSub.setFaceFeatureData(feature);
}
} else {
return Result.error("人脸特征码提取失败!");
}
}
swUserFaceimgSubService.updateBatchById(subList);
}
return "此次操作更新人脸子表数据"+subList.size()+"条数据";
return Result.OK("此次操作更新人脸子表数据"+subList.size()+"条数据");
}
}
}
@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
@@ -39,48 +40,82 @@ public class SysPayDepartServiceImpl extends ServiceImpl<SysPayDepartMapper, Sys
*/
@Override
public List<String> getAllCascadeDeptIds(String deptId) {
List<String> allDeptIds = new ArrayList<>();
if (deptId == null) {
return allDeptIds;
}
// 从目标部门开始递归查询
recursiveQueryDeptIds(deptId, allDeptIds);
return allDeptIds;
}
/**
* 递归查询部门ID及其所有子部门ID
* @param deptId 当前部门ID
* @param result 用于收集结果的集合
*/
private void recursiveQueryDeptIds(String deptId, List<String> result) {
// 1. 先查询当前部门信息并添加到结果集(去重)
if (!result.contains(deptId)) {
// 验证当前部门是否存在且有效
SysPayDepart currentDept = this.getOne(new LambdaQueryWrapper<SysPayDepart>()
.eq(SysPayDepart::getId, deptId)
.eq(SysPayDepart::getDelFlag, "0"));
if (currentDept != null) {
result.add(deptId);
} else {
// 当前部门不存在或已删除,终止递归
return;
}
return Collections.emptyList();
}
// 2. 查询当前部门的直接子部门
List<SysPayDepart> childDepts = this.list(new LambdaQueryWrapper<SysPayDepart>()
.eq(SysPayDepart::getParentId, deptId)
// 1. 一次性查询所有有效部门
List<SysPayDepart> allDepts = this.list(new LambdaQueryWrapper<SysPayDepart>()
.eq(SysPayDepart::getDelFlag, "0"));
// 3. 对每个子部门递归查询其下属部门
for (SysPayDepart child : childDepts) {
String childId = child.getId();
// 递归处理子部门,会自动添加子部门及其下级
recursiveQueryDeptIds(childId, result);
// 2. 构建部门父子关系Map
Map<String, List<String>> parentToChildrenMap = allDepts.stream()
.collect(Collectors.groupingBy(
SysPayDepart::getParentId,
Collectors.mapping(SysPayDepart::getId, Collectors.toList())
));
// 3. 在内存中递归查找
List<String> result = new ArrayList<>();
recursiveFindDeptIds(deptId, parentToChildrenMap, result);
return result;
}
private void recursiveFindDeptIds(String currentDeptId,
Map<String, List<String>> parentToChildrenMap,
List<String> result) {
result.add(currentDeptId);
List<String> children = parentToChildrenMap.get(currentDeptId);
if (children != null) {
for (String childId : children) {
recursiveFindDeptIds(childId, parentToChildrenMap, result);
}
}
}
//
// public List<String> getAllCascadeDeptIds(String deptId) {
// List<String> allDeptIds = new ArrayList<>();
// if (deptId == null) {
// return allDeptIds;
// }
// // 从目标部门开始递归查询
// recursiveQueryDeptIds(deptId, allDeptIds);
// return allDeptIds;
// }
//
// /**
// * 递归查询部门ID及其所有子部门ID
// * @param deptId 当前部门ID
// * @param result 用于收集结果的集合
// */
// private void recursiveQueryDeptIds(String deptId, List<String> result) {
// // 1. 先查询当前部门信息并添加到结果集(去重)
// if (!result.contains(deptId)) {
// // 验证当前部门是否存在且有效
// SysPayDepart currentDept = this.getOne(new LambdaQueryWrapper<SysPayDepart>()
// .eq(SysPayDepart::getId, deptId)
// .eq(SysPayDepart::getDelFlag, "0"));
//
// if (currentDept != null) {
// result.add(deptId);
// } else {
// // 当前部门不存在或已删除,终止递归
// return;
// }
// }
//
// // 2. 查询当前部门的直接子部门
// List<SysPayDepart> childDepts = this.list(new LambdaQueryWrapper<SysPayDepart>()
// .eq(SysPayDepart::getParentId, deptId)
// .eq(SysPayDepart::getDelFlag, "0"));
//
// // 3. 对每个子部门递归查询其下属部门
// for (SysPayDepart child : childDepts) {
// String childId = child.getId();
// // 递归处理子部门,会自动添加子部门及其下级
// recursiveQueryDeptIds(childId, result);
// }
// }
/**
@@ -97,7 +97,7 @@ spring:
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource:
master:
url: jdbc:mysql://10.59.235.137:3306/zhst_finance?Unicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
url: jdbc:mysql://10.59.235.137:3306/zhst_finance_new?Unicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123qwe!@#P@ssw0rd
driver-class-name: com.mysql.cj.jdbc.Driver
@@ -289,9 +289,9 @@ third-app:
# 虹软人脸识别(WIN和UNIX的sdkKey不一致,需要切换) 激活码需要配置
face:
# windows
appId: 3RX8bPDaEx3ZLYrxKEZ9F8hT5cqTma49AoeQhTMW8Wvg
sdkKey: CsNxFiPekJAyuQRjwY3c918ARVEEyCyzuvmMwWDUAjsF
activeKey: 86L1-11ZG-412Q-XKLB
appId: 5fiiFa6fTSRhDbiarBSMGVS1hEkDyMQLYyBgn97EzZyb
sdkKey: 3QndXfNCsoUM5hDyzSw2a3j7Ke3eL4J9by1yKfUsQJSC
activeKey: 86L1-11Z4-61B4-AEQ1
libPath: ./facelib
detect:
pool: