jiangping
2025-07-19 0cfbaf9a439dc75824c52a6e58b6849064afbc80
Merge remote-tracking branch 'origin/master'
已添加2个文件
已修改17个文件
1069 ■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/TransferToUser.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/IdentityInfo.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ReusePayDTO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 329 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/OrdersApi.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/demand-hall/demand-hall.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/using-workers/using-workers.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java
@@ -1,9 +1,15 @@
package com.doumee.api.business;
import com.alibaba.fastjson.JSON;
import com.doumee.config.wx.TransferDetailEntityNew;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.ApiResponse;
import com.doumee.service.business.OrdersService;
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.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
@@ -20,7 +26,11 @@
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
@@ -41,7 +51,7 @@
     *
     * @return
     */
    @PostMapping("/api/wxPayNotify")
    @PostMapping("/web/wxPayNotify")
    public ApiResponse wxPay_notify(HttpServletRequest request) {
        try {
            ServletInputStream inputStream = request.getInputStream();
@@ -76,6 +86,8 @@
            NotificationParser parser = new NotificationParser(config);
            Transaction result = parser.parse(requestParam, Transaction.class);
            //自定义订单号
            String outTradeNo = result.getOutTradeNo();
@@ -105,7 +117,7 @@
            return ApiResponse.failed("");
        }
    }
    @PostMapping("/api/wxRefundNotify")
    @PostMapping("/web/wxRefundNotify")
    public ApiResponse wxRefundNotify(HttpServletRequest request) {
        log.error("微信退款回调结果开始===========" );
        try {
@@ -156,4 +168,98 @@
        }
    }
    /**
     * å¾®ä¿¡å•†æˆ·é›¶çº¿è½¬è´¦ - å›žè°ƒé€šçŸ¥
     * @Context注解  æŠŠHTTP请求上下文对象注入进来,HttpServletRequest、HttpServletResponse、UriInfo ç­‰
     * @return
     */
    @PostMapping(value = "/web/wechat/transferNotify")
    public ApiResponse wxPayCallback( HttpServletRequest request) {
        Map<String,String> errMap = new HashMap<>();
        try {
            log.info("微信商户零线转账 - å›žè°ƒé€šçŸ¥ /wxpay/callback");
            TransferDetailEntityNew entity = wxPaySuccessCallback(request);
            log.info("transfer ok.{}",entity);
            //回调成功后处理自己的业务
            if(entity != null){
            }
            return ApiResponse.success("处理成功");
        } catch (Exception e) {
            log.error("微信商户零线转账 - å›žè°ƒé€šçŸ¥ /wxpay/callback:异常!", e);
            errMap.put("code", "FAIL");
            errMap.put("message", "服务器内部错误");
            return ApiResponse.failed("处理失败");
        }
    }
    public TransferDetailEntityNew wxPaySuccessCallback(HttpServletRequest request) throws IOException {
        String requestBody = getBodyString(request, "UTF-8");
        //证书序列号(微信平台)   éªŒç­¾çš„“微信支付平台证书”所对应的平台证书序列号
        String wechatPaySerial = request.getHeader("Wechatpay-Serial");
        //微信传递过来的签名   éªŒç­¾çš„签名值
        String wechatSignature = request.getHeader("Wechatpay-Signature");
        //验签的时间戳
        String wechatTimestamp = request.getHeader("Wechatpay-Timestamp");
        //验签的随机字符串
        String wechatpayNonce = request.getHeader("Wechatpay-Nonce");
        // 1. æž„造 RequestParam
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(wechatPaySerial)
                .nonce(wechatpayNonce)
                .signature(wechatSignature)
                .timestamp(wechatTimestamp)
                .body(requestBody)
                .build();
        // 2. æž„建Config RSAPublicKeyConfig
        Config config = new RSAPublicKeyConfig.Builder()
                        .merchantId(WxMiniConfig.wxProperties.getMchId()) //微信支付的商户号
                        .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) // å•†æˆ·API证书私钥的存放路径
                        .publicKeyFromPath(WxMiniConfig.wxProperties.getWechatPubKeyPath()) //微信支付公钥的存放路径
                        .publicKeyId(WxMiniConfig.wxProperties.getWechatPayPublicKeyId()) //微信支付公钥ID
                        .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) //商户API证书序列号
                        .apiV3Key("") //APIv3密钥
                        .build();
        log.info("WxPayService.wxPaySuccessCallback request : wechatPaySerial is [{}]  , wechatSignature is [{}] , wechatTimestamp is [{}] , wechatpayNonce  is [{}] , requestBody is [{}]",wechatPaySerial,wechatSignature,wechatTimestamp,wechatpayNonce,requestBody);
        // 3. åˆå§‹åŒ– NotificationParser
        NotificationParser parser = new NotificationParser((NotificationConfig) config);
        try {
            TransferDetailEntityNew entity = parser.parse(requestParam, TransferDetailEntityNew.class);
            log.info("WxPayService.wxPaySuccessCallback responseBody: {}", entity != null ? JSON.toJSONString(entity) : null);
            return entity;
        } catch (Exception e) {
            log.error("Exception occurred while processing", e);
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"系统内部错误");
        }
    }
    /**
     * èŽ·å–post请求中的Body
     *
     * @param request httpRequest
     * @return body字符串
     */
    public static String getBodyString(HttpServletRequest request, String charSet) throws IOException {
        StringBuilder sb = new StringBuilder();
        InputStream inputStream = null;
        BufferedReader reader = null;
        try {
            inputStream = request.getInputStream();
            //读取流并将流写出去,避免数据流中断;
            reader = new BufferedReader(new InputStreamReader(inputStream, charSet));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            log.error("获取requestBody异常", e);
        } finally {
            inputStream.close();
            reader.close();
        }
        return sb.toString();
    }
}
server/pom.xml
@@ -260,7 +260,7 @@
    <dependency>
      <groupId>com.github.wechatpay-apiv3</groupId>
      <artifactId>wechatpay-java</artifactId>
      <version>0.2.12</version>
      <version>0.2.15</version>
    </dependency>
server/services/src/main/java/com/doumee/config/wx/SendWxMessage.java
@@ -4,6 +4,7 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.IdentityInfo;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,33 +28,32 @@
    private static String goodsOrderUrl = "pages/settlementDetails/settlementDetails?goodsOrderId=";
    private static String identityInfoUrl = "pages/mine/mine";
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    public  void  bookingsCancel(String openid, String goodsOrderId, String accessToken, String bikeCode, Date startTime, Date endTime) throws WxErrorException {
    public  void  identityInfoMessage(String openid, IdentityInfo identityInfo) throws WxErrorException {
        RestTemplate restTemplate = new RestTemplate();
        log.info("微信小程序->微信消息通知  -> accessToken:{}",accessToken);
        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="+WxMiniConfig.wxMaService.getAccessToken();
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;
        //拼接推送的模版
        WxMsgVO wxMsgVo = new WxMsgVO();
        WxMsgVO wxMsgVO = new WxMsgVO();
        //用户的openid(要发送给那个用户)
        wxMsgVo.setTouser(openid);
        wxMsgVO.setTouser(openid);
        //订阅消息模板id
//        wxMsgVo.setTemplate_id(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.TIME_OUT_TEMPID).getCode());
        wxMsgVO.setTemplate_id("4H9ztG4E9BxJLwMuYSZ6oiM7yb4KX7u7bYhkhYJP0-Y");
        Map<String, TemplateData> m = new HashMap<>(4);
        m.put("character_string1", new TemplateData(bikeCode));
        //解锁时间
        m.put("date3", new TemplateData(DateUtil.getFomartDate(startTime,"yyyy/MM/dd HH:mm")));
        //上锁时间
        m.put("date4", new TemplateData(DateUtil.getFomartDate(endTime,"yyyy/MM/dd HH:mm")));
        //温馨提醒
        m.put("thing5", new TemplateData("临时锁车已超过最大时长,已自动还车"));
        wxMsgVo.setPage(goodsOrderUrl + goodsOrderId);
        wxMsgVo.setData(m);
        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()));
        wxMsgVO.setPage(identityInfoUrl);
        wxMsgVO.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMsgVo, String.class);
        log.info("微信小程序->微信消息通知 ä¸´æ—¶é”è½¦è¶…时:{}", JSONObject.toJSONString(responseEntity));
                restTemplate.postForEntity(url, wxMsgVO, String.class);
        log.info("微信小程序->微信消息通知 è®¤è¯ä¿¡æ¯ï¼š{}", JSONObject.toJSONString(responseEntity));
    }
server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,213 @@
package com.doumee.config.wx;
import com.google.gson.annotations.SerializedName;
import com.wechat.pay.java.core.cipher.PrivacyDecryptor;
import lombok.Data;
import java.util.Objects;
/**
 * å•†æˆ·å•号查询转账单实体类信息
 *
 * @author: suhai
 * @date: 2025/05/13  11:28
 */
@Data
public class TransferDetailEntityNew {
    /** å•†æˆ·å· Y è¯´æ˜Žï¼šå¾®ä¿¡æ”¯ä»˜åˆ†é…çš„商户号 */
    @SerializedName("mch_id")
    private String mchId;
    /** å•†æˆ·å•号 Y è¯´æ˜Žï¼šå•†æˆ·ç³»ç»Ÿå†…部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 */
    @SerializedName("out_bill_no")
    private String outBillNo;
    /** å•†å®¶è½¬è´¦è®¢å•号 Y è¯´æ˜Žï¼šå•†å®¶è½¬è´¦è®¢å•的主键,唯一定义此资源的标识 */
    @SerializedName("transfer_bill_no")
    private String transferBillNo;
    /** å•†æˆ·appid Y è¯´æ˜Žï¼šç”³è¯·å•†æˆ·å·çš„appid或商户号绑定的appid(企业号corpid即为此appid) */
    @SerializedName("appid")
    private String appid;
    /** å•据状态 Y è¯´æ˜Žï¼šå•据状态  */
    @SerializedName("state")
    private String state;
    /** è½¬è´¦é‡‘额 Y è¯´æ˜Žï¼šè½¬è´¦é‡‘额单位为“分”。*/
    @SerializedName("transfer_amount")
    private Integer transferAmount;
    /** è½¬è´¦å¤‡æ³¨ Y è¯´æ˜Žï¼šè½¬è´¦å¤‡æ³¨ï¼Œç”¨æˆ·æ”¶æ¬¾æ—¶å¯è§è¯¥å¤‡æ³¨ä¿¡æ¯ï¼ŒUTF8编码,最多允许32个字符。*/
    @SerializedName("transfer_remark")
    private String transferRemark;
    /** å¤±è´¥åŽŸå›  N è¯´æ˜Žï¼šè®¢å•已失败或者已退资金时,返回失败原因。 */
    @SerializedName("fail_reason")
    private String failReason;
    /** æ”¶æ¬¾ç”¨æˆ·OpenID Y è¯´æ˜Žï¼šå•†æˆ·AppID下,某用户的OpenID  */
    @SerializedName("openid")
    private String openid;
    /** æ”¶æ¬¾ç”¨æˆ·å§“名 N è¯´æ˜Žï¼šæ”¶æ¬¾æ–¹çœŸå®žå§“名。需要加密传入,支持标准RSA算法和国密算法,公钥由微信侧提供。
     è½¬è´¦é‡‘额 >= 2,000元时,该笔明细必须填写
     è‹¥å•†æˆ·ä¼ å…¥æ”¶æ¬¾ç”¨æˆ·å§“名,微信支付会校验收款用户与输入姓名是否一致,并提供电子回单 */
    @SerializedName("user_name")
    private String userName;
    /** å•据创建时间 N è¯´æ˜Žï¼šå•据受理成功时返回,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("create_time")
    private String createTime;
    /** æœ€åŽä¸€æ¬¡çŠ¶æ€å˜æ›´æ—¶é—´ N è¯´æ˜Žï¼šå•据最后更新时间,按照使用rfc3339所定义的格式,格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("update_time")
    private String updateTime;
    public String getMchId() {
        return mchId;
    }
    public void setMchId(String mchId) {
        this.mchId = mchId;
    }
    public String getOutBillNo() {
        return outBillNo;
    }
    public void setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
    }
    public String getTransferBillNo() {
        return transferBillNo;
    }
    public void setTransferBillNo(String transferBillNo) {
        this.transferBillNo = transferBillNo;
    }
    public String getAppid() {
        return appid;
    }
    public void setAppid(String appid) {
        this.appid = appid;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public Integer getTransferAmount() {
        return transferAmount;
    }
    public void setTransferAmount(Integer transferAmount) {
        this.transferAmount = transferAmount;
    }
    public String getTransferRemark() {
        return transferRemark;
    }
    public void setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
    }
    public String getFailReason() {
        return failReason;
    }
    public void setFailReason(String failReason) {
        this.failReason = failReason;
    }
    public String getOpenid() {
        return openid;
    }
    public void setOpenid(String openid) {
        this.openid = openid;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }
    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        TransferDetailEntityNew that = (TransferDetailEntityNew) o;
        return Objects.equals(mchId, that.mchId) && Objects.equals(outBillNo, that.outBillNo) && Objects.equals(transferBillNo, that.transferBillNo) && Objects.equals(appid, that.appid) && Objects.equals(state, that.state) && Objects.equals(transferAmount, that.transferAmount) && Objects.equals(transferRemark, that.transferRemark) && Objects.equals(failReason, that.failReason) && Objects.equals(openid, that.openid) && Objects.equals(userName, that.userName) && Objects.equals(createTime, that.createTime) && Objects.equals(updateTime, that.updateTime);
    }
    @Override
    public int hashCode() {
        return Objects.hash(mchId, outBillNo, transferBillNo, appid, state, transferAmount, transferRemark, failReason, openid, userName, createTime, updateTime);
    }
    @Override
    public String toString() {
        return "TransferDetailEntityNew{" +
                "mchId='" + mchId + '\'' +
                ", outBillNo='" + outBillNo + '\'' +
                ", transferBillNo='" + transferBillNo + '\'' +
                ", appid='" + appid + '\'' +
                ", state='" + state + '\'' +
                ", transferAmount=" + transferAmount +
                ", transferRemark='" + transferRemark + '\'' +
                ", failReason='" + failReason + '\'' +
                ", openid='" + openid + '\'' +
                ", userName='" + userName + '\'' +
                ", createTime='" + createTime + '\'' +
                ", updateTime='" + updateTime + '\'' +
                '}';
    }
    public TransferDetailEntityNew cloneWithCipher(PrivacyDecryptor encryptor) {
        TransferDetailEntityNew copy = new TransferDetailEntityNew();
        copy.mchId = mchId;
        copy.outBillNo = outBillNo;
        copy.transferBillNo = transferBillNo;
        copy.appid = appid;
        copy.state = state;
        copy.transferAmount = transferAmount;
        copy.transferRemark = transferRemark;
        copy.failReason = failReason;
        copy.openid = openid;
        if (userName != null && !userName.isEmpty()) {
            copy.userName = encryptor.decrypt(userName);
        }
        copy.createTime = createTime;
        copy.updateTime = updateTime;
        return copy;
    }
}
server/services/src/main/java/com/doumee/config/wx/TransferToUser.java
@@ -29,12 +29,20 @@
    public static void main(String[] args) {
        // TODO: è¯·å‡†å¤‡å•†æˆ·å¼€å‘必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756
//        TransferToUser client = new TransferToUser(
//                "1229817002",                    // å•†æˆ·å·ï¼Œæ˜¯ç”±å¾®ä¿¡æ”¯ä»˜ç³»ç»Ÿç”Ÿæˆå¹¶åˆ†é…ç»™æ¯ä¸ªå•†æˆ·çš„唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
//                "3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0",         // å•†æˆ·API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
//                "d://wechatApiclient_key.pem",    // å•†æˆ·API证书私钥文件路径,本地文件路径
//                "PUB_KEY_ID_0112298170022025071700291836000600",      // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
//                "d://pub_key.pem"          // å¾®ä¿¡æ”¯ä»˜å…¬é’¥æ–‡ä»¶è·¯å¾„,本地文件路径
//        );
        TransferToUser client = new TransferToUser(
                "1229817002",                    // å•†æˆ·å·ï¼Œæ˜¯ç”±å¾®ä¿¡æ”¯ä»˜ç³»ç»Ÿç”Ÿæˆå¹¶åˆ†é…ç»™æ¯ä¸ªå•†æˆ·çš„唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
                "3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0",         // å•†æˆ·API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
                "1661772003",                    // å•†æˆ·å·ï¼Œæ˜¯ç”±å¾®ä¿¡æ”¯ä»˜ç³»ç»Ÿç”Ÿæˆå¹¶åˆ†é…ç»™æ¯ä¸ªå•†æˆ·çš„唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
                "3C9A32FB6CD453FAAAF97F9737ECAEA9D6625727",         // å•†æˆ·API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
                "d://wechatApiclient_key.pem",    // å•†æˆ·API证书私钥文件路径,本地文件路径
                "PUB_KEY_ID_0112298170022025071700291836000600",      // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
                "d://pub_key.pem"          // å¾®ä¿¡æ”¯ä»˜å…¬é’¥æ–‡ä»¶è·¯å¾„,本地文件路径
                "47E172124E73E8098A565E971064C20ACDE7C911",      // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
                "d://wechatpay_47E172124E73E8098A565E971064C20ACDE7C911.pem"          // å¾®ä¿¡æ”¯ä»˜å…¬é’¥æ–‡ä»¶è·¯å¾„,本地文件路径
        );
        TransferToUserRequest request = new TransferToUserRequest();
@@ -42,10 +50,10 @@
        request.outBillNo = "plfk2020042016";
        request.transferSceneId = "1005";
        request.openid = "oKKHU5IFKpss_DIbFX1lqghFJOEg";
        request.userName = client.encrypt("施旭辉");
        request.transferAmount = 91L;
//        request.userName = client.encrypt("施旭辉");
        request.transferAmount = 10L;
        request.transferRemark = "~~~";
        request.notifyUrl = "https://www.weixin.qq.com/wxpay/pay.php";
//        request.notifyUrl = "https://www.weixin.qq.com/wxpay/pay.php";
        request.userRecvPerception = "劳务报酬";
        request.transferSceneReportInfos = new ArrayList<>();
        {
@@ -118,6 +126,7 @@
    public TransferToUserResponse run(TransferToUserRequest request,String name) {
        String uri = PATH;
        request.appid = WxMiniConfig.wxProperties.getSubAppId();
//        request.notifyUrl = WxMiniConfig.wxProperties.getWechatNotifyUrl();
        request.transferSceneId = "1005";
        request.userRecvPerception = "劳务报酬";
        if(request.transferAmount >= 30){
@@ -140,7 +149,7 @@
        Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
        reqBuilder.addHeader("Accept", "application/json");
        reqBuilder.addHeader("Wechatpay-Serial", WxMiniConfig.wxProperties.getWechatPayPublicKeyId());
        reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(WxMiniConfig.wxProperties.getMchId(),
        reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(WxMiniConfig.wxProperties.getSubMchId(),
                WxMiniConfig.wxProperties.getWechatSerialNumer(),
                WXPayUtility.loadPrivateKeyFromPath(WxMiniConfig.wxProperties.getWechatPrivateKeyPath()),
                METHOD, uri, reqBody));
@@ -178,7 +187,7 @@
        Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
        reqBuilder.addHeader("Accept", "application/json");
        reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);
        reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(WxMiniConfig.wxProperties.getMchId(),
        reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(WxMiniConfig.wxProperties.getSubMchId(),
                WxMiniConfig.wxProperties.getWechatSerialNumer(),
                WXPayUtility.loadPrivateKeyFromPath(WxMiniConfig.wxProperties.getWechatPrivateKeyPath()),
                METHOD, uri, null));
server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java
@@ -139,13 +139,20 @@
    public void load_transferToUser()
    {
        TransferToUser transferToUser = new TransferToUser(
                StringUtils.trimToNull(wxPayProperties.getMchId()), //商户id
                StringUtils.trimToNull(wxPayProperties.getSubMchId()), //商户id
                StringUtils.trimToNull(wxPayProperties.getWechatSerialNumer()), //商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
                StringUtils.trimToNull(wxPayProperties.getWechatPrivateKeyPath()), // å•†æˆ·API证书私钥文件路径,本地文件路径
                StringUtils.trimToNull(wxPayProperties.getWechatPayPublicKeyId()),   // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
                StringUtils.trimToNull(wxPayProperties.getWechatPubKeyPath()) // å¾®ä¿¡æ”¯ä»˜å…¬é’¥æ–‡ä»¶è·¯å¾„,本地文件路径
        );
//        TransferToUser client = new TransferToUser(
//                "1229817002",                    // å•†æˆ·å·ï¼Œæ˜¯ç”±å¾®ä¿¡æ”¯ä»˜ç³»ç»Ÿç”Ÿæˆå¹¶åˆ†é…ç»™æ¯ä¸ªå•†æˆ·çš„唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
//                "3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0",         // å•†æˆ·API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
//                "d://wechatApiclient_key.pem",    // å•†æˆ·API证书私钥文件路径,本地文件路径
//                "PUB_KEY_ID_0112298170022025071700291836000600",      // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
//                "d://pub_key.pem"          // å¾®ä¿¡æ”¯ä»˜å…¬é’¥æ–‡ä»¶è·¯å¾„,本地文件路径
//        );
        this.transferToUser = transferToUser;
    }
server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
@@ -68,5 +68,9 @@
    private String wechatPayPublicKeyId; // å¾®ä¿¡æ”¯ä»˜å…¬é’¥ID
    private String wechatPubKeyPath; //微信支付公钥文件路径
    private String wechatPrivateKeyPath;
    private String wechatNotifyUrl;
//    private String wechatApiV3Key;
//    private String wechatPlatformPubKeyPath;
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -358,9 +358,10 @@
     */
    @Getter
    public enum RevenueType {
        YGD_INCOME(  0, "用工单收入","用工单收入" ,0),
        HYD_INCOME(  1, "货运单收入","货运单收入" ,0),
        GCD_INCOME(2, "供餐单收入","供餐单收入" ,0),
        YGD_INCOME(  0, "用工单收入","用工单" ,0),
        HYD_INCOME(  1, "货运单收入","货运单" ,0),
        GCD_INCOME(2, "供餐单收入","供餐单" ,0),
        WITHDRAW_APPLY(3, "提现申请","提现申请" ,0),
        REFUND(  4, "提现申请退回","提现申请退回" ,0)
        ;
@@ -384,6 +385,22 @@
            }
            return null;
        }
        public static String getName(int index) {
            for (RevenueType c : RevenueType.values()) {
                if (c.getKey() == index) {
                    return c.getName();
                }
            }
            return null;
        }
        public static String getInfo(int index) {
            for (RevenueType c : RevenueType.values()) {
                if (c.getKey() == index) {
                    return c.getInfo();
                }
            }
            return null;
        }
        public static String getObjName(int index) {
            for (RevenueType c : RevenueType.values()) {
                if (c.getKey() == index) {
server/services/src/main/java/com/doumee/dao/business/model/IdentityInfo.java
@@ -116,9 +116,7 @@
    @ExcelColumn(name="认证审批备注")
    private String auditRemark;
    @ApiModelProperty(value = "图片前缀")
    @TableField(exist = false)
    private String prefix;
    @ApiModelProperty(value = "审核人姓名")
    @TableField(exist = false)
    private String editorName;
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -220,6 +220,9 @@
    @ApiModelProperty(value = "车辆规格", example = "1")
    private String carUnit;
    @ApiModelProperty(value = "三方支付订单号", example = "1")
    private String outTradeNo;
    @ApiModelProperty(value = "图片")
    @TableField(exist = false)
    private List<Multifile> multifileList;
@@ -242,7 +245,7 @@
    @TableField(exist = false)
    private List<CateringDTO> cateringDTOList;
    @ApiModelProperty(value = "移动端用户", hidden = true)
    @ApiModelProperty(value = "移动端用户")
    @TableField(exist = false)
    private Member member;
@@ -329,5 +332,38 @@
    @TableField(exist = false)
    private Date doneTimeEnd;
    @ApiModelProperty(value = "排序方式:0=最新发布;1=距离优先;2=价格倒序", example = "1")
    @TableField(exist = false)
    private Integer sortType;
    @ApiModelProperty(value = "接单方评分")
    @TableField(exist = false)
    private double score;
    @ApiModelProperty(value = "接单量")
    @TableField(exist = false)
    private Long receiveNum;
    @ApiModelProperty(value = "发单量")
    @TableField(exist = false)
    private Long publishNum;
    @ApiModelProperty(value = "发单方头像")
    @TableField(exist = false)
    private String releaseCoverImage;
    @ApiModelProperty(value = "接单方头像")
    @TableField(exist = false)
    private String acceptCoverImage;
    @ApiModelProperty(value = "经度", example = "1")
    @TableField(exist = false)
    private BigDecimal queryLat;
    @ApiModelProperty(value = "纬度", example = "1")
    @TableField(exist = false)
    private BigDecimal queryLgt;
}
server/services/src/main/java/com/doumee/dao/dto/ReusePayDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.dao.dto;
import com.doumee.dao.business.model.Member;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("重新支付")
public class ReusePayDTO {
    @ApiModelProperty(value = "订单主键")
    private Integer orderId;
    @ApiModelProperty(value = "支付金额 å•位:分")
    private Long amount;
    @ApiModelProperty(hidden = true)
    private Member member;
}
server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -5,10 +5,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.dto.CommentDTO;
import com.doumee.dao.dto.ConfirmUpdOrderDTO;
import com.doumee.dao.dto.DoneOrderDTO;
import com.doumee.dao.dto.UpdOrderDataDTO;
import com.doumee.dao.dto.*;
import com.doumee.dao.vo.OrderReleaseVO;
import com.wechat.pay.java.service.refund.model.RefundNotification;
@@ -116,7 +113,7 @@
    void receiveCancelOrder(Integer orderId,Member member);
    Object doneOrder(DoneOrderDTO doneOrderDTO);
    OrderReleaseVO doneOrder(DoneOrderDTO doneOrderDTO);
    void comment(CommentDTO commentDTO);
@@ -144,4 +141,6 @@
    void autoGrabOrders();
    void initializeCode();
    OrderReleaseVO reusePay(ReusePayDTO reusePayDTO);
}
server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.wx.SendWxMessage;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
@@ -23,6 +24,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.annotations.ApiModelProperty;
import me.chanjar.weixin.common.error.WxErrorException;
import nonapi.io.github.classgraph.json.Id;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
@@ -55,9 +57,9 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer create(IdentityInfo identityInfo) {
        if(Objects.isNull(identityInfo)
        || Objects.isNull(identityInfo.getType())
        || Objects.isNull(identityInfo.getMemberId())
        || Objects.isNull(identityInfo.getAuthType())
            || Objects.isNull(identityInfo.getType())
            || Objects.isNull(identityInfo.getMemberId())
            || Objects.isNull(identityInfo.getAuthType())
                || StringUtils.isEmpty(identityInfo.getLinkName())
                || StringUtils.isEmpty(identityInfo.getTelephone())
                || StringUtils.isEmpty(identityInfo.getLocation())
@@ -71,23 +73,28 @@
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询用户是否已存在当前身份
        if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getDeleted,Constants.ZERO).eq(IdentityInfo::getMemberId,identityInfo.getMemberId())
                .eq(IdentityInfo::getType,identityInfo.getType()))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已存在该身份请刷新查看!");
        };
        identityInfo.setDeleted(Constants.ZERO);
        identityInfo.setCreateTime(new Date());
        identityInfo.setUpdateTime(identityInfo.getCreateTime());
        identityInfo.setAuditStatus(Constants.ONE);
        identityInfoMapper.insert(identityInfo);
        if(Objects.nonNull(identityInfo.getId())){
            this.updateById(identityInfo);
        }else{
            //查询用户是否已存在当前身份
            if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda()
                    .eq(IdentityInfo::getDeleted,Constants.ZERO)
                    .eq(IdentityInfo::getMemberId,identityInfo.getMemberId())
                    .eq(IdentityInfo::getType,identityInfo.getType()))>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已存在该身份请刷新查看!");
            };
            identityInfo.setDeleted(Constants.ZERO);
            identityInfo.setCreateTime(new Date());
            identityInfo.setUpdateTime(identityInfo.getCreateTime());
            identityInfo.setAuditStatus(Constants.ONE);
            identityInfoMapper.insert(identityInfo);
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity,Constants.ONE)
                .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()));
            memberMapper.update(new UpdateWrapper<Member>().lambda()
                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity,Constants.ONE)
                    .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();
    }
@@ -193,24 +200,50 @@
    @Override
    public IdentityInfo findById(Integer id) {
        IdentityInfo identityInfo = identityInfoMapper.selectById(id);
        //缺失前缀
        identityInfo.setPrefix("");
        return identityInfo;
        IdentityInfo model = identityInfoMapper.selectById(id);
        String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.INENTITY_FILES).getCode();
        model.setImgList(new ArrayList<>());
        if(StringUtils.isNotBlank(model.getImg1())){
            model.getImgList().add(path + model.getImg1());
        }
        if(StringUtils.isNotBlank(model.getImg2())){
            model.getImgList().add(path + model.getImg2());
        }
        if(StringUtils.isNotBlank(model.getImg3())) {
            model.getImgList().add(path + model.getImg3());
        }
        if(StringUtils.isNotBlank(model.getImg4())){
            model.getImgList().add(path + model.getImg4());
        }
        return model;
    }
    @Override
    public IdentityInfo findByMemberType(Integer type,Integer memberId){
        IdentityInfo identityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
        IdentityInfo model = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,memberId).eq(IdentityInfo::getType,type));
        if(Objects.nonNull(identityInfo)){
            //缺失前缀
            identityInfo.setPrefix("");
        if(Objects.nonNull(model)){
            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.INENTITY_FILES).getCode();
            model.setImgList(new ArrayList<>());
            if(StringUtils.isNotBlank(model.getImg1())){
                model.getImgList().add(path + model.getImg1());
            }
            if(StringUtils.isNotBlank(model.getImg2())){
                model.getImgList().add(path + model.getImg2());
            }
            if(StringUtils.isNotBlank(model.getImg3())) {
                model.getImgList().add(path + model.getImg3());
            }
            if(StringUtils.isNotBlank(model.getImg4())){
                model.getImgList().add(path + model.getImg4());
            }
        }else{
            identityInfo = new IdentityInfo();
            model = new IdentityInfo();
        }
        return identityInfo;
        return model;
    }
@@ -385,6 +418,9 @@
    }
    @Autowired
    private SendWxMessage sendWxMessage;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void audit(AuditDTO auditDTO){
@@ -403,6 +439,13 @@
        if(!Constants.equalsInteger(identityInfo.getAuditStatus(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已审批,请勿重复操作");
        }
        Member member = memberMapper.selectById(identityInfo.getMemberId());
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        identityInfo.setAuditStatus(auditDTO.getAuditStatus());
        identityInfo.setAuditRemark(auditDTO.getAuditRemark());
        identityInfo.setAuditTime(new Date());
        Date date = new Date();
        identityInfoMapper.update(new UpdateWrapper<IdentityInfo>().lambda()
                .set(IdentityInfo::getAuditStatus, auditDTO.getAuditStatus() )
@@ -422,5 +465,16 @@
                .eq(Member::getId,identityInfo.getMemberId())
        );
        try{
            //发送微信通知
            if(StringUtils.isNotBlank(member.getOpenid())){
                sendWxMessage.identityInfoMessage(member.getOpenid(),identityInfo);
            }
        }catch (WxErrorException wxErrorException){
        }
    }
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -82,6 +82,9 @@
    private WithdrawalOrdersMapper withdrawalOrdersMapper;
    @Autowired
    private ReceiveWeightMapper receiveWeightMapper;
    @Autowired
    private WxMiniUtilService wxMiniUtilService;
    @Resource
@@ -117,6 +120,7 @@
        //用餐订单
        if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
            orders.setStatus(Constants.ordersStatus.waitPay.getKey());
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            //唤起支付业务
            objects = this.getWxPayResponse(orders,orders.getMember().getOpenid());
            orderReleaseVO.setObject(objects);
@@ -175,10 +179,10 @@
        Payer payer = new Payer();
        payer.setSubOpenid(openid);
        request.setPayer(payer);
        request.setOutTradeNo(orders.getCode());
        request.setOutTradeNo(orders.getOutTradeNo());
        request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//这个回调url必须是https开头的
        Amount amount = new Amount();
        amount.setTotal(orders.getEstimatedAccount().intValue());
        amount.setTotal(1);//orders.getEstimatedAccount().intValue());
        request.setAmount(amount);
//        PrepayResponse res = WxMiniConfig.wxPayService.prepay(request);
        // è·Ÿä¹‹å‰ä¸‹å•示例一样,填充预下单参数
@@ -219,11 +223,10 @@
                || Objects.isNull(orders.getStartDate())
                || Objects.isNull(orders.getEndDate())
                || StringUtil.isBlank(orders.getLocation())
                || (!Constants.equalsInteger(Constants.ONE,orders.getType())&&StringUtil.isBlank(orders.getLocationRemark()))
                || StringUtil.isBlank(orders.getLinkPhone())
                || Objects.isNull(orders.getLat())
                || Objects.isNull(orders.getLgt())
                || Objects.isNull(orders.getCategoryId())
                || (!Constants.equalsInteger(orders.getType(),Constants.TWO) && Objects.isNull(orders.getCategoryId()))
                || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Objects.isNull(orders.getWorkType()))
                || Objects.isNull(orders.getPriceNum1())
                || Objects.isNull(orders.getEstimatedAccount())
@@ -401,28 +404,8 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
        this.getPriceUnit(orders);
        if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
            if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){
                orders.setPriceUnit("元/斤");
            }else if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)){
                orders.setPriceUnit("元/人/天");
            }else{
                if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
                    orders.setPriceUnit("元/人/天");
                }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
                    orders.setPriceUnit("元/人/小时");
                }else{
                    orders.setPriceUnit("元/斤");
                }
            }
        }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
            if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
                orders.setPriceUnit("元/天");
            }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
                orders.setPriceUnit("元/次");
            }
        }
        //附件信息
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,orders.getId())
                .eq(Multifile::getIsdeleted,Constants.ZERO).eq(Multifile::getObjType,Constants.ONE).orderByAsc(Multifile::getId));
@@ -453,6 +436,29 @@
        return orders;
    }
    public void getPriceUnit(Orders orders){
        if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
            if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){
                orders.setPriceUnit("元/斤");
            }else if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)){
                orders.setPriceUnit("元/人/天");
            }else{
                if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
                    orders.setPriceUnit("元/人/天");
                }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
                    orders.setPriceUnit("元/人/小时");
                }else{
                    orders.setPriceUnit("元/斤");
                }
            }
        }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
            if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
                orders.setPriceUnit("元/天");
            }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
                orders.setPriceUnit("元/次");
            }
        }
    }
    @Override
    public Orders findOne(Orders orders) {
        QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders);
@@ -733,6 +739,7 @@
        if(
            (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.ZERO ))
            || Constants.equalsInteger(orders.getType(),Constants.ONE)
                || Constants.equalsInteger(orders.getType(),Constants.TWO)
        ){
            orders.setPriceNum2(Constants.ONE);
        }else{
@@ -798,9 +805,7 @@
            Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_DISAGREE;
            this.saveOrderLog(orders,ordersLog,
                    ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null);
            //TODO å‘送不同意变更通知
        }
    }
@@ -960,7 +965,7 @@
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Object doneOrder(DoneOrderDTO doneOrderDTO){
    public OrderReleaseVO doneOrder(DoneOrderDTO doneOrderDTO){
        if(Objects.isNull(doneOrderDTO)||Objects.isNull(doneOrderDTO.getOrderId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
@@ -977,7 +982,8 @@
        if(!Constants.equalsInteger(orders.getReleaseMemberId(),doneOrderDTO.getMember().getId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非您的订单无法进行该操作");
        }
        orders.setPayAccount(doneOrderDTO.getAmount());
        OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
        orderReleaseVO.setId(orders.getId());
        Object object = null;
        //用餐订单
        if(!Constants.equalsInteger(orders.getType(),Constants.TWO)){
@@ -985,20 +991,81 @@
            //提成金额
            Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
            orders.setReceiveAccount(orders.getPayAccount() - tcje);
            orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
            ordersMapper.updateById(orders);
            //唤起支付业务
            object = this.getWxPayResponse(orders,orders.getMember().getOpenid());
            orderReleaseVO.setObject(object);
        }else{
            orders.setStatus(Constants.ordersStatus.done.getKey());
            orders.setFinishTime(new Date());
            ordersMapper.updateById(orders);
            Member member = memberMapper.selectById(orders.getAcceptMemberId());
            //存储流水记录
            MemberRevenue memberRevenue = new MemberRevenue();
            memberRevenue.setCreateTime(new Date());
            memberRevenue.setMemberId(orders.getAcceptMemberId());
            memberRevenue.setType(orders.getType());
            memberRevenue.setOptType(Constants.ONE);
            memberRevenue.setBeforeAmount(member.getAmount());
            memberRevenue.setAmount(orders.getReceiveAccount());
            memberRevenue.setAfterAmount(member.getAmount() + orders.getReceiveAccount());
            if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()) + "-" +
                        (Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)?"采摘工":(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"分拣工":"包装工")));
            }else{
                memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
            }
            memberRevenue.setObjId(orders.getId());
            memberRevenue.setObjType(Constants.ZERO);
            memberRevenue.setStatus(Constants.ZERO);
            memberRevenueMapper.insert(memberRevenue);
            //日志存储
            Constants.OrdersLog ordersLog = Constants.OrdersLog.DONE;
            this.saveOrderLog(orders,ordersLog,
                    ordersLog.getInfo(),doneOrderDTO.getMember().getId(),null);
        }
        return object;
        return orderReleaseVO;
    }
    @Override
    public OrderReleaseVO reusePay(ReusePayDTO reusePayDTO){
        if(Objects.isNull(reusePayDTO)||Objects.isNull(reusePayDTO.getOrderId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Orders orders = ordersMapper.selectById(reusePayDTO.getOrderId());
        if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(orders.getType(),Constants.TWO)&&Objects.isNull(reusePayDTO.getAmount())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(!((( Constants.equalsInteger(orders.getType(),Constants.TWO) && Constants.equalsInteger(orders.getStatus(),Constants.ZERO) )
                || ( !Constants.equalsInteger(orders.getType(),Constants.TWO) && Constants.equalsInteger(orders.getStatus(),Constants.THREE) ))
        && Constants.equalsInteger(orders.getPayStatus(),Constants.ZERO) )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转");
        }
        OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
        if(!Constants.equalsInteger(orders.getType(),Constants.TWO)){
            orders.setPayAccount(reusePayDTO.getAmount());
            //提成金额
            Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
            orders.setReceiveAccount(orders.getPayAccount() - tcje);
        }
        orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
        ordersMapper.updateById(orders);
        //唤起支付业务
        Object object = this.getWxPayResponse(orders,orders.getMember().getOpenid());
        orderReleaseVO.setObject(object);
        orderReleaseVO.setId(orders.getId());
        return orderReleaseVO;
    }
    @Override
@@ -1083,20 +1150,16 @@
                .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())
        );
        //日志存储
        Constants.OrdersLog ordersLog = Constants.OrdersLog.COMMENT;
        this.saveOrderLog(orders,ordersLog,
                ordersLog.getInfo(),orders.getAcceptMemberId(),null);
    }
    /**
@@ -1117,7 +1180,7 @@
                //处理支付完成逻辑
                ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                        .set(Orders::getUpdateTime,new Date())
                        .set(Orders::getStatus,Constants.ordersStatus.wait)
                        .set(Orders::getStatus,Constants.ordersStatus.wait.getKey())
                        .set(Orders::getPayStatus,Constants.ONE)
                        .set(Orders::getPayTime,new Date())
                        .set(Orders::getPayMethod,Constants.ZERO)
@@ -1157,6 +1220,12 @@
                memberRevenue.setBeforeAmount(member.getAmount());
                memberRevenue.setAmount(orders.getReceiveAccount());
                memberRevenue.setAfterAmount(member.getAmount() + orders.getReceiveAccount());
                if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
                    memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()) + "-" +
                            (Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)?"采摘工":(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"分拣工":"包装工")));
                }else{
                    memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
                }
                memberRevenue.setObjId(orders.getId());
                memberRevenue.setObjType(Constants.ZERO);
                memberRevenue.setStatus(Constants.ZERO);
@@ -1175,6 +1244,7 @@
                        ordersLog.getInfo(),orders.getReleaseMemberId(),null);
                //TODO é€šçŸ¥æŽ¥å•æ–¹ æ¬¾é¡¹å·²åˆ°è´¦
            }
        }
        return  ("处理成功!");
@@ -1187,73 +1257,124 @@
        MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        Orders model = pageWrap.getModel();
        if(Objects.isNull(model)
            || Objects.isNull(model.getQueryLat())
            || Objects.isNull(model.getQueryLgt())
                || Objects.isNull(model.getQueryMyOrderType())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        BigDecimal chefLat = model.getQueryLat();
        BigDecimal chefLgt = model.getQueryLgt();
        BigDecimal driverLat = model.getQueryLat();
        BigDecimal driverLgt = model.getQueryLgt();
        BigDecimal workerLat = model.getQueryLat();
        BigDecimal workerLgt = model.getQueryLgt();
        IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                .eq(IdentityInfo::getType,Constants.ZERO)
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(Objects.nonNull(wokerIdentityInfo)){
            workerLat = wokerIdentityInfo.getLat();
            workerLgt = wokerIdentityInfo.getLgt();
        }
        IdentityInfo driverIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                .eq(IdentityInfo::getType,Constants.ONE)
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(Objects.nonNull(driverIdentityInfo)){
            driverLat = driverIdentityInfo.getLat();
            driverLgt = driverIdentityInfo.getLgt();
        }
        IdentityInfo chefIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                .eq(IdentityInfo::getType,Constants.TWO)
                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                .last("limit 1")
        );
        if(Objects.nonNull(chefIdentityInfo)){
            chefLat = chefIdentityInfo.getLat();
            chefLgt = chefIdentityInfo.getLgt();
        }
        queryWrapper.selectAll(Orders.class)
                .select("c1.name",Orders::getCategoryName)
                .select("c2.name",Orders::getTransportTypeName)
                .leftJoin(" category c1 on t.category_id = c1.id  ")
                .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id  ");
                .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id  ")
                .select(" case when T.LGT IS NULL OR T.LAT IS NULL THEN 0 " +
                        " when t.TYPE = 0 then CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+workerLgt+", "+workerLat+" )) /1000,DECIMAL(15,2))  " +
                        " when t.TYPE = 1 then   CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+driverLgt+", "+driverLat+" )) /1000,DECIMAL(15,2)) " +
                        " else  CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+chefLgt+", "+chefLat+" )) /1000,DECIMAL(15,2)) end " , Orders::getDistance)
                .eq(Objects.nonNull(model.getType()),Orders::getType,model.getType());
        if(Objects.nonNull(model.getQueryMyOrderType())){
            if(Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ZERO)){
                //发单方 æˆ‘的订单
                queryWrapper.eq(Orders::getReleaseMemberId,model.getMember().getId());
                queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus,model.getStatus());
                queryWrapper.orderByDesc(Orders::getCreateTime);
            }else if(Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ONE)){
                //接单方 æˆ‘的订单
                queryWrapper.eq(Orders::getAcceptMemberId,model.getMember().getId());
                queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus,model.getStatus());
                queryWrapper.orderByDesc(Orders::getCreateTime);
            }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 "));
                if(Objects.nonNull(receiveWeight)){
                    queryWrapper.apply(" DATE_ADD(t.CREATE_TIME, INTERVAL "+receiveWeight.getDelayTime()+" MINUTE)  < now() ");
                }
                queryWrapper.eq(Orders::getStatus,Constants.ordersStatus.wait.getKey());
                //接单大厅
                queryWrapper.and(Constants.equalsInteger(model.getMember().getWorkerIdentity(),Constants.TWO)||Constants.equalsInteger(model.getMember().getDriverIdentity(),Constants.TWO)||Constants.equalsInteger(model.getMember().getChefIdentity(),Constants.TWO),i->
                        i.eq(Constants.equalsInteger(model.getMember().getWorkerIdentity(),Constants.TWO),Orders::getType,Constants.ZERO)
                                .or()
                                .eq(Constants.equalsInteger(model.getMember().getDriverIdentity(),Constants.TWO),Orders::getType,Constants.ONE)
                                .or()
                                .eq(Constants.equalsInteger(model.getMember().getChefIdentity(),Constants.TWO),Orders::getType,Constants.TWO)
                );
                queryWrapper.apply(!(Constants.equalsInteger(model.getMember().getWorkerIdentity(),Constants.TWO)||Constants.equalsInteger(model.getMember().getDriverIdentity(),Constants.TWO)||Constants.equalsInteger(model.getMember().getChefIdentity(),Constants.TWO))," 1 = 2 "
                );
                queryWrapper.ne(Orders::getReleaseMemberId,model.getMember().getId());
                if(Objects.nonNull(model.getSortType())){
                    if(Constants.equalsInteger(model.getSortType(),Constants.ZERO)){
                        queryWrapper.orderByDesc(Orders::getCreateTime);
                    }else if(Constants.equalsInteger(model.getSortType(),Constants.ONE)){
                        queryWrapper.orderByAsc(" distance  ");
                    }else{
                        queryWrapper.orderByDesc(Orders::getEstimatedAccount);
                    }
                }
            }
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        }
        IPage<Orders> iPage = ordersMapper.selectJoinPage(page,Orders.class,queryWrapper);
        if(Objects.nonNull(model.getQueryMyOrderType())&&Constants.equalsInteger(model.getQueryMyOrderType(),Constants.TWO)){
            if(Constants.equalsInteger(model.getMember().getUseIdentity(),Constants.ONE)){
                model.getMember().setWorkerIdentityModel(
                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                                .eq(IdentityInfo::getType,Constants.ZERO)
                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                                .last("limit 1")
                        )
                );
                model.getMember().setDriverIdentityModel(
                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                                .eq(IdentityInfo::getType,Constants.ONE)
                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                                .last("limit 1")
                        )
                );
                model.getMember().setChefIdentityModel(
                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
                                .eq(IdentityInfo::getType,Constants.TWO)
                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
                                .last("limit 1")
                        )
                );
            }
            for (Orders orders:iPage.getRecords()) {
               this.getDistance(model.getMember(),orders);
            }
        for (Orders orders:iPage.getRecords()) {
            this.getPriceUnit(orders);
        }
//        if(Objects.nonNull(model.getQueryMyOrderType())&&Constants.equalsInteger(model.getQueryMyOrderType(),Constants.TWO)){
//            if(Constants.equalsInteger(model.getMember().getUseIdentity(),Constants.ONE)){
//                model.getMember().setWorkerIdentityModel(
//                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
//                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
//                                .eq(IdentityInfo::getType,Constants.ZERO)
//                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
//                                .last("limit 1")
//                        )
//                );
//                model.getMember().setDriverIdentityModel(
//                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
//                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
//                                .eq(IdentityInfo::getType,Constants.ONE)
//                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
//                                .last("limit 1")
//                        )
//                );
//                model.getMember().setChefIdentityModel(
//                        identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
//                                .eq(IdentityInfo::getMemberId,model.getMember().getId())
//                                .eq(IdentityInfo::getType,Constants.TWO)
//                                .eq(IdentityInfo::getAuditStatus,Constants.TWO)
//                                .last("limit 1")
//                        )
//                );
//            }
//            for (Orders orders:iPage.getRecords()) {
//               this.getDistance(model.getMember(),orders);
//            }
//        }
        return PageData.from(iPage);
    }
@@ -1309,28 +1430,36 @@
    public Orders getDetail(Integer id,Integer userType) {
        Orders orders = ordersMapper.selectJoinOne(Orders.class,new MPJLambdaWrapper<Orders>()
                        .selectAll(Orders.class)
                        .select(" m1.name " , Orders::getReleaseName)
                        .select(" m1.telephone " , Orders::getReleasePhone)
                        .select(" case when i.AUTH_TYPE = 0 then i.LINK_NAME else i.COMPANY_NAME end " , Orders::getAcceptName)
                        .select(" i.TELEPHONE " , Orders::getAcceptPhone)
                        .select("c1.name",Orders::getCategoryName)
                        .select("c2.name",Orders::getTransportTypeName)
                        .select(" m2.SCORE " , Orders::getScore)
                        .select(" m1.PUBLISH_NUM " , Orders::getPublishNum)
                        .select(" m2.RECEIVE_NUM " , Orders::getReceiveNum)
                        .select(" m1.COVER_IMAGE " , Orders::getReleaseCoverImage)
                        .select(" m2.COVER_IMAGE " , Orders::getAcceptCoverImage)
                        .leftJoin(" category c1 on t.category_id = c1.id  ")
                        .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id  ")
                        .leftJoin("member m1 on t.RELEASE_MEMBER_ID = m1.id ")
                        .leftJoin("member m2 on t.ACCEPT_MEMBER_ID = m2.id ")
                        .leftJoin("identity_info i on m2.id = i.MEMBER_ID and i.TYPE = t.type and i.AUDIT_STATUS = 2  ")
                        .eq(Orders::getId,id)
                );
        if(Objects.isNull(orders)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Objects.nonNull(userType)){
            Member member = memberMapper.selectById(
                    Constants.equalsInteger(userType,Constants.ZERO)?orders.getReleaseMemberId():orders.getAcceptMemberId()
            );
            if(Objects.nonNull(member)){
                if(org.apache.commons.lang3.StringUtils.isNotBlank(member.getCoverImage())){
                    //头像信息
                    String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                            +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode();
                    member.setFullCoverImage(path + member.getCoverImage());
                }
                orders.setMember(member);
            }
        //头像信息
        String coverPath  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode();
        if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getReleaseCoverImage())){
            orders.setReleaseCoverImage(coverPath + orders.getReleaseCoverImage());
        }
        if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getAcceptCoverImage())){
            orders.setAcceptCoverImage(coverPath + orders.getAcceptCoverImage());
        }
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,orders.getId())
                .eq(Multifile::getIsdeleted,Constants.ZERO).eq(Multifile::getObjType,Constants.ONE).orderByAsc(Multifile::getId));
@@ -1342,7 +1471,7 @@
            }
            orders.setMultifileList(multifileList);
        }
        orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
        return orders;
    }
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -1,6 +1,5 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.wx.TransferToUser;
import com.doumee.config.wx.WXPayUtility;
@@ -210,7 +209,6 @@
        transferToUserRequest.outBillNo =  withdrawalOrders.getOutBillNo();
        transferToUserRequest.transferAmount = withdrawalDTO.getAmount();
        transferToUserRequest.transferRemark = "提现申请";
//        transferToUserRequest.userName = member.getName();
        try {
            TransferToUser.TransferToUserResponse response =  WxMiniConfig.transferToUser.run(transferToUserRequest,member.getName());
            withdrawalOrders.setRemark(JSONObject.toJSONString(response));
@@ -231,6 +229,7 @@
            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.TWO);
server/services/src/main/resources/application-dev.yml
@@ -85,14 +85,14 @@
  pay:
    #服务商---------start-------
    appId: wx48fd8faa35cc8277
    mchId: 1229817002 #1661770902
    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
    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
@@ -102,10 +102,14 @@
    #商户信息
    wechatSerialNumer: 3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0
    wechatPayPublicKeyId: PUB_KEY_ID_0112298170022025071700291836000600
    wechatPubKeyPath: d://pub_key.pem
    wechatPrivateKeyPath: d://wechatApiclient_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
    #服务商-------------end---
    existsSub: 1
server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -9,10 +9,7 @@
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.dto.CommentDTO;
import com.doumee.dao.dto.ConfirmUpdOrderDTO;
import com.doumee.dao.dto.DoneOrderDTO;
import com.doumee.dao.dto.UpdOrderDataDTO;
import com.doumee.dao.dto.*;
import com.doumee.dao.vo.OrderReleaseVO;
import com.doumee.service.business.IdentityInfoService;
import com.doumee.service.business.MemberService;
@@ -145,11 +142,22 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Object> doneOrder(@RequestBody DoneOrderDTO doneOrderDTO) {
    public ApiResponse<OrderReleaseVO> doneOrder(@RequestBody DoneOrderDTO doneOrderDTO) {
        doneOrderDTO.setMember(getMemberResponse());
        return  ApiResponse.success("操作成功",ordersService.doneOrder(doneOrderDTO));
    }
    @LoginRequired
    @ApiOperation(value = "订单重新支付 - å‘单方", notes = "小程序端")
    @PostMapping("/reusePay")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<OrderReleaseVO> reusePay(@RequestBody ReusePayDTO reusePayDTO) {
        reusePayDTO.setMember(getMemberResponse());
        return  ApiResponse.success("操作成功",ordersService.reusePay(reusePayDTO));
    }
    @LoginRequired
    @ApiOperation(value = "订单评价 - å‘单方", notes = "小程序端")
small-program/pages/demand-hall/demand-hall.vue
@@ -36,7 +36,7 @@
            </view>
            <!-- å‘单方 -->
            <view class="index-list" v-if="typeViewId === 0">
                <view class="index-list-item" v-for="(item, index) in orderList" :key="index">
                <view class="index-list-item" v-for="(item, index) in orderList" :key="index" @click="jumpDesc(item)">
                    <view class="index-list-item-head">
                        <view class="index-list-item-head-l">
                            <view class="xoam"></view>
@@ -85,7 +85,7 @@
                        </view>
                        <view class="index-list-item-dz">
                            <image src="/static/icon/order_ic_time@2x.png" mode="widthFix"></image>
                            <text>{{item.startDate}} è‡³ {{item.endDate}}({{item.priceNum1}}天)</text>
                            <text>{{item.startDate}} è‡³ {{item.endDate}}({{item.totalDays}}天)</text>
                        </view>
                    </template>
                    <view class="index-list-item-price">
@@ -344,6 +344,11 @@
            this.getOrderList()
        },
        methods: {
            jumpDesc(item) {
                uni.navigateTo({
                    url: `/pages/order-details/order-details?id=${item.id}`
                })
            },
            // ä¿®æ”¹
            jumpEdit(item) {
                if (item.type === 0 && item.workType === 0) {
@@ -357,6 +362,10 @@
                } else if (item.type === 0 && item.workType === 2) {
                    uni.navigateTo({
                        url: `/pages/packaging-worker/packaging-worker?id=${item.id}`
                    })
                } else if (item.type === 1) {
                    uni.navigateTo({
                        url: `/pages/freight/freight?id=${item.id}`
                    })
                }
            },
@@ -404,6 +413,8 @@
                    
                    if (this.orderList.length === res.data.total) {
                        this.next = false
                    } else {
                        this.page += 1
                    }
                })
            },
small-program/pages/using-workers/using-workers.vue
@@ -56,7 +56,7 @@
                    <view class="list-item-row-label">图片</view>
                    <view class="list-item-row-upload">
                        <view class="upload-item" v-for="(item, index) in form.multifileList" :key="index">
                            <image :src="item.url" mode="widthFix"></image>
                            <image :src="item.url || item.fileurlFull" mode="widthFix"></image>
                            <image class="upload-item-dele" @click="form.multifileList.splice(index, 1)" src="/static/icon/ic_delete1@2x.png" mode="widthFix"></image>
                        </view>
                        <view class="upload-item" @click="uploadImg">
@@ -155,6 +155,7 @@
                show: false,
                show1: false,
                form: {
                    id: null,
                    days: '',
                    startDate: '',
                    endDate: '',
@@ -175,19 +176,34 @@
                    estimatedAccount: '',
                    type: 0
                },
                modify: false,
                cateList: [],
                viewStatus: false
            };
        },
        onLoad(option) {
            this.form.linkPhone = this.userInfo.telephone
            this.form.days = option.days
            this.form.startDate = option.startDate
            this.form.endDate = option.endDate
            this.form.lat = option.latitude
            this.form.lgt = option.longitude
            this.form.location = option.address
            this.form.workType = option.workType
            // ç¼–辑
            if (option.id) {
                this.form.id = option.id
                this.$u.api.getDetail({
                    orderId: option.id
                }).then(res => {
                    for (const key in this.form) {
                        this.form[key] = res.data[key]
                    }
                    this.form.days = res.data.totalDays
                    this.form.price = Number(this.form.price) / 100
                })
            } else {
                this.form.linkPhone = this.userInfo.telephone
                this.form.days = option.days
                this.form.startDate = option.startDate
                this.form.endDate = option.endDate
                this.form.lat = option.latitude
                this.form.lgt = option.longitude
                this.form.location = option.address
                this.form.workType = option.workType
            }
            this.getCateList()
        },
        methods: {
@@ -205,14 +221,33 @@
                if (!this.form.linkPhone) {
                    return uni.showToast({ title: '请输入联系电话', icon: 'none' })
                }
                this.$u.api.release({ ...this.form, price: Number(this.form.price) * 100 })
                    .then(res => {
                        if (res.code == 200) {
                            uni.navigateTo({
                                url: `/pages/success/success?orderId=${res.data.id}`
                            })
                        }
                    })
                if (!this.form.id) {
                    this.$u.api.release({ ...this.form, price: Number(this.form.price) * 100 })
                        .then(res => {
                            if (res.code == 200) {
                                uni.navigateTo({
                                    url: `/pages/success/success?orderId=${res.data.id}`
                                })
                            }
                        })
                } else {
                    this.$u.api.updateOrder({ ...this.form, price: Number(this.form.price) * 100  })
                        .then(res => {
                            if (res.code == 200) {
                                uni.showToast({
                                    title: '编辑成功',
                                    icon: 'success',
                                    mask: true,
                                    duration: 2000
                                })
                                setTimeout(() => {
                                    uni.navigateBack({ delta: 1 });
                                    uni.$emit('refresh')
                                }, 1500)
                            }
                        })
                }
            },
            // è®¡ç®—金额
            getPrice() {
@@ -225,6 +260,7 @@
                        type: this.form.type,
                        workType: this.form.workType
                    }).then(res => {
                        this.modify = true
                        this.form.estimatedAccount = res.data
                    })
                }