Ver Fonte

no message

FengChaoYu há 7 meses atrás
pai
commit
e9098e7738

+ 10 - 0
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/logic/common/AllInPayLogic.java

@@ -6,14 +6,17 @@ import com.alibaba.fastjson.TypeReference;
 import com.gree.mall.miniapp.constant.SybConstants;
 import com.gree.mall.miniapp.enums.IsYesNoEnum;
 import com.gree.mall.miniapp.enums.PayOrderTypeEnum;
+import com.gree.mall.miniapp.enums.PayTypeEnum;
 import com.gree.mall.miniapp.enums.material.PartsOrderStatusEnum;
 import com.gree.mall.miniapp.enums.material.PartsPayFlagEnum;
 import com.gree.mall.miniapp.exception.RemoteServiceException;
 import com.gree.mall.miniapp.logic.material.parts.WebsitPartsSalesOrderLogic;
 import com.gree.mall.miniapp.plus.entity.WebsitPartsSales;
+import com.gree.mall.miniapp.plus.entity.WebsitPartsWorkerCreditRecord;
 import com.gree.mall.miniapp.plus.entity.WebsitSales;
 import com.gree.mall.miniapp.plus.entity.WebsitSalesPayOrder;
 import com.gree.mall.miniapp.plus.service.WebsitPartsSalesService;
+import com.gree.mall.miniapp.plus.service.WebsitPartsWorkerCreditRecordService;
 import com.gree.mall.miniapp.plus.service.WebsitSalesService;
 import com.gree.mall.miniapp.utils.ArithUtils;
 import com.gree.mall.miniapp.utils.DateUtils;
@@ -47,6 +50,8 @@ public class AllInPayLogic {
     WebsitPartsSalesService websitPartsSalesService;
     @Resource
     WebsitPartsSalesOrderLogic websitPartsSalesOrderLogic;
+    @Resource
+    WebsitPartsWorkerCreditRecordService websitPartsWorkerCreditRecordService;
 
     /**
      * 通联支付
@@ -230,6 +235,11 @@ public class AllInPayLogic {
                     } catch (Exception e) {
                         log.info("配件销售单库存处理异常:" + e.getMessage());
                     }
+                } else if (order.getOrderId().contains("PC") && order.getOrderType().equals(PayOrderTypeEnum.S.getKey())) {
+                    WebsitPartsWorkerCreditRecord record = websitPartsWorkerCreditRecordService.getById(order.getOrderId());
+                    record.setCreditStatus(true)
+                            .setRecAmountMode(PayTypeEnum.ALLINPAY.getKey())
+                            .updateById();
                 }
 
                 order.setPayFlag(IsYesNoEnum.YES.getKey())

+ 2 - 2
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/logic/user/PayLogic.java

@@ -927,8 +927,8 @@ public class PayLogic {
 
 
     public void allinpayCallback(HttpServletRequest request) throws UnsupportedEncodingException {
-        TreeMap<String,String> params = getParams(request);//动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容
-        log.info("通联回调: {}", JSONUtil.toJsonStr(params));
+        TreeMap<String, String> params = getParams(request);//动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容
+        log.info("通联回调: {} {}", params.get("trxid"), JSONUtil.toJsonStr(params));
     }
 
     /**

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

@@ -0,0 +1,87 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsSalesItem;
+import com.gree.mall.manager.plus.entity.WebsitSalesPayOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@ApiModel
+@Data
+public class WebsitPartsCreditBean {
+
+    @ApiModelProperty(value = "网点编号")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ApiModelProperty(value = "购买方 WORKER=师傅 CUSTOMER=外部客户")
+    private String buyPeople;
+
+    @ApiModelProperty(value = "师傅身份证")
+    private String identity;
+
+    @ApiModelProperty(value = "师傅编号")
+    private String workerId;
+
+    @ApiModelProperty(value = "师傅名称")
+    private String workerName;
+
+    @ApiModelProperty(value = "申请类别")
+    private String applyCategory;
+
+    @ApiModelProperty(value = "申请类型 0-普通申请 1-急件申请 2-备件申请")
+    private Integer applyType;
+
+    @ApiModelProperty(value = "发货方式 0-快递 1-自提")
+    private Integer deliveryType;
+
+    @ApiModelProperty(value = "联系电话")
+    private String mobile;
+
+    @ApiModelProperty(value = "接收单位")
+    private String receiveUnit;
+
+    @ApiModelProperty(value = "发货单位")
+    private String deliveryUnit;
+
+    @ApiModelProperty(value = "收件地址")
+    private String receiveAddr;
+
+    @ApiModelProperty(value = "收件地址-详细地址")
+    private String addr;
+
+    @ApiModelProperty(value = "单据来源 ONLINE=在线订单 SELF=自建订单")
+    private String orderSource;
+
+    @ApiModelProperty(value = "订单金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "支付方式 CASH=现金  ALLINPAY=通联 CREDIT=记账")
+    private String payType;
+
+    @ApiModelProperty(value = "下单时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "应收金额")
+    private BigDecimal itemTotalAmount;
+
+    @ApiModelProperty(value = "收款状态 true=已收款  false=未收款")
+    private Boolean creditStatus;
+
+    @ApiModelProperty(value = "收款人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "收款时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "明细")
+    private WebsitPartsSalesItem item;
+
+    @ApiModelProperty(value = "明细")
+    private WebsitSalesPayOrder payOrder;
+}

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

@@ -14,6 +14,10 @@ import java.util.Date;
 @ZfireField(tbName = "a")
 public class WebsitPartsCreditItemVO {
 
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "id")
+    private String id;
+
     @ApiModelProperty(value = "销售单号")
     private String salesId;
 

+ 58 - 4
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsCreditController.java

@@ -3,23 +3,29 @@ 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.WebsitPartsCreditBean;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsCreditItemVO;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsCreditVO;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsSalesBean;
+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.manage.WebsitPartsCreditLogic;
 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.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+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
@@ -29,6 +35,8 @@ public class WebsitPartsCreditController {
 
     @Resource
     WebsitPartsCreditLogic websitPartsCreditLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
 
     @ZfireList
     @PostMapping("/gather/list")
@@ -75,4 +83,50 @@ public class WebsitPartsCreditController {
         //3.导出
         FieldUtils.exportData(baseVOIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
     }
+
+    @PostMapping("/detail")
+    @ApiOperation("网点记账-详情")
+    public ResponseHelper<WebsitPartsCreditBean> detail(
+            @ApiParam(value = "id", required = true) @RequestParam String id
+    ) throws Exception {
+        WebsitPartsCreditBean bean = websitPartsCreditLogic.detail(id);
+        return ResponseHelper.success(bean);
+    }
+
+    @PostMapping("/update")
+    @ApiOperation("网点记账-更新备注")
+    public ResponseHelper update(
+            @ApiParam(value = "id", required = true) @RequestParam String id,
+            @ApiParam(value = "备注") @RequestParam(required = false) String remark
+    ) throws Exception {
+        websitPartsCreditLogic.update(id, remark);
+        return ResponseHelper.success();
+    }
+
+    @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(websitPartsCreditLogic.generateCode(id, payConfigId));
+    }
+
+    @ApiOperation("现金支付")
+    @PostMapping("/change-cash")
+    public ResponseHelper<WebsitPartsSalesBean> changeCash(@ApiParam(value = "记账id", 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 {
+            websitPartsCreditLogic.changeCash(id);
+            return ResponseHelper.success();
+        } catch (Exception e) {
+            log.error("【记账记录处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+    }
 }

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

@@ -180,6 +180,23 @@ public class WebsitPartsSalesOrderController {
         }
     }
 
+    @ApiOperation("记账")
+    @PostMapping("/change-credit")
+    public ResponseHelper<WebsitPartsSalesBean> changeCredit(@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.changeCredit(id));
+        } catch (Exception e) {
+            log.error("【提交订单处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+    }
+
     @ApiOperation("网点提货")
     @PostMapping("/confirm/delivery")
     public ResponseHelper confirmDelivery(

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

@@ -15,6 +15,7 @@ public enum SalesPayOrderSourceEnum implements BaseEnum {
     SALES_RET("SALES_RET","辅材销售退货"),
     NEW_PARTS_RET("NEW_PARTS_RET","配件返还"),
     OLD_PARTS_RET("OLD_PARTS_RET","旧配件返还"),
+    PARTS_CREDIT("PARTS_CREDIT","配件记账"),
     ;
 
     @EnumValue

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

@@ -1,18 +1,36 @@
 package com.gree.mall.manager.logic.material.manage;
 
+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.WebsitPartsCreditBean;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsCreditItemVO;
 import com.gree.mall.manager.bean.material.manage.WebsitPartsCreditVO;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.constant.SybConstants;
+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.*;
 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 java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+
 @Slf4j
 @Service
 @RequiredArgsConstructor
@@ -20,6 +38,13 @@ public class WebsitPartsCreditLogic {
 
     private final CommonLogic commonLogic;
     private final MaterialMapper materialMapper;
+    private final WebsitPartsWorkerCreditRecordService websitPartsWorkerCreditRecordService;
+    private final WebsitPartsSalesService websitPartsSalesService;
+    private final WebsitPartsSalesItemService websitPartsSalesItemService;
+    private final WebsitSalesPayOrderService websitSalesPayOrderService;
+    private final AdminWebsitPayConfigService adminWebsitPayConfigService;
+    private final AllInPayLogic allInPayLogic;
+    private final AdminWebsitService adminWebsitService;
 
     public IPage<WebsitPartsCreditVO> gatherPage(ZfireParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -36,4 +61,132 @@ public class WebsitPartsCreditLogic {
     }
 
 
+    public WebsitPartsCreditBean detail(String id) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        final WebsitPartsWorkerCreditRecord record = websitPartsWorkerCreditRecordService.getById(id);
+        if (Objects.isNull(id)) {
+            throw new RemoteServiceException("单号不存在");
+        }
+        final WebsitPartsSales sales = websitPartsSalesService.lambdaQuery()
+                .eq(WebsitPartsSales::getCompanyWechatId, adminUser.getCompanyWechatId())
+                .eq(WebsitPartsSales::getId, record.getSalesId())
+                .one();
+        if (Objects.isNull(sales)) {
+            throw new RemoteServiceException("单号不存在");
+        }
+        final WebsitPartsSalesItem item = websitPartsSalesItemService.getById(record.getSalesItemId());
+        final WebsitSalesPayOrder payOrder = websitSalesPayOrderService.lambdaQuery()
+                .eq(WebsitSalesPayOrder::getOrderId, record.getId())
+                .eq(WebsitSalesPayOrder::getPayFlag, true)
+                .last("limit 1")
+                .one();
+        WebsitPartsCreditBean bean = new WebsitPartsCreditBean();
+        BeanUtils.copyProperties(sales, bean);
+        bean.setCreditStatus(record.getCreditStatus());
+        bean.setItemTotalAmount(record.getTotalAmount());
+        bean.setItem(item);
+        bean.setPayOrder(payOrder);
+        if (!bean.getCreditStatus()) {
+            bean.setUpdateBy(null);
+            bean.setUpdateTime(null);
+        }
+
+        return bean;
+    }
+
+    public PayDetail generateCode(String id, String payConfigId) {
+        WebsitPartsWorkerCreditRecord record = websitPartsWorkerCreditRecordService.getById(id);
+        if (Objects.isNull(record)) {
+            throw new RemoteServiceException("记账记录不存在");
+        }
+        if (record.getCreditStatus()) {
+            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(record.getCompanyWechatId())
+                .setCompanyWechatName(record.getCompanyWechatName())
+                .setGoodsType(WebsitGoodsTypeEnum.P.getKey())
+                .setWebsitId(record.getWebsitId())
+                .setWebsitName(record.getWebsitName())
+                .setOrderId(record.getId())
+                .setOutTradeNo(payOrder.getId())
+                .setPayType(PayTypeEnum.ALLINPAY.getKey())
+                .setOrderCreateTime(record.getCreateTime())
+                .setPayValue(record.getTotalAmount())
+                .setOrgId(payConfig.getOrgId())
+                .setMchNo(payConfig.getMchNo())
+                .setAppid(payConfig.getAppid())
+                .setOrderType(PayOrderTypeEnum.S.getKey())
+                .setRunTime(DateUtil.offsetSecond(DateUtil.date(), 15))
+                .setOrderSource(SalesPayOrderSourceEnum.P_SALES.getKey())
+                .setIsDeliver(false);
+
+        //生成失效时间
+        Date createDate = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(createDate);
+        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) + 360);
+        payOrder.setTimeExpire(calendar.getTime());
+        // 请求通联得到结果
+        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());
+        payDetail.setPayAmount(record.getTotalAmount());
+        payDetail.setTimeExpire(payOrder.getTimeExpire());
+        log.info("通联支付payDetail:{}", JSONObject.toJSONString(payDetail));
+        return payDetail;
+    }
+
+    public void changeCash(String id) {
+        WebsitPartsWorkerCreditRecord record = websitPartsWorkerCreditRecordService.getById(id);
+        AdminWebsit websit = adminWebsitService.getById(record.getWebsitId());
+        if (!websit.getPartsIsCash()) {
+            throw new RemoteServiceException("当前配件网点不支付现金方式");
+        }
+        if (record.getCreditStatus()) {
+            throw new RemoteServiceException("已收款记录");
+        }
+        record.setCreditStatus(PartsCreditEnum.END.getValue())
+                .setRecAmountMode(PayTypeEnum.CASH.getKey())
+                .updateById();
+
+        new WebsitSalesPayOrder()
+                .setCompanyWechatId(record.getCompanyWechatId())
+                .setCompanyWechatName(record.getCompanyWechatName())
+                .setGoodsType(WebsitGoodsTypeEnum.P.getKey())
+                .setWebsitId(record.getWebsitId())
+                .setWebsitName(record.getWebsitName())
+                .setOrderId(record.getId())
+                .setPayType(PayTypeEnum.CASH.getKey())
+                .setPayFlag(IsYesNoEnum.YES.getKey())
+                .setOrderCreateTime(record.getCreateTime())
+                .setPayValue(record.getTotalAmount())
+                .setPayTime(DateUtil.date())
+                .setOrderType(PayOrderTypeEnum.S.getKey())
+                .setOrderSource(SalesPayOrderSourceEnum.PARTS_CREDIT.getKey())
+                .insert();
+    }
+
+    public void update(String id, String remark) {
+        websitPartsWorkerCreditRecordService.lambdaUpdate()
+                .set(WebsitPartsWorkerCreditRecord::getRemark, remark)
+                .eq(WebsitPartsWorkerCreditRecord::getId, id)
+                .update();
+    }
 }

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

@@ -590,6 +590,27 @@ public class WebsitPartsSalesOrderLogic {
         return partsSalesOrderBean;
     }
 
+    @Transactional
+    public Object changeCredit(String id) throws Exception {
+        WebsitPartsSalesBean partsSalesOrderBean = this.loadSalesOrderById(id);
+        AdminWebsit websit = adminWebsitService.getById(partsSalesOrderBean.getWebsitId());
+        if (!websit.getPartsIsCash()) {
+            throw new RemoteServiceException("当前配件网点不支付记账方式");
+        }
+
+        // 现金订单改为已支付未提货状态
+        partsSalesOrderBean.setStatus(PartsOrderStatusEnum.PAYED.getKey());
+        partsSalesOrderBean.setPayFlag(PartsPayFlagEnum.PAY_NOT_TAKE.getKey());
+        partsSalesOrderBean.setPayType(PayTypeEnum.CREDIT.getKey());
+
+        this.handleForwardWebsitAndWorkerStock(partsSalesOrderBean);
+
+
+        websitPartsSalesService.saveOrUpdate(partsSalesOrderBean);
+
+        return partsSalesOrderBean;
+    }
+
     private void handleForwardWebsitAndWorkerStock(WebsitPartsSalesBean partsSalesOrderBean) throws Exception {
         // 扣减网点库存
         List<WebsitStockDTO> shopStockDTOList = this.getWebsitStock(partsSalesOrderBean, DirectFlagEnum.SUB, PartsRefTypeEnum.SALES.getRemark());
@@ -680,6 +701,8 @@ public class WebsitPartsSalesOrderLogic {
                 itemBean.setExamineTime(partsSalesOrderBean.getExamineTime());
                 if (partsSalesOrderBean.getPayType().equals(PayTypeEnum.CASH.getKey())) {
                     itemBean.setRefundAmountMode(PayTypeEnum.CASH.getKey());
+                } else if (partsSalesOrderBean.getPayType().equals(PayTypeEnum.CREDIT.getKey())) {
+                    itemBean.setRefundAmountMode(PayTypeEnum.CREDIT.getKey());
                 } else {
                     itemBean.setRefundAmountMode(PayTypeEnum.WECHAT.getKey());
                 }