FengChaoYu преди 8 месеца
родител
ревизия
3f0feea34a

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

@@ -3,6 +3,7 @@ package com.gree.mall.manager.controller.material.manage;
 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.PayDetail;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesBean;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesVO;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesWVO;
@@ -39,9 +40,6 @@ public class WebsitPartsSalesOrderController {
     @Resource
     RedisLockRegistry redisLockRegistry;
 
-//    @Resource
-//    WebsitSaleLogic websitSaleLogic;
-
     @ApiOperation("配件销售单新增")
     @PostMapping("/add")
     public ResponseHelper<WebsitPartsSalesBean> add(
@@ -71,7 +69,7 @@ public class WebsitPartsSalesOrderController {
     }
 
     @ApiOperation("配件销售单根据id获取")
-    @GetMapping("/loadSalesOrderById")
+    @PostMapping("/loadSalesOrderById")
     public ResponseHelper<WebsitPartsSalesBean> loadSalesOrderById(
             @RequestParam String id
     ) throws RemoteServiceException {
@@ -79,8 +77,8 @@ public class WebsitPartsSalesOrderController {
     }
 
     @ZfireList
-    @PostMapping("/list")
     @ApiOperation("配件销售列表")
+    @PostMapping("/list")
     public ResponseHelper<IPage<WebsitPartsSalesVO>> list(
             @RequestBody ZfireParamBean zfireParamBean
     ) throws RemoteServiceException {
@@ -90,8 +88,8 @@ public class WebsitPartsSalesOrderController {
     }
 
     @ZfireList
-    @PostMapping("/websit/list")
     @ApiOperation("网点配件销售列表")
+    @PostMapping("/websit/list")
     public ResponseHelper<IPage<WebsitPartsSalesWVO>> websitList(
             @RequestBody ZfireParamBean zfireParamBean
     ) throws RemoteServiceException {
@@ -100,17 +98,17 @@ public class WebsitPartsSalesOrderController {
         });
     }
 
-//    @PostMapping("/code")
-//    @ApiOperation(value = "生成支付二维码")
-//    public ResponseHelper<SalesPayList> generateCode(
-//            @ApiParam(value = "网点销售单id", required = true) @RequestParam String sheetId,
-//            @ApiParam(value = "网点支付配置id") @RequestParam(required = false) String payConfigId
-//    ) throws RemoteServiceException, IOException, JDOMException {
-//        return ResponseHelper.success(websitPartsSalesOrderLogic.generateCode(sheetId, payConfigId));
-//    }
+    @ApiOperation(value = "生成支付二维码")
+    @PostMapping("/code")
+    public ResponseHelper<PayDetail> generateCode(
+            @ApiParam(value = "网点销售单id", required = true) @RequestParam String id,
+            @ApiParam(value = "网点支付配置id") @RequestParam(required = false) String payConfigId
+    ) throws Exception {
+        return ResponseHelper.success(websitPartsSalesOrderLogic.generateCode(id, payConfigId));
+    }
 
-    @PostMapping("/list/export")
     @ApiOperation("配件销售列表导出")
+    @PostMapping("/list/export")
     public void listExport(
             @RequestBody ZfireParamBean zfireParamBean,
             HttpServletRequest request,
@@ -122,8 +120,8 @@ public class WebsitPartsSalesOrderController {
         FieldUtils.exportData(partsSalesOrderBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
     }
 
-    @PostMapping("/websit/list/export")
     @ApiOperation("网点配件销售列表导出")
+    @PostMapping("/websit/list/export")
     public void shopListExport(
             @RequestBody ZfireParamBean zfireParamBean,
             HttpServletRequest request,
@@ -135,114 +133,112 @@ public class WebsitPartsSalesOrderController {
         FieldUtils.exportData(partsSalesOrderBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
     }
 
-//    @ApiOperation("提交订单")
-//    @GetMapping("/submit")
-//    public ResponseHelper<PartsSalesOrderBean> submit(@ApiParam(value = "销售单id", required = true) @RequestParam String id) throws InterruptedException {
-//        PartsSalesOrderBean partsSalesOrderBean = websitPartsSalesOrderLogic.loadSalesOrderById(id, null);
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + partsSalesOrderBean.getSalesOrderNo());
-//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("销售单冻结中");
-//        }
-//        try {
-//            return ResponseHelper.success(websitPartsSalesOrderLogic.submit(partsSalesOrderBean.getSalesOrderNo()));
-//        } catch (Exception e) {
-//            log.error("【提交订单处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//    }
+    @ApiOperation("提交订单")
+    @PostMapping("/submit")
+    public ResponseHelper<WebsitPartsSalesBean> submit(@ApiParam(value = "销售单id", required = true) @RequestParam String id) throws InterruptedException {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("销售单冻结中");
+        }
+        try {
+            return ResponseHelper.success(websitPartsSalesOrderLogic.submit(id));
+        } catch (Exception e) {
+            log.error("【提交订单处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+    }
+
+    @ApiOperation("现金支付")
+    @PostMapping("/change-cash")
+    public ResponseHelper<WebsitPartsSalesBean> changeCash(@ApiParam(value = "销售单号", required = true) @RequestParam String id) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("销售单冻结中");
+        }
+        try {
+            return ResponseHelper.success(websitPartsSalesOrderLogic.changeCash(id));
+        } catch (Exception e) {
+            log.error("【提交订单处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+    }
+
+    @ApiOperation("网点提货")
+    @PostMapping("/confirm/delivery")
+    public ResponseHelper confirmDelivery(
+            @ApiParam(value = "销售单号", required = true) @RequestParam String id,
+            @ApiParam(value = "物流单号") @RequestParam(required = false) String logisticsNo
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("销售单冻结中");
+        }
+        try {
+            websitPartsSalesOrderLogic.confirmDelivery(id, logisticsNo);
+        } catch (Exception e) {
+            log.error("【网点提货处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
 
-//    @ApiOperation("现金支付")
-//    @GetMapping("/change-cash")
-//    public ResponseHelper<PartsSalesOrderBean> changeCash(@ApiParam(value = "销售单号", required = true) @RequestParam String salesOrderNo) throws Exception {
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
-//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("销售单冻结中");
-//        }
-//        try {
-//            return ResponseHelper.success(websitPartsSalesOrderLogic.changeCash(salesOrderNo));
-//        } catch (Exception e) {
-//            log.error("【提交订单处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//    }
-//
-//    @ApiOperation("网点提货")
-//    @GetMapping("/confirmDelivery")
-//    public ResponseHelper shopConfirmDelivery(
-//            @ApiParam(value = "销售单号", required = true) @RequestParam String salesOrderNo,
-//            @ApiParam(value = "物流单号") @RequestParam(required = false) String logisticsNo
-//    ) throws Exception {
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
-//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("销售单冻结中");
-//        }
-//        try {
-//            websitPartsSalesOrderLogic.shopConfirmDelivery(salesOrderNo, logisticsNo);
-//        } catch (Exception e) {
-//            log.error("【网点提货处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//
-//        return ResponseHelper.success();
-//    }
-//
-//    @ApiOperation("删除")
-//    @GetMapping("/deleteById")
-//    public ResponseHelper deleteById(
-//            @ApiParam(value = "销售单id", required = true) @RequestParam String id
-//    ) throws RemoteServiceException {
-//        websitPartsSalesOrderLogic.deleteById(id);
-//        return ResponseHelper.success();
-//    }
-//
-//    @ApiOperation("退回0-保存状态")
-//    @GetMapping("/backToSave")
-//    public ResponseHelper<PartsSalesOrderBean> backToSave(
-//            @RequestParam String id
-//    ) throws Exception {
-//        PartsSalesOrderBean partsSalesOrderBean = websitPartsSalesOrderLogic.loadSalesOrderById(id, null);
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + partsSalesOrderBean.getSalesOrderNo());
-//        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("销售单冻结中");
-//        }
-//        try {
-//            return ResponseHelper.success(websitPartsSalesOrderLogic.backToSave(partsSalesOrderBean.getSalesOrderNo()));
-//        } catch (Exception e) {
-//            log.error("【网点提货处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//
-//    }
-//
-//    @ApiOperation("取消订单")
-//    @GetMapping("/cancel")
-//    public ResponseHelper cancel(@RequestParam String salesOrderNo) throws Exception {
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
-//        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("配件销售单冻结中");
-//        }
-//        try {
-//            websitPartsSalesOrderLogic.cancel(salesOrderNo);
-//        } catch (Exception e) {
-//            log.error("【取消订单处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//
-//        return ResponseHelper.success();
-//    }
+        return ResponseHelper.success();
+    }
+
+    @ApiOperation("删除")
+    @PostMapping("/deleteById")
+    public ResponseHelper deleteById(
+            @ApiParam(value = "销售单id", required = true) @RequestParam String id
+    ) throws RemoteServiceException {
+        websitPartsSalesOrderLogic.deleteById(id);
+        return ResponseHelper.success();
+    }
+
+    @ApiOperation("退回-保存状态")
+    @PostMapping("/backToSave")
+    public ResponseHelper<WebsitPartsSalesBean> backToSave(
+            @RequestParam String id
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("销售单冻结中");
+        }
+        try {
+            return ResponseHelper.success(websitPartsSalesOrderLogic.backToSave(id));
+        } catch (Exception e) {
+            log.error("【网点退回保存处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+    }
+
+    @ApiOperation("取消订单")
+    @PostMapping("/cancel")
+    public ResponseHelper cancel(@RequestParam String id) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("配件销售单冻结中");
+        }
+        try {
+            websitPartsSalesOrderLogic.cancel(id);
+        } catch (Exception e) {
+            log.error("【取消订单处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
 
     @ApiOperation("获取配件可用库存")
-    @GetMapping("/query/parts/new/qty")
+    @PostMapping("/query/parts/new/qty")
     public ResponseHelper<WebsitStock> queryPartsNewQty(
             @ApiParam(required = true, value = "网点编码") @RequestParam String websitId,
             @ApiParam(required = true, value = "配件网点编号") @RequestParam String partsWebsitId,
@@ -251,33 +247,22 @@ public class WebsitPartsSalesOrderController {
         return ResponseHelper.success(websitPartsSalesOrderLogic.queryPartsNewQty(websitId, partsWebsitId, partsNumber));
     }
 
-//    @ShopDataNotAuth
-//    @GetMapping("/pay-config-list")
-//    @ApiOperation(value = "网点支付配置列表")
-//    public ResponseHelper<List<ShopPayConfig>> detail(
-//            @ApiParam(value = "网点编号", required = true) @RequestParam String shopId,
-//            @ApiParam(value = "类别", required = true) @RequestParam String category
-//    ) throws RemoteServiceException {
-//        List<ShopPayConfig> list = websitSaleLogic.payConfigList(shopId, category);
-//        return ResponseHelper.success(list);
-//    }
-//
-//    @ApiOperation("转换非申请")
-//    @GetMapping("/trans-not-apply")
-//    public ResponseHelper transNotApply(@RequestParam String salesOrderNo) throws Exception {
-//        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + salesOrderNo);
-//        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
-//            throw new RemoteServiceException("配件销售申请单冻结中");
-//        }
-//        try {
-//            websitPartsSalesOrderLogic.transNotApply(salesOrderNo);
-//        } catch (Exception e) {
-//            log.error("【转换非申请处理】失败", e);
-//            throw e;
-//        } finally {
-//            obtain.unlock();
-//        }
-//
-//        return ResponseHelper.success();
-//    }
+    @ApiOperation("转换非申请")
+    @PostMapping("/trans/not/apply")
+    public ResponseHelper transNotApply(@RequestParam String id) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.PARTS_SALES + id);
+        if (!obtain.tryLock(5, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("配件销售申请单冻结中");
+        }
+        try {
+            websitPartsSalesOrderLogic.transNotApply(id);
+        } catch (Exception e) {
+            log.error("【转换非申请处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
 }

+ 30 - 30
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/AllInPayLogic.java

@@ -141,34 +141,34 @@ public class AllInPayLogic {
     /**
      * 通联支付关闭
      */
-//    public Map<String, String> serviceCloseOrder(SalesPayList payRecord) throws RemoteServiceException {
-//        Map<String, String> reqMap = new HashMap<>();
-//        if (StringUtils.isNotBlank(payRecord.getMchNo())) {
-//            reqMap.put("orgid", payRecord.getMchNo());
-//        }
-//        reqMap.put("appid", payRecord.getAppid());
-//        reqMap.put("cusid", payRecord.getSubMchNo());
-//        reqMap.put("reqsn", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"))); // 商户的退款订单号
-//        reqMap.put("oldreqsn", payRecord.getOutTradeNo()); // 原交易的商户订单号
-//        reqMap.put("oldtrxid", payRecord.getOrderNo()); // 原交易的收银宝平台流水
-//        reqMap.put("trxid", payRecord.getOrderNo());
-//
-//        HashMap<String, String> heads = new HashMap();
-//        String token = commonLogic.getInfToken();
-//        if (StringUtils.isEmpty(token)) {
-//            throw new RemoteServiceException("获取接口令牌失败");
-//        }
-//        heads.put("authorization_token", token);
-//
-//        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/order/close", JSON.toJSONString(reqMap), heads);
-//
-//        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
-//
-//        String message = Optional.ofNullable(resMap.get("message")).orElse("error").toString();
-//        if (message.equals("success") || message.equals("交易已关闭")) {
-//            return (Map<String, String>) resMap.get("data");
-//        }
-//        log.error("通联交易关闭接口执行失败: {}", resMap);
-//        throw new RemoteServiceException("通联交易关闭接口执行失败:" + resMap.get("message"));
-//    }
+    public Map<String, String> serviceCloseOrder(WebsitSalesPayOrder payRecord) throws RemoteServiceException {
+        Map<String, String> reqMap = new HashMap<>();
+        if (StringUtils.isNotBlank(payRecord.getMchNo())) {
+            reqMap.put("orgid", payRecord.getMchNo());
+        }
+        reqMap.put("appid", payRecord.getAppid());
+        reqMap.put("cusid", payRecord.getSubMchNo());
+        reqMap.put("reqsn", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"))); // 商户的退款订单号
+        reqMap.put("oldreqsn", payRecord.getOutTradeNo()); // 原交易的商户订单号
+        reqMap.put("oldtrxid", payRecord.getOrderNo()); // 原交易的收银宝平台流水
+        reqMap.put("trxid", payRecord.getOrderNo());
+
+        HashMap<String, String> heads = new HashMap();
+        String token = commonLogic.getInfToken();
+        if (StringUtils.isEmpty(token)) {
+            throw new RemoteServiceException("获取接口令牌失败");
+        }
+        heads.put("authorization_token", token);
+
+        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/order/close", JSON.toJSONString(reqMap), heads);
+
+        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
+
+        String message = Optional.ofNullable(resMap.get("message")).orElse("error").toString();
+        if (message.equals("success") || message.equals("交易已关闭")) {
+            return (Map<String, String>) resMap.get("data");
+        }
+        log.error("通联交易关闭接口执行失败: {}", resMap);
+        throw new RemoteServiceException("通联交易关闭接口执行失败:" + resMap.get("message"));
+    }
 }

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

@@ -3,15 +3,20 @@ package com.gree.mall.manager.logic.material.manage;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 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.PayDetail;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.bean.material.manage.*;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.constant.SybConstants;
 import com.gree.mall.manager.enums.IsEnum;
 import com.gree.mall.manager.enums.IsYesNoEnum;
 import com.gree.mall.manager.enums.material.*;
 import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.AllInPayLogic;
 import com.gree.mall.manager.logic.common.CommonLogic;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
@@ -46,6 +51,8 @@ public class WebsitPartsSalesOrderLogic {
     private final StorageService storageService;
     private final MaterialConfigService materialConfigService;
     private final WebsitSalesPayOrderService websitSalesPayOrderService;
+    private final AdminWebsitPayConfigService adminWebsitPayConfigService;
+    private final AllInPayLogic allInPayLogic;
 
     public IPage<WebsitPartsSalesVO> list(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -316,7 +323,7 @@ public class WebsitPartsSalesOrderLogic {
         }
 
         // 记录总金额
-        partsSalesOrderBean.setTotalPrice(totalPrice);
+        partsSalesOrderBean.setTotalAmount(totalPrice);
         partsSalesOrderBean.setStatus(PartsOrderStatusEnum.SAVE.getKey());
         // 生成订单号
         String sheetId = commonLogic.generateMaterialNo(adminUser.getCompanyWechatId(), "PJ", PartsRefTypeEnum.SALES.getKey(), 13);
@@ -367,7 +374,7 @@ public class WebsitPartsSalesOrderLogic {
         return partsSalesOrderBean;
     }
 
-
+    @Transactional
     public void update(WebsitPartsSalesBean partsSalesOrderBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
         WebsitPartsSales partsSalesOrder = websitPartsSalesService.getById(partsSalesOrderBean.getId());
@@ -402,7 +409,7 @@ public class WebsitPartsSalesOrderLogic {
         }
 
         // 记录总金额
-        partsSalesOrderBean.setTotalPrice(totalPrice);
+        partsSalesOrderBean.setTotalAmount(totalPrice);
         websitPartsSalesService.updateById(partsSalesOrderBean);
         // 删除销售单配件明细
         websitPartsSalesItemService.lambdaUpdate()
@@ -438,4 +445,368 @@ public class WebsitPartsSalesOrderLogic {
                 .one();
     }
 
+    @Transactional
+    public WebsitPartsSalesBean submit(String id) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPartsSalesBean partsSalesOrderBean = loadSalesOrderById(id);
+        if(Objects.isNull(partsSalesOrderBean)) {
+            throw new RemoteServiceException("配件单提交失败,销售单信息不能为空") ;
+        }
+        if(!partsSalesOrderBean.getStatus().equals(PartsOrderStatusEnum.SAVE.getKey())) {
+            throw new RemoteServiceException("该配件销售单已提交,不能重复提交");
+        }
+		// 先保存一下页面信息,再提交状态
+
+        // 更新状态为1-已提交
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.SUBMIT.getKey());
+        partsSalesOrderBean.setSubmitBy(adminUser.getNickName());
+        partsSalesOrderBean.setSubmitTime(DateUtil.date());
+
+        websitPartsSalesService.saveOrUpdate(partsSalesOrderBean);
+        return loadSalesOrderById(id);
+    }
+
+    @Transactional
+    public PayDetail generateCode(String salesId, String payConfigId) {
+        WebsitPartsSales sales = websitPartsSalesService.getById(salesId);
+        if (Objects.isNull(sales)) {
+            throw new RemoteServiceException("销售单号不存在");
+        }
+
+        final AdminWebsitPayConfig payConfig = adminWebsitPayConfigService.getById(payConfigId);
+        if (Objects.isNull(payConfig) || !payConfig.getStatus()) {
+            throw new RemoteServiceException("支付配置信息异常");
+        }
+
+        // 通联扫码支付
+        WebsitSalesPayOrder payOrder = new WebsitSalesPayOrder();
+        payOrder.setId(IdWorker.getIdStr())
+                .setCompanyWechatId(sales.getCompanyWechatId())
+                .setCompanyWechatName(sales.getCompanyWechatName())
+                .setGoodsType(WebsitGoodsTypeEnum.P.getKey())
+                .setWebsitId(sales.getWebsitId())
+                .setWebsitName(sales.getWebsitName())
+                .setOrderId(sales.getId())
+                .setOutTradeNo(payOrder.getId())
+                .setPayType(PayTypeEnum.ALLINPAY.getKey())
+                .setOrderCreateTime(sales.getCreateTime())
+                .setPayValue(sales.getTotalAmount())
+                .setOrgId(payConfig.getOrgId())
+                .setMchNo(payConfig.getMchNo())
+                .setAppid(payConfig.getAppid())
+                .setOrderType(PayOrderTypeEnum.S.getKey())
+                .setRunTime(DateUtil.offsetSecond(DateUtil.date(), 15))
+                .setOrderSource(OrderSourceEnum.P_SALES.getKey())
+                .setIsDeliver(false);
+
+
+        // 请求通联得到结果
+        Map<String, String> resMap = allInPayLogic.serviceUnifiedOrder(payOrder, SybConstants.PAY_TYPE_W01);
+
+        if (!resMap.get("trxstatus").equals("0000")) {
+            throw new RemoteServiceException("通联统一支付接口执行失败:" + resMap.get("errmsg"));
+        }
+
+        payOrder.setOrderNo(resMap.get("trxid"))
+                .insert();
+
+        PayDetail payDetail = new PayDetail();
+        payDetail.setCodeUrl(resMap.get("payinfo"));
+        payDetail.setId(payOrder.getId());
+        log.info("通联支付payDetail:{}", JSONObject.toJSONString(payDetail));
+        return payDetail;
+    }
+
+    @Transactional
+    public WebsitPartsSalesBean changeCash(String id) {
+        WebsitPartsSalesBean partsSalesOrderBean = this.loadSalesOrderById(id);
+        AdminWebsit shop = adminWebsitService.getById(partsSalesOrderBean.getWebsitId());
+        if (!shop.getPartsIsCash()) {
+            throw new RemoteServiceException("当前配件网点不支付现金方式");
+        }
+        if (partsSalesOrderBean.getIsApply().equals(IsEnum.Y.getValue())) {
+            throw new RemoteServiceException("申请单不能现金支付");
+        }
+
+        // 现金订单改为已支付未提货状态
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.PAYED.getKey());
+        partsSalesOrderBean.setPayFlag(PartsPayFlagEnum.PAY_NOT_TAKE.getKey());
+        partsSalesOrderBean.setPayType(PayTypeEnum.CASH.getKey());
+
+        this.handleForwardShopAndWorkerStock(partsSalesOrderBean);
+
+
+        websitPartsSalesService.saveOrUpdate(partsSalesOrderBean);
+        return partsSalesOrderBean;
+    }
+
+    private void handleForwardShopAndWorkerStock(WebsitPartsSalesBean partsSalesOrderBean) {
+        // 扣减网点库存
+//        List<ShopStockDTO> shopStockDTOList = this.getShopStock(partsSalesOrderBean, -1);
+//        partsStockLogic.handleShopStock(shopStockDTOList);
+//
+//        if (PartsDeliveryTypeEnum.EXPRESS.getCode().intValue() == partsSalesOrderBean.getDeliveryType()
+//                && PartsSalesOrderTypeEnum.WORKER.getCode().intValue() == partsSalesOrderBean.getOrderType()) {
+//            // 如果是快递并且销售类型为“服务人员”的单,需要增加师傅在途库存
+//            // 增加师傅在途库存
+//            List<WorkerStockDTO> workerStockDTOList = this.getWorkerStock(partsSalesOrderBean,
+//                    PartsRefTypeEnum.SALES.toString(), null, PartsStockPartsAttrEnum.WAY.toString());
+//
+//            partsStockLogic.handleWorkerStock(workerStockDTOList);
+//        }
+    }
+
+    @Transactional
+    public void confirmDelivery(String id, String logisticsNo) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPartsSalesBean partsSalesOrderBean = this.loadSalesOrderById(id);
+        if(Objects.isNull(partsSalesOrderBean)) {
+            throw new RemoteServiceException("配件单提交失败,单号=" + id) ;
+        }
+
+        if(!PartsOrderStatusEnum.PAYED.getKey().equals(partsSalesOrderBean.getStatus())) {
+            throw new RemoteServiceException("非已支付状态,不能提货");
+        }
+
+        DateTime curDate = DateUtil.date();
+        partsSalesOrderBean.setLogisticsNo(logisticsNo);
+        partsSalesOrderBean.setWebsitConfirmBy(adminUser.getNickName());
+        partsSalesOrderBean.setWebsitConfirmDate(curDate);
+
+        if (this.checkOrderAttr(partsSalesOrderBean)) {
+            partsSalesOrderBean.setStatus(PartsOrderStatusEnum.END.getKey());
+            partsSalesOrderBean.setEndTime(curDate);
+            partsSalesOrderBean.setExamineBy(adminUser.getNickName());
+            partsSalesOrderBean.setExamineTime(curDate);
+            partsSalesOrderBean.setPushFlag(PartsPushFlagEnum.SALES.getKey());
+            partsSalesOrderBean.setPayFlag(PartsPayFlagEnum.PAY_TAKE.getKey());
+
+            if (BuyPeopleEnum.WORKER.getKey().equals(partsSalesOrderBean.getBuyPeople())) {
+                // 增加师傅库存
+//                List<WorkerStockDTO> workerStockDTOList = this.getWorkerStock(partsSalesOrderBean, PartsRefTypeEnum.SALES.toString(),
+//                        Objects.nonNull(partsSalesOrderBean.getWorkerConfirmDate()) ? PartsStockPartsAttrEnum.WAY.toString() : null,
+//                        PartsStockPartsAttrEnum.NEW.toString());
+
+//                partsStockLogic.handleWorkerStock(workerStockDTOList);
+            }
+            // 更新销售单明细信息
+            this.updateSalesItem(partsSalesOrderBean);
+        }
+
+        websitPartsSalesService.updateById(partsSalesOrderBean);
+    }
+
+    private boolean checkOrderAttr(WebsitPartsSalesBean partsSalesOrderBean) {
+        return !DeliveryTypeEnum.EXPRESS.getValue().equals(partsSalesOrderBean.getDeliveryType())
+                || !BuyPeopleEnum.WORKER.getKey().equals(partsSalesOrderBean.getBuyPeople())
+                || Objects.nonNull(partsSalesOrderBean.getWorkerConfirmDate());
+    }
+
+    /**
+     * 更新销售明细的信息
+     * @param partsSalesOrderBean
+     */
+    private void updateSalesItem(WebsitPartsSalesBean partsSalesOrderBean) {
+        if(CollectionUtil.isNotEmpty(partsSalesOrderBean.getItemList())) {
+            List<WebsitPartsSalesItem> itemList = new ArrayList<>();
+            for(WebsitPartsSalesItemBean itemBean : partsSalesOrderBean.getItemList()) {
+                itemBean.setPushFlag(partsSalesOrderBean.getPushFlag());
+                itemBean.setExamineTime(partsSalesOrderBean.getExamineTime());
+                if (partsSalesOrderBean.getPayType().equals(PayTypeEnum.CASH.getKey())) {
+                    itemBean.setRefundAmountMode(PayTypeEnum.CASH.getKey());
+                } else {
+                    itemBean.setRefundAmountMode(PayTypeEnum.WECHAT.getKey());
+                }
+                itemList.add(itemBean);
+            }
+            websitPartsSalesItemService.saveOrUpdateBatch(itemList);
+        }
+    }
+
+    /**
+     * 删除配件销售单(软删除)
+     * @param id
+     */
+    @Transactional
+    public void deleteById(String id) {
+        WebsitPartsSales partsSalesOrder = websitPartsSalesService.getById(id);
+        List<String> stateList = Arrays.asList(PartsOrderStatusEnum.SUBMIT.getKey(), PartsOrderStatusEnum.PAYED.getKey(),
+                PartsOrderStatusEnum.END.getKey(), PartsOrderStatusEnum.EXCEPTION.getKey());
+        if(Objects.isNull(partsSalesOrder)) {
+            throw new RemoteServiceException("找不到该配件销售单, 请刷新一下列表");
+        }
+        //不是该网点不能删除
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        if (adminUser.getType() != 0) {
+            throw new RemoteServiceException("不是网点用户,没有删除权限");
+        }
+        if(!adminUser.getAdminWebsitIds().contains(partsSalesOrder.getWebsitId())) {
+            throw new RemoteServiceException("不是该网点用户,没有删除权限");
+        }
+        if(stateList.contains(partsSalesOrder.getStatus())) {
+            throw new RemoteServiceException("该订单非保存或已取消状态,不能删除: 订单号: "+partsSalesOrder.getId());
+        }
+        websitPartsSalesService.removeById(partsSalesOrder);
+    }
+
+    /**
+     * 退回0-保存状态
+     * @param id
+     * @throws InterruptedException
+     */
+    @Transactional
+    public Object backToSave(String id) {
+        WebsitPartsSalesBean partsSalesOrderBean = loadSalesOrderById(id);
+        if (Objects.isNull(partsSalesOrderBean)) {
+            throw new RemoteServiceException("配件销售单状态退回失败,没有该销售单号: " + id) ;
+        }
+        // 不是该网点不能退回
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        if (adminUser.getType() == 2) {
+            throw new RemoteServiceException("平台账号禁止操作");
+        }
+        if (!adminUser.getAdminWebsitIds().contains(partsSalesOrderBean.getWebsitId())) {
+            throw new RemoteServiceException("不是该网点用户,没有操作权限");
+        }
+        // 检查是否提交或之前的状态,若是提交后的状态不能再退回
+        if (!partsSalesOrderBean.getStatus().equals(PartsOrderStatusEnum.SUBMIT.getKey())) {
+            throw new RemoteServiceException("该配件销售单已支付,不能退回修改");
+        }
+
+        if (partsSalesOrderBean.getPayType().equals(PayTypeEnum.ALLINPAY.getKey())) {
+            WebsitSalesPayOrder salesPayList = getPayList(partsSalesOrderBean);
+            if (Objects.nonNull(salesPayList)) {
+                throw new RemoteServiceException("已有支付记录,不能退回修改");
+            }
+        }
+
+        //更新状态为0-保存状态
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.SAVE.getKey());
+        if (partsSalesOrderBean.getPayType().equals(PayTypeEnum.CASH.getKey())) {
+            // 现金订单提交直接改为未支付状态
+            partsSalesOrderBean.setPayFlag(PartsPayFlagEnum.NOT.getKey());
+        }
+
+        //清空提交状态
+        partsSalesOrderBean.setSubmitTime(null);
+        partsSalesOrderBean.setSubmitBy(null);
+        websitPartsSalesService.updateById(partsSalesOrderBean);
+        log.info("backToSave: partsSalesOrderBean status: {}", partsSalesOrderBean.getStatus());
+        return partsSalesOrderBean;
+    }
+
+    /**
+     * 获取支付记录
+     * @param partsSalesOrderBean
+     * @return
+     */
+    @Transactional
+    public WebsitSalesPayOrder getPayList(WebsitPartsSalesBean partsSalesOrderBean) {
+        WebsitSalesPayOrder salesPayList;
+        List<WebsitSalesPayOrder> payList = websitSalesPayOrderService.lambdaQuery()
+                .eq(WebsitSalesPayOrder::getCompanyWechatId, partsSalesOrderBean.getCompanyWechatId())
+                .eq(WebsitSalesPayOrder::getWebsitId, partsSalesOrderBean.getWebsitId())
+                .eq(WebsitSalesPayOrder::getOrderId, partsSalesOrderBean.getId())
+                .in(WebsitSalesPayOrder::getOrderType, PayOrderTypeEnum.S.getKey())
+                .orderByAsc(WebsitSalesPayOrder::getCreateTime)
+                .list();
+        for (WebsitSalesPayOrder payRecord : payList) {
+            if (payRecord.getPayFlag().equals(IsYesNoEnum.YES.getKey())) {
+                salesPayList = payRecord;
+                return salesPayList;
+            } else if (payRecord.getPayFlag().equals(IsYesNoEnum.NO.getKey())) {
+                allInPayLogic.serviceCloseOrder(payRecord);
+            }
+        }
+        return null;
+    }
+
+    public void cancel(String id) {
+        WebsitPartsSalesBean partsSalesOrderBean = loadSalesOrderById(id);
+        if(Objects.isNull(partsSalesOrderBean)) {
+            throw new RemoteServiceException("配件单状态取消失败,没有该配件单号: " + id) ;
+        }
+        if(Objects.isNull(partsSalesOrderBean.getStatus())) {
+            throw new RemoteServiceException("配件单状态取消失败,该订单状态为空, 单号: " + id) ;
+        }
+        if(PartsOrderStatusEnum.END.getKey().equals(partsSalesOrderBean.getStatus())) {
+            throw new RemoteServiceException("配件单状态取消失败,该订单已完成,不能取消: " + id) ;
+        }
+
+        if (Objects.nonNull(partsSalesOrderBean.getWebsitConfirmDate())
+                || Objects.nonNull(partsSalesOrderBean.getWorkerConfirmDate())) {
+            // 网点或师傅确认时间不为空,则说明已提货,不能取消
+            throw new RemoteServiceException("该订单已提货,不能取消: " + id);
+        }
+
+        WebsitSalesPayOrder salesPayList = getPayList(partsSalesOrderBean);
+
+        if (Objects.nonNull(salesPayList)) {
+            // 有支付记录,共用退款方法
+            this.commonRefundAmountMethod(partsSalesOrderBean);
+        }
+        if (partsSalesOrderBean.getIsApply().equals(IsEnum.N.getValue())) {
+            if ((PartsOrderStatusEnum.SUBMIT.getKey().equals(partsSalesOrderBean.getStatus()) && Objects.nonNull(salesPayList))
+                    || PartsOrderStatusEnum.PAYED.getKey().equals(partsSalesOrderBean.getStatus())) {
+                // 已提交有支付记录 或 已支付订单状态,处理库存
+                this.handleReverseShopAndWorkerStock(partsSalesOrderBean);
+            }
+        }
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.CANCEL.getKey());
+        websitPartsSalesService.saveOrUpdate(partsSalesOrderBean);
+    }
+
+    private void handleReverseShopAndWorkerStock(WebsitPartsSalesBean partsSalesOrderBean) {
+        //网点库存要加回去
+//        List<ShopStockDTO> shopStockDTOList = this.getShopStock(partsSalesOrderBean, 1);
+//
+//        partsStockLogic.handleShopStock(shopStockDTOList);
+//
+//        if (PartsDeliveryTypeEnum.EXPRESS.getCode().intValue() == partsSalesOrderBean.getDeliveryType()
+//                && PartsSalesOrderTypeEnum.WORKER.getCode().intValue() == partsSalesOrderBean.getOrderType()) {
+//            // 如果是快递并且销售类型为“服务人员”的单,需要减师傅在途库存
+//            // 减师傅在途库存
+//            List<WorkerStockDTO> workerStockDTOList = this.getWorkerStock(partsSalesOrderBean, PartsRefTypeEnum.SALES.toString(),
+//                    PartsStockPartsAttrEnum.WAY.toString(), null);
+//            partsStockLogic.handleWorkerStock(workerStockDTOList);
+//        }
+    }
+
+    private void commonRefundAmountMethod(WebsitPartsSalesBean partsSalesOrderBean) {
+        //有支付记录,需要增加退款记录
+        WebsitPartsRefundRecord partsRefundRecord = new WebsitPartsRefundRecord();
+        partsRefundRecord.setRefundNo(IdWorker.getIdStr())
+                .setRecordId(partsSalesOrderBean.getId())
+                .setCompanyWechatId(partsSalesOrderBean.getCompanyWechatId())
+                .setCompanyWechatName(partsSalesOrderBean.getCompanyWechatName())
+                .setWebsiteId(partsSalesOrderBean.getWebsitId())
+                .setWebsitName(partsSalesOrderBean.getWebsitName())
+                .setPartsWebsiteId(partsSalesOrderBean.getPartsWebsitId())
+                .setIdentity(partsSalesOrderBean.getIdentity())
+                .setWorkerId(partsSalesOrderBean.getWorkerId())
+                .setWorkerName(partsSalesOrderBean.getWorkerName())
+                .setSalesId(partsSalesOrderBean.getId())
+                .setRef(partsSalesOrderBean.getId())
+                .setRefType(PartsRefTypeEnum.SALES.toString())
+                .setRefundAmount(partsSalesOrderBean.getTotalAmount())
+                .setRefundState("WAIT")
+                .setIsExec(IsEnum.N.getValue())
+                .insert();
+    }
+
+    @Transactional
+    public void transNotApply(String id) {
+        WebsitPartsSalesBean partsSalesOrderBean = loadSalesOrderById(id);
+        if(Objects.isNull(partsSalesOrderBean)) {
+            throw new RemoteServiceException("销售申请单转销售单失败,没有该单号: " + id) ;
+        }
+
+        this.handleForwardShopAndWorkerStock(partsSalesOrderBean);
+
+        websitPartsSalesService.lambdaUpdate()
+                .set(WebsitPartsSales::getIsApply, IsEnum.N.getValue())
+                .set(WebsitPartsSales::getTransNotApplyDate, DateUtil.date())
+                .eq(WebsitPartsSales::getId, partsSalesOrderBean.getId())
+                .update();
+    }
 }