diff --git a/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java b/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java index 73af2839..cabe8b6c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java +++ b/mall-common/src/main/java/com/suisung/mall/common/feignService/ShopService.java @@ -326,12 +326,12 @@ public interface ShopService { /** * 获取店铺的内部运费 shopping_fee_inner (远程调用用途) * - * @param store_id + * @param order_id * @return */ @ApiOperation(value = "获取店铺的内部运费 shopping_fee_inner", notes = "获取店铺的内部运费 shopping_fee_inner (远程调用用途)") @RequestMapping(value = "/admin/shop/shop-store-info/shopping-fee-inner", method = RequestMethod.POST) - Integer storeShoppingFeeInner(@RequestParam(name = "store_id") Integer store_id); + Integer storeShoppingFeeInner(@RequestParam(name = "order_id") String order_id); @GetMapping(value = "/admin/shop/shop-store-employee-rights-base/queryByRightsIds") diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java new file mode 100644 index 00000000..146be51f --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/OrderCacDeliveryFeeDTO.java @@ -0,0 +1,47 @@ +package com.suisung.mall.common.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OrderDeliveryInfoDTO", description = "计算订单内部配送费参数实体类") +public class OrderCacDeliveryFeeDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "订单ID") + private String order_id; + + @ApiModelProperty(value = "店铺ID") + private Integer store_id; + + @ApiModelProperty(value = "配送方式Id") + private Integer delivery_type_id; + + @ApiModelProperty(value = "订单商品金额") + private BigDecimal order_product_amount; + + @ApiModelProperty(value = "订单支付金额") + private BigDecimal order_payment_amount; + + @ApiModelProperty(value = "订单折扣金额") + private BigDecimal order_discount_amount; + + @ApiModelProperty(value = "订单重量(克)") + private Integer order_weight_gram; + + @ApiModelProperty(value = "配送地址经度") + private String da_longitude; + + @ApiModelProperty(value = "配送地址纬度") + private String da_latitude; +} \ No newline at end of file diff --git a/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java b/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java index 47eeb7f2..68e87869 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java +++ b/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java @@ -90,11 +90,19 @@ public class CommonService { * @return 配送方式名称 */ public static String getDeliveryExpressName(Integer deliveryTypeId) { - if (deliveryTypeId == null) return "其他配送"; - String name = StateCode.DELIVERY_TYPE_MAP.get(deliveryTypeId); - return name != null ? name : "其他配送"; + // 当配送方式ID为空时,默认返回顺丰同城 + if (deliveryTypeId == null) { + log.debug("配送方式ID为空,返回默认配送方式:顺丰同城"); + return "顺丰同城"; + } + + // 从配送方式映射表中获取名称,如果未找到则返回默认值顺丰同城 + String deliveryName = StateCode.DELIVERY_TYPE_MAP.getOrDefault(deliveryTypeId, "顺丰同城"); + log.debug("获取配送方式名称:deliveryTypeId={} deliveryName={}", deliveryTypeId, deliveryName); + return deliveryName; } + /** * 判断配送方式是否为同城配送 * diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java index 2521325a..25e5d117 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/AccountBaseConfigService.java @@ -50,9 +50,9 @@ public interface AccountBaseConfigService extends IBaseService @@ -109,47 +109,47 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_contracts"); put("componentValue", "《平台商户入驻服务框架协议》和《小发同城服务费结算》"); }}); @@ -207,7 +207,7 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_sign_date" + finalI); put("componentValue", today); }}); @@ -216,34 +216,34 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_sign_date" + finalI); put("componentValue", today); }}); } // 甲方公司名称 - int mchCompanyCount = CommonConstant.MCH_ENTITY_TYPE_QY.equals(shopMchEntry.getEntity_type()) ? 17 : 16; + int mchCompanyCount = CommonConstant.MCH_ENTITY_TYPE_QY.equals(mchEntry.getEntity_type()) ? 17 : 16; for (int i = 1; i <= mchCompanyCount; i++) { int finalI = i; - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_company" + finalI); put("componentValue", mchCompany); }}); } // 特殊处理:甲方收款账户方(企业是公司名,个人是个人实名) - if (!CommonConstant.MCH_ENTITY_TYPE_QY.equals(shopMchEntry.getEntity_type())) { - list.add(new HashMap() {{ + if (!CommonConstant.MCH_ENTITY_TYPE_QY.equals(mchEntry.getEntity_type())) { + componentList.add(new HashMap() {{ put("componentKey", "mch_company17"); - put("componentValue", shopMchEntry.getContact_name()); + put("componentValue", mchEntry.getContact_name()); }}); } // 甲方法人姓名 for (int i = 1; i <= 4; i++) { int finalI = i; - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_legal_person_name" + finalI); put("componentValue", legalPersonName); }}); @@ -252,63 +252,63 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_legal_person_mobile" + finalI); put("componentValue", legalPersonMobile); }}); } // 甲方身份证号码 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_legal_person_id_number1"); put("componentValue", legalPersonIdNumber); }}); // 甲方店铺名称 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_store_name1"); - put("componentValue", shopMchEntry.getStore_name()); + put("componentValue", mchEntry.getStore_name()); }}); // 规则编号 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "rule_no"); put("componentValue", 3); }}); // 分账比例 BigDecimal finalSplitRatio = splitRatio; - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_ratio"); put("componentValue", finalSplitRatio); }}); // 结算方式 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "settlement_method"); - put("componentValue", shopMchEntry.getSettlement_method()); + put("componentValue", mchEntry.getSettlement_method()); }}); // 甲方地址 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_address1"); - put("componentValue", shopMchEntry.getStore_address()); + put("componentValue", mchEntry.getStore_address()); }}); // 甲方银行 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_bank1"); - put("componentValue", shopMchEntry.getBank_name()); + put("componentValue", mchEntry.getBank_name()); }}); // 甲方账户号 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "mch_account_number1"); - put("componentValue", shopMchEntry.getAccount_number()); + put("componentValue", mchEntry.getAccount_number()); }}); // 乙方公司名称 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_company1"); put("componentValue", platCompany + "和代理商"); }}); @@ -316,7 +316,7 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_company" + finalI); put("componentValue", platCompany); }}); @@ -325,58 +325,58 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_mobile" + finalI); - put("componentValue", esignPlatformInfo.getLegal_person_mobile()); + put("componentValue", platformInfo.getLegal_person_mobile()); }}); } // 乙方邮箱(重复填充,但保持原逻辑) for (int i = 0; i < 6; i++) { - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_email1"); - put("componentValue", esignPlatformInfo.getEmail()); + put("componentValue", platformInfo.getEmail()); }}); } // 乙方银行 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_bank1"); - put("componentValue", esignPlatformInfo.getRec_acc_bank_name()); + put("componentValue", platformInfo.getRec_acc_bank_name()); }}); // 乙方账户号 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "plat_account_number1"); - put("componentValue", esignPlatformInfo.getRec_acc_card_no()); + put("componentValue", platformInfo.getRec_acc_card_no()); }}); // 11. 处理代理商相关数据 if (distributor != null) { // 有代理商的时候,填充代理商的信息 - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_company1"); put("componentValue", distributor.getLicense_company()); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_mobile1"); put("componentValue", distributor.getLegal_person_mobile()); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_company2"); put("componentValue", distributor.getLicense_company()); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_bank1"); put("componentValue", distributor.getRec_acc_bank_name()); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_account_number1"); put("componentValue", distributor.getRec_acc_card_no()); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_sign_date1"); put("componentValue", today); }}); @@ -384,24 +384,24 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_company1"); put("componentValue", "无"); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_mobile1"); put("componentValue", "无"); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_company2"); put("componentValue", "无"); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_bank1"); put("componentValue", "无"); }}); - list.add(new HashMap() {{ + componentList.add(new HashMap() {{ put("componentKey", "distr_account_number1"); put("componentValue", "无"); }}); @@ -409,7 +409,7 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl signPositionMap = getSignPosition(templateId, fileId); if (signPositionMap != null) { if (signPositionMap.get("mch") != null) { - esignContractFillingFile.setMch_sign_position(signPositionMap.get("mch").toString()); + contractFillingFile.setMch_sign_position(signPositionMap.get("mch").toString()); } if (signPositionMap.get("plat") != null) { - esignContractFillingFile.setPlat_sign_position(signPositionMap.get("plat").toString()); + contractFillingFile.setPlat_sign_position(signPositionMap.get("plat").toString()); } if (distributor != null && signPositionMap.get("distr") != null) { // 如果有代理商,则把代理商的印章位置信息写入数据库 - esignContractFillingFile.setDistri_sign_position(signPositionMap.get("distr").toString()); + contractFillingFile.setDistri_sign_position(signPositionMap.get("distr").toString()); } } // 17. 保存合同填充记录并预创建签署流程 - if (esignContractFillingFileService.trySaveRecord(esignContractFillingFile)) { + if (esignContractFillingFileService.trySaveRecord(contractFillingFile)) { successCnt += 1; log.debug("[合同生成] 合同记录保存成功, fileId: {}", fileId); // 预新增一个签署合同记录 boolean preCreateResult = esignContractService.preCreateSignFlow( - esignContractFillingFile.getMobile(), esignContractFillingFile.getDoc_template_id()); + contractFillingFile.getMobile(), contractFillingFile.getDoc_template_id()); log.debug("[合同生成] 预创建签署流程结果: {}, 商家手机号: {}, 模板ID: {}", - preCreateResult, esignContractFillingFile.getMobile(), esignContractFillingFile.getDoc_template_id()); + preCreateResult, contractFillingFile.getMobile(), contractFillingFile.getDoc_template_id()); } else { log.error("[合同生成] 保存合同记录失败, fileId: {}", fileId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java index e5147939..142dd5a7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java @@ -167,61 +167,77 @@ public class EsignContractServiceImpl extends BaseServiceImpl innerSignFlowCreateByFile(Integer storeId) { + // 1. 参数校验 if (CheckUtil.isEmpty(storeId)) { return Pair.of(false, "缺少必要参数!"); } - // 组织和填充商家店铺的模版数据 + // 2. 组织和填充商家店铺的模版数据 Boolean isFill = esignContractFillingFileService.fillDocTemplate(storeId); if (!isFill) { return Pair.of(false, "合同信息未准备好,请检查商家入驻手续是否已完成!"); } + // 3. 获取商家合同信息 EsignContract esignContract = getEsignContractByStoreId(storeId); if (esignContract == null) { return Pair.of(false, "未找到商家合同信息"); } - // 检查商户入驻信息是否被审核通过 - // 检查店铺是否已经申请过入驻 + // 4. 检查商户入驻信息是否被审核通过 Integer apprStatus = shopMchEntryService.getApprovalStatus(esignContract.getMch_mobile()); if (!CommonConstant.MCH_APPR_STA_PASS.equals(apprStatus)) { return Pair.of(false, "请先审核商家入驻信息"); } - //"{\"docs\":[{\"fileId\":\"ab30d2c5600441f4a7daf512e4d69157\",\"fileName\":\"小发同城平台商户合作协议.pdf\"}],\"signFlowConfig\":{\"signFlowTitle\":\"小发同城平台商户合作协议\",\"signFlowExpireTime\":1746844718000,\"autoFinish\":true,\"notifyUrl\":\"https://mall.gpxscs.cn/asyn/notify\",\"redirectConfig\":{\"redirectUrl\":\"https://mall.gpxscs.cn/\"}},\"signers\":[{\"signConfig\":{\"signOrder\":1},\"noticeConfig\":{\"noticeTypes\":\"1\"},\"signerType\":0,\"psnSignerInfo\":{\"psnAccount\":\"13128997057\",\"psnInfo\":{\"psnName\":\"潘军杰\"}},\"signFields\":[{\"fileId\":\"ab30d2c5600441f4a7daf512e4d69157\",\"normalSignFieldConfig\":{\"signFieldStyle\":1,\"signFieldPosition\":{\"positionPage\":40,\"positionX\":472.3607,\"positionY\":277.19104}}},{\"fileId\":\"ab30d2c5600441f4a7daf512e4d69157\",\"normalSignFieldConfig\":{\"signFieldStyle\":1,\"signFieldPosition\":{\"positionPage\":5,\"positionX\":470.58798,\"positionY\":589.14496}}}]},{\"signConfig\":{\"signOrder\":2},\"noticeConfig\":{\"noticeTypes\":\"1\"},\"signerType\":1,\"orgSignerInfo\":{\"orgName\":\"桂平发发网络有限公司\",\"orgInfo\":{\"orgIDCardNum\":\"91450881MADEQ92533\",\"orgIDCardType\":\"CRED_ORG_USCC\"},\"transactorInfo\":{\"psnAccount\":\"17777525395\",\"psnInfo\":{\"psnName\":\"谢能坤\"}}},\"signFields\":[{\"fileId\":\"ab30d2c5600441f4a7daf512e4d69157\",\"normalSignFieldConfig\":{\"signFieldStyle\":1,\"signFieldPosition\":{\"positionPage\":2,\"positionX\":479.04996,\"positionY\":357.2327}}},{\"fileId\":\"ab30d2c5600441f4a7daf512e4d69157\",\"normalSignFieldConfig\":{\"signFieldStyle\":1,\"signFieldPosition\":{\"positionPage\":5,\"positionX\":255.96832,\"positionY\":588.4553}}}]}]}"; -// esignContractService. + // 5. 获取签署请求参数 String jsonParams = esignContract.getReq_params(); + if (StrUtil.isBlank(jsonParams)) { + return Pair.of(false, "合同请求参数为空"); + } try { - //请求方法 + // 6. 调用E签宝API创建签署流程 EsignRequestType requestType = EsignRequestType.POST; - String apiAddr = "/v3/sign-flow/create-by-file"; - Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(appId, appSecret, jsonParams, requestType.name(), apiAddr, true); - //发起接口请求 - EsignHttpResponse createByDocTemplate = EsignHttpHelper.doCommHttp(serverUrl, apiAddr, requestType, jsonParams, header, debug); - log.info("发起合同签署流程返回消息:{},{}", createByDocTemplate.getStatus(), createByDocTemplate.getBody()); - if (createByDocTemplate.getStatus() != 200) { - if (createByDocTemplate.getBody() != null) { - JSONObject resBody = JSONUtil.parseObj(createByDocTemplate.getBody()); - log.error("e签宝请求失败,返回状态码:{}, {}", createByDocTemplate.getStatus(), resBody.getStr("message")); - return Pair.of(false, "e签宝请求失败,{}" + resBody.getStr("message")); + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader( + appId, appSecret, jsonParams, requestType.name(), apiAddr, true); + + EsignHttpResponse response = EsignHttpHelper.doCommHttp( + serverUrl, apiAddr, requestType, jsonParams, header, debug); + + log.info("发起合同签署流程返回消息:status={}, body={}", response.getStatus(), response.getBody()); + + // 7. 处理API响应结果 + if (response.getStatus() != HttpStatus.OK.value()) { + String errorMsg = "E签宝请求失败"; + if (response.getBody() != null) { + try { + JSONObject resBody = JSONUtil.parseObj(response.getBody()); + errorMsg += "," + resBody.getStr("message", "未知错误"); + } catch (Exception parseException) { + log.warn("解析E签宝错误响应失败:{}", response.getBody()); + } } - return Pair.of(false, "e签宝请求失败!"); + log.error("E签宝请求失败,返回状态码:{}", response.getStatus()); + return Pair.of(false, errorMsg); } - JSONObject jsonObject = JSONUtil.parseObj(createByDocTemplate.getBody()); + // 8. 解析成功响应数据 + JSONObject jsonObject = JSONUtil.parseObj(response.getBody()); Integer code = jsonObject.getInt("code"); - String signFlowId = (String) jsonObject.getByPath("data.signFlowId"); + String signFlowId = jsonObject.getByPath("data.signFlowId", String.class); + if (code == null || code != 0 || StrUtil.isBlank(signFlowId)) { - log.error("e签宝请求失败,返回status码:{}", code); - return Pair.of(false, "e签宝请求失败!"); + log.error("E签宝请求失败,返回 code 码:{}", code); + return Pair.of(false, "E签宝请求失败!"); } - //合同签署状态:-1:预备数据阶段;0-等待签署;1-已部分签署;2-已完成(所有签署方完成签署)3-已撤销(发起方撤销签署任务)5-已过期(签署截止日到期后触发)7-已拒签(签署方拒绝签署) - Boolean success = updateContractFlowIdAndFileUrl(esignContract.getId(), signFlowId, CommonConstant.CONTRACT_SIGN_STA_ING, null); + // 9. 更新合同流程状态 + Boolean success = updateContractFlowIdAndFileUrl( + esignContract.getId(), signFlowId, CommonConstant.CONTRACT_SIGN_STA_ING, null); + if (!success) { log.error("更新合同流程状态失败"); return Pair.of(false, "更新合同流程状态失败"); @@ -229,12 +245,13 @@ public class EsignContractServiceImpl extends BaseServiceImpl>>>>> {}", signature); if (!mySignature.equals(signature)) { - log.warn("e签宝异步通知签名校验失败: 计算签名={}, 请求签名={}", mySignature, signature); + log.warn("E签宝异步通知签名校验失败: 计算签名={}, 请求签名={}", mySignature, signature); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new JSONObject().put("code", 400).put("msg", "签名校验失败").toString()); } @@ -288,7 +305,7 @@ public class EsignContractServiceImpl extends BaseServiceImpl * 收到异步通知,签署完成之后,获取合同文件地址,保存并上传到 oss * @@ -837,7 +854,7 @@ public class EsignContractServiceImpl extends BaseServiceImpl createNextSeqPair(String prefix) { - String ymd = DateUtil.format(new Date(), "yyyyMMdd"); - String id = String.format("%s_%s_", prefix, ymd); - ShopNumberSeq shopNumberSeq = this.baseMapper.selectById(id); - if (shopNumberSeq == null) { - shopNumberSeq = new ShopNumberSeq(); - shopNumberSeq.setPrefix(id); - shopNumberSeq.setNumber(1L); - if (!save(shopNumberSeq)) { - return null; + // 参数校验 + if (prefix == null || prefix.trim().isEmpty()) { + return null; + } + + try { + String ymd = DateUtil.format(new Date(), "yyyyMMdd"); + String seqId = String.format("%s_%s_", prefix, ymd); + + // 查询或创建序列记录 + ShopNumberSeq shopNumberSeq = this.baseMapper.selectById(seqId); + if (shopNumberSeq == null) { + shopNumberSeq = new ShopNumberSeq(); + shopNumberSeq.setPrefix(seqId); + shopNumberSeq.setNumber(1L); + if (!save(shopNumberSeq)) { + return null; + } } - } - String order_id = String.format("%s_%s_%s", prefix, ymd, shopNumberSeq.getNumber()); - shopNumberSeq.setPrefix(id); - boolean flag = edit(shopNumberSeq); - if (flag) { - return Pair.of(shopNumberSeq.getNumber(), order_id); - } + // 获取当前序列号 + Long number = shopNumberSeq.getNumber(); + String orderId = String.format("%s_%s_%s", prefix, ymd, number); - return null; + // 增加序列号并更新 + // shopNumberSeq.setNumber(number + 1); + shopNumberSeq.setPrefix(seqId); + return edit(shopNumberSeq) ? Pair.of(number, orderId) : null; + + } catch (Exception e) { + log.error("生成序列号失败,prefix: {}", prefix, e); + return null; + } } + /** * 得到下一个Id * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java index 5fa657ae..17048bbb 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java @@ -1,6 +1,8 @@ package com.suisung.mall.shop.order.controller.mobile; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.ResultCode; @@ -15,10 +17,7 @@ import com.suisung.mall.shop.order.vo.OrderReturnVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** *

@@ -57,7 +56,7 @@ public class UserReturnController extends BaseControllerImpl { return shopOrderReturnService.returnItem(); } - @ApiOperation(value = "添加退款退货-部分退货,卖家也可以决定不退货退款,买家申请退款不支持。卖家可以主动退款。", notes = "添加退款退货-发货退货,卖家也可以决定不退货退款,买家申请退款不支持。卖家可以主动退款。") + @ApiOperation(value = "添加退款退货-部分退货", notes = "添加退款退货-发货退货,卖家也可以决定不退货退款,买家申请退款不支持。卖家可以主动退款。") @RequestMapping(value = "/addItem", method = RequestMethod.GET) public CommonResult addItem(OrderReturnVo orderReturnVo) { UserDto user = getCurrentUser(); @@ -77,6 +76,26 @@ public class UserReturnController extends BaseControllerImpl { return shopOrderReturnService.addItem(orderReturnInputVo, true); } + @ApiOperation(value = "批量添加退款退货(支持多个商品)", notes = "添加退款退货-发货退货,卖家也可以决定不退货退款,买家申请退款不支持。卖家可以主动退款。") + @RequestMapping(value = "/addItemBatch", method = RequestMethod.POST) + public CommonResult addItemBatch(@RequestBody JSONObject orderReturnVoJSON) { + if (orderReturnVoJSON == null) { + return CommonResult.failed("请求参数不能为空"); + } + + OrderReturnInputVo orderReturnInputVo = JSONUtil.toBean(orderReturnVoJSON, OrderReturnInputVo.class); + if (orderReturnInputVo == null) { + return CommonResult.failed("请求参数格式不正确"); + } + + UserDto user = getCurrentUser(); + if (user == null) { + return CommonResult.failed(ResultCode.NEED_LOGIN); + } + + return shopOrderReturnService.tryAddItemBatch(orderReturnInputVo); + } + @ApiOperation(value = "添加退款退货-整单退货", notes = "添加退款退货-整单退货") @RequestMapping(value = "/addWholeItems", method = RequestMethod.POST) public CommonResult addWholeItems(@RequestParam(name = "order_id") String order_id) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderInfoMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderInfoMapper.java index e9694f40..48f54d36 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderInfoMapper.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderInfoMapper.java @@ -2,6 +2,8 @@ package com.suisung.mall.shop.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.suisung.mall.common.modules.order.ShopOrderInfo; +import com.suisung.mall.common.pojo.dto.OrderCacDeliveryFeeDTO; +import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import java.util.List; @@ -35,4 +37,28 @@ public interface ShopOrderInfoMapper extends BaseMapper { */ Long getOrderCountByStoreId(Integer storeId, List orderStatusIdList, List orderRefundStatusIdList, List deliveryTypeList, Long expireSeconds); + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品零售总额 - 折扣金额 - 优惠券金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + @Select("SELECT sob.order_id,sob.store_id,sob.order_product_amount,sob.order_payment_amount," + + "(sob.order_product_amount-sod.order_discount_amount-sod.voucher_price-sod.order_adjust_fee-sod.order_points_fee) as order_discount_amount," + + "0 as order_weight_gram," + + "aoda.da_longitude,aoda.da_latitude, soi.delivery_type_id " + + "FROM shop_order_base sob " + + "JOIN shop_order_data sod ON sob.order_id=sod.order_id " + + "JOIN shop_order_info soi ON sob.order_id=soi.order_id " + + "JOIN shop_order_delivery_address aoda ON sob.order_id=aoda.order_id " + + "WHERE sob.order_id=#{orderId}") + OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId); + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java index 41a68fe5..0db71718 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java @@ -459,20 +459,20 @@ public interface ShopOrderBaseService extends IBaseService { * * @param order_id * @param shopOrderInfo - * @param check_paid_flag + * @param checkPaidState 订单是否未支付,默认值 true * @return */ - boolean cancel(String order_id, ShopOrderInfo shopOrderInfo, boolean check_paid_flag); + boolean cancel(String order_id, ShopOrderInfo shopOrderInfo, boolean checkPaidState); /** * 取消订单 * * @param order_ids * @param order_rows - * @param check_paid_flag + * @param isNotPaid 订单是否未支付,默认值 true * @return */ - boolean cancel(List order_ids, List order_rows, boolean check_paid_flag); + boolean cancel(List order_ids, List order_rows, boolean isNotPaid); void exportFile(HttpServletResponse response, ShopOrderBase shopOrderBase, List order_ids); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java index 968209fd..47a00897 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java @@ -3,6 +3,7 @@ package com.suisung.mall.shop.order.service; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.order.ShopOrderInfo; import com.suisung.mall.common.pojo.dto.BookingArgDTO; +import com.suisung.mall.common.pojo.dto.OrderCacDeliveryFeeDTO; import com.suisung.mall.core.web.service.IBaseService; import org.springframework.data.util.Pair; @@ -145,11 +146,33 @@ public interface ShopOrderInfoService extends IBaseService { List genBookingOrderArgList(String storeId); /** - * 获取某个活动订单成功数量 + * 获取某个活动订单成功数量(目前砍价用途) * * @param activityId 活动ID * @param activityTypeId 活动类型ID, 可选参数 * @return */ long fetchActivityOrderSuccessCount(String activityId, String activityTypeId); + + /** + * 获取某个订单是否存在(满足)内部配送费 + * + * @param deliveryTypeId 店铺ID + * @return Pair,第一个元素表示是否满足内部配送费条件,第二个元素为内部配送费金额 + */ + Boolean hasInnerMinDeliveryFee(Integer deliveryTypeId); + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品总额 - 折扣金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java index e00dcb59..e6a428c3 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java @@ -50,6 +50,14 @@ public interface ShopOrderReturnService extends IBaseService { */ CommonResult addItem(OrderReturnInputVo orderReturnInputVo, Boolean needSendMsg); + /** + * 尝试批量添加退款退货申请(自动使用最大可退数量和金额),等待商家审核处理(同意或不同意) + * + * @param orderReturnInputVo 退款申请输入参数,支持订单多个商品退款 + * @return CommonResult 退款申请结果 + */ + CommonResult tryAddItemBatch(OrderReturnInputVo orderReturnInputVo); + Map getReturnDetail(String return_id); boolean processReviewList(ShopOrderReturn shopOrderReturn, Integer receiving_address); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index aece29b9..c773836e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -768,7 +768,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl productBaseOpl = product_rows.stream().filter(s -> ObjectUtil.equal(product_id, Convert.toInt(s.get("product_id")))).findFirst(); @@ -961,9 +963,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl order_ids, List order_rows, boolean check_paid_flag) { - List cancel_id_row = new ArrayList<>(order_ids.size()); + public boolean cancel(List orderIds, List orderRows, boolean checkPaidState) { + List cancelIdRow = new ArrayList<>(orderIds.size()); // 检测数据是否合法,过滤允许修改的数据 - if (CollUtil.isEmpty(order_ids)) { + if (CollUtil.isEmpty(orderIds)) { throw new ApiException(I18nUtil._("请选择需要取消的订单")); } - if (CollUtil.isEmpty(order_rows)) { - order_rows = Convert.toList(Map.class, shopOrderInfoService.gets(order_ids)); + if (CollUtil.isEmpty(orderRows)) { + orderRows = Convert.toList(Map.class, shopOrderInfoService.gets(orderIds)); } - for (String order_id : order_ids) { - Optional orderOpl = order_rows.stream().filter(s -> ObjectUtil.equal(order_id, Convert.toStr(s.get("order_id")))).findFirst(); - Map order = orderOpl.orElseGet(HashMap::new); + // 筛选可取消的订单 + for (String orderId : orderIds) { + Optional orderOpt = orderRows.stream() + .filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))) + .findFirst(); + Map order = orderOpt.orElseGet(HashMap::new); + // 订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废; - Integer order_state_id = (Integer) order.get("order_state_id"); + Integer orderStateId = (Integer) order.get("order_state_id"); // 付款状态(ENUM):3010-未付款;3011-付款待审核;3012-部分付款;3013-已付款 - Integer order_is_paid = (Integer) order.get("order_is_paid"); - // 要检查订单付款状态 - if (check_paid_flag) { - if (ifCancel(order_state_id, order_is_paid)) { - // 未付款,未配送的订单才能取消订单 - cancel_id_row.add(order_id); + Integer orderIsPaid = (Integer) order.get("order_is_paid"); + + // 根据是否检查支付状态来判断订单是否可取消 + if (checkPaidState) { + // 检查订单是否可以取消(未付款且处于特定状态) + if (isOrderCancelable(orderStateId, orderIsPaid)) { + cancelIdRow.add(orderId); + } else { + // 订单已支付,检查是否允许退款 + boolean isOrderDenyReturn = shopOrderReturnService.isOrderDenyReturn(orderId); + if (!isOrderDenyReturn) { + // 支付的订单允许退款,立即发起退款流程,再由商家审核 + CommonResult refundResult = shopOrderReturnService.addRemainingItems(orderId, false, "用户取消订单"); + if (refundResult == null || refundResult.getStatus() != 200L) { + logger.error("用户提交取消订单失败!"); + return false; + } + + // 提交成功之后,再由商家审核,通过之后,会继续完成以下的操作。 + return true; + } } } else { - // 不检查订单付款状态 - cancel_id_row.add(order_id); + // 不检查订单付款状态,直接加入可取消列表 + cancelIdRow.add(orderId); } } - if (CollUtil.isEmpty(cancel_id_row)) { + if (CollUtil.isEmpty(cancelIdRow)) { throw new ApiException(I18nUtil._("无符合取消条件的订单!")); } - order_ids = cancel_id_row; + orderIds = cancelIdRow; + // 更新订单主表状态为已取消 ShopOrderBase orderBase = new ShopOrderBase(); orderBase.setOrder_state_id(StateCode.ORDER_STATE_CANCEL); QueryWrapper baseQueryWrapper = new QueryWrapper<>(); - baseQueryWrapper.in("order_id", order_ids); + baseQueryWrapper.in("order_id", orderIds); baseQueryWrapper.ne("order_state_id", StateCode.ORDER_STATE_CANCEL); // 2070-已取消 - if (!edit(orderBase, baseQueryWrapper)) {// 批量更改状态 + if (!edit(orderBase, baseQueryWrapper)) { // 批量更改状态 throw new ApiException(ResultCode.FAILED); } + // 更新订单信息表状态为已取消 ShopOrderInfo shopOrderInfo = new ShopOrderInfo(); shopOrderInfo.setOrder_state_id(StateCode.ORDER_STATE_CANCEL); QueryWrapper infoQueryWrapper = new QueryWrapper<>(); - infoQueryWrapper.in("order_id", cancel_id_row); + infoQueryWrapper.in("order_id", cancelIdRow); infoQueryWrapper.ne("order_state_id", StateCode.ORDER_STATE_CANCEL); if (!shopOrderInfoService.edit(shopOrderInfo, infoQueryWrapper)) { - throw new ApiException(String.format("订单:%s 取消状态有误!", CollUtil.join(cancel_id_row, ","))); + throw new ApiException(String.format("订单:%s 取消状态有误!", CollUtil.join(cancelIdRow, ","))); } // 积分退还 order_resource_ext1 默认为积分。 - List order_data_rows = shopOrderDataService.gets(order_ids); - for (ShopOrderData order_data_row : order_data_rows) { - String orderId = order_data_row.getOrder_id(); + List orderDataRows = shopOrderDataService.gets(orderIds); + for (ShopOrderData orderDataRow : orderDataRows) { + String orderId = orderDataRow.getOrder_id(); - Optional orderOpl = order_rows.stream().filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))).findFirst(); - Map order = orderOpl.orElseGet(HashMap::new); + Optional orderOpt = orderRows.stream() + .filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))) + .findFirst(); + Map order = orderOpt.orElseGet(HashMap::new); - Integer buyer_user_id = (Integer) order.get("buyer_user_id"); - BigDecimal order_resource_ext1 = order_data_row.getOrder_resource_ext1();// 积分 - BigDecimal order_resource_ext2 = order_data_row.getOrder_resource_ext2();// 众宝 + Integer buyerUserId = (Integer) order.get("buyer_user_id"); + BigDecimal orderResourceExt1 = orderDataRow.getOrder_resource_ext1(); // 积分 + BigDecimal orderResourceExt2 = orderDataRow.getOrder_resource_ext2(); // 众宝 - if (ObjectUtil.compare(order_resource_ext1, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyer_user_id)) { - Integer store_id = (Integer) order.get("store_id"); + // 退还积分 + if (ObjectUtil.compare(orderResourceExt1, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyerUserId)) { + Integer storeId = (Integer) order.get("store_id"); // 扣除积分 - String desc = String.format("%s 积分退还,订单号 %s", order_resource_ext1, order_data_row.getOrder_id()); - if (!payService.points(buyer_user_id, order_resource_ext1, PointsType.POINTS_TYPE_CONSUME_RETRUN, desc, store_id, null, order_data_row.getOrder_id())) { + String desc = String.format("%s 积分退还,订单号 %s", orderResourceExt1, orderDataRow.getOrder_id()); + if (!payService.points(buyerUserId, orderResourceExt1, PointsType.POINTS_TYPE_CONSUME_RETRUN, desc, storeId, null, orderDataRow.getOrder_id())) { throw new ApiException(I18nUtil._("积分操作失败!")); } } // 程序没有编写完成,缺失众宝积分退回功能 - //if (ObjectUtil.compare(order_resource_ext2, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyer_user_id)) { - // String desc = String.format("%s 众宝退还", order_resource_ext2); - // todo shopUserPointsHistoryService.sp(buyer_user_id,order_resource_ext2,SpType.SP_TYPE_CONSUME_RETRUN, desc); - //} + // if (ObjectUtil.compare(orderResourceExt2, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyerUserId)) { + // String desc = String.format("%s 众宝退还", orderResourceExt2); + // todo shopUserPointsHistoryService.sp(buyerUserId, orderResourceExt2, SpType.SP_TYPE_CONSUME_RETRUN, desc); + // } } // 限购商品数量退还 QueryWrapper itemQueryWrapper = new QueryWrapper<>(); - itemQueryWrapper.in("order_id", order_ids); - List order_item_rows = shopOrderItemService.find(itemQueryWrapper); - - for (ShopOrderItem order_item_row : order_item_rows) { + itemQueryWrapper.in("order_id", orderIds); + List orderItemRows = shopOrderItemService.find(itemQueryWrapper); + for (ShopOrderItem orderItemRow : orderItemRows) { + // 退还用户购买数量限制 QueryWrapper buyQueryWrapper = new QueryWrapper<>(); - buyQueryWrapper.eq("product_id", order_item_row.getProduct_id()); - buyQueryWrapper.eq("item_id", order_item_row.getItem_id()); - buyQueryWrapper.eq("user_id", order_item_row.getBuyer_id()); + buyQueryWrapper.eq("product_id", orderItemRow.getProduct_id()); + buyQueryWrapper.eq("item_id", orderItemRow.getItem_id()); + buyQueryWrapper.eq("user_id", orderItemRow.getBuyer_id()); List productBuyList = shopUserProductBuyService.find(buyQueryWrapper); - Integer order_item_quantity = order_item_row.getOrder_item_quantity(); + Integer orderItemQuantity = orderItemRow.getOrder_item_quantity(); if (CollUtil.isNotEmpty(productBuyList)) { - + // 减少用户的已购买数量 for (ShopUserProductBuy productBuy : productBuyList) { - productBuy.setProduct_buy_num(productBuy.getProduct_buy_num() - order_item_quantity); + productBuy.setProduct_buy_num(productBuy.getProduct_buy_num() - orderItemQuantity); } if (!shopUserProductBuyService.saveOrUpdate(productBuyList)) { @@ -4242,29 +4268,29 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); -// stockDeltaMap.put(shopProductItem.getItem_src_id() + "-" + order_item_row.getOrder_id(), order_item_quantity); -// syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + // Map stockDeltaMap = new HashMap<>(); + // stockDeltaMap.put(shopProductItem.getItem_src_id() + "-" + orderItemRow.getOrder_id(), orderItemQuantity); + // syncThirdDataService.incrProductStockToRedis(stockDeltaMap); } } // 退还礼包活动 - if (order_item_row.getActivity_type_id().equals(StateCode.ACTIVITY_TYPE_GIFTPACK)) { + if (orderItemRow.getActivity_type_id().equals(StateCode.ACTIVITY_TYPE_GIFTPACK)) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("exchange_code", order_item_row.getActivity_code()); + queryWrapper.eq("exchange_code", orderItemRow.getActivity_code()); ShopStoreActivityCode shopStoreActivityCode = shopStoreActivityCodeService.findOne(queryWrapper); shopStoreActivityCode.setUser_id(0); shopStoreActivityCode.setOrder_id(""); @@ -4277,18 +4303,21 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl voucherQueryWrapper = new QueryWrapper<>(); - voucherQueryWrapper.in("order_id", order_ids); + voucherQueryWrapper.in("order_id", orderIds); List userVouchers = shopUserVoucherService.find(voucherQueryWrapper); if (CollUtil.isNotEmpty(userVouchers)) { - userVouchers = userVouchers.stream().map(userVoucher -> userVoucher.setVoucher_state_id(StateCode.VOUCHER_STATE_UNUSED)).collect(Collectors.toList()); + // 将已使用的优惠券状态重置为未使用 + userVouchers = userVouchers.stream() + .map(userVoucher -> userVoucher.setVoucher_state_id(StateCode.VOUCHER_STATE_UNUSED)) + .collect(Collectors.toList()); if (!shopUserVoucherService.edit(userVouchers)) { throw new ApiException(I18nUtil._("退还优惠券失败!")); } } - // 取消拼团 - for (String order_id : order_ids) { - cancelActivity(order_id); + // 取消拼团活动 + for (String orderId : orderIds) { + cancelActivity(orderId); } return true; @@ -5227,7 +5256,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl shopOrderInfos = shopOrderInfoService.gets(order_ids); List rows = Convert.toList(Map.class, shopOrderInfos); // 检查登录用户和订单店铺是否有权限操作取消动作 - if (CheckUtil.checkDataRights(user_id, rows, "buyer_user_id") || CheckUtil.checkDataRights(Convert.toInt(user.getStore_id()), rows, "store_id")) { + if (CheckUtil.checkDataRights(user_id, rows, "buyer_user_id") + || CheckUtil.checkDataRights(Convert.toInt(user.getStore_id()), rows, "store_id")) { cancel(order_ids, rows, true); } else { throw new ApiException(ResultCode.FORBIDDEN); @@ -5267,12 +5297,12 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl seqPair = shopNumberSeqService.createNextSeqPair(type_code);// 位数的序号: DD_20251205_1 2025-12-05 1 + Pair seqPair = shopNumberSeqService.createNextSeqPair(type_code);// 位数的序号: DD_20251205_12-> pair 12, 2025-12-05 String order_id = seqPair.getSecond(); Long seqNo = seqPair.getFirst(); // 序号: DD_20251205_1 得出 1 RootContext.bind(xid); @@ -6582,7 +6610,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl order_states = Arrays.asList(StateCode.ORDER_STATE_WAIT_PAY, StateCode.ORDER_STATE_WAIT_REVIEW, StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, StateCode.ORDER_STATE_PICKING, StateCode.ORDER_STATE_WAIT_SHIPPING); - // 3010-未付款,未付款的订单才能取消 - return order_states.contains(order_state_id) && ObjectUtil.equal(order_is_paid, StateCode.ORDER_PAID_STATE_NO); + private boolean isOrderCancelable(Integer orderStateId, Integer orderIsPaid) { + // 可以取消订单的状态列表:待付款、待审核、待财务审核、待配货、待发货 + List cancelableStates = Arrays.asList( + StateCode.ORDER_STATE_WAIT_PAY, + StateCode.ORDER_STATE_WAIT_REVIEW, + StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, + StateCode.ORDER_STATE_PICKING, + StateCode.ORDER_STATE_WAIT_SHIPPING + ); + + // 订单必须处于可取消状态且未付款才能取消 + return cancelableStates.contains(orderStateId) && + ObjectUtil.equal(orderIsPaid, StateCode.ORDER_PAID_STATE_NO); } // QueryWrapper queryWrapper, @@ -8855,7 +8916,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl + * 内部配送费仅适用于同城配送方式,该方法通过检查配送方式是否为同城配送来判断是否满足条件 + * + * @param deliveryTypeId 配送方式ID + * @return Boolean 是否满足内部配送费条件 + */ + @Override + public Boolean hasInnerMinDeliveryFee(Integer deliveryTypeId) { + // 参数校验 + if (CheckUtil.isEmpty(deliveryTypeId)) { + logger.warn("[获取内部配送费] 配送方式ID为空,deliveryTypeId: {}", deliveryTypeId); + return false; + } + + // 检查配送方式是否为同城配送(只有同城配送才有内部配送费) + boolean isSameCityDelivery = StateCode.DELIVERY_TYPE_MAP.containsKey(deliveryTypeId) + && ObjectUtil.equal(StateCode.DELIVERY_TYPE_SAME_CITY, deliveryTypeId); + + logger.debug("[获取内部配送费] 配送方式检查结果, deliveryTypeId: {}, isSameCityDelivery: {}", + deliveryTypeId, isSameCityDelivery); + + return isSameCityDelivery; + } + + + /** + * 根据订单ID获取计算配送费所需的订单信息 + *

+ * 查询逻辑说明: + * 1. 从订单基础信息表获取订单ID、店铺ID和商品总额 + * 2. 从订单数据表计算实际支付金额(订单支付金额 - 运费金额) + * 3. 从订单数据表计算折扣金额(商品总额 - 折扣金额 - 调整金额 - 积分抵扣金额) + * 4. 从订单配送地址表获取配送地址的经纬度 + * + * @param orderId 订单ID + * @return OrderCacDeliveryFeeDTO 订单配送费计算参数实体 + */ + @Override + public OrderCacDeliveryFeeDTO getOrderCacDeliveryFeeArgs(String orderId) { + if (StrUtil.isBlank(orderId)) { + return null; + } + return shopOrderInfoMapper.getOrderCacDeliveryFeeArgs(orderId); + } + /** * 根据一个或多个店铺id获取有效店铺的有效营业时间段 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 3bc64c8d..d7c653d6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -488,7 +488,6 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl order_return_items = orderReturnItemService.find(returnItemQueryWrapper); - if (CollUtil.isNotEmpty(order_return_items)) { throw new ApiException(I18nUtil._("此订单商品正在退款审核!")); } @@ -568,17 +567,16 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl available_return_num) { throw new ApiException(String.format("商品 %s 的退款数量超过可退数量,最多可退 %d 件", shopOrderItem.getItem_name(), available_return_num)); @@ -650,6 +648,208 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl data = new HashMap<>(); + + // 获取用户ID + Integer user_id = orderReturnInputVo.getUser_id(); + if (CheckUtil.isEmpty(user_id)) { + UserDto user = getCurrentUser(); + if (user == null) { + throw new ApiUserException(I18nUtil._("用户信息异常!")); + } + user_id = user.getId(); + } + + // 获取买家店铺ID(如果有) + Integer buyer_store_id = shopStoreBaseService.getStoreId(user_id); + + // 获取订单信息 + String order_id = orderReturnInputVo.getOrder_id(); + List order_item_ids = orderReturnInputVo.getReturn_items().stream() + .map(OrderReturnItemInputVo::getOrder_item_id) + .distinct() + .collect(Collectors.toList()); + + ShopOrderInfo shopOrderInfo = shopOrderInfoService.get(order_id); + if (shopOrderInfo == null) { + throw new ApiException(I18nUtil._("此订单信息数据有误!")); + } + + ShopOrderBase orderBase = shopOrderBaseService.get(order_id); + if (orderBase == null) { + throw new ApiException(I18nUtil._("此订单详细信息数据有误!")); + } + + // 判断此订单商品是否有正在审核的退款单 + QueryWrapper returnQueryWrapper = new QueryWrapper<>(); + returnQueryWrapper.eq("order_id", order_id) + .eq("return_state_id", StateCode.RETURN_PROCESS_CHECK); + List order_return_rows = find(returnQueryWrapper); + + if (CollUtil.isNotEmpty(order_return_rows)) { + List return_ids = order_return_rows.stream() + .map(ShopOrderReturn::getReturn_id) + .collect(Collectors.toList()); + + QueryWrapper returnItemQueryWrapper = new QueryWrapper<>(); + returnItemQueryWrapper.in("order_item_id", order_item_ids) + .in("return_id", return_ids); + List order_return_items = orderReturnItemService.find(returnItemQueryWrapper); + if (CollUtil.isNotEmpty(order_return_items)) { + throw new ApiException(I18nUtil._("此订单商品正在退款审核!")); + } + } + + // 检查数据权限 + if (!CheckUtil.checkDataRights(user_id, orderBase, ShopOrderBase::getBuyer_user_id)) { + throw new ApiException(ResultCode.FORBIDDEN); + } + + // 获取退款申请参数 + String return_id = orderReturnInputVo.getReturn_id(); + Integer return_reason_id = orderReturnInputVo.getReturn_reason_id() == null ? 0 : orderReturnInputVo.getReturn_reason_id(); + String return_buyer_message = orderReturnInputVo.getReturn_buyer_message(); + Integer store_id = Convert.toInt(orderBase.getStore_id()); + String return_tel = orderReturnInputVo.getReturn_tel(); + + // 手机号验证 + if (StrUtil.isNotBlank(return_tel) && !PhoneUtil.isMobile(return_tel)) { + throw new ApiException(I18nUtil._("手机号输入有误!")); + } + + Date curTime = new Date(); + + // 构建退款单主表信息 + ShopOrderReturn orderReturn = new ShopOrderReturn(); + orderReturn.setReturn_id(return_id); + orderReturn.setOrder_id(order_id); + orderReturn.setBuyer_user_id(user_id); + orderReturn.setBuyer_store_id(buyer_store_id); + orderReturn.setReturn_reason_id(return_reason_id); + orderReturn.setReturn_buyer_message(return_buyer_message); + orderReturn.setStore_id(store_id); + orderReturn.setReturn_refund_amount(BigDecimal.ZERO); + orderReturn.setReturn_commision_fee(BigDecimal.ZERO); + orderReturn.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK); + orderReturn.setReturn_tel(return_tel); + orderReturn.setReturn_year(DateUtil.year(curTime)); // 退单年份-索引查询 + orderReturn.setReturn_month(DateUtil.month(curTime) + 1); // 退单月份-索引查询 + orderReturn.setReturn_day(DateUtil.dayOfMonth(curTime)); // 退单日-索引查询 + orderReturn.setReturn_reason_id(0); // 注意:这里覆盖了前面设置的return_reason_id + orderReturn.setReturn_store_user_id(0); + orderReturn.setReturn_mobile(0L); + orderReturn.setReturn_telephone(""); + orderReturn.setSubsite_id(shopOrderInfo.getSubsite_id()); + + // 构建退款单明细信息 + List shopOrderReturnItems = new ArrayList<>(); + for (OrderReturnItemInputVo returnItemInputVo : orderReturnInputVo.getReturn_items()) { + // 获取订单商品信息 + ShopOrderItem shopOrderItem = shopOrderItemService.get(returnItemInputVo.getOrder_item_id()); + if (shopOrderItem == null) { + throw new ApiException("订单商品不存在,请检查商品ID是否正确: " + returnItemInputVo.getOrder_item_id()); + } + + // 验证是否为当前订单的商品 + if (!order_id.equals(shopOrderItem.getOrder_id())) { + throw new ApiException("商品ID " + returnItemInputVo.getOrder_item_id() + " 不属于订单 " + order_id); + } + + // 获取商品索引信息 + ShopProductIndex shopProductIndex = shopProductIndexService.get(shopOrderItem.getProduct_id()); + if (shopProductIndex == null) { + throw new ApiException("商品信息不存在,请检查商品ID是否正确: " + shopOrderItem.getProduct_id()); + } + + // 检查是否允许退货 + boolean is_denyreturn = ifDenyReturn(shopOrderInfo, shopOrderItem, shopProductIndex); + if (is_denyreturn) { + // 获取更详细的拒绝退货原因 + String denyReason = getDenyReturnReason(shopOrderInfo, shopOrderItem, shopProductIndex); + if (StrUtil.isBlank(denyReason)) { + denyReason = "此商品不允许退货!"; + } + throw new ApiException(denyReason); + } + + // 构建退款单明细 + ShopOrderReturnItem orderReturnItem = new ShopOrderReturnItem(); + + // 检查退款数量是否超过可退数量 + Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); // 订单中该商品的原始购买数量 + Integer order_item_return_agree_num = ObjectUtil.defaultIfNull(shopOrderItem.getOrder_item_return_agree_num(), 0); // 订单中该商品已经同意退货的数量 + Integer available_return_num = order_item_quantity - order_item_return_agree_num; // 当前还可以申请退款的商品数量 + if (available_return_num <= 0) { + throw new ApiException(String.format("商品 %s 已无可退数量", shopOrderItem.getItem_name())); + } + + // 检查退款金额是否合理 + BigDecimal order_item_payment_amount = shopOrderItem.getOrder_item_payment_amount(); + BigDecimal order_item_return_agree_amount = ObjectUtil.defaultIfNull(shopOrderItem.getOrder_item_return_agree_amount(), BigDecimal.ZERO); + BigDecimal available_return_amount = order_item_payment_amount.subtract(order_item_return_agree_amount); + if (available_return_amount.compareTo(BigDecimal.ZERO) <= 0) { + throw new ApiException(String.format("商品 %s 已无可退金额", shopOrderItem.getItem_name())); + } + + String return_item_image = ObjectUtil.defaultIfBlank( + orderReturnInputVo.getRefund_pic(), + orderReturnInputVo.getUpload_img()); + + orderReturnItem.setOrder_item_id(returnItemInputVo.getOrder_item_id()); + orderReturnItem.setOrder_id(order_id); + orderReturnItem.setReturn_item_num(available_return_num); + orderReturnItem.setReturn_item_subtotal(available_return_amount); + orderReturnItem.setReturn_reason_id(return_reason_id); + orderReturnItem.setReturn_item_note(return_buyer_message); + orderReturnItem.setReturn_item_image(return_item_image); + orderReturnItem.setReturn_state_id(StateCode.RETURN_PROCESS_CHECK); + + shopOrderReturnItems.add(orderReturnItem); + } + + // 保存退款单 + if (!addReturnByItem(orderReturn, shopOrderReturnItems)) { + throw new ApiException(ResultCode.FAILED); + } + + data.put("return", orderReturn); + data.put("items", shopOrderReturnItems); + + // 打票机打印退款订单到店(异步执行) + shopStorePrinterService.printShopStoreReturnOrder(return_id); + + // 发送消息通知, 退款提醒商家 + String message_id = "refund-reminder"; + Map args = new HashMap<>(); + args.put("order_id", orderReturn.getReturn_id()); + messageService.sendNoticeMsg(0, store_id, message_id, args); + + // 发送unipush消息 + String title = "您有一个退款的订单,请及时前往后台审核!"; + String content = String.format("订单号:%s 退单号:[%s],时间:%s,请及时前往后台审核!", + order_id, orderReturn.getReturn_id(), + DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss")); + JSONObject payload = JSONUtil.createObj(); + payload.set("category", CommonConstant.PUSH_MSG_CATE_MCH_RETURN_ORDER_LIST); + payload.set("orderId", order_id); + payload.set("returnId", orderReturn.getReturn_id()); + pushMessageService.noticeMerchantEmployeeOrderAction(store_id, order_id, title, content, payload); + + data.put("order_item_ids", order_item_ids); + return CommonResult.success(data); + } + /** * 取消退货 @@ -2287,20 +2487,20 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - log.debug("[是否禁止退货] 订单已超过退货期限,禁止退货,order_id: {}, orderDealTime: {}, withdrawTime: {}", + log.info("[是否禁止退货] 订单已超过退货期限,禁止退货,order_id: {}, orderDealTime: {}, withdrawTime: {}", orderId, orderDealTime, withdrawTime); return true; } } catch (Exception e) { - log.error("[是否禁止退货] 检查订单退货期限时发生异常,禁止退货,order_id: {}", orderId, e); + log.info("[是否禁止退货] 检查订单退货期限时发生异常,禁止退货,order_id: {}", orderId, e); return true; } } @@ -2333,19 +2533,19 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl contractTypeIds = Convert.toList(Integer.class, contractTypeIdsStr); if (contractTypeIds != null && contractTypeIds.contains(StateCode.CONTRACT_TYPE_DENY_RETURN)) { - log.debug("[是否禁止退货] 商品设置了禁止退货标识,禁止退货,order_id: {}, product_id: {}", orderId, productIndex.getProduct_id()); + log.info("[是否禁止退货] 商品设置了禁止退货标识,禁止退货,order_id: {}, product_id: {}", orderId, productIndex.getProduct_id()); return true; } } catch (Exception e) { @@ -2381,8 +2581,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0 (订单商品数量 > 已退货数量) + * 3. 可退金额 > 0 (订单商品金额 > 已同意退款金额) + * + * @param orderItemId 订单子项ID + * @return boolean 是否可以退款 + */ + private boolean ifCanReturnOrderItem(Long orderItemId) { + // 查询订单子项是否存在 + ShopOrderItem orderItem = shopOrderItemService.get(orderItemId); + return ifCanReturnOrderItem(orderItem); + } + + /** + * 判断订单子项是否可以退款 + * 条件: + * 1. 订单子项必须存在 + * 2. 可退数量 > 0 (订单商品数量 > 已退货数量) + * 3. 可退金额 > 0 (订单商品金额 > 已同意退款金额) + * + * @param orderItem 订单子项 + * @return boolean 是否可以退款 + */ + private boolean ifCanReturnOrderItem(ShopOrderItem orderItem) { + // 如果订单子项不存在,不能退款 + if (orderItem == null) { + log.info("订单子项为空,无法退款"); + return false; + } + + // 获取订单子项的相关字段,使用默认值避免空指针 + Integer orderItemQuantity = ObjectUtil.defaultIfNull(orderItem.getOrder_item_quantity(), 0); + Integer orderItemReturnNum = ObjectUtil.defaultIfNull(orderItem.getOrder_item_return_num(), 0); + BigDecimal orderItemAmount = ObjectUtil.defaultIfNull(orderItem.getOrder_item_amount(), BigDecimal.ZERO); + BigDecimal orderItemReturnAgreeAmount = ObjectUtil.defaultIfNull(orderItem.getOrder_item_return_agree_amount(), BigDecimal.ZERO); + + // 记录调试信息 + log.info("订单子项退款检查 - 商品ID: {}, 订单数量: {}, 已退数量: {}, 商品金额: {}, 已同意退款金额: {}", + orderItem.getProduct_id(), orderItemQuantity, orderItemReturnNum, orderItemAmount, orderItemReturnAgreeAmount); + + // 判断是否可以退款: + // 1. 可退数量 > 0 (订单商品数量 > 已退货数量) + boolean canReturnQuantity = orderItemQuantity > orderItemReturnNum; + // 2. 可退金额 > 0 (订单商品金额 > 已同意退款金额) + boolean canReturnAmount = orderItemAmount.compareTo(orderItemReturnAgreeAmount) > 0; + + log.info("退款条件检查结果 - 可退数量: {}, 可退金额: {}", canReturnQuantity, canReturnAmount); + + return canReturnQuantity && canReturnAmount; + } + + } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index b4e5af13..ac0eaf46 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -269,12 +269,12 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 3. 获取或初始化商家配送信息 ShopStoreSameCityTransportBase transportBase = shopStoreSameCityTransportBaseService - .getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + .getShopStoreSameCityTransportBaseById(Long.valueOf(storeId), CommonConstant.Disable2); if (transportBase == null) { // 如果没有商家配送运费设置,则初始化 shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId); - transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId), CommonConstant.Disable2); } if (transportBase == null) { @@ -963,7 +963,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return new ThirdApiRes().fail(1003, "缺少店铺 Id!"); } - ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(storeId); + ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(storeId, CommonConstant.Disable2); if (shopStoreSameCityTransportBase == null) { logger.error("无法获取顺丰店铺 Id!"); return new ThirdApiRes().fail(1003, "无法获取店铺Id"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java index 8ef5668c..42178dcb 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreInfoController.java @@ -5,10 +5,12 @@ import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.modules.store.ShopStoreInfo; import com.suisung.mall.common.service.impl.BaseControllerImpl; +import com.suisung.mall.shop.base.service.AccountBaseConfigService; import com.suisung.mall.shop.store.service.ShopStoreInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -30,6 +32,12 @@ public class ShopStoreInfoController extends BaseControllerImpl { @Autowired private ShopStoreInfoService shopStoreInfoService; + + @Lazy + @Autowired + private AccountBaseConfigService accountBaseConfigService; + + /** * 分页列表查询 * @@ -83,13 +91,13 @@ public class ShopStoreInfoController extends BaseControllerImpl { /** * 获取店铺的内部运费 shopping_fee_inner (远程调用用途) * - * @param store_id + * @param order_id * @return */ @ApiOperation(value = "获取店铺的内部运费 shopping_fee_inner", notes = "获取店铺的内部运费 shopping_fee_inner (远程调用用途)") @RequestMapping(value = "/shopping-fee-inner", method = RequestMethod.POST) - public Integer storeShoppingFeeInner(@RequestParam(name = "store_id") Integer store_id) { - return shopStoreInfoService.getStoreShippingFeeInner(store_id); + public Integer storeShoppingFeeInner(@RequestParam(name = "order_id") String order_id) { + return accountBaseConfigService.getInnerMinDeliveryFee(order_id); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java index 4855ecaa..cd3b2ff7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreSameCityTransportBaseController.java @@ -10,8 +10,6 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; - @Api(tags = "同城配送运费设置控制器") @RestController @RequestMapping("/admin/shop/store/same-city-transport") @@ -25,8 +23,8 @@ public class ShopStoreSameCityTransportBaseController { @ApiOperation(value = "获取同城配送运费设置详情", notes = "获取同城配送运费设置详情") @RequestMapping(value = "/detail", method = {RequestMethod.GET}) - public CommonResult shopStoreSameCityTransportBaseDetail() { - return transportBaseService.ShopStoreSameCityTransportBaseDetail(); + public CommonResult shopStoreSameCityTransportBaseDetail(@RequestParam(name = "store_id", required = false, defaultValue = "0") Long store_id) { + return transportBaseService.ShopStoreSameCityTransportBaseDetail(store_id); } @ApiOperation(value = "保存(新增或修改)同城配送运费设置", notes = "保存(新增或修改)同城配送运费设置") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java index c7cb57b3..de83613e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/mobile/ShopStoreSameCityTransportBaseMobileController.java @@ -10,8 +10,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; - @Api(tags = "同城配送运费设置控制器") @RestController @RequestMapping("/mobile/shop/store/same-city-transport") @@ -22,7 +20,7 @@ public class ShopStoreSameCityTransportBaseMobileController { @ApiOperation(value = "下单前检测同城订单配送是否符合要求", notes = "下单前检测同城订单配送是否符合要求") @RequestMapping(value = "/check/same-city/delivery", method = {RequestMethod.POST}) - public CommonResult checkSameCityDelivery(@RequestParam(name = "store_id", defaultValue = "0") Integer storeId) { - return transportBaseService.ShopStoreSameCityTransportBaseDetail(); + public CommonResult checkSameCityDelivery(@RequestParam(name = "store_id", required = false, defaultValue = "0") Long store_id) { + return transportBaseService.ShopStoreSameCityTransportBaseDetail(store_id); } } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java index bbd76846..1ceef44b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportBaseService.java @@ -21,9 +21,10 @@ public interface ShopStoreSameCityTransportBaseService { /** * 获取同城配送设置详情信息 * + * @param storeId * @return */ - CommonResult ShopStoreSameCityTransportBaseDetail(); + CommonResult ShopStoreSameCityTransportBaseDetail(Long storeId); /** * 保存或更新同城配送各项设置 @@ -52,17 +53,19 @@ public interface ShopStoreSameCityTransportBaseService { * 根据店铺 Id 获取同城配送设置详情信息 * * @param storeId + * @param isPlatform 1-平台 2-店铺 * @return */ - ShopStoreSameCityTransportBaseDTO getShopStoreSameCityTransportBaseDTOById(Long storeId); + ShopStoreSameCityTransportBaseDTO getShopStoreSameCityTransportBaseDTOById(Long storeId, Integer isPlatform); /** * 根据店铺Id获取同城配送基础运费记录 * * @param storeId + * @param isPlatform 1-平台 2-店铺 * @return */ - ShopStoreSameCityTransportBase getShopStoreSameCityTransportBaseById(Long storeId); + ShopStoreSameCityTransportBase getShopStoreSameCityTransportBaseById(Long storeId, Integer isPlatform); /** * 保存同城配送基础设置(存在更新,不存在新增) @@ -96,4 +99,25 @@ public interface ShopStoreSameCityTransportBaseService { */ SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean canThrow); + /** + * 平台计算同城订单的内部配送费(仅仅作用于平台内部配送费计算,商家配送费忽略此方法,只对下单成功的订单起效果) + * + * @param orderId 订单ID + * @return 配送费,单位为分 + */ + Integer computeSameCityInnerDeliveryFeeByOrderId(String orderId); + + /** + * 平台计算同城订单的内部配送费(仅仅作用于平台内部配送费计算,商家配送费忽略此方法,下单前可以查询) + * + * @param storeId 店铺Id + * @param orderLongitude (订单送达地)目的地经度 + * @param orderLatitude (订单送达地)目的地维度 + * @param orderWeightGram 订单重量(单位克) + * @param orderProductAmount 订单商品原价金额 + * @param orderDiscountAmount 订单商品折扣金额(订单原价减去每个商品折扣费) + * @param orderPayAmount 订单实际支付金额(折扣金额-优惠券-积分扣-人工干预扣费),不包含运费 + * @return 配送费,单位为分 + */ + Integer computeSameCityInnerDeliveryFee(Integer storeId, String orderLongitude, String orderLatitude, Integer orderWeightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount); } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportService.java index 4c5a399d..137cdd80 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSameCityTransportService.java @@ -22,13 +22,21 @@ public interface ShopStoreSameCityTransportService { */ CommonResult deleteShopStoreSameCityTransport(Long transportId); + /** + * 根据店铺 Id 获取同城配送扩展设置列表 + * + * @param storeId + * @return + */ + List selectShopStoreSameCityTransportList(Long storeId); + /** * 根据同城配送基础配置自增 Id 获取同城配送扩展设置列表 * * @param transportBaseId * @return */ - List selectShopStoreSameCityTransportList(Long transportBaseId); + List selectShopStoreSameCityTransportListByTransportBaseId(Long transportBaseId); /** * 保存同城配送扩展设置列表(存在就更新,不存在就新增) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index 4c541f73..14fb2e54 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -1564,7 +1564,15 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl - * 店铺内部运费,单位(分)0-使用平台的内部运费;>0 使用店铺的内部运费 + * 店铺内部运费,单位(分)使用店铺的内部运费<=0 的时候 * * @param storeId 店铺ID * @return 内部运费,单位分 @@ -147,7 +147,6 @@ public class ShopStoreInfoServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", storeId).select("shopping_fee_inner"); ShopStoreInfo shopStoreInfo = getOne(queryWrapper); - if (shopStoreInfo == null || CheckUtil.isEmpty(shopStoreInfo.getShopping_fee_inner())) { return 0; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java index 46ba9523..9d2ab37e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportBaseServiceImpl.java @@ -25,13 +25,16 @@ import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransport; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.pojo.dto.DeliveryFeeResultDTO; +import com.suisung.mall.common.pojo.dto.OrderCacDeliveryFeeDTO; import com.suisung.mall.common.pojo.dto.SameCityDeliveryFeeRespDTO; import com.suisung.mall.common.pojo.dto.ShopStoreSameCityTransportBaseDTO; +import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CommonUtil; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.PositionUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.base.service.AccountBaseConfigService; +import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.store.mapper.ShopStoreSameCityTransportBaseMapper; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; @@ -64,6 +67,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl pair = saveOrUpdateShopStoreSameCityTransportBase(transportBase); - - // 新增或更新同城配送扩展设置列表 - shopStoreSameCityTransportBaseDTO.setTransportBase(transportBase); - shopStoreSameCityTransportBaseDTO.rebuildTransportList(); - shopStoreSameCityTransportService.saveOrUpdateShopStoreSameCityTransportList(shopStoreSameCityTransportBaseDTO.getTransportList()); - - if (pair.getFirst() > 0) { - return CommonResult.success(null, pair.getSecond()); + // 保存或更新同城配送基础设置 + Pair saveResult = saveOrUpdateShopStoreSameCityTransportBase(transportBase); + if (saveResult.getFirst() <= 0) { + logger.error("保存或更新同城配送基础设置失败, storeId={}, errorMsg={}", storeId, saveResult.getSecond()); + return CommonResult.failed(saveResult.getSecond()); } - return CommonResult.failed(pair.getSecond()); + // 更新DTO中的基础设置和运输列表 + shopStoreSameCityTransportBaseDTO.setTransportBase(transportBase); + shopStoreSameCityTransportBaseDTO.rebuildTransportList(); + + // 保存或更新同城配送扩展设置列表 + int updateCount = shopStoreSameCityTransportService.saveOrUpdateShopStoreSameCityTransportList(shopStoreSameCityTransportBaseDTO.getTransportList()); + logger.debug("保存或更新同城配送扩展设置列表完成, storeId={}, 更新条数={}", storeId, updateCount); + + logger.info("成功保存或更新店铺 {} 的同城配送设置", storeId); + return CommonResult.success(shopStoreSameCityTransportBaseDTO, saveResult.getSecond()); } + /** * 店铺主营商品类型 * @@ -225,58 +282,93 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(transportBase.getStore_id()); + // 获取配送扩展设置列表 + List transportList; + if (CheckUtil.isEmpty(transportBase.getTransport_base_id())) { + transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(transportBase.getStore_id()); + } else { + transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportListByTransportBaseId(transportBase.getTransport_base_id()); + } shopStoreSameCityTransportBaseDTO.setTransportList(transportList); + logger.debug("成功获取店铺 {} 的同城配送设置详情", storeId); return shopStoreSameCityTransportBaseDTO; } + /** * 根据店铺Id获取同城配送基础运费记录 * @@ -284,25 +376,46 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 2) { + isPlatform = 2; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", storeId); + queryWrapper.eq("is_platform", isPlatform); queryWrapper.eq("status", CommonConstant.Enable); return getOne(queryWrapper); } + /** + * 保存或更新同城配送基础设置 + * 注意:同一个 store_id + is_platform + status=Enable 的组合只能存在一条记录 + * + * @param transportBase 同城配送基础设置实体 + * @return 操作结果 Pair<记录ID, 操作消息> + */ public Pair saveOrUpdateShopStoreSameCityTransportBase(ShopStoreSameCityTransportBase transportBase) { try { + // 参数校验 if (transportBase == null || transportBase.getStore_id() == null || transportBase.getStore_id() <= 0) { + log.warn("保存或更新同城配送基础信息参数校验失败: transportBase={}", transportBase); return Pair.of(0L, "缺少店铺Id必要参数!"); } - // 设置默认值 + // 校验并设置平台标识默认值 + Integer isPlatform = transportBase.getIs_platform(); + if (isPlatform == null || isPlatform < 0 || isPlatform > 2) { + isPlatform = CommonConstant.Disable2; // 默认为商户级别 + transportBase.setIs_platform(isPlatform); + } + + // 设置默认值 - 确保数值合理性 if (transportBase.getDistance_base() == null || transportBase.getDistance_base() < 0) { transportBase.setDistance_base(0); } @@ -325,38 +438,58 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", transportBase.getStore_id()); + queryWrapper.eq("is_platform", transportBase.getIs_platform()); + queryWrapper.eq("status", CommonConstant.Enable); + + // 先尝试查找已存在的记录 ShopStoreSameCityTransportBase exist = getOne(queryWrapper); + Date now = new Date(); if (exist == null) { - // 新增 + // 新增操作 + log.debug("开始新增同城配送基础信息, storeId={}, isPlatform={}", transportBase.getStore_id(), transportBase.getIs_platform()); transportBase.setCreated_by(transportBase.getUpdated_by()); + transportBase.setCreated_at(now); + transportBase.setUpdated_at(now); + transportBase.setStatus(CommonConstant.Enable); // 确保状态为启用 + if (add(transportBase)) { // 确保获取到ID Long transportBaseId = transportBase.getTransport_base_id(); if (transportBaseId == null || transportBaseId <= 0) { - // 补偿机制:若transportBase.getTransport_base_id()==null,重新查询数据 + // 补偿机制:若新增后ID仍为空,重新查询获取ID + log.debug("新增后ID为空,重新查询获取ID, storeId={}", transportBase.getStore_id()); exist = getOne(queryWrapper); if (exist != null) { transportBaseId = exist.getTransport_base_id(); } } + log.info("新增同城配送基础信息成功, transportBaseId={}, storeId={}", transportBaseId, transportBase.getStore_id()); return Pair.of(transportBaseId, "添加成功!"); } else { + log.error("新增同城配送基础信息失败, storeId={}", transportBase.getStore_id()); return Pair.of(0L, "添加失败!"); } } else { - // 更新 + // 更新操作 - 确保唯一性约束 + log.debug("开始更新同城配送基础信息, transportBaseId={}, storeId={}", exist.getTransport_base_id(), transportBase.getStore_id()); transportBase.setTransport_base_id(exist.getTransport_base_id()); + transportBase.setUpdated_at(now); + transportBase.setStatus(CommonConstant.Enable); // 确保状态为启用 + if (updateById(transportBase)) { + log.info("更新同城配送基础信息成功, transportBaseId={}, storeId={}", transportBase.getTransport_base_id(), transportBase.getStore_id()); return Pair.of(transportBase.getTransport_base_id(), "更新成功!"); } else { + log.error("更新同城配送基础信息失败, transportBaseId={}, storeId={}", transportBase.getTransport_base_id(), transportBase.getStore_id()); return Pair.of(0L, "更新失败!"); } } } catch (Exception e) { - log.error("保存或更新同城配送基础信息异常: ", e); + log.error("保存或更新同城配送基础信息异常, storeId={}", transportBase != null ? transportBase.getStore_id() : "unknown", e); return Pair.of(0L, "系统内部错误"); } } @@ -406,6 +539,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 2) { + isPlatform = 2; + } + transportBase.setIs_platform(isPlatform); transportBase.setStore_id(Convert.toLong(storeBase.getStore_id())); transportBase.setStore_longitude(storeBase.getStore_longitude()); transportBase.setStore_latitude(storeBase.getStore_latitude()); @@ -461,7 +599,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) { // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 - times = NumberUtil.div(diffWeightKg, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP); + times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); } deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times)); @@ -690,4 +827,213 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId)); + + if (CollUtil.isEmpty(transportList)) { + // 没有配送范围规则的时候,直接以基础配送费来配送 + return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue(); + } + + // 判断配送范围和起送金额条件 + String canNotDeliveryReason = ""; + boolean canDelivery = false; + + // 优先处理距离和金额都满足的规则 + for (ShopStoreSameCityTransport transport : transportList) { + // 判断订单距离是否在配送范围内 + if (transport.getMax_delivery_radius() >= distance) { + // 距离在配送范围内,判断金额是否符合起配金额额度 + boolean moneyPassed = false; + if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0; + } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0; + } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) { + moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0; + } + + // 距离和金额都满足条件 + if (moneyPassed) { + canDelivery = true; + break; + } + } + } + + // 如果没有找到完全满足条件的规则,再详细检查找出失败原因 + if (!canDelivery) { + for (ShopStoreSameCityTransport transport : transportList) { + // 判断订单距离是否在配送范围内 + if (transport.getMax_delivery_radius() < distance) { + // 记录距离不满足的原因 + canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。"; + } else { + // 距离在配送范围内,判断金额是否符合起配金额额度 + if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) { + if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount); + canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) { + if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount); + canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) { + if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) { + BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount); + canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney); + } else { + canDelivery = true; + break; + } + } + } + } + } + + // 如果仍然不能配送,记录日志并返回0 + if (!canDelivery) { + logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason); + return 0; + } + + // 额外配送费计算 + // 每增加一个距离累加运费 + if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) { + // 实际配送距离超出基础距离,单位km + BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000))); + // 倍数 + BigDecimal times = BigDecimal.ZERO; + if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) { + // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 + times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP); + } + + // 超过基础运费距离后,累加上运费 + deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times)); + } + + // 每增加一个重量累加运费(重量暂时忽略,配置的时候设置0) + if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) { + // 实际配送重量超出基础重量,单位kg + BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000))); + // 倍数 + BigDecimal times = BigDecimal.ZERO; + if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) { + // 末尾非零进位,比如:2.1将是3, 2.0将是2,2.001将是3 + times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); // 修正:应该除以weight_increase_kg而不是distance_increase_km + } + + deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times)); + } + + // 返回单位为分的配送费 + return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue(); + } + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportServiceImpl.java index 1854c561..fc431599 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSameCityTransportServiceImpl.java @@ -62,6 +62,31 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl selectShopStoreSameCityTransportListByTransportBaseId(Long transportBaseId) { + if (transportBaseId == null || transportBaseId <= 0) { + return Collections.emptyList(); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("transport_base_id", transportBaseId); + queryWrapper.eq("status", CommonConstant.Enable); + queryWrapper.orderByAsc("transport_id"); + + List shopStoreSameCityTransportList = list(queryWrapper); + if (CollectionUtil.isEmpty(shopStoreSameCityTransportList)) { + shopStoreSameCityTransportList = Collections.emptyList(); + } + + return shopStoreSameCityTransportList; + } + /** * 根据同城配送基础配置自增 Id 获取同城配送扩展设置列表 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java index 2487ec1c..4dc94d45 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/user/service/impl/ShopUserCartServiceImpl.java @@ -2644,7 +2644,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl (od.order_discount_amount + od.voucher_price + od.order_points_fee + od.order_adjust_fee) as total_discount_amount, - - (ob.order_product_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-order_shipping_fee_inner+od.packing_fee) + + (od.order_item_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-order_shipping_fee_inner-lkl_fee+od.packing_fee) as order_income_amount, - (od.platform_fee+lkl_fee) as platform_fee, + od.platform_fee, od.packing_fee, od.order_message, sb.store_id, diff --git a/mall-shop/src/main/resources/templates/order_printer.txt b/mall-shop/src/main/resources/templates/order_printer.txt index 2b4ec44c..781f22b7 100644 --- a/mall-shop/src/main/resources/templates/order_printer.txt +++ b/mall-shop/src/main/resources/templates/order_printer.txt @@ -62,7 +62,7 @@ 订单编号:${order_id}
订单来源:微信小程序
支付方式:微信支付
-配送来源:顺丰同城
+配送来源:${deliver_type_name!'顺丰同城'}
付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}
--------------------------------
商品名称 数量 金额
@@ -103,4 +103,4 @@ ${store_name}
--------------------------------
#${order_pickup_num_str}
买家备注:${order_message!'-'}
配送时间:${payment_time?string('MM-dd HH:mm')}~${delivery_time?string('HH:mm')}
--------------------------------
订单编号:${order_id}
订单来源:微信小程序
支付方式:微信支付
配送来源:顺丰同城
付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}
--------------------------------
商品名称 数量 金额
--------------------------------
<#list order_items as item>${item.s_name}${item.s_quantity}${item.s_amount}
<#if item.s_name_segs??><#list item.s_name_segs as seg>${seg}
<#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}
--------------------------------
商品总件数:${order_items_count!0}
商品总额:¥${order_product_amount?string('0.00')}
运费:¥${order_shipping_fee?string('0.00')}
<#if packing_fee?? && (packing_fee > 0)>打包费:¥${packing_fee?string('0.00')}
优惠金额:-¥${(quanyi!0)?string('0.00')}
实付金额:¥${order_payment_amount?string('0.00')}
<#if seller_message?default("")?trim?length gt 1>--------------------------------
商家备注:${seller_message!'-'}
--------------------------------
收货人:${buyer_user_name!''}
收货人手机:${da_mobile!'-'}
收货地址:${da_province!'-'}${da_city!'-'}${da_address!'-'}
--------------------------------
门店:${store_name}
门店电话:${store_tel!'-'}
收银员:${cashier!'店长'}
第三版带变量的模版(有预约订单) -<#if is_booking_order>【预约订单】
${store_name}
--------------------------------
#${order_pickup_num_str}
买家备注:${order_message!'-'}
配送时间:${payment_time?string('MM-dd HH:mm')}~${delivery_time?string('HH:mm')}
--------------------------------
订单编号:${order_id}
订单来源:微信小程序
支付方式:微信支付
配送来源:顺丰同城
付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}
--------------------------------
商品名称 数量 金额
--------------------------------
<#list order_items as item>${item.s_name}${item.s_quantity}${item.s_amount}
<#if item.s_name_segs??><#list item.s_name_segs as seg>${seg}
<#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}

--------------------------------
商品总件数:${order_items_count!0}
商品总额:¥${order_product_amount?string('0.00')}
运费:¥${order_shipping_fee?string('0.00')}
<#if packing_fee?? && (packing_fee > 0)>打包费:¥${packing_fee?string('0.00')}
优惠金额:-¥${(quanyi!0)?string('0.00')}
实付金额:¥${order_payment_amount?string('0.00')}
<#if seller_message?default("")?trim?length gt 1>--------------------------------
商家备注:${seller_message!'-'}
--------------------------------
收货人:${buyer_user_name!''}
收货人手机:${da_mobile!'-'}
收货地址:${da_province!'-'}${da_city!'-'}${da_address!'-'}
--------------------------------
门店:${store_name}
门店电话:${store_tel!'-'}
收银员:${cashier!'店长'}
\ No newline at end of file +<#if is_booking_order>【预约订单】
${store_name}
--------------------------------
#${order_pickup_num_str}
买家备注:${order_message!'-'}
配送时间:${payment_time?string('MM-dd HH:mm')}~${delivery_time?string('HH:mm')}
--------------------------------
订单编号:${order_id}
订单来源:微信小程序
支付方式:微信支付
配送来源:${deliver_type_name!'顺丰同城'}
付款时间:${payment_time?string('yyyy-MM-dd HH:mm:ss')}
--------------------------------
商品名称 数量 金额
--------------------------------
<#list order_items as item>${item.s_name}${item.s_quantity}${item.s_amount}
<#if item.s_name_segs??><#list item.s_name_segs as seg>${seg}
<#if item.product_sn?default("")?trim?length gt 1>${item.product_sn}

--------------------------------
商品总件数:${order_items_count!0}
商品总额:¥${order_product_amount?string('0.00')}
运费:¥${order_shipping_fee?string('0.00')}
<#if packing_fee?? && (packing_fee > 0)>打包费:¥${packing_fee?string('0.00')}
优惠金额:-¥${(quanyi!0)?string('0.00')}
实付金额:¥${order_payment_amount?string('0.00')}
<#if seller_message?default("")?trim?length gt 1>--------------------------------
商家备注:${seller_message!'-'}
--------------------------------
收货人:${buyer_user_name!''}
收货人手机:${da_mobile!'-'}
收货地址:${da_province!'-'}${da_city!'-'}${da_address!'-'}
--------------------------------
门店:${store_name}
门店电话:${store_tel!'-'}
收银员:${cashier!'店长'}
\ No newline at end of file diff --git a/pom.xml b/pom.xml index 68a9333d..47bd110b 100644 --- a/pom.xml +++ b/pom.xml @@ -539,11 +539,6 @@ - - org.apache.maven.plugins - maven-dependency-plugin - - com.spotify docker-maven-plugin @@ -571,7 +566,9 @@ build - + + + ${docker.registry}/mall/${project.artifactId}:${project.version} @@ -592,7 +589,7 @@ true ${project.version} - + latest @@ -609,6 +606,7 @@ +