diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundApiController.java b/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundApiController.java new file mode 100644 index 00000000..1fdfbc3e --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundApiController.java @@ -0,0 +1,114 @@ +package com.qihang.wei.controller; + + +import cn.qihangerp.open.wei.RefundApiHelper; +import cn.qihangerp.open.wei.common.ApiResultVo; +import cn.qihangerp.open.wei.model.AfterSaleOrder; +import com.alibaba.fastjson2.JSONObject; +import com.qihang.common.common.AjaxResult; +import com.qihang.common.common.ResultVoEnum; +import com.qihang.common.enums.EnumShopType; +import com.qihang.common.enums.HttpStatus; +import com.qihang.common.mq.MqMessage; +import com.qihang.common.mq.MqType; +import com.qihang.security.common.BaseController; +import com.qihang.wei.bo.PullRequest; +import com.qihang.wei.domain.OmsWeiRefund; +import com.qihang.wei.service.OmsWeiRefundService; +import lombok.AllArgsConstructor; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDateTime; +import java.util.Date; + +@RequestMapping("/refund") +@RestController +@AllArgsConstructor +public class WeiRefundApiController extends BaseController { + private final WeiApiCommon apiCommon; + private final OmsWeiRefundService refundService; + private final KafkaTemplate kafkaTemplate; + + @RequestMapping(value = "/pull_list", method = RequestMethod.POST) + public AjaxResult pullList(@RequestBody PullRequest params) throws Exception { + if (params.getShopId() == null || params.getShopId() <= 0) { + return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); + } + + Date currDateTime = new Date(); + long beginTime = System.currentTimeMillis(); + + var checkResult = apiCommon.checkBefore(params.getShopId()); + if (checkResult.getCode() != ResultVoEnum.SUCCESS.getIndex()) { + return AjaxResult.error(checkResult.getCode(), checkResult.getMsg(),checkResult.getData()); + } + String accessToken = checkResult.getData().getAccessToken(); + String serverUrl = checkResult.getData().getServerUrl(); + String appKey = checkResult.getData().getAppKey(); + String appSecret = checkResult.getData().getAppSecret(); + + // 获取最后更新时间 + LocalDateTime endTime = LocalDateTime.now(); + LocalDateTime startTime = endTime.minusDays(1); + + int insertSuccess = 0;//新增成功的订单 + int totalError = 0; + int hasExistOrder = 0;//已存在的订单数 + + ApiResultVo apiResultVo = RefundApiHelper.pullRefundList(startTime, endTime, accessToken); + + if(apiResultVo.getCode() == 0) { + // 拉取到了数据 拉取详情 + if(apiResultVo.getList()!=null) { + for (var refundInfo : apiResultVo.getList()) { + + OmsWeiRefund refund = new OmsWeiRefund(); + refund.setOrderId(refundInfo.getOrder_id()); + refund.setAfterSaleOrderId(refundInfo.getAfter_sale_order_id()); + refund.setShopId(params.getShopId()); + refund.setStatus(refundInfo.getStatus()); + refund.setOpenid(refundInfo.getOpenid()); + refund.setUnionid(refundInfo.getUnionid()); + refund.setProductId(refundInfo.getProduct_info().getString("product_id")); + refund.setSkuId(refundInfo.getProduct_info().getString("sku_id")); + refund.setCount(refundInfo.getProduct_info().getInteger("count")); + refund.setFastRefund(refundInfo.getProduct_info().getString("fast_refund")); + refund.setRefundAmount(refundInfo.getRefund_info().getInteger("amount")); + refund.setRefundReason(refundInfo.getRefund_info().getInteger("refund_reason")); + refund.setReturnWaybillId(refundInfo.getReturn_info().getString("waybill_id")); + refund.setReturnDeliveryName(refundInfo.getReturn_info().getString("delivery_name")); + refund.setReturnDeliveryId(refundInfo.getReturn_info().getString("delivery_id")); + refund.setMerchantUploadInfo(JSONObject.toJSONString(refundInfo.getMerchant_upload_info())); + refund.setCreateTime(refundInfo.getCreate_time()); + refund.setUpdateTime(refundInfo.getUpdate_time()); + refund.setReason(refundInfo.getReason()); + refund.setReasonText(refundInfo.getReason_text()); + refund.setType(refundInfo.getType()); + refund.setComplaintId(refundInfo.getComplaint_id()); + refund.setRefundResp(JSONObject.toJSONString(refundInfo.getRefund_resp())); + refund.setDetails(JSONObject.toJSONString(refundInfo.getDetails())); + + var result = refundService.saveRefund(params.getShopId(), refund); + if (result.getCode() == ResultVoEnum.DataExist.getIndex()) { + //已经存在 + kafkaTemplate.send(MqType.REFUND_MQ, JSONObject.toJSONString(MqMessage.build(EnumShopType.DOU, MqType.REFUND_MESSAGE,refund.getAfterSaleOrderId()))); + hasExistOrder++; + } else if (result.getCode() == ResultVoEnum.SUCCESS.getIndex()) { + kafkaTemplate.send(MqType.REFUND_MQ, JSONObject.toJSONString(MqMessage.build(EnumShopType.DOU, MqType.REFUND_MESSAGE,refund.getAfterSaleOrderId()))); + insertSuccess++; + } else { + totalError++; + } + + } + } + + } + + return AjaxResult.success(); + } +} diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundController.java b/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundController.java new file mode 100644 index 00000000..b021e58d --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/controller/WeiRefundController.java @@ -0,0 +1,47 @@ +package com.qihang.wei.controller; + + + +import com.alibaba.fastjson2.JSONObject; +import com.qihang.common.common.AjaxResult; +import com.qihang.common.common.PageQuery; +import com.qihang.common.common.PageResult; +import com.qihang.common.common.TableDataInfo; +import com.qihang.common.enums.EnumShopType; +import com.qihang.common.mq.MqMessage; +import com.qihang.common.mq.MqType; +import com.qihang.security.common.BaseController; +import com.qihang.wei.bo.WeiOrderPushBo; +import com.qihang.wei.domain.OmsWeiRefund; +import com.qihang.wei.service.OmsWeiRefundService; +import lombok.AllArgsConstructor; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.bind.annotation.*; + +@AllArgsConstructor +@RestController +@RequestMapping("/refund") +public class WeiRefundController extends BaseController { + private final OmsWeiRefundService refundService; + private final KafkaTemplate kafkaTemplate; + @RequestMapping(value = "/list", method = RequestMethod.GET) + public TableDataInfo goodsList(OmsWeiRefund bo, PageQuery pageQuery) { + PageResult result = refundService.queryPageList(bo, pageQuery); + + return getDataTable(result); + } + + @PostMapping("/push_oms") + @ResponseBody + public AjaxResult pushOms(@RequestBody WeiOrderPushBo bo) { + // TODO:需要优化消息格式 + if(bo!=null && bo.getIds()!=null) { + for(String id: bo.getIds()) { +// mqUtils.sendApiMessage(MqMessage.build(EnumShopType.DOU, MqType.REFUND_MESSAGE, id)); + kafkaTemplate.send(MqType.REFUND_MQ, JSONObject.toJSONString(MqMessage.build(EnumShopType.DOU, MqType.REFUND_MESSAGE,id))); + } + } + return AjaxResult.success(); + } + +} diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/domain/OmsWeiRefund.java b/open-api/wei-api/src/main/java/com/qihang/wei/domain/OmsWeiRefund.java new file mode 100644 index 00000000..57ab4a33 --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/domain/OmsWeiRefund.java @@ -0,0 +1,166 @@ +package com.qihang.wei.domain; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 视频号小店退款 + * @TableName oms_wei_refund + */ +@Data +public class OmsWeiRefund implements Serializable { + /** + * + */ + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 售后单号 + */ + private String afterSaleOrderId; + + /** + * 售后单当前状态,参考: +USER_CANCELD 用户取消申请 +MERCHANT_PROCESSING 商家受理中 +MERCHANT_REJECT_REFUND 商家拒绝退款 +MERCHANT_REJECT_RETURN 商家拒绝退货退款 +USER_WAIT_RETURN 待买家退货 +RETURN_CLOSED 退货退款关闭 +MERCHANT_WAIT_RECEIPT 待商家收货 +MERCHANT_OVERDUE_REFUND 商家逾期未退款 +MERCHANT_REFUND_SUCCESS 退款完成 +MERCHANT_RETURN_SUCCESS 退货退款完成 +PLATFORM_REFUNDING 平台退款中 +PLATFORM_REFUND_FAIL 平台退款失败 +USER_WAIT_CONFIRM 待用户确认 +MERCHANT_REFUND_RETRY_FAIL 商家打款失败,客服关闭售后 +MERCHANT_FAIL 售后关闭 +USER_WAIT_CONFIRM_UPDATE 待用户处理商家协商 +USER_WAIT_HANDLE_MERCHANT_AFTER_SALE 待用户处理商家代发起的售后申请 + */ + private String status; + + /** + * 买家身份标识 + */ + private String openid; + + /** + * 买家在开放平台的唯一标识符,若当前视频号小店已绑定到微信开放平台账号下会返回 + */ + private String unionid; + + /** + * 商品spuid + */ + private String productId; + + /** + * 商品skuid + */ + private String skuId; + + /** + * 售后数量 + */ + private Integer count; + + /** + * 是否极速退款RefundInfo + */ + private String fastRefund; + + /** + * 标明售后单退款直接原因, 枚举值参考 RefundReason + */ + private Integer refundReason; + + /** + * 退款金额(分) + */ + private Integer refundAmount; + + /** + * 快递单号 + */ + private String returnWaybillId; + + /** + * 物流公司id + */ + private String returnDeliveryId; + + /** + * 物流公司名称 + */ + private String returnDeliveryName; + + /** + * 售后相关商品信息JSON + */ + private String merchantUploadInfo; + + /** + * 售后单创建时间戳 + */ + private Integer createTime; + + /** + * 售后单更新时间戳 + */ + private Integer updateTime; + + /** + * 退款原因 + */ + private String reason; + + /** + * 退款原因解释 + */ + private String reasonText; + + /** + * 售后类型。REFUND:退款;RETURN:退货退款。 + */ + private String type; + + /** + * 订单号,该字段可用于获取订单 + */ + private String orderId; + + /** + * detail json + */ + private String details; + + /** + * 纠纷id,该字段可用于获取纠纷信息 + */ + private String complaintId; + + /** + * 微信支付退款的响应 + */ + private String refundResp; + + /** + * 推送状态(0未推送;1推送成功;2推送失败) + */ + private Integer pullStatus; + + /** + * 订单审核时间 + */ + private Date pullTime; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/mapper/OmsWeiRefundMapper.java b/open-api/wei-api/src/main/java/com/qihang/wei/mapper/OmsWeiRefundMapper.java new file mode 100644 index 00000000..6c3137f3 --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/mapper/OmsWeiRefundMapper.java @@ -0,0 +1,18 @@ +package com.qihang.wei.mapper; + +import com.qihang.wei.domain.OmsWeiRefund; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author TW +* @description 针对表【oms_wei_refund(视频号小店退款)】的数据库操作Mapper +* @createDate 2024-06-20 17:07:27 +* @Entity com.qihang.wei.domain.OmsWeiRefund +*/ +public interface OmsWeiRefundMapper extends BaseMapper { + +} + + + + diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/service/OmsWeiRefundService.java b/open-api/wei-api/src/main/java/com/qihang/wei/service/OmsWeiRefundService.java new file mode 100644 index 00000000..5641a6a3 --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/service/OmsWeiRefundService.java @@ -0,0 +1,17 @@ +package com.qihang.wei.service; + +import com.qihang.common.common.PageQuery; +import com.qihang.common.common.PageResult; +import com.qihang.common.common.ResultVo; +import com.qihang.wei.domain.OmsWeiRefund; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author TW +* @description 针对表【oms_wei_refund(视频号小店退款)】的数据库操作Service +* @createDate 2024-06-20 17:07:27 +*/ +public interface OmsWeiRefundService extends IService { + PageResult queryPageList(OmsWeiRefund bo, PageQuery pageQuery); + ResultVo saveRefund(Long shopId, OmsWeiRefund refund); +} diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/service/impl/OmsWeiRefundServiceImpl.java b/open-api/wei-api/src/main/java/com/qihang/wei/service/impl/OmsWeiRefundServiceImpl.java new file mode 100644 index 00000000..2358cee2 --- /dev/null +++ b/open-api/wei-api/src/main/java/com/qihang/wei/service/impl/OmsWeiRefundServiceImpl.java @@ -0,0 +1,86 @@ +package com.qihang.wei.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qihang.common.common.PageQuery; +import com.qihang.common.common.PageResult; +import com.qihang.common.common.ResultVo; +import com.qihang.common.common.ResultVoEnum; +import com.qihang.wei.domain.OmsWeiRefund; +import com.qihang.wei.mapper.OmsWeiOrderItemMapper; +import com.qihang.wei.service.OmsWeiRefundService; +import com.qihang.wei.mapper.OmsWeiRefundMapper; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.List; + +/** +* @author TW +* @description 针对表【oms_wei_refund(视频号小店退款)】的数据库操作Service实现 +* @createDate 2024-06-20 17:07:27 +*/ +@AllArgsConstructor +@Service +public class OmsWeiRefundServiceImpl extends ServiceImpl + implements OmsWeiRefundService{ + private final OmsWeiRefundMapper mapper; + private final OmsWeiOrderItemMapper orderItemMapper; +// private final MQClientService mqClientService; + + @Override + public PageResult queryPageList(OmsWeiRefund bo, PageQuery pageQuery) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(bo.getShopId()!=null,OmsWeiRefund::getShopId,bo.getShopId()) + .eq(StringUtils.hasText(bo.getOrderId()),OmsWeiRefund::getOrderId,bo.getOrderId()) + ; + + Page page = mapper.selectPage(pageQuery.build(), queryWrapper); + + return PageResult.build(page); + } + + @Transactional + @Override + public ResultVo saveRefund(Long shopId, OmsWeiRefund refund) { + try { + List refunds = mapper.selectList(new LambdaQueryWrapper().eq(OmsWeiRefund::getAfterSaleOrderId, refund.getAfterSaleOrderId())); + OmsWeiRefund newRefund = new OmsWeiRefund(); + if (refunds != null && refunds.size() > 0) { + newRefund = refunds.get(0); + // 存在,修改 + OmsWeiRefund update = new OmsWeiRefund(); + update.setId(refunds.get(0).getId()); + update.setOrderId(refund.getOrderId()); + update.setStatus(refund.getStatus()); + update.setUpdateTime(refund.getUpdateTime()); + update.setReturnWaybillId(refund.getReturnWaybillId()); + update.setReturnDeliveryName(refund.getReturnDeliveryName()); + update.setReturnDeliveryId(refund.getReturnDeliveryId()); + update.setComplaintId(refund.getComplaintId()); + mapper.updateById(update); + + return ResultVo.error(ResultVoEnum.DataExist, "退款已经存在,更新成功"); + } else { + newRefund = refund; + // 不存在,新增 + refund.setShopId(shopId); + mapper.insert(refund); + return ResultVo.success(); + } + + } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return ResultVo.error(ResultVoEnum.SystemException, "系统异常:" + e.getMessage()); + } + } +} + + + + diff --git a/open-api/wei-api/src/main/resources/mapper/OmsWeiRefundMapper.xml b/open-api/wei-api/src/main/resources/mapper/OmsWeiRefundMapper.xml new file mode 100644 index 00000000..0baf22c8 --- /dev/null +++ b/open-api/wei-api/src/main/resources/mapper/OmsWeiRefundMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,shop_id,after_sale_order_id, + status,openid,unionid, + product_id,sku_id,count, + fast_refund,refund_reason,refund_amount, + return_waybill_id,return_delivery_id,return_delivery_name, + merchant_upload_info,create_time,update_time, + reason,reason_text,type, + order_id,details,complaint_id, + refund_resp,pull_status,pull_time + + diff --git a/vue/src/views/shop/wei/refund/index.vue b/vue/src/views/shop/wei/refund/index.vue index e3775dae..15931c33 100644 --- a/vue/src/views/shop/wei/refund/index.vue +++ b/vue/src/views/shop/wei/refund/index.vue @@ -57,23 +57,23 @@ API拉取新退款 - - - - - - - - - - + + 手动推送售后 + @@ -231,6 +231,7 @@ import { listShop } from "@/api/shop/shop"; import {MessageBox} from "element-ui"; import {isRelogin} from "@/utils/request"; import {listShopRefund, orderIntercept, pullRefund, returnedConfirm} from "@/api/wei/refund"; +import {pushOms} from "@/api/tao/taoRefund"; export default { name: "RefundWei", data() { @@ -284,10 +285,13 @@ export default { }; }, created() { - listShop({platform:2}).then(response => { - this.shopList = response.rows; - }); - this.getList(); + listShop({platform: 2}).then(response => { + this.shopList = response.rows; + if (this.shopList && this.shopList.length > 0) { + this.queryParams.shopId = this.shopList[0].id + } + this.getList(); + }); }, methods: { /** 查询淘宝退款订单列表 */ @@ -324,10 +328,19 @@ export default { }, // 多选框选中数据 handleSelectionChange(selection) { - this.ids = selection.map(item => item.refundId) + this.ids = selection.map(item => item.afterSaleOrderId) this.single = selection.length!==1 this.multiple = !selection.length }, + handlePushOms(row) { + const ids = row.id || this.ids; + this.$modal.confirm('是否手动推送到OMS?').then(function() { + return pushOms({ids:ids}); + }).then(() => { + // this.getList(); + this.$modal.msgSuccess("推送成功"); + }).catch(() => {}); + }, handlePull() { if(this.queryParams.shopId){ this.pullLoading = true