luodangjia
2024-10-17 0911582d2f80e7f3162fb6d0b59ee12e23de133b
Merge remote-tracking branch 'origin/master'
17个文件已修改
727 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InfoCouponDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TransactionRecord.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TransactionRecordMessage.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InfoCouponDto.java
@@ -20,6 +20,7 @@
    @TableField("name")
    private String name;
    private Integer type;
    private Integer couponId;
    @ApiModelProperty(value = "优惠方式(1=满减,2=抵扣)")
    @TableField("preferential_mode")
    private Integer preferentialMode;
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/TransactionRecord.java
@@ -20,22 +20,6 @@
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
@@ -46,6 +30,54 @@
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 电量
    private BigDecimal loss_sharp_peak_charge1;// 计损电量
    private BigDecimal sharp_peak_amount1;// 金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java
@@ -16,22 +16,6 @@
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
@@ -42,6 +26,54 @@
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 电量
    private BigDecimal loss_sharp_peak_charge1;// 计损电量
    private BigDecimal sharp_peak_amount1;// 金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -639,6 +639,7 @@
                InfoCouponDto infoCouponDto = new InfoCouponDto();
                BeanUtils.copyProperties(coupon, infoCouponDto);
                infoCouponDto.setId(tAppCoupon.getId().toString());
                infoCouponDto.setCouponId(coupon.getId());
                infoCouponDto.setEndTime(tAppCoupon.getEndTime());
                couponDtos1.add(infoCouponDto);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -38,6 +38,7 @@
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -64,6 +65,9 @@
    private WeixinProperties wxConfig;
    @Autowired
    private RestTemplate wxRestTemplate;
    @Resource
    private RedisService redisService;
    /**
     * 上传文件存储在本地的根路径
     */
@@ -77,7 +81,7 @@
    @PostMapping("/openIdByJsCode")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
        String openid = body.getOpenid();
        String sessionKey = body.getSessionKey();
@@ -114,7 +118,7 @@
    public AjaxResult getQRCode() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        String accessToken = appletTools.getAccessToken("");
        try {
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
@@ -171,7 +175,7 @@
     */
    @PostMapping("/getWXToken")
    public R<String> getWXToken(){
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig);
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        String accessToken = appletTools.getAccessToken("");
        return R.ok(accessToken);
    }
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/wx/tools/WxAppletTools.java
@@ -4,12 +4,14 @@
import com.ruoyi.account.wx.body.resp.Code2SessionRespBody;
import com.ruoyi.account.wx.body.resq.Code2SessionResqBody;
import com.ruoyi.account.wx.model.WeixinProperties;
import com.ruoyi.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;
/**
 * @author xiaochen
@@ -57,11 +59,12 @@
    public static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    private WeixinProperties wxConfig;
    private RestTemplate wxRestTemplate;
    private WxCacheTemplate<String> wxCacheTemplate;
    private RedisService redisService;
    public WxAppletTools(RestTemplate wxRestTemplate, WeixinProperties wxConfig) {
    public WxAppletTools(RestTemplate wxRestTemplate, WeixinProperties wxConfig, RedisService redisService) {
        this.wxRestTemplate = wxRestTemplate;
        this.wxConfig = wxConfig;
        this.redisService = redisService;
    }
    /**
@@ -101,7 +104,7 @@
     * @return
     */
    public String getAccessToken(String version) {
        String accessToken = wxCacheTemplate.getKey(ACCESSTOKEN_CACHE_KEY + version);
        String accessToken = redisService.getCacheObject(ACCESSTOKEN_CACHE_KEY + version);
        if (StringUtils.hasLength(accessToken)) {
            return accessToken;
        }
@@ -113,7 +116,7 @@
            // 抛出错误
            throw new WxException(accessTokenRespBody.getErrorCode() + ":" + accessTokenRespBody.getErrorMsg());
        }
        wxCacheTemplate.setKey(ACCESSTOKEN_CACHE_KEY + version, accessTokenRespBody.getAccessToken());
        redisService.setCacheObject(ACCESSTOKEN_CACHE_KEY + version, accessTokenRespBody.getAccessToken(), 7200L, TimeUnit.SECONDS);
        return accessTokenRespBody.getAccessToken();
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -114,6 +114,13 @@
        Long userId = SecurityUtils.getLoginUser().getUserid();
        dto.setUserId(userId);
        accountingStrategyService.save(dto);
        if(null != dto.getSiteId()){
            //下发硬件数据
            List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).list();
            for (TChargingPile tChargingPile : list) {
                integrationClient.setupBillingModel1(tChargingPile.getCode());
            }
        }
        // 添加明细
        dto.getAccountingStrategyDetails().forEach(detail -> detail.setAccountingStrategyId(dto.getId()));
        accountingStrategyDetailService.saveBatch(dto.getAccountingStrategyDetails());
@@ -165,6 +172,11 @@
                    detail.setId(null);
                });
                accountingStrategyDetailService.saveBatch(accountingStrategyDetails);
            }
            //下发硬件数据
            List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).list();
            for (TChargingPile tChargingPile : list) {
                integrationClient.setupBillingModel1(tChargingPile.getCode());
            }
        }else {
            // 删除计费策略明细信息
@@ -342,14 +354,11 @@
                    byId1.setAccountingStrategyId(byId.getId());
                    siteService.updateById(byId1);
                }
                //硬件
                 List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, byId.getSiteId()).list();
                List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, byId.getSiteId()).list();
                for (TChargingPile tChargingPile : list) {
                    integrationClient.setupBillingModel1(tChargingPile.getCode());
                }
            }
        }else {
            if (byId.getAuditStatus()==1){
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -318,6 +318,34 @@
        return R.ok(tParkLotRecordCountVo);
    }
    @ResponseBody
    @PostMapping(value = "/parking/work1")
    @ApiOperation(value = "停车订单统计", tags = {"管理后台-工作台"})
    public R<TParkLotRecordCountVo> work1(@RequestBody ParkingRecordQueryDto parkingRecordQueryDto){
        List<TParkingRecord> list = parkingRecordService.lambdaQuery().eq(parkingRecordQueryDto.getParkingLotId() != null, TParkingRecord::getParkingLotId, parkingRecordQueryDto.getParkingLotId())
                .between(TParkingRecord::getCreateTime, parkingRecordQueryDto.getStartTime(), parkingRecordQueryDto.getEndTime()).list();
        int count1 = list.size();
        //统计出list中chargingOrderId为null的数据个数
        int count2 = list.stream().filter(item -> item.getChargingOrderId() == null).collect(Collectors.toList()).size();
        int count3 = count1-count2;
        //计算出list中parkingDuration的总和
        int count4 = 0;
        for (TParkingRecord tParkingRecord : list) {
            count4 = count4+tParkingRecord.getParkingDuration();
        }
        //计算出list中orderAmount的总和
        BigDecimal count5 = list.stream().map(TParkingRecord::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        TParkLotRecordCountVo tParkLotRecordCountVo = new TParkLotRecordCountVo();
        tParkLotRecordCountVo.setCount1(count1);
        tParkLotRecordCountVo.setCount2(count2);
        tParkLotRecordCountVo.setCount3(count3);
        tParkLotRecordCountVo.setCount4(count4);
        tParkLotRecordCountVo.setCount5(count5);
        return R.ok(tParkLotRecordCountVo);
    }
    @ResponseBody
    @PostMapping(value = "/parking/income")
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -262,7 +262,7 @@
            //调用华为Iot删除设备
            if(StringUtils.isNotEmpty(chargingPile.getIotdDeviceId())){
                DeleteDeviceResp deviceResp = iotInterfaceClient.deleteDevice(chargingPile.getIotdDeviceId()).getData();
                if(null != deviceResp && deviceResp.getHttpStatusCode() == 201){
                if(null != deviceResp && deviceResp.getHttpStatusCode() == 0){
                    this.removeById(chargingPile);
                }
            }
@@ -320,7 +320,7 @@
    public ChargeMonitoring chargeMonitoring(Integer siteId) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == siteId){
        if(0 == siteId){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -334,12 +334,20 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    siteIds = null;
                }
            }
        }else{
            siteIds.add(siteId);
        }
        List<Site> sites = siteService.listByIds(siteIds);
        List<Site> sites = null;
        if(null == siteIds){
            sites = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
            siteIds = sites.stream().map(Site::getId).collect(Collectors.toSet());
        }else{
            sites = siteService.listByIds(siteIds);
        }
        List<TChargingGun> total = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getDelFlag, 0));
        List<TChargingGun> charging = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getStatus, 4).eq(TChargingGun::getDelFlag, 0));
        BigDecimal ratedPower = total.stream().map(TChargingGun::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -361,9 +369,9 @@
        }
        List<String> dates = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd");
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 6; i >= 0; i--) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - i);
            dates.add(sdf.format(calendar.getTime()));
        }
@@ -382,7 +390,7 @@
            if(list.size() == 0){
                value2.add(0D);
            }else{
                Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24)), new MathContext(4, RoundingMode.HALF_EVEN)).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                value2.add(datum1);
            }
        }
@@ -404,7 +412,7 @@
    public ChargingGunCountMonitoring getChargingGunCountMonitoring(Integer siteId) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == siteId){
        if(0 == siteId){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -418,6 +426,9 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
                    siteIds = list.stream().map(Site::getId).collect(Collectors.toSet());
                }
            }
        }else{
@@ -452,7 +463,7 @@
    public PageInfo<ChargingGunMonitoring> getChargingGunMonitoring(GetChargingGunMonitoring query) {
        //获取当前登录账户的站点权限数据
        Set<Integer> siteIds = new HashSet<>();
        if(null == query.getSiteId()){
        if(0 == query.getSiteId()){
            SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
            Integer roleType = sysUser.getRoleType();
            Integer objectId = sysUser.getObjectId();
@@ -466,6 +477,9 @@
                    List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
                    data.addAll(data1);
                    siteIds = new HashSet<>(data);
                }else{
                    List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
                    siteIds = list.stream().map(Site::getId).collect(Collectors.toSet());
                }
            }
        }else{
@@ -489,62 +503,60 @@
                Integer id = gunMonitoring.getId();
                //根据订单数据查询车牌号
                TChargingOrder chargingOrder = chargingOrderClient.getOrderDetailByGunId(id).getData();
                Long appUserCarId = chargingOrder.getAppUserCarId();
                if(null != appUserCarId){
                if(null != chargingOrder){
                    Long appUserCarId = chargingOrder.getAppUserCarId();
                    TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(appUserCarId)).getData().get(0);
                    gunMonitoring.setLicensePlate(tAppUserCar.getLicensePlate());
                }
                UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
                gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc()));
                gunMonitoring.setElectricQuantity(data.getCharging_degree().toString());
                gunMonitoring.setSoc(data.getSoc().toString());
                gunMonitoring.setElectricCurrent(data.getOutput_current().toString());
                gunMonitoring.setVoltage(data.getOutput_voltage().toString());
                switch (data.getHardware_fault()){
                    case 1:
                        gunMonitoring.setFaultCause("急停按钮动作故障");
                        break;
                    case 2:
                        gunMonitoring.setFaultCause("无可用整流模块");
                        break;
                    case 3:
                        gunMonitoring.setFaultCause("出风口温度过高");
                        break;
                    case 4:
                        gunMonitoring.setFaultCause("交流防雷故障");
                        break;
                    case 5:
                        gunMonitoring.setFaultCause("交直流模块 DC20 通信中断");
                        break;
                    case 6:
                        gunMonitoring.setFaultCause("绝缘检测模块 FC08 通信中断");
                        break;
                    case 7:
                        gunMonitoring.setFaultCause("电度表通信中断");
                        break;
                    case 8:
                        gunMonitoring.setFaultCause("读卡器通信中断");
                        break;
                    case 9:
                        gunMonitoring.setFaultCause("RC10 通信中断");
                        break;
                    case 10:
                        gunMonitoring.setFaultCause("风扇调速板故障");
                        break;
                    case 11:
                        gunMonitoring.setFaultCause("直流熔断器故障");
                        break;
                    case 12:
                        gunMonitoring.setFaultCause("高压接触器故障");
                        break;
                    case 13:
                        gunMonitoring.setFaultCause("门打开");
                        break;
                    UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
                    gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc()));
                    gunMonitoring.setElectricQuantity(data.getCharging_degree().toString());
                    gunMonitoring.setSoc(data.getSoc().toString());
                    gunMonitoring.setElectricCurrent(data.getOutput_current().toString());
                    gunMonitoring.setVoltage(data.getOutput_voltage().toString());
                    switch (data.getHardware_fault()){
                        case 1:
                            gunMonitoring.setFaultCause("急停按钮动作故障");
                            break;
                        case 2:
                            gunMonitoring.setFaultCause("无可用整流模块");
                            break;
                        case 3:
                            gunMonitoring.setFaultCause("出风口温度过高");
                            break;
                        case 4:
                            gunMonitoring.setFaultCause("交流防雷故障");
                            break;
                        case 5:
                            gunMonitoring.setFaultCause("交直流模块 DC20 通信中断");
                            break;
                        case 6:
                            gunMonitoring.setFaultCause("绝缘检测模块 FC08 通信中断");
                            break;
                        case 7:
                            gunMonitoring.setFaultCause("电度表通信中断");
                            break;
                        case 8:
                            gunMonitoring.setFaultCause("读卡器通信中断");
                            break;
                        case 9:
                            gunMonitoring.setFaultCause("RC10 通信中断");
                            break;
                        case 10:
                            gunMonitoring.setFaultCause("风扇调速板故障");
                            break;
                        case 11:
                            gunMonitoring.setFaultCause("直流熔断器故障");
                            break;
                        case 12:
                            gunMonitoring.setFaultCause("高压接触器故障");
                            break;
                        case 13:
                            gunMonitoring.setFaultCause("门打开");
                            break;
                    }
                }
            }
        }
        return pageInfo.setRecords(chargingGunMonitoring);
    }
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -381,9 +381,8 @@
    }
    @ApiOperation(value = "计费模型设置",tags = {"硬件接口"})
    @GetMapping(value = "/setupBillingModel")
    public R setupBillingModel(String deviceId) {
        // TODO 罗  计费模型设置
    @PostMapping(value = "/setupBillingModel")
    public R setupBillingModel(@RequestParam("deviceId") String deviceId) {
        SetupBillingModel setupBillingModel = new SetupBillingModel();
        // 计费模型
        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(deviceId).getData();
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TransactionRecordMessage.java
@@ -19,22 +19,6 @@
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
@@ -45,6 +29,54 @@
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
    private String time1;// 计费时段
    private BigDecimal sharp_peak_charge1;// 电量
    private BigDecimal loss_sharp_peak_charge1;// 计损电量
    private BigDecimal sharp_peak_amount1;// 金额
    private String time2;// 计费时段
    private BigDecimal sharp_peak_charge2;// 电量
    private BigDecimal loss_sharp_peak_charge2;// 计损电量
    private BigDecimal sharp_peak_amount2;// 金额
    private String time3;// 计费时段
    private BigDecimal sharp_peak_charge3;// 电量
    private BigDecimal loss_sharp_peak_charge3;// 计损电量
    private BigDecimal sharp_peak_amount3;// 金额
    private String time4;// 计费时段
    private BigDecimal sharp_peak_charge4;// 电量
    private BigDecimal loss_sharp_peak_charge4;// 计损电量
    private BigDecimal sharp_peak_amount4;// 金额
    private String time5;// 计费时段
    private BigDecimal sharp_peak_charge5;// 电量
    private BigDecimal loss_sharp_peak_charge5;// 计损电量
    private BigDecimal sharp_peak_amount5;// 金额
    private String time6;// 计费时段
    private BigDecimal sharp_peak_charge6;// 电量
    private BigDecimal loss_sharp_peak_charge6;// 计损电量
    private BigDecimal sharp_peak_amount6;// 金额
    private String time7;// 计费时段
    private BigDecimal sharp_peak_charge7;// 电量
    private BigDecimal loss_sharp_peak_charge7;// 计损电量
    private BigDecimal sharp_peak_amount7;// 金额
    private String time8;// 计费时段
    private BigDecimal sharp_peak_charge8;// 电量
    private BigDecimal loss_sharp_peak_charge8;// 计损电量
    private BigDecimal sharp_peak_amount8;// 金额
    private String time9;// 计费时段
    private BigDecimal sharp_peak_charge9;// 电量
    private BigDecimal loss_sharp_peak_charge9;// 计损电量
    private BigDecimal sharp_peak_amount9;// 金额
    private String time10;// 计费时段
    private BigDecimal sharp_peak_charge10;// 电量
    private BigDecimal loss_sharp_peak_charge10;// 计损电量
    private BigDecimal sharp_peak_amount10;// 金额
    private String time11;// 计费时段
    private BigDecimal sharp_peak_charge11;// 电量
    private BigDecimal loss_sharp_peak_charge11;// 计损电量
    private BigDecimal sharp_peak_amount11;// 金额
    private String time12;// 计费时段
    private BigDecimal sharp_peak_charge12;// 电量
    private BigDecimal loss_sharp_peak_charge12;// 计损电量
    private BigDecimal sharp_peak_amount12;// 金额
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -585,7 +585,7 @@
     */
    @PostMapping("/endChargeBillingCharge")
    public void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){
        log.error("-------------------停止充电返回账单后计算费用-------------------:" + vo);
        log.error("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo);
        chargingOrderService.endChargeBillingCharge(vo);
    }
    
@@ -713,7 +713,10 @@
        for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1) {
            ChargingOrderAndUploadRealTimeMonitoringDataDto dataDto = new ChargingOrderAndUploadRealTimeMonitoringDataDto();
            BeanUtils.copyProperties(uploadRealTimeMonitoringData,dataDto);
            BeanUtils.copyProperties(map.get(uploadRealTimeMonitoringData.getCharging_pile_code()),dataDto);
            TChargingOrder tChargingOrder = map.get(uploadRealTimeMonitoringData.getCharging_pile_code());
            if (tChargingOrder!=null) {
                BeanUtils.copyProperties(tChargingOrder, dataDto);
            }
            dtos.add(dataDto);
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java
@@ -13,8 +13,10 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.LongStream;
@@ -43,19 +45,20 @@
    @Override
    public List<List<Map<String, Object>>> getTotalElectricQuantity(Integer days, Set<Integer> siteIds) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        DateTimeFormatter sdf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        String startTime = sdf.format(calendar.getTime()) + " 00:00:00";
        List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5)
                .eq(TChargingOrder::getDelFlag, 0).last(" and end_time between '" + startTime + "' and DATE_FORMAT('%Y-%m-%d %H:%i:%s', now())"));
                .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')"));
        List<Long> orderId = list.stream().map(TChargingOrder::getId).collect(Collectors.toList());
        List<TChargingOrderAccountingStrategy> list1 = this.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().in(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
        
        List<List<Map<String, Object>>> list2 = new ArrayList<>();
        Calendar nowDateTime = Calendar.getInstance();
        for (int i = days; i >= 0; i--) {
            Calendar nowDateTime = Calendar.getInstance();
            nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i);
            List<TChargingOrder> collect = list.stream().filter(s -> sdf.format(s.getEndTime()).equals(sdf.format(nowDateTime.getTime()))).collect(Collectors.toList());
            List<TChargingOrder> collect = list.stream().filter(s -> s.getStartTime().format(sdf1).equals(sdf.format(nowDateTime.getTime()))).collect(Collectors.toList());
            List<Long> orderIds = collect.stream().map(TChargingOrder::getId).collect(Collectors.toList());
            
            
@@ -105,15 +108,15 @@
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days);
        String startTime = sdf.format(calendar.getTime()) + " 00:00:00";
        List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5)
                .eq(TChargingOrder::getDelFlag, 0).last(" and end_time between '" + startTime + "' and DATE_FORMAT('%Y-%m-%d %H:%i:%s', now())"));
                .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')"));
        
        List<Double> list2 = new ArrayList<>();
        Calendar nowDateTime = Calendar.getInstance();
        //遍历获取每天的数值
        for (int i = days; i >= 0; i--) {
            Calendar nowDateTime = Calendar.getInstance();
            nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i);
            //充电量
            BigDecimal reduce = list.stream().filter(s -> sdf.format(s.getEndTime()).equals(sdf.format(nowDateTime.getTime())))
            BigDecimal reduce = list.stream().filter(s -> s.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).equals(sdf.format(nowDateTime.getTime())))
                    .map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            list2.add(reduce.doubleValue());
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -65,6 +65,7 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
@@ -146,9 +147,6 @@
    @Resource
    private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
    @Resource
    private AccountingStrategyOrderClient accountingStrategyOrderClient;
    @Resource
    private AccountingStrategyClient accountingStrategyClient;
@@ -434,6 +432,7 @@
        chargingOrder.setAppUserId(userId);
        chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId());
        TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData();
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
        chargingOrder.setSiteId(tChargingGun.getSiteId());
        chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
        chargingOrder.setChargingGunId(addChargingOrder.getId());
@@ -443,6 +442,8 @@
        chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
        chargingOrder.setVipDiscount(new BigDecimal(10));
        chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
        chargingOrder.setOrderSource(0);
        chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
        
        Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
        Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
@@ -889,13 +890,11 @@
     * @return
     */
    public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){
        if("SUCCESS".equals(tradeState)){
            TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
            one.setRefundSerialNumber(refund_id);
            one.setRefundStatus(2);
            one.setRefundTime(LocalDateTime.now());
            chargingOrderRefundService.updateById(one);
        }
        TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
        one.setRefundSerialNumber(refund_id);
        one.setRefundStatus(2);
        one.setRefundTime(LocalDateTime.now());
        chargingOrderRefundService.updateById(one);
        return AjaxResult.success();
    }
@@ -965,7 +964,6 @@
            return AjaxResult.error("不能重复操作");
        }
        chargingOrder.setEndTime(LocalDateTime.now());
        chargingOrder.setStatus(4);
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        
@@ -987,6 +985,7 @@
            for (int i = 0; i < 60; i++) {
                TChargingOrder chargingOrder1 = this.getById(id);
                if(chargingOrder1.getStatus() != 3){
                    stop_status = true;
                    break;
                }
                GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
@@ -1028,24 +1027,15 @@
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    continue;
                }else{
                    log.error(code1 + ":-------------------远程停止充电请求成功-------------------");
                    stop_status = true;
                    break;
                }
                break;
            }
            if(stop_status){
                chargingOrder.setStatus(5);
                chargingOrder.setEndMode(1);
                this.updateById(chargingOrder);
                //计算用户标签
                editUserTag(chargingOrder);
                //用户推荐奖励
                referralReward(chargingOrder);
                // 将枪状态重置为空闲
                chargingGun.setStatus(2);
                chargingGunClient.updateChargingGunById(chargingGun);
            }else{
                log.error(code1 + ":-------------------远程停止充电应答最终失败-------------------");
            }
@@ -1211,17 +1201,11 @@
            }
            log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
        }else{
            order.setEndTime(LocalDateTime.now());
            order.setStatus(5);
            order.setEndMode(1);
            this.updateById(order);
            //计算用户标签
            editUserTag(order);
            //用户推荐奖励
            referralReward(order);
            // 将枪状态重置为空闲
            chargingGun.setStatus(2);
            chargingGunClient.updateChargingGunById(chargingGun);
            TChargingOrder chargingOrder = new TChargingOrder();
            chargingOrder.setId(order.getId());
            chargingOrder.setAppUserId(order.getAppUserId());
            chargingOrder.setEndMode(1);
            this.updateById(chargingOrder);
        }
    }
    
@@ -1708,6 +1692,7 @@
     * @param query
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
        if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
            //获取当前的计费策略
@@ -1744,13 +1729,21 @@
                if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
                    //已充电总度数
                    BigDecimal charging_degree = query.getCharging_degree();
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
                    BigDecimal chargingCapacity = chargingOrderAccountingStrategy.getChargingCapacity();
                    //计算本阶段充电度数
                    BigDecimal subtract = charging_degree.subtract(chargingCapacity);
                    //计算本阶段费用
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(subtract);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(subtract);
                    BigDecimal serviceCharge = originalServicePrice;
                    //计算优惠金额
                    if(null != chargingOrder.getVipDiscount()){
                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                    }
                    //将本阶段的费用增加到总费用中
                    electrovalenc = electrovalenc.add(chargingOrderAccountingStrategy.getPeriodElectricPrice());
                    originalServicePrice = originalServicePrice.add(chargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
                    serviceCharge = serviceCharge.add(chargingOrderAccountingStrategy.getPeriodServicePrice());
                    chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
@@ -1794,8 +1787,21 @@
            }
            BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(4, RoundingMode.HALF_EVEN);
            chargingOrder.setResidualAmount(residualAmount);
            BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
            chargingOrder.setChargingPower(divide);
            if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){
                BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
                chargingOrder.setChargingPower(divide);
                chargingOrder.setCurrent(query.getOutput_current());
                chargingOrder.setVoltage(query.getOutput_voltage());
                chargingOrder.setPower(query.getOutput_current().multiply(query.getOutput_voltage()));
                chargingOrder.setNeedElec(query.getOutput_current());
                TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
                chargingGun.setChargingPower(divide);
                chargingGun.setSoc(query.getSoc());
                chargingGunClient.updateChargingGunById(chargingGun);
            }
            chargingOrder.setElectricity(query.getCharging_degree());
            chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
            this.updateById(chargingOrder);
        }
    }
@@ -1808,24 +1814,12 @@
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endCharge(String orderCode, Integer endMode) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
        Integer status = chargingOrder.getStatus();
        if(status == 4 || status == 5){
            return;
        }
        chargingOrder.setStatus(5);
        TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
        TChargingOrder chargingOrder = new TChargingOrder();
        chargingOrder.setId(order.getId());
        chargingOrder.setAppUserId(order.getAppUserId());
        chargingOrder.setEndMode(endMode);
        chargingOrder.setEndTime(LocalDateTime.now());
        this.updateById(chargingOrder);
        // 将枪状态重置为空闲
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        chargingGun.setStatus(2);
        chargingGunClient.updateChargingGunById(chargingGun);
        //计算用户标签
        editUserTag(chargingOrder);
        //用户推荐奖励
        referralReward(chargingOrder);
    }
    /**
@@ -1845,21 +1839,85 @@
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
        Integer status = chargingOrder.getStatus();
        if(status == 4 || status == 5){
            return;
        }
        //计算用户标签
        editUserTag(chargingOrder);
        //用户推荐奖励
        referralReward(chargingOrder);
        //如果使用优惠券需要判断优惠券是否满足使用条件
        //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
        //退款金额=优惠券金额+剩余充电金额
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
        BigDecimal periodServicePrice_total = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
            periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
            periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
            total = total.add(periodElectricPrice).add(periodServicePrice);
        //获取订单的计费策略
        List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        for (int i = 0; i < 12; i++) {
            Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
            try {
                String time = (String) clazz.getMethod("getTime" + (i + 1)).invoke(vo);
                if(StringUtils.hasLength(time)){
                    //充电度数
                    Object invoke = clazz.getMethod("getSharp_peak_charge" + (i + 1)).invoke(vo);
                    if(null == invoke || invoke.toString().equals("0")){
                        continue;
                    }
                    BigDecimal Sharp_peak_charge = new BigDecimal(invoke.toString());
                    //充电金额
                    Object invoke1 = clazz.getMethod("getSharp_peak_amount" + (i + 1)).invoke(vo);
                    BigDecimal sharp_peak_amount = new BigDecimal(invoke1.toString());
                    String[] split = time.split("-");
                    AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.stream().filter(s -> s.getStartTime().equals(split[0]) && s.getEndTime().equals(split[1])).findFirst().get();
                    TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
                    chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
                    chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
                    chargingOrderAccountingStrategy.setType(strategyDetail.getType());
                    chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
                    chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
                    chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
                    chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
                    chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
                    //已充电总度数
                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(Sharp_peak_charge);
                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(Sharp_peak_charge);
                    BigDecimal serviceCharge = originalServicePrice;
                    //计算优惠金额
                    if(null != chargingOrder.getVipDiscount()){
                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
                    }
                    chargingOrderAccountingStrategy.setChargingCapacity(Sharp_peak_charge);
                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
                    chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
                    BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
                    periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
                    periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
                    total = total.add(periodElectricPrice).add(periodServicePrice);
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }
        //原金额
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
@@ -1897,12 +1955,24 @@
            payAmount = payAmount.subtract(discountAmount);
        }
        
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        TChargingOrder order = new TChargingOrder();
        order.setId(chargingOrder.getId());
        order.setAppUserId(chargingOrder.getAppUserId());
        if(null != chargingOrder.getEndMode() && chargingOrder.getEndMode() == 2){
            order.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setOrderAmount(orderAmount);
        chargingOrder.setVipDiscountAmount(discountAmount);
        if(null == chargingOrder.getEndMode()){
            order.setEndMode(1);
        }
        order.setResidualAmount(rechargeAmount.subtract(total));
        order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
        order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
        order.setStatus(5);
        order.setOrderAmount(orderAmount);
        order.setVipDiscountAmount(discountAmount);
        order.setServiceCharge(periodServicePrice_total);
        order.setElectrovalence(periodElectricPrice_total);
        order.setChargingCapacity(vo.getTotal_electricity());
        
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
@@ -1915,11 +1985,11 @@
                //满减
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
                    chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    order.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    order.setAppCouponId(null);
                    order.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
@@ -1930,17 +2000,27 @@
                    BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                    divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                    refundAmount = refundAmount.add(divide);
                    chargingOrder.setCouponDiscountAmount(divide);
                    order.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    order.setAppCouponId(null);
                    order.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        order.setPaymentAmount(payAmount);
        order.setRefundAmount(refundAmount);
        order.setRefundStatus(1);
        this.updateById(order);
        chargingOrder = this.getById(order.getId());
        // 将枪状态重置为空闲
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        chargingGun.setStatus(2);
        chargingGun.setChargingPower(BigDecimal.ZERO);
        chargingGun.setSoc(0);
        chargingGunClient.updateChargingGunById(chargingGun);
        
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
@@ -2009,7 +2089,7 @@
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(rechargeAmount.toString());
                dto.setRefundAmount(refundAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if(null != resp){
@@ -2154,10 +2234,10 @@
                    RefundResp resp = aliPaymentClient.refund(dto).getData();
                    if(null != resp){
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                        tChargingOrder.setRefundStatus(2);
                        tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                        chargingOrderRefund.setRefundStatus(2);
                        chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                        this.baseMapper.updateById(tChargingOrder);
                            chargingOrderRefundService.save(chargingOrderRefund);
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
@@ -190,7 +190,7 @@
            siteDetailEvaluateVO.setOrderEvaluateVOS(tChargingOrders);
            // 统计好评率
            long goodCount = tChargingOrders.stream().filter(orderEvaluateVO -> orderEvaluateVO.getMark()>=4).count();
            BigDecimal reviewRate = new BigDecimal(goodCount).divide(new BigDecimal(tChargingOrders.size())).setScale(2, BigDecimal.ROUND_HALF_UP);
            BigDecimal reviewRate = new BigDecimal(goodCount).divide(new BigDecimal(tChargingOrders.size()),2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
            siteDetailEvaluateVO.setReviewRate(reviewRate);
            siteDetailEvaluateVO.setEvaluateCount(tChargingOrders.size());
            siteDetailEvaluateVO.setOrderEvaluateVOS(tChargingOrders.stream().limit(3).collect(Collectors.toList()));
@@ -274,29 +274,31 @@
    
        //检测敏感词
        String content = orderEvaluate.getContent();
        String token = appUserClient.getWXToken().getData();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("content", content);
        jsonObject.put("version", 2);
        jsonObject.put("scene", 2);
        jsonObject.put("openid", appUser.getWxOpenid());
        String post = HttpUtils.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, jsonObject.toString());
        JSONObject object = JSONObject.parseObject(post);
        Integer errcode = object.getInteger("errcode");
        if(0 != errcode){
            throw new RuntimeException(object.getString("errmsg"));
        }
        JSONArray detail = object.getJSONArray("detail");
        for (int i = 0; i < detail.size(); i++) {
            JSONObject jsonObject1 = detail.getJSONObject(i);
            Integer errcode1 = jsonObject1.getInteger("errcode");
            if(0 == errcode1){
                String suggest = jsonObject1.getString("suggest");
                Integer label = jsonObject1.getInteger("label");
                String keyword = jsonObject1.getString("keyword");
                Integer prob = jsonObject1.getInteger("prob");
                if(("risky".equals(suggest) || "review".equals(suggest)) && 100 != label && StringUtils.isNotEmpty(keyword) && 80 <= prob){
                    content = content.replaceAll(keyword, "***");
        if(StringUtils.isNotEmpty(content)){
            String token = appUserClient.getWXToken().getData();
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("content", content);
            jsonObject.put("version", 2);
            jsonObject.put("scene", 2);
            jsonObject.put("openid", appUser.getWxOpenid());
            String post = HttpUtils.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token, jsonObject.toString());
            JSONObject object = JSONObject.parseObject(post);
            Integer errcode = object.getInteger("errcode");
            if(0 != errcode){
                throw new RuntimeException(object.getString("errmsg"));
            }
            JSONArray detail = object.getJSONArray("detail");
            for (int i = 0; i < detail.size(); i++) {
                JSONObject jsonObject1 = detail.getJSONObject(i);
                Integer errcode1 = jsonObject1.getInteger("errcode");
                if(0 == errcode1){
                    String suggest = jsonObject1.getString("suggest");
                    Integer label = jsonObject1.getInteger("label");
                    String keyword = jsonObject1.getString("keyword");
                    Integer prob = jsonObject1.getInteger("prob");
                    if(("risky".equals(suggest) || "review".equals(suggest)) && 100 != label && StringUtils.isNotEmpty(keyword) && 80 <= prob){
                        return AjaxResult.error("评价包含违规内容,请重新评价!");
                    }
                }
            }
        }
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -62,7 +62,7 @@
        </if>
    </select>
    <select id="getNoInvoicedOrder" resultMap="BaseResultMap">
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and payment_amount is null and app_user_id = #{appUserId}
        select * from t_charging_order where del_flag = 0 and status = 5 and recharge_payment_status = 2 and payment_amount is not null and app_user_id = #{appUserId}
        <if test="null != month and '' != month">
            and DATE_FORMAT(end_time, '%Y-%m') = #{month}
        </if>
@@ -641,19 +641,19 @@
            charging_pile_account.t_app_user
        WHERE
            del_flag = 0
        <if test="statisticsQueryDto.dayType =1 ">
        <if test="statisticsQueryDto.dayType ==1 ">
            AND DATE(create_time) = CURDATE()
        </if>
        <if test="statisticsQueryDto.dayType =2 ">
        <if test="statisticsQueryDto.dayType == 2 ">
            AND WEEKOFYEAR(create_time) = WEEKOFYEAR(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =3 ">
        <if test="statisticsQueryDto.dayType == 3 ">
            AND MONTH(create_time) = MONTH(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =4">
        <if test="statisticsQueryDto.dayType == 4">
            AND YEAR(create_time) = YEAR(CURDATE())
        </if>
        <if test="statisticsQueryDto.dayType =5">
        <if test="statisticsQueryDto.dayType == 5">
            <if test="statisticsQueryDto.startTime != null">
                AND create_time >= #{statisticsQueryDto.startTime}
            </if>
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -123,7 +123,7 @@
     */
    @PostMapping("pay/notify")
    @ApiOperation("订单回调")
    public R<Map<String, Object>> payNotify(HttpServletRequest request) throws Exception {
    public void payNotify(HttpServletRequest request) throws Exception {
        try {
            Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {});
            log.info("支付回调:{}", params);
@@ -147,13 +147,10 @@
                    break;
            }
            wxV3Pay.ack();
            return R.ok(params);
        } catch (Exception e) {
            log.error("支付回调异常:{}", e, e);
            wxV3Pay.ack(false, e.getMessage());
            return R.fail("回调异常");
        }
    }
    
    /**
@@ -175,7 +172,7 @@
     * 退款回调
     */
    @PostMapping("refund/notify")
    public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException {
    public void refundNotify(HttpServletRequest request) throws IOException {
        try {
            Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {
            });
@@ -219,14 +216,13 @@
                resp.setRefund_id(refund_id);
                resp.setSuccess_time(success_time);
                wxV3Pay.ack();
                return R.ok(resp);
            } else {
                wxV3Pay.ack(false, "不是成功的退款状态");
            }
        } catch (Exception e) {
            e.printStackTrace();
            wxV3Pay.ack(false, e.getMessage());
        }
        return R.fail();
    }
    
    /**