From 80563a0785c885d53aa3a212db428e4982e48255 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 14 Apr 2025 10:56:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AD=97=E6=AE=B5=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/esign/EsignContract.java | 3 + .../modules/lakala/LklLedgerMember.java | 1 + .../modules/lakala/LklLedgerReceiver.java | 1 + .../common/modules/merch/ShopMerchEntry.java | 58 ++- .../common/utils/RestTemplateHttpUtil.java | 51 ++- .../mall/common/utils/StringUtils.java | 26 ++ .../suisung/mall/common/utils/UploadUtil.java | 48 +++ .../service/impl/LakalaPayServiceImpl.java | 9 +- .../impl/LklLedgerMemberServiceImpl.java | 5 +- .../impl/EsignContractServiceImpl.java | 1 + .../lakala/service/impl/CommonService.java | 337 +++++++++++++++++- .../store/service/ShopMerchEntryService.java | 9 + .../impl/ShopMerchEntryServiceImpl.java | 18 + .../impl/ShopStoreBaseServiceImpl.java | 109 +++--- 14 files changed, 611 insertions(+), 65 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/esign/EsignContract.java b/mall-common/src/main/java/com/suisung/mall/common/modules/esign/EsignContract.java index 741fdf42..03779dfc 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/esign/EsignContract.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/esign/EsignContract.java @@ -71,6 +71,9 @@ public class EsignContract implements Serializable { @ApiModelProperty(value = "店铺编号") private String store_id; + @ApiModelProperty(value = "代理商ID(esign_platform_info表id),0-表示只有平台方,没有代理商") + private Long distributor_id; + @ApiModelProperty(value = "签署流程ID") private String sign_flow_id; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMember.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMember.java index 8a91802d..9be106b4 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMember.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMember.java @@ -45,6 +45,7 @@ public class LklLedgerMember implements Serializable { private String audit_status; private String audit_status_text; private String remark; + private Long mch_id; private String version; private Date created_at; private Date updated_at; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java index 434cdfc7..43ffbb9e 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java @@ -48,6 +48,7 @@ public class LklLedgerReceiver implements Serializable { private String acct_clear_bank_code; private String attach_list; private String settle_type; + private Long platform_id; private String version; private Integer status; private Date created_at; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/merch/ShopMerchEntry.java b/mall-common/src/main/java/com/suisung/mall/common/modules/merch/ShopMerchEntry.java index 8dce3616..15376d3d 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/merch/ShopMerchEntry.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/merch/ShopMerchEntry.java @@ -42,6 +42,12 @@ public class ShopMerchEntry implements Serializable { @ApiModelProperty(value = "商家店铺的名称") private String store_name; + @ApiModelProperty(value = "商家店铺LOGO图片") + private String store_logo; + + @ApiModelProperty(value = "商家店铺招牌图片") + private String store_banner; + @ApiModelProperty(value = "入驻商家的联系人姓名") private String contact_name; @@ -69,6 +75,12 @@ public class ShopMerchEntry implements Serializable { @ApiModelProperty(value = "入驻商家店铺维度") private String store_latitude; + @ApiModelProperty(value = "店铺经营介绍") + private String sales_info; + + @ApiModelProperty(value = "邮箱") + private String email; + @ApiModelProperty(value = "入驻商家店铺所在的省") private String province_id; @@ -78,6 +90,9 @@ public class ShopMerchEntry implements Serializable { @ApiModelProperty(value = "入驻商家店铺所在的县区") private String county_id; + @ApiModelProperty(value = "店铺地区 省份/城市/乡县") + private String store_area; + @ApiModelProperty(value = "入驻商家店铺的详细地址") private String store_address; @@ -108,6 +123,12 @@ public class ShopMerchEntry implements Serializable { @ApiModelProperty(value = "入驻商家许可证图片的存储路径") private String license_image; + @ApiModelProperty(value = "商家营业执照有效开始时间") + private String biz_license_period_begin; + + @ApiModelProperty(value = "商家营业执照有效结束时间") + private String biz_license_period_end; + @ApiModelProperty(value = "入驻商家的法人姓名") private String legal_person_name; @@ -123,21 +144,54 @@ public class ShopMerchEntry implements Serializable { @ApiModelProperty(value = "入驻商家法人身份证反面图片的存储路径") private String legal_person_id_images2; + @ApiModelProperty(value = "企业法人身份证居住地址") + private String legal_person_id_addr; + + @ApiModelProperty(value = "企业法人身份证有效期开始时间") + private String legal_person_id_period_begin; + + @ApiModelProperty(value = "企业法人身份证有效期结束时间") + private String legal_person_id_period_end; + @ApiModelProperty(value = "个人入驻时的身份证号码") private String individual_id_number; - @ApiModelProperty(value = "个人入驻时身份证正面图片的存储路径") + @ApiModelProperty(value = "个人身份证姓名") + private String individual_id_name; + + @ApiModelProperty(value = "个人身份证正面图片的存储路径") private String individual_id_images; - @ApiModelProperty(value = "个人入驻时身份证反面图片的存储路径") + @ApiModelProperty(value = "个人身份证反面图片的存储路径") private String individual_id_images2; + @ApiModelProperty(value = "个人身份证居住地址") + private String individual_id_addr; + + @ApiModelProperty(value = "个人身份证有效期开始时间") + private String individual_id_period_begin; + + @ApiModelProperty(value = "个人身份证有效期结束时间") + private String individual_id_period_end; + + @ApiModelProperty(value = "入驻商家的开户⾏号") + private String bank_code; + @ApiModelProperty(value = "入驻商家的开户银行") private String bank_name; @ApiModelProperty(value = "入驻商家开户银行的支行名称") private String bank_branch_name; + @ApiModelProperty(value = "结算账户清算⾏号") + private String clearing_bank_code; + + @ApiModelProperty(value = "结算账户银行卡图片") + private String bank_image; + + @ApiModelProperty(value = "结算银行地区,格式: 省份/城市/乡县") + private String bank_area; + @ApiModelProperty(value = "入驻商家的收款账户号码") private String account_number; diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java index 15491431..aa50bcfa 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java @@ -8,6 +8,8 @@ package com.suisung.mall.common.utils; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -54,16 +56,15 @@ public class RestTemplateHttpUtil { * @param 泛型类型 * @return 响应对象 */ - public static T sendGetWithHeader(String url, Map headers, Class responseType) { + public static ResponseEntity sendGetWithHeader(String url, JSONObject headers, Class responseType) { HttpHeaders httpHeaders = new HttpHeaders(); if (headers != null) { - for (Map.Entry entry : headers.entrySet()) { - httpHeaders.add(entry.getKey(), entry.getValue()); + for (Map.Entry entry : headers.entrySet()) { + httpHeaders.add(entry.getKey(), (String) entry.getValue()); } } HttpEntity entity = new HttpEntity<>(httpHeaders); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, entity, responseType); - return response.getBody(); + return restTemplate.exchange(url, HttpMethod.GET, entity, responseType); } @@ -92,11 +93,12 @@ public class RestTemplateHttpUtil { /** * 发送带 header 的 POST form-data 请求 - * @param url 请求的 URL - * @param headers 请求头 - * @param formData form-data 数据 + * + * @param url 请求的 URL + * @param headers 请求头 + * @param formData form-data 数据 * @param responseType 响应的类型 - * @param 泛型类型 + * @param 泛型类型 * @return 响应对象 */ public static T sendPostFormData(String url, Map headers, Map formData, Class responseType) { @@ -120,4 +122,35 @@ public class RestTemplateHttpUtil { return response.getBody(); } + /** + * 发送带 header 的 POST form-data 请求 + * + * @param url 请求的 URL + * @param headers 请求头 + * @param formData form-data 数据 + * @param responseType 响应的类型 + * @param 泛型类型 + * @return 响应对象 + */ + public static ResponseEntity sendPostFormDataBackEntity(String url, JSONObject headers, JSONObject formData, Class responseType) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + httpHeaders.add(entry.getKey(), (String) entry.getValue()); + } + } + + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + if (formData != null) { + for (Map.Entry entry : formData.entrySet()) { + multiValueMap.add(entry.getKey(), JSONUtil.toJsonStr(entry.getValue())); + } + } + + HttpEntity> entity = new HttpEntity<>(multiValueMap, httpHeaders); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, responseType); + return response; + } + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java index 3077e06b..eba58e3e 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/StringUtils.java @@ -294,6 +294,12 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { return base64.substring(0, length); } + /** + * 去除省市区,保留详细地址 + * + * @param fullAddress + * @return + */ public static String removeProvinceCityDistrict(String fullAddress) { if (StringUtils.isBlank(fullAddress)) { return ""; @@ -328,6 +334,26 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils { } } + /** + * 去除省市区,保留详细地址 + * + * @param fullAddress + * @return + */ + public static String removeProvinceCityDistrict2(String fullAddress) { + // 定义省市县区的关键字 + String[] keywords = {"省", "市", "自治区", "特别行政区", "地区", "盟", "自治州", "县", "区", "自治县", "旗", "自治旗", "县级市"}; + + for (String keyword : keywords) { + int index = fullAddress.indexOf(keyword); + if (index != -1) { + // 若找到关键字,截取关键字之后的部分 + fullAddress = fullAddress.substring(index + keyword.length()); + } + } + return fullAddress; + } + /** * 判断字符串是否是XML或JSON格式 * diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/UploadUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/UploadUtil.java index 7352a135..5fe43aad 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/UploadUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/UploadUtil.java @@ -8,8 +8,12 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -270,4 +274,48 @@ public class UploadUtil { } } + /** + * 下载图片到本地 + * + * @param imageUrl 图片的URL地址 + * @return 下载后的文件对象 + * @throws IOException 如果下载失败 + */ + public static File downloadImageFromUrl(String imageUrl) { + try { + URL url = new URL(imageUrl); + Path tempFilePath = Files.createTempFile("image", "." + getFileExtension(imageUrl)); + try (InputStream in = url.openStream()) { + Files.copy(in, tempFilePath, StandardCopyOption.REPLACE_EXISTING); + } + return tempFilePath.toFile(); + } catch (IOException e) { + System.err.println("下载图片时发生错误: " + e.getMessage()); + return null; + } + } + + // 合并从文件路径和 URL 获取文件后缀的方法 + public static String getFileExtension(String input) { + if (input == null) { + return null; + } + String path; + try { + // 尝试将输入解析为 URL + URL url = new URL(input); + URI uri = url.toURI(); + path = uri.getPath(); + } catch (Exception e) { + // 如果解析失败,将输入当作文件路径处理 + path = input; + } + int lastIndex = path.lastIndexOf('.'); + if (lastIndex == -1 || lastIndex == path.length() - 1) { + return ""; + } + return path.substring(lastIndex + 1); + } + + } diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java index 8f811241..7c7c0e2b 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java @@ -73,6 +73,8 @@ public class LakalaPayServiceImpl implements LakalaPayService { private String orgCode; @Value("${project.domain}") private String projectDomain; + @Value("${spring.profiles.active}") + private String profile; @Lazy @@ -427,6 +429,9 @@ public class LakalaPayServiceImpl implements LakalaPayService { req.setSplitEntrustFilePath(splitEntrustFilePath); // req.setSplitEntrustFilePath("G1/M00/06/64/CrFdEmBQc-aAGc_XAAAiIbS3WIE960.pdf"); + if (profile.equals("prod")) { + projectDomain = projectDomain + "/api"; + } String retUrl = projectDomain + "/mobile/pay/lakala/ledger/applyLedgerMerNotify"; req.setRetUrl(retUrl); @@ -476,7 +481,7 @@ public class LakalaPayServiceImpl implements LakalaPayService { String authorization = request.getHeader("Authorization"); String requestBody = LakalaUtil.getBody(request); - boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); + boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); if (!checkSuccess) { return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); } @@ -688,7 +693,7 @@ public class LakalaPayServiceImpl implements LakalaPayService { String authorization = request.getHeader("Authorization"); String requestBody = LakalaUtil.getBody(request); - boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); + boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); if (!checkSuccess) { return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); } diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LklLedgerMemberServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LklLedgerMemberServiceImpl.java index 4b0e651e..136eff95 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LklLedgerMemberServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LklLedgerMemberServiceImpl.java @@ -47,11 +47,12 @@ public class LklLedgerMemberServiceImpl extends BaseServiceImpl registrationMerchant(String mchMobile) { + String authorization = getLklTkAuthorization(); + if (StrUtil.isBlank(authorization)) { + return Pair.of(false, "获取拉卡拉token失败"); + } + + JSONObject header = new JSONObject(); + header.put("Authorization", getLklTkAuthorization()); + + // 获取商家入驻信息,组成请求参数 + ShopMerchEntry shopMerchEntry = shopMerchEntryService.getShopMerchEntryByCondition(mchMobile, null, CommonConstant.MCH_APPR_STA_PASS); + if (ObjectUtil.isEmpty(shopMerchEntry)) { + return Pair.of(false, "商家入驻信息不存在"); + } + + JSONObject formData = new JSONObject(); + formData.put("userNo", "29153396"); + formData.put("email", mchMobile + "@163.com"); + formData.put("busiCode", "B2B_SYT"); + formData.put("merRegName", shopMerchEntry.getStore_name()); + + Boolean isQy = CommonConstant.MCH_ENTITY_TYPE_QY.equals(shopMerchEntry.getEntity_type()); + String merType = isQy ? "TP_MERCHANT" : "TP_PERSONAL"; + formData.put("merType", merType); + + formData.put("merName", shopMerchEntry.getStore_name()); + formData.put("merAddr", StringUtils.removeProvinceCityDistrict(shopMerchEntry.getStore_address())); + + Map areaCode = getAreaCode(shopMerchEntry.getStore_area(), false); + if (ObjectUtil.isNotEmpty(areaCode)) { + formData.put("provinceCode", areaCode.get("provinceCode")); + formData.put("cityCode", areaCode.get("cityCode")); + formData.put("countyCode", areaCode.get("countyCode")); + } + + formData.put("longtude", shopMerchEntry.getStore_longitude()); //longitude 经度 + formData.put("latitude", shopMerchEntry.getStore_latitude()); + formData.put("source", "H5"); + + + formData.put("larIdType", "01"); + String larName = isQy ? shopMerchEntry.getLegal_person_name() : shopMerchEntry.getContact_name(); + String larIdCard = isQy ? shopMerchEntry.getLegal_person_id_number() : shopMerchEntry.getIndividual_id_number(); + String larIdCardStart = isQy ? shopMerchEntry.getLegal_person_id_period_begin() : shopMerchEntry.getIndividual_id_period_begin(); + String larIdCardEnd = isQy ? shopMerchEntry.getLegal_person_id_period_end() : shopMerchEntry.getIndividual_id_period_end(); + formData.put("larName", larName); + formData.put("larIdCard", larIdCard); + formData.put("larIdCardStart", larIdCardStart); // 身份证有效期开始时间 + formData.put("larIdCardEnd", larIdCardEnd); // 身份证有效期结束时间 + + formData.put("businessContent", shopMerchEntry.getSales_info()); + + // 营业执照信息 + if (isQy) { + formData.put("licenseName", shopMerchEntry.getBiz_license_company()); + formData.put("licenseNo", shopMerchEntry.getBiz_license_number()); + formData.put("licenseDtStart", shopMerchEntry.getBiz_license_period_begin()); + formData.put("licenseDtEnd", shopMerchEntry.getBiz_license_period_end()); + } + + formData.put("contactMobile", mchMobile); + formData.put("contactName", shopMerchEntry.getContact_name()); + + formData.put("openningBankCode", shopMerchEntry.getBank_code());//结算账户开户⾏号 + formData.put("openningBankName", shopMerchEntry.getBank_name());//结算账户开户⾏名称 + formData.put("clearingBankCode", shopMerchEntry.getClearing_bank_code());//结算账户清算⾏号 + + formData.put("accountNo", shopMerchEntry.getAccount_number()); //结算人银行卡号 + formData.put("accountName", shopMerchEntry.getAccount_holder_name()); //结算人账户名称 + formData.put("accountIdCard", shopMerchEntry.getLegal_person_id_number());//结算⼈证件号码(身份证) + + formData.put("settleType", "D1"); //结算类型,D0秒到,D1次日结算 + formData.put("settlementType", "AUTOMATIC"); // 结算方式:MANUAL:手动结算(结算至拉卡拉APP钱包),AUTOMATIC:自动结算到银行卡,REGULAR:定时结算(仅企业商户支持) + formData.put("accountType", isQy ? "57" : "58"); //结算账户类型: 57 对公 58 对私 + + //结算信息省份代码 + Map bankAreaCode = getAreaCode(shopMerchEntry.getBank_area(), true); + if (ObjectUtil.isNotEmpty(bankAreaCode)) { + formData.put("settleProvinceCode", bankAreaCode.get("provinceCode")); + formData.put("settleCityCode", bankAreaCode.get("cityCode")); + String[] bankAreaName = shopMerchEntry.getBank_area().split(","); + if (bankAreaName.length >= 2) { + formData.put("settleProvinceName", bankAreaName[0]); + formData.put("settleCityName", bankAreaName[1]); + } + } + + + JSONObject bizContent = new JSONObject(); + bizContent.put("activityId", 687); + bizContent.put("termNum", "1"); + bizContent.put("mcc", "1"); + bizContent.put("fees", new JSONArray() {{ + put(new JSONObject() {{ + put("feeCode", "WECHAT"); + put("feeValue", 0.38); + }}); + }}); + + formData.put("bizContent", bizContent); + + JSONArray attachments = new JSONArray(); + JSONObject ID_CARD_FRONT = updatePhoto(shopMerchEntry.getIndividual_id_images(), "ID_CARD_FRONT", true); + if (ID_CARD_FRONT != null) { + attachments.put(ID_CARD_FRONT); // 身份证正面 + } + + JSONObject ID_CARD_BEHIND = updatePhoto(shopMerchEntry.getIndividual_id_images2(), "ID_CARD_BEHIND", true); + if (ID_CARD_BEHIND != null) { + attachments.put(ID_CARD_BEHIND); // 身份证国徽面 + } + + JSONObject SETTLE_ID_CARD_FRONT = updatePhoto(shopMerchEntry.getLegal_person_id_images(), "SETTLE_ID_CARD_FRONT", true); + if (SETTLE_ID_CARD_FRONT != null) { + attachments.put(SETTLE_ID_CARD_FRONT); // 结算人身份证正面 + } + + JSONObject SETTLE_ID_CARD_BEHIND = updatePhoto(shopMerchEntry.getLegal_person_id_images2(), "SETTLE_ID_CARD_BEHIND", true); + if (SETTLE_ID_CARD_BEHIND != null) { + attachments.put(SETTLE_ID_CARD_BEHIND); // 结算人身份证国徽面 + } + + JSONObject BUSINESS_LICENCE = updatePhoto(shopMerchEntry.getBiz_license_image(), "BUSINESS_LICENCE", true); + if (BUSINESS_LICENCE != null) { + attachments.put(BUSINESS_LICENCE); // 营业执照 + } + + JSONObject SHOP_OUTSIDE_IMG = updatePhoto(shopMerchEntry.getFront_facade_image(), "SHOP_OUTSIDE_IMG", false); + if (SHOP_OUTSIDE_IMG != null) { + attachments.put(SHOP_OUTSIDE_IMG); // 门店门面图片 + } + + JSONObject SHOP_INSIDE_IMG = updatePhoto(shopMerchEntry.getEnvironment_image(), "SHOP_INSIDE_IMG", false); + if (SHOP_INSIDE_IMG != null) { + attachments.put(SHOP_INSIDE_IMG); // 门店内部图片 + } + + JSONObject BANK_CARD = updatePhoto(shopMerchEntry.getBank_image(), "BANK_CARD", true); + if (BANK_CARD != null) { + attachments.put(BANK_CARD); // 银行卡图片 + } + + formData.put("attchments", attachments); + + + String urlPath = "/sit/htkregistration/merchant"; + if (isProd()) { + urlPath = "/registration/merchant"; + } + + ResponseEntity response = RestTemplateHttpUtil.sendPostFormDataBackEntity(buildLklTkUrl(urlPath), header, formData, JSONObject.class); + if (ObjectUtil.isEmpty(response) || response.getStatusCode() != HttpStatus.OK) { + String errMsg = "请求分账系统出错!"; + if (ObjectUtil.isNotEmpty(response.getBody()) && ObjectUtil.isNotEmpty(response.getBody().getStr("message"))) { + errMsg = response.getBody().getStr("message"); + } + return Pair.of(false, "进件失败:" + errMsg); + } + + // 根据入驻商家的代理商或平台方,顺便新增一个接收方记录 + + + // TODO 新增 lkl_ledger_member 数据, 等待异步审核通知,更改状态 + String merchantNo = response.getBody().getStr("merchantNo"); //拉卡拉内部商户号 + return Pair.of(true, "进件成功!"); + } + + /** + * 获取拉卡拉省市区编码 + * + * @param areaName 省份/城市/乡县 + * @return + */ + public Map getAreaCode(String areaName, Boolean isBankArea) { + if (StrUtil.isBlank(areaName)) { + return new HashMap() {{ + put("provinceCode", ""); + put("cityCode", ""); + put("countyCode", ""); + }}; + } + + String[] areaNames = areaName.split("/"); + if (areaNames.length < 2) { + return new HashMap() {{ + put("provinceCode", ""); + put("cityCode", ""); + put("countyCode", ""); + }}; + } + + String provinceName = areaNames[0]; + String cityName = areaNames[1]; + String countryName = ""; + if (areaNames.length >= 3) { + countryName = areaNames[2]; + } + + String urlPath = "/organization"; + if (isBankArea) { + urlPath = "/organization/bank"; + } + String authorization = getLklTkAuthorization(); + if (StrUtil.isBlank(authorization)) { + log.error("获取拉卡拉token失败"); + return new HashMap() {{ + put("provinceCode", ""); + put("cityCode", ""); + put("countyCode", ""); + }}; + } + + JSONObject header = new JSONObject(); + header.put("Authorization", getLklTkAuthorization()); + + Map areaCodeMap = new HashMap<>(); + + // 省份列表 + ResponseEntity response = RestTemplateHttpUtil.sendGetWithHeader(buildLklTkUrl(urlPath + "/1"), header, JSONArray.class); + if (ObjectUtil.isNotEmpty(response) && response.getStatusCode() == HttpStatus.OK) { + String provinceCode = ""; + String cityCode = ""; + String countyCode = ""; + + JSONArray jsonArray = response.getBody(); + if (CollUtil.isNotEmpty(jsonArray)) { + for (JSONObject jsonObject : jsonArray.jsonIter()) { + if (StrUtil.contains(jsonObject.getStr("name"), provinceName)) { + provinceCode = jsonObject.getStr("code"); + areaCodeMap.put("provinceCode", provinceCode); + break; + } + } + + // 城市列表 + if (StrUtil.isNotBlank(provinceCode)) { + response = RestTemplateHttpUtil.sendGetWithHeader(buildLklTkUrl(urlPath + "/" + provinceCode), header, JSONArray.class); + jsonArray = response.getBody(); + if (CollUtil.isNotEmpty(jsonArray)) { + for (JSONObject jsonObject : jsonArray.jsonIter()) { + if (StrUtil.contains(jsonObject.getStr("name"), cityName)) { + cityCode = jsonObject.getStr("code"); + areaCodeMap.put("cityCode", cityCode); + break; + } + } + } + } + + + // 乡列表 + if (StrUtil.isNotBlank(cityCode)) { + response = RestTemplateHttpUtil.sendGetWithHeader(buildLklTkUrl(urlPath + "/" + cityCode), header, JSONArray.class); + jsonArray = response.getBody(); + if (CollUtil.isNotEmpty(jsonArray)) { + for (JSONObject jsonObject : jsonArray.jsonIter()) { + if (StrUtil.contains(jsonObject.getStr("name"), countryName)) { + countyCode = jsonObject.getStr("code"); + areaCodeMap.put("countyCode", countyCode); + break; + } + } + } + } + } + } + + + return areaCodeMap; + } + + public JSONObject updatePhoto(String fileUrl, String imgType, Boolean isOcr) { + if (StrUtil.isBlank(fileUrl)) { + return null; + } + + JSONObject header = new JSONObject(); + header.put("Authorization", getLklTkAuthorization()); + + JSONObject formData = new JSONObject(); + File file = UploadUtil.downloadImageFromUrl(fileUrl); + formData.put("file", file); + formData.put("imgType", imgType); + formData.put("sourcechnl", "0"); + formData.put("isOcr", isOcr); + + String urlPath = "/file/upload"; + ResponseEntity response = RestTemplateHttpUtil.sendPostFormDataBackEntity(buildLklTkUrl(urlPath), header, formData, JSONObject.class); + if (ObjectUtil.isEmpty(response) || response.getStatusCode() != HttpStatus.OK) { + return null; + } + JSONObject result = response.getBody(); + if (result == null) { + return null; + } + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", result.get("url")); + jsonObject.put("type", imgType); + return jsonObject; + } + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMerchEntryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMerchEntryService.java index 293dd699..8b90279a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMerchEntryService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMerchEntryService.java @@ -127,5 +127,14 @@ public interface ShopMerchEntryService { */ Boolean updateMerchEntryStoreStatus(String loginMobile, Integer storeStatus); + /** + * 更新商家入驻申请的店铺 ID + * + * @param id + * @param storeId + * @return + */ + Boolean updateMerchEntryStoreId(Long id, Integer storeId); + } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java index c60ebb8c..063e3f1d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMerchEntryServiceImpl.java @@ -685,4 +685,22 @@ public class ShopMerchEntryServiceImpl extends BaseServiceImpl() + .eq("id", id) + .set("store_id", storeId)); + } } 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 38f90b45..bc9312b4 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 @@ -1641,7 +1641,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl tagQueryWrapper = new QueryWrapper<>(); - tagQueryWrapper.orderByAsc("product_tag_id"); - Page base_product_tag_row = shopBaseProductTagService.lists(tagQueryWrapper, 1, 5); - - List store_product_tag_row = new ArrayList<>(); - for (ShopBaseProductTag teg : base_product_tag_row.getRecords()) { - ShopStoreProductTag shopStoreProductTag = new ShopStoreProductTag(); - store_product_tag_row.add(shopStoreProductTag); - shopStoreProductTag.setProduct_tag_id(teg.getProduct_tag_id()); - shopStoreProductTag.setStore_id(storeId); - shopStoreProductTag.setProduct_tag_time(today); - shopStoreProductTag.setStore_product_tag_buildin(1); - } - - if (CollUtil.isNotEmpty(store_product_tag_row)) { - if (!shopStoreProductTagService.saveOrUpdate(store_product_tag_row)) { - throw new ApiException(ResultCode.FAILED); - } - } - - //初始化默认店铺仓库 - InvoicingWarehouseBase invoicingWarehouseBase = new InvoicingWarehouseBase(); - invoicingWarehouseBase.setWarehouse_name(I18nUtil._("默认")); - invoicingWarehouseBase.setStore_id(storeId); - invoicingWarehouseBase.setWarehouse_address(""); - invoicingWarehouseBase.setWarehouse_number(""); - invoicingWarehouseBase.setWarehouse_contact(""); - - if (!invoicingWarehouseBaseService.saveOrUpdate(invoicingWarehouseBase)) { - throw new ApiException(ResultCode.FAILED); - } - // 注意:关联店铺到用户,给用户增加店铺管理员权限 - initShopKeeperRightsGroup(userId, storeId); + initStoreExtraInfo(userId, storeId); + + // 更改店铺Id + shopMerchEntryService.updateMerchEntryStoreId(shopMerchEntry.getId(), storeId); return Pair.of(storeId, "新增成功"); } catch (Exception e) { @@ -3215,11 +3177,51 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl tagQueryWrapper = new QueryWrapper<>(); + tagQueryWrapper.orderByAsc("product_tag_id"); + Page base_product_tag_row = shopBaseProductTagService.lists(tagQueryWrapper, 1, 5); + List store_product_tag_row = new ArrayList<>(); + for (ShopBaseProductTag teg : base_product_tag_row.getRecords()) { + ShopStoreProductTag shopStoreProductTag = new ShopStoreProductTag(); + store_product_tag_row.add(shopStoreProductTag); + shopStoreProductTag.setProduct_tag_id(teg.getProduct_tag_id()); + shopStoreProductTag.setStore_id(storeId); + shopStoreProductTag.setProduct_tag_time(today); + shopStoreProductTag.setStore_product_tag_buildin(1); + } + + if (CollUtil.isNotEmpty(store_product_tag_row)) { + if (!shopStoreProductTagService.saveOrUpdate(store_product_tag_row)) { + throw new ApiException(ResultCode.FAILED); + } + } + + //初始化默认店铺仓库 + InvoicingWarehouseBase invoicingWarehouseBase = new InvoicingWarehouseBase(); + invoicingWarehouseBase.setWarehouse_name(I18nUtil._("默认")); + invoicingWarehouseBase.setStore_id(storeId); + invoicingWarehouseBase.setWarehouse_address(""); + invoicingWarehouseBase.setWarehouse_number(""); + invoicingWarehouseBase.setWarehouse_contact(""); + if (!invoicingWarehouseBaseService.saveOrUpdate(invoicingWarehouseBase)) { + throw new ApiException(ResultCode.FAILED); + } + //初始化默认权限 Page page = shopStoreEmployeeRightsBaseService.listKey(new QueryWrapper<>(), 1, ConfigConstant.MAX_LIST_NUM); @@ -3334,6 +3336,18 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl