京东商城售后接口对接

京东商城售后接口对接

售后

京东售后单以客户申请角度:是否收到货品
  • 未收到货 : 订单最终走向为取消订单
  • 退货退款 : 生成服务单
  • 换货 : 售后按退货走.京东生成一个新的订单.

1.1 未收到货:

1.1.1 未发货

# 监听消息 : order_order_cancel ( 订单取消 )
# 地址 : https://open.jd.com/home/home/#/doc/msgApi?apiCateId=81&apiId=128

1.1.2 已发货,客户未收到货

# 监听消息 : order_order_cancel ( 订单取消 )
# 地址 : https://open.jd.com/home/home/#/doc/msgApi?apiCateId=81&apiId=128

1.2 已收到货

客户已收到货的情况下申请售后.原订单不会有任何变更,
会生成一个服务单.服务单没有任何消息推送.全部以刷API接口的方式获取
# 地址 : https://open.jd.com/home/home/#/doc/api?apiCateId=241&apiId=2070&apiName=jingdong.asc.audit.list

流程 :

Step1 : 申请

# 该接口只能在申请阶段拿到服务单信息,如果后台发生审核通过这个接口就抓不到了.所以审核时间一定要大于刷接口的周期时间,确保已拿到售后申请单数据,
# 拿到申请数据后.保存到本地.或缓冲中
jingdong.asc.audit.list ( 查询待审核申请单列表 )

Step2 : 状态变更

# 通过刷接口的方式获取当前服务单的后续变更,根据状态[serviceStatus字段]进行业务处理
jingdong.asc.query.view ( 查看服务单明细信息 )

Step3 : 客户发货信息

# 如果后台审核同意后.需要刷第三个接口获取物流信息
jingdong.asc.freight.view ( 查询服务单的运单信息 )

Step4 : 关闭

# 当客户取消或退款完成[通过Step2状态变更获取] 删除缓冲中的数据

1.3 示例代码

1.3.1 申请


/**
 * jingdong.asc.audit.list ( 查询待审核申请单列表 )
 * https://open.jd.com/home/home/#/doc/api?apiCateId=241&apiId=2070&apiName=jingdong.asc.audit.list
 * @author mcc
 */
@Service
public class JdRefundAuditListTaskStrategy2 implements TaskStrategy {

	@Autowired
	private KafkaTemplate shopKafkaTemplate;

	@Autowired
	private RedissonClient redissonClient;

	/**
	 * 执行业务
	 * @param account
	 * @param client
	 * @return
	 * @throws Exception
	 */
	public boolean strategy(JdShopAccount account, JdClient client) throws Exception {
		// https://open.jd.com/home/home/#/doc/api?apiCateId=241&apiId=2070&apiName=jingdong.asc.audit.list
		AscAuditListRequest request=new AscAuditListRequest();
		int pageSize = 50;
		int totalPage = 1;
		int page = 1;
		String storeNo = account.getId();
		// 首次请求标志
		boolean firstRequest = Boolean.TRUE;
		request.setPageSize(pageSize);
		do {
			request.setPageNumber(page);
			request.setBuId(storeNo);
			request.setOperatePin(RefundContext.OPERATE_PIN);
			request.setOperateNick(RefundContext.OPERATE_PIN);
			AscAuditListResponse response = client.execute(request);
			if (page == 1 && firstRequest) {
				// 第一页时, 获取总页码数
				int totalSize = response.getPageResult().getTotalCount();
				totalPage = Double.valueOf(Math.ceil(Double.valueOf(totalSize) / pageSize)).intValue();
				firstRequest = Boolean.FALSE;
				// 若初始页码, 与总页码不一致时, 数据重新从最后一页进行请求
				if (page != totalPage) {
					page = totalPage;
					continue;
				}
			}
			List<WaitAuditApply> refundList = response.getPageResult().getData();
			refundList.forEach(refund->{
				logger.info("查询待审核申请单列表 :{}", JSONObject.toJSONString(refund));
				Long orderId = refund.getOrderId();
				RSet<String> serviceIdSet = redissonClient.getSet(RefundContext.SERVICE_ID_SET);
				refund.getServiceIdList().forEach(serviceId->{
					String orderIdAndServiceId = orderId + "-" + serviceId;
					if (serviceIdSet.contains(orderIdAndServiceId)) {
						return;
					}
					serviceIdSet.add(orderIdAndServiceId);
					// 申请售后
					this.apply( storeNo, client, orderId, serviceId,refund);
				});
			});
			page--;
		} while (page > 0);
		return Boolean.TRUE;
	}

	/**
	 * 售后申请
	 */
	private void apply(String storeNo,JdClient clientProxy,Long orderId,Long serviceId,WaitAuditApply apply){
		JSONObject backOrder = this.packageBaseInfo(storeNo,orderId,serviceId);
		// 售后详情
		this.findServiceOrder(backOrder, storeNo, clientProxy, serviceId, apply);
		// 售后明细
		this.findOrderDetail(clientProxy,backOrder, orderId, storeNo);
		// 把消息送出鼎外
		this.sendOut(backOrder);
	}


	/**
	 * jingdong.asc.audit.detail ( 查看待审核申请单详情 )
	 * @param storeNo
	 * @param clientProxy
	 * @param apply
	 */
	private void findServiceOrder(JSONObject backOrder,String storeNo,JdClient clientProxy,Long serviceId,WaitAuditApply apply)  {
		try {
			AscAuditDetailRequest request = new AscAuditDetailRequest();
			request.setBuId(storeNo);
			request.setOperatePin(RefundContext.OPERATE_PIN);
			request.setOperateNick(RefundContext.OPERATE_PIN);
			request.setApplyId(apply.getApplyId());
			AscAuditDetailResponse response = clientProxy.execute(request);
			if (ObjectUtils.isEmpty(response)) {
				throw new RuntimeException("订单不存在");
			}
			if (ObjectUtils.isEmpty(response.getResult())) {
				throw new RuntimeException("订单不存在");
			}
			if (ObjectUtils.isEmpty(response.getResult().getData())) {
				throw new RuntimeException("订单不存在");
			}
			if (ObjectUtils.isEmpty(response.getResult().getData())) {
				throw new RuntimeException("订单不存在");
			}
			if (ListUtil.isEmpty(response.getResult().getData().getServiceIdList())){
				throw new RuntimeException("订单不存在");
			}
			if (!response.getResult().getData().getServiceIdList().contains(serviceId)){
				throw new RuntimeException("订单不存在");
			}
			WaitAuditDetail data = response.getResult().getData();
			backOrder.put("returnReason", data.getQuestionTypeCid1Name());
			backOrder.put("refundTime", data.getApplyTime().getTime());
			logger.info("查询待审核申请单详情列表 :{}", JSONObject.toJSONString(response));
		}catch (Exception e){
			logger.error(this.getClass().getSimpleName()+" is error ,{}",e.getMessage());
		}
	}


	/**
	 * 获取订单详情
	 */
	private void findOrderDetail(JdClient clientProxy,JSONObject backOrder, Long orderId, String venderId) {
		try {
			PopOrderEnGetRequest request = new PopOrderEnGetRequest();
			request.setOptionalFields(
					"orderId,venderId,orderType,payType,orderTotalPrice,orderSellerPrice,orderPayment,freightPrice,sellerDiscount,orderState,orderStateRemark,deliveryType,invoiceEasyInfo,invoiceInfo,invoiceCode,orderRemark,orderStartTime,orderEndTime,consigneeInfo,itemInfoList,couponDetailList,venderRemark,balanceUsed,pin,returnOrder,paymentConfirmTime,waybill,logisticsId,vatInfo,modified,directParentOrderId,parentOrderId,customs,customsModel,orderSource,storeOrder,idSopShipmenttype,scDT,serviceFee,pauseBizInfo,taxFee,tuiHuoWuYou,orderSign,storeId,realPin,orderMarkDesc,open_id,open_id_buyer");
			request.setOrderId(orderId);
			PopOrderEnGetResponse response = clientProxy.execute(request);
			// 获取订单详情失败
			if (ObjectUtils.isEmpty(response)
					|| ObjectUtils.isEmpty(response.getOrderDetailInfo())
					|| ObjectUtils.isEmpty(response.getOrderDetailInfo().getOrderInfo())
					|| ListUtil.isEmpty(response.getOrderDetailInfo().getOrderInfo().getItemInfoList())) {
				throw new RuntimeException("获取订单详情失败");
			}
			OrderSearchInfo responseTrade = response.getOrderDetailInfo().getOrderInfo();
			// 是否发货
			// 运单号
			String waybill = responseTrade.getWaybill();
			String logisticsId = responseTrade.getLogisticsId();
			if (StringUtils.hasText(waybill) || StringUtils.hasText(logisticsId)){
				backOrder.put("isSend", 1);
			}
			JSONArray backOrderDetailList = new JSONArray();
			responseTrade.getItemInfoList().forEach(prod -> {
				JSONObject item = new JSONObject();
				item.put("srcId", prod.getSkuId());
				item.put("prodNum", prod.getItemTotal());
				item.put("chaProdName", prod.getSkuName());
				backOrderDetailList.add(item);
			});
			backOrder.put("backOrderDetailList", backOrderDetailList);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 基本信息
	 * @param orderId
	 * @param serviceId
	 * @return
	 */
	private JSONObject packageBaseInfo(String storeNo,
									   Long orderId,
									   Long serviceId){
		JSONObject backOrder = new JSONObject();
		backOrder.put("channelOrderNo",orderId);
		backOrder.put("channelBackOrderNo",serviceId);
		backOrder.put("isSend",1);
		backOrder.put("returnType",2);
		backOrder.put("channelSource", 2);
		backOrder.put("storeId",storeNo);
		backOrder.put("tag",JdServiceStatusEnum.APPLY.getServiceStatus());
		return backOrder;
	}

	/**
	 * 把消息送出鼎外
	 */
	private void sendOut(JSONObject backOrder) {
		backOrder.put("tag", JdServiceStatusEnum.APPLY.getServiceStatus());
		this.shopKafkaTemplate.send("jd_hf_refund", CryptoUtils.encode(backOrder.toJSONString()));
	}
}

1.3.2 状态变更


/**
 * Desc : 京东退货退款信息刷接口
 * jingdong.asc.query.view ( 查看服务单明细信息 )
 *
 *
 * Redis :
 *      order-serviceId,Map<,>
 *                          - agreeStatus : agree
 *                          - expressInfo : expressInfoDTO JSON
 * @Author : jinjianghai
 * @E-mail : 547114661@qq.com
 * @Date : 2024/5/7 11:09
 */
@Slf4j
@Service
public class JdRefundInfoTaskStrategy2 implements TaskStrategy {

    /**
     * Redis
     */
    @Autowired
    private RedissonClient redissonClient;
    /**
     * kafka客户端
     */
    @Autowired
    protected KafkaTemplate shopKafkaTemplate;

    /**
     * 执行业务
     * @param account
     * @param client         Client实例
     * @return
     * @throws Exception
     */
    @Override
    public boolean strategy(JdShopAccount account, JdClient client) throws Exception {
        // 获取通过JdRefundAuditListTaskStrategy写入的服务单数据
        RSet<String> serviceIdSet = redissonClient.getSet(RefundContext.SERVICE_ID_SET);
        if (ObjectUtils.isEmpty(serviceIdSet)){
            return Boolean.TRUE;
        }
        // 获取代理端
        JdClient clientProxy = RetryProxy.getProxy(client, 2000, 5);
        // 处理业务
        this.doRefund(account.getId(),clientProxy,serviceIdSet);
        return Boolean.TRUE;
    }

    /**
     * 循环处理
     * @param clientProxy
     * @param serviceIdSet
     */
    private void doRefund(String storeNo,JdClient clientProxy,RSet<String> serviceIdSet) throws Exception {
        Iterator<String> iterator = serviceIdSet.iterator();
        while (iterator.hasNext()){
            String orderIdAndServiceId = iterator.next();
            String[] split = orderIdAndServiceId.split("-");
            Long orderId = Long.parseLong(split[0]);
            Long serviceId = Long.parseLong(split[1]);
            AscQueryViewRequest request = new AscQueryViewRequest();
            request.setBuId(storeNo);
            request.setOperatePin(RefundContext.OPERATE_PIN);
            request.setOperateNick(RefundContext.OPERATE_PIN);
            request.setServiceId(serviceId);
            request.setOrderId(orderId);
            // jingdong.asc.query.view ( 查看服务单明细信息 )
            AscQueryViewResponse response = clientProxy.execute(request);
            log.info("售后单明细{},{},报文{}",orderId,serviceId,JSONObject.toJSONString(response));
            // 返回值为空
            if (ObjectUtils.isEmpty(response)){
                continue;
            }
            // 返回值为空
            if (ObjectUtils.isEmpty(response.getResult())){
                continue;
            }
            // 返回值为空
            if (ObjectUtils.isEmpty(response.getResult().getData())){
                continue;
            }
            // 服务单状态为空,如协商情况下是空的
            if (ObjectUtils.isEmpty(response.getResult().getData().getServiceStatus())){
                continue;
            }
            RMap<Object, Object> serviceInfo = redissonClient.getMap(RefundContext.SERVICE_INFO + orderIdAndServiceId);
            JdServiceStatusEnum serviceStatus = JdServiceStatusEnum.getEnum(response.getResult().getData().getServiceStatus());
            if (ObjectUtils.isEmpty(serviceStatus)){
                continue;
            }
            // 基础信息
            JSONObject backOrder = this.packageBaseInfo(storeNo, orderId, serviceId, serviceStatus);
            switch (serviceStatus){
                // 待收货,后台审核同意,待客户发货
                case WAIT_USER_SEND:
                    this.doAgree(storeNo,backOrder,clientProxy,orderId,serviceId,serviceInfo);
                    break;
                // 客户取消或客户同意取消
                case CANCEL:
                    this.doCancel(backOrder,clientProxy,orderId,serviceId,serviceInfo);
                    break;
                // 完成
                case COMPLETE:
                    this.doComplete(backOrder,clientProxy,orderId,serviceId,serviceInfo);
                    break;
            }
            logger.info("查看服务单明细信息 :{}", JSONObject.toJSONString(response));
        }
    }

    /**
     * 审核同意
     * @param clientProxy
     * @param serviceInfo
     */
    private void doAgree(String storeNo,
                         JSONObject backOrder,
                         JdClient clientProxy,
                         Long orderId,
                         Long serviceId,
                         RMap<Object, Object> serviceInfo){
        Object agreeStatus = serviceInfo.get(RefundContext.AGREE_STATUS);
        if (ObjectUtils.isEmpty(agreeStatus)){
            serviceInfo.put(RefundContext.AGREE_STATUS,RefundContext.AGREE);
            // 发初审同意消息给jd-sync
            this.sendOut(backOrder);
            return ;
        }
        // 获取物流信息
        this.getExpressInfo(storeNo,backOrder,clientProxy,orderId,serviceId,serviceInfo);
    }

    /**
     * 获取物流信息逻辑
     * @param clientProxy
     * @param orderId
     * @param serviceId
     * @param serviceInfo
     */
    private void getExpressInfo(String storeNo,
                                JSONObject backOrder,
                                JdClient clientProxy,
                                Long orderId,
                                Long serviceId,
                                RMap<Object, Object> serviceInfo){
        Object expressInfo = serviceInfo.get(RefundContext.EXPRESS_INFO);
        if (ObjectUtils.isEmpty(expressInfo)){
            // 执行获取物流信息
            ExpressInfoDTO expressInfoDTO = this.doGetExpressInfo(storeNo,clientProxy, orderId, serviceId);
            if (ObjectUtils.isEmpty(expressInfoDTO)){
                return;
            }
            serviceInfo.put(RefundContext.EXPRESS_INFO,JSONObject.toJSONString(expressInfoDTO));
            // 发送物流信息给鼎外
            this.sendExpressInfoOut(backOrder,expressInfoDTO);
            return;
        }
        ExpressInfoDTO oldExpressInfo = JSONObject.parseObject((String) expressInfo, ExpressInfoDTO.class);
        ExpressInfoDTO expressInfoDTO = this.doGetExpressInfo(storeNo,clientProxy, orderId, serviceId);
        if (ObjectUtils.isEmpty(expressInfoDTO)){
            return;
        }
        if (oldExpressInfo.equals(expressInfoDTO)){
            return;
        }
        serviceInfo.put(RefundContext.EXPRESS_INFO,JSONObject.toJSONString(expressInfoDTO));
        // 发送物流信息给鼎外
        this.sendExpressInfoOut(backOrder,expressInfoDTO);
    }

    /**
     * 执行获取物流信息
     * @param clientProxy
     * @param orderId
     * @param serviceId
     */
    private ExpressInfoDTO doGetExpressInfo(String storeNo,
                                            JdClient clientProxy,
                                            Long orderId,
                                            Long serviceId){
        try {
            AscFreightViewRequest request=new AscFreightViewRequest();
            request.setBuId(storeNo);
            request.setOperatePin(RefundContext.OPERATE_PIN);
            request.setOperateNick(RefundContext.OPERATE_PIN);
            request.setServiceId(serviceId);
            request.setOrderId(orderId);
            // jingdong.asc.freight.view ( 查询服务单的运单信息 )
            AscFreightViewResponse response = clientProxy.execute(request);
            if (ObjectUtils.isEmpty(response)){
                return null;
            }
            if (ObjectUtils.isEmpty(response.getResult())){
                return null;
            }
            if (ObjectUtils.isEmpty(response.getResult().getData())){
                return null;
            }
            Expressage data = response.getResult().getData();
            if (ObjectUtils.isEmpty(data.getExpressCompany()) || ObjectUtils.isEmpty(data.getExpressCode())){
                return null;
            }
            ExpressInfoDTO expressInfoDTO = new ExpressInfoDTO(data.getExpressCompany(),data.getExpressCode());
            logger.info("查看服务单运单信息,serviceId:{}, 报文:{}", serviceId,JSONObject.toJSONString(response));
            return expressInfoDTO;
        }catch (Exception e){
            log.error("执行获取物流信息异常,{}", e.getMessage());
        }
        return null;
    }

    /**
     * 取消
     * @param clientProxy
     * @param info
     */
    private void doCancel(JSONObject backOrder,JdClient clientProxy,Long orderId,Long serviceId,RMap<Object, Object> info){
        // 发初审同意消息给jd-sync
        this.sendOut(backOrder);
        // 在取消或完成的情况下去除Redis缓冲信息
        this.removeRedisInfo(orderId, serviceId);
    }

    /**
     * 完成
     * @param clientProxy
     * @param info
     */
    private void doComplete(JSONObject backOrder,JdClient clientProxy,Long orderId,Long serviceId,RMap<Object, Object> info){
        // 发初审同意消息给jd-sync
        this.sendOut(backOrder);
        // 在取消或完成的情况下去除Redis缓冲信息
        this.removeRedisInfo(orderId, serviceId);
    }

    /**
     * 基本信息
     * @param orderId
     * @param serviceId
     * @param serviceStatus
     * @return
     */
    private JSONObject packageBaseInfo(String storeNo,
                                       Long orderId,
                                       Long serviceId,
                                       JdServiceStatusEnum serviceStatus){
        JSONObject backOrder = new JSONObject();
        backOrder.put("channelOrderNo",orderId);
        backOrder.put("channelBackOrderNo",serviceId);
        backOrder.put("isSend",1);
        backOrder.put("returnStatus",2);
        backOrder.put("channelSource", 2);
        backOrder.put("storeId",storeNo);
        backOrder.put("tag",serviceStatus.getServiceStatus());
        return backOrder;
    }

    /**
     * 在取消或完成的情况下去除Redis缓冲信息
     * @param orderId
     * @param serviceId
     */
    private void removeRedisInfo(Long orderId,Long serviceId){
        String orderIdAndServiceId = orderId + "-" + serviceId;
        // 获取通过JdRefundAuditListTaskStrategy写入的服务单数据
        RSet<String> serviceIdSet = redissonClient.getSet(RefundContext.SERVICE_ID_SET);
        if (!ObjectUtils.isEmpty(serviceIdSet)){
            serviceIdSet.remove(orderIdAndServiceId);
        }
        RMap<Object, Object> serviceInfo = redissonClient.getMap(RefundContext.SERVICE_INFO + orderIdAndServiceId);
        if (MapUtil.isEmpty(serviceInfo) || serviceInfo.isEmpty()){
            return;
        }
        serviceInfo.delete();
    }

    /**
     * 发送物流信息给鼎外
     * @param backOrder
     */
    private void sendExpressInfoOut(JSONObject backOrder,ExpressInfoDTO expressInfoDTO){
        if (ObjectUtils.isEmpty(expressInfoDTO)){
            return;
        }
        backOrder.put("tag",JdServiceStatusEnum.SYNC_EXP.getServiceStatus());
        backOrder.put("expName",expressInfoDTO.getExpName());
        backOrder.put("expNo",expressInfoDTO.getExpNo());
        this.sendOut(backOrder);
    }

    /**
     * 把消息送出鼎外
     */
    private void sendOut(JSONObject backOrder) {
        this.shopKafkaTemplate.send("jd_hf_refund_approved", CryptoUtils.encode(backOrder.toJSONString()));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架空光缆用什么型号

架空光缆是什么意思 , 架空光缆用什么型号的 GYTC8A , 架空光缆型号是啥 8字形光缆 产品描述 Description GYTC8A光缆的结构是将250m光纤套入高模量材料制成的松套管中&#xff0c;松套管内填充防水化合物。缆芯的中心是一根金属加强芯&#xff0c;松套管(和填充绳 )围绕中心…

Davinci工程WrapNv模块讲解

配置讲解 WrapNv模块里面有两个东西&#xff0c;WrapNvGeneral和WrapNvMemoryLayout。 WrapNvGeneral里面配置的就是这个E方的基地址 WrapNvMemoryLayout里面就是分几个块来存储&#xff0c;每个块有自己的数据。 再里面一层&#xff0c;有各自的长度和默认值。我们可以在后面…

常见C语言基础说明二:位运算问题

一. 简介 前面一篇文章学习了 常见的 C语言基础题&#xff0c;文章如下&#xff1a; 常见C语言基础题说明一-CSDN博客 本文继续上一篇C语言基础题的学习。 二. C语言中 -> 位运算问题 1. 数据在计算机中的存储方式 当前的计算机系统使用的基本上是二进制系统&#…

Linux环境Redis部署

Redis部署 Redis是一个高性能的开源键值存储系统&#xff0c;它主要基于内存操作&#xff0c;但也支持数据的持久化。与其他数据库相比&#xff0c;Redis的主要优势在于它的高性能、丰富的数据结构和原生的持久化能力。Redis不仅提供了类似的功能&#xff0c;还增加了持久化和…

命令行方式将mysql数据库迁移到达梦数据库(全步骤)

因项目需求&#xff0c;需要将mysql数据库转换为国产达梦数据库&#xff0c;但由于安全问题&#xff0c;正式环境只能用命令行方式连接&#xff0c;下列是操作全步骤 目录 一、操作逻辑二、操作步骤1、本地安装达梦相关工具2、将服务器mysql导出到本地a) 服务器命令行导出mysql…

改进灰狼算法优化随机森林回归预测

灰狼算法&#xff08;Grey Wolf Optimization&#xff0c;GWO&#xff09;是一种基于自然界灰狼行为的启发式优化算法&#xff0c;在2014年被提出。该算法模仿了灰狼群体中不同等级的灰狼间的优势竞争和合作行为&#xff0c;通过不断搜索最优解来解决复杂的优化问题。 灰狼算法…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类&#xff1a;队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

利用github pages建立Serverless个人博客

利用github pages建立Serverless个人博客 概述 使用github pages&#xff0c;可以在github上部署静态网站。利用这个功能&#xff0c;可以很方便地实现个人博客的发布托管。 比如我的个人博客&#xff1a;Buttering’s Blog 对应代码仓库&#xff1a;buttering/EasyBlog: 自…

MT3516W-ASEMI工业电源专用MT3516W

编辑&#xff1a;ll MT3516W-ASEMI工业电源专用MT3516W 型号&#xff1a;MT3516W 品牌&#xff1a;ASEMI 封装&#xff1a;MTW-5 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;35A 功率(Pd)&#xff1a;大功率 芯片个数&#xff1a;5…

程序员不会告诉老板的那些神器

目录 1. 持续集成工具&#xff1a;CruiseControl&#xff08;简称CC&#xff09; 2. 代码风格、质量检查工具&#xff1a;StyleCop 3.AI工具 3.1 AI助力编写开发日报 3.2 AI助力编写普适性代码 3.3 AI助力生成代码注释 3.4 AI助力重构代码去掉“坏味道” 3.5 AI助力…

汽车品牌区域营销方案

领克汽车粤海区域营销方案-36P 活动策划信息&#xff1a; 方案页码&#xff1a;36页 文件格式&#xff1a;PPT 方案简介&#xff1a; 车市反弹形势明显&#xff0c;领克销量呈现稳健上涨趋势 品牌 未来市场可观&#xff0c;应 持续扩大品牌声量&#xff0c;保持市场占有优…

【C++】C++11--- lambda表达式

目录 Lambda表达式概述 Lambda表达式语法定义 Lambda表达式参数详解 Lambda捕获列表 捕获列表总结 Lambda参数列表 可变规则mutable lambda表达式原理 Lambda表达式概述 当对自定义类型的数据集合进行排序时&#xff0c;需要根据自定义类型的不同属性去实现不同的排序方…

ESD静电问题 | 手持摄像头整改

【转自微信公众号&#xff1a;柯普伦科技】

用webui.sh安装报错No module named ‘importlib.metadata‘

安装sdweb报错&#xff0c;出现No module named importlib.metadata&#xff1a; glibc version is 2.35 Cannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage) Traceback (most recent call last):File…

访问网络附加存储:nfs

文章目录 访问网络附加存储一、网络附加存储1.1、存储类型1.3、通过NFS挂载NAS1.4、NFS挂载过程服务端客户端 二、实验&#xff1a;搭建NFS服务端及挂载到nfs客户端服务端客户端测试命令合集服务端客户端 访问网络附加存储 一、网络附加存储 1.1、存储类型 DAS&#xff1a;Di…

TCP四次挥手中为什么 TIME_WAIT 等待的时间是 2MSL?

TCP 连接断开 1、TCP 四次挥手过程是怎样的&#xff1f;如下图 2、为什么 TIME_WAIT 等待的时间是 2MSL&#xff1f; MSL 是 Maximum Segment Lifetime&#xff0c;报文最大生存时间&#xff0c;它是任何报文在网络上存在的最长时间&#xff0c;超过这个时间报文将被丢弃。因…

激光雷达技术:科技之眼,照亮前行

在科技与人文关怀的交响乐章中&#xff0c;一项名为“蝙蝠避障”使用了激光雷达技术原理及应用的创新成果&#xff0c;正悄然改变着视障朋友们的生活方式&#xff0c;为他们的日常出行铺设了一条充满希望的光明之路。今天&#xff0c;让我们一起深入探讨这项技术如何成为盲人出…

毕业论文怎么写? 推荐4个AI工具

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

微火快讯:全域运营服务商是什么?赚得多吗?

随着互联网下半场的开启&#xff0c;公域和私域两大流量池持续不断地迸发出新的活力&#xff0c;一定程度上推动了全域运营赛道和微火全域运营服务商职业的兴起。 所谓全域运营&#xff0c;简而言之&#xff0c;就是所有领域内与商家、品牌运营相关的业务&#xff0c;包括但不限…

Tomcat、MySQL、Redis最大支持说明

文章目录 一、Tomcat二、MySQL三、Redis1、最大连接数2、TPS、QPS3、key和value最大支持 一、Tomcat 查看SpringBoot内置Tomcat的源码&#xff0c;如下&#xff1a; 主要就是看抽象类AbstractEndpoint&#xff0c;可以看到默认的核心线程数10&#xff0c;最大线程数200 通过…
最新文章