24282 8 luni în urmă
părinte
comite
582b42dc88

+ 11 - 0
jy-business/src/main/java/com/jy/business/capital/model/dto/CapitalTransactionsDto.java

@@ -1,6 +1,7 @@
 package com.jy.business.capital.model.dto;
 
 import com.jy.business.capital.model.entity.CapitalTransactions;
+import com.jy.business.contract.model.dto.ContractInfoDto;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -14,4 +15,14 @@ import lombok.Setter;
 @Setter
 public class CapitalTransactionsDto extends CapitalTransactions {
 
+    /**
+     * 操作类型 1新增 2编辑 3删除(必填)
+     */
+    private Integer handleType;
+
+    /**
+     * 合同信息
+     */
+    private ContractInfoDto contractInfo;
+
 }

+ 8 - 0
jy-business/src/main/java/com/jy/business/contract/controller/ContractInfoController.java

@@ -45,6 +45,14 @@ public class ContractInfoController {
     }
 
     /**
+     * 根据资金流水id合同明细
+     */
+    @GetMapping("/getDetailByCapitalTransactionsId")
+    public ContractInfoVo getDetailByCapitalTransactionsId(BaseSelectDto dto) {
+        return contractInfoService.getDetailByCapitalTransactionsId(dto.getId());
+    }
+
+    /**
      * 合同新增
      */
     @PostMapping("/add")

+ 9 - 0
jy-business/src/main/java/com/jy/business/contract/model/dto/ContractInfoDto.java

@@ -1,9 +1,12 @@
 package com.jy.business.contract.model.dto;
 
+import com.jy.business.contract.model.entity.ContractDetail;
 import com.jy.business.contract.model.entity.ContractInfo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 合同新增编辑入参实体
  *
@@ -14,4 +17,10 @@ import lombok.Setter;
 @Setter
 public class ContractInfoDto extends ContractInfo {
 
+    /**
+     * 合同详情列表
+     */
+    private List<ContractDetail> list;
+
+
 }

+ 5 - 0
jy-business/src/main/java/com/jy/business/contract/model/entity/ContractDetail.java

@@ -24,6 +24,11 @@ import lombok.Setter;
 public class ContractDetail extends BaseIdPo {
 
     /**
+     * 合同id
+     */
+    private Long contractId;
+
+    /**
      * 产品名称
      */
     private String productName;

+ 5 - 0
jy-business/src/main/java/com/jy/business/contract/model/table/ContractDetailTable.java

@@ -15,6 +15,11 @@ public class ContractDetailTable extends Table<ContractDetail> {
     public QueryColumn id = this.field(ContractDetail::getId);
 
     /**
+     * 合同id
+     */
+    public QueryColumn contractId = this.field(ContractDetail::getContractId);
+
+    /**
      * 产品名称
      */
     public QueryColumn productName = this.field(ContractDetail::getProductName);

+ 9 - 1
jy-business/src/main/java/com/jy/business/contract/model/vo/ContractInfoVo.java

@@ -1,17 +1,25 @@
 package com.jy.business.contract.model.vo;
 
+import com.jy.business.contract.model.entity.ContractDetail;
 import com.jy.business.contract.model.entity.ContractInfo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 合同列表查询返回值实体
  *
- * @author 
+ * @author
  * @since 2025-01-07
  */
 @Getter
 @Setter
 public class ContractInfoVo extends ContractInfo {
 
+    /**
+     * 合同详情列表
+     */
+    private List<ContractDetail> list;
+
 }

+ 8 - 0
jy-business/src/main/java/com/jy/business/contract/service/ContractInfoService.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jy.business.contract.model.dto.ContractInfoDto;
 import com.jy.business.contract.model.dto.ContractInfoSelectDto;
 import com.jy.business.contract.model.vo.ContractInfoVo;
+import com.jy.framework.model.validation.DeleteGroup;
+import com.jy.framework.model.validation.DetailGroup;
+import jakarta.validation.constraints.NotNull;
 
 import java.util.List;
 
@@ -28,6 +31,11 @@ public interface ContractInfoService {
     ContractInfoVo getDetail(Long id);
 
     /**
+     * 根据资金流水id合同明细
+     */
+    ContractInfoVo getDetailByCapitalTransactionsId(@NotNull(groups = {DetailGroup.class, DeleteGroup.class}) Long id);
+
+    /**
      * 合同新增
      */
     void add(ContractInfoDto dto);

+ 30 - 1
jy-business/src/main/java/com/jy/business/contract/service/impl/ContractInfoServiceImpl.java

@@ -1,9 +1,12 @@
 package com.jy.business.contract.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jy.business.contract.dao.ContractDetailDao;
 import com.jy.business.contract.dao.ContractInfoDao;
 import com.jy.business.contract.model.dto.ContractInfoDto;
 import com.jy.business.contract.model.dto.ContractInfoSelectDto;
+import com.jy.business.contract.model.entity.ContractDetail;
+import com.jy.business.contract.model.entity.ContractInfo;
 import com.jy.business.contract.model.vo.ContractInfoVo;
 import com.jy.business.contract.service.ContractInfoService;
 import com.jy.framework.utils.AssertUtil;
@@ -18,7 +21,7 @@ import java.util.List;
  * 合同 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2025-01-07
  */
 @Service
@@ -27,6 +30,9 @@ public class ContractInfoServiceImpl implements ContractInfoService {
     @Resource
     private ContractInfoDao contractInfoDao;
 
+    @Resource
+    private ContractDetailDao contractDetailDao;
+
     @Override
     public Page<ContractInfoVo> getPage(ContractInfoSelectDto dto) {
         return contractInfoDao.getPage(dto);
@@ -36,23 +42,46 @@ public class ContractInfoServiceImpl implements ContractInfoService {
     public ContractInfoVo getDetail(Long id) {
         ContractInfoVo vo = contractInfoDao.getDetail(id);
         AssertUtil.notNull(vo, "未知数据");
+
+        List<ContractDetail> list = contractDetailDao.lambdaQuery().eq(ContractDetail::getContractId, id).list();
+        vo.setList(list);
+
         return vo;
     }
 
     @Override
+    public ContractInfoVo getDetailByCapitalTransactionsId(Long id) {
+        ContractInfo contractInfo = contractInfoDao.lambdaQuery().eq(ContractInfo::getCapitalTransactionsId, id).one();
+        AssertUtil.notNull(contractInfo, "没用找到关联合同");
+
+        return getDetail(contractInfo.getId());
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
     public void add(ContractInfoDto dto) {
         contractInfoDao.save(dto);
+
+        List<ContractDetail> list = dto.getList();
+        list.forEach(item -> item.setContractId(dto.getId()));
+        contractDetailDao.saveBatch(list);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(ContractInfoDto dto) {
         contractInfoDao.updateById(dto);
+
+        List<ContractDetail> list = dto.getList();
+        list.forEach(item -> item.setContractId(dto.getId()));
+        contractDetailDao.updateLinked(list, ContractDetail::getContractId, dto.getId());
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(List<Long> idList) {
         contractInfoDao.removeBatchByIds(idList);
+        contractDetailDao.lambdaUpdate().in(ContractDetail::getContractId, idList).remove();
     }
 
 }

+ 107 - 2
jy-business/src/main/java/com/jy/business/listener/JyRabbitListener.java

@@ -1,9 +1,16 @@
 package com.jy.business.listener;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
+import com.jy.business.capital.dao.CapitalTransactionsDao;
 import com.jy.business.capital.model.dto.CapitalTransactionsDto;
+import com.jy.business.capital.model.entity.CapitalTransactions;
 import com.jy.business.capital.service.CapitalTransactionsService;
 import com.jy.business.config.RabbitConfig;
+import com.jy.business.contract.dao.ContractInfoDao;
+import com.jy.business.contract.model.entity.ContractInfo;
+import com.jy.business.contract.service.ContractInfoService;
+import com.jy.framework.model.constants.CommonConstant;
 import com.rabbitmq.client.Channel;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
@@ -13,16 +20,43 @@ import org.springframework.amqp.rabbit.annotation.Queue;
 import org.springframework.amqp.rabbit.annotation.QueueBinding;
 import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
+import java.util.Collections;
 
 @Slf4j
 @Component
 public class JyRabbitListener {
 
+    /**
+     * 小程序账号
+     */
+    private static final Long APPLET_CAPITAL_ACCOUNT_ID = 1846382237635223553L;
+
+    /**
+     * 私帐
+     */
+    private static final Long PRIVATE_CAPITAL_ACCOUNT_ID = 1876190055198384130L;
+
+    /**
+     * 公帐
+     */
+    private static final Long PUBLIC_CAPITAL_ACCOUNT_ID = 1876187625165447170L;
+
     @Resource
     private CapitalTransactionsService capitalTransactionsService;
 
+    @Resource
+    private CapitalTransactionsDao capitalTransactionsDao;
+
+    @Resource
+    private ContractInfoService contractInfoService;
+
+    @Resource
+    private ContractInfoDao contractInfoDao;
+
+    @Transactional(rollbackFor = Exception.class)
     @RabbitListener(bindings = {
             @QueueBinding(
                     value = @Queue(RabbitConfig.TRANSACTIONS_QUEUE),
@@ -35,15 +69,86 @@ public class JyRabbitListener {
 
         try {
             CapitalTransactionsDto dto = JSON.parseObject(msg).to(CapitalTransactionsDto.class);
-            dto.setTargetType(80);
-            capitalTransactionsService.add(dto);
+            if (dto.getHandleType() == null) {
+                dto.setTargetType(80);
+                capitalTransactionsService.add(dto);
+            } else {
+                handle(dto);
+            }
 
             channel.basicAck(deliveryTag, false);
         } catch (Exception e) {
             channel.basicNack(deliveryTag, false, true);
             log.error("消息消费失败:【{}】", e.getMessage(), e);
         }
+    }
+
+    private void handle(CapitalTransactionsDto dto) {
+        Integer handleType = dto.getHandleType();
+        switch (handleType) {
+            case 1 -> handleAdd(dto);
+            case 2 -> handleEdit(dto);
+            case 3 -> handleDelete(dto);
+            default -> {
+                log.error("未知的操作类型:{}", handleType);
+                throw new IllegalArgumentException("未知的操作类型:" + handleType);
+            }
+        }
+    }
+
+    private void handleAdd(CapitalTransactionsDto dto) {
+        CapitalTransactions capitalTransactions = capitalTransactionsDao.lambdaQuery()
+                .eq(CapitalTransactions::getOrderId, dto.getOrderId())
+                .one();
+
+        if (capitalTransactions != null) {
+            return;
+        }
 
+        dto.setTargetType(80);
+
+        if (ObjectUtil.equal(dto.getHasApplet(), CommonConstant.YES)) {
+            dto.setCapitalAccountId(APPLET_CAPITAL_ACCOUNT_ID);
+        } else if (ObjectUtil.equal(dto.getHasPrivate(), CommonConstant.YES)) {
+            dto.setCapitalAccountId(PRIVATE_CAPITAL_ACCOUNT_ID);
+        } else {
+            dto.setCapitalAccountId(PUBLIC_CAPITAL_ACCOUNT_ID);
+        }
+
+        capitalTransactionsService.add(dto);
+
+        if (ObjectUtil.equal(dto.getHasBulkOrder(), CommonConstant.YES) && dto.getContractInfo() != null) {
+            contractInfoService.add(dto.getContractInfo());
+        }
+    }
+
+    private void handleEdit(CapitalTransactionsDto dto) {
+        CapitalTransactions capitalTransactions = capitalTransactionsDao.lambdaQuery()
+                .eq(CapitalTransactions::getOrderId, dto.getOrderId())
+                .one();
+        if (capitalTransactions != null) {
+            capitalTransactionsService.delete(Collections.singletonList(capitalTransactions.getId()));
+
+            // 获取合同
+            ContractInfo contractInfo = contractInfoDao.lambdaQuery()
+                    .eq(ContractInfo::getCapitalTransactionsId, capitalTransactions.getId()).one();
+
+            if (contractInfo != null) {
+                contractInfoService.delete(Collections.singletonList(contractInfo.getId()));
+            }
+
+        }
+
+        handleAdd(dto);
+    }
+
+    private void handleDelete(CapitalTransactionsDto dto) {
+        CapitalTransactions capitalTransactions = capitalTransactionsDao.lambdaQuery()
+                .eq(CapitalTransactions::getOrderId, dto.getOrderId())
+                .one();
+        if (capitalTransactions != null) {
+            capitalTransactionsService.delete(Collections.singletonList(capitalTransactions.getId()));
+        }
     }
 
 }

+ 5 - 0
jy-ui/src/api/business/contract/info.ts

@@ -11,6 +11,11 @@ export function getDetailApi(params: StrAnyObj): Promise<StrAnyObj> {
   return request.get('/contractInfo/getDetail', params)
 }
 
+// 根据资金流水id合同明细
+export function getDetailByCapitalTransactionsIdApi(params: StrAnyObj): Promise<StrAnyObj> {
+  return request.get('/contractInfo/getDetailByCapitalTransactionsId', params)
+}
+
 // 合同新增
 export function addApi(data: StrAnyObj): Promise<void> {
   return request.post('/contractInfo/add', data)