MrShi
2025-08-22 55ea3d5de0c128d82bbc85551b3f52b917abbd68
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/jinkuai
已修改17个文件
987 ■■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/DateUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AliSmsService.java 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-test.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java
@@ -83,9 +83,11 @@
                    .body(body)
                    .build();
            NotificationConfig config = new RSAAutoCertificateConfig.Builder()
            NotificationConfig config = new RSAPublicKeyConfig.Builder()
                    .merchantId(WxMiniConfig.wxProperties.getMchId())
                    .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
                    .publicKeyFromPath(WxMiniConfig.wxProperties.getPubKeyPath())
                    .publicKeyId(WxMiniConfig.wxProperties.getPayPublicKeyId())
                    .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
                    .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
                    .build();
@@ -152,13 +154,20 @@
                    .body(body)
                    .build();
            NotificationConfig config = new RSAAutoCertificateConfig.Builder()
            NotificationConfig config = /*new RSAAutoCertificateConfig.Builder()
                    .merchantId(WxMiniConfig.wxProperties.getMchId())
                    .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
                    .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
                    .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
                    .build();*/
            new RSAPublicKeyConfig.Builder()
                    .merchantId(WxMiniConfig.wxProperties.getMchId())
                    .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
                    .publicKeyFromPath(WxMiniConfig.wxProperties.getPubKeyPath())
                    .publicKeyId(WxMiniConfig.wxProperties.getPayPublicKeyId())
                    .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
                    .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
                    .build();
            NotificationParser parser = new NotificationParser(config);
            RefundNotification result = parser.parse(requestParam, RefundNotification.class);
@@ -194,7 +203,7 @@
                .publicKeyFromPath(WxMiniConfig.wxProperties.getWechatPubKeyPath()) //微信支付公钥的存放路径
                .publicKeyId(WxMiniConfig.wxProperties.getWechatPayPublicKeyId()) //微信支付公钥ID
                .merchantSerialNumber(WxMiniConfig.wxProperties.getWechatSerialNumer()) //商户API证书序列号
                .apiV3Key("7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB") //APIv3密钥
                .apiV3Key(WxMiniConfig.wxProperties.getWechatApiV3Key()) //APIv3密钥
                .build();
            TransferDetailEntityNew entity = wxSuccessCallback(request,config);
server/admin/src/main/resources/application.yml
@@ -12,7 +12,7 @@
spring:
  profiles:
    active: test
    active: pro
  # JSON返回配置
  jackson:
    # 默认时区
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java
@@ -32,9 +32,17 @@
@Slf4j
public class SendWxMessage {
    private static String goodsOrderUrl = "pages/settlementDetails/settlementDetails?goodsOrderId=";
    private static String identityInfoUrl = "pages/mine/mine";
    private static String mineUrl = "/pages/mine/mine";
    private static String orderDetail = "pages/order-details/order-details?id={id}";// 用工
    private static String orderDetailFreight = "pages/freight-order/freight-order?id={id}";// 货运
    private static String orderDetailFood = "pages/order-food/order-food?id={id}";// 订餐
    private static String balanceUrl = "pages/balance-details/balance-details";// 余额明细
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -45,202 +53,256 @@
     * @param identityInfo
     * @throws WxErrorException
     */
    public  void  identityInfoMessage(String openid, IdentityInfo identityInfo) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 认证信息  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        //用户的openid(要发送给那个用户)
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("VJho7-lf-4_WZFfOzenDndgwNDIA0EvCiE6vqBnExpQ");
        Map<String, TemplateData> m = new HashMap<>(4);
        m.put("thing2", new TemplateData(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO)?"用工认证":Constants.equalsInteger(identityInfo.getType(),Constants.ONE)?"运货认证":"供餐认证"));
        m.put("phrase6", new TemplateData(Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"认证通过":"认证未通过"));
        m.put("time12", new TemplateData(DateUtil.getFomartDate(identityInfo.getAuditTime(),"yyyy-MM-dd HH:mm")));
        m.put("thing14", new TemplateData(identityInfo.getAuditRemark()));
        wxMsgVO.setPage(identityInfoUrl);
        wxMsgVO.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 认证信息:{}", JSONObject.toJSONString(responseEntity));
    public  void  identityInfoMessage(String openid, IdentityInfo identityInfo){
        try{
            RestTemplate restTemplate = new RestTemplate();
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 认证信息  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            //用户的openid(要发送给那个用户)
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("VJho7-lf-4_WZFfOzenDndgwNDIA0EvCiE6vqBnExpQ");
            Map<String, TemplateData> m = new HashMap<>(4);
            m.put("thing2", new TemplateData(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO)?"实名认证":Constants.equalsInteger(identityInfo.getType(),Constants.ONE)?"运货认证":"供餐认证"));
            m.put("phrase6", new TemplateData(Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"通过":"未通过"));
            m.put("time12", new TemplateData(DateUtil.getFomartDate(identityInfo.getAuditTime(),"yyyy-MM-dd HH:mm")));
            m.put("thing14", new TemplateData(identityInfo.getAuditRemark()));
//            wxMsgVO.setPage(mineUrl);
            wxMsgVO.setData(m);
            log.info("微信小程序->微信消息通知 认证信息:{}", JSONObject.toJSONString(wxMsgVO));
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 认证信息:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    }
    /**
     *
     * 订单取消业务通知
     * @param openidList
     * @param orders
     * @param cancelType 取消类型:0=平台取消;1=发单方取消;1=接单方取消
     * @throws WxErrorException
     */
    public  void  cancelMessage(List<String> openidList, Orders orders,Integer cancelType ) throws WxErrorException {
    public  void  cancelMessage(List<String> openidList, Orders orders,Integer cancelType ){
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 订单取消业务  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        //订阅消息模板id
        wxMsgVO.setTemplate_id("AA97cHjvlPiNO4viMkVe4JifCf9TD5b5Eb7s6El3VS8");
        Map<String, TemplateData> m = new HashMap<>(5);
        m.put("character_string3", new TemplateData(orders.getCode()));
        m.put("thing2", new TemplateData(Constants.orderType.getName(orders.getType())));
        m.put("thing1", new TemplateData(orders.getLocation() + (StringUtils.isNotBlank(orders.getLocationRemark())?orders.getLocationRemark():"")));
        m.put("date8", new TemplateData(DateUtil.getFomartDate(orders.getCancelTime(),"yyyy-MM-dd HH:mm:ss")));
        m.put("thing6", new TemplateData(Constants.equalsInteger(cancelType,Constants.ZERO)?"平台取消":Constants.equalsInteger(cancelType,Constants.ONE)?"发单方取消":"接单方取消"));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        if(CollectionUtils.isNotEmpty(openidList)){
            for (String openid:openidList) {
                //用户的openid(要发送给那个用户)
                wxMsgVO.setTouser(openid);
                ResponseEntity<String> responseEntity =
                        restTemplate.postForEntity(url, wxMsgVO, String.class);
                log.info("微信小程序->微信消息通知 订单取消业务:{}", JSONObject.toJSONString(responseEntity));
        try{
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 订单取消业务  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            //订阅消息模板id
            wxMsgVO.setTemplate_id("AA97cHjvlPiNO4viMkVe4JifCf9TD5b5Eb7s6El3VS8");
            Map<String, TemplateData> m = new HashMap<>(5);
            m.put("character_string3", new TemplateData(orders.getCode()));
            m.put("thing2", new TemplateData(Constants.orderType.getName(orders.getType())));
            m.put("thing1", new TemplateData(orders.getLocation() + (StringUtils.isNotBlank(orders.getLocationRemark())?orders.getLocationRemark():"")));
            m.put("date8", new TemplateData(DateUtil.getFomartDate(orders.getCancelTime(),"yyyy-MM-dd HH:mm:ss")));
            m.put("thing6", new TemplateData(Constants.equalsInteger(cancelType,Constants.ZERO)?"平台取消":Constants.equalsInteger(cancelType,Constants.ONE)?"发单方取消":"接单方取消"));
            String pageUrl = Constants.equalsInteger(orders.getType(),Constants.orderType.hyd.getKey())?orderDetailFreight:
                    Constants.equalsInteger(orders.getType(),Constants.orderType.scd.getKey())?orderDetailFood:orderDetail;
            pageUrl.replace("{id}",orders.getId().toString());
            wxMsgVO.setPage(pageUrl);
            wxMsgVO.setData(m);
            if(CollectionUtils.isNotEmpty(openidList)){
                for (String openid:openidList) {
                    //用户的openid(要发送给那个用户)
                    wxMsgVO.setTouser(openid);
                    log.info("微信小程序->微信消息通知 订单取消业务:{}", JSONObject.toJSONString(wxMsgVO));
                    ResponseEntity<String> responseEntity =
                            restTemplate.postForEntity(url, wxMsgVO, String.class);
                    log.info("微信小程序->微信消息通知 订单取消业务:{}", JSONObject.toJSONString(responseEntity));
                }
            }else{
                log.info("微信小程序->微信消息通知 订单取消业务:{}", "无人员信息");
            }
        }else{
            log.info("微信小程序->微信消息通知 订单取消业务:{}", "无人员信息");
        }catch (WxErrorException wxErrorException){
        }
    }
    /**
     * 接单通知
     * @param openid
     * @param orders
     * @param memberName
     * @param memberPhone
     * @throws WxErrorException
     */
    public  void  acceptMessage(String openid, Orders orders,String memberName,String memberPhone){
        RestTemplate restTemplate = new RestTemplate();
        try{
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 接单业务  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("oVjOBLcHxIlGzOMJsdInmgI5CHGXh-UTvMzQqfFOnIg");
            Map<String, TemplateData> m = new HashMap<>(4);
            m.put("character_string3", new TemplateData(orders.getCode()));
            m.put("thing1", new TemplateData(Constants.orderType.getName(orders.getType())));
            m.put("thing15", new TemplateData(memberName));
            m.put("phone_number8", new TemplateData(memberPhone));
            String pageUrl = Constants.equalsInteger(orders.getType(),Constants.orderType.hyd.getKey())?orderDetailFreight:
                    Constants.equalsInteger(orders.getType(),Constants.orderType.scd.getKey())?orderDetailFood:orderDetail;
            pageUrl.replace("{id}",orders.getId().toString());
            wxMsgVO.setPage(pageUrl);
            wxMsgVO.setData(m);
            //用户的openid(要发送给那个用户)
            log.info("微信小程序->微信消息通知 接单通知:{}", JSONObject.toJSONString(wxMsgVO));
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 接单通知:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    }
    public  void  orderUpdMessage(String openid, Orders orders){
        RestTemplate restTemplate = new RestTemplate();
        try{
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 订单变更通知  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("3YSC7gouRlSjHXz4CrWOGFzPmGwEBtFj4snwdfMvKHk");
            Map<String, TemplateData> m = new HashMap<>(3);
            m.put("character_string1", new TemplateData(orders.getCode()));
            m.put("thing3", new TemplateData("变更订单日期"));
            //变更后日期:07-23至07-25
            m.put("thing5", new TemplateData("变更后日期:" +DateUtil.getFomartDate(orders.getStartDate(),"MM-dd") + "至" +DateUtil.getFomartDate(orders.getEndDate(),"MM-dd")));
            String pageUrl = Constants.equalsInteger(orders.getType(),Constants.orderType.hyd.getKey())?orderDetailFreight:
                    Constants.equalsInteger(orders.getType(),Constants.orderType.scd.getKey())?orderDetailFood:orderDetail;
            pageUrl.replace("{id}",orders.getId().toString());
            wxMsgVO.setPage(pageUrl);
            wxMsgVO.setData(m);
            //用户的openid(要发送给那个用户)
            log.info("微信小程序->微信消息通知 订单变更通知:{}", JSONObject.toJSONString(wxMsgVO));
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 订单变更通知:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    }
    public  void  withdrawalMessage(String openid, WithdrawalOrders withdrawalOrders){
        try{
            RestTemplate restTemplate = new RestTemplate();
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 提现成功通知  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("fNJy4545hcrH83bP3a1vszs7XEKWjXMsrfr2XCNsql0");
            Map<String, TemplateData> m = new HashMap<>(4);
            m.put("phrase2", new TemplateData("已打款"));
            m.put("amount1", new TemplateData((new BigDecimal(withdrawalOrders.getAmount().toString()).divide(new BigDecimal("100"))).toString()));
            m.put("time3", new TemplateData(DateUtil.getFomartDate(withdrawalOrders.getUpdateTime(),"yyyy.MM.dd HH.mm.ss")));
            m.put("thing4", new TemplateData("打款成功,请注意查收"));
            wxMsgVO.setPage(balanceUrl);
            wxMsgVO.setData(m);
            //用户的openid(要发送给那个用户)
            log.info("微信小程序->微信消息通知 提现成功通知:{}", JSONObject.toJSONString(wxMsgVO));
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 提现成功通知:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    }
    public  void  acceptMessage(String openid, Orders orders,String memberName,String memberPhone) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 接单业务  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("oVjOBLcHxIlGzOMJsdInmgI5CHGXh-UTvMzQqfFOnIg");
        Map<String, TemplateData> m = new HashMap<>(4);
        m.put("character_string3", new TemplateData(orders.getCode()));
        m.put("thing1", new TemplateData(Constants.orderType.getName(orders.getType())));
        m.put("thing15", new TemplateData(memberName));
        m.put("phone_number8", new TemplateData(memberPhone));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        //用户的openid(要发送给那个用户)
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 订单取消业务:{}", JSONObject.toJSONString(responseEntity));
    public  void  revenueMessage(String openid, Orders orders){
        try{
            RestTemplate restTemplate = new RestTemplate();
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 订单收益通知  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("tDpYImlrdv-0d3euTrHbYZ1cEZvjVHTNlqHvV0tpLHg");
            Map<String, TemplateData> m = new HashMap<>(5);
            m.put("character_string8", new TemplateData(orders.getCode()));
            m.put("phrase3", new TemplateData("已支付"));
            m.put("phrase4", new TemplateData("微信支付"));
            m.put("amount6", new TemplateData((new BigDecimal(orders.getReceiveAccount().toString()).divide(new BigDecimal("100")))+"元"));
            m.put("date7", new TemplateData(DateUtil.getFomartDate(new Date(),"yyyy-MM-dd HH:mm:ss")));
            wxMsgVO.setPage(balanceUrl);
            wxMsgVO.setData(m);
            log.info("微信小程序->微信消息通知 订单收益通知:{}", JSONObject.toJSONString(wxMsgVO));
            //用户的openid(要发送给那个用户)
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 订单收益通知:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    }
    public  void  orderUpdMessage(String openid, Orders orders) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 订单变更通知  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("3YSC7gouRlSjHXz4CrWOGFzPmGwEBtFj4snwdfMvKHk");
        Map<String, TemplateData> m = new HashMap<>(3);
        m.put("character_string1", new TemplateData(orders.getCode()));
        m.put("thing3", new TemplateData("变更订单日期"));
        //变更后日期:07-23至07-25
        m.put("thing5", new TemplateData("变更后日期:" +DateUtil.getFomartDate(orders.getStartDate(),"MM-dd") + "至" +DateUtil.getFomartDate(orders.getEndDate(),"MM-dd")));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        //用户的openid(要发送给那个用户)
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 订单变更通知:{}", JSONObject.toJSONString(responseEntity));
    }
    public  void  autoDispatchMessage(String openid, Orders orders,double distance){
        try{
            RestTemplate restTemplate = new RestTemplate();
            String accessToken = WxMiniConfig.wxMaService.getAccessToken();
            log.info("微信小程序->微信消息通知 - 服务派单  -> accessToken:{}",accessToken);
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
            //拼接推送的模版
            WxMsgVO wxMsgVO = new WxMsgVO();
            wxMsgVO.setTouser(openid);
            //订阅消息模板id
            wxMsgVO.setTemplate_id("1h6JYpQf-mDKV4tYQ6gGDONfx1awqtm3-y9W8vUraT4");
            Map<String, TemplateData> m = new HashMap<>(5);
            m.put("thing2", new TemplateData(Constants.orderType.getName(orders.getType())));
            m.put("thing3", new TemplateData(orders.getOrderContent()));
            m.put("phrase4", new TemplateData("此地距离您"+distance+"公里"));
            m.put("amount28", new TemplateData(orders.getEstimatedAccount().toString()));
            m.put("thing12", new TemplateData("工单将于"+DateUtil.getFomartDate(orders.getStartDate(),"MM-dd")+"开始"));
            String pageUrl = Constants.equalsInteger(orders.getType(),Constants.orderType.hyd.getKey())?orderDetailFreight:
                    Constants.equalsInteger(orders.getType(),Constants.orderType.scd.getKey())?orderDetailFood:orderDetail;
            pageUrl.replace("{id}",orders.getId().toString());
            wxMsgVO.setPage(pageUrl);
            wxMsgVO.setData(m);
            log.info("微信小程序->微信消息通知 服务派单:{}", JSONObject.toJSONString(wxMsgVO));
            //用户的openid(要发送给那个用户)
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMsgVO, String.class);
            log.info("微信小程序->微信消息通知 服务派单:{}", JSONObject.toJSONString(responseEntity));
        }catch (WxErrorException wxErrorException){
        }
    public  void  withdrawalMessage(String openid, WithdrawalOrders withdrawalOrders) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 提现成功通知  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("fNJy4545hcrH83bP3a1vszs7XEKWjXMsrfr2XCNsql0");
        Map<String, TemplateData> m = new HashMap<>(4);
        m.put("phrase2", new TemplateData("已打款"));
        m.put("amount1", new TemplateData((new BigDecimal(withdrawalOrders.getAmount().toString()).divide(new BigDecimal("100"))).toString()));
        m.put("time3", new TemplateData(DateUtil.getFomartDate(withdrawalOrders.getUpdateTime(),"yyyy.MM.dd HH.mm.ss")));
        m.put("thing4", new TemplateData("打款成功,请注意查收"));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        //用户的openid(要发送给那个用户)
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 提现成功通知:{}", JSONObject.toJSONString(responseEntity));
    }
    public  void  revenueMessage(String openid, Orders orders) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 订单收益通知  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("tDpYImlrdv-0d3euTrHbYZ1cEZvjVHTNlqHvV0tpLHg");
        Map<String, TemplateData> m = new HashMap<>(5);
        m.put("character_string8", new TemplateData(orders.getCode()));
        m.put("phrase3", new TemplateData("已支付"));
        m.put("phrase4", new TemplateData("微信支付"));
        m.put("amount6", new TemplateData((new BigDecimal(orders.getReceiveAccount().toString()).divide(new BigDecimal("100")))+"元"));
        m.put("date7", new TemplateData(DateUtil.getFomartDate(new Date(),"yyyy-MM-dd HH:mm:ss")));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        //用户的openid(要发送给那个用户)
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 订单收益通知:{}", JSONObject.toJSONString(responseEntity));
    }
    public  void  autoDispatchMessage(String openid, Orders orders,BigDecimal distance) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
        log.info("微信小程序->微信消息通知 - 服务派单  -> accessToken:{}",accessToken);
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVO = new WxMsgVO();
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("1h6JYpQf-mDKV4tYQ6gGDONfx1awqtm3-y9W8vUraT4");
        Map<String, TemplateData> m = new HashMap<>(5);
        m.put("thing2", new TemplateData(Constants.orderType.getName(orders.getType())));
        m.put("thing3", new TemplateData(orders.getOrderContent()));
        m.put("phrase4", new TemplateData("此地距离您"+distance+"公里"));
        m.put("amount28", new TemplateData(orders.getEstimatedAccount().toString()));
        m.put("thing12", new TemplateData("工单将于"+DateUtil.getFomartDate(orders.getStartDate(),"MM-dd")+"开始"));
        //TODO 跳转地址
        wxMsgVO.setPage("");
        wxMsgVO.setData(m);
        //用户的openid(要发送给那个用户)
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 服务派单:{}", JSONObject.toJSONString(responseEntity));
    }
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java
@@ -12,6 +12,9 @@
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.core.http.HostName;
import com.wechat.pay.java.core.notification.RSAPublicKeyNotificationConfig;
import com.wechat.pay.java.service.billdownload.BillDownloadService;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiService;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension;
@@ -78,27 +81,28 @@
     */
    public void load_wxPayService()   {
        try {
//            Config config =
//                    new RSAPublicKeyConfig.Builder()
//                            .merchantId(wxPayProperties.getMchId())
//                            .privateKeyFromPath(wxPayProperties.getPrivateKeyPath())
//                            .publicKeyFromPath(wxPayProperties.getPubKeyPath())
//                            .publicKeyId("PUB_KEY_ID_0117000719222024112700219100000508")
//                            .merchantSerialNumber(wxPayProperties.getSerialNumer())
//                            .apiV3Key(wxPayProperties.getApiV3Key())
//                            .build();
            Config config =
                    new RSAAutoCertificateConfig.Builder()
                    new RSAPublicKeyConfig.Builder()
                            .merchantId(wxPayProperties.getMchId())
                            .privateKeyFromPath(wxPayProperties.getPrivateKeyPath())
//                            .publicKeyFromPath(wxPayProperties.getPubKeyPath())
//                            .publicKeyId("PUB_KEY_ID_0117000719222024112700219100000508")
                            .publicKeyFromPath(wxPayProperties.getPubKeyPath())
                            .publicKeyId(wxPayProperties.getPayPublicKeyId())
                            .merchantSerialNumber(wxPayProperties.getSerialNumer())
                            .apiV3Key(wxPayProperties.getApiV3Key())
                            .build();
//            Config config =
//                    new RSAAutoCertificateConfig.Builder()
//                            .merchantId(wxPayProperties.getMchId())
//                            .privateKeyFromPath(wxPayProperties.getPrivateKeyPath())
////                            .publicKeyFromPath(wxPayProperties.getPubKeyPath())
////                            .publicKeyId("PUB_KEY_ID_0117000719222024112700219100000508")
//                            .merchantSerialNumber(wxPayProperties.getSerialNumer())
//                            .apiV3Key(wxPayProperties.getApiV3Key())
//                            .build();
//            this.wxPayService =  new JsapiService.Builder().config(config).build();
            this.jsapiExtService =  new JsapiServiceExtension.Builder().config(config).build();
            this.refundService = new RefundService.Builder().config(config).build();
            this.billDownloadService = new BillDownloadService.Builder().config(config).build();
server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java
@@ -53,13 +53,13 @@
        withdrawalOrders.setCreateTime(new Date());
        withdrawalOrdersMapper.insert(withdrawalOrders);
        CreateRequest request = new CreateRequest();
        request.setOutTradeNo(orders.getCode());
        request.setOutTradeNo(orders.getOutTradeNo());
        request.setOutRefundNo(withdrawalOrders.getId().toString());
        request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
        request.setNotifyUrl(WxMiniConfig.wxProperties.getRefundNotifyUrl());
        AmountReq amountReq = new AmountReq();
        amountReq.setTotal(withdrawalOrders.getAmount());
        amountReq.setRefund(withdrawalOrders.getAmount());
        amountReq.setTotal(1L);//withdrawalOrders.getAmount());
        amountReq.setRefund(1L);//withdrawalOrders.getAmount());
        amountReq.setCurrency("CNY");
        request.setAmount(amountReq);
        try {
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
@@ -63,6 +63,7 @@
    private String privateKeyPath ;
    private String privateCertPath;// gybike
    private String pubKeyPath;//
    private String payPublicKeyId;//
    private String wechatSerialNumer;
@@ -70,7 +71,7 @@
    private String wechatPubKeyPath; //微信支付公钥文件路径
    private String wechatPrivateKeyPath;
    private String wechatNotifyUrl;
//    private String wechatApiV3Key;
    private String wechatApiV3Key;
//    private String wechatPlatformPubKeyPath;
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -647,7 +647,7 @@
    public  enum smsContent {
        accept(0, "SMS_491325122","您的{order}订单已被接单!时间:{time1}-{time2},接单方:{name}。"),
        accept(0, "SMS_491325122","您的{order}订单已被接单!时间:{time1}-{time2},可进入小程序联系接单方。"),
        receiveCancel(1, "SMS_491055243","您的{order}订单,时间:{time1}-{time2},已被接单方取消,订单已重新进入接单大厅。"),
        platformCancel(2, "SMS_491375152","您的{order}订单,时间:{time1}-{time2},已由平台取消。如有疑问请联系客服。"),
        agreeUpd(3, "SMS_491190259","接单方已同意您将{order}的订单时间修改为{time1}至{time2}。"),
server/services/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -2057,7 +2057,7 @@
     */
    public static String getCurrDateTime() {
        Timestamp date = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(date);
    }
    public static String getCurrDateTimeShort() {
server/services/src/main/java/com/doumee/service/business/AliSmsService.java
@@ -46,72 +46,74 @@
    private final static String SING_NAME = "橙桔天下科技";
    public void sendSms(int type, String phone, Orders orders, String receiveName, String businessPhone, BigDecimal distance, IdentityInfo identityInfo,CategoryMapper categoryMapper){
        Constants.smsContent smsContent = Constants.smsContent.getSmsContent(type);
        Map<String,Object> tempParam = new HashMap<>();
        if(smsContent.getName().indexOf("time1")>=Constants.ZERO){
            tempParam.put("time1", DateUtil.formatDate(orders.getStartDate(),"MM-dd"));
        }
        if(smsContent.getName().indexOf("time2")>=Constants.ZERO){
            tempParam.put("time2", DateUtil.formatDate(orders.getEndDate(),"MM-dd"));
        }
        if(smsContent.getName().indexOf("name")>=Constants.ZERO){
            tempParam.put("name", receiveName);
        }
        if(smsContent.getName().indexOf("money")>=Constants.ZERO){
            tempParam.put("money", new BigDecimal(orders.getReceiveAccount().toString()).divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP)+"元");
        }
        if(smsContent.getName().indexOf("distance")>=Constants.ZERO){
            tempParam.put("distance", distance +"km");
        }
        //认证短信 特殊处理
        if(Constants.equalsInteger(smsContent.getKey(),Constants.smsContent.authentication.getKey())){
            //认证类型
            if(smsContent.getName().indexOf("authentication")>=Constants.ZERO){
                tempParam.put("authentication", Constants.equalsInteger(identityInfo.getAuthType(),Constants.ZERO)?"个人":identityInfo.getCompanyName());
    public void businessSendSms(int type, String phone, Orders orders, BigDecimal distance,
                        IdentityInfo identityInfo,CategoryMapper categoryMapper){
        try{
            Constants.smsContent smsContent = Constants.smsContent.getSmsContent(type);
            Map<String,Object> tempParam = new HashMap<>();
            if(smsContent.getName().indexOf("time1")>=Constants.ZERO){
                tempParam.put("time1", DateUtil.formatDate(orders.getStartDate(),"MM-dd"));
            }
            if(smsContent.getName().indexOf("order")>=Constants.ZERO){
                tempParam.put("order", Constants.orderType.getName(identityInfo.getType()).replace("单",""));
            if(smsContent.getName().indexOf("time2")>=Constants.ZERO){
                tempParam.put("time2", DateUtil.formatDate(orders.getEndDate(),"MM-dd"));
            }
            if(smsContent.getName().indexOf("status")>=Constants.ZERO){
                tempParam.put("status", Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"已通过":"未通过");
            if(smsContent.getName().indexOf("money")>=Constants.ZERO){
                tempParam.put("money", new BigDecimal(orders.getReceiveAccount().toString()).divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP)+"元");
            }
        }else{
            if(smsContent.getName().indexOf("order")>=Constants.ZERO){
                String order = "";
                //查询订单的类型信息
                if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                    order = Constants.workType.getName(orders.getWorkType());
                    Category category = categoryMapper.selectById(orders.getCategoryId());
                    if(Objects.nonNull(category)){
                        order = category.getName() + order;
                    }
                }else if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                    order = "运输";
                    Category category = categoryMapper.selectById(orders.getTransportTypeId());
                    if(Objects.nonNull(category)){
                        order = category.getName() + order;
                    }
                }else{
                    List<CateringDTO> cateringDTOList = JSONArray.parseArray(orders.getWayInfo(),CateringDTO.class);
                    if(CollectionUtils.isNotEmpty(cateringDTOList)){
                        for (CateringDTO cateringDTO:cateringDTOList) {
                            if(StringUtils.isBlank(order)){
                                order = cateringDTO.getName();
                            }else{
                                order = order + "/" +cateringDTO.getName();
            if(smsContent.getName().indexOf("distance")>=Constants.ZERO){
                tempParam.put("distance", distance +"km");
            }
            //认证短信 特殊处理
            if(Constants.equalsInteger(smsContent.getKey(),Constants.smsContent.authentication.getKey())){
                //认证类型
                if(smsContent.getName().indexOf("authentication")>=Constants.ZERO){
                    tempParam.put("authentication", Constants.equalsInteger(identityInfo.getAuthType(),Constants.ZERO)?"个人":identityInfo.getCompanyName());
                }
                if(smsContent.getName().indexOf("order")>=Constants.ZERO){
                    tempParam.put("oeder", Constants.orderType.getName(identityInfo.getType()).replace("单",""));
                }
                if(smsContent.getName().indexOf("status")>=Constants.ZERO){
                    tempParam.put("status", Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"已通过":"未通过");
                }
            }else{
                if(smsContent.getName().indexOf("order")>=Constants.ZERO){
                    String order = "";
                    //查询订单的类型信息
                    if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                        order = Constants.workType.getName(orders.getWorkType());
                        Category category = categoryMapper.selectById(orders.getCategoryId());
                        if(Objects.nonNull(category)){
                            order = category.getName() + order;
                        }
                    }else if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                        order = "运输";
                        Category category = categoryMapper.selectById(orders.getTransportTypeId());
                        if(Objects.nonNull(category)){
                            order = category.getName() + order;
                        }
                    }else{
                        List<CateringDTO> cateringDTOList = JSONArray.parseArray(orders.getWayInfo(),CateringDTO.class);
                        if(CollectionUtils.isNotEmpty(cateringDTOList)){
                            for (CateringDTO cateringDTO:cateringDTOList) {
                                if(StringUtils.isBlank(order)){
                                    order = cateringDTO.getName();
                                }else{
                                    order = order + "/" +cateringDTO.getName();
                                }
                            }
                        }
                    }
                    tempParam.put("order",order);
                }
                tempParam.put("order",order);
            }
            if(smsContent.getName().indexOf("distance")>=Constants.ZERO){
                tempParam.put("distance", distance +"km");
            }
            AliSmsService.sendSms(phone,smsContent.getCode(), JSONObject.toJSONString(tempParam));
        }catch (Exception e){
            log.error("短信发送失败~");
        }
        if(smsContent.getName().indexOf("authentication")>=Constants.ZERO){
            tempParam.put("distance", distance +"km");
        }
        AliSmsService.sendSms(phone,smsContent.getCode(), JSONObject.toJSONString(tempParam));
    }
@@ -166,10 +168,10 @@
            //请求失败这里会抛ClientException异常
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//                logger.info(phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
                log.info("短信发送内容:"+phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
                return true;
            } else {
//                logger.error(phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
                log.error("短信发送内容:"+phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
            }
        } catch (Exception e) {
            e.printStackTrace();
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -11,12 +11,14 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.IdentityInfoMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.dto.AuditDTO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.AliSmsService;
import com.doumee.service.business.IdentityInfoService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -51,7 +53,11 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private AliSmsService aliSmsService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -474,16 +480,15 @@
                .eq(Member::getId,identityInfo.getMemberId())
        );
        try{
            //发送微信通知
            if(StringUtils.isNotBlank(member.getOpenid())){
                sendWxMessage.identityInfoMessage(member.getOpenid(),identityInfo);
            }
        }catch (WxErrorException wxErrorException){
        //发送微信通知
        if(StringUtils.isNotBlank(member.getOpenid())){
            sendWxMessage.identityInfoMessage(member.getOpenid(),identityInfo);
        }
        //短信通知
        aliSmsService.businessSendSms(Constants.smsContent.authentication.getKey(),
                member.getTelephone(),null,null,
                identityInfo,categoryMapper);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -399,18 +399,19 @@
        userCenterVO.setTaskingTotal(Constants.ZERO);
        userCenterVO.setDoneTotal(Constants.ZERO);
        userCenterVO.setReceiveTotal(Constants.ZERO);
        List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getReleaseMemberId,member.getId()));
        List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO)
                .eq(Orders::getReleaseMemberId,member.getId()));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(releaseOrders)){
            userCenterVO.setReleaseTaskTotal(releaseOrders.size());
            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.waitPay.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.accept.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
            userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setWaitReceiveTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.wait.getKey())).collect(Collectors.toList()).size());
        }
        List<Orders> acceptOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getAcceptMemberId,member.getId()));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(acceptOrders)){
            userCenterVO.setReceiveTotal(acceptOrders.size());
            userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.accept.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setDoneTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
            userCenterVO.setDoneTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())).collect(Collectors.toList()).size());
        }
        member.setUserCenterVO(userCenterVO);
        return member;
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.wx.SendWxMessage;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.config.wx.WxMiniUtilService;
import com.doumee.core.constants.Constants;
@@ -18,6 +19,7 @@
import com.doumee.dao.business.model.*;
import com.doumee.dao.dto.*;
import com.doumee.dao.vo.OrderReleaseVO;
import com.doumee.service.business.AliSmsService;
import com.doumee.service.business.OrdersService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -45,6 +47,7 @@
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 订单信息记录Service实现
@@ -87,6 +90,12 @@
    @Autowired
    private WxMiniUtilService wxMiniUtilService;
    @Autowired
    private SendWxMessage sendWxMessage;
    @Autowired
    private AliSmsService aliSmsService;
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
@@ -96,6 +105,11 @@
        OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
        Object objects = null;
        this.initVerification(orders);
        Member member = memberMapper.selectById(orders.getMember().getId());
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户信息异常");
        }
        orders.setCreateTime(new Date());
        orders.setUpdateTime(orders.getUpdateTime());
        orders.setPayStatus(Constants.ZERO);
@@ -120,16 +134,19 @@
        }
        //用餐订单
        if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
            orders.setPayAccount(orders.getEstimatedAccount());
            Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
            orders.setReceiveAccount(orders.getPayAccount() - tcje);
            orders.setStatus(Constants.ordersStatus.waitPay.getKey());
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            orders.setPayAccount(orders.getEstimatedAccount());
            //唤起支付业务
            objects = this.getWxPayResponse(orders,orders.getMember().getOpenid());
            objects = this.getWxPayResponse(orders,member.getOpenid());
            orderReleaseVO.setObject(objects);
        }else{
            orders.setStatus(Constants.ordersStatus.wait.getKey());
        }
        ordersMapper.insert(orders);
        orderReleaseVO.setId(orders.getId());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orders.getMultifileList())){
            List<Multifile> multifileList = orders.getMultifileList();
@@ -147,7 +164,7 @@
            multifileMapper.insert(multifileList);
        }
        //更新用户发单量
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" receive_num =  ( receive_num + 1 )").eq(Member::getId,orders.getMember().getId()));
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" PUBLISH_NUM =  ( ifnull(PUBLISH_NUM,0) + 1 )").eq(Member::getId,orders.getMember().getId()));
        //创建操作日志
        Constants.OrdersLog ordersLog = Constants.OrdersLog.UPLOAD;
@@ -178,6 +195,7 @@
        request.setSpAppid(WxMiniConfig.wxProperties.getAppId());
        request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
        request.setSubAppid(WxMiniConfig.wxProperties.getSubAppId());
        Payer payer = new Payer();
        payer.setSubOpenid(openid);
        request.setPayer(payer);
@@ -653,18 +671,28 @@
                .set(Orders::getStatus,Constants.ordersStatus.accept.getKey())
        );
        //更新接单量
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" publish_num = (publish_num + 1 )").eq(Member::getId,member.getId()));
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" RECEIVE_NUM = (ifnull(RECEIVE_NUM,0) + 1 )").eq(Member::getId,member.getId()));
        //创建操作日志
        Constants.OrdersLog ordersLog = Constants.OrdersLog.RECEIVE;
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),member.getId(),null);
        //TODO 微信公众号提醒 已接单提醒
        IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,member.getId())
                .eq(IdentityInfo::getType,orders.getType())
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(org.apache.commons.lang3.StringUtils.isNotBlank(member.getOpenid())&&Objects.nonNull(wokerIdentityInfo)){
            //发送微信通知
            sendWxMessage.acceptMessage(member.getOpenid(),orders,wokerIdentityInfo.getLinkName(),wokerIdentityInfo.getTelephone());
        }
        //短信通知
        aliSmsService.businessSendSms(Constants.smsContent.accept.getKey(),member.getTelephone(),orders,null,
                wokerIdentityInfo,categoryMapper);
    }
@@ -746,7 +774,23 @@
        this.saveOrderLog(model,ordersLog,
                ordersLog.getInfo(),orders.getMember().getId(),null);
        //TODO 通知接单人 订单发生变更
        //通知接单人 订单发生变更
        Member member = memberMapper.selectById(orders.getAcceptMemberId());
        //发送微信通知
        sendWxMessage.orderUpdMessage(member.getOpenid(),orders);
        IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,member.getId())
                .eq(IdentityInfo::getType,orders.getType())
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(Objects.nonNull(wokerIdentityInfo)){
            //短信通知
            aliSmsService.businessSendSms(Constants.smsContent.orderUpd.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
                    null,categoryMapper);
        }
    }
@@ -826,8 +870,12 @@
            Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_DISAGREE;
            this.saveOrderLog(orders,ordersLog,
                    ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null);
            //TODO 发送不同意变更通知
        }
        //短信通知
        aliSmsService.businessSendSms(!Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)?
                        Constants.smsContent.agreeUpd.getKey():Constants.smsContent.disAgreeUpd.getKey()
                ,orders.getLinkPhone(),null,null,
                null,categoryMapper);
    }
@@ -844,6 +892,7 @@
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
    }
@@ -895,6 +944,7 @@
                //退款业务
                WithdrawalOrders  withdrawalOrders = new WithdrawalOrders();
                withdrawalOrders.setCreateTime(new Date());
                withdrawalOrders.setDeleted(Constants.ZERO);
                withdrawalOrders.setMemberId(orders.getReleaseMemberId());
                withdrawalOrders.setAmount(orders.getPayAccount());
                withdrawalOrders.setStatus(Constants.ZERO);
@@ -948,8 +998,6 @@
                    .set(Orders::getCancelType,Constants.ONE)
                    .eq(Orders::getId,orders.getId())
            );
            //TODO 发单方取消订单通知接单方
            //减少接单量
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("receive_num = (receive_num - 1) ").eq(Member::getId,orders.getAcceptMemberId()));
        }
@@ -961,8 +1009,26 @@
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),member.getId(),null);
        List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
            List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
            //发送微信通知
            sendWxMessage.cancelMessage(openIdList,orders,Constants.ONE);
        }
        IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
                .eq(IdentityInfo::getType,orders.getType())
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(Objects.nonNull(wokerIdentityInfo)){
            //短信通知
            aliSmsService.businessSendSms(Constants.smsContent.releaseCancel.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
                    null,categoryMapper);
        }
    }
@@ -1009,8 +1075,18 @@
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),member.getId(),null);
        //TODO 接单方取消订单通知
        List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
            List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
            //发送微信通知
            sendWxMessage.cancelMessage(openIdList,orders,Constants.TWO);
        }
        //短信通知
        aliSmsService.businessSendSms(Constants.smsContent.receiveCancel.getKey(),member.getTelephone(),orders,null,
                null,categoryMapper);
    }
@@ -1037,6 +1113,11 @@
        if(!Constants.equalsInteger(orders.getReleaseMemberId(),doneOrderDTO.getMember().getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
        Member payMember = memberMapper.selectById(doneOrderDTO.getMember().getId());
        if(Objects.isNull(payMember)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户信息异常");
        }
        OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
        orderReleaseVO.setId(orders.getId());
        Object object = null;
@@ -1049,7 +1130,7 @@
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            ordersMapper.updateById(orders);
            //唤起支付业务
            object = this.getWxPayResponse(orders,doneOrderDTO.getMember().getOpenid());
            object = this.getWxPayResponse(orders,payMember.getOpenid());
            orderReleaseVO.setObject(object);
        }else{
            orders.setStatus(Constants.ordersStatus.done.getKey());
@@ -1082,6 +1163,22 @@
            Constants.OrdersLog ordersLog = Constants.OrdersLog.DONE;
            this.saveOrderLog(orders,ordersLog,
                    ordersLog.getInfo(),doneOrderDTO.getMember().getId(),null);
            sendWxMessage.revenueMessage(member.getOpenid(),orders);
            //短信通知接单方
            if(Objects.nonNull(orders.getAcceptMemberId())){
                IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                        .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
                        .eq(IdentityInfo::getType,orders.getType())
                        .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                        .last("limit 1")
                );
                if(Objects.nonNull(wokerIdentityInfo)){
                    aliSmsService.businessSendSms(Constants.smsContent.pay.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
                            null,categoryMapper);
                }
            }
        }
        return orderReleaseVO;
    }
@@ -1172,6 +1269,32 @@
        Constants.OrdersLog ordersLog = Constants.OrdersLog.SYSTEM_CANCEL;
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),null,loginUserInfo.getId());
        List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                        .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
                );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
            List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
            //发送微信通知
            sendWxMessage.cancelMessage(openIdList,orders,Constants.ZERO);
        }
        //短信通知发单方
        aliSmsService.businessSendSms(Constants.smsContent.platformCancel.getKey(),orders.getLinkPhone(),orders,null,
                null,categoryMapper);
        //短信通知接单方
        if(Objects.nonNull(orders.getAcceptMemberId())){
            IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                    .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
                    .eq(IdentityInfo::getType,orders.getType())
                    .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                    .last("limit 1")
            );
            if(Objects.nonNull(wokerIdentityInfo)){
                aliSmsService.businessSendSms(Constants.smsContent.platformCancel2.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
                        null,categoryMapper);
            }
        }
    }
@@ -1207,9 +1330,10 @@
                .eq(Orders::getId,orders.getId())
        );
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .setSql(" score =  ( total_score +" + commentDTO.getLevel() + " ) / (score_order_num + 1 )")
                .setSql(" total_score =  total_score +" + commentDTO.getLevel())
                .setSql(" score_order_num = score_order_num + 1 " ).eq(Member::getId,orders.getAcceptMemberId())
                .setSql(" score =  ( ifnull(total_score,0) +" + commentDTO.getLevel() + " ) / (ifnull(score_order_num,0) + 1 )")
                .setSql(" total_score =  ifnull(total_score,0) +" + commentDTO.getLevel())
                .setSql(" score_order_num = ifnull(score_order_num,0) + 1 " )
                .eq(Member::getId,orders.getAcceptMemberId())
        );
        //日志存储
        Constants.OrdersLog ordersLog = Constants.OrdersLog.COMMENT;
@@ -1301,7 +1425,22 @@
                this.saveOrderLog(orders,ordersLog,
                        ordersLog.getInfo(),orders.getReleaseMemberId(),null);
                //TODO 通知接单方 款项已到账
                // 通知接单方 款项已到账
                sendWxMessage.revenueMessage(member.getOpenid(),orders);
                //短信通知接单方
                if(Objects.nonNull(orders.getAcceptMemberId())){
                    IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                            .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
                            .eq(IdentityInfo::getType,orders.getType())
                            .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                            .last("limit 1")
                    );
                    if(Objects.nonNull(wokerIdentityInfo)){
                        aliSmsService.businessSendSms(Constants.smsContent.pay.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
                                null,categoryMapper);
                    }
                }
            }
        }
@@ -1648,7 +1787,9 @@
            if(CollectionUtils.isEmpty(memberList)){
                continue;
            }
            Member member = memberList.get(Constants.ZERO);
            Member releaseMember = memberMapper.selectById(orders.getReleaseMemberId());
            //自动派单
            Orders model = ordersMapper.selectById(orders.getStatus());
            if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){
@@ -1663,13 +1804,34 @@
            );
            //更新接单量
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" publish_num = (publish_num + 1 )").eq(Member::getId,member.getId()));
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" publish_num = (ifnull(publish_num,0) + 1 )").eq(Member::getId,member.getId()));
            //创建操作日志
            Constants.OrdersLog ordersLog = Constants.OrdersLog.AUTO;
            this.saveOrderLog(orders,ordersLog,
                    ordersLog.getInfo(),member.getId(),null);
            IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                    .eq(IdentityInfo::getMemberId,member.getId())
                    .eq(IdentityInfo::getType,orders.getType())
                    .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                    .last("limit 1")
            );
            //通知发单方
            if(org.apache.commons.lang3.StringUtils.isNotBlank(releaseMember.getOpenid())&&Objects.nonNull(wokerIdentityInfo)){
                //发送微信通知
                sendWxMessage.acceptMessage(releaseMember.getOpenid(),orders,wokerIdentityInfo.getLinkName(),wokerIdentityInfo.getTelephone());
            }
            //通知接单方
            sendWxMessage.autoDispatchMessage(member.getOpenid(),orders,GeoUtils.haversineDistance(
                    orders.getLgt().doubleValue(), orders.getLat().doubleValue(),
                    member.getDriverIdentityModel().getLgt().doubleValue(),
                    member.getDriverIdentityModel().getLat().doubleValue()
            ));
            aliSmsService.businessSendSms(Constants.smsContent.dispatch.getKey(),orders.getLinkPhone(),orders,null,
                    null,categoryMapper);
        }
    }
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -1,6 +1,7 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.wx.SendWxMessage;
import com.doumee.config.wx.TransferToUser;
import com.doumee.config.wx.WXPayUtility;
import com.doumee.config.wx.WxMiniConfig;
@@ -9,6 +10,7 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.MemberRevenueMapper;
@@ -50,6 +52,9 @@
    @Autowired
    private MemberRevenueMapper memberRevenueMapper;
    @Autowired
    private SendWxMessage sendWxMessage;
    @Override
    public Integer create(WithdrawalOrders withdrawalOrders) {
@@ -249,44 +254,45 @@
    @Override
    public void transferSuccess(String outBillNo,Boolean isSuccess){
        //转账成功
        if(isSuccess){
            withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda()
                    .set(WithdrawalOrders::getStatus,Constants.ONE)
                    .eq(WithdrawalOrders::getOutBillNo,outBillNo)
            );
        }else {
            WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda()
                    .eq(WithdrawalOrders::getOutBillNo,outBillNo).last("limit 1"));
            if(Objects.isNull(withdrawalOrders)){
                return;
            }
            Member member = memberMapper.selectById(withdrawalOrders.getMemberId());
            if(Objects.isNull(member)){
                return;
            }
            //更新用户余额
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT +  " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId()));
            //存储流水记录
            MemberRevenue memberRevenue = new MemberRevenue();
            memberRevenue.setCreateTime(new Date());
            memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo());
            memberRevenue.setDeleted(Constants.ZERO);
            memberRevenue.setMemberId(withdrawalOrders.getMemberId());
            memberRevenue.setType(Constants.FOUR);
            memberRevenue.setOptType(Constants.ONE);
            memberRevenue.setBeforeAmount(member.getAmount());
            memberRevenue.setAmount(withdrawalOrders.getAmount());
            memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount());
            memberRevenue.setObjId(withdrawalOrders.getId());
            memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
            memberRevenue.setObjType(Constants.ONE);
            memberRevenue.setDeleted(Constants.ZERO);
            memberRevenue.setStatus(Constants.ZERO);
            memberRevenueMapper.insert(memberRevenue);
        WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda()
                .eq(WithdrawalOrders::getOutBillNo,outBillNo).last("limit 1"));
        Member member = memberMapper.selectById(withdrawalOrders.getMemberId());
        if(Objects.isNull(member)){
            return;
        }
        if(Objects.nonNull(withdrawalOrders)){
            //转账成功
            if(isSuccess){
                withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda()
                        .set(WithdrawalOrders::getStatus,Constants.ONE)
                        .set(WithdrawalOrders::getUpdateTime, DateUtil.getCurrDateTime())
                        .eq(WithdrawalOrders::getOutBillNo,outBillNo)
                );
                withdrawalOrders.setUpdateTime(new Date());
                sendWxMessage.withdrawalMessage(member.getOpenid(),withdrawalOrders);
            }else {
                //更新用户余额
                memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT +  " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId()));
                //存储流水记录
                MemberRevenue memberRevenue = new MemberRevenue();
                memberRevenue.setCreateTime(new Date());
                memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo());
                memberRevenue.setDeleted(Constants.ZERO);
                memberRevenue.setMemberId(withdrawalOrders.getMemberId());
                memberRevenue.setType(Constants.FOUR);
                memberRevenue.setOptType(Constants.ONE);
                memberRevenue.setBeforeAmount(member.getAmount());
                memberRevenue.setAmount(withdrawalOrders.getAmount());
                memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount());
                memberRevenue.setObjId(withdrawalOrders.getId());
                memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
                memberRevenue.setObjType(Constants.ONE);
                memberRevenue.setDeleted(Constants.ZERO);
                memberRevenue.setStatus(Constants.ZERO);
                memberRevenueMapper.insert(memberRevenue);
            }
        }
    }
    @Override
server/services/src/main/resources/application-dev.yml
@@ -88,6 +88,7 @@
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxRefundNotify
@@ -104,7 +105,7 @@
    wechatPubKeyPath: d://jinkuai/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: d://jinkuai/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret:
@@ -114,7 +115,7 @@
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: gybike
    typeId: jinkuai
#wx:
server/services/src/main/resources/application-pro.yml
@@ -1,9 +1,9 @@
spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://192.168.0.211:3306/jinkuai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://b66cc1a382964a6a9d46a522f2dfe672in01.internal.cn-south-1.mysql.rds.myhuaweicloud.com:3306/jinkuai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: Doumee@168
    password: Jinkuai!@#$%^
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
@@ -48,37 +48,44 @@
  basic:
    enable: true
    username: admin
    password:
    password: doumee@168
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start-------
    appId: wx48fd8faa35cc8277
    mchId: 1661770902
    apiV3Key: iF3kC8pL8dZ9iU3hN5fX9zI6eF4xQ6fT
    serialNumer: 368B835A194384FD583B83B77977B84127D2F655
    mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    #    notifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxPayNotify
    #    refundNotifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxRefundNotify
    notifyUrl: https://dmtest.ahapp.net/bike_h5_api/api/wxPayNotify
    refundNotifyUrl: https://dmtest.ahapp.net/bike_h5_api/api/wxRefundNotify
    keyPath: /usr/local/aliConfig/bike/apiclient_cert.p12
    privateCertPath: /usr/local/aliConfig/bike/apiclient_cert.pem
    privateKeyPath: /usr/local/aliConfig/bike/apiclient_key.pem
    #    keyPath: d://apiclient_cert.p12
    #    privateCertPath: d://apiclient_cert.pem
    #    privateKeyPath: d://apiclient_key.pem
    #服务商---------start------- 参数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24
    appSecret:
    #子商户------------start----
    subAppId: wxcd2b89fd2ff065f8 #wxcd2b89fd2ff065f8
    subAppSecret: 3462fa186da7cb06c544df8d8664b63a #3336812504c830b1c3c5243f9ece407a
    subMchId: 1661772003
    subMchKey: EVM8E15TKXE0OEMJFC0V6UFVIOZ5CSQS
    subMchId: 1723326069    #子商户号
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: gybike
    typeId: jinkuai
upload:
  type: blob
server/services/src/main/resources/application-test.yml
@@ -76,15 +76,17 @@
  pay:
    #服务商---------start------- 参数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx332441ae5b12be7d    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 7DCD480EB6DF3791721867A6EB57105DECEF38BE #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
@@ -94,6 +96,7 @@
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
@@ -104,7 +107,7 @@
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: gybike
    typeId: jinkuai
upload:
  type: blob
server/web/src/main/resources/application.yml
@@ -12,7 +12,7 @@
spring:
  profiles:
    active: dev
    active: pro
  # JSON返回配置
  jackson:
    # 默认时区