Browse Source

修改配送状态

大大的豆芽 9 months ago
parent
commit
de2331ee62

+ 1 - 1
yiqi-quartz/src/main/java/com/yiqi/quartz/task/RyTask.java → yiqi-admin/src/main/java/com/yiqi/task/RyTask.java

@@ -1,4 +1,4 @@
-package com.yiqi.quartz.task;
+package com.yiqi.task;
 
 import org.springframework.stereotype.Component;
 import com.yiqi.common.utils.StringUtils;

+ 8 - 5
yiqi-quartz/src/main/java/com/yiqi/quartz/task/SettlementTask.java → yiqi-admin/src/main/java/com/yiqi/task/SettlementTask.java

@@ -1,4 +1,4 @@
-package com.yiqi.quartz.task;
+package com.yiqi.task;
 
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.StringUtils;
@@ -14,14 +14,17 @@ import java.util.Date;
  *
  * @author ruoyi
  */
-@Component("SettlementTask")
+@Component
 public class SettlementTask {
+
     @Autowired
     private ISettlementManageBillService settlementManageBillService;
 
-    public void insertSettlementBill(){
-        String date = DateUtils.parseDateToStr(DateUtils.YYYY_MM, DateUtils.addMonths(DateUtils.getNowDate(), -1));
-        String title = date+"账单";
+    public void insertSettlementBill(String date) {
+        if (StringUtils.isEmpty(date)) {
+            date = DateUtils.parseDateToStr(DateUtils.YYYY_MM, DateUtils.addMonths(DateUtils.getNowDate(), -1));
+        }
+        String title = date + "账单";
         SettlementBillAddDTO settlementBillAddDTO = new SettlementBillAddDTO();
         settlementBillAddDTO.setMonth(date);
         settlementBillAddDTO.setTitle(title);

+ 1 - 1
yiqi-api/src/main/java/com/yiqi/api/controller/order/WeAppOrderClothDeliveryManController.java

@@ -79,7 +79,7 @@ public class WeAppOrderClothDeliveryManController {
 
         LambdaQueryWrapper<OrderDelivery> queryWrapper = new LambdaQueryWrapper<OrderDelivery>();
         queryWrapper.eq(OrderDelivery::getDeliveryManId, AuthHolder.userId());
-        if(appOrderClothDeliveryManQueryDTO.getDeliveryStatus()!=null){
+        if (appOrderClothDeliveryManQueryDTO.getDeliveryStatus() != null) {
             queryWrapper.eq(OrderDelivery::getDeliveryStatus, appOrderClothDeliveryManQueryDTO.getDeliveryStatus());
         }
         queryWrapper.orderByDesc(BaseEntity::getCreateTime);

+ 1 - 0
yiqi-common/src/main/java/com/yiqi/common/enums/SettlementStatusType.java

@@ -6,6 +6,7 @@ package com.yiqi.common.enums;
  * @author ruoyi
  */
 public enum SettlementStatusType {
+    FAIL("2", "清算失败"),
     NO("0", "未清算"),
     YES("1", "已清算"),
 

+ 1 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/SettlementManageFactory.java

@@ -103,4 +103,5 @@ public class SettlementManageFactory
     private String status;
 
 
+    private String remark;
 }

+ 8 - 0
yiqi-common/src/main/java/com/yiqi/settlement/service/ISettlementFactoryRateService.java

@@ -1,5 +1,6 @@
 package com.yiqi.settlement.service;
 
+import java.util.Date;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -21,4 +22,11 @@ public interface ISettlementFactoryRateService extends IService<SettlementFactor
      * @return
      */
     List<SettlementFactoryRateListVO> queryList(SettlementFactoryRateQueryDTO queryDTO);
+
+    /**
+     * 根据工厂ID查询工厂结算费率配置
+     * @param factoryId
+     * @return
+     */
+    SettlementFactoryRate getByFactoryId(Long factoryId, Date date);
 }

+ 103 - 43
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageBillServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.yiqi.app.domain.AppUserBillMstr;
 import com.yiqi.app.service.IAppUserBillMstrService;
 import com.yiqi.common.enums.*;
+import com.yiqi.common.utils.CurrencyUtil;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.core.domain.SettlementManageFactory;
 import com.yiqi.core.domain.SettlementManageStore;
@@ -23,6 +24,8 @@ import com.yiqi.order.service.IOrderClothService;
 import com.yiqi.order.service.IOrderGoodsService;
 import com.yiqi.recharge.domain.RechargePasswordCard;
 import com.yiqi.recharge.service.IRechargePasswordCardService;
+import com.yiqi.settlement.domain.SettlementFactoryRate;
+import com.yiqi.settlement.service.ISettlementFactoryRateService;
 import com.yiqi.system.domain.ManageFactory;
 import com.yiqi.system.domain.SysSettlementRate;
 import com.yiqi.system.domain.SysStore;
@@ -45,7 +48,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  * @date 2024-02-15
  */
 @Service
-public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManageBillMapper,SettlementManageBill> implements ISettlementManageBillService {
+public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManageBillMapper, SettlementManageBill> implements ISettlementManageBillService {
     @Autowired
     private ISettlementManageFactoryService settlementManageFactoryService;
     @Autowired
@@ -70,6 +73,8 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
     private IOrderClothService orderClothService;
     @Autowired
     private IOrderGoodsService orderGoodsService;
+    @Autowired
+    private ISettlementFactoryRateService settlementFactoryRateService;
 
     @Override
     public void insertSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
@@ -82,8 +87,8 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
     }
 
     private SettlementManageBill buildSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO) {
-        Date beginTime = DateUtils.strToDate(settlementBillAddDTO.getMonth()+"-01");
-        Date endTime = DateUtils.addDays(DateUtils.addMonths(beginTime,1), -1);
+        Date beginTime = DateUtils.strToDate(settlementBillAddDTO.getMonth() + "-01");
+        Date endTime = DateUtils.addDays(DateUtils.addMonths(beginTime, 1), -1);
         SettlementManageBill settlementManageBill = new SettlementManageBill();
         settlementManageBill.setBeginTime(beginTime);
         settlementManageBill.setEndTime(endTime);
@@ -97,6 +102,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
 
     /**
      * 工厂结算
+     *
      * @param settlementManageBill
      * @return
      */
@@ -104,36 +110,43 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         List<ManageFactory> factoryList = factoryService.list(new QueryWrapper<ManageFactory>().lambda()
                 .eq(ManageFactory::getStatus, StatusType.OK.getCode())
                 .eq(ManageFactory::getDelFlag, StatusType.OK.getCode()));
-        // 查询衣服订单
-        List<OrderClothItem> orderClothItemList = orderClothItemService.list(new QueryWrapper<OrderClothItem>().lambda()
-                .ne(OrderClothItem::getFlowStatus, ClothOrderFlowStatus.refund.getCode())
-                .ge(OrderClothItem::getCreateTime, settlementManageBill.getBeginTime())
-                .lt(OrderClothItem::getCreateTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
-
-        if (CollUtil.isEmpty(factoryList)){
+        if (CollUtil.isEmpty(factoryList)) {
             return;
         }
+
+        for (ManageFactory factory : factoryList) {
+            //查询衣服订单,入场时间在上个月的,切没有撤销的衣服
+            List<OrderClothItem> orderClothItemList = orderClothItemService.list(new QueryWrapper<OrderClothItem>().lambda()
+                    .ne(OrderClothItem::getFlowStatus, ClothOrderFlowStatus.refund.getCode())
+                    .eq(OrderClothItem::getFactoryId, factory.getId())
+                    .ge(OrderClothItem::getCreateTime, settlementManageBill.getBeginTime())
+                    .ge(OrderClothItem::getInFactoryTime, settlementManageBill.getBeginTime())
+                    .lt(OrderClothItem::getInFactoryTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
+            this.buildFactorySettlement(settlementManageBill, factory, orderClothItemList);
+        }
         // 计算工厂结算明细
-        threadPoolTaskExecutor.execute(() ->  this.buildFactorySettlement(settlementManageBill, factoryList, orderClothItemList));
+//        threadPoolTaskExecutor.execute(() -> this.buildFactorySettlement(settlementManageBill, factoryList, orderClothItemList));
     }
 
     /**
      * 门店结算
+     *
      * @param settlementManageBill
      */
     private void handleCountStoreSettlement(SettlementManageBill settlementManageBill) {
         List<SysStore> storeList = storeService.list(new QueryWrapper<SysStore>().lambda()
                 .eq(SysStore::getStatus, StatusType.OK.getCode())
                 .eq(SysStore::getDelFlag, StatusType.OK.getCode()));
-        if (CollUtil.isEmpty(storeList)){
+        if (CollUtil.isEmpty(storeList)) {
             return;
         }
         // 计算门店结算明细
-        threadPoolTaskExecutor.execute(() ->  this.buildStoreSettlement(settlementManageBill, storeList));
+        threadPoolTaskExecutor.execute(() -> this.buildStoreSettlement(settlementManageBill, storeList));
     }
 
     /**
      * 门店结算处理
+     *
      * @param settlementManageBill
      * @return
      */
@@ -245,13 +258,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
             BigDecimal totalCrossSend = crossSendBillMstrList.stream().map(AppUserBillMstr::getOtherStoreAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
 
 
-
             // 设置 会员剩余金额 = 充值余额总和+福利金余额总和+赠送余额总和
             BigDecimal addMemberBalance = totalRechargeBalance.add(totalWelfareBalance).add(totalGiveBalance);
             settlementManageStore.setMemberBalance(addMemberBalance);
             //`welfare_amount` '福利金额',
             settlementManageStore.setWelfareAmount(totalWelfareBalance);
-             //   `unopened_card_password_amount` '未开卡卡密金额',
+            //   `unopened_card_password_amount` '未开卡卡密金额',
             settlementManageStore.setUnopenedCardPasswordAmount(totalUnopenedCard);
 
             List<SysSettlementRate> sysSettlementRates = storeRateMap.get(sysStore.getId());
@@ -284,12 +296,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
             BigDecimal decimalSystem = new BigDecimal(configService.selectConfigByKey(SysConfigKey.StoreSettlementManageRate.getCode()));
             // // 洗衣费率
             BigDecimal decimalWashCloth = new BigDecimal(configService.selectConfigByKey(SysConfigKey.StoreSettlementFactoryRate.getCode()));
-            if (CollUtil.isEmpty(sysSettlementRates)){
+            if (CollUtil.isEmpty(sysSettlementRates)) {
                 payableDeposit = addMemberBalance.multiply(decimalDeposit);
                 welfareDeposit = totalWelfareBalance.multiply(decimalDeposit);
                 cardPasswordDeposit = totalUnopenedCard.multiply(decimalDeposit);
-                wechatAmount = totalWechat.multiply( (new BigDecimal("1").subtract(decimalWechat)) );
-                alipayAmount = totalAlipay.multiply( (new BigDecimal("1").subtract(decimalAlipay)) );
+                wechatAmount = totalWechat.multiply((new BigDecimal("1").subtract(decimalWechat)));
+                alipayAmount = totalAlipay.multiply((new BigDecimal("1").subtract(decimalAlipay)));
                 materialAmount = totalMaterialAmount.multiply(decimalMaterial);
                 systemMaintenanceAmount = (totalMaterialAmount.add(totalSystemAmount)).multiply(decimalSystem);
                 washClothAmount = totalWashAmount.multiply(decimalWashCloth);
@@ -301,7 +313,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
                 settlementManageStore.setMaterialRate(decimalMaterial);
                 settlementManageStore.setWxPayRate(decimalWechat);
                 settlementManageStore.setAliPayRate(decimalAlipay);
-            }else {
+            } else {
                 SysSettlementRate rate = sysSettlementRates.get(0);
                 payableDeposit = addMemberBalance.multiply(rate.getDepositRate() == null ? decimalDeposit : rate.getDepositRate());
                 welfareDeposit = totalWelfareBalance.multiply(rate.getDepositRate() == null ? decimalDeposit : rate.getDepositRate());
@@ -347,14 +359,14 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
                     .eq(SettlementManageStore::getOrgId, sysStore.getId())
                     .eq(SettlementManageStore::getBeginTime, DateUtils.addMonths(settlementManageStore.getBeginTime(), -1)));
 
-            if (CollUtil.isEmpty(settlementManageStoreLastList)){
+            if (CollUtil.isEmpty(settlementManageStoreLastList)) {
                 // `paid_deposit` '已付押金', = 上个月的应付押金
                 settlementManageStore.setPaidDeposit(BigDecimal.ZERO);
                 // `paid_welfare_deposit`  '已付福利押金',= 上个月的应付福利押金
                 settlementManageStore.setPaidWelfareDeposit(BigDecimal.ZERO);
                 //   `paid_card_password_deposit`'已付卡密押金',
                 settlementManageStore.setPaidCardPasswordDeposit(BigDecimal.ZERO);
-            }else {
+            } else {
                 SettlementManageStore settlementManageStoreLast = settlementManageStoreLastList.get(0);
                 settlementManageStore.setPaidDeposit(settlementManageStoreLast.getPayableDeposit());
                 settlementManageStore.setPaidWelfareDeposit(settlementManageStoreLast.getWelfareDeposit());
@@ -424,31 +436,74 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
 
     /**
      * 工厂结算处理
+     *
      * @param settlementManageBill
      * @return
      */
-    private void buildFactorySettlement(SettlementManageBill settlementManageBill, List<ManageFactory> factoryList, List<OrderClothItem> orderClothItemList) {
-        if (CollUtil.isEmpty(orderClothItemList)){
-            this.handle0ClothAllFactorySettlement(settlementManageBill, factoryList);
-            settlementManageBill.setStatus(SettlementBillStatusType.WAITING.getCode());
-            // 设置账单洗衣费
-            settlementManageBill.setWashClothAmount(BigDecimal.ZERO);
-            this.updateById(settlementManageBill);
-            return;
+    private void buildFactorySettlement(SettlementManageBill settlementManageBill, ManageFactory factory, List<OrderClothItem> orderClothItemList) {
+        SettlementFactoryRate settlementFactoryRate = settlementFactoryRateService.getByFactoryId(factory.getId(), settlementManageBill.getBeginTime());
+        if (settlementFactoryRate == null) {
+            SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
+            this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
+            this.build0ClothFactory(settlementManageFactory);
+            settlementManageFactory.setStatus(SettlementStatusType.FAIL.getCode());
+            settlementManageFactory.setRemark("结算费率无效,结算失败");
+            settlementManageFactoryService.save(settlementManageFactory);
         }
-        Map<Long, List<OrderClothItem>> map = orderClothItemList.stream().collect(Collectors.groupingBy(OrderClothItem::getFactoryId));
-        for (ManageFactory factory : factoryList) {
+        if (CollUtil.isEmpty(orderClothItemList)) {
             SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
             this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
-            if (map.containsKey(factory.getId())){
-                // 本工厂有订单衣服,进行计算
-                this.buildHasClothFactory(settlementManageFactory, map.get(factory.getId()));
-            }else {
-                // 本工厂没有订单衣服,设置为0
-                this.build0ClothFactory(settlementManageFactory);
-            }
+            this.build0ClothFactory(settlementManageFactory);
             settlementManageFactoryService.save(settlementManageFactory);
+            return;
         }
+        SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
+        this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
+
+        settlementManageFactory.setTotalTransactionNum(orderClothItemList.size());
+        //计算衣服总价格
+        BigDecimal orderClothItemTotalPrice = orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 总交易金额
+        settlementManageFactory.setTotalTransactionAmount(orderClothItemTotalPrice);
+        //材料结算金额总和
+        BigDecimal materialAmount = CurrencyUtil.mul(settlementFactoryRate.getMaterialRate(), orderClothItemTotalPrice);
+        settlementManageFactory.setMaterialAmount(materialAmount);
+        //管理费
+        BigDecimal managetAmount = CurrencyUtil.mul(settlementFactoryRate.getManagementRate(), orderClothItemTotalPrice);
+        settlementManageFactory.setManageAmount(managetAmount);
+        //工厂结算金额总和
+        BigDecimal factorySettlementAmount = CurrencyUtil.mul(settlementFactoryRate.getDepositRate(), orderClothItemTotalPrice);
+        settlementManageFactory.setFactorySettlementAmount(managetAmount);
+
+        // 工厂结算金额总和
+        settlementManageFactory.setFactorySettlementAmount(
+                orderClothItemList.stream().map(OrderClothItem::getFactorySettlementAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        // 材料结算金额总和
+        settlementManageFactory.setMaterialAmount(
+                orderClothItemList.stream().map(OrderClothItem::getMaterialAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        // 管理结算金额总和
+        settlementManageFactory.setManageAmount(
+                orderClothItemList.stream().map(OrderClothItem::getManageAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        // 总交易金额
+        settlementManageFactory.setTotalTransactionAmount(
+                orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+        // 总交易件数
+        settlementManageFactory.setTotalTransactionNum(orderClothItemList.size());
+
+        // 工厂消费 = 材料费+ 管理费
+        BigDecimal payMoney = settlementManageFactory.getManageAmount().add(settlementManageFactory.getMaterialAmount());
+        // 工厂实际收入 = 工厂结算金额总和 - 工厂消费
+        settlementManageFactory.setRealIncomeAmount(settlementManageFactory.getFactorySettlementAmount().subtract(payMoney));
+
+
+        if (map.containsKey(factory.getId())) {
+            // 本工厂有订单衣服,进行计算
+            this.buildHasClothFactory(settlementManageFactory, map.get(factory.getId()));
+        } else {
+            // 本工厂没有订单衣服,设置为0
+            this.build0ClothFactory(settlementManageFactory);
+        }
+        settlementManageFactoryService.save(settlementManageFactory);
 
         // 设置账单洗衣费
         settlementManageBill.setWashClothAmount(
@@ -460,11 +515,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
 
     /**
      * 本月订单全部为空时,默认所有工厂都是设置为0
+     *
      * @param settlementManageBill
      * @param factoryList
      */
     private void handle0ClothAllFactorySettlement(SettlementManageBill settlementManageBill, List<ManageFactory> factoryList) {
-        if (CollUtil.isEmpty(factoryList)){
+        if (CollUtil.isEmpty(factoryList)) {
             return;
         }
         for (ManageFactory factory : factoryList) {
@@ -477,9 +533,10 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
 
     /**
      * 工厂本月没有衣服时,设置默认为0
+     *
      * @param settlementManageFactory
      */
-    private void build0ClothFactory(SettlementManageFactory settlementManageFactory){
+    private void build0ClothFactory(SettlementManageFactory settlementManageFactory) {
         // 工厂结算金额总和
         settlementManageFactory.setFactorySettlementAmount(BigDecimal.ZERO);
         // 材料结算金额总和
@@ -492,14 +549,16 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         settlementManageFactory.setTotalTransactionNum(0);
         // 工厂实际收入
         settlementManageFactory.setRealIncomeAmount(BigDecimal.ZERO);
+        //
+        settlementManageFactory.setRemark("无入厂洗衣订单");
     }
 
     /**
      * 工厂本月有衣服时,计算数量
+     *
      * @param settlementManageFactory
-
      */
-    private void buildHasClothFactory(SettlementManageFactory settlementManageFactory, List<OrderClothItem> orderClothItemList){
+    private void buildHasClothFactory(SettlementManageFactory settlementManageFactory, List<OrderClothItem> orderClothItemList) {
         // 工厂结算金额总和
         settlementManageFactory.setFactorySettlementAmount(
                 orderClothItemList.stream().map(OrderClothItem::getFactorySettlementAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
@@ -524,11 +583,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
 
     /**
      * 构建工厂账单基础数据
+     *
      * @param settlementManageFactory
      * @param settlementManageBill
      * @param factory
      */
-    private void buildFactorySettlementInfo(SettlementManageFactory settlementManageFactory, SettlementManageBill settlementManageBill, ManageFactory factory){
+    private void buildFactorySettlementInfo(SettlementManageFactory settlementManageFactory, SettlementManageBill settlementManageBill, ManageFactory factory) {
         settlementManageFactory.setBillId(settlementManageBill.getId());
         settlementManageFactory.setSourceType(SourceType.FACTORY.getCode());
         settlementManageFactory.setOrgId(factory.getId());

+ 13 - 0
yiqi-core/src/main/java/com/yiqi/settlement/service/impl/SettlementFactoryRateServiceImpl.java

@@ -1,8 +1,10 @@
 package com.yiqi.settlement.service.impl;
 
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.SecurityUtils;
 import com.yiqi.settlement.domain.SettlementFactoryRate;
@@ -29,4 +31,15 @@ public class SettlementFactoryRateServiceImpl extends ServiceImpl<SettlementFact
         List<SettlementFactoryRateListVO> voList = baseMapper.queryList(queryDTO.getFactoryId());
         return voList;
     }
+
+    @Override
+    public SettlementFactoryRate getByFactoryId(Long factoryId, Date date) {
+        QueryWrapper<SettlementFactoryRate> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
+                .eq(SettlementFactoryRate::getFactoryId, factoryId)
+                .le(SettlementFactoryRate::getStartDate, date)
+                .ge(SettlementFactoryRate::getEndDate, date)
+                .last("ORDER BY id DESC LIMIT 1");
+        return baseMapper.selectOne(queryWrapper);
+    }
 }