推送运营商、门店新增

This commit is contained in:
19173159168
2025-08-31 20:44:18 +08:00
parent 32a9bc8c39
commit 0a9a4aa361
12 changed files with 221 additions and 114 deletions

View File

@ -0,0 +1,161 @@
package com.ruoyi.api;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.orders.domain.ZcOrderSub;
import com.ruoyi.orders.dto.RefundRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.util.Map;
@Service
public class DataPushApi {
private static final Logger logger = LoggerFactory.getLogger(DataPushApi.class);
@Autowired
private ObjectMapper objectMapper;
@Value(value = "${pay.refundUrl}")
private String refundUrl;
@Value(value = "${dataPush.sendAddCompanyUrl}")
private String sendAddCompanyUrl;
@Value(value = "${dataPush.sendAddStoreUrl}")
private String sendAddStoreUrl;
@Value(value = "${dataPush.sendAddUserUrl}")
private String sendAddUserUrl;
/**
* 发送添加运营商信息
* @param companyId
*/
public boolean sendAddCompany(Long companyId) {
return sendDataId(sendAddCompanyUrl, companyId, "运营商");
}
/**
* 发送添加门店信息
* @param storeId
*/
public boolean sendAddStore(Long storeId) {
return sendDataId(sendAddStoreUrl, storeId, "门店");
}
/**
* 发送添加用户信息
* @param userId
*/
public boolean sendAddUser(Long userId) {
return sendDataId(sendAddUserUrl, userId, "用户");
}
private boolean sendDataId(String url,Long id,String name) {
try {
// 发送HTTP请求调用添加接口
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(url + id, String.class);
// 处理添加接口响应
if (response.getStatusCode() == HttpStatus.OK) {
// 解析响应内容检查return_code是否为SUCCESS
String responseBody = response.getBody();
if (responseBody != null) {
try {
// 使用ObjectMapper解析JSON响应
Map<String, Object> responseMap = objectMapper.readValue(responseBody, Map.class);
Object returnCode = responseMap.get("code");
if ("200".equals(returnCode)) {
logger.info("推送{}ID成功ID: {}", name, id);
return true;
} else {
logger.error("推送{}ID失败ID: {},响应: {}", name, id, responseBody);
return false;
}
} catch (Exception jsonEx) {
logger.error("推送{}ID接口响应异常ID: {},响应: {}", name, id, responseBody, jsonEx);
return false;
}
} else {
logger.error("推送{}ID返回空响应ID: {}", name, id);
return false;
}
} else {
logger.error("推送{}IDID: {},响应: {}", name, id, response.getBody());
return false;
}
} catch (Exception e) {
logger.error("推送门店ID异常ID: " + name, id, e);
return false;
}
}
/**
* 调用退款接口
* @param refundSub
* @param operatorId 运营商ID
* @return 退款是否成功
*/
public boolean callRefundApi(ZcOrderSub refundSub, Long operatorId) {
String refundNo = refundSub.getRefundId();
try {
// 准备退款请求参数
RefundRequest refundRequest = new RefundRequest();
refundRequest.setCompanyId(operatorId);// 运营商id
refundRequest.setOutTradeNo(refundSub.getPaymentId()); // 原始押金子订单payment_id
refundRequest.setOutRefundNo(refundNo);// 退款子订单编号
refundRequest.setRefundDesc("手动结束订单退款");// 退款描述
refundRequest.setTotalFee(new BigDecimal(0));
refundRequest.setRefundFee(refundSub.getAmount().multiply(new BigDecimal(100))); // 退款金额 分
// 发送HTTP请求调用退款接口
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<RefundRequest> requestEntity = new HttpEntity<>(refundRequest, headers);
// 打印请求参数便于调试
String jsonParams = objectMapper.writeValueAsString(refundRequest);
logger.info("退款请求参数: {}", jsonParams);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(refundUrl, requestEntity, String.class);
// 处理退款接口响应
if (response.getStatusCode() == HttpStatus.OK) {
// 解析响应内容检查return_code是否为SUCCESS
String responseBody = response.getBody();
if (responseBody != null) {
try {
// 使用ObjectMapper解析JSON响应
Map<String, Object> responseMap = objectMapper.readValue(responseBody, Map.class);
Object returnCode = responseMap.get("return_code");
if ("SUCCESS".equals(returnCode)) {
logger.info("退款成功,退款单号: {}", refundNo);
return true;
} else {
logger.error("退款失败,退款单号: {},响应: {}", refundNo, responseBody);
return false;
}
} catch (Exception jsonEx) {
logger.error("解析退款接口响应异常,退款单号: {},响应: {}", refundNo, responseBody, jsonEx);
return false;
}
} else {
logger.error("退款接口返回空响应,退款单号: {}", refundNo);
return false;
}
} else {
logger.error("退款失败,退款单号: {},响应: {}", refundNo, response.getBody());
return false;
}
} catch (Exception e) {
logger.error("调用退款接口异常,退款单号: " + refundNo, e);
return false;
}
}
}

View File

@ -2,6 +2,7 @@ package com.ruoyi.baseUser.controller;
import java.util.List; import java.util.List;
import com.ruoyi.api.DataPushApi;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
@ -36,6 +37,8 @@ public class ZcBaseUserController extends BaseController
@Autowired @Autowired
private IZcBaseUserService zcBaseUserService; private IZcBaseUserService zcBaseUserService;
@Autowired
private DataPushApi dataPushApi;
@RequiresPermissions("baseUser:user:view") @RequiresPermissions("baseUser:user:view")
@GetMapping() @GetMapping()
@ -93,7 +96,12 @@ public class ZcBaseUserController extends BaseController
@ResponseBody @ResponseBody
public AjaxResult addSave(ZcBaseUser zcBaseUser) public AjaxResult addSave(ZcBaseUser zcBaseUser)
{ {
return toAjax(zcBaseUserService.insertZcBaseUser(zcBaseUser)); int flag = zcBaseUserService.insertZcBaseUser(zcBaseUser);
if(flag > 0){
// 推送用户ID
dataPushApi.sendAddUser(zcBaseUser.getId());
}
return toAjax(flag);
} }
/** /**

View File

@ -2,6 +2,7 @@ package com.ruoyi.operation.controller;
import java.util.List; import java.util.List;
import com.ruoyi.api.DataPushApi;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.RRException; import com.ruoyi.common.exception.RRException;
@ -53,6 +54,9 @@ public class CompanyController extends BaseController
@Autowired @Autowired
private ISysAreaHnService areaHnService; private ISysAreaHnService areaHnService;
@Autowired
private DataPushApi dataPushApi;
@RequiresPermissions("operation:company:view") @RequiresPermissions("operation:company:view")
@GetMapping() @GetMapping()
public String company() public String company()
@ -125,6 +129,10 @@ public class CompanyController extends BaseController
} }
company.setCreateBy(getLoginName()); company.setCreateBy(getLoginName());
int flag = companyService.insertCompany(company); int flag = companyService.insertCompany(company);
if(flag > 0){
// 推送运营商ID
dataPushApi.sendAddCompany(company.getId());
}
return toAjax(flag); return toAjax(flag);
} }

View File

@ -2,6 +2,7 @@ package com.ruoyi.operation.controller;
import java.util.List; import java.util.List;
import com.ruoyi.api.DataPushApi;
import com.ruoyi.baseUser.domain.ZcBaseUser; import com.ruoyi.baseUser.domain.ZcBaseUser;
import com.ruoyi.baseUser.service.IZcBaseUserService; import com.ruoyi.baseUser.service.IZcBaseUserService;
import com.ruoyi.common.constant.CompanyConstants; import com.ruoyi.common.constant.CompanyConstants;
@ -41,7 +42,8 @@ public class CompanyStoreController extends BaseController
private ICompanyService companyService; private ICompanyService companyService;
@Autowired @Autowired
private IZcBaseUserService zcBaseUserService; private IZcBaseUserService zcBaseUserService;
@Autowired
private DataPushApi dataPushApi;
@RequiresPermissions("operation:store:view") @RequiresPermissions("operation:store:view")
@GetMapping() @GetMapping()
@ -118,7 +120,12 @@ public class CompanyStoreController extends BaseController
return error("新增失败,门店编号'" + companyStore.getStoreNumber() + "'已存在"); return error("新增失败,门店编号'" + companyStore.getStoreNumber() + "'已存在");
} }
companyStore.setCreateBy(getLoginName()); companyStore.setCreateBy(getLoginName());
return toAjax(companyStoreService.insertCompanyStore(companyStore)); int flag = companyStoreService.insertCompanyStore(companyStore);
if(flag > 0){
// 推送门店ID
dataPushApi.sendAddStore(companyStore.getId());
}
return toAjax(flag);
} }
/** /**

View File

@ -2,6 +2,7 @@ package com.ruoyi.operation.service.impl;
import java.util.List; import java.util.List;
import com.ruoyi.api.DataPushApi;
import com.ruoyi.common.constant.CompanyConstants; import com.ruoyi.common.constant.CompanyConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@ -21,6 +22,7 @@ import com.ruoyi.operation.mapper.CompanyMapper;
import com.ruoyi.operation.domain.Company; import com.ruoyi.operation.domain.Company;
import com.ruoyi.operation.service.ICompanyService; import com.ruoyi.operation.service.ICompanyService;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 运营商Service业务层处理 * 运营商Service业务层处理
@ -43,6 +45,7 @@ public class CompanyServiceImpl implements ICompanyService
private ISysAreaHnService areaHnService; private ISysAreaHnService areaHnService;
@Autowired @Autowired
private ISysUserService sysUserService; private ISysUserService sysUserService;
/** /**
* 查询运营商 * 查询运营商
* *
@ -94,6 +97,7 @@ public class CompanyServiceImpl implements ICompanyService
* @param company 运营商 * @param company 运营商
* @return 结果 * @return 结果
*/ */
@Transactional
@Override @Override
public int insertCompany(Company company) public int insertCompany(Company company)
{ {

View File

@ -87,7 +87,7 @@ public class CompanyStoreServiceImpl implements ICompanyStoreService
companyStore.setCreateTime(DateUtils.getNowDate()); companyStore.setCreateTime(DateUtils.getNowDate());
companyStore.setUpdateTime(DateUtils.getNowDate()); companyStore.setUpdateTime(DateUtils.getNowDate());
companyStore.setStatus("0"); companyStore.setStatus("0");
companyStore.setAddress(companyStore.getProvinceName()+companyStore.getCityName()+companyStore.getAreaName());
setAreaInfo(companyStore); setAreaInfo(companyStore);
int flag = companyStoreMapper.insertCompanyStore(companyStore); int flag = companyStoreMapper.insertCompanyStore(companyStore);
if(flag > 0){ if(flag > 0){
@ -106,7 +106,7 @@ public class CompanyStoreServiceImpl implements ICompanyStoreService
private void setAreaInfo(CompanyStore companyStore){ private void setAreaInfo(CompanyStore companyStore){
//获取当前区划 //获取当前区划
String areaCode = companyStore.getAreaId(); String areaCode = companyStore.getAreaId();
SysAreaHn areaHn = sysAreaHnService.selectSysAreaHnByCode(areaCode.substring(0,4)+"00000000"); SysAreaHn areaHn = sysAreaHnService.selectSysAreaHnByCode(areaCode.substring(0,4)+"00");
companyStore.setCityId(areaHn.getAreaCode()); companyStore.setCityId(areaHn.getAreaCode());
companyStore.setCityName(areaHn.getName()); companyStore.setCityName(areaHn.getName());
companyStore.setProvinceId(areaHn.getParentCode()); companyStore.setProvinceId(areaHn.getParentCode());
@ -124,7 +124,7 @@ public class CompanyStoreServiceImpl implements ICompanyStoreService
{ {
companyStore.setUpdateTime(DateUtils.getNowDate()); companyStore.setUpdateTime(DateUtils.getNowDate());
companyStore.setStatus("0"); companyStore.setStatus("0");
companyStore.setAddress(companyStore.getProvinceName()+companyStore.getCityName()+companyStore.getAreaName());
setAreaInfo(companyStore); setAreaInfo(companyStore);
return companyStoreMapper.updateCompanyStore(companyStore); return companyStoreMapper.updateCompanyStore(companyStore);
} }

View File

@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import com.ruoyi.api.DataPushApi;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.operation.domain.ZcCar; import com.ruoyi.operation.domain.ZcCar;
@ -57,10 +58,8 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
@Autowired @Autowired
private IZcCarService zcCarService; private IZcCarService zcCarService;
@Autowired @Autowired
private ObjectMapper objectMapper; private DataPushApi dataPushApi;
@Value(value = "${pay.refundUrl}")
private String refundUrl;
/** /**
* 查询租车订单 * 查询租车订单
@ -152,6 +151,7 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
return zcOrderMainMapper.deleteZcOrderMainByOrderId(orderId); return zcOrderMainMapper.deleteZcOrderMainByOrderId(orderId);
} }
@Transactional
@Override @Override
public int updateManualEndOrder(Long orderId) { public int updateManualEndOrder(Long orderId) {
// 1. 参数校验 // 1. 参数校验
@ -229,19 +229,20 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
refundSub.setRefundId(suborderNo); refundSub.setRefundId(suborderNo);
refundSub.setCreateTime(DateUtils.getNowDate()); refundSub.setCreateTime(DateUtils.getNowDate());
// // 调用退款接口并检查结果 // 调用退款接口并检查结果
// boolean bool = callRefundApi(querySub, suborderNo, refundAmount, queryOrder.getOperatorId()); boolean bool = dataPushApi.callRefundApi(refundSub, queryOrder.getOperatorId());
// if(bool) { if(bool) {
// // 创建退款成功子订单 // 创建退款成功子订单
// zcOrderSubService.insertZcOrderSub(refundSub); refundSub.setPayStatus("SUCCESS");
// } zcOrderSubService.insertZcOrderSub(refundSub);
// return bool; }
return bool;
// 在新事务中插入退款子订单 // // 在新事务中插入退款子订单
insertRefundSubInNewTransaction(refundSub); // insertRefundSubInNewTransaction(refundSub);
//
// 调用退款接口并检查结果(此时数据库中已有退款订单数据) // // 调用退款接口并检查结果(此时数据库中已有退款订单数据)
return callRefundApi(refundSub, queryOrder.getOperatorId()); // return callRefundApi(refundSub, queryOrder.getOperatorId());
} }
return true; // 如果没有押金子订单,认为退款成功 return true; // 如果没有押金子订单,认为退款成功
@ -255,7 +256,7 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
zcOrderSubService.insertZcOrderSub(refundSub); zcOrderSubService.insertZcOrderSub(refundSub);
} }
@Transactional
public int updateRefundZcOrderMain(Long orderId, ZcOrderMain queryOrder){ public int updateRefundZcOrderMain(Long orderId, ZcOrderMain queryOrder){
// 4. 退款成功后,更新订单状态 // 4. 退款成功后,更新订单状态
ZcOrderMain zcOrderMain = new ZcOrderMain(); ZcOrderMain zcOrderMain = new ZcOrderMain();
@ -286,69 +287,6 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
} }
/**
* 调用退款接口
* @param refundSub
* @param operatorId 运营商ID
* @return 退款是否成功
*/
private boolean callRefundApi(ZcOrderSub refundSub, Long operatorId) {
String refundNo = refundSub.getRefundId();
try {
// 准备退款请求参数
RefundRequest refundRequest = new RefundRequest();
refundRequest.setCompanyId(operatorId);// 运营商id
refundRequest.setOutTradeNo(refundSub.getPaymentId()); // 原始押金子订单payment_id
refundRequest.setOutRefundNo(refundNo);// 退款子订单编号
refundRequest.setRefundDesc("手动结束订单退款");// 退款描述
refundRequest.setTotalFee(new BigDecimal(0));
refundRequest.setRefundFee(refundSub.getAmount().multiply(new BigDecimal(100))); // 退款金额 分
// 发送HTTP请求调用退款接口
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<RefundRequest> requestEntity = new HttpEntity<>(refundRequest, headers);
// 打印请求参数便于调试
String jsonParams = objectMapper.writeValueAsString(refundRequest);
logger.info("退款请求参数: {}", jsonParams);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(refundUrl, requestEntity, String.class);
// 处理退款接口响应
if (response.getStatusCode() == HttpStatus.OK) {
// 解析响应内容检查return_code是否为SUCCESS
String responseBody = response.getBody();
if (responseBody != null) {
try {
// 使用ObjectMapper解析JSON响应
Map<String, Object> responseMap = objectMapper.readValue(responseBody, Map.class);
Object returnCode = responseMap.get("return_code");
if ("SUCCESS".equals(returnCode)) {
logger.info("退款成功,退款单号: {}", refundNo);
return true;
} else {
logger.error("退款失败,退款单号: {},响应: {}", refundNo, responseBody);
return false;
}
} catch (Exception jsonEx) {
logger.error("解析退款接口响应异常,退款单号: {},响应: {}", refundNo, responseBody, jsonEx);
return false;
}
} else {
logger.error("退款接口返回空响应,退款单号: {}", refundNo);
return false;
}
} else {
logger.error("退款失败,退款单号: {},响应: {}", refundNo, response.getBody());
return false;
}
} catch (Exception e) {
logger.error("调用退款接口异常,退款单号: " + refundNo, e);
return false;
}
}
/** /**
* 新增租车子订单信息 * 新增租车子订单信息

View File

@ -84,4 +84,9 @@ renren:
header: token header: token
pay: pay:
refundUrl: http://115.190.8.52:8019/api/payment/refund refundUrl: http://115.190.8.52:8019/api/payment/refund
dataPush:
sendAddCompanyUrl: http://115.190.8.52:8016/send/companyinfo/
sendAddStoreUrl: http://115.190.8.52:8016/send/storeinfo/
sendAddUserUrl: http://115.190.8.52:8016/send/userinfo/

View File

@ -56,9 +56,9 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">地址:</label> <label class="col-sm-3 control-label is-required">地址:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input name="address" class="form-control" type="text" maxlength="100"> <input name="address" class="form-control" type="text" maxlength="100" required>
</div> </div>
</div> </div>

View File

@ -112,19 +112,6 @@
} }
} }
/* 用户管理-修改-选择部门树 */
function selectDeptTree() {
var deptId = $.common.isEmpty($("#treeId").val()) ? "431200000000" : $("#treeId").val();
var url = ctx + "system/dept/selectDeptTree/" + deptId;
var options = {
title: '选择部门',
width: "380",
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
function doSubmit(index, layero){ function doSubmit(index, layero){
var tree = layero.find("iframe")[0].contentWindow.$._tree; var tree = layero.find("iframe")[0].contentWindow.$._tree;
var body = $.modal.getChildFrame(index); var body = $.modal.getChildFrame(index);

View File

@ -166,7 +166,7 @@
</div> </div>
</div> </div>
<br/> <br/>
<button type="button" th:if="not (*{orderStatus} == 'AUTO_END' or *{orderStatus} == 'MANUAL_END')" class="btn btn-success btn-xs" onclick="manualEndOrder()">手动结束订单</i></button> <button type="button" th:if="not (*{orderStatus} == 'AUTO_END' or *{orderStatus} == 'MANUAL_END' or *{orderStatus} == 'WAIT_PAY')" class="btn btn-success btn-xs" onclick="manualEndOrder()">手动结束订单</i></button>
</form> </form>
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />

View File

@ -13,18 +13,7 @@ public class CodeConstants {
*/ */
public final static String IMPORT_EXECUTE = "000000"; public final static String IMPORT_EXECUTE = "000000";
/**
* 9月一号
*/
public final static String MONTH_DAY_9_1 = "09-01";
/**
* 省code
*/
public final static String PROVINCE_CODE = "430000000000";
/**
* 怀化市code
*/
public final static String HUAI_HUA_CODE = "431200000000";
/** /**
* 医保低保户和特困预警type * 医保低保户和特困预警type