Compare commits

..
11 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
15 changed files with 162 additions and 87 deletions
@@ -573,11 +573,10 @@
SELECT SELECT
member_id, member_id,
top_up_balance, top_up_balance,
reward_balance, reward_balance
(top_up_balance + reward_balance) AS balance FROM st_client_member_balance
FROM WHERE member_id IN (SELECT id FROM sys_user_sub WHERE update_time > FROM_UNIXTIME(#{timestamp}/1000))
st_client_member_balance OR
WHERE
create_time > FROM_UNIXTIME(#{timestamp} / 1000) create_time > FROM_UNIXTIME(#{timestamp} / 1000)
OR update_time > FROM_UNIXTIME(#{timestamp} / 1000) OR update_time > FROM_UNIXTIME(#{timestamp} / 1000)
OR last_consumption_time > FROM_UNIXTIME(#{timestamp} / 1000) OR last_consumption_time > FROM_UNIXTIME(#{timestamp} / 1000)
@@ -387,9 +387,9 @@ public class StBbzxOrderInfoController {
// String exportFields = "serialNo|交易流水号,orderNo|交易单号,userName|姓名,phone|手机号,workNo|工号," + // String exportFields = "serialNo|交易流水号,orderNo|交易单号,userName|姓名,phone|手机号,workNo|工号," +
// "statusName|操作类型,transactionAmount|交易金额,paymentMethodName|结账方式,storedBalance|储值金额变动(元),rewardBalance|赠送金额变动(元),availableBalance|余额," + // "statusName|操作类型,transactionAmount|交易金额,paymentMethodName|结账方式,storedBalance|储值金额变动(元),rewardBalance|赠送金额变动(元),availableBalance|余额," +
// "integralBalance|积分变动,createTime|交易时间,payTime|结账时间,updateStatusName|操作端,createOne|操作人"; // "integralBalance|积分变动,createTime|交易时间,payTime|结账时间,updateStatusName|操作端,createOne|操作人";
String exportFields = "userName|姓名,deptName|部门,phone|手机号,workNo|工号,restName|食堂名称," + String exportFields = "workNo|工号,userName|姓名,restName|充值食堂名称,transactionAmount|交易金额,statusName|操作类型," +
"transactionAmount|交易金额,statusName|操作类型,paymentMethodName|充值方式,availableBalance|现金余额," + "availableBalance|现金余额," +
"createTime|充值时间,createOne|操作人"; "createTime|充值时间,phone|手机号";
ExcelUtils.export(response, "充值记录", statisticsCanteenBusiness, exportFields, "yyyy-MM-dd HH:mm",true); ExcelUtils.export(response, "充值记录", statisticsCanteenBusiness, exportFields, "yyyy-MM-dd HH:mm",true);
} }
@@ -483,8 +483,8 @@ public class StClientMemberBalanceController {
} }
} }
query.setCanteenIdList(canteenIdList); query.setCanteenIdList(canteenIdList);
query.setStatus(1);//消费=101 query.setStatus(101);
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query); List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryListNew(query);
StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class); StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class);
StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额 StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额
@@ -523,8 +523,8 @@ public class StClientMemberBalanceController {
} }
} }
query.setCanteenIdList(canteenIdList); query.setCanteenIdList(canteenIdList);
query.setStatus(1);//消费=101 query.setStatus(101);
List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryList(query); List<StClientMemberTransactionRecordVO> statisticsCanteenBusiness = iStClientMemberTransactionRecordService.queryListNew(query);
StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class); StClientMemberTransactionRecordVO sumResult = GenericSumUtil.sumList(statisticsCanteenBusiness, StClientMemberTransactionRecordVO.class);
StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额 StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额
@@ -537,8 +537,8 @@ public class StClientMemberBalanceController {
// "payTime|结账时间,updateStatusName|操作端,createOne|操作人"; // "payTime|结账时间,updateStatusName|操作端,createOne|操作人";
// "dinnerType|餐次名称,restName|食堂名称,createTime|交易时间,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|消费类型名称,restName|食堂名称,storedBalance|储值金额变动(元)," + "statusName|操作类型,paymentMethodName|结账方式,businessModelName|消费类型名称,storedBalance|储值金额变动(元)," +
"updateStatusName|操作端,payTime|扣费时间"; "updateStatusName|操作端,payTime|扣费时间";
// "dinnerType|餐次名称,restName|食堂名称,,payTime|结账时间,updateStatusName|操作端,createOne|操作人"; // "dinnerType|餐次名称,restName|食堂名称,,payTime|结账时间,updateStatusName|操作端,createOne|操作人";
ExcelUtils.export(response, "消费明细", statisticsCanteenBusiness, exportFields, "yyyy-MM-dd HH:mm",true); ExcelUtils.export(response, "消费明细", statisticsCanteenBusiness, exportFields, "yyyy-MM-dd HH:mm",true);
@@ -1,9 +1,12 @@
package org.jeecg.payment.listUtils; package org.jeecg.payment.listUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Random; import java.util.Random;
import java.util.UUID;
/** /**
* * 订单编码码生成器,生成32位数字编码, * * 订单编码码生成器,生成32位数字编码,
@@ -107,26 +110,10 @@ public class OrderUtils {
*/ */
public static String getOrderCodeV2() { 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); long pageListCount(@Param("vo") StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageList2(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query); IPage<StClientMemberTransactionRecordVO> pageList2(Page<StClientMemberTransactionRecordVO> page, @Param("vo") StClientMemberTransactionRecordDTO query);
List<StClientMemberTransactionRecordVO> pageList2( @Param("vo") StClientMemberTransactionRecordDTO query);
/** /**
* 列表查询 * 列表查询
* @return * @return
@@ -235,6 +235,7 @@
SUM(oi.order_price) orderPrice, SUM(oi.order_price) orderPrice,
(SELECT COUNT(DISTINCT member_id) FROM st_bbzx_order_info WHERE eat_day = oi.eat_day and `status` = 5 (SELECT COUNT(DISTINCT member_id) FROM st_bbzx_order_info WHERE eat_day = oi.eat_day and `status` = 5
and order_type = 3 and order_type = 3
AND canteen_id = oi.canteen_id
<if test="list != null and list.size() > 0"> <if test="list != null and list.size() > 0">
and canteen_id IN and canteen_id IN
<foreach collection="list" item="canteenId" separator="," open="(" close=")" > <foreach collection="list" item="canteenId" separator="," open="(" close=")" >
@@ -242,7 +243,7 @@
</foreach> </foreach>
</if> </if>
<if test="startDate != '' and startDate != null "> <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> </if>
) AS totalNum ) AS totalNum
FROM FROM
@@ -258,11 +259,12 @@
</foreach> </foreach>
</if> </if>
<if test="startDate != '' and startDate != null "> <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> </if>
GROUP BY GROUP BY
oi.canteen_id, oi.canteen_id,
oi.eat_day oi.eat_day,
r.rest_name
order by oi.eat_day desc order by oi.eat_day desc
</select> </select>
<select id="statisticsTheAmountSpentEveryMember" <select id="statisticsTheAmountSpentEveryMember"
@@ -307,8 +309,8 @@
) AS totalNum ) AS totalNum
FROM FROM
st_bbzx_order_info oi st_bbzx_order_info oi
JOIN sys_user_sub u ON oi.member_id = u.id LEFT 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 pay ON oi.pay_member_id = pay.id
LEFT JOIN st_base_restaurant AS sr ON sr.id = oi.canteen_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 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' LEFT JOIN sys_pay_depart parent_depart ON direct_depart.parent_id = parent_depart.id AND parent_depart.del_flag = '0'
@@ -135,7 +135,15 @@
#{canteenId} #{canteenId}
</foreach> </foreach>
</if> </if>
order by a.create_time desc order by a.create_time
<choose>
<when test="vo.status != null and vo.status == 3 ">
asc
</when>
<otherwise>
desc
</otherwise>
</choose>
</select> </select>
<select id="pageListCount" resultType="java.lang.Long"> <select id="pageListCount" resultType="java.lang.Long">
@@ -200,7 +208,7 @@
</select> </select>
<select id="pageList2" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO"> <select id="pageList2" resultType="org.jeecg.payment.vo.StClientMemberTransactionRecordVO">
SELECT SELECT DISTINCT
a.id, a.id,
a.serial_no as serialNo, a.serial_no as serialNo,
a.order_no as orderNo, a.order_no as orderNo,
@@ -216,14 +224,14 @@
a.integral_balance as integralBalance, a.integral_balance as integralBalance,
a.create_time as createTime, a.create_time as createTime,
a.pay_time as payTime, a.pay_time as payTime,
-- sr.rest_name as restName, sr.rest_name as restName,
a.update_status as updateStatus a.update_status as updateStatus
FROM FROM
st_client_member_transaction_record as a st_client_member_transaction_record as a
<if test="vo.dinnerType != null and vo.dinnerType != ''"> <if test="vo.dinnerType != null and vo.dinnerType != ''">
LEFT JOIN st_bbzx_order_info sboi ON a.order_no = sboi.order_no LEFT JOIN st_bbzx_order_info sboi ON a.order_no = sboi.order_no
</if> </if>
-- LEFT JOIN st_base_restaurant AS sr ON sr.id = a.canteen_id 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 c ON a.pay_member_id = c.id
LEFT JOIN sys_user_sub AS pay ON a.member_id = pay.id LEFT JOIN sys_user_sub AS pay ON a.member_id = pay.id
WHERE a.is_del = 0 WHERE a.is_del = 0
@@ -34,6 +34,14 @@ public interface IStClientMemberTransactionRecordService extends JeecgService<St
*/ */
List<StClientMemberTransactionRecordVO> queryList(StClientMemberTransactionRecordDTO query); List<StClientMemberTransactionRecordVO> queryList(StClientMemberTransactionRecordDTO query);
/**
* 列表查询导出
*
* @param query
* @return
*/
List<StClientMemberTransactionRecordVO> queryListNew(StClientMemberTransactionRecordDTO query);
IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page, StClientMemberTransactionRecordDTO query); IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page, StClientMemberTransactionRecordDTO query);
InOutRecordInfoVo getOneInOutInfo(String recordId); 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.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xkcoding.http.util.StringUtil; import com.xkcoding.http.util.StringUtil;
import lombok.extern.slf4j.Slf4j; 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){ 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 stBbzxOrderInfo = new StBbzxOrderInfo();
stBbzxOrderInfo.setOrderType(3); stBbzxOrderInfo.setOrderType(3);
String orderNo = OrderUtils.getOrderCode(10); String orderNo = OrderUtils.getOrderCodeV2();
stBbzxOrderInfo.setOrderNo(orderNo); stBbzxOrderInfo.setOrderNo(orderNo);
stBbzxOrderInfo.setSerialNo(stRfidVo.getCardCode()); stBbzxOrderInfo.setSerialNo(stRfidVo.getCardCode());
stBbzxOrderInfo.setDinnerType(dinnerType); stBbzxOrderInfo.setDinnerType(dinnerType);
@@ -815,7 +816,7 @@ public class StBbzxOrderInfoServiceImpl extends JeecgServiceImpl<StBbzxOrderInfo
StBbzxOrderInfo stBbzxOrderInfo = new StBbzxOrderInfo(); StBbzxOrderInfo stBbzxOrderInfo = new StBbzxOrderInfo();
stBbzxOrderInfo.setDeviceCode(stRfidVo.getDeviceCode()); stBbzxOrderInfo.setDeviceCode(stRfidVo.getDeviceCode());
stBbzxOrderInfo.setOrderType(3); stBbzxOrderInfo.setOrderType(3);
String orderNo = OrderUtils.getOrderCode(10); String orderNo = OrderUtils.getOrderCodeV2();
stBbzxOrderInfo.setOrderNo(orderNo); stBbzxOrderInfo.setOrderNo(orderNo);
stBbzxOrderInfo.setSerialNo(miniMineBalanceVo.getCardCode()); stBbzxOrderInfo.setSerialNo(miniMineBalanceVo.getCardCode());
stBbzxOrderInfo.setDinnerType(dinnerType); stBbzxOrderInfo.setDinnerType(dinnerType);
@@ -144,6 +144,25 @@ public class StClientMemberTransactionRecordServiceImpl extends JeecgServiceImpl
return pageList; 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 @Override
public IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page,StClientMemberTransactionRecordDTO query) { public IPage<StClientMemberTransactionRecordVO> pageBalanceRefundList(Page<StClientMemberTransactionRecordVO> page,StClientMemberTransactionRecordDTO query) {
@@ -149,6 +149,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId); slUserFaceimg.setUserId(userId);
@@ -215,6 +217,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId); slUserFaceimg.setUserId(userId);
@@ -285,6 +289,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId); slUserFaceimg.setUserId(userId);
@@ -329,7 +335,7 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
*/ */
@GetMapping(value = "/updateAllUserFaceImg") @GetMapping(value = "/updateAllUserFaceImg")
public Result<String> updateAllUserFaceImg(@RequestParam(name = "type", required = false,defaultValue = "0") Integer type){ 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) { public Result<?> saveFaceImgSubLocalUpload(@RequestBody Map map) {
@@ -361,6 +367,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
}else{
return Result.error("人脸特征码提取失败!");
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId); slUserFaceimg.setUserId(userId);
@@ -516,6 +524,8 @@ public class SwUserFaceimgController extends JeecgController<SwUserFaceimg, ISwU
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setUserId(userId); slUserFaceimg.setUserId(userId);
@@ -46,5 +46,5 @@ public interface ISwUserFaceimgService extends IService<SwUserFaceimg> {
*/ */
void sendPaymentGateUserInfo(UserFaceInfo userFaceInfo, Integer type, Boolean isConfirm, String userId) ; 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); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
slUserFaceimg.setFaceFeatureData(feature); slUserFaceimg.setFaceFeatureData(feature);
} }
} else {
continue;
} }
slUserFaceimg.setFaceStatus("1"); slUserFaceimg.setFaceStatus("1");
slUserFaceimg.setCardNumber(cardNo); slUserFaceimg.setCardNumber(cardNo);
@@ -411,7 +413,7 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
} }
//此方法是为了更新人脸特征数据 , 因为初始化数据 进去的人脸特征识别有问题, 现通过程序重新识别生成特征码并更新 //此方法是为了更新人脸特征数据 , 因为初始化数据 进去的人脸特征识别有问题, 现通过程序重新识别生成特征码并更新
@Override @Override
public String updateAllUserFaceImg(Integer type){ public Result<String> updateAllUserFaceImg(Integer type){
if(type == 1){ if(type == 1){
//正式员工人脸表 //正式员工人脸表
@@ -436,11 +438,13 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
swUserFaceimg.setFaceFeatureData(feature); swUserFaceimg.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
} }
this.updateBatchById(list); this.updateBatchById(list);
} }
return "此次操作更新人脸主表数据"+ list.size()+"条数据"; return Result.OK("此次操作更新人脸主表数据"+ list.size()+"条数据");
}else { }else {
//子用户 //子用户
//正式员工人脸表 //正式员工人脸表
@@ -464,11 +468,13 @@ public class SwUserFaceimgServiceImpl extends ServiceImpl<SwUserFaceimgMapper, S
byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo); byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
faceimgSub.setFaceFeatureData(feature); faceimgSub.setFaceFeatureData(feature);
} }
} else {
return Result.error("人脸特征码提取失败!");
} }
} }
swUserFaceimgSubService.updateBatchById(subList); 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 org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@@ -39,48 +40,82 @@ public class SysPayDepartServiceImpl extends ServiceImpl<SysPayDepartMapper, Sys
*/ */
@Override @Override
public List<String> getAllCascadeDeptIds(String deptId) { public List<String> getAllCascadeDeptIds(String deptId) {
List<String> allDeptIds = new ArrayList<>();
if (deptId == null) { if (deptId == null) {
return allDeptIds; return Collections.emptyList();
}
// 从目标部门开始递归查询
recursiveQueryDeptIds(deptId, allDeptIds);
return allDeptIds;
} }
/** // 1. 一次性查询所有有效部门
* 递归查询部门ID及其所有子部门ID List<SysPayDepart> allDepts = this.list(new LambdaQueryWrapper<SysPayDepart>()
* @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")); .eq(SysPayDepart::getDelFlag, "0"));
if (currentDept != null) { // 2. 构建部门父子关系Map
result.add(deptId); Map<String, List<String>> parentToChildrenMap = allDepts.stream()
} else { .collect(Collectors.groupingBy(
// 当前部门不存在或已删除,终止递归 SysPayDepart::getParentId,
return; Collectors.mapping(SysPayDepart::getId, Collectors.toList())
} ));
// 3. 在内存中递归查找
List<String> result = new ArrayList<>();
recursiveFindDeptIds(deptId, parentToChildrenMap, result);
return result;
} }
// 2. 查询当前部门的直接子部门 private void recursiveFindDeptIds(String currentDeptId,
List<SysPayDepart> childDepts = this.list(new LambdaQueryWrapper<SysPayDepart>() Map<String, List<String>> parentToChildrenMap,
.eq(SysPayDepart::getParentId, deptId) List<String> result) {
.eq(SysPayDepart::getDelFlag, "0")); result.add(currentDeptId);
List<String> children = parentToChildrenMap.get(currentDeptId);
// 3. 对每个子部门递归查询其下属部门 if (children != null) {
for (SysPayDepart child : childDepts) { for (String childId : children) {
String childId = child.getId(); recursiveFindDeptIds(childId, parentToChildrenMap, result);
// 递归处理子部门,会自动添加子部门及其下级
recursiveQueryDeptIds(childId, 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 connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
datasource: datasource:
master: 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 username: root
password: 123qwe!@#P@ssw0rd password: 123qwe!@#P@ssw0rd
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
@@ -289,9 +289,9 @@ third-app:
# 虹软人脸识别(WIN和UNIX的sdkKey不一致,需要切换) 激活码需要配置 # 虹软人脸识别(WIN和UNIX的sdkKey不一致,需要切换) 激活码需要配置
face: face:
# windows # windows
appId: 3RX8bPDaEx3ZLYrxKEZ9F8hT5cqTma49AoeQhTMW8Wvg appId: 5fiiFa6fTSRhDbiarBSMGVS1hEkDyMQLYyBgn97EzZyb
sdkKey: CsNxFiPekJAyuQRjwY3c918ARVEEyCyzuvmMwWDUAjsF sdkKey: 3QndXfNCsoUM5hDyzSw2a3j7Ke3eL4J9by1yKfUsQJSC
activeKey: 86L1-11ZG-412Q-XKLB activeKey: 86L1-11Z4-61B4-AEQ1
libPath: ./facelib libPath: ./facelib
detect: detect:
pool: pool: