zq-erp/src/main/java/com/matrix/core/pojo/VerificationResult.java
@@ -8,12 +8,16 @@ @Data public class VerificationResult { /** * 审核结果 */ private boolean judgeResult; private String msg; private Object info; private VerificationResult(){ } zq-erp/src/main/java/com/matrix/core/tools/ParamCheckUtil.java
@@ -1,8 +1,5 @@ package com.matrix.core.tools; import com.matrix.system.hive.dto.OrderItemDto; import java.util.ArrayList; import java.util.List; import java.util.function.Function; zq-erp/src/main/java/com/matrix/system/enums/BooleanEnum.java
New file @@ -0,0 +1,63 @@ package com.matrix.system.enums; import com.google.common.collect.Lists; import com.matrix.core.enums.EnumApiShowAble; import com.matrix.core.enums.EnumsShowVo; import com.matrix.core.exception.GlobleException; import java.util.List; import java.util.stream.Collectors; /** * 是否枚举 * @author jyy */ public enum BooleanEnum implements EnumApiShowAble { TRUE(1, "是"), FALSE(2, "否"), DEFAULT(3, ""), ; private Integer value; private String displayName; BooleanEnum(Integer value, String displayName) { this.value = value; this.displayName = displayName; } public static String getByValue(Integer value) { for (int i = 0; i < values().length; i++) { if (value.equals(values()[i].getValue())) { return values()[i].displayName; } } throw new GlobleException("无效枚举值"); } @Override public String getEnumCode() { return "booleanEnum"; } @Override public List<EnumsShowVo> getEnumsShowVos() { return Lists.newArrayList(values()).stream().map(item -> EnumsShowVo.builder() .displayName(item.getDisplayName()) .value(item.value) .build() ).collect(Collectors.toList()); } public Integer getValue() { return value; } public String getDisplayName() { return displayName; } } zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java
@@ -190,7 +190,6 @@ } } shoppingGoods.setIsDel(ShoppingGoods.NORMAL); shoppingGoods.setStaus(Dictionary.BUSINESS_STATE_UP); List<ShoppingGoods> dataList = shoppingGoodsService.findInPage(shoppingGoods, pageVo); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, dataList, shoppingGoodsService.findTotal(shoppingGoods)); return result; zq-erp/src/main/java/com/matrix/system/hive/dto/GoodsSealLimitDto.java
@@ -20,6 +20,6 @@ /** * 销售明细 */ private List<OrderItemDto> orderItemDtoList; private List<SysOrderItemDto> sysOrderItemDtoList; } zq-erp/src/main/java/com/matrix/system/hive/dto/MoneyCardChangeDto.java
New file @@ -0,0 +1,65 @@ /** * projectName: zq-erp * fileName: MoneyCardChangeDto.java * packageName: com.matrix.system.hive.dto * date: 2022-03-11 10:24 * copyright(c) 2022 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.hive.dto; import lombok.Data; import java.util.List; /** * @version: V1.0 * @author: JiangYouYao * @className: MoneyCardChangeDto * @packageName: com.matrix.system.hive.dto * @description: 储值卡余额变更DTO * @data: 2022-03-11 10:24 **/ @Data public class MoneyCardChangeDto { /** * 储值卡id */ private Long carUseId; /** * 订单id */ private Long orderId; /** * 订单编号 */ private String orderNo; /** * 操作类型 */ private String type; /** * 赠送金额扣减 */ private Double giftMoney; /** * 本金扣减 */ private Double realMoney; /** * 扣减次数 */ private Double count; /** * 操作人 */ private Long updateUser; /** * 支付的商品id */ private List<Long> goodsIds; } zq-erp/src/main/java/com/matrix/system/hive/dto/SysOrderItemDto.java
File was renamed from zq-erp/src/main/java/com/matrix/system/hive/dto/OrderItemDto.java @@ -1,16 +1,15 @@ package com.matrix.system.hive.dto; import lombok.Builder; import lombok.Data; import lombok.ToString; /** * 订单明细DTO * @author jyy */ @Data @ToString @Builder public class OrderItemDto { @Data public class SysOrderItemDto { /** * 商城 商品id */ zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
@@ -1,17 +1,27 @@ package com.matrix.system.hive.service; import java.util.List; import com.matrix.core.pojo.PaginationVO; import com.matrix.system.hive.bean.MoneyCardUse; import com.matrix.system.hive.dto.MoneyCardChangeDto; import com.matrix.system.hive.plugin.util.BaseServices; import java.util.List; /** * @date 2016-09-17 10:17 */ public interface MoneyCardUseService extends BaseServices<MoneyCardUse> { /** * 修改储值卡余额 */ void changeMoneyCard(List<MoneyCardChangeDto> moneyCardChangeDtoList); /** * 新增MoneyCardUse */ zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
@@ -22,6 +22,13 @@ */ public interface SysVipInfoService extends BaseServices<SysVipInfo>{ /** * 更新用户成交状态 * @param vipId * @param isDeal */ void updateDealStatus(Long vipId, int isDeal); public MoneyCardUse addVipDefaultCard(Long vipId); /** * 新增SysVipInfo zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -3,13 +3,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.pojo.VerificationResult; import com.matrix.core.tools.DateUtil; import com.matrix.system.constance.Dictionary; import com.matrix.system.hive.bean.MoneyCardUse; import com.matrix.system.hive.bean.MoneyCardUseFreeze; import com.matrix.system.hive.bean.SysOrderItem; import com.matrix.system.hive.bean.SysVipInfo; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.MoneyCardChangeDto; import com.matrix.system.hive.service.MoneyCardUseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,9 +40,71 @@ @Autowired private SysVipLevelDao viplevelDao; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired MoneyCardAssembleDao moneyCardAssembleDao; @Override public void changeMoneyCard(List<MoneyCardChangeDto> moneyCardChangeDtoList) { // 判断商品是否在充值卡的限制购买,判断分类 moneyCardChangeDtoList.forEach(cardUse->{ VerificationResult verificationResult = checkIsBangding(cardUse, cardUse.getGoodsIds()); if (!verificationResult.isJudgeResult()) { throw new GlobleException(verificationResult.getMsg()); } }); moneyCardChangeDtoList.get().forEach(item -> { if (!isInBangding(moneyCardUse, item.getGoodsId())) { throw new GlobleException(shoppingGoodsDao.selectById(item.getGoodsId()).getName() + "不在" + moneyCardUse.getCardName() + "优惠中"); } }); } private VerificationResult checkIsBangding(MoneyCardChangeDto moneyCardUse, List<Long> goodsIds) { // 如果是一卡通则肯定在绑定范围内 if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) { return true; } else { // 不是一卡通, // 判断卡是否可应用于所有产品 ShoppingGoods cardGoods = shoppingGoodsDao.selectById(moneyCardUse.getGoodsId()); if (cardGoods != null) { if (Dictionary.FLAG_YES.equals(cardGoods.getCarIsAll())) { return true; } } // 比较分类 MoneyCardAssemble moneyCardAssemble = new MoneyCardAssemble(); moneyCardAssemble.setCardId(moneyCardUse.getGoodsId()); List<MoneyCardAssemble> cardAssembleList = moneyCardAssembleDao.selectByModel(moneyCardAssemble); ShoppingGoods yhGoods = shoppingGoodsDao.selectById(goodsId); boolean flag = false; for (MoneyCardAssemble cardAssemble : cardAssembleList) { // 比较类型 if (cardAssemble.getType().equals(Dictionary.CZK_ASSEMBLE_FL)) { if (yhGoods.getCateId().equals(cardAssemble.getCateId())) { flag = true; break; } } else { // 比较绑定 if (yhGoods.getId().equals(cardAssemble.getGoodsId())) { flag = true; break; } } } return flag; } } @Override public int add(MoneyCardUse moneyCardUse) { zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
@@ -18,7 +18,7 @@ import com.matrix.system.hive.bean.SysShopInfo; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.GoodsSealLimitDto; import com.matrix.system.hive.dto.OrderItemDto; import com.matrix.system.hive.dto.SysOrderItemDto; import com.matrix.system.hive.service.ShoppingGoodsService; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -64,17 +64,17 @@ //校验参数不能为空 checkGoodsSelLimtParam(goodsSealLimitDto); goodsSealLimitDto.getOrderItemDtoList().forEach(item -> { goodsSealLimitDto.getSysOrderItemDtoList().forEach(item -> { ShoppingGoods shopGoods = shoppingGoodsDao.selectById(item.getGoodsId()); //最大销售次数检测 Integer maxNum = shopGoods.getCarMaxSaleCount(); if (maxNum != null && maxNum != 0) { Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId(), null); if ((buyNum + item.getCount()) == maxNum) { if (buyNum.equals(maxNum)) { if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) { shopGoods.setStaus(Dictionary.BUSINESS_STATE_DOWN); shoppingGoodsDao.update(shopGoods); LogUtil.info("{}商品达到最大销售数量自动下架",shopGoods.getName()); LogUtil.info("商品达到最大销售数量自动下架:{}", shopGoods.getName()); } } else if ((buyNum + item.getCount()) > maxNum) { throw new GlobleException(shopGoods.getName() + "已超过最大销售数量"); @@ -92,17 +92,14 @@ } private void checkGoodsSelLimtParam(GoodsSealLimitDto goodsSealLimitDto) { ParamCheckUtil.requireNonNulls(goodsSealLimitDto, goodsSealLimitDto.getVipId(), goodsSealLimitDto.getOrderItemDtoList()); goodsSealLimitDto.getSysOrderItemDtoList()); ParamCheckUtil.requireListElementNonNull(goodsSealLimitDto.getOrderItemDtoList(), Arrays.asList(OrderItemDto::getCount, OrderItemDto::getGoodsId)); ParamCheckUtil.requireListElementNonNull(goodsSealLimitDto.getSysOrderItemDtoList(), Arrays.asList(SysOrderItemDto::getCount, SysOrderItemDto::getGoodsId)); } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceHelper.java
New file @@ -0,0 +1,73 @@ /** * projectName: zq-erp * fileName: SysOrderServiceHelper.java * packageName: com.matrix.system.hive.service.imp * date: 2022-03-11 9:33 * copyright(c) 2022 http://www.hydee.cn/ Inc. All rights reserved. */ package com.matrix.system.hive.service.imp; import com.matrix.system.hive.bean.ShoppingGoods; import com.matrix.system.hive.bean.SysOrder; import com.matrix.system.hive.bean.SysOrderFlow; import com.matrix.system.hive.dao.ShoppingGoodsDao; import com.matrix.system.hive.dao.SysOrderFlowDao; import com.matrix.system.hive.service.CodeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * @version: V1.0 * @author: JiangYouYao * @className: SysOrderServiceHelper * @packageName: com.matrix.system.hive.service.imp * @description: 订单服务助手 * @data: 2022-03-11 9:33 **/ @Component public class SysOrderServiceHelper { @Autowired private CodeService codeService; @Autowired ShoppingGoodsDao shoppingGoodsDao; @Autowired private SysOrderFlowDao sysOrderFlowDao; /** * 创建支付流水 * * @author:姜友瑶 */ public void addOrderFlow(SysOrder sourceOrder) { //处理支付流水 int flowCount = 1; for (SysOrderFlow flow : sourceOrder.getFlows()) { flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount); flow.setVipId(sourceOrder.getVipId()); flow.setShopId(sourceOrder.getShopId()); flow.setCompanyId(sourceOrder.getCompanyId()); //支付内容摘要设置 Long goodsId = sourceOrder.getItems().get(0).getGoodsId(); ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId); flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品"); // 若是退款,则取负数 if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) { flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND); flow.setAmount(flow.getAmount().negate()); flow.setOrderId(sourceOrder.getOldOrderId()); } else { flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY); flow.setOrderId(sourceOrder.getId()); } sysOrderFlowDao.insert(flow); flowCount++; } } } zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -24,12 +24,13 @@ import com.matrix.system.common.dao.SysUsersDao; import com.matrix.system.common.service.OperationLogService; import com.matrix.system.constance.Dictionary; import com.matrix.system.enums.BooleanEnum; import com.matrix.system.enums.OperationButtonEnum; import com.matrix.system.enums.OperationFunctionEnum; import com.matrix.system.hive.bean.*; import com.matrix.system.hive.dao.*; import com.matrix.system.hive.dto.GoodsSealLimitDto; import com.matrix.system.hive.dto.OrderItemDto; import com.matrix.system.hive.dto.SysOrderItemDto; import com.matrix.system.hive.plugin.util.CollectionUtils; import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.pojo.CzXkVo; @@ -135,6 +136,14 @@ @Autowired private OperationLogService operationLogService; @Autowired private SysVipInfoService sysVipInfoService; @Autowired private SysOrderServiceHelper sysOrderServiceHelper; @Override @@ -517,27 +526,17 @@ @Transactional(rollbackFor = Exception.class) public void updateReceiptMoney(SysOrder pageOrder) throws GlobleException { if (!Dictionary.ORDER_STATU_DFK.equals(pageOrder.getStatu())) { throw new GlobleException("该订单已经收过款,请刷新页面再试!"); } //校验订单是否满足收款条件 checkOrder(pageOrder); // 更新收款时间 // 更新订单主表信息 updateOrderInfo(pageOrder); // 获取用户信息 SysVipInfo vipInfo = sysVipInfoDao.selectById(pageOrder.getVipId()); if (SysVipInfo.UNDEAL_VIP == vipInfo.getIsDeal()) { //非成交客户下单更新客户为成交客户 vipInfo.setIsDeal(SysVipInfo.DEAL_VIP); sysVipInfoDao.update(vipInfo); } // 设置用户为成交客户 sysVipInfoService.updateDealStatus(pageOrder.getVipId(), BooleanEnum.TRUE.getValue()); //添加支付流水 addOrderFlow(pageOrder); sysOrderServiceHelper.addOrderFlow(pageOrder); // 设置会员充值卡使用情况 addMoneyCardUse(pageOrder); @@ -556,10 +555,26 @@ //设置会员积分 addVipScore(pageOrder); //保存订单收款日志 saveOrderSkLog(pageOrder); } /** * 保存订单收款日志 * @param pageOrder */ private void saveOrderSkLog(SysOrder pageOrder) { SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_SK, pageOrder.getId(), pageOrder.getOrderNo(), pageOrder.getVipId()); } /** * 付款后更新订单信息 @@ -586,7 +601,14 @@ pageOrder.setCardPay(cardPayAmount.doubleValue()); pageOrder.setCashPay(cashPayAmount.doubleValue()); //欠款金额在流水处理中处理了 for (SysOrderFlow flow : pageOrder.getFlows()) { //欠款处理 if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) { pageOrder.setStatu(Dictionary.ORDER_STATU_QK); pageOrder.setArrears(flow.getAmount().doubleValue()); } } double sum = flows.stream().mapToDouble(item -> item.getAmount().doubleValue()).sum(); @@ -597,22 +619,24 @@ sysOrderDao.update(pageOrder); //保存单据日志 operationLogService.saveOperation(pageOrder.getCompanyId(), pageOrder.getShopId(), user.getSuId(), OperationFunctionEnum.ORDER, OperationButtonEnum.ORDER_SK, pageOrder.getId(), pageOrder.getOrderNo(), pageOrder.getVipId()); } private void checkOrder(SysOrder pageOrder) { //检查交易限制调整 jyytodo 测试一下 SysOrder checkOrder = sysOrderDao.selectById(pageOrder.getId()); //状态校验 if (!Dictionary.ORDER_STATU_DFK.equals(checkOrder.getStatu())) { throw new GlobleException("该订单已经收过款,请刷新页面再试!"); } //检查交易限制调整 GoodsSealLimitDto goodsSealLimitDto = new GoodsSealLimitDto(); goodsSealLimitDto.setVipId(pageOrder.getVipId()); goodsSealLimitDto.setOrderItemDtoList(Lists.newArrayList()); goodsSealLimitDto.setSysOrderItemDtoList(Lists.newArrayList()); pageOrder.getItems().forEach(e->{ goodsSealLimitDto.getOrderItemDtoList().add(BeanUtil.copyProperties(e, OrderItemDto.class)); goodsSealLimitDto.getSysOrderItemDtoList().add(BeanUtil.copyProperties(e, SysOrderItemDto.class)); }); shoppingGoodsService.checkGoodsSealLimit(goodsSealLimitDto); @@ -811,59 +835,7 @@ } } /** * 创建支付流水 * * @author:姜友瑶 */ private void addOrderFlow(SysOrder sourceOrder) { //处理支付流水 int flowCount = 1; for (SysOrderFlow flow : sourceOrder.getFlows()) { //支付内容摘要设置 Long goodsId = sourceOrder.getItems().get(0).getGoodsId(); ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId); flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品"); // 若是退款,则取负数 if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) { flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND); flow.setAmount(flow.getAmount().negate()); flow.setOrderId(sourceOrder.getOldOrderId()); } else { flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY); flow.setOrderId(sourceOrder.getId()); } //欠款处理 if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) { sourceOrder.setStatu(Dictionary.ORDER_STATU_QK); sourceOrder.setArrears(flow.getAmount().doubleValue()); sysOrderDao.update(sourceOrder); } //统计储值卡支付 if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) { if (flow.getCardId() != null) { MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId()); //修改储值卡余额 cardPaySk(moneyCardUse, sourceOrder, flow); } else { throw new GlobleException("无效的储值卡支付方式"); } } flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount); flow.setVipId(sourceOrder.getVipId()); flow.setShopId(sourceOrder.getShopId()); flow.setCompanyId(sourceOrder.getCompanyId()); sysOrderFlowDao.insert(flow); flowCount++; } } /** @@ -1572,7 +1544,7 @@ order.setFlows(czVo.getFlows()); addOrderFlow(order); sysOrderServiceHelper.addOrderFlow(order); // 添加员工业绩 achieveNewService.addAchaeveByOrder(order); @@ -1666,7 +1638,7 @@ // 添加订单收款流水 addOrderFlow(sysOrder); sysOrderServiceHelper.addOrderFlow(sysOrder); //退款退套餐退项目 refundProjUse(sysOrder); //删除积分 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
@@ -82,6 +82,13 @@ @Autowired private SysOrderDao sysOrderDao; @Override public void updateDealStatus(Long vipId, int isDeal) { SysVipInfo vipInfo = new SysVipInfo(); vipInfo.setIsDeal(isDeal); vipInfo.setIsDeal(SysVipInfo.DEAL_VIP); sysVipInfoDao.update(vipInfo); } /** * 新增会员储值卡 zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml
@@ -3,7 +3,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.matrix.system.hive.dao.ShoppingGoodsDao"> <cache readOnly="true"></cache> <resultMap type="ShoppingGoods" id="ShoppingGoodsMap"> <id property="id" column="id" /> zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html
@@ -54,12 +54,10 @@ </div> <div class="form-group mr-20"> <label for="staus">状态</label> <select class="form-control autoFull" name="staus" nullmsg="状态不能为空" dataType="*" id="staus" data-filed="name" data-value="name" th:data-url="@{/admin/dataDictionary/showDataDictionary}" data-param="{type:'项目状态'}"> <option value=''>请选择项目状态</option> <select class="form-control " name="staus" nullmsg="状态不能为空" dataType="*" id="staus"> <option value=''>全部</option> <option value='上架' selected ="selected ">上架</option> <option value=''>下架</option> </select> </div> <div class="form-group mr-20"> zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html
@@ -55,12 +55,10 @@ </div> <div class="form-group mr-20"> <label for="staus">状态</label> <select class="form-control autoFull" name="staus" nullmsg="状态不能为空" dataType="*" id="staus" data-filed="name" data-value="name" th:data-url="@{/admin/dataDictionary/showDataDictionary}" data-param="{type:'项目状态'}"> <option value=''>请选择项目状态</option> <select class="form-control " name="staus" nullmsg="状态不能为空" dataType="*" id="staus"> <option value=''>全部</option> <option value='上架' selected ="selected ">上架</option> <option value=''>下架</option> </select> </div> <div class="form-group mr-20">