server/services/src/main/java/com/doumee/config/wx/WxMiniConfig.java
@@ -10,6 +10,12 @@ import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.service.billdownload.BillDownloadService; import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiService; import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension; import com.wechat.pay.java.service.refund.RefundService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -21,12 +27,18 @@ */ @Configuration public class WxMiniConfig { @Autowired private SystemDictDataBiz systemDictDataBiz; /********微信å°ç¨åºæå¡**********/ public static WxMaService wxMaService; /********微信å°ç¨åºæ¯ä»**********/ public static WxPayService wxPayService; public static JsapiService wxPayService; public static WxPayService wxPayV2Service; public static RefundService refundService; public static JsapiServiceExtension jsapiExtService; public static BillDownloadService billDownloadService; public static WxPayProperties wxProperties; @Autowired private WxPayProperties wxPayProperties; public static WxMiniConfig me() { return SpringUtils.get().getBean(WxMiniConfig.class); @@ -35,15 +47,23 @@ @PostConstruct void init() { this.load_WxMaService(); // this.load_wxPayService(); this.load_wxPayService(); this.load_wxPayV2Service(); this.wxProperties = wxPayProperties; } /** * åå§å微信å°ç¨åº */ public void load_WxMaService() { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode())); config.setSecret(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.SECRET).getCode())); if(wxPayProperties.getExistsSub() ==1){ //å¦ææ¯æå¡åæ¯ä»,åååæ·ä¿¡æ¯ 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.setMsgDataFormat("JSON"); //config.setToken(""); //config.setAesKey(""); @@ -55,6 +75,50 @@ /** * åå§å微信å°ç¨åºæ¯ä» */ public void load_wxPayService() { try { Config config = new RSAAutoCertificateConfig.Builder() .merchantId(wxPayProperties.getMchId()) .privateKeyFromPath(wxPayProperties.getPrivateKeyPath()) .merchantSerialNumber(wxPayProperties.getSerialNumer()) .apiV3Key(wxPayProperties.getApiV3Key()) .build(); this.wxPayService = new JsapiService.Builder().config(config).build(); this.jsapiExtService = new JsapiServiceExtension.Builder().config(config).build(); this.refundService = new RefundService.Builder().config(config).build(); this.billDownloadService = new BillDownloadService.Builder().config(config).build(); }catch (Exception e){ e.printStackTrace(); } } /** * åå§å微信å°ç¨åºæ¯ä» */ 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_wxPayService() { // WxPayConfig payConfig = new WxPayConfig(); // payConfig.setTradeType(WxPayConstants.TradeType.JSAPI); server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,83 @@ package com.doumee.config.wx; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.HttpsUtil; import com.doumee.dao.business.WithdrawalOrdersMapper; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.WithdrawalOrders; import com.doumee.dao.system.model.SystemDictData; import com.wechat.pay.java.service.refund.model.AmountReq; import com.wechat.pay.java.service.refund.model.CreateRequest; import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * 微信å°ç¨åº-å ¬å ±æ¹æ³ */ @Service @Slf4j public class WxMiniUtilService { @Autowired private WithdrawalOrdersMapper withdrawalOrdersMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private WxPayProperties wxPayProperties; @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public boolean wxRefund(WithdrawalOrders withdrawalOrders,Orders orders) { // åé鿬¾è¯·æ± withdrawalOrders.setCreateTime(new Date()); withdrawalOrdersMapper.insert(withdrawalOrders); CreateRequest request = new CreateRequest(); request.setOutTradeNo(orders.getCode()); request.setOutRefundNo("refund_"+orders.getCode()); request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId()); request.setNotifyUrl(WxMiniConfig.wxProperties.getRefundNotifyUrl()); AmountReq amountReq = new AmountReq(); amountReq.setTotal(withdrawalOrders.getAmount()); amountReq.setRefund(withdrawalOrders.getAmount()); amountReq.setCurrency("CNY"); request.setAmount(amountReq); try { log.error("=============="+JSONObject.toJSONString(request)); com.wechat.pay.java.service.refund.model.Refund response = WxMiniConfig.refundService.create(request); log.error("=============="+JSONObject.toJSONString(response)); if ("SUCCESS".equals(response.getStatus().name()) || "PROCESSING".equals(response.getStatus().name()) ) { return true; }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对ä¸èµ·ï¼é款ç³è¯·å¤±è´¥å¦ï¼"); } }catch (Exception e){ e.printStackTrace(); throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对ä¸èµ·ï¼é款ç³è¯·å¤±è´¥ï¼"); } } } server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.doumee.config.wx; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * Created by IntelliJ IDEA. * * @Author : Rk * @create 2023/3/22 18:04 */ @Component @ConfigurationProperties(prefix = "wx.pay") @Data public class WxPayProperties { /** * AppID */ private String appId; private String apiV3Key; /** * AppSecret */ private String appSecret; /** * å¾®ä¿¡åæ·å· */ private String mchId; /** * æ¯ä»APIå¯é¥ */ private String mchKey; /** * æ¯ä»APIå¯é¥ */ private String subMchKey; /** * æ¯ä»åè°å°å */ private String notifyUrl; /** * 鿬¾åè°å°å */ private String refundNotifyUrl; /** * æ¯ä»è¯ä¹¦(p12) */ private String keyPath; private String serialNumer; private int existsSub;// true private String subAppId;//wxcd2b89fd2ff065f8 private String subMchId;// 1229817002 private String subAppSecret;// 1229817002 private String typeId;// gybike private String privateKeyPath ; private String privateCertPath;// gybike } server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -52,6 +52,12 @@ public static final String ABOUT_US ="ABOUT_US" ; public static final String RELEASE_CANCEL_TIMES ="RELEASE_CANCEL_TIMES" ; public static final String RECEIVE_CANCEL_TIMES ="RECEIVE_CANCEL_TIMES" ; public static final String RELEASE_CANCEL_TIME ="RELEASE_CANCEL_TIME" ; public static final String RECEIVE_CANCEL_TIME ="RECEIVE_CANCEL_TIME" ; public static final String AUTO_DISPATCH ="AUTO_DISPATCH" ; public static final String AUTO_DISPATCH_DISTANCE ="AUTO_DISPATCH_DISTANCE" ; public static final String QYWX = "QYWX"; public static final Integer ONE = 1; @@ -388,4 +394,92 @@ } public enum OrdersLog { UPLOAD(0, "ååæ¹-åå¸è®¢å","{userName}åå¸{param}",0), RECEIVE(1, "æ¥åæ¹-å·²æ¢å","{userName}å·²æ¢å",1), UPD_ORDER(2, "ååæ¹-ä¿®æ¹è®¢å","{userName}ä¿®æ¹äºç¨å·¥æ¶é´",0), UPD_DISAGREE(3, "æ¥åæ¹-ä¸åæä¿®æ¹,订ååæ¶","{userName}ä¸åæä¿®æ¹ï¼è®¢ååæ¶",1), UPD_AGREE(4, "æ¥åæ¹-åæä¿®æ¹","{userName}åæä¿®æ¹",1), AUTO(5, "ç³»ç»-èªå¨æ´¾å","æ 人æ¥åå·²èªå¨æ´¾åç»{userName}",1), CANCEL(6, "æ¥åæ¹-åæ¶æ¥å","{userName}å·²æå¨åæ¶æ¥å",1), BEGIN(7, "ååæ¹-å¼å§ä½ä¸","{userName}å·²å¼å§ä½ä¸",0), DONE(8, "ååæ¹-宿ä½ä¸","{userName}å·²ç¡®è®¤å®æä½ä¸",0), PAY(9, "ååæ¹-宿æ¯ä»","{userName}å·²æ¯ä»è´¹ç¨",0), COMMENT(10, "ååæ¹-è¯ä»·å®æ","{userName}宿è¯ä»·",0), SYSTEM_CANCEL(11, "ç³»ç»-订ååæ¶","ç³»ç»åæ¶",2), RELEASE_CANCEL(12, "ååæ¹-订ååæ¶","{userName}å·²æå¨åæ¶è®¢å",0), ; // æååé private String name; private String info; private int key; private int userType; // æé æ¹æ³ OrdersLog(int key, String name,String info,int userType) { this.name = name; this.info = info; this.key = key; this.userType = userType; } // æ®éæ¹æ³ public static String getName(int index) { for (OrdersLog c : OrdersLog.values()) { if (c.getKey() == index) { return c.name; } } return null; } public static String getInfo(int index) { for (OrdersLog c : OrdersLog.values()) { if (c.getKey() == index) { return c.info; } } 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 int getUserType() { return userType; } public void setUserType(int key) { this.userType = userType; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } } } server/services/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -1380,6 +1380,9 @@ return (int) days; } public static int daysBetweenDates11(Date newDate, Date oldDate) { int days = 0; Calendar calo = Calendar.getInstance(); @@ -2944,9 +2947,9 @@ // System.out.println(getPlusTime2(d)); // } // Date startTime = DateUtil.StringToDate("2024-05-01 08:00:00" ,"yyyy-MM-dd HH:mm:ss"); // Date endTime = DateUtil.StringToDate("2024-05-01 17:00:00" ,"yyyy-MM-dd HH:mm:ss"); // Long intervalTime = 35L; Date startTime = DateUtil.StringToDate("2024-05-01" ,"yyyy-MM-dd"); Date endTime = DateUtil.StringToDate("2024-06-02" ,"yyyy-MM-dd"); System.out.println(DateUtil.daysBetweenDates(endTime,startTime)); // // // DateUtil.checkDateInterval( startTime.toInstant() server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -26,7 +26,7 @@ @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "1") @ExcelColumn(name="æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤") private Byte deleted; private Integer deleted; @ApiModelProperty(value = "ç¶æ:0=å¯ç¨ï¼1=ç¦ç¨ï¼", example = "1") @ExcelColumn(name="ç¶æ:0=å¯ç¨ï¼1=ç¦ç¨ï¼") server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -118,6 +118,16 @@ @ExcelColumn(name="è¯å") private BigDecimal score; @ApiModelProperty(value = "è¯åæ»æ°", example = "1") @ExcelColumn(name="è¯åæ»æ°") private BigDecimal totalScore; @ApiModelProperty(value = "被è¯ä»·æ»è®¢åæ°", example = "1") @ExcelColumn(name="被è¯ä»·æ»è®¢åæ°") private Integer scoreOrderNum; @ApiModelProperty(value = "å®ä½å°å") @ExcelColumn(name="å®ä½å°å") private String location; server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -52,7 +52,7 @@ // @ApiModelProperty(value = "å ³è对象类å 0SHE䏿¥ 1è·ç»æ»ä¸æ¥ 2è·ç»æ»å¤ç 3è·ç»æ»åé ç©ä¸ä¸»ç®¡ 4è·ç»æ»åé å¤ç人 5DCAé£é©ä¸æ¥ 6DCAé£é©å¤ç 7DCAå·¥åå¾ç", example = "1") // @ExcelExportColumn(name="å ³è对象类å 0SHE䏿¥ 1è·ç»æ»ä¸æ¥ 2è·ç»æ»å¤ç 3è·ç»æ»åé ç©ä¸ä¸»ç®¡ 4è·ç»æ»åé å¤ç人 5DCAé£é©ä¸æ¥ 6DCAé£é©å¤ç 7DCAå·¥åå¾ç") @ApiModelProperty(value = "å ³è对象类å 0å·¥å䏿¥ 1å·¥åå¤ç 2å·¥å转交", example = "1") @ApiModelProperty(value = "å ³è对象类å 0身份ç³è¯·èµæ 1订åéä»¶", example = "1") private Integer objType; @ApiModelProperty(value = "æä»¶å°å") server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java
@@ -26,7 +26,7 @@ @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "1") @ExcelColumn(name="æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤") private Byte deleted; private Integer deleted; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") @ExcelColumn(name="å建人ç¼ç ") @@ -34,7 +34,6 @@ @ApiModelProperty(value = "å建æ¶é´") @ExcelColumn(name="å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date createTime; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") @@ -43,7 +42,6 @@ @ApiModelProperty(value = "æ´æ°æ¶é´") @ExcelColumn(name="æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") private Date updateTime; @ApiModelProperty(value = "夿³¨") @@ -82,4 +80,9 @@ @ExcelColumn(name="订åç¶æ:0=å¾ æ¥åï¼1=å·²æ¥åï¼2=è¿è¡ä¸ï¼3=已宿ï¼99=已忶ï¼") private Integer orderStatus; @ApiModelProperty(value = "æä½äººç±»åï¼0=ååæ¹;1=æ¥åæ¹;2=ç³»ç»;", example = "1") @ExcelColumn(name="æä½äººç±»åï¼0=ååæ¹;1=æ¥åæ¹;2=ç³»ç»;") private Integer optUserType; } server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.doumee.core.annotation.excel.ExcelColumn; import com.doumee.dao.dto.CateringDTO; import com.doumee.dao.dto.WayInfoDTO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import com.baomidou.mybatisplus.annotation.IdType; @@ -29,7 +31,7 @@ @ApiModelProperty(value = "æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤", example = "1") @ExcelColumn(name="æ¯å¦å·²å é¤ 0æªå é¤ 1å·²å é¤") private Byte deleted; private Integer deleted; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") @ExcelColumn(name="å建人ç¼ç ") @@ -107,12 +109,12 @@ @ExcelColumn(name="ç¨å·¥ç±»å:0=éæå·¥ï¼1=忣工ï¼2=å è£ å·¥ï¼ï¼ç¨å·¥è®¢åï¼") private Integer workType; @ApiModelProperty(value = "计价æ°é1(天æ°/ç¨è½¦æ¬¡æ°)", example = "1") @ExcelColumn(name="计价æ°é1(天æ°/ç¨è½¦æ¬¡æ°)") @ApiModelProperty(value = "计价æ°é1(天æ°/ç¨è½¦æ¬¡æ°/å°æ¶/æ¤æ°)", example = "1") @ExcelColumn(name="计价æ°é1(天æ°/ç¨è½¦æ¬¡æ°/å°æ¶/æ¤æ°)") private Integer priceNum1; @ApiModelProperty(value = "计价æ°é2(ç¨å·¥æ°é/éææ°é/ç¨è½¦æ°é/)", example = "1") @ExcelColumn(name="计价æ°é2(ç¨å·¥æ°é/éææ°é/ç¨è½¦æ°é/)") @ApiModelProperty(value = "计价æ°é2(人æ°/ç¨é¤ä»½æ°)", example = "1") @ExcelColumn(name="计价æ°é2(人æ°/ç¨é¤ä»½æ°)") private Integer priceNum2; @ApiModelProperty(value = "éæ±è¡¥å ") @@ -135,12 +137,11 @@ @ExcelColumn(name="宿¶è´¹ç¨") private Long receiveAccount; @ApiModelProperty(value = "è´¹ç¨è¯´æ") @ExcelColumn(name="è´¹ç¨è¯´æ") private String priceRemark; // @ApiModelProperty(value = "è´¹ç¨è¯´æ(å¼ç¨)") // private String priceRemark; @ApiModelProperty(value = "ç¨è½¦ç±»å(è¿è´§ä½¿ç¨):0=天ï¼1=次", example = "1") @ExcelColumn(name="ç¨è½¦ç±»å(è¿è´§ä½¿ç¨):0=天ï¼1=次") @ApiModelProperty(value = "ç¨è½¦ç±»å(ç¨å·¥å è£ /è¿è´§ä½¿ç¨):0=天;1=次/å°æ¶;2=éé", example = "1") @ExcelColumn(name="ç¨è½¦ç±»å(ç¨å·¥å è£ /è¿è´§ä½¿ç¨):0=天;1=次/å°æ¶;2=éé") private Integer carType; @ApiModelProperty(value = "è¿è¾åç§(è¿è´§ä½¿ç¨) å ³ècategory表", example = "1") @@ -175,9 +176,13 @@ @ExcelColumn(name="订åç¼å·") private String code; @ApiModelProperty(value = "订åç¶æ:0=å¾ æ¥åï¼1=å·²æ¥åï¼2=è¿è¡ä¸ï¼3=已宿ï¼99=已忶ï¼", example = "1") @ExcelColumn(name="订åç¶æ:0=å¾ æ¥åï¼1=å·²æ¥åï¼2=è¿è¡ä¸ï¼3=已宿ï¼99=已忶ï¼") @ApiModelProperty(value = "订åç¶æ:0=å¾ æ¯ä» 1=å¾ æ¥åï¼2=å·²æ¥åï¼3=è¿è¡ä¸ï¼4=已宿ï¼99=已忶ï¼", example = "1") @ExcelColumn(name="订åç¶æ:0=å¾ æ¯ä» 1=å¾ æ¥åï¼2=å·²æ¥åï¼3=è¿è¡ä¸ï¼4=已宿ï¼99=已忶ï¼") private Integer status; @ApiModelProperty(value = "æ¯ä»ç¶æ:0=å¾ æ¯ä» 1=å·²æ¯ä»", example = "1") @ExcelColumn(name="æ¯ä»ç¶æ:0=å¾ æ¯ä» 1=å·²æ¯ä»ï¼") private Integer payStatus; @ApiModelProperty(value = "æ¥åæ¶é´") @ExcelColumn(name="æ¥åæ¶é´") @@ -236,16 +241,40 @@ @JsonFormat(pattern = "yyyy-MM-dd") private Date cancelTime; @ApiModelProperty(value = "æ¯å¦å·²ä¿®æ¹:0=å¦ï¼1=æ¯ï¼", example = "1") @ExcelColumn(name="æ¯å¦å·²ä¿®æ¹:0=å¦ï¼1=æ¯ï¼") @ApiModelProperty(value = "æ¯å¦å·²ä¿®æ¹:0=å¦ï¼1=æ¯ï¼2=已确认;", example = "1") @ExcelColumn(name="æ¯å¦å·²ä¿®æ¹:0=å¦ï¼1=æ¯ï¼2=已确认ï¼") private Integer isUpdate; @ApiModelProperty(value = "æ¥åæ¹é»ååmember:id å¤ä¸ªä»¥,åå²") @ExcelColumn(name="æ¥åæ¹é»ååmember:id å¤ä¸ªä»¥,åå²") private String blackReceive; @ApiModelProperty @ApiModelProperty(value = "æ»å¤©æ°", example = "1") @ExcelColumn(name="æ»å¤©æ°") private Integer totalDays; @ApiModelProperty(value = "åæ¶ç±»åï¼0=ååæ¹æ è´£åæ¶ï¼1=ååæ¹æè´£åæ¶ï¼2=ç³»ç»åæ¶ï¼", example = "1") @ExcelColumn(name="åæ¶ç±»åï¼0=ååæ¹æ è´£åæ¶ï¼1=ååæ¹æè´£åæ¶ï¼2=ç³»ç»åæ¶ï¼") private Integer cancelType; @ApiModelProperty(value = "å¾ç") @TableField(exist = false) private List<Multifile> multifileList; @ApiModelProperty(value = "éç»ç¹") @TableField(exist = false) private List<WayInfoDTO> wayInfoDTOList; @ApiModelProperty(value = "餿 ") @TableField(exist = false) private List<CateringDTO> cateringDTOList; @ApiModelProperty(value = "ç§»å¨ç«¯ç¨æ·",hidden = true) @TableField(exist = false) private Member member; } server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java
@@ -75,4 +75,12 @@ @ExcelColumn(name="宿夿³¨") private String doneInfo; @ApiModelProperty(value = "ä¸å¡ç±»åï¼0=æç°ï¼1=鿬¾ï¼", example = "1") @ExcelColumn(name="ä¸å¡ç±»åï¼0=æç°ï¼1=鿬¾ï¼") private Integer type; @ApiModelProperty(value = "å ³è订åä¸»é® orders", example = "1") @ExcelColumn(name="å ³è订åä¸»é® orders") private Integer objId; } server/services/src/main/java/com/doumee/dao/dto/CateringDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.doumee.dao.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; import java.math.BigDecimal; /** * Created by IntelliJ IDEA. * * @Author : Rk * @create 2023/3/23 9:50 */ @Data @ApiModel("é¤é¥®æ åä¿¡æ¯") public class CateringDTO { @ApiModelProperty(value = "ç±»åï¼æ©é¤ãä¸é¤ãæé¤") private String name; @ApiModelProperty(value = "ä»·æ ¼ åä½:å") private Long price; @ApiModelProperty(value = "份æ°") private Integer num; } server/services/src/main/java/com/doumee/dao/dto/CommentDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ 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 CommentDTO { @ApiModelProperty(value = "订å主é®") private Integer orderId; @ApiModelProperty(value = "è¯ä»·æçº§ 1 - 5 ") private Long level; @ApiModelProperty(value = "è¯ä»·å 容") private String info; @ApiModelProperty(hidden = true) private Member member; } server/services/src/main/java/com/doumee/dao/dto/ConfirmUpdOrderDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ 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; import java.util.Date; /** * @author dm * @since 2025/03/31 16:44 */ @Data @ApiModel("确认订åä¿®æ¹ä¿¡æ¯") public class ConfirmUpdOrderDTO { @ApiModelProperty(value = "订å主é®") private Integer orderId; @ApiModelProperty(value = "æä½ç±»åï¼0=åæï¼1=ä¸åæï¼") private Integer status; @ApiModelProperty(hidden = true) private Member member; } server/services/src/main/java/com/doumee/dao/dto/DoneOrderDTO.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 DoneOrderDTO { @ApiModelProperty(value = "订å主é®") private Integer orderId; @ApiModelProperty(value = "æ¯ä»éé¢ åä½ï¼å") private Long amount; @ApiModelProperty(hidden = true) private Member member; } server/services/src/main/java/com/doumee/dao/dto/UpdOrderDataDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ 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; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; /** * @author dm * @since 2025/03/31 16:44 */ @Data @ApiModel("ä¿®æ¹è®¢åæ¥æ") public class UpdOrderDataDTO { @ApiModelProperty(value = "订å主é®") private Integer orderId; @ApiModelProperty(value = "å¼å§æ¶é´") private Date startDate; @ApiModelProperty(value = "ç»ææ¶é´") private Date endDate; @ApiModelProperty(value = "天æ°") private Integer totalDays; @ApiModelProperty(hidden = true) private Member member; } server/services/src/main/java/com/doumee/dao/dto/WayInfoDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,38 @@ package com.doumee.dao.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * Created by IntelliJ IDEA. * * @Author : Rk * @create 2023/3/23 9:50 */ @Data @ApiModel("éç»ç¹ä¿¡æ¯") public class WayInfoDTO { @ApiModelProperty(value = "å°ç¹åç§°") private String location; @ApiModelProperty(value = "ç»åº¦") private BigDecimal lat; @ApiModelProperty(value = "纬度") private BigDecimal lgt; @ApiModelProperty(value = "ç") private String province; @ApiModelProperty(value = "å¸") private String city; @ApiModelProperty(value = "åºå¿") private String area; } server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -1,8 +1,15 @@ package com.doumee.service.business; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; 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 java.util.List; /** @@ -18,7 +25,7 @@ * @param orders å®ä½å¯¹è±¡ * @return Integer */ Integer create(Orders orders); Object create(Orders orders); /** * 主é®å é¤ @@ -94,4 +101,29 @@ * @return long */ long count(Orders orders); void accept(Integer orderId, Member member); void begin(Integer orderId,Member member); void updOrderData(UpdOrderDataDTO updOrderDataDTO); void confirmUpd(ConfirmUpdOrderDTO confirmUpdOrderDTO); void releaseCancelOrder(Integer orderId,Member member); void receiveCancelOrder(Integer orderId,Member member); Object doneOrder(DoneOrderDTO doneOrderDTO); void comment(CommentDTO commentDTO); /** * æ¯ä»åè°ä¸å¡ * @param preOrderId * @return */ String payNotify(String preOrderId,String paymentNo); void platformCancel(Integer orderId, LoginUserInfo loginUserInfo); } server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -1,26 +1,44 @@ package com.doumee.service.business.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.config.wx.WxMiniConfig; import com.doumee.config.wx.WxMiniUtilService; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.*; import com.doumee.dao.business.model.*; import com.doumee.dao.dto.*; import com.doumee.service.business.OrdersService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wechat.pay.java.service.partnerpayments.jsapi.model.Amount; import com.wechat.pay.java.service.partnerpayments.jsapi.model.Payer; import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayRequest; import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayWithRequestPaymentResponse; import jodd.util.StringUtil; import org.apache.poi.sl.image.ImageHeaderEMF; import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.UUID; /** * 订åä¿¡æ¯è®°å½Serviceå®ç° @@ -33,13 +51,139 @@ @Autowired private OrdersMapper ordersMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private CategoryMapper categoryMapper; @Autowired private MultifileMapper multifileMapper; @Autowired private OrderLogMapper orderLogMapper; @Autowired private MemberMapper memberMapper; @Autowired private MemberRevenueMapper memberRevenueMapper; @Autowired private WxMiniUtilService wxMiniUtilService; @Override public Integer create(Orders orders) { @Transactional(rollbackFor = {Exception.class,BusinessException.class}) public Object create(Orders orders) { Object objects = null; this.initVerification(orders); orders.setCreateTime(new Date()); orders.setPayStatus(Constants.ZERO); //TODO 订åç¼å·è§å Category category = categoryMapper.selectOne(new QueryWrapper<Category>().lambda() .eq(Category::getDeleted,Constants.ZERO).eq(Category::getType,Constants.THREE) .eq(Category::getName,orders.getType()) .last("limit 1") ); if(Objects.isNull(category)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"åæ°é ç½®é误,请è系管çå"); } //ç¨é¤è®¢å if(Constants.equalsInteger(orders.getType(),Constants.TWO)){ orders.setStatus(Constants.ZERO); //å¤èµ·æ¯ä»ä¸å¡ objects = this.getWxPayResponse(orders,orders.getMember().getOpenid()); }else{ orders.setStatus(Constants.ONE); } ordersMapper.insert(orders); return orders.getId(); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orders.getMultifileList())){ List<Multifile> multifileList = orders.getMultifileList(); for (Multifile multifile:multifileList) { if(Objects.isNull(multifile) || Objects.isNull(multifile.getObjType()) || StringUtils.isEmpty(multifile.getFileurl()) || StringUtils.isEmpty(multifile.getName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"éä»¶ä¿¡æ¯é误"); } multifile.setIsdeleted(Constants.ZERO); multifile.setCreateDate(new Date()); multifile.setObjId(orders.getId()); multifile.setObjType(Constants.ONE); } multifileMapper.insert(multifileList); } //æ´æ°ç¨æ·ååé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum," (receive_num + 1 )").eq(Member::getId,orders.getMember().getId())); //å建æä½æ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.UPLOAD; String orderTypeInfo = "ç¨å·¥å"; if(!Constants.equalsInteger(orders.getType(),Constants.ZERO)){ orderTypeInfo = Constants.equalsInteger(orders.getType(),Constants.ONE)?"ç¨è½¦å":"éé¤å"; }else{ if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){ orderTypeInfo = orderTypeInfo + "-éæå·¥"; }else{ orderTypeInfo = orderTypeInfo + (Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"-忣工":"-å è£ å·¥"); } } String logInfo = ordersLog.getInfo() .replace("{param}",orderTypeInfo); this.saveOrderLog(orders,ordersLog, logInfo,orders.getReleaseMemberId(),null); return objects; } private Object getWxPayResponse(Orders orders,String openid){ Object response = null; //è°èµ·æ¯ä» PrepayRequest request = new PrepayRequest(); request.setAttach("createOrder"); request.setDescription("è¿å¿«è®¢åæ¯ä»"); request.setSpMchid(WxMiniConfig.wxProperties.getMchId()); request.setSpAppid(WxMiniConfig.wxProperties.getAppId()); request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId()); request.setSubAppid(WxMiniConfig.wxProperties.getSubAppId()); Payer payer = new Payer(); payer.setSubOpenid(openid); request.setPayer(payer); request.setOutTradeNo(orders.getCode()); request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//è¿ä¸ªåè°urlå¿ é¡»æ¯httpså¼å¤´ç Amount amount = new Amount(); amount.setTotal(orders.getEstimatedAccount().intValue()); request.setAmount(amount); // PrepayResponse res = WxMiniConfig.wxPayService.prepay(request); // è·ä¹åä¸å示ä¾ä¸æ ·ï¼å¡«å é¢ä¸ååæ° PrepayWithRequestPaymentResponse resParam = WxMiniConfig.jsapiExtService.prepayWithRequestPayment(request,WxMiniConfig.wxProperties.getSubAppId()); response =resParam; return response; } /** * æ¥å¿ä¿¡æ¯ * @param orders 订åä¿¡æ¯ * @param ordersLog è®¢åæ¯æåç±» * @param logInfo æ¥å¿å 容 * @param memberId ç§»å¨ç«¯æä½äºº * @param userId ç³»ç»æä½äºº */ public void saveOrderLog(Orders orders,Constants.OrdersLog ordersLog,String logInfo,Integer memberId,Integer userId){ OrderLog orderLog = new OrderLog(); orderLog.setCreateTime(orders.getUpdateTime()); orderLog.setDeleted(Constants.ZERO); orderLog.setOrderId(orders.getId()); orderLog.setTitle(ordersLog.getName()); orderLog.setLogInfo(logInfo); orderLog.setObjType(ordersLog.getKey()); orderLog.setOrderStatus(orders.getStatus()); orderLog.setMemberId(memberId); orderLog.setCreateUser(userId); orderLog.setOptUserType(ordersLog.getUserType()); orderLogMapper.insert(orderLog); } @@ -53,22 +197,78 @@ || Objects.isNull(orders.getLat()) || Objects.isNull(orders.getLgt()) || Objects.isNull(orders.getCategoryId()) || Objects.isNull(orders.getTotalDays()) || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Objects.isNull(orders.getWorkType())) || Objects.isNull(orders.getPriceNum1()) || (!( Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.TWO) ) && Objects.isNull(orders.getPrice()) ) || ( Constants.equalsInteger(orders.getType(),Constants.ONE) && Objects.isNull(orders.getTransportTypeId()) ) || Objects.isNull(orders.getEstimatedAccount()) || Objects.isNull(orders.getPrice()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(Constants.equalsInteger(orders.getType(),Constants.ONE)){ if((Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.ZERO )) || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.TWO) &&Constants.equalsInteger(orders.getCarType(),Constants.TWO)) || Constants.equalsInteger(orders.getType(),Constants.ONE) ){ orders.setPriceNum2(Constants.ONE); } if(Objects.isNull(orders.getPriceNum2())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){ if(Constants.equalsInteger(orders.getWorkType(),Constants.TWO) && Objects.isNull(orders.getCarType())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){ if(Objects.isNull(orders.getTransportTypeId()) || Objects.isNull(orders.getCarType()) || Objects.isNull(orders.getTransportNum()) || StringUtils.isEmpty(orders.getTransportUnit()) || StringUtils.isEmpty(orders.getLocationEnd()) || Objects.isNull(orders.getLatEnd()) || Objects.isNull(orders.getLgtEnd()) || CollectionUtils.isEmpty(orders.getWayInfoDTOList()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } for (WayInfoDTO wayInfoDTO:orders.getWayInfoDTOList()) { if(Objects.isNull(wayInfoDTO) ||StringUtils.isEmpty(wayInfoDTO.getLocation()) ||StringUtils.isEmpty(wayInfoDTO.getProvince()) ||StringUtils.isEmpty(wayInfoDTO.getCity()) ||StringUtils.isEmpty(wayInfoDTO.getArea()) ||Objects.isNull(wayInfoDTO.getLat()) ||Objects.isNull(wayInfoDTO.getLgt()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } } orders.setWayInfo(JSONObject.toJSONString(orders.getWayInfoDTOList())); }else{ //ç¨é¤è®¢å if(CollectionUtils.isEmpty(orders.getCateringDTOList())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Long sumPrice = 0L; for (CateringDTO cateringDTO:orders.getCateringDTOList()) { if(Objects.isNull(cateringDTO) || StringUtils.isEmpty(cateringDTO.getName()) || Objects.isNull(cateringDTO.getPrice()) || Objects.isNull(cateringDTO.getNum()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"ç¨é¤æ åæ°æ®é误"); } sumPrice = sumPrice + (cateringDTO.getPrice() * cateringDTO.getNum()) ; } if(!sumPrice.equals(orders.getPrice())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"å价计ç®é误"); } orders.setWayInfo(JSONObject.toJSONString(orders.getCateringDTOList())); } if(!orders.getEstimatedAccount().equals(this.getTotal(orders))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"éé¢è®¡ç®é误!"); } } @@ -94,7 +294,47 @@ } @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void updateById(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.getType(),Constants.TWO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"æ¤ç±»è®¢åæ æ³è¿è¡ä¿®æ¹"); } if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡è¯¥æä½"); } this.initVerification(orders); orders.setUpdateTime(new Date()); Category category = categoryMapper.selectOne(new QueryWrapper<Category>().lambda() .eq(Category::getDeleted,Constants.ZERO).eq(Category::getType,Constants.THREE) .eq(Category::getName,orders.getType()) .last("limit 1") ); if(Objects.isNull(category)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"åæ°é ç½®é误,请è系管çå"); } multifileMapper.update(new UpdateWrapper<Multifile>().lambda().set(Multifile::getIsdeleted,Constants.ONE).eq(Multifile::getObjType,Constants.ONE) .eq(Multifile::getObjId,orders.getId())); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orders.getMultifileList())){ List<Multifile> multifileList = orders.getMultifileList(); for (Multifile multifile:multifileList) { if(Objects.isNull(multifile) || Objects.isNull(multifile.getObjType()) || StringUtils.isEmpty(multifile.getFileurl()) || StringUtils.isEmpty(multifile.getName())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"éä»¶ä¿¡æ¯é误"); } multifile.setIsdeleted(Constants.ZERO); multifile.setCreateDate(new Date()); multifile.setObjId(orders.getId()); multifile.setObjType(Constants.ONE); } multifileMapper.insert(multifileList); } ordersMapper.updateById(orders); } @@ -212,9 +452,6 @@ if (pageWrap.getModel().getPayAccount() != null) { queryWrapper.lambda().eq(Orders::getPayAccount, pageWrap.getModel().getPayAccount()); } if (pageWrap.getModel().getPriceRemark() != null) { queryWrapper.lambda().eq(Orders::getPriceRemark, pageWrap.getModel().getPriceRemark()); } if (pageWrap.getModel().getCarType() != null) { queryWrapper.lambda().eq(Orders::getCarType, pageWrap.getModel().getCarType()); } @@ -307,4 +544,593 @@ QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders); return ordersMapper.selectCount(wrapper); } /** * æå¨æ¥å * @param orderId */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void accept(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.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡è¯¥æä½"); } if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"æ¨èªå·±çè®¢åæ æ³è¿è¡è¯¥æä½"); } //æ¥è¯¢ç¨æ·æ¯å¦æå¯¹åºèº«ä»½ if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){ if(!Constants.equalsInteger(member.getWorkerIdentity(),Constants.TWO)){ 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(),"身份信æ¯å¼å¸¸ï¼è¯·è系管çå"); } }else{ if(!Constants.equalsInteger(member.getChefIdentity(),Constants.TWO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"身份信æ¯å¼å¸¸ï¼è¯·è系管çå"); } } orders.setUpdateTime(new Date()); orders.setAcceptType(Constants.ZERO); orders.setAcceptTime(new Date()); orders.setAcceptMemberId(member.getId()); orders.setStatus(Constants.TWO); ordersMapper.updateById(orders); //æ´æ°æ¥åé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getPublishNum," (publish_num + 1 )").eq(Member::getId,member.getId())); //å建æä½æ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.RECEIVE; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),member.getId(),null); //TODO å¾®ä¿¡å ¬ä¼å·æé å·²æ¥åæé } /** * å¼å§ä½ä¸ * @param orderId * @param member */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void begin(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.getStatus(),Constants.TWO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡è¯¥æä½"); } if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿍çè®¢åæ æ³è¿è¡è¯¥æä½"); } if(Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åä¿®æ¹å¾ ç¡®è®¤ï¼æ æ³è¿è¡è¯¥æä½"); } orders.setUpdateTime(new Date()); orders.setStatus(Constants.THREE); orders.setWorkStartTime(new Date()); ordersMapper.updateById(orders); //å建æä½æ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.BEGIN; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),member.getId(),null); } /** * ååæ¹ä¿®æ¹è®¢å - å·²æ¥åç¶æ * @param updOrderDataDTO */ @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()) || Objects.isNull(updOrderDataDTO.getTotalDays())){ 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.TWO)){ 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()); //ç¨è½¦ç±»å if(Constants.equalsInteger(orders.getType(),Constants.ONE)){ if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)) { orders.setPriceNum1(updOrderDataDTO.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{ orders.setPriceNum1(updOrderDataDTO.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::getIsUpdate,Constants.ONE) .set(Orders::getUpdateTime,"now()") .set(Orders::getEstimatedAccount,total) .eq(Orders::getId,orders.getId()) ); //å建æä½æ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_ORDER; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),updOrderDataDTO.getMember().getId(),null); //TODO éç¥æ¥å人 订ååçåæ´ } public Long getTotal(Orders orders){ if( (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.ZERO )) || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.TWO) &&Constants.equalsInteger(orders.getCarType(),Constants.TWO)) || Constants.equalsInteger(orders.getType(),Constants.ONE) ){ orders.setPriceNum2(Constants.ONE); } return orders.getPrice() * orders.getPriceNum1() * orders.getPriceNum2(); } /** * æ¥åæ¹å¤ç订åä¿®æ¹ * @param confirmUpdOrderDTO */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void confirmUpd(ConfirmUpdOrderDTO confirmUpdOrderDTO){ if(Objects.isNull(confirmUpdOrderDTO) || Objects.isNull(confirmUpdOrderDTO.getOrderId()) || Objects.isNull(confirmUpdOrderDTO.getStatus()) || !(Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)|| Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ZERO)) ){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } Orders orders = ordersMapper.selectById(confirmUpdOrderDTO.getOrderId()); if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(!Constants.equalsInteger(orders.getStatus(),Constants.TWO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡è¯¥æä½"); } if(!Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åä¿®æ¹ç¶æå·²æµè½¬ï¼æ æ³è¿è¡è¯¥æä½"); } if(Constants.equalsInteger(orders.getAcceptMemberId(),confirmUpdOrderDTO.getMember().getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿍çè®¢åæ æ³è¿è¡è¯¥æä½"); } if( Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)){ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getIsUpdate,Constants.TWO) .set(Orders::getUpdateTime,"now()") .eq(Orders::getId,orders.getId()) ); //è®°å½åæä¿®æ¹çæ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_AGREE; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null); }else{ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getIsUpdate,Constants.TWO) .set(Orders::getUpdateTime,"now()") .set(Orders::getStatus,Constants.ONE) .set(Orders::getAcceptMemberId,null) .set(Orders::getAcceptType,null) .eq(Orders::getId,orders.getId()) ); memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,confirmUpdOrderDTO.getMember().getId())); //è®°å½ä¸åæä¿®æ¹çæ¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_DISAGREE; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null); //TODO åéä¸åæåæ´éç¥ } } /** * ååæ¹åæ¶è®¢å * @param orderId * @param member */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void releaseCancelOrder(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.getStatus(),Constants.ONE) ||Constants.equalsInteger(orders.getStatus(),Constants.ZERO) || Constants.equalsInteger(orders.getStatus(),Constants.TWO))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡åæ¶"); } if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿍çè®¢åæ æ³è¿è¡è¯¥æä½"); } //å¾ æ¯ä»ç¨é¤è®¢å/å¾ æ¥å订åè¿è¡åæ¶ if(Constants.equalsInteger(orders.getStatus(),Constants.ONE) ||Constants.equalsInteger(orders.getStatus(),Constants.ZERO)){ if(Constants.equalsInteger(orders.getType(),Constants.TWO)&&Constants.equalsInteger(orders.getStatus(),Constants.ONE)){ //鿬¾ä¸å¡ WithdrawalOrders withdrawalOrders = new WithdrawalOrders(); withdrawalOrders.setCreateTime(new Date()); withdrawalOrders.setMemberId(orders.getReleaseMemberId()); withdrawalOrders.setAmount(orders.getPayAccount()); withdrawalOrders.setWxExternalNo("refund_"+orders.getCode()); withdrawalOrders.setStatus(Constants.ONE); withdrawalOrders.setDoneTime(new Date()); withdrawalOrders.setType(Constants.ONE); withdrawalOrders.setObjId(orders.getId()); wxMiniUtilService.wxRefund(withdrawalOrders,orders); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getStatus,99) .set(Orders::getUpdateTime,"now()") .set(Orders::getCancelTime,"now()") .set(Orders::getCancelType,Constants.ZERO) .eq(Orders::getId,orders.getId()) ); }else{ //夿æ¯å¦å¯ä¿®æ¹ å·²åæ¶æ¬¡æ° ä¸ æ¶é´éå¶ 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,99) .eq(Orders::getReleaseMemberId,orders.getReleaseMemberId())); //æ¥è¯¢åæ¶æ¬¡æ° 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+"å°æ¶,æ æ³åæ¶è®¢åï¼å¦éå¤ç请è系客æ"); } if(Constants.equalsInteger(orders.getType(),Constants.TWO)){ //鿬¾ä¸å¡ WithdrawalOrders withdrawalOrders = new WithdrawalOrders(); withdrawalOrders.setCreateTime(new Date()); withdrawalOrders.setMemberId(orders.getReleaseMemberId()); withdrawalOrders.setAmount(orders.getPayAccount()); withdrawalOrders.setWxExternalNo("refund_"+orders.getCode()); withdrawalOrders.setStatus(Constants.ONE); withdrawalOrders.setDoneTime(new Date()); withdrawalOrders.setType(Constants.ONE); withdrawalOrders.setObjId(orders.getId()); wxMiniUtilService.wxRefund(withdrawalOrders,orders); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getStatus,99) .set(Orders::getUpdateTime,"now()") .set(Orders::getCancelTime,"now()") .set(Orders::getCancelType,Constants.ONE) .eq(Orders::getId,orders.getId()) ); //TODO ååæ¹åæ¶è®¢åéç¥æ¥åæ¹ //åå°æ¥åé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"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())); //æ¥å¿åå¨ 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); } if(!Constants.equalsInteger(orders.getStatus(),Constants.TWO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡åæ¶"); } if(Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿍çè®¢åæ æ³è¿è¡è¯¥æä½"); } //夿æ¯å¦å¯ä¿®æ¹ å·²åæ¶æ¬¡æ° ä¸ æ¶é´éå¶ 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){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"仿¥è®¢å主å¨åæ¶æ¬¡æ°å·²è¶ åº"+totalCancelTimes+"次,æ æ³åæ¶è®¢å,å¦éå¤ç请è系客æ"); } Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIME).getCode()); Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate()); if(hours < cancelTimeHour){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"è·ç¦»è®¢åå¼å§æ¶é´ä¸è¶³"+cancelTimeHour+"å°æ¶,æ æ³åæ¶è®¢åï¼å¦éå¤ç请è系客æ"); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getUpdateTime,"now()") .set(Orders::getStatus,Constants.ONE) .set(Orders::getAcceptMemberId,null) .set(Orders::getAcceptType,null) .eq(Orders::getId,orders.getId()) ); //åå°æ¥åé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,orders.getAcceptMemberId())); //æ¥å¿åå¨ Constants.OrdersLog ordersLog = Constants.OrdersLog.CANCEL; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),member.getId(),null); //TODO æ¥åæ¹åæ¶è®¢åéç¥ } /** * å®æè®¢å * @param doneOrderDTO */ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public Object doneOrder(DoneOrderDTO doneOrderDTO){ if(Objects.isNull(doneOrderDTO)||Objects.isNull(doneOrderDTO.getOrderId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Orders orders = ordersMapper.selectById(doneOrderDTO.getOrderId()); if(!Constants.equalsInteger(orders.getType(),Constants.TWO)&&Objects.isNull(doneOrderDTO.getAmount())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(!Constants.equalsInteger(orders.getStatus(),Constants.THREE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡åæ¶"); } if(Constants.equalsInteger(orders.getReleaseMemberId(),doneOrderDTO.getMember().getId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿍çè®¢åæ æ³è¿è¡è¯¥æä½"); } Object object = null; //ç¨é¤è®¢å if(!Constants.equalsInteger(orders.getType(),Constants.TWO)){ orders.setPayAccount(doneOrderDTO.getAmount()); //ææéé¢ Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue()); orders.setReceiveAccount(orders.getPayAccount() - tcje); ordersMapper.updateById(orders); //å¤èµ·æ¯ä»ä¸å¡ object = this.getWxPayResponse(orders,orders.getMember().getOpenid()); }else{ orders.setStatus(Constants.FOUR); //æ¥å¿åå¨ Constants.OrdersLog ordersLog = Constants.OrdersLog.DONE; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),doneOrderDTO.getMember().getId(),null); } return object; } @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public void platformCancel(Integer orderId, LoginUserInfo loginUserInfo){ 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.getStatus(),Constants.ONE)||Constants.equalsInteger(orders.getStatus(),Constants.TWO) ||Constants.equalsInteger(orders.getStatus(),Constants.THREE))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡åæ¶"); } //妿已æ¯ä» åéè¦è¿è¡é款 if(Constants.equalsInteger(orders.getPayStatus(),Constants.ONE)){ WithdrawalOrders withdrawalOrders = new WithdrawalOrders(); withdrawalOrders.setCreateTime(new Date()); withdrawalOrders.setMemberId(orders.getReleaseMemberId()); withdrawalOrders.setAmount(orders.getPayAccount()); withdrawalOrders.setWxExternalNo("refund_"+orders.getCode()); withdrawalOrders.setStatus(Constants.ONE); withdrawalOrders.setDoneTime(new Date()); withdrawalOrders.setType(Constants.ONE); withdrawalOrders.setObjId(orders.getId()); wxMiniUtilService.wxRefund(withdrawalOrders,orders); } //åå°ååé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getPublishNum,"publish_num - 1").eq(Member::getId,orders.getReleaseMemberId())); if(Constants.equalsInteger(orders.getStatus(),Constants.TWO)||Constants.equalsInteger(orders.getStatus(),Constants.THREE)){ //åå°æ¥åé memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,orders.getAcceptMemberId())); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getStatus,99) .set(Orders::getUpdateTime,"now()") .set(Orders::getCancelTime,"now()") .set(Orders::getCancelType,Constants.TWO) .eq(Orders::getId,orders.getId()) ); //æ¥å¿åå¨ Constants.OrdersLog ordersLog = Constants.OrdersLog.SYSTEM_CANCEL; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),null,loginUserInfo.getId()); } @Override public void comment(CommentDTO commentDTO){ if(Objects.isNull(commentDTO) || Objects.isNull(commentDTO.getOrderId()) || Objects.isNull(commentDTO.getLevel()) || commentDTO.getLevel()<1 || commentDTO.getLevel() > 5 ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Orders orders = ordersMapper.selectById(commentDTO.getOrderId()); if(Objects.isNull(orders) ||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if(!Constants.equalsInteger(orders.getStatus(),Constants.FOUR)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åç¶æå·²æµè½¬,æ æ³è¿è¡è¯ä»·"); } if(Constants.equalsInteger(orders.getCommentStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订åå·²è¯ä»·ï¼"); } ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getCommentStatus,Constants.ONE) .set(Orders::getUpdateTime,"now()") .set(Orders::getCommentTime,"now()") .set(Orders::getCommentLevel,commentDTO.getLevel()) .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); } /** * æ¯ä»åè° * @param preOrderId * @param paymentNo * @return */ @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")); if(Constants.equalsInteger(orders.getType(),Constants.TWO)){ //ç¨é¤è®¢å å¦æå·²ç»æµè½¬å°å·²æ¯ä» åç´æ¥è¿å if(!Constants.equalsInteger(orders.getStatus(),Constants.ZERO)){ return ("å¤çæå!"); }else{ //å¤çæ¯ä»å®æé»è¾ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getUpdateTime,"now()") .set(Orders::getStatus,Constants.ONE) .set(Orders::getPayStatus,Constants.ONE) .set(Orders::getWxExternalNo,paymentNo) .eq(Orders::getId,orders.getId()) ); //å卿¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.PAY; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),orders.getReleaseMemberId(),null); } }else{ //éç¨é¤ç±»è®¢å if(!Constants.equalsInteger(orders.getStatus(),Constants.THREE)){ return ("å¤çæå!"); }else{ //å¤çæ¯ä»å®æé»è¾ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getUpdateTime,"now()") .set(Orders::getStatus,Constants.FOUR) .set(Orders::getPayStatus,Constants.ONE) .set(Orders::getWxExternalNo,paymentNo) .set(Orders::getFinishTime,"now()") .eq(Orders::getId,orders.getId()) ); 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()); memberRevenue.setObjId(orders.getId()); memberRevenue.setObjType(Constants.ZERO); memberRevenue.setStatus(Constants.ZERO); memberRevenueMapper.insert(memberRevenue); //æ´æ°æ¥åç¨æ·çä½é¢ä¸å岿»éé¢ memberMapper.update(new UpdateWrapper<Member>().lambda() .set(Member::getAmount,"amount + " + orders.getReceiveAccount() ) .set(Member::getTotalAmount,"amount + " + orders.getReceiveAccount() ) .eq(Member::getId,member.getId()) ); //å卿¥å¿ Constants.OrdersLog ordersLog = Constants.OrdersLog.PAY; this.saveOrderLog(orders,ordersLog, ordersLog.getInfo(),orders.getReleaseMemberId(),null); //TODO éç¥æ¥åæ¹ æ¬¾é¡¹å·²å°è´¦ } } return ("å¤çæå!"); } } server/services/src/main/resources/application-dev.yml
@@ -80,6 +80,37 @@ privateKey: # RSAç§é¥ time: 600000 ########################微信æ¯ä»ç¸å ³é ç½®######################## 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 #æå¡å-------------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-pro.yml
@@ -49,6 +49,36 @@ enable: true username: admin password: ########################微信æ¯ä»ç¸å ³é ç½®######################## 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 #æå¡å-------------end--- existsSub: 1 appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24 #ååæ·------------start---- subAppId: wxcd2b89fd2ff065f8 #wxcd2b89fd2ff065f8 subAppSecret: 3462fa186da7cb06c544df8d8664b63a #3336812504c830b1c3c5243f9ece407a subMchId: 1661772003 subMchKey: EVM8E15TKXE0OEMJFC0V6UFVIOZ5CSQS #ååæ·------------end---- # mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM typeId: gybike upload: type: blob server/services/src/main/resources/application-test.yml
@@ -69,6 +69,36 @@ username: admin 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 #æå¡å-------------end--- existsSub: 1 appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24 #ååæ·------------start---- subAppId: wxcd2b89fd2ff065f8 #wxcd2b89fd2ff065f8 subAppSecret: 3462fa186da7cb06c544df8d8664b63a #3336812504c830b1c3c5243f9ece407a subMchId: 1661772003 subMchKey: EVM8E15TKXE0OEMJFC0V6UFVIOZ5CSQS #ååæ·------------end---- # mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM typeId: gybike upload: type: blob server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -1,10 +1,15 @@ package com.doumee.api.web; import com.azure.core.annotation.Post; import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; 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.ConfirmUpdOrderDTO; import com.doumee.dao.dto.DoneOrderDTO; import com.doumee.dao.dto.UpdOrderDataDTO; import com.doumee.service.business.IdentityInfoService; import com.doumee.service.business.MemberService; import com.doumee.service.business.OrdersService; @@ -37,13 +42,107 @@ private OrdersService ordersService; @LoginRequired @ApiOperation(value = "ç¼è¾ä¸ªäººä¿¡æ¯", notes = "å°ç¨åºç«¯") @GetMapping("/getMemberInfo") @ApiOperation(value = "åå¸è®¢å - ååæ¹", notes = "å°ç¨åºç«¯") @PostMapping("/release") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<Member> getMemberInfo() { return ApiResponse.success("æ¥è¯¢æå",memberService.getMemberInfo(getMemberId())); public ApiResponse<Object> release(@RequestBody Orders orders) { orders.setMember(this.getMemberResponse()); return ApiResponse.success("æä½æå",ordersService.create(orders)); } @LoginRequired @ApiOperation(value = "ä¿®æ¹è®¢å - ååæ¹", notes = "å°ç¨åºç«¯") @PostMapping("/updateOrder") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse updateOrder(@RequestBody Orders orders) { orders.setMember(this.getMemberResponse()); ordersService.updateById(orders); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "æå¨æ¥å - æ¥åæ¹", notes = "å°ç¨åºç«¯") @GetMapping("/accept") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse accept(@RequestParam Integer orderId) { ordersService.accept(orderId,this.getMemberResponse()); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "å¼å§ä½ä¸ - ååæ¹", notes = "å°ç¨åºç«¯") @GetMapping("/begin") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse begin(@RequestParam Integer orderId) { ordersService.begin(orderId,this.getMemberResponse()); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "åæ¶è®¢å - ååæ¹", notes = "å°ç¨åºç«¯") @GetMapping("/releaseCancelOrder") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse releaseCancelOrder(@RequestParam Integer orderId) { ordersService.releaseCancelOrder(orderId,this.getMemberResponse()); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "åæ¶æ¥å - æ¥åæ¹", notes = "å°ç¨åºç«¯") @GetMapping("/receiveCancelOrder") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse receiveCancelOrder(@RequestParam Integer orderId) { ordersService.receiveCancelOrder(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 = "å°ç¨åºç«¯") @PostMapping("/confirmUpd") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse confirmUpd(@RequestBody ConfirmUpdOrderDTO confirmUpdOrderDTO) { confirmUpdOrderDTO.setMember(this.getMemberResponse()); ordersService.confirmUpd(confirmUpdOrderDTO); return ApiResponse.success("æä½æå"); } @LoginRequired @ApiOperation(value = "å®æè®¢å - ååæ¹", notes = "å°ç¨åºç«¯") @GetMapping("/doneOrder") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<Object> doneOrder(@RequestBody DoneOrderDTO doneOrderDTO) { doneOrderDTO.setMember(getMemberResponse()); return ApiResponse.success("æä½æå",ordersService.doneOrder(doneOrderDTO)); } server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,159 @@ package com.doumee.api.web; import com.doumee.config.wx.WxMiniConfig; import com.doumee.core.model.ApiResponse; import com.doumee.service.business.OrdersService; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.notification.NotificationConfig; import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.RequestParam; import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction; import com.wechat.pay.java.service.refund.model.RefundNotification; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.apache.shiro.mgt.DefaultSecurityManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.InputStreamReader; /** * Created by IntelliJ IDEA. * æ¯ä»åè° * @Author : Rk * @create 2023/2/23 13:49 */ @Slf4j @RestController @CrossOrigin public class PaymentCallback { @Autowired private OrdersService ordersService; /** * ã微信æ¯ä»ã弿¥éç¥ * * @return */ @PostMapping("/api/wxPayNotify") public ApiResponse wxPay_notify(HttpServletRequest request) { try { ServletInputStream inputStream = request.getInputStream(); StringBuffer stringBuffer = new StringBuffer(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s; //读ååè°è¯·æ±ä½ while ((s = bufferedReader.readLine()) != null) { stringBuffer.append(s); } String body = stringBuffer.toString(); String timestamp = request.getHeader("Wechatpay-Timestamp"); String nonce = request.getHeader("Wechatpay-Nonce"); String signType = request.getHeader("Wechatpay-Signature-Type"); String serialNo = request.getHeader("wechatpay-Serial"); String signature = request.getHeader("Wechatpay-Signature"); RequestParam requestParam = new RequestParam.Builder() .serialNumber(serialNo) .nonce(nonce) .signType(signType) .signature(signature) .timestamp(String.valueOf(timestamp)) .body(body) .build(); NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(WxMiniConfig.wxProperties.getMchId()) .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key()) .build(); NotificationParser parser = new NotificationParser(config); Transaction result = parser.parse(requestParam, Transaction.class); //èªå®ä¹è®¢åå· String outTradeNo = result.getOutTradeNo(); //微信订åå· String paymentNo = result.getTransactionId(); if ("SUCCESS".equals(result.getTradeState().name())) { // æ¯ä»æåge switch (result.getAttach()) { //æ¯ä»è®¢ååè° case "createOrder": { ordersService.payNotify(outTradeNo,paymentNo); break; } } } else { // æ¯ä»å¤±è´¥ switch (result.getAttach()) { case "createGoodsOrder": { break; } } } return ApiResponse.success("å¤çæå!"); } catch (Exception e) { e.printStackTrace(); log.error("微信åè°ç»æå¼å¸¸,å¼å¸¸åå {}", e.getLocalizedMessage()); return ApiResponse.failed(""); } } @PostMapping("/api/wxRefundNotify") public ApiResponse wxRefundNotify(HttpServletRequest request) { log.error("å¾®ä¿¡éæ¬¾åè°ç»æå¼å§===========" ); try { DefaultSecurityManager securityManager = new DefaultSecurityManager(); SecurityUtils.setSecurityManager(securityManager); ServletInputStream inputStream = request.getInputStream(); StringBuffer stringBuffer = new StringBuffer(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s; //读ååè°è¯·æ±ä½ while ((s = bufferedReader.readLine()) != null) { stringBuffer.append(s); } String body = stringBuffer.toString(); String timestamp = request.getHeader("Wechatpay-Timestamp"); String nonce = request.getHeader("Wechatpay-Nonce"); String signType = request.getHeader("Wechatpay-Signature-Type"); String serialNo = request.getHeader("wechatpay-Serial"); String signature = request.getHeader("Wechatpay-Signature"); RequestParam requestParam = new RequestParam.Builder() .serialNumber(serialNo) .nonce(nonce) .signType(signType) .signature(signature) .timestamp(String.valueOf(timestamp)) .body(body) .build(); NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(WxMiniConfig.wxProperties.getMchId()) .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key()) .build(); NotificationParser parser = new NotificationParser(config); RefundNotification result = parser.parse(requestParam, RefundNotification.class); // if ("SUCCESS".equals(result.getRefundStatus().name())) { // æ¯ä»æåge // goodsorderService.closeGoodsorderDone(result); // } return ApiResponse.success("å¤çæå"); } catch (Exception e) { e.printStackTrace(); log.error("微信åè°ç»æå¼å¸¸,å¼å¸¸åå {}", e.getLocalizedMessage()); return ApiResponse.failed(""); } } }