dao/src/main/java/com/sandu/ximon/dao/bo/C3mOrderBo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,102 @@ package com.sandu.ximon.dao.bo; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** * @author LiuHaoNan * @date 2022/6/28 * 订ååè¡¨åæ®µ */ @Data public class C3mOrderBo { /** * 订åID */ private Long orderId; /** * ç¯æID */ private Long poleId; /** * 对åºçç¯æè®¾å¤mac */ private String poleMac; /** * 订ååæ·å· */ private String outTradeNo; /** * è®¢åæ»éé¢ */ private Double totalAmount; /** * 宿¶éé¢ */ private Double receiptAmount; /** * 鿬¾ */ private Double refundAmount; /** * é¢çº¦çµé */ private Integer subscribeChargingCapacity; /** * å®å çµé */ private Double actualChargingCapacity; /** * è®¢åæ¯ä»æ¶é´æ³ */ private Long payTimestamp; /** * 订å鿬¾æ¶é´æ³ */ private Long refundTimestamp; /** * å¼å§å çµæ¶é´æ³ */ private Long startChargingTimestamp; /** * ç»æå çµæ¶é´æ³ */ private Long stopChargingTimestamp; /** * 订åç¶æï¼// å·²æ¯ä»(1),鿬¾ä¸(2),已鿬¾(3),订å宿(4),鿬¾å¤±è´¥5) */ private Integer orderStatus; /** * å çµæ¡©åç§° */ private String c3Name; /** * ç¯æåç§° */ // private String poleName; /** * 0 å çµä¸ 1å çµç»æ */ private Integer changingStates; } dao/src/main/java/com/sandu/ximon/dao/mapper/C3mOrderMapper.java
@@ -1,11 +1,14 @@ package com.sandu.ximon.dao.mapper; import com.sandu.ximon.dao.domain.C3mOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sandu.ximon.dao.bo.C3mOrderBo; import com.sandu.ximon.dao.domain.C3mOrder; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; /** * @author Administrator @@ -16,12 +19,24 @@ @Mapper public interface C3mOrderMapper extends BaseMapper<C3mOrder> { /** * 订å详æ * * @param outTradeNo * @return */ @Select("select * from c3_order where out_trade_no = #{outTradeNo}") C3mOrder getOrderByOutTradeNo(@Param("outTradeNo") String outTradeNo); /** * 鿬¾ æ´æ°è®¢åç¶æ * * @param c3mOrderEntity */ @Update("update c3_order set refund_amount = #{refundAmount},refund_timestamp=#{refundTimestamp},order_status=#{orderStatus}, refund_msg = #{refundMsg} where order_id = #{orderId}") void updateRefundOrder(C3mOrder c3mOrderEntity); List<C3mOrderBo> orderList(Long userId); } dao/src/main/resources/mapper/C3mOrderMapper.xml
@@ -31,7 +31,8 @@ </resultMap> <sql id="Base_Column_List"> order_id,pole_id,c3_mac, order_id ,pole_id,c3_mac, pole_mac,out_trade_no,order_type, total_amount,receipt_amount,refund_amount, ali_buyer_logon_id,subscribe_charging_capacity,actual_charging_capacity, @@ -40,4 +41,15 @@ order_status,c3_name,pole_name, changing_states,user_code </sql> <select id="orderList" resultType="com.sandu.ximon.dao.bo.C3mOrderBo" parameterType="java.lang.Long"> SELECT t1.* FROM c3_order t1 LEFT JOIN pole t2 ON t1.pole_id = t2.id <if test="userId != null"> WHERE (t1.userId = #{userId} OR t1.client_id= #{userId}) </if> </select> </mapper> ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mChargingChargeController.java
@@ -1,10 +1,8 @@ package com.sandu.ximon.admin.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.domain.ResponseVO; import com.sandu.common.execption.BusinessException; import com.sandu.common.util.ResponseUtil; import com.sandu.ximon.admin.param.C3mChargingChargeParam; import com.sandu.ximon.admin.service.C3mChargingChargeService; import com.sandu.ximon.dao.domain.C3mChargingCharge; import lombok.AllArgsConstructor; @@ -27,6 +25,7 @@ /** * ç¼è¾å çµæ¡©è´¹ç * * @param chargeEntities * @return */ @@ -42,15 +41,23 @@ } @GetMapping("/getChargeByC3Id/{c3mId}") //æªåæ¥ææ¡£ @GetMapping("/getChargeByC3Id/{c3mId}") public ResponseVO<Object> getChargeByC3Id(@PathVariable Integer c3mId) { return ResponseUtil.success(chargeService.getChargeByC3Id(c3mId)); } @GetMapping("/getChargeByPoleId/{PoleId}") //为æªåæ¥ææ¡£ @GetMapping("/getChargeByPoleId/{PoleId}") public ResponseVO<Object> getChargeByPoleId(@PathVariable Long PoleId) { return ResponseUtil.success(chargeService.getChargeByPoleId(PoleId)); } /** * æ ¹æ®å çµæ¡©macè·åå½åæ¶é´æ®µçè´¹ç */ @GetMapping("/getChargeByMac/{mac}") public ResponseVO<Object> getChargeByMac(@PathVariable Long mac, Integer power) { return ResponseUtil.success(chargeService.getCostByC3id(mac, power)); } } ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java
@@ -1,34 +1,25 @@ package com.sandu.ximon.admin.controller; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.request.AlipayTradeWapPayRequest; import com.sandu.common.domain.ResponseVO; import com.sandu.common.execption.BusinessException; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.util.ResponseUtil; import com.sandu.ximon.admin.config.AlipayConfig; import com.sandu.ximon.admin.param.PayParam; import com.sandu.ximon.admin.pay.alipay.UsrAlipayConfigService; import com.sandu.ximon.admin.pay.wx.WxFastPayService; import com.sandu.ximon.admin.service.C3ChargingService; import com.sandu.ximon.admin.service.C3mChargingChargeService; import com.sandu.ximon.admin.service.C3mOrderService; import com.sandu.ximon.admin.utils.AliPayUtils; import com.sandu.ximon.admin.utils.ConfigCheckUtils; import com.sandu.ximon.dao.domain.AliConfigEntity; import com.sandu.ximon.dao.bo.C3mOrderBo; import com.sandu.ximon.dao.domain.C3mCharging; import com.sandu.ximon.dao.domain.C3mOrder; import com.sandu.ximon.dao.enums.OrderType; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.Map; import java.math.BigDecimal; import java.util.List; import java.util.SortedMap; /** @@ -44,6 +35,7 @@ private final C3ChargingService c3mService; private final UsrAlipayConfigService alipayConfigService; private final WxFastPayService wxPayService; private final C3mChargingChargeService c3mChargingChargeService; /** @@ -52,11 +44,13 @@ * @return */ @PostMapping("/refond") public ResponseVO<Object> refond(@RequestBody Map params) { // c3mOrderService.orderRefund( (String)params.get("outTradeNo"), // (Double)params.get("refundAmount")); return ResponseUtil.success(c3mOrderService.orderRefund((String) params.get("outTradeNo"), (Double) params.get("refundAmount"))); public ResponseVO<Object> refond(@RequestBody PayParam params) { if (params.getOutTradeNo().isEmpty() || params.getRefundAmount() == null) { throw new BusinessException("鿬¾åæ°ä¸è½ä¸ºç©º"); } return ResponseUtil.success(c3mOrderService.orderRefund(params.getOutTradeNo(), params.getRefundAmount())); } @@ -75,13 +69,15 @@ if (null == c3m) { throw new BusinessException("æªæ¾å°å½åå çµæ¡©"); } //è·åé¢ä»éé¢ BigDecimal TotalAmount = c3mChargingChargeService.getCostByC3id(c3m.getC3Id(), param.getSubscribeChargingCapacity()); //转æ¢ä¸ºdoubleç±»å double totalAmount = TotalAmount.doubleValue(); C3mOrder c3mOrderEntity = c3mOrderService.advancePayOrder(param.getPoleId(), c3m, "wxpay" , param.getTotalAmount(), param.getSubscribeChargingCapacity()); , totalAmount, param.getSubscribeChargingCapacity()); if (null == c3mOrderEntity) { throw new BusinessException("该å çµæ¡©æ£è¢«ä½¿ç¨!"); } // return R.ok().put("outTradeNo",c3mOrderEntity.getOutTradeNo()) // .put("totalAmount",totalAmount); param.setOutTradeNo(c3mOrderEntity.getOutTradeNo()); param.setTotalAmount(c3mOrderEntity.getTotalAmount()); @@ -91,76 +87,12 @@ } @PostMapping("/aliPay") public ResponseVO<Object> c3AliPay(@RequestBody PayParam param, HttpServletResponse response) { // åæ·è®¢åå·ï¼åæ·ç½ç«è®¢åç³»ç»ä¸å¯ä¸è®¢åå·ï¼å¿ å¡« String out_trade_no = param.getOutTradeNo(); System.out.println("订åå·:" + out_trade_no); // 订ååç§°ï¼å¿ å¡« String subject = "æ«ç å çµæ¯ä»(C3å çµæ¡©)"; // 仿¬¾éé¢ï¼å¿ å¡«ï¼åä½ä¸ºå ï¼ç²¾ç¡®å°å°æ°ç¹å两ä½ï¼åå¼èå´[0.01,100000000] String total_amount = param.getTotalAmount().toString(); // ååæè¿°ï¼å¯ç©º String body = "请å¿ä»æ¬¾ï¼æµè¯ç¨"; // è¶ æ¶æ¶é´ å¯ç©º String timeout_express = "5m"; // éå®äº§åç å¿ å¡« String product_code = "QUICK_WAP_WAY"; /**********************/ AliConfigEntity alipayConfigEntity = alipayConfigService.getConfigByPoleId(param.getPoleId()); String checkStr = ConfigCheckUtils.checkAlipayConfig(alipayConfigEntity); if (checkStr != null) { try { response.getWriter().write(checkStr); return ResponseUtil.fail("æ¯ä»å®æå¤±è´¥"); } catch (IOException e) { e.printStackTrace(); } } //è°ç¨RSAç¾åæ¹å¼ AlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, alipayConfigEntity.getAppId(), alipayConfigEntity.getPrivateKey(), AlipayConfig.format, AlipayConfig.charset, alipayConfigEntity.getPublicKey(), AlipayConfig.sign_type); AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest(); // å°è£ è¯·æ±æ¯ä»ä¿¡æ¯ AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); model.setOutTradeNo(out_trade_no); model.setSubject(subject); model.setTotalAmount(total_amount); model.setBody(body); model.setTimeoutExpress(timeout_express); model.setProductCode(product_code); model.setQuitUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime()); alipay_request.setBizModel(model); // è®¾ç½®å¼æ¥éç¥å°å alipay_request.setNotifyUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime()); // è®¾ç½®åæ¥å°å alipay_request.setReturnUrl(C3mOrder.REQUEST_URL + param.getPoleId() + "/" + new Date().getTime()); // form表åç产 String form = ""; try { // è°ç¨SDKçæè¡¨å form = client.pageExecute(alipay_request).getBody(); response.setContentType("text/html;charset=" + AlipayConfig.charset); response.getWriter().write(form);//ç´æ¥å°å®æ´ç表åhtmlè¾åºå°é¡µé¢ response.getWriter().flush(); response.getWriter().close(); } catch (Exception e) { e.printStackTrace(); } return ResponseUtil.success("æ¯ä»å®æ"); } // @RequestMapping("/wxpay") // public ResponseVO<Object> c3Wxpay(@RequestBody PayParam param) { // // //String result = wxPayService.miniAppPay(outTradeNo, totalAmount, streetlightId); // SortedMap<Object, Object> result = wxPayService.appPay("æ«ç å çµæ¯ä»(C3å çµæ¡©)", param.getOutTradeNo(), param.getWxPayTotalAmount(), param.getPoleId(),c3mOrderEntity); // // return ResponseUtil.success(result); // } /** * 订åç¶ææ¥è¯¢ 微信æ¯ä» * * @param param * @return */ @RequestMapping("/queryOrder") public ResponseVO<Object> queryOrder(@RequestBody PayParam param) { if (param.getOrderId() == null) { @@ -180,4 +112,13 @@ } /** * 订åå表 */ @GetMapping("/list") public ResponseVO<Object> list(BaseConditionVO baseConditionVO) { List<C3mOrderBo> list = c3mOrderService.orderList(baseConditionVO); return ResponseUtil.successPage(list); } } ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java
@@ -19,6 +19,11 @@ private Double totalAmount; /** * ç¨æ·æ è¯ */ private String user_code; /** * 微信æ¯ä»éé¢ */ private Integer WxPayTotalAmount; @@ -28,7 +33,14 @@ */ private Integer subscribeChargingCapacity; private Long orderId; /** * 鿬¾æ¶ä½¿ç¨ */ private Double refundAmount; private String outTradeNo; private Long orderId; } ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxFastPayService.java
@@ -10,6 +10,7 @@ import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.sandu.common.execption.BusinessException; @@ -19,6 +20,7 @@ import com.sandu.ximon.dao.domain.WxConfigEntity; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -43,75 +45,6 @@ private final UsrWxPayConfigService wxPayConfigService; /** * appæ¯ä» * * @param body ååæè¿° * @param * @param totalFee æ¯ä»éé¢ï¼åï¼ * @return */ public SortedMap<Object, Object> appPay(String body, String orderSn, int totalFee, Long poleId) { WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId); wxConfig.setMchId(wxConfig.getMchId().trim()); WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderSn); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setOpenid("otiM54x_hc_5gbhMY5aZxo7UByNo"); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(WECHAT_ORDER_PAY_CALLBACK_URL); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); System.out.println("********************************"); String time = String.valueOf(System.currentTimeMillis() / 1000); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { SortedMap<Object, Object> parameters = new TreeMap<>(); parameters.put("appid", wxPayUnifiedOrderResult.getAppid()); parameters.put("noncestr", wxPayUnifiedOrderResult.getNonceStr()); // éæºå符串 parameters.put("partnerid", wxConfig.getMchId()); // åæ·id // parameters.put("out_trade_no", orderId);//åæ·è®¢åå· parameters.put("prepayid", wxPayUnifiedOrderResult.getPrepayId()); parameters.put("package", "Sign=WXPay"); parameters.put("timestamp", time); String sign = createSign(wxConfig.getPrivateKey(), parameters); //hashMap.put("paySign", wechatSign); parameters.put("Sign", sign); return parameters; } else { log.error("微信æ¯ä»å¤±è´¥ï¼{}", wxPayUnifiedOrderResult.getErrCodeDes()); throw new BusinessException("微信æ¯ä»å¤±è´¥ï¼" + wxPayUnifiedOrderResult.getErrCodeDes()); } } catch (WxPayException e) { log.error("微信æ¯ä»å¤±è´¥ï¼{}", e.getErrCodeDes()); throw new BusinessException("微信æ¯ä»å¤±è´¥ï¼" + e.getErrCodeDes()); } } /* private String createSign(SortedMap<Object, Object> parameters) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet();// ææåä¸ä¼ åçåæ°æç §accsiiæåºï¼ååºï¼ for (Object e : es) { Map.Entry entry = (Map.Entry) e; String k = (String) entry.getKey(); Object v = entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + wxPayProperties.getMchKey()); System.out.println("åç¬¦ä¸²æ¼æ¥åæ¯:" + sb.toString()); return SecureUtil.md5(sb.toString()).toUpperCase(); }*/ /** @@ -207,38 +140,6 @@ /** * çæäºç»´ç 仿¬¾ */ public String generateQRCodePay(String body, String orderId, int totalFee, String callbackUrl) { WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderId); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setProductId(orderId); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(callbackUrl); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.NATIVE); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { byte[] scanPayQrcodeMode2 = wxPayService.createScanPayQrcodeMode2(wxPayUnifiedOrderResult.getCodeURL(), null, null); String encode = Base64.encode(scanPayQrcodeMode2); return encode; } else { log.error("微信æ¯ä»å¤±è´¥ï¼{}", wxPayUnifiedOrderResult.getErrCodeDes()); throw new BusinessException("微信æ¯ä»å¤±è´¥ï¼" + wxPayUnifiedOrderResult.getErrCodeDes()); } } catch (WxPayException e) { log.error("微信æ¯ä»å¤±è´¥ï¼{}", e.getErrCodeDes()); throw new BusinessException("微信æ¯ä»å¤±è´¥ï¼" + e.getErrCodeDes()); } } /** * 鿬¾ * * @param totalAmount @@ -247,11 +148,16 @@ * @param poleId * @return */ @Transactional(rollbackFor = Exception.class) public boolean refund(Double totalAmount, Double refundAmount, String outTradeNo, Long poleId) { WxConfigEntity wxConfig = UsrWxPayConfigService.getBean().getConfigByPoleId(poleId); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String refundNo = sdf.format(new Date()); WxPayRefundRequest refundRequest = new WxPayRefundRequest(); //鿬¾éé¢ä¸è½å¤§äºè®¢åæ»éé¢ if (refundAmount > totalAmount) { throw new BusinessException("鿬¾éé¢ä¸è½å¤§äºè®¢åæ»éé¢"); } refundRequest.setOutTradeNo(outTradeNo); refundRequest.setOutRefundNo(refundNo); refundRequest.setTotalFee(Integer.valueOf(parseWxAmount((totalAmount + "")))); @@ -285,17 +191,36 @@ return amount; } /** * å°ç¨åºæ¯ä» 微信 * * @param body * @param orderId * @param totalFee * @param poleId * @return */ @Transactional(rollbackFor = Exception.class) public SortedMap<Object, Object> miniAppPay(String body, String orderId, int totalFee, Long poleId) { WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId); wxConfig.setMchId(wxConfig.getMchId().trim()); //设置微信æ¯ä»åæ° WxPayConfig payConfig = new WxPayConfig(); payConfig.setAppId(StringUtils.trimToNull(wxConfig.getAppid())); payConfig.setMchId(StringUtils.trimToNull(wxConfig.getMchId())); payConfig.setMchKey(StringUtils.trimToNull(wxConfig.getPrivateKey())); payConfig.setSubAppId(StringUtils.trimToNull(null)); payConfig.setSubMchId(StringUtils.trimToNull(null)); payConfig.setKeyPath(StringUtils.trimToNull(null)); wxPayService.setConfig(payConfig); //设置微信åä¸è®¢åè¯·æ± WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderId); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setOpenid("otiM54x_hc_5gbhMY5aZxo7UByNo"); // wxPayUnifiedOrderRequest.setOpenid("otiM54x_hc_5gbhMY5aZxo7UByNo"); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); @@ -303,6 +228,7 @@ wxPayUnifiedOrderRequest.setNotifyUrl(WECHAT_ORDER_PAY_CALLBACK_URL); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); System.out.println("-----------"+wxPayUnifiedOrderRequest); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); String time = String.valueOf(System.currentTimeMillis() / 1000); ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxPayConfiguration.java
@@ -14,30 +14,30 @@ /** * @author Binary Wang */ //@Configuration //@ConditionalOnClass(WxPayService.class) //@EnableConfigurationProperties(WxPayProperties.class) //@AllArgsConstructor //public class WxPayConfiguration { // private WxPayProperties properties; // // @Bean // @ConditionalOnMissingBean // public WxPayService wxService() { // WxPayConfig payConfig = new WxPayConfig(); // payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId())); // payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId())); // payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey())); // payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId())); // payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId())); // payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath())); // // // å¯ä»¥æå®æ¯å¦ä½¿ç¨æ²ç®±ç¯å¢ // payConfig.setUseSandboxEnv(false); // // WxPayService wxPayService = new WxPayServiceImpl(); @Configuration @ConditionalOnClass(WxPayService.class) @EnableConfigurationProperties(WxPayProperties.class) @AllArgsConstructor public class WxPayConfiguration { private WxPayProperties properties; @Bean @ConditionalOnMissingBean public WxPayService wxService() { WxPayConfig payConfig = new WxPayConfig(); payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId())); payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId())); payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey())); payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId())); payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId())); payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath())); // å¯ä»¥æå®æ¯å¦ä½¿ç¨æ²ç®±ç¯å¢ payConfig.setUseSandboxEnv(false); WxPayService wxPayService = new WxPayServiceImpl(); // wxPayService.setConfig(payConfig); // return wxPayService; // } // //} return wxPayService; } } ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mChargingChargeService.java
@@ -14,6 +14,8 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalTime; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -167,4 +169,50 @@ public boolean deleteC3mCharging(Integer c3mId) { return c3mChargingChargeMapper.deleteCharge(c3mId); } /** * æ ¹æ®c3Idæ¥æ¾è´¹ç 并计ç®è±è´¹ * * @param c3Id * @return */ public BigDecimal getCostByC3id(Long c3Id, Integer power) { List<C3mChargingCharge> list = list(Wrappers.lambdaQuery(C3mChargingCharge.class).eq(C3mChargingCharge::getC3Id, c3Id)); //è·åå½åæ¶é´ LocalTime localTime = LocalTime.now(); //éåè´¹çéå 夿å½åæ¶é´æ¯å¦å¨è´¹çæ¶é´æ®µå LocalTime startTime; LocalTime endTime; //é»è®¤è´¹ç Double charge = 8.8; if (list.size() > 1) { //è´¹çæ¡æ°å¤§äº1æ¶ï¼éåè´¹çéå è·åå½åæ¶é´æ®µçè´¹ç for (int i = 0; i < list.size(); i++) { //è·åè´¹çæ¶é´æ®µ 转å为LocalTime startTime = LocalTime.of(list.get(i).getHour(), list.get(i).getMin()); endTime = LocalTime.of(list.get(i + 1).getHour(), list.get(i + 1).getMin()); if (i == list.size()) { startTime = LocalTime.of(list.get(i).getHour(), list.get(i).getMin()); endTime = LocalTime.of(list.get(0).getHour(), list.get(0).getMin()); } //夿å½åæ¶é´æ¯å¦å¨è´¹çæ¶é´æ®µå if (localTime.isAfter(startTime) && localTime.isBefore(endTime)) { //è·åè´¹ç charge = list.get(i).getCharge(); } } } else if (list.size() == 1) { //åªæä¸æ¡è´¹çæ¶ï¼ç´æ¥è·åè´¹ç charge = list.get(0).getCharge(); } else { //å ¶ä»è´¹çæ¶ï¼è·åé»è®¤è´¹ç charge = 8.8; } //计ç®è±è´¹ è´¹ç*çµé BigDecimal chargeDecimal = new BigDecimal(charge); BigDecimal powerDecimal = new BigDecimal(power); BigDecimal result = chargeDecimal.multiply(powerDecimal); return result; } } ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
@@ -1,32 +1,35 @@ package com.sandu.ximon.admin.service; import com.alibaba.fastjson.JSON; import cn.hutool.core.lang.Snowflake; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.pagehelper.PageHelper; import com.sandu.common.execption.BusinessException; import com.sandu.common.object.BaseConditionVO; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.ximon.admin.config.C3mRedisConfig; import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3mRedisConstant; import com.sandu.ximon.admin.pay.OrderStatusEnums; import com.sandu.ximon.admin.pay.wx.WxFastPayService; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.admin.security.order.OrderQueryListener; import com.sandu.ximon.admin.security.order.OrderScanType; import com.sandu.ximon.admin.utils.AliPayUtils; import com.sandu.ximon.admin.utils.RedisUtils; import com.sandu.ximon.admin.vo.C3mOrderVO; import com.sandu.ximon.dao.bo.C3mOrderBo; import com.sandu.ximon.dao.domain.C3mCharging; import com.sandu.ximon.dao.domain.C3mOrder; import com.sandu.ximon.dao.domain.Pole; import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3mRedisConstant; import com.sandu.ximon.dao.enums.OrderStatus; import com.sandu.ximon.dao.enums.OrderType; import com.sandu.ximon.dao.mapper.C3mOrderMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; /** * @Author liuhaonan @@ -42,6 +45,7 @@ private final C3mOrderMapper c3mOrderMapper; private final WxFastPayService fastPayService; private final OrderQueryListener orderQueryListener; private final Snowflake snowflake; public boolean orderRefund(String outTradeNo, Double refundAmount/*, Long userId, String username*/) { Long userId = SecurityUtils.getUserId(); @@ -50,8 +54,8 @@ if (orderByOutTradeNo.getTotalAmount() < refundAmount) { throw new BusinessException("鿬¾éé¢é误,ä¸è½å¤§äºä»æ¬¾éé¢"); } if (null == orderByOutTradeNo) { return false; if (orderByOutTradeNo == null) { throw new BusinessException("æªæ¾å°è®¢å"); } else { orderByOutTradeNo.setRefundAmount(refundAmount); return c3mOrderRefund(orderByOutTradeNo, "å çµæ¡©é款", userId, username); @@ -61,6 +65,16 @@ } /** * 鿬¾ * * @param C3mOrder * @param msg * @param userId * @param username * @return */ // @Transactional(rollbackFor = Exception.class) private boolean c3mOrderRefund(C3mOrder C3mOrder, String msg, Long userId, String username) { // è¿è¡é款ï¼è®¾ç½®è®¢åç¶æä¸ºå·²éæ¬¾ boolean b = false; @@ -109,6 +123,16 @@ } } /** * å建订å * * @param streetlightId * @param c3m * @param orderType * @param totalAmount * @param subscribeChargingCapacity * @return */ public C3mOrder advancePayOrder(Long streetlightId, C3mCharging c3m, String orderType, Double totalAmount, Integer subscribeChargingCapacity) { @@ -131,16 +155,26 @@ subscribeChargingCapacity ); // å è½½å°redisç¼åä¸, æ¥è¯¢æ¨¡åèªå¨æ¥è¯¢ç¶æå¹¶å¤ç boolean b = redisUtils.set( C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + c3m.getC3Mac() + c3mOrderEntity.getOutTradeNo(), JSON.toJSONString(c3mOrderEntity), C3mRedisConfig.ORDER_MAX_TIME ); // boolean b = redisUtils.set( // C3mRedisConstant.C3_NO_PAY_ORDER.getCode() + c3m.getC3Mac() + c3mOrderEntity.getOutTradeNo(), // JSON.toJSONString(c3mOrderEntity), // C3mRedisConfig.ORDER_MAX_TIME // TODO æµè¯æ¶å ³é // ); boolean b = true; c3mOrderEntity.setOrderId(snowflake.nextId()); c3mOrderEntity.setC3Mac(c3m.getC3Name()); c3mOrderEntity.setPoleId(streetlightId); c3mOrderEntity.setPoleMac(pole.getDeviceCode()); c3mOrderEntity.setPoleName(pole.getPoleName()); c3mOrderEntity.setC3Mac(c3m.getC3Mac()); c3mOrderEntity.setOrderStatus(0); // æ¨éå°èªå¨æ¥è¯¢æ¨¡åï¼è¿è¡æ«æå¯å¨ orderQueryListener.startScan(OrderScanType.C3M.getType()); // if(b){ // save(c3mOrderEntity); // } // orderQueryListener.startScan(OrderScanType.C3M.getType()); // TODO æµè¯æ¶å ³é if (b) { this.save(c3mOrderEntity); } return b ? c3mOrderEntity : null; } @@ -167,14 +201,35 @@ if (!updateById(userOrder)) { return WxPayNotifyResponse.fail("æ´æ°æ°æ®å·²å¤±æ"); } /** * è°èµ·å¼å§å çµæ¥å£ // TODO */ return WxPayNotifyResponse.success("æ´æ°æ°æ®æå"); } /** * 订å详æ by orderSn * * @param orderSn * @return */ public C3mOrder getByOrderSn(String orderSn) { LambdaQueryWrapper<C3mOrder> wrapper = Wrappers.lambdaQuery(C3mOrder.class).eq(C3mOrder::getOutTradeNo, orderSn).last("limit 1"); return getOne(wrapper); } /** * 订åå表 * * @param baseConditionVO * @return */ public List<C3mOrderBo> orderList(BaseConditionVO baseConditionVO) { Long userId = SecurityUtils.getClientId(); PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); List<C3mOrderBo> list = baseMapper.orderList(userId); return list; } } ximon-admin/src/main/resources/application.yml
@@ -1,6 +1,6 @@ spring: profiles: active: dev active: local jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 @@ -22,6 +22,11 @@ logging: file: path: logs wx: pay: appId: dsd #å¾®ä¿¡å ¬ä¼å·æè å°ç¨åºççappid mchId: dsdsd #微信æ¯ä»åæ·å· mchKey: dsd #微信æ¯ä»åæ·å¯é¥ # ledå±å¹æå¡å¨å°åï¼æ´æ¹éè¦åæ¶æ´æ¹ï¼