Bladeren bron

新件返还

FengChaoYu 8 maanden geleden
bovenliggende
commit
8343e4f924
20 gewijzigde bestanden met toevoegingen van 707 en 9 verwijderingen
  1. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesBean.java
  2. 89 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/PartsStockLogic.java
  3. 21 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageBean.java
  4. 13 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageItemBean.java
  5. 12 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageRecordBean.java
  6. 109 0
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageVO.java
  7. 1 1
      mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/OldRefundManageRecordBean.java
  8. 17 0
      mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java
  9. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java
  10. 13 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsSalesOrderController.java
  11. 113 0
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/worker/NewRefundController.java
  12. 2 2
      mall-server-api/src/main/java/com/gree/mall/manager/controller/material/worker/OldRefundController.java
  13. 23 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundApplyTypeEnum.java
  14. 22 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundModeEnum.java
  15. 23 0
      mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundStateEnum.java
  16. 20 4
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsSalesOrderLogic.java
  17. 1 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WorkerOldRefundManageLogic.java
  18. 188 0
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/worker/NewRefundManageLogic.java
  19. 1 1
      mall-server-api/src/main/java/com/gree/mall/manager/logic/material/worker/OldRefundManageInnerLogic.java
  20. 37 1
      mall-server-api/src/main/resources/mapper/MaterialMapper.xml

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsSalesBean.java

@@ -1,5 +1,6 @@
 package com.gree.mall.manager.bean.material.manage;
 
+import com.gree.mall.manager.bean.material.worker.OldRefundManageRecordBean;
 import com.gree.mall.manager.plus.entity.WebsitPartsSales;
 import com.gree.mall.manager.plus.entity.WebsitSalesPayOrder;
 import io.swagger.annotations.ApiModel;

+ 89 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/stock/PartsStockLogic.java

@@ -0,0 +1,89 @@
+package com.gree.mall.manager.bean.material.stock;
+
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManageRecord;
+import com.gree.mall.manager.plus.entity.WebsitPartsSalesItem;
+import com.gree.mall.manager.plus.service.WebsitPartsSalesItemService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class PartsStockLogic {
+
+    private final RedisLockRegistry redisLockRegistry;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsSalesItemService websitPartsSalesItemService;
+
+    /**
+     * 恢复新件销售数量
+     * @param
+     */
+    public void revertNewPartsSalesQty(String websitId, String partsWebsitId, String identity,
+                                       List<WebsitPartsNewRefundManageRecord> partsNewRefundManageRecordList) throws Exception {
+        // 锁定销售单明细
+        String lockName = websitId + "|" + partsWebsitId + "|" + identity;
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.WRITE_SALES_ITEM + lockName);
+        if(!obtain.tryLock(10, TimeUnit.SECONDS)){
+            throw new RemoteServiceException("销售明细已冻结:" + lockName);
+        }
+        // 处理销售单明细
+        try{
+            // 查询销售的明细
+            List<WebsitPartsSalesItem> salesOrderItems = materialMapper.querySalesItemByItemId(websitId, partsWebsitId,
+                    identity, partsNewRefundManageRecordList.stream()
+                            .map(WebsitPartsNewRefundManageRecord::getSalesItemId)
+                            .collect(Collectors.toList()));
+
+            Map<String, WebsitPartsSalesItem> salesOrderItemMap = salesOrderItems.stream()
+                    .collect(Collectors.toMap(WebsitPartsSalesItem::getId, Function.identity()));
+            for (WebsitPartsNewRefundManageRecord partsNewRefundManageRecord : partsNewRefundManageRecordList) {
+                WebsitPartsSalesItem partsSalesOrderItem = salesOrderItemMap.get(partsNewRefundManageRecord.getSalesItemId());
+                partsSalesOrderItem.setNewRefundQty(partsSalesOrderItem.getNewRefundQty().subtract(partsNewRefundManageRecord.getQty()));
+                partsSalesOrderItem.setQty(partsSalesOrderItem.getQty().add(partsNewRefundManageRecord.getQty()));
+            }
+
+            // 更新销售明细数据
+            websitPartsSalesItemService.saveOrUpdateBatch(salesOrderItemMap.values());
+
+        } finally {
+            this.txCallUnlockSalesItem(obtain);
+        }
+    }
+
+    private void txCallUnlockSalesItem(Lock obtain) {
+        //事务提交完成后才释放锁,此方法禁止执行mysql相关操作,否则将导致重大问题。
+        if (TransactionSynchronizationManager.isActualTransactionActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCompletion(int status) {
+
+                    if(TransactionSynchronization.STATUS_COMMITTED == status){
+                        log.info("=========【销售单明细】======事务提交==============");
+                    }else if(TransactionSynchronization.STATUS_ROLLED_BACK == status){
+                        log.info("========【销售单明细】=========事务回滚============");
+                    }
+
+                    obtain.unlock();
+                }
+            });
+        } else {
+            log.info("【销售单明细】====没有事务===释放锁");
+            obtain.unlock();
+        }
+    }
+}

+ 21 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageBean.java

@@ -0,0 +1,21 @@
+package com.gree.mall.manager.bean.material.worker;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class NewRefundManageBean extends WebsitPartsNewRefundManage {
+
+    @ApiModelProperty("申请明细")
+    private List<NewRefundManageItemBean> newRefundManageItemBeanList;
+
+    @ApiModelProperty("记录")
+    private List<NewRefundManageRecordBean> partsNewRefundManageRecordList;
+}

+ 13 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageItemBean.java

@@ -0,0 +1,13 @@
+package com.gree.mall.manager.bean.material.worker;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManageItem;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class NewRefundManageItemBean extends WebsitPartsNewRefundManageItem {
+
+}

+ 12 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageRecordBean.java

@@ -0,0 +1,12 @@
+package com.gree.mall.manager.bean.material.worker;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManageRecord;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+public class NewRefundManageRecordBean extends WebsitPartsNewRefundManageRecord {
+}

+ 109 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/NewRefundManageVO.java

@@ -0,0 +1,109 @@
+package com.gree.mall.manager.bean.material.worker;
+
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+public class NewRefundManageVO {
+
+    @ApiModelProperty(value = "申请单号")
+    private String applyNo;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "商户编号")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "销售单id")
+    private String salesId;
+
+    @ApiModelProperty(value = "申请类别")
+    private PartsApplyCategoryEnum applyCategory;
+
+    @ApiModelProperty(value = "申请类型")
+    private PartsRefundApplyTypeEnum applyType;
+
+    @ApiModelProperty(value = "返还方式")
+    private PartsRefundModeEnum refundMode;
+
+    @ApiModelProperty(value = "快递单号")
+    private String expressNo;
+
+    @ApiModelProperty(value = "收货地址")
+    private String receiveAddress;
+
+    @ApiModelProperty(value = "接收网点编号")
+    private String receiveWebsitId;
+
+    @ApiModelProperty(value = "接收网点名称")
+    private String receiveWebsitName;
+
+    @ApiModelProperty(value = "接收配件网点编号")
+    private String receivePartsWebsitId;
+
+    @ApiModelProperty(value = "网点地址")
+    private String websitAddress;
+
+    @ApiModelProperty(value = "师傅身份证")
+    private String identity;
+
+    @ApiModelProperty(value = "师傅编号")
+    private String workerId;
+
+    @ApiModelProperty(value = "师傅名称")
+    private String workerName;
+
+    @ApiModelProperty(value = "退款金额")
+    private BigDecimal refundAmount;
+
+    @ApiModelProperty(value = "退款方式")
+    private PayTypeEnum refundAmountMode;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "审批备注")
+    private String examineRemark;
+
+    @ApiModelProperty(value = "单据状态")
+    private PartsOrderFlagEnum flag;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "提交人")
+    private String submitBy;
+
+    @ApiModelProperty(value = "提交时间")
+    private Date submitTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String examineBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date examineTime;
+
+    @ApiModelProperty(value = "确认返还人")
+    private String refundedBy;
+
+    @ApiModelProperty(value = "确认返还时间")
+    private Date refundedTime;
+}

+ 1 - 1
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/OldRefundManageRecordBean.java → mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/OldRefundManageRecordBean.java

@@ -1,4 +1,4 @@
-package com.gree.mall.manager.bean.material.manage;
+package com.gree.mall.manager.bean.material.worker;
 
 import com.gree.mall.manager.plus.entity.WebsitPartsOldRefundManageRecord;
 import io.swagger.annotations.ApiModel;

+ 17 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -12,6 +12,9 @@ import com.gree.mall.manager.bean.material.vender.WebsitPurchaseCheckVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsRelaVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderGoodsVO;
 import com.gree.mall.manager.bean.material.vender.WebsitVenderVO;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageVO;
+import com.gree.mall.manager.bean.material.worker.OldRefundManageRecordBean;
+import com.gree.mall.manager.plus.entity.WebsitPartsSalesItem;
 import com.gree.mall.manager.zfire.bean.PartsParamBean;
 import com.gree.mall.manager.zfire.bean.WebsitGoodsParamBean;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
@@ -308,4 +311,18 @@ public interface MaterialMapper {
     List<WebsitPartsSalesItemBean> selectItemBySalesOrderId(@Param("id") String id);
 
     List<OldRefundManageRecordBean> queryOldRefundRecordById(@Param("id") String id);
+
+    /**
+     * 新件返还列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<NewRefundManageVO> newRefundManagePage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 带锁的查询
+     * @return
+     */
+    List<WebsitPartsSalesItem> querySalesItemByItemId(String websitId, String partsWebsitId, String identity, List<String> records);
 }

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -87,6 +87,7 @@ public class Constant {
         public static final String OLD_OUT = "jsm:parts:old:out:";
         public static final String NEW_REFUND = "jsm:parts:new:refund:";
         public static final String PARTS_SALES = "jsm:lock:parts:sales:";
+        public static final String WRITE_SALES_ITEM = "jsm:parts:write:sales:item:";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

+ 13 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsSalesOrderController.java

@@ -12,6 +12,7 @@ import com.gree.mall.manager.enums.material.SourceSalesEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.helper.ResponseHelper;
 import com.gree.mall.manager.logic.material.manage.WebsitPartsSalesOrderLogic;
+import com.gree.mall.manager.plus.entity.WebsitSalesPayOrder;
 import com.gree.mall.manager.plus.entity.WebsitStock;
 import com.gree.mall.manager.zfire.bean.ZfireParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
@@ -107,6 +108,16 @@ public class WebsitPartsSalesOrderController {
         return ResponseHelper.success(websitPartsSalesOrderLogic.generateCode(id, payConfigId));
     }
 
+    @GetMapping("/query/pay/status")
+    @ApiOperation(value = "查询二维码支付状态")
+    public ResponseHelper<WebsitSalesPayOrder> queryPayStatus(
+            @ApiParam(value = "网点编号",required = true) @RequestParam String websitId,
+            @ApiParam(value = "单据号",required = true) @RequestParam String id,
+            @ApiParam(value = "商户订单号",required = true) @RequestParam String outTradeNo
+    ) throws Exception {
+        return ResponseHelper.success(websitPartsSalesOrderLogic.queryPayStatus(websitId, id, outTradeNo));
+    }
+
     @ApiOperation("配件销售列表导出")
     @PostMapping("/list/export")
     public void listExport(
@@ -265,4 +276,6 @@ public class WebsitPartsSalesOrderController {
 
         return ResponseHelper.success();
     }
+
+
 }

+ 113 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/worker/NewRefundController.java

@@ -0,0 +1,113 @@
+package com.gree.mall.manager.controller.material.worker;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageBean;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageVO;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.worker.NewRefundManageLogic;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "新件返还管理", tags = {"新件返还管理"})
+@RequestMapping(value = "/worker/new-refund", produces = "application/json; charset=utf-8")
+public class NewRefundController {
+
+    @Resource
+    NewRefundManageLogic newRefundManageLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation("新件返还管理列表")
+    public ResponseHelper<IPage<NewRefundManageVO>> list(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) throws RemoteServiceException {
+        IPage<NewRefundManageVO> stockBeanIPage = newRefundManageLogic.list(zfireParamBean);
+        return ResponseHelper.success(stockBeanIPage, new TypeReference<NewRefundManageVO>() {
+        });
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("新件返还管理列表导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<NewRefundManageVO> stockBeanIPage = newRefundManageLogic.list(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(stockBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value = "新件返还管理详情")
+    public ResponseHelper<NewRefundManageBean> detail(
+            @ApiParam(value = "申请单号", required = true) @RequestParam String applyNo
+    ) throws RemoteServiceException {
+        NewRefundManageBean bean = newRefundManageLogic.detail(applyNo);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/examine")
+    @ApiOperation(value = "新件返还审批")
+    public ResponseHelper examine(
+            @ApiParam(value = "申请单号", required = true) @RequestParam String applyNo,
+            @ApiParam(value = "审核结果 AGREE=通过 REJECT=驳回 REFUNDED=已返还", required = true) @RequestParam String flag,
+            @ApiParam(value = "审核备注") @RequestParam(required = false) String examineRemark
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.NEW_REFUND + applyNo);
+        try {
+            if (obtain.tryLock(5, TimeUnit.SECONDS)) {
+                newRefundManageLogic.examine(applyNo, flag, examineRemark);
+            }
+        } catch (Exception e) {
+            log.error("【新件返还审批处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/refund")
+    @ApiOperation(value = "新件返还确认返还")
+    public ResponseHelper refund(
+            @RequestParam String applyNo
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.NEW_REFUND + applyNo);
+        try {
+            if (obtain.tryLock(5, TimeUnit.SECONDS)) {
+                newRefundManageLogic.refund(applyNo);
+            }
+        } catch (Exception e) {
+            log.error("【新件返还确认处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+
+}

+ 2 - 2
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WorkerOldRefundController.java → mall-server-api/src/main/java/com/gree/mall/manager/controller/material/worker/OldRefundController.java

@@ -1,4 +1,4 @@
-package com.gree.mall.manager.controller.material.manage;
+package com.gree.mall.manager.controller.material.worker;
 
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.exception.RemoteServiceException;
@@ -23,7 +23,7 @@ import java.util.concurrent.locks.Lock;
 @RestController
 @Api(value = "师傅旧件返还管理", tags ={"师傅旧件返还管理"} )
 @RequestMapping(value = "/worker/old-refund", produces = "application/json; charset=utf-8")
-public class WorkerOldRefundController {
+public class OldRefundController {
 
     @Resource
     WorkerOldRefundManageLogic workerOldRefundManageLogic;

+ 23 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundApplyTypeEnum.java

@@ -0,0 +1,23 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsRefundApplyTypeEnum implements BaseEnum {
+    NEW("NEW","新件返还"),
+    LOST("LOST","破损返还"),
+    BUG("BUG","故障返还"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+
+    private final String remark;
+}

+ 22 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundModeEnum.java

@@ -0,0 +1,22 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsRefundModeEnum implements BaseEnum {
+    EXPRESS("EXPRESS","快递"),
+    SELF("SELF","网点自还"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+
+    private final String remark;
+}

+ 23 - 0
mall-server-api/src/main/java/com/gree/mall/manager/enums/material/PartsRefundStateEnum.java

@@ -0,0 +1,23 @@
+package com.gree.mall.manager.enums.material;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public enum PartsRefundStateEnum implements BaseEnum {
+    OK("OK","成功"),
+    FAIL("FAIL","失败"),
+    WAIT("WAIT","等待"),
+    ;
+
+    @EnumValue
+    @JsonValue
+    private final String key;
+
+    private final String remark;
+}

+ 20 - 4
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsSalesOrderLogic.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.manager.bean.PayDetail;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.material.manage.*;
+import com.gree.mall.manager.bean.material.worker.OldRefundManageRecordBean;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
 import com.gree.mall.manager.constant.SybConstants;
 import com.gree.mall.manager.enums.IsEnum;
@@ -240,7 +241,7 @@ public class WebsitPartsSalesOrderLogic {
                     item.setWebsitId(partsSalesOrderBean.getWebsitId());
                     item.setPartsId(parts.getGoodsId());
                     item.setMaterialGroupName(parts.getMaterialGroupName());
-                    item.setUnitName(parts.getGoodsStockUnit());
+                    item.setGoodsStockUnit(parts.getGoodsStockUnit());
                     item.setPartsWebsitId(stockList.get(0).getPartsWebsitId());
                     item.setPartsNumber(stockList.get(0).getGoodsId());
                     item.setMarketPrice(parts.getMarketPrice());
@@ -252,7 +253,7 @@ public class WebsitPartsSalesOrderLogic {
                     item.setWebsitId(partsSalesOrderBean.getWebsitId());
                     item.setPartsId(parts.getGoodsId());
                     item.setMaterialGroupName(parts.getMaterialGroupName());
-                    item.setUnitName(parts.getGoodsStockUnit());
+                    item.setGoodsStockUnit(parts.getGoodsStockUnit());
                     item.setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId());
                     item.setPartsNumber(parts.getGoodsId());
                     item.setMarketPrice(parts.getMarketPrice());
@@ -781,7 +782,7 @@ public class WebsitPartsSalesOrderLogic {
                 .setCompanyWechatName(partsSalesOrderBean.getCompanyWechatName())
                 .setWebsiteId(partsSalesOrderBean.getWebsitId())
                 .setWebsitName(partsSalesOrderBean.getWebsitName())
-                .setPartsWebsiteId(partsSalesOrderBean.getPartsWebsitId())
+                .setPartsWebsitId(partsSalesOrderBean.getPartsWebsitId())
                 .setIdentity(partsSalesOrderBean.getIdentity())
                 .setWorkerId(partsSalesOrderBean.getWorkerId())
                 .setWorkerName(partsSalesOrderBean.getWorkerName())
@@ -789,7 +790,7 @@ public class WebsitPartsSalesOrderLogic {
                 .setRef(partsSalesOrderBean.getId())
                 .setRefType(PartsRefTypeEnum.SALES.toString())
                 .setRefundAmount(partsSalesOrderBean.getTotalAmount())
-                .setRefundState("WAIT")
+                .setRefundState(PartsRefundStateEnum.WAIT.getKey())
                 .setIsExec(IsEnum.N.getValue())
                 .insert();
     }
@@ -809,4 +810,19 @@ public class WebsitPartsSalesOrderLogic {
                 .eq(WebsitPartsSales::getId, partsSalesOrderBean.getId())
                 .update();
     }
+
+    public WebsitSalesPayOrder queryPayStatus(String websitId, String id, String outTradeNo) {
+
+        // 查询支付订单记录
+        WebsitSalesPayOrder pay = websitSalesPayOrderService.lambdaQuery()
+                .eq(WebsitSalesPayOrder::getWebsitId, websitId)
+                .eq(WebsitSalesPayOrder::getOrderId, id)
+                .eq(WebsitSalesPayOrder::getOutTradeNo, outTradeNo)
+                .one();
+        if (Objects.isNull(pay)) {
+            throw new RemoteServiceException("支付订单记录不存在");
+        }
+
+        return pay;
+    }
 }

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WorkerOldRefundManageLogic.java

@@ -11,6 +11,7 @@ import com.gree.mall.manager.commonmapper.MaterialMapper;
 import com.gree.mall.manager.enums.material.PartsRepairFlagEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.logic.material.worker.OldRefundManageInnerLogic;
 import com.gree.mall.manager.plus.entity.SysDictCompany;
 import com.gree.mall.manager.plus.entity.WebsitPartsOldRefundManage;
 import com.gree.mall.manager.plus.entity.WebsitPartsSettlementRecord;

+ 188 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/worker/NewRefundManageLogic.java

@@ -0,0 +1,188 @@
+package com.gree.mall.manager.logic.material.worker;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.stock.PartsStockLogic;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageBean;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageItemBean;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageRecordBean;
+import com.gree.mall.manager.bean.material.worker.NewRefundManageVO;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.IsEnum;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import com.gree.mall.manager.enums.material.PartsOrderFlagEnum;
+import com.gree.mall.manager.enums.material.PartsRefTypeEnum;
+import com.gree.mall.manager.enums.material.PartsRefundStateEnum;
+import com.gree.mall.manager.enums.material.PayTypeEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManage;
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManageItem;
+import com.gree.mall.manager.plus.entity.WebsitPartsNewRefundManageRecord;
+import com.gree.mall.manager.plus.entity.WebsitPartsRefundRecord;
+import com.gree.mall.manager.plus.service.WebsitPartsNewRefundManageItemService;
+import com.gree.mall.manager.plus.service.WebsitPartsNewRefundManageRecordService;
+import com.gree.mall.manager.plus.service.WebsitPartsNewRefundManageService;
+import com.gree.mall.manager.plus.service.WebsitPartsRefundRecordService;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class NewRefundManageLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsNewRefundManageService websitPartsNewRefundManageService;
+    private final WebsitPartsNewRefundManageItemService websitPartsNewRefundManageItemService;
+    private final WebsitPartsNewRefundManageRecordService websitPartsNewRefundManageRecordService;
+    private final PartsStockLogic partsStockLogic;
+    private final WebsitPartsRefundRecordService websitPartsRefundRecordService;
+
+    public IPage<NewRefundManageVO> list(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, NewRefundManageVO.class, adminUser);
+
+        return materialMapper.newRefundManagePage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public NewRefundManageBean detail(String applyNo) {
+        final WebsitPartsNewRefundManage manage = websitPartsNewRefundManageService.getById(applyNo);
+        NewRefundManageBean bean = new NewRefundManageBean();
+        BeanUtils.copyProperties(manage, bean);
+
+        final List<WebsitPartsNewRefundManageItem> items = websitPartsNewRefundManageItemService.lambdaQuery()
+                .eq(WebsitPartsNewRefundManageItem::getApplyNo, applyNo)
+                .list();
+
+        final List<WebsitPartsNewRefundManageRecord> records = websitPartsNewRefundManageRecordService.lambdaQuery()
+                .eq(WebsitPartsNewRefundManageRecord::getApplyNo, applyNo)
+                .list();
+
+        bean.setNewRefundManageItemBeanList(BeanUtil.copyToList(items, NewRefundManageItemBean.class));
+        bean.setPartsNewRefundManageRecordList(BeanUtil.copyToList(records, NewRefundManageRecordBean.class));
+
+        return bean;
+    }
+
+    @Transactional
+    public void examine(String applyNo, String flag, String examineRemark) throws Exception {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPartsNewRefundManage partsNewRefundManage = websitPartsNewRefundManageService.getById(applyNo);
+        if (!partsNewRefundManage.getFlag().equals(PartsOrderFlagEnum.SUBMIT.getKey())) {
+            throw new RemoteServiceException(applyNo + "单据状态:"
+                    + BaseEnum.keyToValue(PartsOrderFlagEnum.class, partsNewRefundManage.getFlag()) + ",审批失败");
+        }
+        DateTime curDate = DateUtil.date();
+        partsNewRefundManage.setFlag(flag)
+                .setExamineRemark(examineRemark)
+                .setExamineBy(adminUser.getNickName())
+                .setExamineTime(curDate)
+                .updateById();
+        if (flag.equals(PartsOrderFlagEnum.AGREE.toString())) {
+            // 通过
+//            this.insertPartsMessageTip(partsNewRefundManage, curDate);
+        }else if (flag.equals(PartsOrderFlagEnum.REJECT.toString())) {
+            // 驳回
+            List<WebsitPartsNewRefundManageItem> partsNewRefundManageItems = websitPartsNewRefundManageItemService.lambdaQuery()
+                    .eq(WebsitPartsNewRefundManageItem::getApplyNo, partsNewRefundManage.getApplyNo())
+                    .list();
+            List<WebsitPartsNewRefundManageRecord> partsNewRefundManageRecordList = websitPartsNewRefundManageRecordService.lambdaQuery()
+                    .eq(WebsitPartsNewRefundManageRecord::getApplyNo, partsNewRefundManage.getApplyNo())
+                    .list();
+            // 驳回状态时临占新件库存减 新件库存加
+//            List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsNewRefundManage, partsNewRefundManageItems,
+//                    partsNewRefundManage.getExamineBy(), partsNewRefundManage.getExamineTime(),
+//                    PartsStockPartsAttrEnum.TEMP_NEW.toString(), PartsStockPartsAttrEnum.NEW.toString());
+//            partsStockLogic.handleWorkerStock(workerStockDTOList);
+//            // 驳回状态时销售明细还原数量
+            partsStockLogic.revertNewPartsSalesQty(partsNewRefundManage.getReceiveWebsitId(), partsNewRefundManage.getReceivePartsWebsitId(),
+                    partsNewRefundManage.getIdentity(), partsNewRefundManageRecordList);
+        }
+    }
+
+    @Transactional
+    public void refund(String applyNo) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPartsNewRefundManage partsNewRefundManage = websitPartsNewRefundManageService.getById(applyNo);
+        if (!partsNewRefundManage.getFlag().equals(PartsOrderFlagEnum.AGREE.getKey())) {
+            throw new RemoteServiceException(applyNo + "单据状态:"
+                    + BaseEnum.keyToValue(PartsOrderFlagEnum.class, partsNewRefundManage.getFlag()) + ",归还失败");
+        }
+
+        partsNewRefundManage.setFlag(PartsOrderFlagEnum.REFUNDED.getKey())
+                .setRefundedBy(adminUser.getNickName())
+                .setRefundedTime(DateUtil.date())
+                .updateById();
+
+        // 减师傅临占新件库存
+        List<WebsitPartsNewRefundManageItem> partsNewRefundManageItems = websitPartsNewRefundManageItemService.lambdaQuery()
+                .eq(WebsitPartsNewRefundManageItem::getApplyNo, partsNewRefundManage.getApplyNo())
+                .list();
+//        List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsNewRefundManage, partsNewRefundManageItems,
+//                partsNewRefundManage.getRefundedBy(), partsNewRefundManage.getRefundedTime(),
+//                PartsStockPartsAttrEnum.TEMP_NEW.toString(), null);
+//        partsStockLogic.handleWorkerStock(workerStockDTOList);
+
+        // 增加网点新件库存
+//        List<ShopStockDTO> shopStockDTOList = this.createShopStockDTO(partsNewRefundManage, partsNewRefundManageItems);
+//        partsStockLogic.handleShopStock(shopStockDTOList);
+
+        //TODO 插入退款记录
+        List<WebsitPartsNewRefundManageRecord> partsNewRefundManageRecords = websitPartsNewRefundManageRecordService.lambdaQuery()
+                .eq(WebsitPartsNewRefundManageRecord::getApplyNo, partsNewRefundManage.getApplyNo())
+                .list();
+        List<WebsitPartsRefundRecord> partsRefundRecordList = this.createRefundRecord(partsNewRefundManage, partsNewRefundManageRecords);
+        if(CollectionUtil.isNotEmpty(partsRefundRecordList))
+            websitPartsRefundRecordService.saveBatch(partsRefundRecordList);
+    }
+
+    private List<WebsitPartsRefundRecord> createRefundRecord(WebsitPartsNewRefundManage partsNewRefundManage, List<WebsitPartsNewRefundManageRecord> partsNewRefundManageRecords) {
+        List<WebsitPartsRefundRecord> partsRefundRecordList = new ArrayList<>();
+        for (WebsitPartsNewRefundManageRecord partsNewRefundManageRecord : partsNewRefundManageRecords) {
+            if (Objects.isNull(partsNewRefundManageRecord.getRefundAmountMode())
+                    || partsNewRefundManageRecord.getRefundAmountMode().equals(PayTypeEnum.CASH.getKey())) {
+                continue;
+            }
+            WebsitPartsRefundRecord partsRefundRecord = new WebsitPartsRefundRecord();
+            partsRefundRecord.setRefundNo(IdWorker.getIdStr())
+                    .setCompanyWechatId(partsNewRefundManage.getCompanyWechatId())
+                    .setCompanyWechatName(partsNewRefundManage.getCompanyWechatName())
+                    .setRecordId(partsNewRefundManageRecord.getId())
+                    .setWebsiteId(partsNewRefundManage.getReceiveWebsitId())
+                    .setWebsitName(partsNewRefundManage.getReceiveWebsitName())
+                    .setPartsWebsitId(partsNewRefundManage.getReceivePartsWebsitId())
+                    .setIdentity(partsNewRefundManage.getIdentity())
+                    .setWorkerId(partsNewRefundManage.getWorkerId())
+                    .setWorkerName(partsNewRefundManage.getWorkerName())
+                    .setSalesId(partsNewRefundManageRecord.getSalesId())
+                    .setSalesItemId(partsNewRefundManageRecord.getSalesItemId())
+                    .setRef(partsNewRefundManage.getApplyNo())
+                    .setRefType(PartsRefTypeEnum.NEW_REFUND.getKey())
+                    .setPartsNumber(partsNewRefundManageRecord.getPartsNumber())
+                    .setPartsName(partsNewRefundManageRecord.getPartsName())
+                    .setRefundAmount(partsNewRefundManageRecord.getRefundAmount())
+                    .setRefundState(PartsRefundStateEnum.WAIT.getKey())
+                    .setIsExec(IsEnum.N.getValue())
+                    .setCreateTime(DateUtil.date());
+            partsRefundRecordList.add(partsRefundRecord);
+        }
+        return partsRefundRecordList;
+    }
+}

+ 1 - 1
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/OldRefundManageInnerLogic.java → mall-server-api/src/main/java/com/gree/mall/manager/logic/material/worker/OldRefundManageInnerLogic.java

@@ -1,4 +1,4 @@
-package com.gree.mall.manager.logic.material.manage;
+package com.gree.mall.manager.logic.material.worker;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;

+ 37 - 1
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -650,7 +650,7 @@
     </select>
 
     <select id="queryOldRefundRecordById"
-            resultType="com.gree.mall.manager.bean.material.manage.OldRefundManageRecordBean">
+            resultType="com.gree.mall.manager.bean.material.worker.OldRefundManageRecordBean">
         SELECT
             a.*
         FROM
@@ -658,4 +658,40 @@
         WHERE
             sales_id = #{id}
     </select>
+
+    <select id="newRefundManagePage"
+            resultType="com.gree.mall.manager.bean.material.worker.NewRefundManageVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_parts_new_refund_manage a
+        ${ex.query}
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.receive_website_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
+
+    <select id="querySalesItemByItemId" resultType="com.gree.mall.manager.plus.entity.WebsitPartsSalesItem">
+        SELECT
+            a.*
+        FROM
+            websit_parts_sales_item a
+        WHERE
+            a.identity = #{identity}
+            AND a.websit_id = #{websitId}
+            AND a.parts_websit_id = #{partsWebsitId}
+            AND a.id IN
+        <foreach item="item" index="index" collection="records" open="(" separator=","
+                 close=")">
+            #{item}
+        </foreach>
+        FOR UPDATE
+    </select>
 </mapper>