提交 f03404ae 作者: 张小凤

express(add)

上级 cab47363
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 15:42
* @Version 1.0
*/
public interface Auto {
}
package com.mmc.oms.common;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
/**
* @Author small
* @Date 2023/5/31 16:51
* @Version 1.0
*/
public class KdnExpressUtil {
// 用户ID,快递鸟提供,注意保管,不要泄漏
private static String EBusinessID = "1741818";// 即用户ID,登录快递鸟官网会员中心获取
// https://www.kdniao.com/UserCenter/v4/UserHome.aspx
// API key,快递鸟提供,注意保管,不要泄漏
private static String ApiKey = "d02b4c1e-2c59-46a5-859d-4c7832aad03c";// 即API key,登录快递鸟官网会员中心获取
// https://www.kdniao.com/UserCenter/v4/UserHome.aspx
// 请求url, 正式环境地址
private static String ReqURL = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
//订阅推送请求url, 正式环境地址
private static String KdApiSearchMonitorPushReqURL="https://api.kdniao.com/api/dist";
public static void main(String[] args) {
try {
System.out.println(KdnExpressUtil.SF("15858341767", "SF11319617182224329"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* https://www.kdniao.com/api-trackexpress
*
* @param phone
* @param logisticCode
* @return
* @throws Exception
*/
public static String SF(String phone, String logisticCode) throws Exception {
//
String phone4 = phone.substring(phone.length() - 4, phone.length());
return KdnExpressUtil.orderOnlineByJson(phone4, "SF", logisticCode);
}
/**
* https://www.kdniao.com/api-trackexpress
*
* @param shopCode
* @param logisticCode
* @return
* @throws Exception
*/
public static String JD(String shopCode, String logisticCode) throws Exception {
// shopCode:京东的青龙配送码,貌似随便填也可以
return KdnExpressUtil.orderOnlineByJson(shopCode, "JD", logisticCode);
}
public static String others(String exCode, String logisticCode) throws Exception {
// shopCode:京东的青龙配送码,貌似随便填也可以
return KdnExpressUtil.orderOnlineByJson("", exCode, logisticCode);
}
public static String monitorPush(String port, Long orderId, String shipperCode, String logisticCode, String phone) throws Exception {
String callbackTag = port + "-" + orderId;
String customerName = phone.substring(phone.length() - 4, phone.length());
return kdApiSearchMonitorPush(callbackTag, shipperCode, logisticCode, customerName);
}
/**
* 快递查询接口
*
* @param logisticCode-物流单号
* @return
* @throws Exception
*/
public static String orderOnlineByJson(String customerName, String shipperCode, String logisticCode)
throws Exception {
// 组装应用级参数
String RequestData = "{" + "'OrderCode': ''," + "'CustomerName': '" + customerName + "'," + "'LogisticCode': '"
+ logisticCode
+ "',"
+ "'ShipperCode': '" + shipperCode + "'}";
// 组装系统级参数
Map<String, String> params = new HashMap<String, String>();
params.put("RequestData", urlEncoder(RequestData, "UTF-8"));
params.put("EBusinessID", EBusinessID);
params.put("RequestType", "8003");// 快递查询接口指令8002/地图版快递查询接口指令8004
String dataSign = encrypt(RequestData, ApiKey, "UTF-8");
params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
// 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
String result = sendPost(ReqURL, params);
// 根据公司业务处理返回的信息......
return result;
}
/**
* 物流跟踪接口(增值版)
* @param callbackTag-表示端口及订单:端口/订单号
* @param shipperCode-快递公司编码
* @param logisticCode-快递编号
* @param customerName-用户手机尾号4位
* @return
* @throws Exception
*/
public static String kdApiSearchMonitorPush(String callbackTag, String shipperCode, String logisticCode, String customerName) throws Exception{
// 组装应用级参数
String RequestData= "{"+
"'Callback':'"+callbackTag+"',"+
"'ShipperCode':'"+shipperCode+"',"+
"'LogisticCode':'"+logisticCode+"',"+
"'CustomerName':'"+customerName+"',"+
"}";
// 组装系统级参数
Map<String,String> params = new HashMap<String,String>();
params.put("RequestData", urlEncoder(RequestData, "UTF-8"));
params.put("EBusinessID", EBusinessID);
params.put("RequestType", "8005");//在途监控订阅接口指令8008/地图版订阅接口指令8005
String dataSign=encrypt(RequestData, ApiKey, "UTF-8");
params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
// 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
String result=sendPost(KdApiSearchMonitorPushReqURL, params);
//根据公司业务处理返回的信息......
return result;
}
/**
* MD5加密 str 内容 charset 编码方式
*
* @throws Exception
*/
private static String MD5(String str, String charset) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val <= 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toLowerCase();
}
/**
* base64编码 str 内容 charset 编码方式
*
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("restriction")
private static String base64(String str, String charset) throws UnsupportedEncodingException {
String encoded = Base64.encode(str.getBytes(charset));
return encoded;
}
@SuppressWarnings("unused")
private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
String result = URLEncoder.encode(str, charset);
return result;
}
/**
* 电商Sign签名生成 content 内容 keyValue ApiKey charset 编码方式
*
* @throws UnsupportedEncodingException ,Exception
* @return DataSign签名
*/
@SuppressWarnings("unused")
private static String encrypt(String content, String keyValue, String charset)
throws UnsupportedEncodingException, Exception {
if (keyValue != null) {
return base64(MD5(content + keyValue, charset), charset);
}
return base64(MD5(content, charset), charset);
}
/**
* 向指定 URL 发送POST方法的请求 url 发送请求的 URL params 请求的参数集合
*
* @return 远程资源的响应结果
*/
private static String sendPost(String url, Map<String, String> params) {
OutputStreamWriter out = null;
BufferedReader in = null;
StringBuilder result = new StringBuilder();
try {
URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// POST方法
conn.setRequestMethod("POST");
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.connect();
// 获取URLConnection对象对应的输出流
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
// 发送请求参数
if (params != null) {
StringBuilder param = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (param.length() > 0) {
param.append("&");
}
param.append(entry.getKey());
param.append("=");
param.append(entry.getValue());
System.out.println(entry.getKey() + ":" + entry.getValue());
}
System.out.println("param:" + param.toString());
out.write(param.toString());
}
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result.toString();
}
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 16:53
* @Version 1.0
*/
public enum OrderCountDayNum {
yesterday(1,"yesterday","昨日"),
recentWeek(7,"recentWeek","近七日"),
recentMonth(30,"recentMonth","近30日"),
two(2,"two","前天"),
fourteen(14,"fourteen","14天前"),
thirty(60,"thirty","三十天前");
private Integer day;
private String flag;
private String status;
OrderCountDayNum(Integer dayNum, String flag, String status) {
this.day = dayNum;
this.flag = flag;
this.status = status;
}
public Integer getDay() {
return day;
}
public void setDay(Integer day) {
this.day = day;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.oms.common;
import com.mmc.oms.model.dto.OrderInfoDTO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
/**
* @Author small
* @Date 2023/5/31 16:26
* @Version 1.0
*/
@Mapper
public interface Publicsher {
void sendRepoOrderInit(OrderInfoDTO orderInfo);
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 16:44
* @Version 1.0
*/
public interface Refund {
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 16:48
* @Version 1.0
*/
public enum RenMethod {
EXPRESS(0, "邮寄"), SHOP(1, "门店归还");
RenMethod(Integer code, String status) {
this.code = code;
this.status = status;
}
private Integer code;
private String status;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 15:41
* @Version 1.0
*/
public interface Send {
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 16:45
* @Version 1.0
*/
public interface Share {
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 15:42
* @Version 1.0
*/
public interface Take {
}
package com.mmc.oms.common;
/**
* @Author small
* @Date 2023/5/31 15:49
* @Version 1.0
*/
public enum VcuType {
SEND(0, "神行太保端"), REC(1, "客户收货"), RETURN(2, "归还"), PFREC(3, "平台收货"), RETREAT(4, "申请退款")
;
VcuType(Integer code, String status) {
this.code = code;
this.status = status;
}
private Integer code;
private String status;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.oms.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @Author small
* @Date 2023/5/31 17:03
* @Version 1.0
*/
@Configuration
public class ThreadPoolConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(){
/**
* 核心线程数
* 拥有最多线程数
* 表示空闲线程的存活时间
* 存活时间单位
* 用于缓存任务的阻塞队列
* 省略:
* threadFactory:指定创建线程的工厂
* handler:表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。
*/
return new ThreadPoolExecutor(50,
500,
30,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10000));
}
}
package com.mmc.oms.controller;
import com.mmc.oms.common.ResultBody;
import com.mmc.oms.model.dto.OrderInfoDTO;
import com.mmc.oms.model.dto.OrderReceiptDTO;
import com.mmc.oms.model.dto.TranStatusDicDTO;
import com.mmc.oms.service.OrderLogisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author small
* @Date 2023/5/31 16:14
* @Version 1.0
*/
@Api(tags = { "订单-物流-接口" })
@RestController
@RequestMapping("/express/")
public class OrderLogisticsController extends BaseController {
@Autowired
private OrderLogisticsService orderLogisticsService;
@ApiOperation(value = "物流-状态码-字典")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = TranStatusDicDTO.class) })
@GetMapping("listKdnDic")
public ResultBody listKdnDic() {
return ResultBody.success(orderLogisticsService.listKdnDic());
}
@ApiOperation(value = "物流公司-字典")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = TranStatusDicDTO.class) })
@GetMapping("listExpressInfo")
public ResultBody listExpressInfo() {
return ResultBody.success(orderLogisticsService.listExpressInfo());
}
@ApiOperation(value = "查询订单的发货、收货、退换货等信息")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = OrderReceiptDTO.class) })
@GetMapping("getOrderExpress")
public ResultBody getOrderExpress(@RequestParam Integer orderInfoId) {
return ResultBody.success(orderLogisticsService.getOrderReceiptInfo(orderInfoId));
}
@ApiOperation(value = "查看发货物流信息-订单")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class) })
@GetMapping("orderExpressInfo")
public ResultBody orderExpressInfo(@RequestParam Integer orderInfoId) {
return orderLogisticsService.orderExpressInfo(orderInfoId);
}
@ApiOperation(value = "查看退货物流信息-订单")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class) })
@GetMapping("refundExpressInfo")
public ResultBody refundExpressInfo(@RequestParam Integer orderInfoId) {
return orderLogisticsService.refundExpressInfo(orderInfoId);
}
}
package com.mmc.oms.controller;
import com.mmc.oms.common.ResultBody;
import com.mmc.oms.common.Send;
import com.mmc.oms.model.dto.OrderInfoDTO;
import com.mmc.oms.model.qo.OrderInfoQO;
import com.mmc.oms.model.vo.LeaseOrderVO;
import com.mmc.oms.model.vo.OrderVcuVO;
import com.mmc.oms.service.RentalOrdersService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
......@@ -25,9 +28,25 @@ public class RentalOrdersController extends BaseController{
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class)})
@PostMapping("feignAddLease")
public OrderInfoDTO feignAddLease(HttpServletRequest request, @RequestBody LeaseOrderVO param) {
return rentalOrdersService.feignAddLease(request,param);
return rentalOrdersService.feignAddLease(this.getCurrentAccount(request),param);
}
@ApiOperation(value = "web 租赁订单-分页-列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class)})
@PostMapping("listPcWechatOrder")
public ResultBody listPcWechatOrder(HttpServletRequest request, @RequestBody OrderInfoQO param) {
return ResultBody.success(
rentalOrdersService.listPcOrderInfo(param, this.getCurrentAccount(request)));
}
@ApiOperation(value = "订单-详情")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class)})
@GetMapping("orderDetail")
......@@ -36,13 +55,7 @@ public class RentalOrdersController extends BaseController{
return ResultBody.success(rentalOrdersService.getOrderDetail(orderNo));
}
@ApiOperation(value = "租赁订单-分页-列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class)})
@PostMapping("listPcWechatOrder")
public ResultBody listPcWechatOrder(HttpServletRequest request, @RequestBody OrderInfoQO param) {
return ResultBody.success(
rentalOrdersService.listPcOrderInfo(param, this.getCurrentAccount(request)));
}
@ApiOperation(value = "小程序-云仓-订单-分页-列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = OrderInfoDTO.class)})
......@@ -51,4 +64,23 @@ public class RentalOrdersController extends BaseController{
HttpServletRequest request, @RequestBody OrderInfoQO param) {
return ResultBody.success(rentalOrdersService.listPageWechatOrder(this.getCurrentAccount(request), param));
}
@ApiOperation(value = "订单状态的变更")
@GetMapping("orderStatusChanges")
public ResultBody orderStatusChanges( @RequestParam(value = "orderNo",required = true) String orderNo,
@RequestParam(value = "tranStatus",required = true )Integer tranStatus ) {
return ResultBody.success(rentalOrdersService.orderStatusChanges( orderNo,tranStatus));
}
@ApiOperation(value = "后台管理——发货-订单")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@PostMapping("sendOrderWare")
public ResultBody sendOrderWare(HttpServletRequest request,
@Validated({ Send.class }) @RequestBody OrderVcuVO param) {
return rentalOrdersService.sendOrderWare(this.getCurrentAccount(request), param);
}
}
package com.mmc.oms.dao;
import com.mmc.oms.entity.*;
import com.mmc.oms.model.qo.OrderInfoQO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 16:23
* @Version 1.0
*/
@Mapper
public interface OrderLogisticsDao {
OrderInfoDO getOrderInfo(Integer orderInfoId);
void insertOrderInfo(OrderInfoDO order);
List<TranStatusDicDO> listTranStatus();
OrderInfoDO getOrderDetail(String orderNo);
void insertOrderReceipt(OrderReceiptDO receipt);
OrderReceiptDO getOrderReceiptByOrder(Integer orderInfoId);
OrderInfoDO getAccountOrderInfo(Integer orderInfoId, Integer repoAccountId);
void updateOrderInfo(OrderInfoDO orderInfo);
void updateOrderReceipt(OrderReceiptDO receipt);
OrderInfoDO getOrderSimpleInfo(Integer orderInfoId);
int countPageOrderInfo(OrderInfoQO param);
List<OrderInfoDO> listPageOrderInfo(OrderInfoQO param);
List<KdnDicDO> listKdnDic();
int countPcOrderInfo(OrderInfoQO param);
List<OrderInfoDO> listPcOrderInfo(OrderInfoQO param);
int countOrderInfo(String tranStatus,List<Integer> companys);
List<ExpressInfoDO> listExpressInfo();
void insertOrderVcu(OrderVcuDO vcu);
OrderReceiptDO getOrderReceiptInfo(Integer orderInfoId);
OrderVcuDO getOrderVcuInfo(Integer orderInfoId, Integer vcuType);
OrderVcuDO getRefundVcuInfo(Integer orderRefundId, Integer vcuType);
List<OrderVcuDO> listOrderVcuInfo(Integer orderInfoId);
List<OrderInfoDO> listOrderByTranStatus(String tranStatus);
Integer batchUpdateConfirmTake();
int listPcOrderInfoCount();
Integer getOrderInfoCountToYesterday(@Param("day") Integer day, @Param("date") Date date);
Integer getOrderInfoCount(@Param("day") Integer day,@Param("date")Date date);
}
package com.mmc.oms.dao;
import com.mmc.oms.entity.OrderRefundDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 16:25
* @Version 1.0
*/
@Mapper
public interface OrderRefundDao {
OrderRefundDO getNewOrderRefund(Integer orderInfoId);
}
package com.mmc.oms.dao;
import com.mmc.oms.entity.CouponUserDO;
import com.mmc.oms.entity.OrderInfoDO;
import com.mmc.oms.entity.OrderReceiptDO;
import com.mmc.oms.entity.OrderRefundDO;
import com.mmc.oms.entity.*;
import com.mmc.oms.model.qo.OrderInfoQO;
import org.apache.ibatis.annotations.Mapper;
......@@ -33,4 +30,16 @@ public interface RentalOrdersDao {
int countPageOrderInfo(OrderInfoQO param);
List<OrderInfoDO> listPageOrderInfo(OrderInfoQO param);
int orderStatusChanges(String orderNo,Integer tranStatus);
OrderInfoDO getOrderInfo(Integer orderInfoId);
void updateOrderReceipt(OrderReceiptDO receipt);
void insertOrderVcu(OrderVcuDO vcu);
void updateOrderInfo(OrderInfoDO upOrder);
OrderReceiptDO getOrderReceiptByOrder(Integer orderInfoId);
}
package com.mmc.oms.entity;
import com.mmc.oms.model.dto.ExpressInfoDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/31 16:38
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpressInfoDO implements Serializable {
private static final long serialVersionUID = 4348881349294310472L;
private Integer id;
private String exName;
private String exCode;
private Date createTime;
public ExpressInfoDTO buildExpressInfoDTO() {
return ExpressInfoDTO.builder().exName(this.exName).exCode(this.exCode).build();
}
}
package com.mmc.oms.entity;
import com.mmc.oms.model.dto.KdnDicDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:34
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KdnDicDO implements Serializable {
private static final long serialVersionUID = 5279687678334388676L;
private Integer id;
private String code;
private String msg;
public KdnDicDTO buildKdnDicDTO() {
return KdnDicDTO.builder().code(this.code).msg(this.msg).build();
}
}
package com.mmc.oms.entity;
import com.mmc.oms.model.dto.OrderVcuDTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.StringUtils;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/31 15:43
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderVcuDO implements Serializable {
private static final long serialVersionUID = 5685858931224789256L;
private Integer id;
private Integer orderInfoId;
private Integer orderRefundId;
private Integer vcuType;
private Integer vcuSatus;
private String imgs;
private String videoUrl;
private String remark;
private Date createTime;
public OrderVcuDTO buildOrderVcuDTO() {
return OrderVcuDTO.builder().id(this.id).orderInfoId(this.orderInfoId).vcuType(this.vcuType)
.vcuSatus(this.vcuSatus)
.imgs(StringUtils.isBlank(this.imgs) ? null : Arrays.asList(this.imgs.split(",")))
.remark(this.remark)
.videoUrl(this.videoUrl).build();
}
}
package com.mmc.oms.entity;
import com.mmc.oms.model.dto.TranStatusDicDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:33
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TranStatusDicDO implements Serializable {
private static final long serialVersionUID = 6067175193457424825L;
private Integer id;
private String status;
private String doing;
private String waiting;
private Integer sort;
public TranStatusDicDTO buildTranStatusDicDTO() {
return TranStatusDicDTO.builder().status(this.status).doing(this.doing).waiting(this.waiting).build();
}
}
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/31 16:49
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
//@ApiModel(value="CompanyInfoPO对象", description="单位详情")
public class CompanyInfoDTO implements Serializable {
private static final long serialVersionUID = -7580347447230474435L;
private Integer id;
private Integer parentId;
private String company;
private String fullName;
private String contactPhone;
private String contacts;
private String area;
private String address;
private String remark;
private Integer manage;
private Integer deleted;
private Integer leftNo;
private Integer rightNo;
private Date updateTime;
private Date createTime;
/**
* 辅助字段-start
*
* @param param
*/
private Integer userType;
@ApiModelProperty(value = "渠道等级")
private String channelLevel;
@ApiModelProperty(value = "收款银行")
private String dueBank;
@ApiModelProperty(value = "银行卡号")
private String bankCard;
}
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:17
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.CountOrderDTO", description = "订单统计DTO")
public class CountOrderDTO implements Serializable {
private static final long serialVersionUID = -1006840547598464202L;
@ApiModelProperty(value = "待付款数量")
private Integer waitPay;
@ApiModelProperty(value = "待发货数量")
private Integer waitEx;
@ApiModelProperty(value = "待退款售后")
private Integer waitRetreat;
@ApiModelProperty(value = "待确认归还")
private Integer waitReturn;
}
package com.mmc.oms.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:17
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpressInfoDTO implements Serializable {
private static final long serialVersionUID = -1869842899236089804L;
private String exName;
private String exCode;
}
package com.mmc.oms.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:16
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KdnDicDTO implements Serializable {
private static final long serialVersionUID = 5000282796168144041L;
private String code;
private String msg;
}
......@@ -29,6 +29,9 @@ public class OrderInfoDTO implements Serializable {
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "商品ID")
private Integer wareInfoId;
......@@ -107,14 +110,13 @@ public class OrderInfoDTO implements Serializable {
@ApiModelProperty(value = "交易编号")
private String payNo;
@ApiModelProperty(value = "支付时间")
@ApiModelProperty(value = "支付时间/付款时间")
private Date payTime;
@ApiModelProperty(value = "发货时间")
private Date sendWareTime;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "物流信息/收货地址信息")
private OrderReceiptDTO receipt;
......
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/31 16:45
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.PayCashResultDTO", description = "云仓支付扣款DTO")
public class PayCashResultDTO implements Serializable {
private static final long serialVersionUID = 5187623898281150213L;
@ApiModelProperty(value = "响应状态(200成功,其他失败)")
private String status;
@ApiModelProperty(value = "响应消息")
private String message;
@ApiModelProperty(value = "交易编号")
private String payNo;
@ApiModelProperty(value = "本次操作支付现金金额")
private BigDecimal cashPaid;
public static PayCashResultDTO error(String status, String message) {
return PayCashResultDTO.builder().status(status).message(message).build();
}
public static PayCashResultDTO success(BigDecimal cashPaid, String payNo) {
return PayCashResultDTO.builder().status("200").message("success").cashPaid(cashPaid).payNo(payNo).build();
}
}
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/31 16:41
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "com.mmc.csf.model.dto.ShareOrderDTO", description = "共享设备订单DTO")
public class ShareOrderDTO implements Serializable {
private static final long serialVersionUID = -1395178773843809078L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "用户id")
private Integer repoAccountId;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "用户手机号")
private String phoneNum;
@ApiModelProperty(value = "设备品牌")
private String deviceBrand;
@ApiModelProperty(value = "地区")
private String region;
@ApiModelProperty(value = "状态:查字典")
private Integer sdStatus;
@ApiModelProperty(value = "设备ID")
private String deviceCode;
@ApiModelProperty(value = "设备型号")
private String deviceModel;
@ApiModelProperty(value = "用户备注")
private String remark;
@ApiModelProperty(value = "平台备注")
private String pfRemark;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "修改人ID", hidden = true)
private Integer updateUser;
@ApiModelProperty(value = "操作人-名字")
private String opName;
@ApiModelProperty(value = "操作人-账号")
private String opNo;
}
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:15
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.TranStatusDicDTO", description = "订单状态DTO")
public class TranStatusDicDTO implements Serializable {
private static final long serialVersionUID = -5956006425413101797L;
@ApiModelProperty(value = "状态码")
private String status;
private String doing;
private String waiting;
}
package com.mmc.oms.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 11:01
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserAccountSimpleDTO implements Serializable {
private static final long serialVersionUID = 3451336520607073343L;
@ApiModelProperty(value = "用户id")
private Integer id;
@ApiModelProperty(value = "用户类型")
private Integer accountType;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "用户性别:0未知、1男、2女")
private Integer userSex;
@ApiModelProperty(value = "用户邮箱")
private String email;
@ApiModelProperty(value = "用户来源,0自然流、1海报、2抖音、3公众号、4社群、5招投标、6官网")
private Integer source;
@ApiModelProperty(value = "用户可用状态:0禁用、1可用")
private Integer accountStatus;
@ApiModelProperty(value = "账号类型:0后台管理账号 ; 100云享飞-客户端;")
private Integer portType;
@ApiModelProperty(value = "企业认证状态, 0未通过,1通过")
private Integer companyAuthStatus;
@ApiModelProperty(value = "账号")
private String accountNo;
@ApiModelProperty(value = "渠道等级id")
private Integer cooperationTagId;
}
......@@ -45,16 +45,16 @@ public class LeaseOrderVO implements Serializable {
@ApiModelProperty(value = "套餐sku名称", hidden = true)
private String skuTitle;
@ApiModelProperty(value = "租赁的用户id", example = "1")
@ApiModelProperty(value = "租赁的用户id", example = "1" ,hidden = true)
private Integer repoAccountId;
@ApiModelProperty(value = "租赁的用户uid", example = "UID008123")
@ApiModelProperty(value = "租赁的用户uid", example = "UID008123",hidden = true)
private String uid;
@ApiModelProperty(value = "租赁的用户名称", example = "xiaoXiao")
@ApiModelProperty(value = "租赁的用户名称", example = "xiaoXiao",hidden = true)
private String buyerName;
@ApiModelProperty(value = "租赁的用户手机", example = "18923131232")
@ApiModelProperty(value = "租赁的用户手机", example = "18923131232",hidden = true)
private String buyerPhone;
@ApiModelProperty(value = "单价 元/天", hidden = true)
......
package com.mmc.oms.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/31 16:37
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.OrderInfoVO", description = "云仓订单VO")
public class OrderInfoVO implements Serializable {
private static final long serialVersionUID = -8314404988776854118L;
@ApiModelProperty(value = "商品ID")
private Integer wareInfoId;
@ApiModelProperty(value = "SKU(套餐)ID")
private Integer skuInfoId;
@ApiModelProperty(value = "库存改变数量(正加负减)")
private Integer addStock;
@ApiModelProperty(value = "销量改变数量(正加负减)")
private Integer addSale;
@ApiModelProperty(value = "减库方式 0:买家拍下减库存 1:卖家付款减库存")
private Integer exWare;
@ApiModelProperty(value = "辅助字段")
private Integer num;
}
package com.mmc.oms.model.vo;
import com.mmc.oms.common.Auto;
import com.mmc.oms.common.Send;
import com.mmc.oms.common.Take;
import com.mmc.oms.entity.OrderReceiptDO;
import com.mmc.oms.entity.OrderVcuDO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 15:41
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.OrderVcuVO", description = "发货/收货类")
public class OrderVcuVO implements Serializable {
private static final long serialVersionUID = -4483344821357835193L;
@ApiModelProperty(value = "订单ID")
@NotNull(message = "订单id不能为空", groups = { Send.class, Auto.class })
private Integer orderInfoId;
@ApiModelProperty(value = "退款单id(退款-发货必填,其他可不填)")
@NotNull(message = "退款单id不能为空", groups = { Auto.class })
private Integer orderRefundId;
@ApiModelProperty(value = "物流公司编码")
@NotNull(message = "物流公司编码不能为空")
private String sendExCode;
@ApiModelProperty(value = "物流单号")
@NotNull(message = "物流单号不能为空")
private String sendExNo;
@ApiModelProperty(value = "发货地址")
private String sendAddress;
@ApiModelProperty(value = "退换货-电话")
@NotNull(message = "退换货-电话不能为空", groups = { Send.class })
private String renPhone;
@ApiModelProperty(value = "退换货-姓名")
@NotNull(message = "退换货-姓名不能为空", groups = { Send.class })
private String renName;
@ApiModelProperty(value = "退换货-地址")
@NotNull(message = "退换货-地址不能为空", groups = { Send.class })
private String renAddress;
@ApiModelProperty(value = "设备状况:0无问题 1有问题")
@NotNull(message = "设备状况", groups = { Take.class })
private Integer vcuSatus;
@ApiModelProperty(value = "补充描述")
private String remark;
@ApiModelProperty(value = "图片集合")
private List<String> imgs;
@ApiModelProperty(value = "视频")
private String videoUrl;
@ApiModelProperty(value = "操作密码")
private String authPwd;
public OrderReceiptDO buildReceipt() {
return OrderReceiptDO.builder().orderInfoId(this.orderInfoId).sendExCode(this.sendExCode)
.sendExNo(this.sendExNo).sendAddress(this.sendAddress).renPhone(this.renPhone).renName(this.renName)
.renAddress(this.renAddress).build();
}
public OrderVcuDO buildOrdeVcu() {
return OrderVcuDO.builder().vcuSatus(this.vcuSatus).remark(this.remark)
.imgs(CollectionUtils.isEmpty(this.imgs) ? null : String.join(",", this.imgs)).videoUrl(this.videoUrl)
.orderInfoId(this.orderInfoId).build();
}
}
package com.mmc.oms.model.vo;
import com.mmc.oms.common.Create;
import com.mmc.oms.common.Refund;
import com.mmc.oms.common.Share;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 16:43
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.RepoCashVO", description = "现金变更VO")
public class RepoCashVO implements Serializable {
private static final long serialVersionUID = 1828354753495845609L;
@ApiModelProperty(value = "用户ID")
@NotNull(message = "用户ID不能为空", groups = { Create.class })
private Integer repoAccountId;
@ApiModelProperty(value = "订单ID")
@NotNull(message = "orderRefundId不能为空", groups = { Refund.class })
private Integer orderRefundId;
@ApiModelProperty(value = "返租订单ID")
@NotNull(message = "shareOrderId不能为空", groups = { Share.class })
private Integer shareOrderId;
@ApiModelProperty(value = "变动金额")
@NotNull(message = "变动金额不能为空", groups = { Create.class, Refund.class })
private BigDecimal amtPaid;
@ApiModelProperty(value = "凭证图片集合")
private List<String> voucher;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "操作人员密码")
@NotNull(message = "变动金额不能为空", groups = { Refund.class, Share.class })
private String authPwd;
}
package com.mmc.oms.model.vo;
import com.mmc.oms.model.dto.BaseAccountDTO;
import com.mmc.oms.model.dto.OrderInfoDTO;
import com.mmc.oms.model.dto.RepoAccountDTO;
import com.mmc.oms.model.dto.ShareOrderDTO;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/31 16:39
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.RepoOrderPayVO", description = "订单支付VO")
public class RepoOrderPayVO implements Serializable {
private static final long serialVersionUID = 8149373745729826654L;
private BaseAccountDTO account;
private OrderInfoDTO orderInfo;
private ShareOrderDTO shareOrder;
private RepoAccountDTO repoAccount;
private RepoCashVO payCash;
private BigDecimal amtPaid;
private String refundNo;
}
package com.mmc.oms.model.vo;
import com.mmc.oms.entity.OrderVcuDO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 16:18
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.ReturnWareVO", description = "退换货类")
public class ReturnWareVO {
@ApiModelProperty(value = "订单ID")
@NotNull
private Integer orderInfoId;
@ApiModelProperty(value = "退还货方式:0邮寄 1门店地址")
@NotNull(message = "归还方式不能为空")
private Integer renMethod;
@ApiModelProperty(value = "门店id(退换货方式为门店归还时候必填)")
private Integer repoInfoId;
@ApiModelProperty(value = "还货-物流公司编码(还货方式为邮寄必填)")
private String renExCode;
@ApiModelProperty(value = "还货-物流单号(还货方式为邮寄必填)")
private String renExNo;
@ApiModelProperty(value = "设备状况:0无问题 1有问题")
@NotNull(message = "退换货-地址不能为空")
private Integer vcuSatus;
@ApiModelProperty(value = "补充描述")
private String remark;
@ApiModelProperty(value = "图片集合")
private List<String> imgs;
@ApiModelProperty(value = "视频")
private String videoUrl;
public OrderVcuDO buildOrdeVcu() {
return OrderVcuDO.builder().vcuSatus(this.vcuSatus).remark(this.remark)
.imgs(CollectionUtils.isEmpty(this.imgs) ? null : String.join(",", this.imgs)).videoUrl(this.videoUrl)
.orderInfoId(this.orderInfoId).build();
}
}
package com.mmc.oms.model.vo;
import com.mmc.oms.common.Create;
import com.mmc.oms.common.Insert;
import com.mmc.oms.common.Update;
import com.mmc.oms.model.qo.BaseInfoQO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/31 16:50
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "分页管理查询对象")
public class TagInfoAllotVO extends BaseInfoQO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id标识")
@NotNull(message = "id不能为空",groups = {Update.class})
private Integer id;
@ApiModelProperty(value = "标签名称")
@NotBlank(message = "名称不能为空", groups = { Create.class, Update.class, Insert.class })
@Length(max = 70, message = "名称不能超过70个字符", groups = { Create.class, Update.class, })
private String tagName;
@ApiModelProperty(value = "分成比例")
@Min(value = 0,message = "分成比例不能为负",groups = {Create.class,Update.class})
@Max(value = 100,message = "分成比例不能大于100",groups = {Create.class,Update.class})
private BigDecimal proportion;
@ApiModelProperty(value = "上级分成比例")
@Min(value = 0,message = "分成比例不能为负",groups = {Create.class,Update.class})
@Max(value = 100,message = "分成比例不能大于100",groups = {Create.class,Update.class})
private BigDecimal supProportion;
@ApiModelProperty(value = "结算时间")
@Min(value = 1,message = "结算时间不能少于1号",groups = {Create.class, Update.class})
@Max(value = 31,message = "结算时间不能大于31号",groups = {Create.class,Update.class})
private Integer balanceDate;
@ApiModelProperty(value = "提现费率")
@Min(value = 0,message = "分成比例不能为负",groups = {Create.class,Update.class})
@Max(value = 100,message = "分成比例不能大于100",groups = {Create.class, Update.class})
private BigDecimal extractRatio;
/**
* 传入数据库为小数值
*/
public TagInfoAllotVO convertDecimals(){
this.proportion = this.proportion==null?null:this.proportion.divide(new BigDecimal("100"), 5, BigDecimal.ROUND_DOWN);
this.supProportion = this.supProportion==null?null:this.supProportion.divide(new BigDecimal("100"), 5, BigDecimal.ROUND_DOWN);
this.extractRatio = this.extractRatio==null?null:this.extractRatio.divide(new BigDecimal("100"), 5, BigDecimal.ROUND_DOWN);
return this;
}
}
package com.mmc.oms.service.Impl;
import com.alibaba.fastjson.JSONObject;
import com.mmc.oms.common.*;
import com.mmc.oms.dao.OrderLogisticsDao;
import com.mmc.oms.dao.OrderRefundDao;
import com.mmc.oms.entity.OrderInfoDO;
import com.mmc.oms.entity.OrderReceiptDO;
import com.mmc.oms.entity.OrderRefundDO;
import com.mmc.oms.entity.OrderVcuDO;
import com.mmc.oms.model.dto.*;
import com.mmc.oms.model.qo.OrderInfoQO;
import com.mmc.oms.model.vo.*;
import com.mmc.oms.service.OrderLogisticsService;
import com.mmc.oms.wx.WxMsgTemplete;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @Author small
* @Date 2023/5/31 16:21
* @Version 1.0
*/
@Service
@Slf4j
public class OrderLogisticsServiceImpl implements OrderLogisticsService {
private final static String SYSTEM_CLOSE_PAYORDER_REASON = "逾期未支付,系统自动关闭订单";
@Autowired
private OrderLogisticsDao orderLogisticsDao;
@Autowired
private OrderRefundDao orderRefundDao;
/* @Autowired
private RepoPayServletClient repoPayServletClient;
@Autowired
private WareServletClient wareServletClient;
@Autowired
private RepoDeviceServletClient repoDeviceServletClient;
@Autowired
private UserServletClient userServletClient;
@Autowired
private RepoServletClient repoServletClient;*/
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private Publicsher publicsher;
@Autowired
private ThreadPoolExecutor executor;
/*@Resource
private OrderServletClient orderServletClient;*/
@Override
public OrderInfoDTO feignAddLease(LeaseOrderVO param) {
OrderInfoDO orderInfo = new OrderInfoDO(param);
orderLogisticsDao.insertOrderInfo(orderInfo);
// 添加收货地址
Date cdate = new Date();
OrderReceiptVO rv = param.getOrderReceipt();
OrderReceiptDO receipt = new OrderReceiptDO(rv);
receipt.setOrderInfoId(orderInfo.getId());
receipt.setCreateTime(cdate);
orderLogisticsDao.insertOrderReceipt(receipt);
OrderInfoDTO dto = orderInfo.buildOrderInfoDTO();
// 发布订阅通知
publicsher.sendRepoOrderInit(dto);
return dto;
}
private void sendToBePaidMsg(Integer id) {
OrderInfoDO orderInfo = orderLogisticsDao.getOrderInfo(id);
/*RepoAccountDTO wechat = repoServletClient.feignRepoLoginInfo(orderInfo.getRepoAccountId());
if (wechat == null || StringUtils.isBlank(wechat.getOpenId())) {
return;
}*/
AppletMsgVO aMsg = new AppletMsgVO();
//aMsg.setTouser(wechat.getOpenId());
aMsg.setTemplate_id(WxMsgTemplete.AT_REPO_TO_BE_PAID);
aMsg.setPage(WxMsgDataConfig.REPO_SHIP_MESSAGE);
// 租赁产品
JSONObject thing2 = new JSONObject();
thing2.put("value", orderInfo.getWareTitle());
// 订单编号
JSONObject characterString1 = new JSONObject();
characterString1.put("value", orderInfo.getOrderNo());
// 租赁时间
JSONObject time3 = new JSONObject();
time3.put("value", TDateUtil.getDateStr(orderInfo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
// 订单金额
JSONObject amount6 = new JSONObject();
amount6.put("value", orderInfo.getShouldPay().toString());
// 订单金额
JSONObject thing9 = new JSONObject();
thing9.put("value", "请尽快完成订单支付");
JSONObject data = new JSONObject();
data.put("character_string1", characterString1);
data.put("thing2", thing2);
data.put("time3", time3);
data.put("amount6", amount6);
data.put("thing9", thing9);
aMsg.setData(data);
// repoServletClient.asynSendUserAppletMsg(aMsg);
}
@Override
public List<TranStatusDicDTO> listTranStatus() {
return orderLogisticsDao.listTranStatus().stream().map(d -> {
return d.buildTranStatusDicDTO();
}).collect(Collectors.toList());
}
@Override
public OrderInfoDTO getOrderDetail(String orderNo) {
OrderInfoDO order = orderLogisticsDao.getOrderDetail(orderNo);
OrderInfoDTO orderInfo = order.buildOrderInfoDTO();
OrderReceiptDO rd = orderLogisticsDao.getOrderReceiptInfo(order.getId());
OrderReceiptDTO receipt = rd.buildOrderReceiptDTO();
orderInfo.setReceipt(receipt);
// 查询-最新的退款详情单
OrderRefundDO orderRefund = orderRefundDao.getNewOrderRefund(order.getId());
if (orderRefund != null) {
OrderRefundDTO refund = orderRefund.buildOrderRefundDTO();
orderInfo.setOrderRefund(refund);
}
return orderInfo;
}
@Override
@Transactional
public ResultBody closeSelfOrder(Integer orderInfoId, String shutReason) {
OrderInfoDO order = orderLogisticsDao.getOrderInfo(orderInfoId);
if (order == null) {
return ResultBody.error(ResultEnum.ORDER_POWER_ERROR);
}
if (!TranStatusDic.INIT.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(orderInfoId);
upOrder.setTranStatus(TranStatusDic.CLOSE.getStatus());
upOrder.setShutReason(shutReason);
orderLogisticsDao.updateOrderInfo(upOrder);
if (WarePayStatus.BEFORE.getStatus().equals(order.getExWare().toString())) {
OrderInfoVO stock = OrderInfoVO.builder().wareInfoId(order.getWareInfoId()).skuInfoId(order.getSkuInfoId())
.addStock(order.getWareNum()).build();
ResultBody stockResult = null;
//wareServletClient.feignOrderNum(stock);
return stockResult;
}
return ResultBody.success();
}
@Override
@Transactional
public ResultBody platFormCloseOrder(Integer orderInfoId, String shutReason) {
OrderInfoDO order = orderLogisticsDao.getOrderInfo(orderInfoId);
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(orderInfoId);
upOrder.setTranStatus(TranStatusDic.CLOSE.getStatus());
upOrder.setShutReason(shutReason);
orderLogisticsDao.updateOrderInfo(upOrder);
if (WarePayStatus.BEFORE.getStatus().equals(order.getExWare().toString())) {
OrderInfoVO stock = OrderInfoVO.builder().wareInfoId(order.getWareInfoId()).skuInfoId(order.getSkuInfoId())
.addStock(order.getWareNum()).build();
ResultBody stockResult =null;
//wareServletClient.feignOrderNum(stock);
return stockResult;
}
return ResultBody.success();
}
@Override
public ResultBody batchCloseWaitPayOrder() {
List<String> errorOrders = new ArrayList<String>();
List<OrderInfoDO> orderList = orderLogisticsDao.listOrderByTranStatus(TranStatusDic.INIT.getStatus());
if (!CollectionUtils.isEmpty(orderList)) {
Date cdate = new Date();
for (OrderInfoDO d : orderList) {
//设置下单时间66小时之后
Date notificationTime = TDateUtil.addHourTime(d.getCreateTime(), 66);
Date ndate = TDateUtil.nextNumDateTime(d.getCreateTime(), 3);
if (cdate.compareTo(notificationTime) >= 0 && cdate.compareTo(ndate) <= 0) {
String key = RedisConstant.createRepoOrderOver(d.getId());
boolean isSended = stringRedisTemplate.hasKey(key);
if (!isSended) {
this.sendToBePaidMsg(d.getId());
stringRedisTemplate.opsForValue().set(key, key, 1L, TimeUnit.DAYS);
}
}
if (ndate.compareTo(cdate) <= 0) {// 已到时间,自动更新
try {
this.platFormCloseOrder(d.getId(), SYSTEM_CLOSE_PAYORDER_REASON);
} catch (Exception e) {
// 记录定时任务有误的订单
errorOrders.add(d.getOrderNo());
}
}
}
}
if (!CollectionUtils.isEmpty(errorOrders)) {
return ResultBody.error(ResultEnum.ORDER_PAY_JOB_ERROR, errorOrders);
}
return ResultBody.success();
}
@Override
public ResultBody updateOrderAddr(OrderReceiptVO param) {
OrderReceiptDO receipt = new OrderReceiptDO(param);
orderLogisticsDao.updateOrderReceipt(receipt);
return ResultBody.success();
}
@Override
public ResultBody updateOrderShop(OrderReceiptVO param) {
OrderReceiptDO receipt = new OrderReceiptDO(param);
orderLogisticsDao.updateOrderReceipt(receipt);
return ResultBody.success();
}
@Override
public OrderInfoDTO getOrderSimpleInfo(Integer orderInfoId) {
OrderInfoDO order = orderLogisticsDao.getOrderSimpleInfo(orderInfoId);
return order == null ? null : order.buildOrderInfoDTO();
}
@Override
@Transactional
public ResultBody payCashOrder(BaseAccountDTO account, Integer orderInfoId) {
OrderInfoDTO orderInfo = this.getOrderSimpleInfo(orderInfoId);
if (!orderInfo.getTranStatus().equals(TranStatusDic.INIT.getStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
// 更新商品库存信息&销量信息
Integer addStock;
Integer addSale;
if (orderInfo.getExWare().toString().equals(WarePayStatus.BEFORE.getStatus())) {
addStock = null;
addSale = orderInfo.getWareNum();
} else {
addStock = (orderInfo.getWareNum() * -1);
addSale = orderInfo.getWareNum();
}
OrderInfoVO stock = OrderInfoVO.builder().exWare(orderInfo.getExWare()).wareInfoId(orderInfo.getWareInfoId())
.skuInfoId(orderInfo.getSkuInfoId()).addStock(addStock).addSale(addSale).build();
ResultBody stockResult =null;
//wareServletClient.feignOrderNum(stock);
if (!ResultEnum.SUCCESS.getResultCode().equals(stockResult.getCode())) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return stockResult;
}
// 结账流水
RepoOrderPayVO orderPay = RepoOrderPayVO.builder().orderInfo(orderInfo).account(account).build();
PayCashResultDTO result = null;
//repoPayServletClient.feignPayCashOrder(orderPay);
if (!ResultEnum.SUCCESS.getResultCode().equals(result.getStatus())) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(result.getStatus(), result.getMessage());
}
Date cdate = new Date();
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(orderInfoId);
upOrder.setTranStatus(TranStatusDic.YFK.getStatus());
upOrder.setActualPay(result.getCashPaid());
upOrder.setPayNo(result.getPayNo());
upOrder.setPayTime(cdate);
orderLogisticsDao.updateOrderInfo(upOrder);
return ResultBody.success();
}
@Override
public PageResult listPageWechatOrder(BaseAccountDTO account, OrderInfoQO param) {
param.setRepoAccountId(account.getUserAccountId());
int count = orderLogisticsDao.countPageOrderInfo(param);
if (count == 0) {
return PageResult.buildPage(param.getPageNo(), param.getPageSize(), count);
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<OrderInfoDTO> data = orderLogisticsDao.listPageOrderInfo(param).stream().map(d -> {
return d.buildOrderInfoDTO();
}).collect(Collectors.toList());
return PageResult.buildPage(pageNo, param.getPageSize(), count, data);
}
@Override
public List<KdnDicDTO> listKdnDic() {
return orderLogisticsDao.listKdnDic().stream().map(d -> {
return d.buildKdnDicDTO();
}).collect(Collectors.toList());
}
@Override
public PageResult listPcOrderInfo(OrderInfoQO param, BaseAccountDTO cuser) {
/*if (!cuser.isManage()) {
param.setCompanys(cuser.getCompanyInfo().getCompanys());
}*/
Integer count = orderLogisticsDao.countPcOrderInfo(param);
if (count == 0) {
return PageResult.buildPage(param.getPageNo(), param.getPageSize(), count);
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<OrderInfoDTO> data = orderLogisticsDao.listPcOrderInfo(param).stream().map(d -> {
return d.buildOrderInfoDTO();
}).collect(Collectors.toList());
return PageResult.buildPage(pageNo, param.getPageSize(), count, data);
}
@Override
public CountOrderDTO countOrderInfo(BaseAccountDTO account) {
List<Integer> companys = null;
/*if(!account.isManage()){
companys = account.getCompanyInfo().getCompanys();
}*/
Integer waitPay = orderLogisticsDao.countOrderInfo(TranStatusDic.INIT.getStatus(), companys);
Integer waitEx = orderLogisticsDao.countOrderInfo(TranStatusDic.YFK.getStatus(), companys);
Integer waitRetreat = orderLogisticsDao.countOrderInfo(TranStatusDic.TKSQ.getStatus(), companys);
Integer waitReturn = orderLogisticsDao.countOrderInfo(TranStatusDic.GHZ.getStatus(), companys);
return CountOrderDTO.builder().waitPay(waitPay).waitEx(waitEx).waitRetreat(waitRetreat).waitReturn(waitReturn)
.build();
}
@Override
public List<ExpressInfoDTO> listExpressInfo() {
return orderLogisticsDao.listExpressInfo().stream().map(d -> {
return d.buildExpressInfoDTO();
}).collect(Collectors.toList());
}
@Override
@Transactional
public ResultBody sendOrderWare(BaseAccountDTO cuser, OrderVcuVO param) {
// 密码认证
ResultBody body = null;
//userServletClient.feignAuthUserPwd(cuser.getId(), param.getAuthPwd());
if (!ResultEnum.SUCCESS.getResultCode().equals(body.getCode())) {
return body;
}
OrderInfoDO order = orderLogisticsDao.getOrderInfo(param.getOrderInfoId());
if (!TranStatusDic.YFK.getStatus().equals(order.getTranStatus())
&& !TranStatusDic.TKSQ.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
Date cdate = new Date();
// 修改收发货地址信息
OrderReceiptDO receipt = param.buildReceipt();
orderLogisticsDao.updateOrderReceipt(receipt);
// 订单-视频、图片
OrderVcuDO vcu = param.buildOrdeVcu();
vcu.setVcuType(VcuType.SEND.getCode());
vcu.setCreateTime(cdate);
orderLogisticsDao.insertOrderVcu(vcu);
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(param.getOrderInfoId());
upOrder.setTranStatus(TranStatusDic.YFH.getStatus());
upOrder.setSendWareTime(cdate);
orderLogisticsDao.updateOrderInfo(upOrder);
this.sendShipMsg(param.getOrderInfoId());
return ResultBody.success();
}
private void sendShipMsg(Integer orderInfoId) {
OrderInfoDO orderInfo = orderLogisticsDao.getOrderInfo(orderInfoId);
RepoAccountDTO wechat =null;
//repoServletClient.feignRepoLoginInfo(orderInfo.getRepoAccountId());
OrderReceiptDO receipt = orderLogisticsDao.getOrderReceiptByOrder(orderInfoId);
if (wechat == null || StringUtils.isBlank(wechat.getOpenId())) {
return;
}
AppletMsgVO aMsg = new AppletMsgVO();
aMsg.setTouser(wechat.getOpenId());
aMsg.setTemplate_id(WxMsgTemplete.AT_REPO_SHIP);
aMsg.setPage(WxMsgDataConfig.REPO_SHIP_MESSAGE);
// 订单号
JSONObject orderNo = new JSONObject();
orderNo.put("value", orderInfo.getOrderNo());
// 商品名称
JSONObject wareName = new JSONObject();
wareName.put("value", orderInfo.getWareTitle());
// 快递公司
JSONObject expressName = new JSONObject();
expressName.put("value", receipt.getExName());
// 快递单号
JSONObject expressNo = new JSONObject();
expressNo.put("value", receipt.getSendExNo());
// 收货人
JSONObject receiptName = new JSONObject();
receiptName.put("value", receipt.getTakeName());
JSONObject data = new JSONObject();
data.put("character_string10", orderNo);
data.put("thing1", wareName);
data.put("phrase3", expressName);
data.put("character_string4", expressNo);
data.put("thing11", receiptName);
aMsg.setData(data);
//repoServletClient.asynSendUserAppletMsg(aMsg);
}
@Override
public OrderReceiptDTO getOrderReceiptInfo(Integer orderInfoId) {
OrderReceiptDO receipt = orderLogisticsDao.getOrderReceiptInfo(orderInfoId);
return receipt == null ? null : receipt.buildOrderReceiptDTO();
}
@Override
public ResultBody renterTakeOrder(OrderVcuVO param) {
OrderInfoDO order = orderLogisticsDao.getOrderInfo(param.getOrderInfoId());
if (!TranStatusDic.YFH.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
// 订单-视频、图片
OrderVcuDO vcu = param.buildOrdeVcu();
vcu.setVcuType(VcuType.REC.getCode());
vcu.setCreateTime(new Date());
orderLogisticsDao.insertOrderVcu(vcu);
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(param.getOrderInfoId());
upOrder.setTranStatus(TranStatusDic.ZLZ.getStatus());
orderLogisticsDao.updateOrderInfo(upOrder);
return ResultBody.success();
}
@Override
public ResultBody updateReceipt(OrderReceiptVO param) {
OrderReceiptDO receipt = param.buildOrderReceiptDO();
orderLogisticsDao.updateOrderReceipt(receipt);
return ResultBody.success();
}
@Override
public ResultBody returnOrderWare(ReturnWareVO param) {
OrderInfoDO order = orderLogisticsDao.getOrderInfo(param.getOrderInfoId());
if (!TranStatusDic.ZLZ.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
if (param.getRenMethod() == RenMethod.EXPRESS.getCode()) {
if (StringUtils.isBlank(param.getRenExCode()) || StringUtils.isBlank(param.getRenExNo())) {
return ResultBody.error(ResultEnum.EXPRESS_RETURN_ERROR);
}
OrderReceiptDO receipt = new OrderReceiptDO();
receipt.setOrderInfoId(param.getOrderInfoId());
receipt.setRenMethod(RenMethod.EXPRESS.getCode());
receipt.setRenExCode(param.getRenExCode());
receipt.setRenExNo(param.getRenExNo());
orderLogisticsDao.updateOrderReceipt(receipt);
} else {
if (param.getRepoInfoId() == null) {
return ResultBody.error(ResultEnum.SHOP_RETURN_ERROR);
}
RepoInfoDTO repoInfo = null;
//repoDeviceServletClient.feignGetRepoShop(param.getRepoInfoId());
if (repoInfo == null) {
return ResultBody.error(ResultEnum.FEIGN_DEVICE_SERVLET_ERROR);
}
OrderReceiptDO receipt = new OrderReceiptDO();
receipt.setOrderInfoId(param.getOrderInfoId());
receipt.setRenMethod(RenMethod.SHOP.getCode());
receipt.setRenRepoName(repoInfo.getRepoName());
receipt.setRenRepoAddr(repoInfo.getRepoAddress());
UserAccountDTO repoUser = null;
//userServletClient.feignGetUserSimpleInfo(repoInfo.getUserAccountId());
if (repoUser == null) {
return ResultBody.error(ResultEnum.FEIGN_USER_SERVLET_ERROR);
}
receipt.setRenRepoPhone(repoUser.getPhoneNum());
orderLogisticsDao.updateOrderReceipt(receipt);
}
// 订单-视频、图片
OrderVcuDO vcu = param.buildOrdeVcu();
vcu.setVcuType(VcuType.RETURN.getCode());
vcu.setCreateTime(new Date());
orderLogisticsDao.insertOrderVcu(vcu);
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(param.getOrderInfoId());
upOrder.setTranStatus(TranStatusDic.GHZ.getStatus());
orderLogisticsDao.updateOrderInfo(upOrder);
return ResultBody.success();
}
@Override
public ResultBody pfConfirmOrderWare(BaseAccountDTO cuser, OrderVcuVO param) {
// 密码认证
ResultBody body =null;
//userServletClient.feignAuthUserPwd(cuser.getId(), param.getAuthPwd());
if (!ResultEnum.SUCCESS.getResultCode().equals(body.getCode())) {
return body;
}
OrderInfoDO order = orderLogisticsDao.getOrderInfo(param.getOrderInfoId());
if (!TranStatusDic.GHZ.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
// 订单-视频、图片
OrderVcuDO vcu = param.buildOrdeVcu();
vcu.setVcuType(VcuType.PFREC.getCode());
vcu.setCreateTime(new Date());
orderLogisticsDao.insertOrderVcu(vcu);
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(param.getOrderInfoId());
upOrder.setTranStatus(TranStatusDic.JYWC.getStatus());
orderLogisticsDao.updateOrderInfo(upOrder);
// 以异步方式同步数据到分成明细表 云仓
this.SynchronousDataToPushMoney(order.getOrderNo());
return ResultBody.success();
}
@Override
public void SynchronousDataToPushMoney(String OrderNo) {
CompletableFuture.runAsync(()->{
OrderInfoDO upOrder = orderLogisticsDao.getOrderDetail(OrderNo);
Integer rcdCompanyId = upOrder.getRcdCompanyId();
Integer repoAccountId = upOrder.getRepoAccountId();
Date createTime = upOrder.getCreateTime();
if(rcdCompanyId == null){
log.info("推荐机构ID为空,不参与过分成管理");
}
// 通过用户ID查找对应分享码单位
ResultBody<CompanyInfoDTO> result = null;
//userServletClient.queryCompanyInfoById(rcdCompanyId);
if(Objects.isNull(result)){
// 失败重试
result = null;
//userServletClient.queryCompanyInfoById(rcdCompanyId);
}
if(Objects.isNull(result)){
log.info("订单ID为[{}],推荐机构ID为[{}],没有参与过分享码活动",upOrder.getId(),rcdCompanyId);
return;
}
if(Objects.isNull(result.getResult().getId())){
log.info("订单ID为[{}],用户ID为[{}],没有参与过分享码活动,不记录到分成明细中",upOrder.getId(),repoAccountId);
}
CompanyInfoDTO companyInfoDTO = result.getResult();
// 记录到订单明细中
String s = stringRedisTemplate.opsForValue().get(RedisConstant.TAGINFOALLOT_QUESTALL);
if(s==null){
log.error("访问redis的key值失败,其key为[{}]", RedisConstant.TAGINFOALLOT_QUESTALL);
return;
}
List<TagInfoAllotVO> tagInfoAllotDOS = JSONObject.parseArray(s,TagInfoAllotVO.class);
Optional<TagInfoAllotVO> tagInfoAllot = tagInfoAllotDOS.stream().filter(item -> item.getTagName().equals(companyInfoDTO.getChannelLevel())).findFirst();
if(Objects.nonNull(tagInfoAllot)){
TagInfoAllotVO tagInfoAllotVO = tagInfoAllot.get();
//orderServletClient.pushMoneyDetailInsert(new PushMoneyDetailVO(upOrder.getOrderNo(),repoAccountId,companyInfoDTO.getId(),tagInfoAllotVO.getProportion(),tagInfoAllotVO.getSupProportion(),PushMoneyEnum.STORE_CHANNEL.getCode(),createTime));
}
},executor);
}
@Override
public ResultBody orderExpressInfo(Integer orderInfoId) {
// 订单信息
OrderInfoDTO orderInfo = this.getOrderSimpleInfo(orderInfoId);
// 收发货信息
OrderReceiptDTO receipt = this.getOrderReceiptInfo(orderInfoId);
// 物流Api信息
KdnExpDTO expressInfo = null;
try {
expressInfo = this.getOrderExpInfo(receipt);
} catch (Exception e) {
return ResultBody.error(ResultEnum.ORDER_EXPRESS_ERROR);
}
orderInfo.setExpress(expressInfo);
return ResultBody.success(orderInfo);
}
private KdnExpDTO getOrderExpInfo(OrderReceiptDTO receipt) throws Exception {
String json = "";
if ("SF".equals(receipt.getSendExCode())) {
json = KdnExpressUtil.SF(receipt.getTakePhone(), receipt.getSendExNo());
} else if ("JD".equals(receipt.getSendExCode())) {
json = KdnExpressUtil.JD("", receipt.getSendExNo());
} else {
json = KdnExpressUtil.others(receipt.getSendExCode(), receipt.getSendExNo());
}
KdnExpDTO exp = JsonUtil.parseJsonToObj(json, KdnExpDTO.class);
exp.setLogisticCode(receipt.getSendExNo());
if (!CollectionUtils.isEmpty(exp.getTraces())) {
Collections.sort(exp.getTraces(), Comparator.comparing(ExpStationsDTO::getAcceptTime).reversed());// 升序
}
return exp;
}
private KdnExpDTO getRefundExpInfo(OrderReceiptDTO receipt) throws Exception {
String json = "";
if ("SF".equals(receipt.getRenExCode())) {
json = KdnExpressUtil.SF(receipt.getRenPhone(), receipt.getRenExNo());
} else if ("JD".equals(receipt.getRenExCode())) {
json = KdnExpressUtil.JD("", receipt.getRenExNo());
} else {
json = KdnExpressUtil.others(receipt.getRenExCode(), receipt.getRenExNo());
}
KdnExpDTO exp = JsonUtil.parseJsonToObj(json, KdnExpDTO.class);
exp.setLogisticCode(receipt.getRenExNo());
if (!CollectionUtils.isEmpty(exp.getTraces())) {
Collections.sort(exp.getTraces(), Comparator.comparing(ExpStationsDTO::getAcceptTime).reversed());// 升序
}
return exp;
}
@Override
public OrderInfoDTO pfOrderDetail(Integer orderInfoId) {
OrderInfoDO order = orderLogisticsDao.getOrderInfo(orderInfoId);
OrderInfoDTO orderInfo = order.buildOrderInfoDTO();
// 查询物流信息
OrderReceiptDTO receipt = this.getOrderReceiptInfo(orderInfoId);
orderInfo.setReceipt(receipt);
try {
// 发货-物流动态
if (!StringUtils.isEmpty(receipt.getSendExCode()) && !StringUtils.isEmpty(receipt.getSendExNo())) {
KdnExpDTO exp = this.getOrderExpInfo(receipt);
orderInfo.setExpress(exp);
}
// 收货-物流动态
if (!StringUtils.isEmpty(receipt.getRenExCode()) && !StringUtils.isEmpty(receipt.getRenExNo())) {
KdnExpDTO rexp = this.getRefundExpInfo(receipt);
orderInfo.setRefundExpress(rexp);
}
} catch (Exception e) {
// 不影响
}
// 退货-物流详情
// 质检详情
List<OrderVcuDO> vcuList = orderLogisticsDao.listOrderVcuInfo(orderInfoId);
if (!CollectionUtils.isEmpty(vcuList)) {
vcuList.removeIf(d -> VcuType.RETREAT.getCode().toString().equals(d.getVcuType().toString()));
orderInfo.setVcus(vcuList.stream().map(d -> {
return d.buildOrderVcuDTO();
}).collect(Collectors.toList()));
}
return orderInfo;
}
@Override
public ResultBody batchTakeOrder() {
// 批量-自动确认收货
orderLogisticsDao.batchUpdateConfirmTake();
return ResultBody.success();
}
@Override
public ResultBody refundExpressInfo(Integer orderInfoId) {
// 订单信息
OrderInfoDTO orderInfo = this.getOrderSimpleInfo(orderInfoId);
// 收发货信息
OrderReceiptDTO receipt = this.getOrderReceiptInfo(orderInfoId);
if (StringUtils.isBlank(receipt.getRenExCode()) || StringUtils.isBlank(receipt.getRenExNo())) {
return ResultBody.error(ResultEnum.EX_INFO_ERROR);
}
// 物流Api信息
KdnExpDTO expressInfo = null;
try {
expressInfo = this.getRefundExpInfo(receipt);
} catch (Exception e) {
return ResultBody.error(ResultEnum.ORDER_EXPRESS_ERROR);
}
orderInfo.setRefundExpress(expressInfo);
return ResultBody.success(orderInfo);
}
@Override
public int listPcOrderInfoCount() {
return orderLogisticsDao.listPcOrderInfoCount();
}
@Override
public Integer getOrderInfoCount(Integer dayNum, Integer dateType) {
// 判断进来的是那个标识
if (dateType == 0) {
if (OrderCountDayNum.yesterday.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCountToYesterday(OrderCountDayNum.yesterday.getDay(), new Date());
} else if (OrderCountDayNum.recentWeek.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.recentWeek.getDay(), new Date());
} else if (OrderCountDayNum.recentMonth.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.recentMonth.getDay(), new Date());
} else if (OrderCountDayNum.two.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.two.getDay(), new Date());
} else if (OrderCountDayNum.fourteen.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.fourteen.getDay(), new Date());
} else if (OrderCountDayNum.thirty.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.thirty.getDay(), new Date());
}
} else if (dateType == 1) {
if (OrderCountDayNum.yesterday.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCountToYesterday(OrderCountDayNum.yesterday.getDay(), TDateUtil.getLastYearTodayDate());
} else if (OrderCountDayNum.recentWeek.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.recentWeek.getDay(), TDateUtil.getLastYearTodayDate());
} else if (OrderCountDayNum.recentMonth.getDay().equals(dayNum)) {
return orderLogisticsDao.getOrderInfoCount(OrderCountDayNum.recentMonth.getDay(), TDateUtil.getLastYearTodayDate());
}
}
return null;
}
@Override
public ResultBody testSendMsg(Integer id) {
this.sendToBePaidMsg(id);
return ResultBody.success();
}
}
package com.mmc.oms.service.Impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mmc.oms.common.*;
import com.mmc.oms.dao.RentalOrdersDao;
import com.mmc.oms.entity.*;
import com.mmc.oms.model.dto.*;
import com.mmc.oms.model.qo.OrderInfoQO;
import com.mmc.oms.model.vo.LeaseOrderVO;
import com.mmc.oms.model.vo.OrderReceiptVO;
import com.mmc.oms.model.vo.PriceAcquisition;
import com.mmc.oms.model.vo.RentalOrderVO;
import com.mmc.oms.model.vo.*;
import com.mmc.oms.service.RentalOrdersService;
import com.mmc.oms.wx.WxMsgTemplete;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
......@@ -43,9 +45,19 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Value("${userapp.url}")
private String userAppUrl;
@Override
public OrderInfoDTO feignAddLease(HttpServletRequest request, LeaseOrderVO param) {
public OrderInfoDTO feignAddLease(BaseAccountDTO user, LeaseOrderVO param) {
System.out.println(user);
//用户信息的远程调用
ResponseEntity<String> responseEntity = UserId(user.getUserAccountId());
UserAccountSimpleDTO account = JSON.parseObject(responseEntity.getBody(), UserAccountSimpleDTO.class);
OrderInfoDO orderInfo = new OrderInfoDO(param);
// 每天单价
BigDecimal unitPrice = orderInfo.getUnitPrice();
int i = 12;
......@@ -54,6 +66,10 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
// 天数
orderInfo.setPayDay(2);
orderInfo.setRepoAccountId(user.getUserAccountId());
orderInfo.setUid(user.getUid());
orderInfo.setBuyerName(user.getUserName());
orderInfo.setBuyerPhone(user.getPhoneNum());
rentalOrdersDao.insertOrderInfo(orderInfo);
// 添加收货地址
Date cdate = new Date();
......@@ -62,13 +78,26 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
receipt.setOrderInfoId(orderInfo.getId());
receipt.setCreateTime(cdate);
rentalOrdersDao.insertOrderReceipt(receipt);
orderInfo.setBalance(getRemainingBalance(request, param.getRepoAccountId()));
//获取剩余的余额
orderInfo.setBalance(getRemainingBalance(user.getToken(), user.getUserAccountId()));
// 将当前的用户id及订单编号存入redis
OrderInfoDTO dto = orderInfo.buildOrderInfoDTO();
stringRedisTemplate.opsForValue().set(orderInfo.getOrderNo(), JsonUtil.parseObjToJson(dto));
return dto;
}
private ResponseEntity<String> UserId(Integer repoAccountId) {
// 用户信息
ResponseEntity<String> response =
restTemplate.getForEntity(
userAppUrl
+ "user-account/feignGetUserSimpleInfo?userAccountId="
+ repoAccountId,
String.class);
return response;
}
@Override
@Transactional
public ResultBody addLease(BaseAccountDTO account, RentalOrderVO param) {
......@@ -108,10 +137,10 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
* @param repoAccountId
* @return
*/
public BigDecimal getRemainingBalance(HttpServletRequest request, Integer repoAccountId) {
public BigDecimal getRemainingBalance(String token, Integer repoAccountId) {
HttpHeaders headers = new HttpHeaders();
//封装请求头
headers.add("token", request.getHeader("token"));
headers.add("token", token);
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
ResponseEntity<String> result4 = restTemplate.exchange("http://localhost:8088/payment/repocash/RemainingBalance?repoAccountId=" + repoAccountId,
HttpMethod.GET, formEntity, String.class);
......@@ -181,10 +210,6 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
.wareNo(sku.getWareNo())
.skuInfoId(sku.getSkuInfoId())
.skuTitle(sku.getSkuTitle())
.repoAccountId(account.getId())
.uid(account.getUid())
.buyerName(account.getAccountName())
.buyerPhone(account.getPhoneNum())
.unitPrice(sku.getUnitPrice())
.wareNum(sku.getWareNum())
.shouldPay(sku.getShouldPay())
......@@ -259,7 +284,6 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
@Override
public PageResult listPcOrderInfo(OrderInfoQO param, BaseAccountDTO cuser) {
Integer count = rentalOrdersDao.countPcOrderInfo(param);
if (count == 0) {
return PageResult.buildPage(param.getPageNo(), param.getPageSize(), count);
......@@ -294,4 +318,117 @@ public class RentalOrdersServiceImpl implements RentalOrdersService {
.collect(Collectors.toList());
return PageResult.buildPage(pageNo, param.getPageSize(), count, data);
}
@Override
public Object orderStatusChanges( String orderNo,Integer tranStatus) {
int i = rentalOrdersDao.orderStatusChanges(orderNo, tranStatus);
return i;
}
@Override
@Transactional
public ResultBody sendOrderWare(BaseAccountDTO cuser, OrderVcuVO param) {
// 密码认证
// ResultBody body = userServletClient.feignAuthUserPwd(cuser.getId(), param.getAuthPwd());
/*if (!ResultEnum.SUCCESS.getResultCode().equals(body.getCode())) {
return body;
}*/
// 密码认证
ResultBody body = passwordAuthentication(cuser, param.getAuthPwd());
if (body != null) {
return body;
}
OrderInfoDO order = rentalOrdersDao.getOrderInfo(param.getOrderInfoId());
if (!TranStatusDic.YFK.getStatus().equals(order.getTranStatus())
&& !TranStatusDic.TKSQ.getStatus().equals(order.getTranStatus())) {
return ResultBody.error(ResultEnum.ORDER_STATUS_ERROR);
}
Date cdate = new Date();
// 修改收发货地址信息
OrderReceiptDO receipt = param.buildReceipt();
rentalOrdersDao.updateOrderReceipt(receipt);
// 订单-视频、图片
OrderVcuDO vcu = param.buildOrdeVcu();
vcu.setVcuType(VcuType.SEND.getCode());
vcu.setCreateTime(cdate);
rentalOrdersDao.insertOrderVcu(vcu);
// 修改订单状态
OrderInfoDO upOrder = new OrderInfoDO();
upOrder.setId(param.getOrderInfoId());
upOrder.setTranStatus(TranStatusDic.YFH.getStatus());
upOrder.setSendWareTime(cdate);
rentalOrdersDao.updateOrderInfo(upOrder);
this.sendShipMsg(param.getOrderInfoId());
return ResultBody.success();
}
private void sendShipMsg(Integer orderInfoId) {
OrderInfoDO orderInfo = rentalOrdersDao.getOrderInfo(orderInfoId);
//RepoAccountDTO wechat = repoServletClient.feignRepoLoginInfo(orderInfo.getRepoAccountId());
OrderReceiptDO receipt = rentalOrdersDao.getOrderReceiptByOrder(orderInfoId);
// if (wechat == null || StringUtils.isBlank(wechat.getOpenId())) {
// return;
// }
AppletMsgVO aMsg = new AppletMsgVO();
// aMsg.setTouser(wechat.getOpenId());
aMsg.setTemplate_id(WxMsgTemplete.AT_REPO_SHIP);
aMsg.setPage(WxMsgDataConfig.REPO_SHIP_MESSAGE);
// 订单号
JSONObject orderNo = new JSONObject();
orderNo.put("value", orderInfo.getOrderNo());
// 商品名称
JSONObject wareName = new JSONObject();
wareName.put("value", orderInfo.getWareTitle());
// 快递公司
JSONObject expressName = new JSONObject();
expressName.put("value", receipt.getExName());
// 快递单号
JSONObject expressNo = new JSONObject();
expressNo.put("value", receipt.getSendExNo());
// 收货人
JSONObject receiptName = new JSONObject();
receiptName.put("value", receipt.getTakeName());
JSONObject data = new JSONObject();
data.put("character_string10", orderNo);
data.put("thing1", wareName);
data.put("phrase3", expressName);
data.put("character_string4", expressNo);
data.put("thing11", receiptName);
aMsg.setData(data);
//消息发送
// repoServletClient.asynSendUserAppletMsg(aMsg);
}
/**
* 密码认证
*
* @param cuser
* @param authPwd
* @return
*/
private ResultBody passwordAuthentication(BaseAccountDTO cuser,String authPwd) {
ResponseEntity<String> response =
restTemplate.getForEntity(
userAppUrl
+ "back-user/feignAuthUserPwd?authPwd="
+ authPwd
+ "&id="
+ +cuser.getUserAccountId(),
String.class);
ResultBody body = JSON.parseObject(response.getBody(), ResultBody.class);
if (!ResultEnum.SUCCESS.getResultCode().equals(body.getCode())) {
return body;
}
return null;
}
}
package com.mmc.oms.service;
import com.mmc.oms.common.PageResult;
import com.mmc.oms.common.ResultBody;
import com.mmc.oms.model.dto.*;
import com.mmc.oms.model.qo.OrderInfoQO;
import com.mmc.oms.model.vo.LeaseOrderVO;
import com.mmc.oms.model.vo.OrderReceiptVO;
import com.mmc.oms.model.vo.OrderVcuVO;
import com.mmc.oms.model.vo.ReturnWareVO;
import java.util.List;
/**
* @Author small
* @Date 2023/5/31 16:14
* @Version 1.0
*/
public interface OrderLogisticsService {
OrderInfoDTO feignAddLease(LeaseOrderVO param);
List<TranStatusDicDTO> listTranStatus();
OrderInfoDTO getOrderDetail(String orderNo);
ResultBody closeSelfOrder(Integer orderInfoId, String shutReason);
ResultBody platFormCloseOrder(Integer orderInfoId, String shutReason);
ResultBody updateOrderAddr(OrderReceiptVO param);
ResultBody updateOrderShop(OrderReceiptVO param);
OrderInfoDTO getOrderSimpleInfo(Integer orderInfoId);
ResultBody payCashOrder(BaseAccountDTO account, Integer orderInfoId);
PageResult listPageWechatOrder(BaseAccountDTO account, OrderInfoQO param);
List<KdnDicDTO> listKdnDic();
List<ExpressInfoDTO> listExpressInfo();
PageResult listPcOrderInfo(OrderInfoQO param,BaseAccountDTO cuser);
CountOrderDTO countOrderInfo(BaseAccountDTO cuser);
ResultBody sendOrderWare(BaseAccountDTO cuser, OrderVcuVO param);
ResultBody renterTakeOrder(OrderVcuVO param);
ResultBody batchTakeOrder();
ResultBody pfConfirmOrderWare(BaseAccountDTO cuser, OrderVcuVO param);
ResultBody returnOrderWare(ReturnWareVO param);
OrderReceiptDTO getOrderReceiptInfo(Integer orderInfoId);
ResultBody orderExpressInfo(Integer orderInfoId);
ResultBody refundExpressInfo(Integer orderInfoId);
OrderInfoDTO pfOrderDetail(Integer orderInfoId);
ResultBody updateReceipt(OrderReceiptVO param);
ResultBody batchCloseWaitPayOrder();
int listPcOrderInfoCount();
Integer getOrderInfoCount(Integer dayNum,Integer dateType);
ResultBody testSendMsg(Integer id);
void SynchronousDataToPushMoney(String OrderNo);
}
......@@ -6,6 +6,7 @@ import com.mmc.oms.model.dto.BaseAccountDTO;
import com.mmc.oms.model.dto.OrderInfoDTO;
import com.mmc.oms.model.qo.OrderInfoQO;
import com.mmc.oms.model.vo.LeaseOrderVO;
import com.mmc.oms.model.vo.OrderVcuVO;
import com.mmc.oms.model.vo.RentalOrderVO;
import javax.servlet.http.HttpServletRequest;
......@@ -18,9 +19,13 @@ public interface RentalOrdersService {
OrderInfoDTO getOrderDetail(String orderNo);
OrderInfoDTO feignAddLease(HttpServletRequest request, LeaseOrderVO param);
OrderInfoDTO feignAddLease(BaseAccountDTO user, LeaseOrderVO param);
PageResult listPcOrderInfo(OrderInfoQO param, BaseAccountDTO cuser);
PageResult listPageWechatOrder(BaseAccountDTO account, OrderInfoQO param);
Object orderStatusChanges( String orderNo,Integer tranStatus);
ResultBody sendOrderWare(BaseAccountDTO currentAccount, OrderVcuVO param);
}
......@@ -51,5 +51,8 @@ rabbitmq:
workFlyerInfoKey: TEST_WORK_FLYER_INFO
userapp:
url: https://test.iuav.mmcuav.cn/userapp/
......@@ -50,5 +50,8 @@ rabbitmq:
workFlyerInfoKey: TEST_WORK_FLYER_INFO
userapp:
url: http://localhost:35150/userapp/
......@@ -49,3 +49,6 @@ rabbitmq:
exchange: FLYER_WX_API_DIRECT_DEV
workFlyerInfoKey: TEST_WORK_FLYER_INFO
userapp:
url: https://iuav.mmcuav.cn/userapp/
......@@ -351,4 +351,152 @@
</select>
<update id="orderStatusChanges">
update order_info
set tran_status = #{tranStatus},pay_time=now()
where order_no = #{orderNo}
</update>
<select id="getOrderInfo" resultMap="orderInfoResultMap">
select o.id,o.order_no,o.ware_img,o.ware_title,o.sku_title,
o.unit_price,o.tran_status,o.ware_num,o.should_pay,o.actual_pay,
o.start_date,o.end_date,o.deposit,o.ex_ware,o.pay_no,o.pay_time,
o.send_ware_time,o.create_time,o.remark,o.buyer_name,o.buyer_phone,
o.uid,o.repo_account_id,o.shut_reason,o.pf_remark,o.sku_info_id,
o.ware_info_id
from order_info o
where o.id = #{orderInfoId}
</select>
<update id="updateOrderReceipt" parameterType="com.mmc.oms.entity.OrderReceiptDO">
update order_receipt
<set>
<if test=" takeName != null and takeName != '' ">
take_name = #{takeName},
</if>
<if test=" takePhone != null and takePhone != '' ">
take_phone = #{takePhone},
</if>
<if test="region != null">
region = #{region},
</if>
<if test=" detailAddress != null and detailAddress!='' ">
detail_address = #{detailAddress},
</if>
<if test=" repoName != null and repoName!='' ">
repo_name = #{repoName},
</if>
<if test=" repoAddress != null and repoAddress!='' ">
repo_address = #{repoAddress},
</if>
<if test="bookPhone != null and bookPhone!='' ">
book_phone = #{bookPhone},
</if>
<if test="sendExCode != null and sendExCode != '' ">
send_ex_code = #{sendExCode},
</if>
<if test="sendExNo != null and sendExNo != '' ">
send_ex_no = #{sendExNo},
</if>
<if test="sendAddress != null and sendAddress != '' ">
send_address = #{sendAddress},
</if>
<if test="renMethod != null">
ren_method = #{renMethod},
</if>
<if test="renPhone != null and renPhone != '' ">
ren_phone = #{renPhone},
</if>
<if test="renName != null and renName != '' ">
ren_name = #{renName},
</if>
<if test="renExCode != null and renExCode != '' ">
ren_ex_code = #{renExCode},
</if>
<if test="renExNo != null and renExNo != '' ">
ren_ex_no = #{renExNo},
</if>
<if test="renAddress != null and renAddress != '' ">
ren_address = #{renAddress},
</if>
<if test="renRepoName != null and renRepoName != '' ">
ren_repo_name = #{renRepoName},
</if>
<if test="renRepoAddr != null and renRepoAddr != '' ">
ren_repo_addr = #{renRepoAddr},
</if>
<if test="renRepoPhone != null and renRepoPhone != '' ">
ren_repo_phone = #{renRepoPhone},
</if>
</set>
where order_info_id = #{orderInfoId}
</update>
<insert id="insertOrderVcu" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.oms.entity.OrderVcuDO">
insert into order_vcu
(
order_info_id,order_refund_id,vcu_type,vcu_satus,imgs,video_url,remark,create_time
)
values
(
#{orderInfoId},#{orderRefundId},#{vcuType},#{vcuSatus},#{imgs},#{videoUrl},#{remark},#{createTime}
)
</insert>
<update id="updateOrderInfo" parameterType="com.mmc.oms.entity.OrderInfoDO">
update order_info
<set>
<if test="tranStatus != null and tranStatus != '' ">
tran_status = #{tranStatus},
</if>
<if test="shutReason != null and shutReason != '' ">
shut_reason = #{shutReason},
</if>
<if test=" actualPay != null ">
actual_pay = #{actualPay},
</if>
<if test="pfRemark != null">
pf_remark = #{pfRemark},
</if>
<if test="payTime != null">
pay_time = #{payTime},
</if>
<if test="sendWareTime != null">
send_ware_time = #{sendWareTime},
</if>
<if test="payNo != null and payNo != '' ">
pay_no = #{payNo},
</if>
</set>
where id = #{id}
</update>
<select id="getOrderReceiptByOrder" resultMap="orderReceiptResultMap" parameterType="Integer">
select r.id,r.order_info_id,r.receipt_method,r.take_name,r.send_ex_no,
r.take_phone,r.region,r.detail_address,r.repo_name,r.repo_address,
r.book_phone,r.create_time,ei.ex_name
from order_receipt r LEFT JOIN express_info ei ON ei.ex_code = r.send_ex_code
where r.order_info_id = #{orderInfoId}
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论