From b408554bdb14616781a6ef3ef904226649993099 Mon Sep 17 00:00:00 2001 From: hanrenchun Date: Wed, 8 Apr 2026 10:10:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E7=A5=A8=20=E7=A7=AF=E5=88=86=20?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseCouponInfoController.java | 174 ++++++++++++++++++ .../controller/BaseInvoiceInfoController.java | 68 +++++++ .../controller/ParkingBillInfoController.java | 3 + .../controller/ParkingScoreController.java | 34 ++-- .../controller/SmallProgramController.java | 150 ++++++++++++--- .../ruoyi/database/domain/BaseCouponInfo.java | 113 ++++++++++++ .../database/domain/BaseCustomerInfo.java | 2 +- .../database/domain/BaseInvoiceInfo.java | 162 ++++++++++++++++ .../com/ruoyi/database/domain/PayFees.java | 4 + .../domain/dto/BaseInvoiceInfoDto.java | 69 +++++++ .../database/domain/dto/InvoiceRequest.java | 77 ++++++++ .../domain/dto/InvoiceRequestData.java | 15 ++ .../database/domain/dto/ReceiveCouponDto.java | 13 ++ .../database/domain/vo/ParkingBillInfoVO.java | 6 + .../com/ruoyi/database/enums/PayType.java | 3 +- .../database/mapper/BaseCouponInfoMapper.java | 20 ++ .../mapper/BaseInvoiceInfoMapper.java | 20 ++ .../service/BaseCouponInfoService.java | 18 ++ .../service/BaseInvoiceInfoService.java | 18 ++ .../service/ParkingPointsService.java | 60 +++++- .../impl/BaseCouponInfoServiceImpl.java | 25 +++ .../impl/BaseInvoiceInfoServiceImpl.java | 23 +++ .../com/ruoyi/database/util/EncryptUtils.java | 75 ++++++++ .../com/ruoyi/database/util/InvoiceUtil.java | 97 ++++++++++ .../ruoyi/database/util/MoneyFormatUtil.java | 22 +++ 25 files changed, 1216 insertions(+), 55 deletions(-) create mode 100644 gather-app/src/main/java/com/ruoyi/database/controller/BaseCouponInfoController.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/controller/BaseInvoiceInfoController.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/BaseCouponInfo.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/BaseInvoiceInfo.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/dto/BaseInvoiceInfoDto.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequest.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequestData.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/domain/dto/ReceiveCouponDto.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/mapper/BaseCouponInfoMapper.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/mapper/BaseInvoiceInfoMapper.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/service/BaseCouponInfoService.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/service/BaseInvoiceInfoService.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/service/impl/BaseCouponInfoServiceImpl.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/service/impl/BaseInvoiceInfoServiceImpl.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/util/EncryptUtils.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/util/InvoiceUtil.java create mode 100644 gather-app/src/main/java/com/ruoyi/database/util/MoneyFormatUtil.java diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/BaseCouponInfoController.java b/gather-app/src/main/java/com/ruoyi/database/controller/BaseCouponInfoController.java new file mode 100644 index 0000000..99cf54b --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/controller/BaseCouponInfoController.java @@ -0,0 +1,174 @@ +package com.ruoyi.database.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUserByPhone; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.database.domain.BaseCouponInfo; +import com.ruoyi.database.domain.dto.ReceiveCouponDto; +import com.ruoyi.database.service.BaseCouponInfoService; +import com.ruoyi.database.util.MoneyFormatUtil; +import com.ruoyi.framework.web.service.TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.util.Date; + +import java.util.List; + +/** + * 优惠卷基础信息表(BaseCouponInfo)Controller + * + * @author hanrenchun + * @since 2026-04-03 18:09:43 + */ +@RequestMapping("/BaseCouponInfo") +@Api(tags = "优惠卷基础信息") +@RestController +@RequiredArgsConstructor +public class BaseCouponInfoController extends BaseController { + + private final BaseCouponInfoService baseCouponInfoService; + private final TokenService tokenService; + + @GetMapping + @ApiOperation("查询优惠卷基础信息表") + public TableDataInfo list(BaseCouponInfo baseCouponInfo) { + startPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(baseCouponInfo); + List list = baseCouponInfoService.list(queryWrapper); + long size = baseCouponInfoService.count(queryWrapper); + return getDataTableEnhance(list, size); + } + + @PostMapping + @ApiOperation("新增优惠卷基础信息表") + @Log(title = "优惠卷基础信息表", businessType = BusinessType.INSERT) + public AjaxResult insert(@RequestBody BaseCouponInfo baseCouponInfo) { + return toAjax(baseCouponInfoService.save(baseCouponInfo)); + } + + @PutMapping + @ApiOperation("修改优惠卷基础信息表") + @Log(title = "优惠卷基础信息表", businessType = BusinessType.UPDATE) + public AjaxResult update(@RequestBody BaseCouponInfo baseCouponInfo) { + return toAjax(baseCouponInfoService.updateById(baseCouponInfo)); + } + + @DeleteMapping + @ApiOperation("删除优惠卷基础信息表") + @Log(title = "优惠卷基础信息表", businessType = BusinessType.DELETE) + public AjaxResult delete(@RequestParam("idList") List idList) { + return toAjax(baseCouponInfoService.removeByIds(idList)); + } + + + @GetMapping("/byOrderId") + @ApiOperation("根据订单id查询优惠劵领取状态") + public AjaxResult getBaseCouponInfo(@RequestParam String orderId, HttpServletRequest request) { + LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); + if (loginUserByPhone == null) { + return AjaxResult.error("用户未登录"); + } +// if (amount.compareTo(new BigDecimal(300)) < 0) { +// BaseCouponInfo couponInfo = new BaseCouponInfo(); +// couponInfo.setOrderId(orderId); +// couponInfo.setReceiveState(false); +// return AjaxResult.success(couponInfo); +// } + BaseCouponInfo baseCouponInfo = baseCouponInfoService.lambdaQuery() + .eq(BaseCouponInfo::getOrderId, orderId) + .last("LIMIT 1") + .one(); + + if (baseCouponInfo == null) { + BaseCouponInfo couponInfo = new BaseCouponInfo(); + couponInfo.setOrderId(orderId); +// couponInfo.setOrderAmount(amount); + couponInfo.setReceiveState(true); + couponInfo.setDiscountAmount(new BigDecimal("20.00")); + couponInfo.setDiscountAmountCn(MoneyFormatUtil.formatMoney(couponInfo.getDiscountAmount())); +// couponInfo.setOrderAmountCn(MoneyFormatUtil.formatMoney(amount)); + baseCouponInfoService.save(couponInfo); + return AjaxResult.success(couponInfo); + } + + baseCouponInfo.setDiscountAmountCn(MoneyFormatUtil.formatMoney(baseCouponInfo.getDiscountAmount())); +// baseCouponInfo.setOrderAmountCn(MoneyFormatUtil.formatMoney(amount)); + return AjaxResult.success(baseCouponInfo); + + } + + + @PostMapping("/receive") + @ApiOperation("领取优惠卷") + public AjaxResult receive(@RequestParam String orderId, @RequestParam String plateNo, HttpServletRequest request) { + LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); + if (loginUserByPhone == null) { + return AjaxResult.error("用户未登录"); + } + + BaseCouponInfo one = baseCouponInfoService.lambdaQuery() + .eq(BaseCouponInfo::getOrderId, orderId) + .one(); + if (one == null){ + BaseCouponInfo couponInfo = new BaseCouponInfo(); + couponInfo.setOrderId(orderId); +// couponInfo.setOrderAmount(amount); + couponInfo.setReceiveState(false); + couponInfo.setPhone(loginUserByPhone.getPhone()); + couponInfo.setDiscountAmount(new BigDecimal("20.00")); + couponInfo.setReceiveTime(System.currentTimeMillis() / 1000L); + couponInfo.setPlateNo(plateNo); + couponInfo.setDiscountAmountCn(MoneyFormatUtil.formatMoney(couponInfo.getDiscountAmount())); +// couponInfo.setOrderAmountCn(MoneyFormatUtil.formatMoney(amount)); + baseCouponInfoService.save(couponInfo); + return AjaxResult.success(couponInfo); + } + if (one.isReceiveState()){ + one.setReceiveState(false); + }else { + return AjaxResult.error("该优惠卷已被领取"); + } + one.setPlateNo(plateNo); + one.setPhone(loginUserByPhone.getPhone()); + one.setReceiveTime(System.currentTimeMillis() / 1000L); + boolean b = baseCouponInfoService.updateById(one); + if (b){ + return AjaxResult.success(one); + }else { + return AjaxResult.error("领取失败,稍后在试"); + } + + } + + + public static void main(String[] args) { + BigDecimal num1 = new BigDecimal("123.45"); + BigDecimal num2 = new BigDecimal("123.45"); + BigDecimal num3 = new BigDecimal("456.78"); + + // 比较num1和num2 + int result1 = num1.compareTo(num2); + System.out.println("num1 和 num2 的比较结果: " + result1); // 输出0,因为它们相等 + + // 比较num1和num3 + int result2 = num1.compareTo(num3); + System.out.println("num1 和 num3 的比较结果: " + result2); // 输出负值,因为num1小于num3 + + // 比较num3和num1 + int result3 = num3.compareTo(num1); + System.out.println("num3 和 num1 的比较结果: " + result3); // 输出正值,因为num3大于num1 + } + + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/BaseInvoiceInfoController.java b/gather-app/src/main/java/com/ruoyi/database/controller/BaseInvoiceInfoController.java new file mode 100644 index 0000000..d141997 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/controller/BaseInvoiceInfoController.java @@ -0,0 +1,68 @@ +package com.ruoyi.database.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUserByPhone; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.bean.BeanUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.database.domain.BaseInvoiceInfo; +import com.ruoyi.database.domain.dto.BaseInvoiceInfoDto; +import com.ruoyi.database.service.BaseInvoiceInfoService; +import com.ruoyi.framework.web.service.TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; + +import java.util.List; + +/** + * 发票信息表(BaseInvoiceInfo)Controller + * + * @author hanrenchun + * @since 2026-04-08 09:26:38 + */ +@RequestMapping("/BaseInvoiceInfo") +@Api(tags = "发票信息") +@RestController +@RequiredArgsConstructor +public class BaseInvoiceInfoController extends BaseController { + + private final BaseInvoiceInfoService baseInvoiceInfoService; + private final TokenService tokenService; + + @GetMapping + @ApiOperation("查询当前已开发票信息") + public TableDataInfo list(BaseInvoiceInfo baseInvoiceInfo, HttpServletRequest request) { + LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); + QueryWrapper queryWrapper = new QueryWrapper<>(baseInvoiceInfo); + queryWrapper.eq("user_phone",loginUserByPhone.getPhone()); + PageUtils.startPage(); + List list = baseInvoiceInfoService.list(queryWrapper); + long size = baseInvoiceInfoService.count(queryWrapper); + return getDataTableEnhance(list, size); + } + + + + @PostMapping + @ApiOperation("新增发票开票任务") + public AjaxResult insert(@RequestBody BaseInvoiceInfoDto baseInvoiceInfo, HttpServletRequest request) { + BaseInvoiceInfo invoiceInfo = new BaseInvoiceInfo(); + BeanUtils.copyProperties(baseInvoiceInfo,invoiceInfo); + invoiceInfo.setInvoiceTypeCode(0); + invoiceInfo.setPriceTaxMark(1); + return toAjax(baseInvoiceInfoService.save(invoiceInfo)); + } + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/ParkingBillInfoController.java b/gather-app/src/main/java/com/ruoyi/database/controller/ParkingBillInfoController.java index 568be3b..f1fef8b 100644 --- a/gather-app/src/main/java/com/ruoyi/database/controller/ParkingBillInfoController.java +++ b/gather-app/src/main/java/com/ruoyi/database/controller/ParkingBillInfoController.java @@ -72,8 +72,11 @@ public class ParkingBillInfoController extends BaseController { ParkingBillInfoVO parkingBillInfoVO = new ParkingBillInfoVO(); BeanUtils.copyProperties(b, parkingBillInfoVO); parkingBillInfoVO.setTotalCostYuan(b.getTotalCostYuan().toString() + "元"); + parkingBillInfoVO.setTotalCost(b.getTotalCostYuan()); parkingBillInfoVO.setPayMoneyYuan(b.getPayMoneyYuan().toString() + "元"); + parkingBillInfoVO.setPayMoney(b.getPayMoneyYuan()); parkingBillInfoVO.setDeductMoneyYuan(b.getDeductMoneyYuan().toString() + "元"); + parkingBillInfoVO.setDeductMoney(b.getDeductMoneyYuan()); parkingBillInfoVO.setParkPeriodTime(minutesToDHMS(b.getParkPeriodTime())); parkingBillInfoVOS.add(parkingBillInfoVO); }); diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/ParkingScoreController.java b/gather-app/src/main/java/com/ruoyi/database/controller/ParkingScoreController.java index 7df43da..a77c577 100644 --- a/gather-app/src/main/java/com/ruoyi/database/controller/ParkingScoreController.java +++ b/gather-app/src/main/java/com/ruoyi/database/controller/ParkingScoreController.java @@ -12,25 +12,25 @@ import org.springframework.web.bind.annotation.RestController; * @Author lijingtong * @Date 2026-01-19 */ -@RestController -@RequestMapping("/ParkingScore") -@Api(tags = "积分") -@RequiredArgsConstructor +//@RestController +//@RequestMapping("/ParkingScore") +//@Api(tags = "积分") +//@RequiredArgsConstructor public class ParkingScoreController { - private final ParkingPointsService service; +// private final ParkingPointsService service; - @RequestMapping("/queryScore") - @ApiOperation("查询积分") - public String queryScore(String phone) throws Exception { - return service.queryScore(phone); - } - - - @RequestMapping("/payScore") - @ApiOperation("积分支付") - public String payScore(String phone, int money) throws Exception { - return service.payScore(phone, money); - } +// @RequestMapping("/queryScore") +// @ApiOperation("查询积分") +// public String queryScore(String phone) throws Exception { +// return service.queryScore(phone); +// } +// +// +// @RequestMapping("/payScore") +// @ApiOperation("积分支付") +// public String payScore(String phone, int money) throws Exception { +// return service.payScore(phone, money); +// } diff --git a/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java b/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java index 6e743a1..20e8a26 100644 --- a/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java +++ b/gather-app/src/main/java/com/ruoyi/database/controller/SmallProgramController.java @@ -17,6 +17,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; @@ -25,6 +27,9 @@ import java.util.Map; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; +import static com.ruoyi.database.service.ParkingPointsService.parseResponseToMap; +import static com.ruoyi.database.service.ParkingPointsService.queryScore; + @Api(tags = "小程序接口") @RestController @RequiredArgsConstructor @@ -38,7 +43,7 @@ public class SmallProgramController extends BaseController { private final ParkingBillPaymentInfoService parkingBillPaymentInfoService; private final CustomerPlateNoInfoService customerPlateNoInfoService; private final TokenService tokenService; - + private final ParkingPointsService parkingPointsService; @GetMapping("/getOrder") @@ -46,31 +51,33 @@ public class SmallProgramController extends BaseController { @Transactional public AjaxResult getOrder(String plateNo) { String trim = plateNo.trim(); - ParkingBillInfo one = parkingBillInfoService.saveOrUpdateParkingBillInfo(trim); -// ParkingBillInfo one = parkingBillInfoService.lambdaQuery() -// .eq(ParkingBillInfo::getPlateNo, plateNo) -// .orderByDesc(ParkingBillInfo::getCreateTime) -// .last("limit 1") -// .one(); +// ParkingBillInfo one = parkingBillInfoService.saveOrUpdateParkingBillInfo(trim); + ParkingBillInfo one = parkingBillInfoService.lambdaQuery() + .eq(ParkingBillInfo::getPlateNo, plateNo) + .orderByDesc(ParkingBillInfo::getCreateTime) + .last("limit 1") + .one(); if (one == null) { return AjaxResult.error("未查询到停车记录"); - }else { + } else { ParkingBillInfoVO parkingBillInfoVO = new ParkingBillInfoVO(); BeanUtils.copyProperties(one, parkingBillInfoVO); parkingBillInfoVO.setTotalCostYuan(one.getTotalCostYuan().toString() + "元"); + parkingBillInfoVO.setTotalCost(one.getTotalCostYuan()); parkingBillInfoVO.setPayMoneyYuan(one.getPayMoneyYuan().toString() + "元"); + parkingBillInfoVO.setPayMoney(one.getPayMoneyYuan()); parkingBillInfoVO.setDeductMoneyYuan(one.getDeductMoneyYuan().toString() + "元"); + parkingBillInfoVO.setDeductMoney(one.getDeductMoneyYuan()); parkingBillInfoVO.setParkPeriodTime(minutesToDHMS(one.getParkPeriodTime())); return AjaxResult.success(parkingBillInfoVO); } } - @GetMapping("/getHistoryPlateNo") @ApiOperation("历史缴费车牌列表") - public AjaxResult getHistoryOrder(HttpServletRequest request){ + public AjaxResult getHistoryOrder(HttpServletRequest request) { LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); if (loginUserByPhone == null) { return AjaxResult.error("用户未登录"); @@ -79,6 +86,8 @@ public class SmallProgramController extends BaseController { List list = parkingBillPaymentInfoService.lambdaQuery() .eq(ParkingBillPaymentInfo::getPhone, phone) .eq(ParkingBillPaymentInfo::getPayStatus, 1) + .orderByDesc(ParkingBillPaymentInfo::getCreateTime) + .last("LIMIT 100") .list(); Map> groupedByPlateNo = list.stream() .collect(Collectors.groupingBy( @@ -91,17 +100,16 @@ public class SmallProgramController extends BaseController { ParkingBillPaymentInfo parkingBillPaymentInfo = list1.get(0); Map map = new HashMap<>(); map.put("plateNo", plateNo); - map.put("plateColor",parkingBillPaymentInfo.getPlateColorCn()); + map.put("plateColor", parkingBillPaymentInfo.getPlateColorCn()); maps.add(map); } return AjaxResult.success(maps); } - @GetMapping("/getHistoryNoPayOrder") @ApiOperation("查询历史未缴费订单") - public AjaxResult getHistoryNoPayOrder(HttpServletRequest request){ + public AjaxResult getHistoryNoPayOrder(HttpServletRequest request) { LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); if (loginUserByPhone == null) { return AjaxResult.error("用户未登录"); @@ -110,7 +118,7 @@ public class SmallProgramController extends BaseController { .eq(CustomerPlateNoInfo::getPhone, loginUserByPhone.getPhone()) .list(); List collect = list.stream().map(CustomerPlateNoInfo::getPlateNo).collect(Collectors.toList()); - if (collect.isEmpty()){ + if (collect.isEmpty()) { return AjaxResult.success(collect); } List list1 = parkingBillInfoService.lambdaQuery() @@ -122,8 +130,11 @@ public class SmallProgramController extends BaseController { ParkingBillInfoVO parkingBillInfoVO = new ParkingBillInfoVO(); BeanUtils.copyProperties(b, parkingBillInfoVO); parkingBillInfoVO.setTotalCostYuan(b.getTotalCostYuan().toString() + "元"); + parkingBillInfoVO.setTotalCost(b.getTotalCostYuan()); parkingBillInfoVO.setPayMoneyYuan(b.getPayMoneyYuan().toString() + "元"); + parkingBillInfoVO.setPayMoney(b.getPayMoneyYuan()); parkingBillInfoVO.setDeductMoneyYuan(b.getDeductMoneyYuan().toString() + "元"); + parkingBillInfoVO.setDeductMoney(b.getDeductMoneyYuan()); parkingBillInfoVO.setParkPeriodTime(minutesToDHMS(b.getParkPeriodTime())); parkingBillInfoVOS.add(parkingBillInfoVO); }); @@ -131,11 +142,9 @@ public class SmallProgramController extends BaseController { } - - @GetMapping("/getBindTheVehicle") @ApiOperation("查询已绑定车辆") - public AjaxResult getBindTheVehicle(HttpServletRequest request){ + public AjaxResult getBindTheVehicle(HttpServletRequest request) { LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); if (loginUserByPhone == null) { return AjaxResult.error("用户未登录"); @@ -147,15 +156,14 @@ public class SmallProgramController extends BaseController { } - @PostMapping("/bindTheVehicle") @ApiOperation("绑定车辆") - public AjaxResult bindTheVehicle(@RequestBody BindTheVehicle bindTheVehicle,HttpServletRequest request){ + public AjaxResult bindTheVehicle(@RequestBody BindTheVehicle bindTheVehicle, HttpServletRequest request) { LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); String plateNo = bindTheVehicle.getPlateNo(); if (plateNo == null || "".equals(plateNo)) { return AjaxResult.error("绑定的车牌不能为空"); - }else{ + } else { boolean valid = LicensePlateValidator.isValid(plateNo); if (!valid) { return AjaxResult.error("绑定的车牌格式不正确"); @@ -175,11 +183,43 @@ public class SmallProgramController extends BaseController { } + @GetMapping("/getPoints") + @ApiOperation("获取当前积分") + public AjaxResult getPoints(HttpServletRequest request) { + LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); + if (loginUserByPhone == null) { + return AjaxResult.error("用户未登录"); + } + try { + String phone = loginUserByPhone.getPhone(); + String queryResult = ParkingPointsService.queryScore(phone); + + System.out.println("查询积分结果:" + queryResult); + Map stringObjectMap = parseResponseToMap(queryResult); + System.out.println(stringObjectMap); + Object score = stringObjectMap.get("score"); + BaseCustomerInfo one = baseCustomerInfoService.lambdaQuery() + .eq(BaseCustomerInfo::getPhone, phone) + .last("LIMIT 1") + .one(); + one.setIntegral(score.toString()); + boolean b = baseCustomerInfoService.updateById(one); + if (b) { + return AjaxResult.success(stringObjectMap); + }else { + return AjaxResult.error("积分功能维护中"); + } + + } catch (Exception e) { + return AjaxResult.error("积分功能维护中"); + } + } + @PostMapping("/payFees") @ApiOperation("缴费") @Transactional - public AjaxResult payFees(@RequestBody PayFees payFees,HttpServletRequest request){ + public AjaxResult payFees(@RequestBody PayFees payFees, HttpServletRequest request) throws Exception { LoginUserByPhone loginUserByPhone = tokenService.getLoginUserByPhone(request); ParkingBillInfo one = parkingBillInfoService.getById(payFees.getId()); @@ -198,6 +238,37 @@ public class SmallProgramController extends BaseController { if (one1 == null) { return AjaxResult.error("用户信息出错"); } + Integer points = payFees.getPoints(); + if (points != null && points >= 300) { + + try { + String phone = loginUserByPhone.getPhone(); + String queryResult = ParkingPointsService.queryScore(phone); + + System.out.println("查询积分结果:" + queryResult); + Map stringObjectMap = parseResponseToMap(queryResult); + System.out.println(stringObjectMap); + Object score = stringObjectMap.get("score"); + one1.setIntegral(score.toString()); + boolean b = baseCustomerInfoService.updateById(one1); + if (b) { +// String integral = one1.getIntegral(); + int i = calculateDeductPoints(points); + BigDecimal bigDecimal = pointsToAmount(i); + one.setDeductMoney(Integer.valueOf(bigDecimal.multiply(new BigDecimal("100")).setScale(0, RoundingMode.DOWN).toString())); + one.setDeductMoneyYuan(bigDecimal); + one.setPayMoney(Integer.valueOf(one.getPayMoneyYuan().subtract(bigDecimal).multiply(new BigDecimal("100")).setScale(0, RoundingMode.DOWN).toString())); + one.setPayMoneyYuan(one.getPayMoneyYuan().subtract(bigDecimal)); + + }else { + return AjaxResult.error("积分功能维护中"); + } + + } catch (Exception e) { + return AjaxResult.error("积分功能维护中"); + } +// points + } String openId = null; String userId = null; PayType payType = PayType.getByCode(payFees.getPayType()); @@ -226,7 +297,7 @@ public class SmallProgramController extends BaseController { boolean b = parkingBillPaymentInfoService.saveOrUpdate(parkingBillPaymentInfo); if (b) { return AjaxResult.success(order); - }else { + } else { return AjaxResult.error("创建订单出错"); } @@ -234,9 +305,30 @@ public class SmallProgramController extends BaseController { } + /** + * 计算可扣除积分(只取300的整数倍,不足不扣) + */ + private int calculateDeductPoints(Integer userAvailablePoints) { + if (userAvailablePoints == null || userAvailablePoints < 300) { + return 0; + } + // 只保留 300 的整数倍,例如 800 → 600 + return (userAvailablePoints / 300) * 300; + } + + /** + * 积分转抵扣金额 300积分 = 1元 + */ + private BigDecimal pointsToAmount(int deductPoints) { + if (deductPoints <= 0) return BigDecimal.ZERO; + return new BigDecimal(deductPoints).divide(new BigDecimal(300), 2, RoundingMode.DOWN); + } + + /** * 创建支付宝 微信 订单 + * * @param payFees * @param orderId * @param openId @@ -249,18 +341,22 @@ public class SmallProgramController extends BaseController { String openId, ParkingBillInfo parkingBillInfo, String clientIp, - String userId) { + String userId) throws Exception { PayType payType = PayType.getByCode(payFees.getPayType()); switch (payType) { case WECHAT: return wechatMiniProgramPayService.createJsapiOrder( - openId,orderId,parkingBillInfo.getPayMoney(), - "常客隆智慧停车缴费",clientIp); + openId, orderId, parkingBillInfo.getPayMoney(), + "常客隆智慧停车缴费", clientIp); case ALIPAY: return alipayService.createOrder(orderId, parkingBillInfo.getPayMoneyYuan().toString(), - "常客隆智慧停车缴费",openId,userId); + "常客隆智慧停车缴费", openId, userId); +// case POINTS: +// String payScore = parkingPointsService.payScore("", 1); +// +// return ; default: throw new IllegalArgumentException("不支持的登录方式: " + payType); @@ -268,8 +364,6 @@ public class SmallProgramController extends BaseController { } - - public static String generate(String phone) { // 1. 参数校验 if (phone == null || phone.length() < 4) { diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/BaseCouponInfo.java b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCouponInfo.java new file mode 100644 index 0000000..7b451c2 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCouponInfo.java @@ -0,0 +1,113 @@ +package com.ruoyi.database.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +import java.util.List; + + +/** + * 优惠卷基础信息表(BaseCouponInfo) + * + * @author hanrenchun + * @since 2026-04-03 18:09:42 + */ + + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName(value = "base_coupon_info") +@ApiModel(value = "BaseCouponInfo", description = "优惠卷基础信息表") +public class BaseCouponInfo extends BaseEntity { + /** + * 主键 + */ + @ApiModelProperty("主键") + @Excel(name = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + + /** + * 订单id + */ + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private String orderId; + + /** + * 手机号 + */ + @ApiModelProperty("手机号") + @Excel(name = "手机号") + private String phone; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + @Excel(name = "用户id") + private Long userId; + + + @ApiModelProperty("领取状态") + @Excel(name = "领取状态") + private boolean receiveState; + + + @ApiModelProperty("优惠金额") + @Excel(name = "优惠金额") + private BigDecimal discountAmount; + + @TableField(exist = false) + private String discountAmountCn; + + @ApiModelProperty("订单金额") + @Excel(name = "订单金额") + private BigDecimal orderAmount; + + @TableField(exist = false) + private String orderAmountCn; + + + + @ApiModelProperty("使用时间") + @Excel(name = "使用时间") + private Long useTime; + @TableField(exist = false) + private String useTimeCn; + + + @ApiModelProperty("使用状态") + @Excel(name = "使用状态") + private Integer useState; + @TableField(exist = false) + private String useStateCn; + + + + @ApiModelProperty("领取时间") + @Excel(name = "领取时间") + private Long receiveTime; + @TableField(exist = false) + private String receiveTimeCn; + + + @ApiModelProperty("车牌号") + private String plateNo; + + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java index 61c22b7..dc1107b 100644 --- a/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java +++ b/gather-app/src/main/java/com/ruoyi/database/domain/BaseCustomerInfo.java @@ -110,7 +110,7 @@ public class BaseCustomerInfo { */ @ApiModelProperty("积分") @Excel(name = "积分") - private Long integral; + private String integral; /** * 会员等级 diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/BaseInvoiceInfo.java b/gather-app/src/main/java/com/ruoyi/database/domain/BaseInvoiceInfo.java new file mode 100644 index 0000000..7a067c8 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/BaseInvoiceInfo.java @@ -0,0 +1,162 @@ +package com.ruoyi.database.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +import java.util.List; + + +/** + * 发票信息表(BaseInvoiceInfo) + * + * @author hanrenchun + * @since 2026-04-08 09:34:39 + */ + + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName(value = "base_invoice_info") +@ApiModel(value = "BaseInvoiceInfo", description = "发票信息表") +public class BaseInvoiceInfo extends BaseEntity { + /** + * 主键 + */ + @ApiModelProperty("主键") + @Excel(name = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 记录唯一标识 + */ + @ApiModelProperty("记录唯一标识") + @Excel(name = "记录唯一标识") + private String inUnid; + + /** + * 发票下载地址 + */ + @ApiModelProperty("发票下载地址") + @Excel(name = "发票下载地址") + private String pdfUrl; + + /** + * 开票时间 + */ + @ApiModelProperty("开票时间") + @Excel(name = "开票时间") + private Long invoiceTime; + + /** + * 发票号码 + */ + @ApiModelProperty("发票号码") + @Excel(name = "发票号码") + private String invoiceNo; + + /** + * 开票请求流水号 + */ + @ApiModelProperty("开票请求流水号") + @Excel(name = "开票请求流水号") + private String serialNo; + + /** + * 开票状态 + */ + @ApiModelProperty("开票状态") + @Excel(name = "开票状态") + private Integer isPushState; + @TableField(exist = false) + private String isPushStateCn; + + /** + * 购方名称,抬头 + */ + @ApiModelProperty("购方名称,抬头") + @Excel(name = "购方名称,抬头") + private String buyerName; + + /** + * 购方纳税识别号 + */ + @ApiModelProperty("购方纳税识别号") + @Excel(name = "购方纳税识别号") + private String buyerTaxNo; + + /** + * 购方地址 + */ + @ApiModelProperty("购方地址") + @Excel(name = "购方地址") + private String buyerAddress; + + /** + * 购方电话 + */ + @ApiModelProperty("购方电话") + @Excel(name = "购方电话") + private String buyerTelephone; + + /** + * 购方开户行 + */ + @ApiModelProperty("购方开户行") + @Excel(name = "购方开户行") + private String buyerBankName; + + /** + * 购方银行账号 + */ + @ApiModelProperty("购方银行账号") + @Excel(name = "购方银行账号") + private String buyerBankNumber; + + /** + * 发票种类:0-数电普票,1-数电专票 + */ + @ApiModelProperty("发票种类:0-数电普票,1-数电专票") + @Excel(name = "发票种类:0-数电普票,1-数电专票") + private Integer invoiceTypeCode; + + /** + * 单价含税标志:0-不含税,1-含税 + */ + @ApiModelProperty("单价含税标志:0-不含税,1-含税") + @Excel(name = "单价含税标志:0-不含税,1-含税") + private Integer priceTaxMark; + + /** + * 开票总金额(含税),2位小数 + */ + @ApiModelProperty("开票总金额(含税),2位小数") + @Excel(name = "开票总金额(含税),2位小数") + private BigDecimal totalAmount; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + + @ApiModelProperty("用户手机号") + @Excel(name = "用户手机号") + private String userPhone; + + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java b/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java index b10ee75..4db391c 100644 --- a/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java +++ b/gather-app/src/main/java/com/ruoyi/database/domain/PayFees.java @@ -15,4 +15,8 @@ public class PayFees { @ApiModelProperty("支付方式: wechat 或 alipay") @NotBlank(message = "支付方式不能为空") private String payType; + + + @ApiModelProperty("支付积分额度") + private Integer points; } diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/dto/BaseInvoiceInfoDto.java b/gather-app/src/main/java/com/ruoyi/database/domain/dto/BaseInvoiceInfoDto.java new file mode 100644 index 0000000..9edeee7 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/dto/BaseInvoiceInfoDto.java @@ -0,0 +1,69 @@ +package com.ruoyi.database.domain.dto; + +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "BaseInvoiceInfoDto") +public class BaseInvoiceInfoDto { + + + /** + * 记录唯一标识 + */ + @ApiModelProperty("记录唯一标识") + @Excel(name = "记录唯一标识") + private String inUnid; + + + /** + * 购方名称,抬头 + */ + @ApiModelProperty("购方名称,抬头") + @Excel(name = "购方名称,抬头") + private String buyerName; + + /** + * 购方纳税识别号 + */ + @ApiModelProperty("购方纳税识别号") + @Excel(name = "购方纳税识别号") + private String buyerTaxNo; + + /** + * 购方地址 + */ + @ApiModelProperty("购方地址") + @Excel(name = "购方地址") + private String buyerAddress; + + /** + * 购方电话 + */ + @ApiModelProperty("购方电话") + @Excel(name = "购方电话") + private String buyerTelephone; + + /** + * 购方开户行 + */ + @ApiModelProperty("购方开户行") + @Excel(name = "购方开户行") + private String buyerBankName; + + /** + * 购方银行账号 + */ + @ApiModelProperty("购方银行账号") + @Excel(name = "购方银行账号") + private String buyerBankNumber; + + /** + * 备注 + */ + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequest.java b/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequest.java new file mode 100644 index 0000000..e6e103c --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequest.java @@ -0,0 +1,77 @@ +package com.ruoyi.database.domain.dto; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class InvoiceRequest { + + /** + * 购方名称,抬头 + */ + private String buyerName; + + /** + * 购方纳税识别号 + */ + private String buyerTaxNo; + + /** + * 购方地址 + */ + private String buyerAddress; + + /** + * 购方电话 + */ + private String buyerTelephone; + + /** + * 购方开户行 + */ + private String buyerBankName; + + /** + * 购方银行账号 + */ + private String buyerBankNumber; + + /** + * 发票种类:0-数电普票,1-数电专票 + */ + private Integer invoiceTypeCode; + + /** + * 单价含税标志:0-不含税,1-含税 + */ + private Integer priceTaxMark; + + /** + * 开票总金额(含税),2位小数 + */ + private BigDecimal totalAmount; + + /** + * 备注 + */ + private String remark; + + /** + * 开票订单列表 + */ + private List detailList; + + @Data + public static class InvoiceDetail { + /** + * 开票订单号,唯一 + */ + private String billNo; + + /** + * 订单开票金额(含税),2位小数 + */ + private BigDecimal amount; + } +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequestData.java b/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequestData.java new file mode 100644 index 0000000..32c9bca --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/dto/InvoiceRequestData.java @@ -0,0 +1,15 @@ +package com.ruoyi.database.domain.dto; + +import lombok.Data; + +@Data +public class InvoiceRequestData { + + private String appid; + + private String data; + + private Long timestamp; + + private String sign; +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/dto/ReceiveCouponDto.java b/gather-app/src/main/java/com/ruoyi/database/domain/dto/ReceiveCouponDto.java new file mode 100644 index 0000000..73dbe8a --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/domain/dto/ReceiveCouponDto.java @@ -0,0 +1,13 @@ +package com.ruoyi.database.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ReceiveCouponDto { + + private String orderId; + + private BigDecimal amount; +} diff --git a/gather-app/src/main/java/com/ruoyi/database/domain/vo/ParkingBillInfoVO.java b/gather-app/src/main/java/com/ruoyi/database/domain/vo/ParkingBillInfoVO.java index e877c75..daa5c33 100644 --- a/gather-app/src/main/java/com/ruoyi/database/domain/vo/ParkingBillInfoVO.java +++ b/gather-app/src/main/java/com/ruoyi/database/domain/vo/ParkingBillInfoVO.java @@ -78,12 +78,18 @@ public class ParkingBillInfoVO { private String totalCostYuan; + private BigDecimal totalCost; + private String deductMoneyYuan; + private BigDecimal deductMoney; + private String payMoneyYuan; + private BigDecimal payMoney; + private String inUnid; diff --git a/gather-app/src/main/java/com/ruoyi/database/enums/PayType.java b/gather-app/src/main/java/com/ruoyi/database/enums/PayType.java index a74893f..fdad0a3 100644 --- a/gather-app/src/main/java/com/ruoyi/database/enums/PayType.java +++ b/gather-app/src/main/java/com/ruoyi/database/enums/PayType.java @@ -6,7 +6,8 @@ import lombok.Getter; @Getter public enum PayType { WECHAT("wechat", "微信支付"), - ALIPAY("alipay", "支付宝支付"); + ALIPAY("alipay", "支付宝支付"), + POINTS("points", "积分支付"); private final String code; private final String description; diff --git a/gather-app/src/main/java/com/ruoyi/database/mapper/BaseCouponInfoMapper.java b/gather-app/src/main/java/com/ruoyi/database/mapper/BaseCouponInfoMapper.java new file mode 100644 index 0000000..e12e719 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/mapper/BaseCouponInfoMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.database.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.database.domain.BaseCouponInfo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; + +import java.util.List; + +/** + * 优惠卷基础信息表(BaseCouponInfo) Mapper 接口 + * + * @author hanrenchun + * @since 2026-04-03 18:09:42 + */ +@Mapper +public interface BaseCouponInfoMapper extends BaseMapper { + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/mapper/BaseInvoiceInfoMapper.java b/gather-app/src/main/java/com/ruoyi/database/mapper/BaseInvoiceInfoMapper.java new file mode 100644 index 0000000..89fc5a9 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/mapper/BaseInvoiceInfoMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.database.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.database.domain.BaseInvoiceInfo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; + +import java.util.List; + +/** + * 发票信息表(BaseInvoiceInfo) Mapper 接口 + * + * @author hanrenchun + * @since 2026-04-08 09:26:38 + */ +@Mapper +public interface BaseInvoiceInfoMapper extends BaseMapper { + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/service/BaseCouponInfoService.java b/gather-app/src/main/java/com/ruoyi/database/service/BaseCouponInfoService.java new file mode 100644 index 0000000..58fcdb0 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/service/BaseCouponInfoService.java @@ -0,0 +1,18 @@ +package com.ruoyi.database.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.database.domain.BaseCouponInfo; + +import java.util.Date; + +import java.util.List; + +/** + * 优惠卷基础信息表(BaseCouponInfo)Service + * + * @author hanrenchun + * @since 2026-04-03 18:09:43 + */ +public interface BaseCouponInfoService extends IService { + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/service/BaseInvoiceInfoService.java b/gather-app/src/main/java/com/ruoyi/database/service/BaseInvoiceInfoService.java new file mode 100644 index 0000000..d8eefdd --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/service/BaseInvoiceInfoService.java @@ -0,0 +1,18 @@ +package com.ruoyi.database.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.database.domain.BaseInvoiceInfo; + +import java.util.Date; + +import java.util.List; + +/** + * 发票信息表(BaseInvoiceInfo)Service + * + * @author hanrenchun + * @since 2026-04-08 09:26:38 + */ +public interface BaseInvoiceInfoService extends IService { + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/service/ParkingPointsService.java b/gather-app/src/main/java/com/ruoyi/database/service/ParkingPointsService.java index 95937f2..141d880 100644 --- a/gather-app/src/main/java/com/ruoyi/database/service/ParkingPointsService.java +++ b/gather-app/src/main/java/com/ruoyi/database/service/ParkingPointsService.java @@ -9,6 +9,9 @@ import java.net.HttpURLConnection; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.Map; @Service public class ParkingPointsService { @@ -17,12 +20,13 @@ public class ParkingPointsService { private static final String TOKEN = "VAR21UEUjhHmeMqiAvA7VYvQLPn5rO2z"; private static final String QUERY_SCORE_URL = "https://yxphp.ckldzsw.com/index/score/search"; private static final String PAY_SCORE_URL = "https://yxphp.ckldzsw.com/index/score/reduce"; + private static final ObjectMapper objectMapper = new ObjectMapper(); /** * 生成签名 * 签名规则:md5(phone + timestamp + TOKEN) */ - public String generateSign(String phone, String timestamp) throws NoSuchAlgorithmException { + public static String generateSign(String phone, String timestamp) throws NoSuchAlgorithmException { String data = phone + timestamp + TOKEN; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(data.getBytes()); @@ -37,7 +41,7 @@ public class ParkingPointsService { /** * 查询积分 */ - public String queryScore(String phone) throws Exception { + public static String queryScore(String phone) throws Exception { // 生成时间戳(Unix时间戳,秒级) String timestamp = String.valueOf(System.currentTimeMillis() / 1000); // 生成签名 @@ -72,7 +76,7 @@ public class ParkingPointsService { /** * 停车积分支付 */ - public String payScore(String phone, int money) throws Exception { + public static String payScore(String phone, int money) throws Exception { // 生成时间戳(Unix时间戳,秒级) String timestamp = String.valueOf(System.currentTimeMillis() / 1000); // 生成签名 @@ -104,22 +108,62 @@ public class ParkingPointsService { return response.toString(); } - /*public static void main(String[] args) { + public static void main(String[] args) { try { // 示例:查询积分 - String phone = "15599026928"; +// String phone = "15599026928"; + String phone = "13151593507"; String queryResult = queryScore(phone); System.out.println("查询积分结果:" + queryResult); + Map stringObjectMap = parseResponseToMap(queryResult); + System.out.println(stringObjectMap); // 示例:停车积分支付(支付1积分) - String payResult = payScore(phone, 1); + String payResult = payScore(phone, 0); System.out.println("停车积分支付结果:" + payResult); - + Map stringObjectMap1 = parseResponseToMap(payResult); + System.out.println(stringObjectMap1); String queryResult1 = queryScore(phone); System.out.println("查询积分结果1:" + queryResult1); + Map stringObjectMap2 = parseResponseToMap(queryResult1); + System.out.println(stringObjectMap2); } catch (Exception e) { e.printStackTrace(); } - }*/ + } + + + + public static Map parseResponseToMap(Object response) { + try { + // 如果response本身就是Map类型 + if (response instanceof Map) { + @SuppressWarnings("unchecked") + Map map = (Map) response; + return map; + } + + // 如果response有toMap或asMap方法(假设) + try { + java.lang.reflect.Method method = response.getClass() + .getMethod("toMap"); + if (Map.class.isAssignableFrom(method.getReturnType())) { + @SuppressWarnings("unchecked") + Map map = (Map) method.invoke(response); + return map; + } + } catch (NoSuchMethodException e) { + // 方法不存在,继续尝试其他方式 + } + + // 尝试JSON解析 + String jsonString = response.toString(); + return objectMapper.readValue(jsonString, + new TypeReference>() {}); + + } catch (Exception e) { + throw new RuntimeException("Failed to parse response to Map", e); + } + } } \ No newline at end of file diff --git a/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseCouponInfoServiceImpl.java b/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseCouponInfoServiceImpl.java new file mode 100644 index 0000000..9e81b2a --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseCouponInfoServiceImpl.java @@ -0,0 +1,25 @@ +package com.ruoyi.database.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.database.domain.BaseCouponInfo; +import com.ruoyi.database.mapper.BaseCouponInfoMapper; +import com.ruoyi.database.service.BaseCouponInfoService; +import org.springframework.stereotype.Service; + +import java.util.Date; + +import java.util.List; + +/** + * 优惠卷基础信息表(BaseCouponInfo)ServiceImpl + * + * @author hanrenchun + * @since 2026-04-03 18:09:43 + */ +@Service +public class BaseCouponInfoServiceImpl extends ServiceImpl implements BaseCouponInfoService { + + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseInvoiceInfoServiceImpl.java b/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseInvoiceInfoServiceImpl.java new file mode 100644 index 0000000..0b71763 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/service/impl/BaseInvoiceInfoServiceImpl.java @@ -0,0 +1,23 @@ +package com.ruoyi.database.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.database.domain.BaseInvoiceInfo; +import com.ruoyi.database.mapper.BaseInvoiceInfoMapper; +import com.ruoyi.database.service.BaseInvoiceInfoService; +import org.springframework.stereotype.Service; + +import java.util.Date; + +import java.util.List; + +/** + * 发票信息表(BaseInvoiceInfo)ServiceImpl + * + * @author hanrenchun + * @since 2026-04-08 09:26:38 + */ +@Service +public class BaseInvoiceInfoServiceImpl extends ServiceImpl implements BaseInvoiceInfoService { + + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/util/EncryptUtils.java b/gather-app/src/main/java/com/ruoyi/database/util/EncryptUtils.java new file mode 100644 index 0000000..0e29077 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/util/EncryptUtils.java @@ -0,0 +1,75 @@ +package com.ruoyi.database.util; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.MessageDigest; + +public class EncryptUtils { + //AES秘钥与偏移量 + private static final String AESKEY = "1234567891234567"; + private static final String INITVECTOR = "1234567891234567"; + //MD5签名Token + private static final String MD5TOKEN = "123456789"; + + //AES加密 "UTF-8" + public static String encrypt(String value,String charset) { + try { + IvParameterSpec iv = new IvParameterSpec(INITVECTOR.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(AESKEY.getBytes(charset), "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + + byte[] encrypted = cipher.doFinal(value.getBytes()); + return Base64.encodeBase64String(encrypted); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //AES解密 "UTF-8" + public static String decrypt(String encrypted,String charset) { + try { + IvParameterSpec iv = new IvParameterSpec(INITVECTOR.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(AESKEY.getBytes(charset), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted)); + return new String(original,charset); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + //MD5签名 + public static String getMd5(String plainText) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(plainText.getBytes()); + byte b[] = md.digest(); + int i; + + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + // 32位加密 + return buf.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/util/InvoiceUtil.java b/gather-app/src/main/java/com/ruoyi/database/util/InvoiceUtil.java new file mode 100644 index 0000000..a448bc2 --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/util/InvoiceUtil.java @@ -0,0 +1,97 @@ +package com.ruoyi.database.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.database.domain.dto.InvoiceRequest; +import com.ruoyi.database.domain.dto.InvoiceRequestData; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +/** + * 发票对接 + */ +public class InvoiceUtil { + + + private static final String API_URL = "http://58.210.14.10:9300/ckl/einvoice/api/issue"; + + + public static void main(String[] args) throws JsonProcessingException { + String appid = "0c091ef6-a30b-4022-9cb3-e105429c397c"; + ObjectMapper objectMapper = new ObjectMapper(); + InvoiceRequest invoiceRequest = new InvoiceRequest(); + invoiceRequest.setBuyerName("个人"); + invoiceRequest.setBuyerTaxNo("91110108MA00XXXXXX"); + invoiceRequest.setPriceTaxMark(1); + invoiceRequest.setTotalAmount(new BigDecimal(100.00)); + InvoiceRequest.InvoiceDetail invoiceDetail = new InvoiceRequest.InvoiceDetail(); + ArrayList invoiceDetails = new ArrayList<>(); + invoiceDetail.setAmount(new BigDecimal(100.00)); + invoiceDetail.setBillNo("3012512122CZWSUFLKU8I"); + invoiceDetails.add(invoiceDetail); + invoiceRequest.setDetailList(invoiceDetails); + String compactJsonStr = objectMapper.writeValueAsString(invoiceRequest); + System.out.println( "JSON字符串:" + compactJsonStr); + String encrypt = EncryptUtils.encrypt(compactJsonStr, "UTF-8"); + System.out.println( "加密字符串:" + encrypt); + long timestamp = System.currentTimeMillis() / 1000L; + + String aaa ="appid=" + appid + "&data=" + encrypt + "×tamp=" + timestamp + "&token=123456789"; + System.out.println("拼接字符串:" + aaa); + + String md5 = EncryptUtils.getMd5(aaa); + System.out.println("md5字符串:" + md5); + + InvoiceRequestData invoiceRequestData = new InvoiceRequestData(); + invoiceRequestData.setData(encrypt); + invoiceRequestData.setAppid(appid); + invoiceRequestData.setSign(md5); + invoiceRequestData.setTimestamp(timestamp); + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + + // 2. 创建 POST 请求 + HttpPost httpPost = new HttpPost(API_URL); + + // 3. 设置请求头 + httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); + + // 转为 JSON 字符串 + String jsonBody = objectMapper.writeValueAsString(invoiceRequestData); + StringEntity entity = new StringEntity(jsonBody, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + + // 5. 执行请求 + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + // 6. 处理响应 + int statusCode = response.getStatusLine().getStatusCode(); + HttpEntity responseEntity = response.getEntity(); + String responseBody = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8); + + if (statusCode >= 200 && statusCode < 300) { + System.out.println("接口调用成功!"); + System.out.println("响应状态码:" + statusCode); + System.out.println("响应体:" + responseBody); + } else { + System.out.println("接口调用失败,状态码:" + statusCode); + System.out.println("错误响应体:" + responseBody); + } + } + + } catch (Exception e) { + System.err.println("接口调用异常:" + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/gather-app/src/main/java/com/ruoyi/database/util/MoneyFormatUtil.java b/gather-app/src/main/java/com/ruoyi/database/util/MoneyFormatUtil.java new file mode 100644 index 0000000..715f19d --- /dev/null +++ b/gather-app/src/main/java/com/ruoyi/database/util/MoneyFormatUtil.java @@ -0,0 +1,22 @@ +package com.ruoyi.database.util; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +public class MoneyFormatUtil { + + private static final DecimalFormat NORMAL_FORMAT = new DecimalFormat("#.##"); + + /** + * 格式化金额为中文显示 + */ + public static String formatMoney(BigDecimal amount) { + if (amount == null) { + return "0元"; + } + // 去掉末尾多余的0 + String num = NORMAL_FORMAT.format(amount); + return num + "元"; + } + +}