MrShi
2025-08-21 d98b610bd0793dd5d29f623400a1d0a81bb55334
优化
已添加1个文件
已修改21个文件
1253 ■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/OrdersController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AliSmsService.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 247 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-test.yml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/OrdersApi.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/App.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/index/index.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/withdrawal/withdrawal.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/store/index.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -62,13 +62,13 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:orders:update")
    public ApiResponse updateById(@RequestBody Orders orders) {
        ordersService.updateById(orders);
        return ApiResponse.success(null);
    }
//    @ApiOperation("根据ID修改")
//    @PostMapping("/updateById")
//    @RequiresPermissions("business:orders:update")
//    public ApiResponse updateById(@RequestBody Orders orders) {
//        ordersService.updateById(orders);
//        return ApiResponse.success(null);
//    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
server/pom.xml
@@ -263,6 +263,17 @@
      <version>0.2.15</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>3.5.0</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
      <version>1.1.0</version>
    </dependency>
 <!--   <dependency>
      <groupId>com.azure.spring</groupId>
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -76,7 +76,9 @@
    public void refreshToken(String token,Member member) {
        try {
            if(Objects.nonNull(member)){
                redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
                redisTemplate.expire(Constants.REDIS_TOKEN_KEY+token,jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
//                redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);
//                redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS);
            }
        } catch (Exception e) {
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java
@@ -5,15 +5,21 @@
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.business.model.WithdrawalOrders;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -29,9 +35,16 @@
    private static String goodsOrderUrl = "pages/settlementDetails/settlementDetails?goodsOrderId=";
    private static String identityInfoUrl = "pages/mine/mine";
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * ä¿¡æ¯è®¤è¯
     * @param openid
     * @param identityInfo
     * @throws WxErrorException
     */
    public  void  identityInfoMessage(String openid, IdentityInfo identityInfo) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = WxMiniConfig.wxMaService.getAccessToken();
@@ -43,12 +56,12 @@
        //用户的openid(要发送给那个用户)
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
        wxMsgVO.setTemplate_id("4H9ztG4E9BxJLwMuYSZ6oiM7yb4KX7u7bYhkhYJP0-Y");
        wxMsgVO.setTemplate_id("VJho7-lf-4_WZFfOzenDndgwNDIA0EvCiE6vqBnExpQ");
        Map<String, TemplateData> m = new HashMap<>(4);
        m.put("thing11", new TemplateData(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO)?"用工认证":Constants.equalsInteger(identityInfo.getType(),Constants.ONE)?"运货认证":"供餐认证"));
        m.put("phrase4", new TemplateData(Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.TWO)?"认证通过":"认证未通过"));
        m.put("date3", new TemplateData(DateUtil.getFomartDate(identityInfo.getAuditTime(),"yyyy-MM-dd HH:mm:ss")));
        m.put("thing5", new TemplateData(identityInfo.getAuditRemark()));
        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 =
@@ -57,4 +70,178 @@
    }
    /**
     *
     * @param openidList
     * @param orders
     * @param cancelType å–消类型:0=平台取消;1=发单方取消;1=接单方取消
     * @throws WxErrorException
     */
    public  void  cancelMessage(List<String> openidList, Orders orders,Integer cancelType ) 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();
        //订阅消息模板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));
            }
        }else{
            log.info("微信小程序->微信消息通知 è®¢å•取消业务:{}", "无人员信息");
        }
    }
    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  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  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
@@ -31,7 +31,7 @@
    public static WxMaService wxMaService;
    /********微信小程序支付**********/
    public static JsapiService wxPayService;
    public static WxPayService wxPayV2Service;
//    public static WxPayService wxPayV2Service;
    public static RefundService refundService;
    public static JsapiServiceExtension jsapiExtService;
    public static BillDownloadService billDownloadService;
@@ -48,8 +48,7 @@
    void init() {
        this.load_WxMaService();
        this.load_wxPayService();
        this.load_wxPayV2Service();
        this.load_transferToUser();
//        this.load_wxPayV2Service();
        this.load_transferToUser();
        this.wxProperties = wxPayProperties;
    }
@@ -63,8 +62,8 @@
            config.setAppid(StringUtils.trimToNull(wxPayProperties.getSubAppId()));
            config.setSecret(StringUtils.trimToNull(wxPayProperties.getSubAppSecret()));
        }else {
            config.setAppid(StringUtils.trimToNull(wxPayProperties.getAppId()));
            config.setSecret(StringUtils.trimToNull(wxPayProperties.getAppSecret()));
//            config.setAppid(StringUtils.trimToNull(wxPayProperties.getAppId()));
//            config.setSecret(StringUtils.trimToNull(wxPayProperties.getAppSecret()));
        }
        config.setMsgDataFormat("JSON");
        //config.setToken("");
@@ -100,22 +99,22 @@
    /**
     * åˆå§‹åŒ–微信小程序支付
     */
    public void load_wxPayV2Service()
    {
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setTradeType(WxPayConstants.TradeType.JSAPI);
        payConfig.setSignType(WxPayConstants.SignType.MD5);
        payConfig.setAppId(StringUtils.trimToNull(wxPayProperties.getAppId()));
        payConfig.setSubAppId(StringUtils.trimToNull(wxPayProperties.getSubAppId()));
        payConfig.setMchId(StringUtils.trimToNull(wxPayProperties.getMchId()));
        payConfig.setSubMchId(StringUtils.trimToNull(wxPayProperties.getSubMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(wxPayProperties.getMchKey()));
//        payConfig.setKeyPath(StringUtils.trimToNull(wxPayProperties.getKeyPath()));
        payConfig.setNotifyUrl(StringUtils.trimToNull(wxPayProperties.getNotifyUrl()));
        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        this.wxPayV2Service = wxPayService;
    }
//    public void load_wxPayV2Service()
//    {
//        WxPayConfig payConfig = new WxPayConfig();
//        payConfig.setTradeType(WxPayConstants.TradeType.JSAPI);
//        payConfig.setSignType(WxPayConstants.SignType.MD5);
//        payConfig.setAppId(StringUtils.trimToNull(wxPayProperties.getAppId()));
//        payConfig.setSubAppId(StringUtils.trimToNull(wxPayProperties.getSubAppId()));
//        payConfig.setMchId(StringUtils.trimToNull(wxPayProperties.getMchId()));
//        payConfig.setSubMchId(StringUtils.trimToNull(wxPayProperties.getSubMchId()));
//        payConfig.setMchKey(StringUtils.trimToNull(wxPayProperties.getMchKey()));
////        payConfig.setKeyPath(StringUtils.trimToNull(wxPayProperties.getKeyPath()));
//        payConfig.setNotifyUrl(StringUtils.trimToNull(wxPayProperties.getNotifyUrl()));
//        WxPayService wxPayService = new WxPayServiceImpl();
//        wxPayService.setConfig(payConfig);
//        this.wxPayV2Service = wxPayService;
//    }
    /**
@@ -136,6 +135,7 @@
//    }
    //转账业务
    public void load_transferToUser()
    {
        TransferToUser transferToUser = new TransferToUser(
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
@@ -38,7 +38,7 @@
    /**
     * æ”¯ä»˜API密钥
     */
    private String subMchKey;
//    private String subMchKey;
    /**
     * æ”¯ä»˜å›žè°ƒåœ°å€
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -592,4 +592,116 @@
    }
    public  enum orderType {
        ygd(0, "用工单"),
        hyd(1, "货运单"),
        scd(2, "送餐单"),
        ;
        // æˆå‘˜å˜é‡
        private int key;
        private String name;
        // æž„造方法
        orderType(int key, String name) {
            this.name = name;
            this.key = key;
        }
        // æ™®é€šæ–¹æ³•
        public static String getName(int index) {
            for (orderType c : orderType.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
    }
    public  enum smsContent {
        accept(0, "SMS_491325122","您的{order}订单已被接单!时间:{time1}-{time2},接单方:{name}。"),
        receiveCancel(1, "SMS_491055243","您的{order}订单,时间:{time1}-{time2},已被接单方取消,订单已重新进入接单大厅。"),
        platformCancel(2, "SMS_491375152","您的{order}订单,时间:{time1}-{time2},已由平台取消。如有疑问请联系客服。"),
        agreeUpd(3, "SMS_491190259","接单方已同意您将{order}的订单时间修改为{time1}至{time2}。"),
        disAgreeUpd(4, "SMS_491085252","接单方已拒绝您将{order}的订单时间修改为{time1}-{time2}。系统已重新将订单放入接单大厅。"),
        orderUpd(5, "SMS_491010267","请注意!您承接的{order}订单,客户将订单时间修改为{time1}-{time2}。请前往确认是否接受,超时不处理将视为同意。"),
        releaseCancel(6, "SMS_491150253","您承接的{order}订单,时间:{time1}-{time2},已被发单方取消。您可前往接单大厅重新接单。"),
        platformCancel2(7, "SMS_491420143","您承接的{order}订单,时间:{time1}-{time2},已由平台取消。如有疑问请联系客服。"),
        dispatch(8, "SMS_491180276","已为您智能匹配订单。订单类型:{order},时间:{time1}-{time2},距离:{distance},预计费用{money}。请前往确认。"),
        pay(9, "SMS_491180278","您承接的{order}订单款项已到账!到账金额:{money}。可在小程序账户余额进行查看。"),
        authentication(10, "SMS_491055290","您申请的{authentication}的{order}认证{status}。请在小程序查看详情。"),
        ;
        // æˆå‘˜å˜é‡
        private int key;
        private String code;
        private String name;
        // æž„造方法
        smsContent(int key,String code, String name) {
            this.name = name;
            this.code = code;
            this.key = key;
        }
        // æ™®é€šæ–¹æ³•
        public static Constants.smsContent getSmsContent(int index) {
            for (smsContent c : smsContent.values()) {
                if (c.getKey() == index) {
                    return c;
                }
            }
            return null;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
    }
}
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -193,7 +193,7 @@
    private Integer isUpdate;
    @ApiModelProperty(value = "修改时间", example = "1")
    private Integer isUpdateTime;
    private Date isUpdateTime;
    @ApiModelProperty(value = "接单方黑名单member:id å¤šä¸ªä»¥,分割")
    private String blackReceive;
@@ -364,6 +364,9 @@
    @TableField(exist = false)
    private BigDecimal queryLgt;
    @ApiModelProperty(value = "是否可取消:0=可以;1=不可以", example = "1")
    @TableField(exist = false)
    private Integer cancelStatus;
}
server/services/src/main/java/com/doumee/service/business/AliSmsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,180 @@
package com.doumee.service.business;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.dto.CateringDTO;
import com.github.pagehelper.Constant;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/23 11:37
 */
@Service
@Slf4j
public class AliSmsService {
    protected Logger logger = LogManager.getLogger("sms");
    private final static String ACCESS_KEY_ID = "LTAI5tMkg7wwV74a8H6Bm3Ej";
    private final static String ACCESS_KEY_SECRET = "FcHKST36sfwfo706L6bvrweGFIbp3n";
    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());
            }
            if(smsContent.getName().indexOf("order")>=Constants.ZERO){
                tempParam.put("order", 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);
            }
        }
        if(smsContent.getName().indexOf("authentication")>=Constants.ZERO){
            tempParam.put("distance", distance +"km");
        }
        AliSmsService.sendSms(phone,smsContent.getCode(), JSONObject.toJSONString(tempParam));
    }
    public static void main(String[] args) {
        Map<String,Object> tempParam = new HashMap<>();
        tempParam.put("order","葡萄采摘工");
        tempParam.put("time1","07-23");
        tempParam.put("time2","07-24");
        AliSmsService.sendSms("18055151023","SMS_491055243", JSONObject.toJSONString(tempParam));
    }
    /**
     * å‘短信模板(可群发)
     *
     * @param phone         è®¢å•详情
     * @param templateCode  æ¨¡æ¿code
     * @param templateParam æ¨¡æ¿å˜é‡json字符串
     * @return å¤„理结果
     */
    public static Boolean sendSms(String phone, String templateCode, String templateParam) {
        try {
            //设置超时时间-可自行调整
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            //初始化ascClient需要的几个参数
            //短信API产品名称(短信产品名固定,无需修改)
            final String product = "Dysmsapi";
            //短信API产品域名(接口地址固定,无需修改)
            final String domain = "dysmsapi.aliyuncs.com";
            //初始化ascClient,暂时不支持多region(请勿修改)
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            SendSmsRequest request = new SendSmsRequest();
            //使用post提交
            request.setMethod(MethodType.POST);
            //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
            request.setPhoneNumbers(phone);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(SING_NAME);
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templateCode);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
            request.setTemplateParam(templateParam);
            //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
            //dto.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            //dto.setOutId("yourOutId");
            //请求失败这里会抛ClientException异常
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//                logger.info(phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
                return true;
            } else {
//                logger.error(phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
            }
        } catch (Exception e) {
            e.printStackTrace();
//            logger.error(e);
        }
        return false;
    }
}
server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -52,8 +52,9 @@
     *
     * @param orders å®žä½“对象
     */
    void updateById(Orders orders);
//    void updateById(Orders orders);
    void update(Orders orders);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
@@ -105,13 +106,19 @@
    void begin(Integer orderId,Member member);
    void updOrderData(UpdOrderDataDTO updOrderDataDTO);
//    void updOrderData(UpdOrderDataDTO updOrderDataDTO);
//
    void confirmUpd(ConfirmUpdOrderDTO confirmUpdOrderDTO);
    void releaseCancelOrder(Integer orderId,Member member);
    /**
     * è®¢å•取消前置提示
     * @param orderId
     * @param member
     * @return
     */
    String cancelTips(Integer orderId,Member member);
    void receiveCancelOrder(Integer orderId,Member member);
    void cancelOrder(Integer orderId,Member member);
    OrderReleaseVO doneOrder(DoneOrderDTO doneOrderDTO);
@@ -128,7 +135,7 @@
    PageData<Orders> findPageForMini(PageWrap<Orders> pageWrap);
    Orders getDetail(Integer id,Integer userType);
    Orders getDetail(Integer id,Member member);
    void refundCallback(RefundNotification refundNotification);
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -252,7 +252,9 @@
    @Override
    public List<Category> getCategoryList(Integer type){
        List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda().eq(Category::getDeleted,Constants.ZERO).eq(Category::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(type),Category::getType,type));
                .eq(Objects.nonNull(type),Category::getType,type)
                .orderByAsc(Category::getSortnum)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){
            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -73,9 +73,18 @@
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(Objects.nonNull(identityInfo.getId())){
            IdentityInfo model = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                    .eq(IdentityInfo::getMemberId,identityInfo.getMemberId())
                    .eq(IdentityInfo::getType,identityInfo.getType())
                    .last("limit 1")
            );
            if(Objects.nonNull(model)){
                identityInfo.setId(model.getId());
            this.updateById(identityInfo);
        }else{
                return identityInfo.getId();
            }
            //查询用户是否已存在当前身份
            if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda()
                    .eq(IdentityInfo::getDeleted,Constants.ZERO)
@@ -94,7 +103,6 @@
                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity,Constants.ONE)
                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity,Constants.ONE)
                    .eq(Member::getId,identityInfo.getMemberId()));
        }
        return identityInfo.getId();
    }
@@ -459,6 +467,7 @@
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Member::getUpdateUser,user.getId())
                .set(Member::getUpdateTime,date)
                .set(Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO),Member::getAutoReceiveStatus,Constants.ONE)
                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity, auditDTO.getAuditStatus() )
                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity , auditDTO.getAuditStatus() )
                .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity , auditDTO.getAuditStatus() )
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -232,7 +232,7 @@
                    .or().eq(Member::getDriverIdentity,Constants.TWO );
        });
        queryWrapper.lambda().ge(pageWrap.getModel().getStartTime()!=null, Member::getCreateTime,pageWrap.getModel().getStartTime());
        queryWrapper.lambda().ne(pageWrap.getModel().getEndTime()!=null,Member::getCreateTime,pageWrap.getModel().getEndTime());
        queryWrapper.lambda().le(pageWrap.getModel().getEndTime()!=null,Member::getCreateTime,pageWrap.getModel().getEndTime());
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -252,8 +252,6 @@
    /***************小程序接口*************/
    /**
     * å¾®ä¿¡å°ç¨‹åºç™»å½•
@@ -328,7 +326,6 @@
                member.setPublishNum(Constants.ZERO.longValue());
                member.setAutoReceiveStatus(Constants.ONE);
                member.setUseIdentity(Constants.ZERO);
                member.setOpenid(wxPhoneRequest.getOpenid());
                memberMapper.insert(member);
            }
            AccountResponse accountResponse = new AccountResponse();
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -101,6 +101,7 @@
        orders.setPayStatus(Constants.ZERO);
        orders.setDeleted(Constants.ZERO);
        orders.setReleaseMemberId(orders.getMember().getId());
        orders.setCommentStatus(Constants.ZERO);
        //查询手续费
        Category platformCategory = categoryMapper.selectOne(new QueryWrapper<Category>().lambda().eq(Category::getType,Constants.THREE).eq(Category::getName,orders.getType()).eq(Category::getDeleted,Constants.ZERO).last("limit 1 "));
        if(Objects.isNull(platformCategory)){
@@ -121,6 +122,7 @@
        if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
            orders.setStatus(Constants.ordersStatus.waitPay.getKey());
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            orders.setPayAccount(orders.getEstimatedAccount());
            //唤起支付业务
            objects = this.getWxPayResponse(orders,orders.getMember().getOpenid());
            orderReleaseVO.setObject(objects);
@@ -182,7 +184,7 @@
        request.setOutTradeNo(orders.getOutTradeNo());
        request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//这个回调url必须是https开头的
        Amount amount = new Amount();
        amount.setTotal(1);//orders.getEstimatedAccount().intValue());
        amount.setTotal(1);//orders.getPayAccount().intValue());
        request.setAmount(amount);
//        PrepayResponse res = WxMiniConfig.wxPayService.prepay(request);
        // è·Ÿä¹‹å‰ä¸‹å•示例一样,填充预下单参数
@@ -328,12 +330,40 @@
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void updateById(Orders orders) {
    public void update(Orders orders){
        if(Objects.isNull(orders)
        || Objects.isNull(orders.getId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Orders model = ordersMapper.selectById(orders.getId());
        if(!Constants.equalsInteger(model.getReleaseMemberId(),orders.getMember().getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
        if(Constants.equalsInteger(model.getIsUpdate(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单已修改,待接单方确认,无法进行该操作");
        }
        if(!Constants.equalsInteger(model.getType(),Constants.TWO)){
            if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)||Constants.equalsInteger(model.getStatus(),Constants.ONE)){
                this.updateById(orders);
            }else if(Constants.equalsInteger(model.getStatus(),Constants.TWO)){
                this.updOrderData(orders,model);
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED);
            }
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
        }
    }
//    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void updateById(Orders orders) {
        Orders model = ordersMapper.selectById(orders.getId());
        if(Constants.equalsInteger(model.getType(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"此类订单无法进行修改");
@@ -362,6 +392,7 @@
                        || StringUtils.isEmpty(multifile.getName())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"附件信息错误");
                }
                multifile.setId(null);
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setCreateDate(new Date());
                multifile.setObjId(orders.getId());
@@ -378,7 +409,7 @@
            return;
        }
        for (Orders orders: orderss) {
            this.updateById(orders);
            //this.updateById(orders);
        }
    }
@@ -501,8 +532,11 @@
        queryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(model.getCode()),Orders::getCode, model.getCode());
        queryWrapper.eq(Objects.nonNull(model.getType()),Orders::getType, model.getType());
        queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus, model.getStatus());
        queryWrapper.eq(Objects.nonNull(model.getCommentStatus()),Orders::getCommentStatus, model.getCommentStatus());
        queryWrapper.eq(Objects.nonNull(model.getReleaseMemberId()),Orders::getReleaseMemberId, model.getReleaseMemberId());
        queryWrapper.eq(Objects.nonNull(model.getAcceptMemberId()),Orders::getAcceptMemberId, model.getAcceptMemberId());
        queryWrapper.eq(Objects.nonNull(model.getAcceptType()),Orders::getAcceptType, model.getAcceptType());
        queryWrapper.apply(org.apache.commons.lang3.StringUtils.isNotBlank(model.getReleaseName()),"m1.name", model.getReleaseName());
        queryWrapper.apply(org.apache.commons.lang3.StringUtils.isNotBlank(model.getReleaseName()),"m1.name like '%"+model.getReleaseName()+"%' or m1.TELEPHONE like '%"+model.getReleaseName()+"%' ");
        queryWrapper.apply(org.apache.commons.lang3.StringUtils.isNotBlank(model.getAcceptName()),"( i.LINK_NAME like '%"+model.getAcceptName()+"%' or i.company_name like '%"+model.getAcceptName()+"%' or i.TELEPHONE like '%"+model.getAcceptName()+"%' ) ");
        IPage<Orders> iPage = ordersMapper.selectJoinPage(page,Orders.class,queryWrapper);
        for (Orders orders:iPage.getRecords()) {
@@ -595,18 +629,19 @@
        if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"您自己的订单无法进行该操作");
        }
         member = memberMapper.selectById(member.getId());
        //查询用户是否有对应身份
        if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
            if(!Constants.equalsInteger(member.getWorkerIdentity(),Constants.TWO)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请联系管理员");
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请前往个人中心进行身份认证!");
            }
        }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
            if(!Constants.equalsInteger(member.getDriverIdentity(),Constants.TWO)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请联系管理员");
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请前往个人中心进行身份认证!");
            }
        }else{
            if(!Constants.equalsInteger(member.getChefIdentity(),Constants.TWO)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请联系管理员");
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信息异常,请前往个人中心进行身份认证!");
            }
        }
@@ -670,50 +705,36 @@
    /**
     * å‘单方修改订单 - å·²æŽ¥å•状态
     * @param updOrderDataDTO
     */
    @Override
//    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void updOrderData(UpdOrderDataDTO updOrderDataDTO){
        if(Objects.isNull(updOrderDataDTO)
            || Objects.isNull(updOrderDataDTO.getOrderId())
            || Objects.isNull(updOrderDataDTO.getStartDate())
            || Objects.isNull(updOrderDataDTO.getEndDate())){
    public void updOrderData(Orders orders,Orders model){
        if(Objects.isNull(orders)
            || Objects.isNull(orders.getStartDate())
            || Objects.isNull(orders.getEndDate())){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        Orders orders = ordersMapper.selectById(updOrderDataDTO.getOrderId());
        if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转,无法进行该操作");
        }
        if(!Constants.equalsInteger(orders.getReleaseMemberId(),updOrderDataDTO.getMember().getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
        if(Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单已修改,待接单方确认,无法进行该操作");
        }
        orders.setStartDate(updOrderDataDTO.getStartDate());
        orders.setEndDate(updOrderDataDTO.getEndDate());
        orders.setTotalDays(updOrderDataDTO.getTotalDays());
        model.setTotalDays(DateUtil.daysBetweenDates(orders.getEndDate(),orders.getStartDate())+1);
        model.setStartDate(orders.getStartDate());
        model.setEndDate(orders.getEndDate());
        //用车类型
        if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
            if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)) {
                orders.setPriceNum1(updOrderDataDTO.getTotalDays());
        if(Constants.equalsInteger(model.getType(),Constants.ONE)){
            if(Constants.equalsInteger(model.getCarType(),Constants.ZERO)) {
                model.setPriceNum1(orders.getTotalDays());
            }
        }else if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
            if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)||(Constants.equalsInteger(orders.getWorkType(),Constants.TWO)&&Constants.equalsInteger(orders.getCarType(),Constants.ZERO))){
                orders.setPriceNum1(updOrderDataDTO.getTotalDays());
        }else if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
            if(Constants.equalsInteger(model.getWorkType(),Constants.ONE)||
                    (Constants.equalsInteger(model.getWorkType(),Constants.TWO)&&Constants.equalsInteger(model.getCarType(),Constants.ZERO))){
                model.setPriceNum1(orders.getTotalDays());
            }
        }else{
            orders.setPriceNum1(updOrderDataDTO.getTotalDays());
            model.setPriceNum1(orders.getTotalDays());
        }
        Long total = this.getTotal(orders);
        ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                .set(Orders::getStartDate,updOrderDataDTO.getStartDate())
                .set(Orders::getEndDate,updOrderDataDTO.getEndDate())
                .set(Orders::getTotalDays,updOrderDataDTO.getTotalDays())
                .set(Orders::getStartDate,model.getStartDate())
                .set(Orders::getEndDate,model.getEndDate())
                .set(Orders::getTotalDays,model.getTotalDays())
                .set(Orders::getIsUpdate,Constants.ONE)
                .set(Orders::getIsUpdateTime,new Date())
                .set(Orders::getUpdateTime,new Date())
@@ -722,8 +743,8 @@
        );
        //创建操作日志
        Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_ORDER;
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),updOrderDataDTO.getMember().getId(),null);
        this.saveOrderLog(model,ordersLog,
                ordersLog.getInfo(),orders.getMember().getId(),null);
        //TODO é€šçŸ¥æŽ¥å•人 è®¢å•发生变更
    }
@@ -779,7 +800,7 @@
        if(!Constants.equalsInteger(orders.getAcceptMemberId(),confirmUpdOrderDTO.getMember().getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
        if( Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)){
        if(!Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)){
            ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                    .set(Orders::getIsUpdate,Constants.TWO)
                    .set(Orders::getUpdateTime,new Date())
@@ -799,7 +820,7 @@
                    .eq(Orders::getId,orders.getId())
            );
            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,confirmUpdOrderDTO.getMember().getId()));
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("receive_num = receive_num - 1").eq(Member::getId,confirmUpdOrderDTO.getMember().getId()));
            //记录不同意修改的日志
            Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_DISAGREE;
@@ -810,18 +831,55 @@
    }
    /**
     * å‘单方取消订单
     * @param orderId
     * @param member
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void releaseCancelOrder(Integer orderId,Member member){
    public void cancelOrder(Integer orderId,Member member){
        Orders orders = ordersMapper.selectById(orderId);
        if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
            this.releaseCancelOrder(orders,member);
        }else if(Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){
            this.receiveCancelOrder(orders,member);
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
    }
    @Override
    public String cancelTips(Integer orderId,Member member){
        Orders orders = ordersMapper.selectById(orderId);
        if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIMES).getCode());
        Long cancelTimes = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                .apply(" DATE(cancel_time) = DATE(NOW()) ")
                .eq(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
                .eq(Orders::getReleaseMemberId,member.getId()));
        //查询取消次数
        if(totalCancelTimes<=cancelTimes){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"今日订单主动取消次数已超出"+totalCancelTimes+"次,无法取消订单,如需处理请联系客服");
        }
        Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIME).getCode());
        Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
        if(hours < cancelTimeHour){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"距离订单开始时间不足"+cancelTimeHour+"小时,无法取消订单,如需处理请联系客服");
        }
        return  "今日还可主动取消"+(totalCancelTimes-cancelTimes)+"次,是否确认取消";
    }
    /**
     * å‘单方取消订单
     * @param member
     */
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void releaseCancelOrder(Orders orders,Member member){
        if(!(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.wait.getKey())
                ||Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.waitPay.getKey())
        || Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey()))){
@@ -893,30 +951,27 @@
            //TODO å‘单方取消订单通知接单方
            //减少接单量
            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,orders.getAcceptMemberId()));
            memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("receive_num = (receive_num - 1) ").eq(Member::getId,orders.getAcceptMemberId()));
        }
        //减少发单量
        memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getPublishNum,"publish_num - 1").eq(Member::getId,orders.getReleaseMemberId()));
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("publish_num = (publish_num - 1)").eq(Member::getId,orders.getReleaseMemberId()));
        //日志存储
        Constants.OrdersLog ordersLog = Constants.OrdersLog.RELEASE_CANCEL;
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),member.getId(),null);
    }
    /**
     * æŽ¥å•方取消接单
     * @param orderId
     * @param member
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void receiveCancelOrder(Integer orderId,Member member){
        Orders orders = ordersMapper.selectById(orderId);
        if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
    public void receiveCancelOrder(Orders orders,Member member){
        if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转,无法进行取消");
        }
@@ -948,7 +1003,7 @@
        );
        //减少接单量
        memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,orders.getAcceptMemberId()));
        memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" receive_num = receive_num - 1 ").eq(Member::getId,orders.getAcceptMemberId()));
        //日志存储
        Constants.OrdersLog ordersLog = Constants.OrdersLog.CANCEL;
        this.saveOrderLog(orders,ordersLog,
@@ -994,7 +1049,7 @@
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            ordersMapper.updateById(orders);
            //唤起支付业务
            object = this.getWxPayResponse(orders,orders.getMember().getOpenid());
            object = this.getWxPayResponse(orders,doneOrderDTO.getMember().getOpenid());
            orderReleaseVO.setObject(object);
        }else{
            orders.setStatus(Constants.ordersStatus.done.getKey());
@@ -1147,13 +1202,14 @@
                .set(Orders::getUpdateTime,new Date())
                .set(Orders::getCommentTime,new Date())
                .set(Orders::getCommentLevel,commentDTO.getLevel())
                .set(org.apache.commons.lang3.StringUtils.isNotBlank(commentDTO.getInfo()),Orders::getCommentInfo,commentDTO.getInfo())
                .set(Orders::getCommentType,Constants.ZERO)
                .eq(Orders::getId,orders.getId())
        );
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Member::getScore," ( total_score +" + commentDTO.getLevel() + " ) / (score_order_num + 1 )")
                .set(Member::getTotalScore," total_score +" + commentDTO.getLevel())
                .set(Member::getScoreOrderNum," score_order_num + 1 " ).eq(Member::getId,orders.getAcceptMemberId())
                .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())
        );
        //日志存储
        Constants.OrdersLog ordersLog = Constants.OrdersLog.COMMENT;
@@ -1171,7 +1227,7 @@
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public String payNotify(String preOrderId,String paymentNo){
        Orders orders = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda().eq(Orders::getCode,preOrderId).last("limit 1"));
        Orders orders = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda().eq(Orders::getOutTradeNo,preOrderId).last("limit 1"));
        if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
            //用餐订单  å¦‚果已经流转到已支付  åˆ™ç›´æŽ¥è¿”回
            if(!Constants.equalsInteger(orders.getStatus(),Constants.ZERO)){
@@ -1214,6 +1270,8 @@
                //存储流水记录
                MemberRevenue memberRevenue = new MemberRevenue();
                memberRevenue.setCreateTime(new Date());
                memberRevenue.setDeleted(Constants.ZERO);
                memberRevenue.setTransactionNo(orders.getCode());
                memberRevenue.setMemberId(orders.getAcceptMemberId());
                memberRevenue.setType(orders.getType());
                memberRevenue.setOptType(Constants.ONE);
@@ -1233,8 +1291,8 @@
                //更新接单用户的余额与历史总金额
                memberMapper.update(new UpdateWrapper<Member>().lambda()
                        .set(Member::getAmount,"amount + " + orders.getReceiveAccount() )
                        .set(Member::getTotalAmount,"amount + " + orders.getReceiveAccount() )
                        .setSql(" amount = ( amount + " + orders.getReceiveAccount() +")" )
                        .setSql(" total_amount = ( amount + " + orders.getReceiveAccount() + ")" )
                        .eq(Member::getId,member.getId())
                );
@@ -1320,7 +1378,7 @@
                //接单方 æˆ‘的订单
                queryWrapper.eq(Orders::getAcceptMemberId,model.getMember().getId());
                queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus,model.getStatus());
                queryWrapper.orderByDesc(Orders::getCreateTime);
                queryWrapper.orderByDesc(Orders::getAcceptTime);
            }else{
                //查询用户的接单权重
                ReceiveWeight receiveWeight = receiveWeightMapper.selectOne(new QueryWrapper<ReceiveWeight>().lambda().eq(ReceiveWeight::getDeleted,Constants.ZERO).apply(" RECEIVE_MIN < "+model.getMember().getReceiveNum()+" and RECEIVE_MAX > " + model.getMember().getReceiveNum()).last(" limit 1 "));
@@ -1427,7 +1485,7 @@
    @Override
    public Orders getDetail(Integer id,Integer userType) {
    public Orders getDetail(Integer id,Member member) {
        Orders orders = ordersMapper.selectJoinOne(Orders.class,new MPJLambdaWrapper<Orders>()
                        .selectAll(Orders.class)
                        .select(" m1.name " , Orders::getReleaseName)
@@ -1472,9 +1530,54 @@
            orders.setMultifileList(multifileList);
        }
        orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
        orders.setCancelStatus(Constants.ZERO);
        this.getPriceUnit(orders);
        if(orders.getStatus() <= Constants.ordersStatus.accept.getKey()){
            if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
                //判断是否可修改 å·²å–消次数 ä¸Ž æ—¶é—´é™åˆ¶
                Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIMES).getCode());
                Long cancelTimes = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                        .apply(" DATE(cancel_time) = DATE(NOW()) ")
                        .eq(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
                        .eq(Orders::getReleaseMemberId,orders.getReleaseMemberId()));
                //查询取消次数
                if(totalCancelTimes<=cancelTimes){
                    orders.setCancelStatus(Constants.ONE);
        return orders;
    }
                Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIME).getCode());
                Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
                if(hours < cancelTimeHour){
                    orders.setCancelStatus(Constants.ONE);
                    return orders;
                }
            }else if(Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){
                //判断是否可修改 å·²å–消次数 ä¸Ž æ—¶é—´é™åˆ¶
                Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIMES).getCode());
                Long cancelTimes = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
                        .apply(" DATE(create_time) = DATE(NOW()) ")
                        .eq(OrderLog::getObjType,Constants.OrdersLog.CANCEL.getKey())
                        .eq(OrderLog::getMemberId,member.getId()));
                //查询取消次数
                if(totalCancelTimes<=cancelTimes){
                    orders.setCancelStatus(Constants.ONE);
                    return orders;
                }
                Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIME).getCode());
                Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
                if(hours < cancelTimeHour){
                    orders.setCancelStatus(Constants.ONE);
                    return orders;
                }
            }
        } else{
            orders.setCancelStatus(Constants.ONE);
        }
        return orders;
    }
    public synchronized String  getNextCode(Integer type){
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -222,6 +222,8 @@
            //存储流水记录
            MemberRevenue memberRevenue = new MemberRevenue();
            memberRevenue.setCreateTime(new Date());
            memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo());
            memberRevenue.setDeleted(Constants.ZERO);
            memberRevenue.setMemberId(member.getId());
            memberRevenue.setType(Constants.THREE);
            memberRevenue.setOptType(-Constants.ONE);
server/services/src/main/resources/application-dev.yml
@@ -47,6 +47,7 @@
          required: true
debug_model: true
# Swagger配置
swagger:
  host:
@@ -58,6 +59,8 @@
  enable-encrypt: true
  # ç¦ç”¨swagger时的重定向地址
  redirect-uri: /
des_pwd: 123456SDFKDJF
knife4j:
  enable: true
@@ -65,8 +68,10 @@
    enable: true
    username: admin
    password: 111111
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
aes:
  encrypt:
    open: true # æ˜¯å¦å¼€å¯åР坆 true  or  false
@@ -74,46 +79,85 @@
    publicKey: mN4Yn8Or8r7SH1w3 # AES密钥
    privateKey:  # RSA私钥
    time: 600000
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start-------
    appId: wx48fd8faa35cc8277
    mchId: 1661770902
    apiV3Key: iF3kC8pL8dZ9iU3hN5fX9zI6eF4xQ6fT
    serialNumer: 368B835A194384FD583B83B77977B84127D2F655
    mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: http://xiaopiqiu2.natapp1.cc/web/wxPayNotify
    refundNotifyUrl: http://xiaopiqiu2.natapp1.cc/web/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
    #商户信息
    wechatSerialNumer: 3C9A32FB6CD453FAAAF97F9737ECAEA9D6625727
    wechatPayPublicKeyId: 47E172124E73E8098A565E971064C20ACDE7C911 # PUB_KEY_ID_0116617720032025071800291849000801 #商户/平台支付公钥id
    wechatPubKeyPath: d://pub_key.pem #商户支付公钥
    #wechatPlatformPubKeyPath: d:/wechatpay_47E172124E73E8098A565E971064C20ACDE7C911.pem  #平台支付公钥
    wechatPrivateKeyPath: d://wechatApiclient_key.pem #商户私钥
    wechatNotifyUrl: http://xiaopiqiu2.natapp1.cc/web/wechat/transferNotify #商户转账回调地址
    #wechatApiV3Key: V4PRKUBTK2BKNKJAD9NSI9YFG2Q0EOT1 #商户APIV3Key
    #服务商---------start------- å‚数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx332441ae5b12be7d    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 7DCD480EB6DF3791721867A6EB57105DECEF38BE #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxRefundNotify
    keyPath: d://jinkuai/apiclient_cert.p12
    privateCertPath: d://jinkuai/apiclient_cert.pem
    privateKeyPath: d://jinkuai/apiclient_key.pem
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 38495CE0137D90E4DC4F64F7ECDE035A35470BE3
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: d://jinkuai/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: d://jinkuai/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    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
#wx:
#  pay:
#    #服务商---------start-------
#    appId: wx48fd8faa35cc8277
#    mchId: 1661770902
#    apiV3Key: iF3kC8pL8dZ9iU3hN5fX9zI6eF4xQ6fT
#    serialNumer: 368B835A194384FD583B83B77977B84127D2F655
#    mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
#    notifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxPayNotify
#    refundNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/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: /usr/local/zhengshu/apiclient_cert.p12 #d://apiclient_cert.p12
#    privateCertPath: /usr/local/zhengshu/apiclient_cert.pem #d://apiclient_cert.pem
#    privateKeyPath: /usr/local/zhengshu/apiclient_key.pem #d://apiclient_key.pem
#
#
#    #商户信息
#    wechatSerialNumer: 3C9A32FB6CD453FAAAF97F9737ECAEA9D6625727
#    wechatPayPublicKeyId: 47E172124E73E8098A565E971064C20ACDE7C911 # PUB_KEY_ID_0116617720032025071800291849000801 #商户/平台支付公钥id
#    wechatPubKeyPath: /usr/local/zhengshu/pub_key.pem #d://pub_key.pem #商户支付公钥
#    #wechatPlatformPubKeyPath: d:/wechatpay_47E172124E73E8098A565E971064C20ACDE7C911.pem  #平台支付公钥
#    wechatPrivateKeyPath: /usr/local/zhengshu/wechatApiclient_key.pem #d://wechatApiclient_key.pem #商户私钥
#    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
#    #wechatApiV3Key: V4PRKUBTK2BKNKJAD9NSI9YFG2Q0EOT1 #商户APIV3Key
#
#
#    #服务商-------------end---
#    existsSub: 1
#    appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24
#    #子商户------------start----
#    subAppId: wxcd2b89fd2ff065f8 #wxcd2b89fd2ff065f8
#    subAppSecret: 3462fa186da7cb06c544df8d8664b63a #3336812504c830b1c3c5243f9ece407a
#    subMchId: 1661772003
#    subMchKey: EVM8E15TKXE0OEMJFC0V6UFVIOZ5CSQS
#    #子商户------------end----
#    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
#    typeId: gybike
upload:
  type: ftp
server/services/src/main/resources/application-test.yml
@@ -70,32 +70,37 @@
    password: 111111
########################微信支付相关配置########################
########################微信支付相关配置########################
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
    mchId: 1700071922 #服务商商户号
    appId: wx6cc1087ca79db7f6 #服务商APPID
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142
    serialNumer: 38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wxRefundNotify
    keyPath: /usr/local/zhengshu/apiclient_cert.p12
    privateCertPath: /usr/local/zhengshu/apiclient_cert.pem
    privateKeyPath: /usr/local/zhengshu/apiclient_key.pem
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId:  PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/zhengshu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/zhengshu/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    #服务商-------------end---
    existsSub: 1
    appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24
    appSecret:
    #子商户------------start----
    subAppId: wxcd2b89fd2ff065f8 #wxcd2b89fd2ff065f8
    subAppSecret: 3462fa186da7cb06c544df8d8664b63a #3336812504c830b1c3c5243f9ece407a
    subMchId: 1661772003
    subMchKey: EVM8E15TKXE0OEMJFC0V6UFVIOZ5CSQS
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    subMchId: 1723326069    #子商户号
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: gybike
server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -62,9 +62,22 @@
    })
    public ApiResponse updateOrder(@RequestBody Orders orders) {
        orders.setMember(this.getMemberResponse());
        ordersService.updateById(orders);
        ordersService.update(orders);
        return  ApiResponse.success("操作成功");
    }
//    @LoginRequired
//    @ApiOperation(value = "修改订单日期 - å‘单方", notes = "小程序端")
//    @PostMapping("/updOrderData")
//    @ApiImplicitParams({
//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
//    })
//    public ApiResponse updOrderData(@RequestBody UpdOrderDataDTO updOrderDataDTO) {
//        updOrderDataDTO.setMember(this.getMemberResponse());
//        ordersService.updOrderData(updOrderDataDTO);
//        return  ApiResponse.success("操作成功");
//    }
    @LoginRequired
    @ApiOperation(value = "手动接单 - æŽ¥å•æ–¹", notes = "小程序端")
@@ -90,39 +103,27 @@
    @LoginRequired
    @ApiOperation(value = "取消订单 - å‘单方", notes = "小程序端")
    @GetMapping("/releaseCancelOrder")
    @GetMapping("/cancelOrder")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse releaseCancelOrder(@RequestParam Integer orderId) {
        ordersService.releaseCancelOrder(orderId,this.getMemberResponse());
    public ApiResponse cancelOrder(@RequestParam Integer orderId) {
        ordersService.cancelOrder(orderId,this.getMemberResponse());
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "取消接单 - æŽ¥å•æ–¹", notes = "小程序端")
    @GetMapping("/receiveCancelOrder")
    @ApiOperation(value = "取消前提示语 - å‘单方", notes = "小程序端")
    @GetMapping("/cancelTips")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse receiveCancelOrder(@RequestParam Integer orderId) {
        ordersService.receiveCancelOrder(orderId,this.getMemberResponse());
    public ApiResponse cancelTips(@RequestParam Integer orderId) {
        ordersService.cancelTips(orderId,this.getMemberResponse());
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "修改订单日期 - å‘单方", notes = "小程序端")
    @PostMapping("/updOrderData")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse updOrderData(@RequestBody UpdOrderDataDTO updOrderDataDTO) {
        updOrderDataDTO.setMember(this.getMemberResponse());
        ordersService.updOrderData(updOrderDataDTO);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "确认订单修改 - æŽ¥å•æ–¹", notes = "小程序端")
@@ -191,7 +192,7 @@
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Orders> getDetail(@RequestParam Integer orderId) {
        return  ApiResponse.success("操作成功",ordersService.getDetail(orderId,this.getMemberResponse().getUseIdentity()));
        return  ApiResponse.success("操作成功",ordersService.getDetail(orderId,this.getMemberResponse()));
    }
    @LoginRequired
small-program/App.vue
@@ -1,11 +1,17 @@
<script>
    import { mapState } from 'vuex'
    var QQMapWX = require('@/utils/qqmap-wx-jssdk.js')
    export default {
        computed: {
            ...mapState(['userInfo','openid'])
        },
<<<<<<< HEAD
        onLaunch: function() { 
=======
        onLaunch: function() {
>>>>>>> 2d0d3bb6a63ad0aee9d5cc003b50c50391b1cc94
            var that = this;
            that.getLocaltionBiz()
            if (!this.openid || this.openid =='') {
                uni.login({
                    provider: 'weixin',
@@ -16,17 +22,6 @@
                            that.$store.commit('setToken', res.data.token)
                            that.$store.commit('setOpenid', res.data.openid)
                            that.$store.commit('setUserInfo', res.data.member)
                            uni.getLocation({
                                type: 'wgs84',
                                success: (addr) => {
                                    that.$store.commit('setPosition', { latitude: addr.latitude, longitude: addr.longitude })
                                    that.$isResolve()
                                },
                                fail: (err) => {
                                    console.error('获取位置失败', err);
                                    that.$isResolve()
                                }
                            });
                            
                        }
                    }
@@ -36,31 +31,9 @@
                let res = this.$u.api.getMemberInfo({}).then(res =>{ 
                    if (res && res.code === 200) { 
                        that.$store.commit('setUserInfo', res.data)
                        uni.getLocation({
                            type: 'wgs84',
                            success: (addr) => {
                                that.$store.commit('setPosition', { latitude: addr.latitude, longitude: addr.longitude })
                                that.$isResolve()
                            },
                            fail: (err) => {
                                console.error('获取位置失败', err);
                                that.$isResolve()
                            }
                        });
                    } else {
                        that.$store.commit('setToken','')
                        that.$store.commit('setUserInfo',{})
                        uni.getLocation({
                            type: 'wgs84',
                            success: (addr) => {
                                that.$store.commit('setPosition', { latitude: addr.latitude, longitude: addr.longitude })
                                that.$isResolve()
                            },
                            fail: (err) => {
                                console.error('获取位置失败', err);
                                that.$isResolve()
                            }
                        });
                    }
                })
            }
@@ -70,6 +43,51 @@
        },
        onHide: function() {
            console.log('App Hide')
        },
        methods:{
            getLocaltionBiz(){
                var that =this
                uni.getLocation({
                    type: 'wgs84',
                    success: (addr) => {
                        const locParam = { latitude: addr.latitude, longitude: addr.longitude ,address:'获取地址失败'};
                        var address =null
                        const qqmapsdk = new QQMapWX({
                             key: '4PXBZ-JLBC7-LCLXG-P2SZX-C4HYE-LDBLQ' //腾讯地图申请的key(后续需要公司提供,个人开发者额度有限)
                         });
                          // è…¾è®¯åœ°å›¾é€†åœ°ç†ç¼–码
                        qqmapsdk.reverseGeocoder({
                            locParam,
                            success: function(res) {
                                console.log(res, '==================获取地址');
                                let info = res.result;
                                locParam.province = info.address_component.province;
                                locParam.city = info.address_component.city;
                                locParam.area = info.address_component.district;
                                locParam.street = info.address_component.street;
                                var ta = info.address  || '地址获取失败' ;
                                if(info.formatted_addresses  && info.formatted_addresses.recommend){
                                    ta =info.formatted_addresses.recommend
                                }
                                locParam.address =ta
                                that.$store.commit('setPosition',locParam)
                                that.$isResolve()
                            },
                            fail: (err) => {
                                console.error('获取位置失败===========', err);
                                that.$store.commit('setPosition',locParam)
                                that.$isResolve()
                            }
                        });
                        // that.$store.commit('setPosition',locParam)
                        that.$isResolve()
                    },
                    fail: (err) => {
                        console.error('获取位置失败', err);
                        that.$isResolve()
                    }
                });
            }
        }
    }
</script>
small-program/pages/index/index.vue
@@ -83,10 +83,10 @@
        <!-- å‘单方 -->
        <view class="index-c" v-if="typeViewId === 0">
            <view :style="{ width: '100%', height: statusbarHeight + 'px' }"></view>
            <view class="index-c-title" :style="{ height: navHeight + 'px' }" @click="selectAddress">
            <view class="index-c-title" :style="{ height: navHeight + 'px' }" @click="selectAddress(-1)">
                <text class="index-c-title-logo">近快</text>
                <image class="dingwei" src="/static/icon/home_ic_location@2x.png" mode="widthFix"></image>
                <text>西湖国际广场</text>
                <text>{{location.address || address || '获取地址失败'}}</text>
                <image class="qu" src="/static/icon/home_ar_next@2x.png" mode="widthFix"></image>
            </view>
            
@@ -322,10 +322,6 @@
                     <view></view>
                     <text>{{item}}</text> 
                 </view> 
                 <view class="phone-item" v-for="(item,index) in serverPhone"    :key="item" @click="contactPhoneDo(item)">
                     <view></view>
                     <text>{{item}}</text>
                 </view>
                <!-- <view class="phone-botton"  @click="contactPhone()" >关闭</view> -->
            </view>
        </u-popup>
@@ -339,7 +335,7 @@
    export default {
        components: { sunuiMverify },
        computed: {
            ...mapState(['navHeight', 'statusbarHeight','userInfo','token','openid', 'latitude', 'longitude']),
            ...mapState(['navHeight', 'statusbarHeight','userInfo','token','openid', 'latitude', 'longitude','address']),
            totalPrice() {
                return this.form.estimatedAccount / 100
            }
@@ -352,6 +348,11 @@
                isLogin: false,
                typeId: 0,
                qqmapsdk: null,
                location:{
                    latitude:null,
                    longitude:null,
                    address:null,
                },
                type: [
                    { name: '用工', id: 0 },
                    { name: '运货', id: 1 },
@@ -737,6 +738,11 @@
                            this.form.wayInfoDTOList[0].lat = res.latitude
                            this.form.wayInfoDTOList[0].lgt = res.longitude
                            this.form.wayInfoDTOList[0].location = res.address
                        }else if (type == -1) {
                            console.log(res)
                            this.location.latitude = res.latitude
                            this.location.longitude = res.longitude
                            this.location.address =res.name ||  res.address
                        }
                    }
                });
@@ -1146,6 +1152,10 @@
                    font-size: 32rpx;
                    color: #ffffff;
                    margin-right: 12rpx;
                    max-width: 280rpx;
                    white-space: nowrap;
                    overflow: hidden;
                    text-overflow: ellipsis;
                }
                .qu {
                    width: 22rpx;
small-program/pages/withdrawal/withdrawal.vue
@@ -11,12 +11,16 @@
                    <text>提现到账</text>
                    <text>微信零钱</text>
                </view>
                <view class="content-title">真实姓名</view>
                <view class="content-input" style="margin-bottom: 40rpx;">
                    <input style="font-weight: 500;" type="text" v-model="name"  @input="changeName" placeholder="微信实名认证姓名" />
                </view>
                <view class="content-title">提现金额</view>
                <view class="content-input">
                    <view class="content-input-icon">
                        <image src="/static/icon/ic_money@2x.png" mode="widthFix"></image>
                    </view>
                    <input type="number" v-model="amount" @input="changeAmount" placeholder="请输入提现金额" />
                    <input type="digit" v-model="amount" @input="changeAmount" placeholder="请输入提现金额" />
                    <view class="content-input-btn" @click="inputAll">全部提现</view>
                </view>
                <view class="content-tips">{{tips}}</view>
@@ -35,9 +39,41 @@
        data() {
            return {
                tips:'',//
                wxTips:'',
                canTransfer:false,
                changing1:false,
                amount: null
                amount: null,
                name:''
            };
        },
        onLoad(){
            this.name = this.userInfo.name
            var that =this
            that.canTransfer = false
            if (wx.canIUse('requestMerchantTransfer')) {
                //that.tips='您的微信版本支持该功能'
                that.canTransfer = true
            }else{
                that.tips='您的微信版本过低,请更新至最新版本使用该功能'
                uni.showToast({
                    title:'您的微信版本过低,请更新至最新版本使用该功能。'
                })
            }
            /* wx.ready(function () {
              wx.checkJsApi({
                jsApiList: ['requestMerchantTransfer'],
                success: function (res) {
                  if (res.checkResult['requestMerchantTransfer']) {
                        that.canTransfer = true
                  } else {
                      that.tips='您的微信版本过低,请更新至最新版本使用该功能'
                      uni.showToast({
                          title:'您的微信版本过低,请更新至最新版本使用该功能。'
                      })
                  }
                }
              });
            }); */
        },
        methods: {
            jump() {
@@ -51,7 +87,47 @@
            changeAmount(){
                this.tips=''
            },
            wxMerchantTransfer(param){
                wx.requestMerchantTransfer({
                    mchId: param.mchId,
                    appId: param.appId,
                    package: param.packageInfo,
                    success: (res) => {
                      // res.err_msg将在页面展示成功后返回应用时返回ok,并不代表付款成功
                      console.log(res)
                      uni.navigateTo({
                          url: '/pages/withdrawal-successful/withdrawal-successful'
                      })
                    },
                    fail: (res) => {
                      console.log("22222222222222",res)
                      uni.showToast({
                          title:'对不起,提现失败。'+res.err_msg
                      })
                    },
                  });
                /* WeixinJSBridge.invoke('requestMerchantTransfer',param,
                  function (res) {
                    if (res.err_msg === 'requestMerchantTransfer:ok') {
                      // res.err_msg将在页面展示成功后返回应用时返回success,并不代表付款成功
                      uni.navigateTo({
                          url: '/pages/withdrawal-successful/withdrawal-successful'
                      })
                    }else{
                        uni.showToast({
                            title:'对不起,提现失败。'+res.err_msg
                        })
                    }
                  }
                );     */
            },
            submit() {
                  if(!this.canTransfer){
                      uni.showToast({
                          title:'您的微信版本过低,请更新至最新版本使用该功能。'
                      })
                      return;
                  }
                  if(this.changing1){
                        return
                  }
@@ -68,13 +144,14 @@
                  }
                  this.changing1 = true
                  var that = this
                  var param ={amount:this.amount }
                  var param ={amount:this.amount,name:this.name }
                  that.$u.api.applyWithdrawal(param)
                  .then(res =>{
                        if(res.code ===200){
                            uni.navigateTo({
                                url: '/pages/withdrawal-successful/withdrawal-successful'
                            })
                            that.wxMerchantTransfer(res.data);
                            // uni.navigateTo({
                            //     url: '/pages/withdrawal-successful/withdrawal-successful'
                            // })
                        } 
                   }).finally(() => {
                        that.changing1 = false
small-program/store/index.js
@@ -19,7 +19,8 @@
        openid: token || '',
        
        latitude: '',
        longitude: ''
        longitude: '',
        address:'定位中'
    },
    mutations: {
        // è®¾ç½®å¯¼èˆªæ é«˜åº¦
@@ -49,6 +50,8 @@
            console.log(obj)
            state.latitude = obj.latitude
            state.longitude = obj.longitude
            state.address = obj.address
            console.log("=====================",obj)
        },
        // æ¸…除缓存数据
        empty(state) {