package com.stylefeng.guns.modular.system.controller.specialTrain;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.plugins.Page;
|
import com.stylefeng.guns.core.base.controller.BaseController;
|
import com.stylefeng.guns.core.common.constant.factory.PageFactory;
|
import com.stylefeng.guns.core.shiro.ShiroKit;
|
import com.stylefeng.guns.core.shiro.ShiroUser;
|
import com.stylefeng.guns.core.util.SinataUtil;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.cloudPayment.example.AllocationExample;
|
import com.stylefeng.guns.modular.cloudPayment.req.AllocationReq;
|
import com.stylefeng.guns.modular.system.controller.general.TDriverController;
|
import com.stylefeng.guns.modular.system.controller.util.Base64Util;
|
import com.stylefeng.guns.modular.system.controller.util.GetOpenBodySig;
|
import com.stylefeng.guns.modular.system.controller.util.Util;
|
import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
|
import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
|
import com.stylefeng.guns.modular.system.model.*;
|
import com.stylefeng.guns.modular.system.service.*;
|
import com.stylefeng.guns.modular.system.util.*;
|
import com.unionpay.upyzt.exception.UpyztException;
|
import com.unionpay.upyzt.resp.AllocationResp;
|
import org.apache.commons.lang.time.DateFormatUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.ui.Model;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import com.stylefeng.guns.core.log.LogObjectHolder;
|
|
import javax.annotation.Resource;
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.InputStreamReader;
|
import java.math.BigDecimal;
|
import java.util.*;
|
|
/**
|
* 跨城出行订单控制器
|
*
|
* @author fengshuonan
|
* @Date 2020-09-16 14:56:46
|
*/
|
@Controller
|
@RequestMapping("/tOrderCrossCity")
|
public class TOrderCrossCityController extends BaseController {
|
|
private String PREFIX = "/system/tOrderCrossCity/";
|
|
@Autowired
|
private ITOrderCrossCityService tOrderCrossCityService;
|
|
@Autowired
|
private ITServerCarmodelService tServerCarmodelService;
|
|
@Autowired
|
private ITLineService itLineService;
|
|
@Autowired
|
private ITOrderPositionService tOrderPositionService;
|
|
private ResultUtil resultUtil;
|
|
@Autowired
|
private ITUserService userService;
|
|
@Value("${filePath}")
|
private String filePath;
|
|
/**
|
* 跳转到跨城出行订单首页
|
*/
|
@RequestMapping("")
|
public String index(Model model) {
|
//服务快车车型
|
List<TServerCarmodel> carmodelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
|
model.addAttribute("carmodelList",carmodelList);
|
//线路
|
List<TLine> lineList = itLineService.selectList(new EntityWrapper<TLine>().last(" where not FIND_IN_SET(state,'3')"));
|
model.addAttribute("lineList",lineList);
|
return PREFIX + "tOrderCrossCity.html";
|
}
|
|
/**
|
* 跳转到查看跨城出行订单详情页面
|
*/
|
@RequestMapping("/tOrderCrossCity_detail/{tOrderCrossCityId}")
|
public String tOrderCrossCityUpdate(@PathVariable Integer tOrderCrossCityId, Model model) {
|
Map<String, Object> item = tOrderCrossCityService.getCrossCityOrderDetailById(tOrderCrossCityId);
|
model.addAttribute("item",item);
|
return PREFIX + "tOrderCrossCity_detail.html";
|
}
|
|
/**
|
* 跳转到跨城出行订单轨迹页面
|
*/
|
@RequestMapping("/tOrderCrossCity_track/{tOrderCrossCityId}")
|
public String tOrderCrossCity_track(@PathVariable Integer tOrderCrossCityId, Model model) {
|
model.addAttribute("tOrderCrossCityId",tOrderCrossCityId);
|
return PREFIX + "tOrderCrossCity_track.html";
|
}
|
|
/**
|
* 获取订单轨迹
|
* @param orderDetailId
|
* @return
|
*/
|
@ResponseBody
|
@RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
|
public ResultUtil getOrderTrack(String orderDetailId){
|
if(ToolUtil.isNotEmpty(orderDetailId)){
|
try {
|
//将数据存储到文件中
|
File file = new File(filePath + orderDetailId + "_3.txt");
|
if(!file.exists()){
|
return ResultUtil.success(new ArrayList<>());
|
}
|
//读取文件(字符流)
|
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
|
//循环取出数据
|
String str = null;
|
StringBuffer sb = new StringBuffer();
|
while ((str = in.readLine()) != null) {
|
sb.append(str);
|
}
|
List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class);
|
// List<TOrderPosition> list = tOrderPositionService.selectList(new EntityWrapper<TOrderPosition>().eq("orderType", 3).eq("orderId", orderDetailId).orderBy("insertTime"));
|
/*if(list.size() == 0){
|
return ResultUtil.error("该订单没有运行轨迹");
|
}*/
|
resultUtil = ResultUtil.success(list);
|
}catch (Exception e){
|
e.printStackTrace();
|
resultUtil = ResultUtil.runErr();
|
}
|
}else {
|
resultUtil = ResultUtil.paranErr();
|
}
|
return resultUtil;
|
}
|
|
/**
|
* 获取跨城出行订单列表
|
*/
|
@RequestMapping(value = "/list")
|
@ResponseBody
|
public Object list(String insertTime,
|
String orderNum,
|
Integer orderSource,
|
String userName,
|
String userPhone,
|
String passengers,
|
String passengersPhone,
|
Integer serverCarModelId,
|
String driver,
|
Integer lineId,
|
Integer state) {
|
String beginTime = null;
|
String endTime = null;
|
if (SinataUtil.isNotEmpty(insertTime)){
|
String[] timeArray = insertTime.split(" - ");
|
beginTime = timeArray[0];
|
endTime = timeArray[1];
|
}
|
Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
|
page.setRecords(tOrderCrossCityService.getCrossCityOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),orderNum,orderSource,userName,userPhone,passengers,passengersPhone,serverCarModelId,driver,lineId,state));
|
return super.packForBT(page);
|
}
|
|
@Autowired
|
private ITDriverService tDriverService;
|
|
@Resource
|
private LineShiftDriverMapper lineShiftDriverMapper;
|
|
@Autowired
|
private ITransactionDetailsService transactionDetailsService;
|
|
@Autowired
|
private IPaymentRecordService paymentRecordService;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Resource
|
private OrderCancelMapper orderCancelMapper;
|
|
@Autowired
|
private IIncomeService incomeService;
|
|
@Autowired
|
private TDriverController tDriverController;
|
|
|
/**
|
* 取消跨城出行订单
|
*/
|
@RequestMapping(value = "/cancel")
|
@ResponseBody
|
public Object cancel(@RequestParam Integer tOrderCrossCityId) throws Exception {
|
TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
ShiroUser user = ShiroKit.getUser();
|
|
TOrderCrossCity orderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11 && orderCrossCity.getState() != 7){
|
return ResultUtil.error("订单状态不在可取消范围内");
|
}
|
orderCrossCity.setState(10);
|
tOrderCrossCityService.updateById(orderCrossCity);
|
|
if(orderCrossCity.getDriverId() != null){
|
//修改司机信息
|
LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
|
lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
|
lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
|
String seat = "";
|
String[] split = orderCrossCity.getSeatNumber().split(",");
|
for(String s : split){
|
seat += s + ",";
|
}
|
seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
|
|
//总和大于总座位数的情况
|
if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
|
seat = "";
|
for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
|
seat += i + ",";
|
}
|
seat = seat.substring(0, seat.length() - 1);
|
}
|
lineShiftDriver.setLaveSeatNumber(seat);
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
|
TDriver driver = tDriverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
tDriverService.updateById(driver);
|
}
|
}
|
|
|
//已支付的情况下进行退款操作
|
if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
|
if(orderCrossCity.getPayType()==5){
|
TDriver driver = tDriverService.selectById(orderCrossCity.getDriverId());
|
if(orderCrossCity.getPayMoney().doubleValue()>0) {
|
createAllocationReq(1, driver.getId(), 1, orderCrossCity.getPayMoney().doubleValue());
|
}
|
}
|
|
if(orderCrossCity.getPayType() == 3){//余额支付
|
TUser userInfo = userService.selectById(orderCrossCity.getUserId());
|
userInfo.setBalance(userInfo.getBalance().add(orderCrossCity.getPayMoney()));
|
userService.updateById(userInfo);
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tOrderCrossCityId);
|
if(orderCrossCity.getPayMoney().doubleValue()>0){
|
if(orderCrossCity.getOrderSource()==4){
|
tDriverController.createAllocationReq(1,orderCrossCity.getDriverId(),1,orderCrossCity.getPayMoney().doubleValue());
|
}else {
|
createAllocationReqUser(1,userInfo.getId(),1,orderCrossCity.getPayMoney().doubleValue());
|
}
|
}
|
}else{
|
PaymentRecord query = null;
|
if(orderCrossCity.getOrderSource() == 4){
|
List<PaymentRecord> query1 = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2);
|
System.out.println(query1);
|
query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2).get(0);
|
}else{
|
query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2).get(0);
|
}
|
if(null == query){
|
return ResultUtil.error("订单还未进行支付");
|
}
|
|
if(query.getPayType() == 1){//微信
|
Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), tOrderCrossCityId + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
|
if(!"SUCCESS".equals(map.get("return_code"))){
|
return ResultUtil.error(map.get("return_msg"));
|
}
|
}else if(query.getPayType()==4){
|
// TODO 退款
|
TUser userInfo = userService.selectById(orderCrossCity.getUserId());
|
userInfo.setBalance(userInfo.getBalance().add(orderCrossCity.getPayMoney()));
|
userService.updateById(userInfo);
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tOrderCrossCityId);
|
if(orderCrossCity.getPayMoney().doubleValue()>0) {
|
if (orderCrossCity.getOrderSource() == 4) {
|
// 退给司机
|
createAllocationReq(1, orderCrossCity.getDriverId(), 1, orderCrossCity.getPayMoney().doubleValue());
|
} else {
|
createAllocationReqUser(1, orderCrossCity.getUserId(), 1, orderCrossCity.getPayMoney().doubleValue());
|
}
|
}
|
System.out.println("退款");
|
String billNo = orderCrossCity.getBillNo();
|
// cancleMoney(orderCrossCity.getPayMoney(),billNo);
|
}else{//支付宝
|
Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
|
if(!"10000".equals(map.get("code"))){
|
return ResultUtil.error(map.get("msg"));
|
}
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, tOrderCrossCityId);
|
}
|
}
|
|
//添加负的收入明细
|
List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderCrossCityId).eq("orderType", 3));
|
for(Income income : incomes){
|
if(income.getUserType() == 2){//处理司机的收入
|
TDriver driver = tDriverService.selectById(income.getObjectId());
|
driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
|
driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
|
driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
|
tDriverService.updateById(driver);
|
}
|
Income income1 = new Income();
|
BeanUtils.copyProperties(income, income1);
|
income1.setMoney(income.getMoney() * -1);
|
income1.setId(null);
|
income1.setInsertTime(new Date());
|
incomeService.insert(income1);
|
}
|
}
|
//添加取消记录
|
OrderCancel orderCancel = new OrderCancel();
|
orderCancel.setOrderId(tOrderCrossCityId);
|
orderCancel.setOrderType(3);
|
orderCancel.setReason("调度端取消订单");
|
orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
|
orderCancel.setState(2);
|
orderCancel.setInsertTime(new Date());
|
orderCancel.setUserType(3);
|
orderCancel.setUserId(user.getId());
|
orderCancelMapper.insert(orderCancel);
|
|
|
//增加推送
|
Map<String,String> map1 = new HashMap<>();
|
map1.put("id", tOrderCrossCity.getId().toString());
|
map1.put("orderType", "3");
|
String result1 = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map1);
|
System.out.println("跨城出行取消:【orderId="+tOrderCrossCity.getId().toString()+"】,调用接口:"+result1);
|
|
return ResultUtil.success();
|
}
|
|
/**
|
* 删除跨城出行订单
|
*/
|
@RequestMapping(value = "/delete")
|
@ResponseBody
|
public Object delete(@RequestParam Integer tOrderCrossCityId) {
|
TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
tOrderCrossCity.setIsDelete(2);
|
tOrderCrossCityService.updateById(tOrderCrossCity);
|
return SUCCESS_TIP;
|
}
|
// appId: 8a81c1bf831e72e30187ad640adf49be
|
// appKey: 6463dcd46c6d410eb40e68ee40e86e84
|
// md5key: NxDhJztSzCDFzs3Z5Fzck7BAG2sRA4DY5aKScJDZrAzMkCh7
|
// msgSrcId: 34U0
|
// mid: 898150841210108
|
// tid: 84UJWSE8
|
// instMid: QRPAYDEFAULT
|
|
public static ResultUtil cancleMoney(BigDecimal amount,String no) throws Exception {
|
JSONObject json = new JSONObject();
|
json.put("requestTimestamp", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); // 报文请求时间
|
// json.put("merOrderId", Util.getMerOrderId("34U0")); // 商户订单号
|
json.put("merOrderId", no); // 商户订单号
|
json.put("mid", "898150841210108"); // 商户号
|
json.put("tid", "84UJWSE8"); // 终端号
|
json.put("instMid", "QRPAYDEFAULT"); // 业务类型
|
BigDecimal multiply = amount.multiply(new BigDecimal(100));
|
int money = multiply.intValue();
|
json.put("refundAmount",money); // 支付总金额
|
System.err.println("请求报文json:\n" + json);
|
String url = "https://test-api-open.chinaums.com/v1/netpay/refund";
|
// String url = "https://api-mop.chinaums.com/v1/netpay/refund";
|
//OPEN-BODY-SIG 方式
|
String result = GetOpenBodySig.sendOpenBodySig(url, json.toString());
|
System.err.println("响应报文json:\n" + result);
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
Object appPayRequest = jsonObject.get("appPayRequest");
|
System.out.println(appPayRequest);
|
return ResultUtil.success(appPayRequest);
|
}
|
|
@Autowired
|
private ITEnterpriseWithdrawalService tEnterpriseWithdrawalService;
|
@Autowired
|
private IUserWithdrawalService userWithdrawalService;
|
|
public String createAllocationReq(Integer companyId,Integer userId,int type,double money){
|
List<TEnterpriseWithdrawal> tEnterpriseWithdrawals = tEnterpriseWithdrawalService.selectList(new EntityWrapper<TEnterpriseWithdrawal>().eq("companyId", companyId));
|
TDriver tUser = tDriverService.selectById(userId);
|
List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone", tUser.getPhone()));
|
if(userWithdrawals.size()==0){
|
return "error";
|
}
|
|
AllocationReq allocationReq= new AllocationReq();
|
allocationReq.setOutOrderNo(ToolUtil.getRandomString(32));
|
if(type==1){
|
|
allocationReq.setPayBalanceAcctId(tEnterpriseWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setRecvBalanceAcctId(userWithdrawals.get(0).getBalanceAcctId());
|
|
allocationReq.setPassword(Base64Util.decode(tEnterpriseWithdrawals.get(0).getTransactionAuthorizationCode()));
|
}else {
|
allocationReq.setRecvBalanceAcctId(tEnterpriseWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setPayBalanceAcctId(userWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setPassword(Base64Util.decode(userWithdrawals.get(0).getTransactionAuthorizationCode()));
|
}
|
money=money*100;
|
allocationReq.setAmount((int)money);
|
allocationReq.setProductName("分账");
|
allocationReq.setProductCount(1);
|
allocationReq.setOrderNo(ToolUtil.getRandomString(32));
|
allocationReq.setOrderAmount(1l);
|
try {
|
AllocationResp allocationResp = AllocationExample.create(allocationReq);
|
System.out.println(allocationResp);
|
return "ok";
|
} catch (UpyztException e) {
|
e.printStackTrace();
|
return e.getMessage();
|
}
|
|
}
|
public String createAllocationReqUser(Integer companyId,Integer userId,int type,double money){
|
List<TEnterpriseWithdrawal> tEnterpriseWithdrawals = tEnterpriseWithdrawalService.selectList(new EntityWrapper<TEnterpriseWithdrawal>().eq("companyId", companyId));
|
TUser tUser = userService.selectById(userId);
|
List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone", tUser.getPhone()));
|
if(userWithdrawals.size()==0){
|
return "error";
|
}
|
AllocationReq allocationReq= new AllocationReq();
|
allocationReq.setOutOrderNo(ToolUtil.getRandomString(32));
|
if(type==1){
|
|
allocationReq.setPayBalanceAcctId(tEnterpriseWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setRecvBalanceAcctId(userWithdrawals.get(0).getBalanceAcctId());
|
|
allocationReq.setPassword(Base64Util.decode(tEnterpriseWithdrawals.get(0).getTransactionAuthorizationCode()));
|
}else {
|
allocationReq.setRecvBalanceAcctId(tEnterpriseWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setPayBalanceAcctId(userWithdrawals.get(0).getBalanceAcctId());
|
allocationReq.setPassword(Base64Util.decode(userWithdrawals.get(0).getTransactionAuthorizationCode()));
|
}
|
money=money*100;
|
allocationReq.setAmount((int)money);
|
allocationReq.setProductName("分账");
|
allocationReq.setProductCount(1);
|
allocationReq.setOrderNo(ToolUtil.getRandomString(32));
|
allocationReq.setOrderAmount(1l);
|
try {
|
AllocationResp allocationResp = AllocationExample.create(allocationReq);
|
System.out.println(allocationResp);
|
return "ok";
|
} catch (UpyztException e) {
|
e.printStackTrace();
|
return e.getMessage();
|
}
|
|
}
|
|
public static void main(String[] args) throws Exception {
|
ResultUtil resultUtil = cancleMoney(new BigDecimal(0.01), "34U02023062418175413584261700");
|
}
|
}
|