From 2f132f8edc1921036d4a2a44f55ba632e156e4e3 Mon Sep 17 00:00:00 2001 From: lizhenhua <1075222162@qq.com> Date: Mon, 27 Oct 2025 09:43:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=8A=9F=E8=83=BD=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/reportforms/beans/OrgConsume.java | 1 + .../reportforms/beans/ReportOrderInfoVo.java | 3 +- .../controller/reportformsController.java | 38 +++- .../reportforms/mapper/OrgConsumeMapper.java | 7 +- .../service/impl/reportformsServiceImpl.java | 165 +++++++++++++--- .../service/reportformsService.java | 9 +- .../mapper/reportforms/OrgConsumerMapper.xml | 186 ++++++++++-------- .../mapper/reportforms/placeMapper.xml | 8 +- 8 files changed, 296 insertions(+), 121 deletions(-) diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/OrgConsume.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/OrgConsume.java index 33f1326e..d39ce111 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/OrgConsume.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/OrgConsume.java @@ -12,6 +12,7 @@ public class OrgConsume { private BigDecimal canteenAmount = BigDecimal.ZERO; // 食堂消费 private BigDecimal superAmount = BigDecimal.ZERO; // 超市消费 private BigDecimal deductionAmount = BigDecimal.ZERO; // 补扣消费 + private BigDecimal teabreakAmount = BigDecimal.ZERO; // 茶歇消费 //H5消费 private BigDecimal h5Amount = BigDecimal.ZERO; private BigDecimal amount= BigDecimal.ZERO; //详情中都用这个字段做消费 diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/ReportOrderInfoVo.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/ReportOrderInfoVo.java index 39de8b6a..b3f4e155 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/ReportOrderInfoVo.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/beans/ReportOrderInfoVo.java @@ -11,6 +11,7 @@ public class ReportOrderInfoVo extends BaseEntity { private String startTime; private String endTime; + private int commonOrg ; // “1”表示同组织,“0”表示不同组织 private String[] selectedOrg; private String[] gzselectedOrg; @@ -29,7 +30,7 @@ public class ReportOrderInfoVo extends BaseEntity { private String orgName; @Excel(name = "所属组织") private String orgFullName; - @Excel(name = "交易余额") + @Excel(name = "交易金额") private BigDecimal payableAmount; private BigDecimal payableAmountAll; private BigDecimal realAmount; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/controller/reportformsController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/controller/reportformsController.java index 2f5b8093..0897e9bf 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/controller/reportformsController.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/controller/reportformsController.java @@ -15,9 +15,12 @@ import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.util.Set; @RestController @RequestMapping({"/api/v2/report"}) @@ -114,6 +117,8 @@ public class reportformsController extends BaseController { return service.getlistBySuperlist(orgConsume); case 5: return service.getDeductionlist(orgConsume); + case 6: + return service.getTeabreaklist(orgConsume); default: break; } @@ -155,13 +160,22 @@ public class reportformsController extends BaseController { */ @PostMapping("/getplaceList") public TableDataInfo getplaceList(@RequestBody ReportOrderInfoVo reportOrderInfoVo) { - int pageNum = reportOrderInfoVo.getPageNum() != null ? reportOrderInfoVo.getPageNum() : 1; - int pageSize = reportOrderInfoVo.getPageSize() != null ? reportOrderInfoVo.getPageSize() : 10; - int offset = (pageNum - 1) * pageSize; - int count =service.selectOrderMismatchListCount(reportOrderInfoVo); - List list = service.selectOrderMismatchList(reportOrderInfoVo, offset, pageSize); + startPage(); + List list = service.selectOrderMismatchList(reportOrderInfoVo); // 封装返回给前端 - return new TableDataInfo(list, count); + return getDataTable(list); + } + + + /** + * 异地消费汇总 + * + */ + @PostMapping("/getplacehzList") + public TableDataInfo getplacehzList(@RequestBody ReportOrderInfoVo reportOrderInfoVo) { + List list = service.selectplaceHzList(reportOrderInfoVo); + // 封装返回给前端 + return getDataTable(list); } /** * 人员报表查询导出功能 @@ -179,7 +193,7 @@ public class reportformsController extends BaseController { e.printStackTrace(); } } - + checkCommonOrg(orgConsume); // 1. 查询数据 List peoplelist = service.placeexportExcel(orgConsume); @@ -195,5 +209,15 @@ public class reportformsController extends BaseController { ExcelUtil util = new ExcelUtil<>(ReportOrderInfoVo.class); util.exportExcel(response, peoplelist, "人员导出数据详情"); } + private void checkCommonOrg(ReportOrderInfoVo vo) { + if (vo.getSelectedOrg() == null || vo.getGzselectedOrg() == null) { + vo.setCommonOrg(0); + return; + } + Set set1 = new HashSet<>(Arrays.asList(vo.getSelectedOrg())); + Set set2 = new HashSet<>(Arrays.asList(vo.getGzselectedOrg())); + + vo.setCommonOrg(set1.equals(set2) ? 1 : 0); + } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/mapper/OrgConsumeMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/mapper/OrgConsumeMapper.java index 9e6b79da..f1b5335e 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/mapper/OrgConsumeMapper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/mapper/OrgConsumeMapper.java @@ -6,6 +6,7 @@ import com.bonus.canteen.core.reportforms.beans.CanteenOrg; import com.bonus.canteen.core.reportforms.beans.CanteenRecord; import com.bonus.canteen.core.reportforms.beans.OrgConsume; import com.bonus.canteen.core.reportforms.beans.ReportOrderInfoVo; +import io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2StreamFrame; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,13 +50,11 @@ public interface OrgConsumeMapper { List getlistForH5Special(OrgConsume orgConsume); - List selectOrderMismatchList( @Param("vo") ReportOrderInfoVo reportOrderInfoVo, @Param("offset")int offset, @Param("pageSize") int pageSize); - - // 查询总数 - int selectOrderMismatchListCount(ReportOrderInfoVo reportOrderInfoVo); + List selectOrderMismatchList( @Param("vo") ReportOrderInfoVo reportOrderInfoVo); ReportOrderInfoVo selectOrderMismatchListTotal(ReportOrderInfoVo reportOrderInfoVo); List selectAllareaOrgs(); + List getTeabreaklist(OrgConsume orgConsume); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/impl/reportformsServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/impl/reportformsServiceImpl.java index b0fd9f74..19d4db98 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/impl/reportformsServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/impl/reportformsServiceImpl.java @@ -80,7 +80,10 @@ public class reportformsServiceImpl implements reportformsService { oc.setCanteenAmount(oc.getCanteenAmount().add(amount)); } else if ("super".equals(conSource)) { oc.setSuperAmount(oc.getSuperAmount().add(amount)); - }else if("station".equals(conSource)){ + }else if("teabreak".equals(conSource)){ + oc.setTeabreakAmount(oc.getTeabreakAmount().add(amount)); + } + else if("station".equals(conSource)){ // //驿站支付sql查询无法达到目标,从子表重新查询 // oc.setH5Amount(oc.getH5Amount().add(amount)); @@ -150,28 +153,35 @@ public class reportformsServiceImpl implements reportformsService { } @Override - public List selectOrderMismatchList(ReportOrderInfoVo reportOrderInfoVo, int pageNum, int pageSize) { - List reportOrderInfoVos = mapper.selectOrderMismatchList(reportOrderInfoVo, pageNum, pageSize) - .stream() - .peek(c -> { + public List selectOrderMismatchList(ReportOrderInfoVo reportOrderInfoVo) { + // 在查询前或查询后判断 selectedOrg / gzselectedOrg + checkCommonOrg(reportOrderInfoVo); + List reportOrderInfoVos = mapper.selectOrderMismatchList(reportOrderInfoVo); + if (reportOrderInfoVos != null && !reportOrderInfoVos.isEmpty()) { + for (ReportOrderInfoVo c : reportOrderInfoVos) { + try { + // 姓名解密 if (c.getCustName() != null && !c.getCustName().isEmpty()) { - try { - c.setCustName(SM4EncryptUtils.sm4Decrypt(c.getCustName())); - if (c.getMobile() != null) { - String phone = SM4EncryptUtils.sm4Decrypt(c.getMobile()); - if (phone.length() == 11) { - phone = phone.substring(0, 3) + "****" + phone.substring(7); - } - c.setMobile(phone); - } + c.setCustName(SM4EncryptUtils.sm4Decrypt(c.getCustName())); + } - } catch (Exception e) { - e.printStackTrace(); + // 手机解密 + 脱敏 + if (c.getMobile() != null && !c.getMobile().isEmpty()) { + String phone = SM4EncryptUtils.sm4Decrypt(c.getMobile()); + if (phone.length() == 11) { + c.setMobile(phone.substring(0, 3) + "****" + phone.substring(7)); + } else { + c.setMobile(phone); } } - }) - .collect(Collectors.toList()); - // 查询全表合计 + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + + // 查询全表合计 ReportOrderInfoVo totalVo = mapper.selectOrderMismatchListTotal(reportOrderInfoVo); if (totalVo != null) { ReportOrderInfoVo totalRow = new ReportOrderInfoVo(); @@ -186,10 +196,27 @@ public class reportformsServiceImpl implements reportformsService { return reportOrderInfoVos; } + private static final String YUNJIAN_ORG_ID = "456681751578677248"; - @Override - public int selectOrderMismatchListCount(ReportOrderInfoVo reportOrderInfoVo) { - return mapper.selectOrderMismatchListCount(reportOrderInfoVo); + private void checkCommonOrg(ReportOrderInfoVo vo) { + String[] selected = vo.getSelectedOrg(); + String[] gzSelected = vo.getGzselectedOrg(); + + if (selected == null || gzSelected == null) { + vo.setCommonOrg(0); + return; + } + + Set set1 = new HashSet<>(Arrays.asList(selected)); + Set set2 = new HashSet<>(Arrays.asList(gzSelected)); + + // 特殊情况:两个集合都包含“运检分公司”ID + boolean isYunjian = set1.contains(YUNJIAN_ORG_ID) && set2.contains(YUNJIAN_ORG_ID); + + // 普通情况:两个集合完全相同 + boolean isSame = set1.equals(set2); + + vo.setCommonOrg((isSame || isYunjian) ? 1 : 0); } @Override @@ -257,7 +284,6 @@ public class reportformsServiceImpl implements reportformsService { // 去重退款记录(flowType=130,payTime相同保留第一次) Set seenPayTimes = new HashSet<>(); orgConsumes.removeIf(c -> c.getFlowType() == 130 && !seenPayTimes.add(c.getPayTime())); - return orgConsumes; } @@ -305,6 +331,7 @@ public class reportformsServiceImpl implements reportformsService { @Override public List placeexportExcel(ReportOrderInfoVo orgConsume) { + checkCommonOrg(orgConsume); List reportOrderInfoVos = placemapper.placeexportExcel(orgConsume) .stream() .peek(c -> { @@ -325,12 +352,102 @@ public class reportformsServiceImpl implements reportformsService { return reportOrderInfoVos; } + @Override + public List getTeabreaklist(OrgConsume orgConsume) { + // 使用原有的查询逻辑 + List orgConsumes = mapper.getTeabreaklist(orgConsume) + .stream() + .peek(c -> { + if (c.getCustName() != null && !c.getCustName().isEmpty()) { + try { + c.setCustName(SM4EncryptUtils.sm4Decrypt(c.getCustName())); + } catch (Exception e) { + e.printStackTrace(); + } + } + }) + .collect(Collectors.toList()); + return orgConsumes; + } + + @Override + public List selectplaceHzList(ReportOrderInfoVo reportOrderInfoVo) { + checkCommonOrg(reportOrderInfoVo); + List reportOrderInfoVos = mapper.selectOrderMismatchList(reportOrderInfoVo); + if (reportOrderInfoVos != null && !reportOrderInfoVos.isEmpty()) { + + // ========== 第一步:解密姓名和手机号 ========== + for (ReportOrderInfoVo c : reportOrderInfoVos) { + try { + // 姓名解密 + if (c.getCustName() != null && !c.getCustName().isEmpty()) { + c.setCustName(SM4EncryptUtils.sm4Decrypt(c.getCustName())); + } + + // 手机号解密 + 脱敏 + if (c.getMobile() != null && !c.getMobile().isEmpty()) { + String phone = SM4EncryptUtils.sm4Decrypt(c.getMobile()); + if (phone.length() == 11) { + c.setMobile(phone.substring(0, 3) + "****" + phone.substring(7)); + } else { + c.setMobile(phone); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + // ========== 第二步:合并“消费地与工作地相同”的数据 ========== + Map mergedMap = new LinkedHashMap<>(); + + for (ReportOrderInfoVo c : reportOrderInfoVos) { + // key = 消费地 + "_" + 工作地 + String key = (c.getAreaName() == null ? "" : c.getAreaName()) + "_" + + (c.getWorkAreaName() == null ? "" : c.getWorkAreaName()); + + if (mergedMap.containsKey(key)) { + ReportOrderInfoVo exist = mergedMap.get(key); + + // ✅ 交易次数累加(int) + exist.setTradeNum(exist.getTradeNum() + c.getTradeNum()); + + // ✅ 应付金额累加(BigDecimal) + if (exist.getPayableAmount() == null) { + exist.setPayableAmount(BigDecimal.ZERO); + } + if (c.getPayableAmount() != null) { + exist.setPayableAmount(exist.getPayableAmount().add(c.getPayableAmount())); + } + + // ✅ 实付金额累加(BigDecimal) + if (exist.getRealAmount() == null) { + exist.setRealAmount(BigDecimal.ZERO); + } + if (c.getRealAmount() != null) { + exist.setRealAmount(exist.getRealAmount().add(c.getRealAmount())); + } + + } else { + // 不存在则直接放入 map + mergedMap.put(key, c); + } + } + + // 转换为列表返回 + reportOrderInfoVos = new ArrayList<>(mergedMap.values()); + } + + return reportOrderInfoVos; + + + } + private List buildAreaTree(List list, Long parentId) { System.err.println("parentId = " + parentId); List tree = new ArrayList<>(); for (CanteenOrg org : list) { - System.err.println("orgId=" + org.getOrgId() + ", superId=" + org.getSuperId()); if ((parentId == null && org.getSuperId() == null) || (parentId != null && parentId.equals(org.getSuperId()))) { org.setChildren(buildAreaTree(list, org.getOrgId())); diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/reportformsService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/reportformsService.java index 70297e92..3bb0019e 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/reportformsService.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/reportforms/service/reportformsService.java @@ -24,12 +24,13 @@ public interface reportformsService { List getDeductionlist(OrgConsume orgConsume); - List selectOrderMismatchList(ReportOrderInfoVo reportOrderInfoVo,int pageNum, int pageSize); - - - int selectOrderMismatchListCount(ReportOrderInfoVo reportOrderInfoVo); + List selectOrderMismatchList(ReportOrderInfoVo reportOrderInfoVo); List getOrgareatree(); List placeexportExcel(ReportOrderInfoVo orgConsume); + + List getTeabreaklist(OrgConsume orgConsume); + + List selectplaceHzList(ReportOrderInfoVo reportOrderInfoVo); } diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/OrgConsumerMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/OrgConsumerMapper.xml index c7cb4524..ec417611 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/OrgConsumerMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/OrgConsumerMapper.xml @@ -3,24 +3,27 @@ - - + diff --git a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/placeMapper.xml b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/placeMapper.xml index d1ea4159..a962858f 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/placeMapper.xml +++ b/bonus-modules/bonus-smart-canteen/src/main/resources/mapper/reportforms/placeMapper.xml @@ -10,7 +10,6 @@ ANY_VALUE(org_name) AS org_name, ANY_VALUE(org_full_name) AS org_full_name, COUNT(1) AS tradeNum, - order_type, SUM(real_amount) AS payable_amount, SUM(real_amount) AS real_amount, area_name, @@ -75,7 +74,10 @@ JOIN cust_dining_place p ON p.cust_id = ci.cust_id AND p.type = 'area' LEFT JOIN alloc_area ar ON ar.area_id = a.area_id LEFT JOIN alloc_area ap ON ap.area_id = p.dining_place_id - WHERE ar.area_id != p.dining_place_id + where 1=1 + + and ar.area_id != p.dining_place_id + AND ar.area_id IN @@ -91,7 +93,7 @@ ) a - GROUP BY cust_id, area_name, work_area_name, order_type + GROUP BY cust_id, area_name, work_area_name ORDER BY MAX(a.pay_time) DESC