فهرست منبع

Merge remote-tracking branch 'origin/master' into dev

GouGengquan 11 ماه پیش
والد
کامیت
147e664592

+ 11 - 0
biz-base/src/main/java/com/dayou/controller/BusinessProductionController.java

@@ -165,4 +165,15 @@ public class BusinessProductionController{
     public RestResponse<Boolean> doAllotRealAmountToProd(@RequestBody List<OrderReportDTO> claimOrders) {
         return RestResponse.data(assetsProductionService.doAllotRealAmountToProd(claimOrders));
     }
+
+    /**
+     * 大中型、资产、个贷产品通用出入库接口
+     * @param productionNo
+     * @return
+     */
+    @PostMapping("/wareHouse")
+    public RestResponse<Boolean> inOutWareHouse(@RequestParam("productionNo") String productionNo){
+        Boolean ret = businessProductionService.inOutWareHouse(productionNo);
+        return RestResponse.data(ret);
+    }
 }

+ 1 - 1
biz-base/src/test/java/history/SyncHistoryTest.java

@@ -113,6 +113,6 @@ public class SyncHistoryTest {
 
     @Test
     public void getLandTargetMajorTest() throws NoSuchFieldException, IllegalAccessException {
-       dyoaHistoryService.fetchAssetsOrderProduction();
+       dyoaHistoryService.fetchRealAmount();
     }
 }

+ 3 - 0
dao/src/main/java/com/dayou/mapper/WorkFlowNodeInstanceMapper.java

@@ -7,6 +7,7 @@ import com.dayou.vo.WorkNodeInstanceVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -31,4 +32,6 @@ public interface WorkFlowNodeInstanceMapper extends CustomBaseMapper<WorkFlowNod
     List<NightingaleEchartsVO> instanceNodeCountByCode(@Param("businessType") String businessType);
 
     List<String> checkIfReverse(@Param("productionType")String productionType, @Param("productionNo")String productionNo);
+
+    Map<String, Object> getInOutInstanceNode(@Param("productionNo") String productionNo);
 }

+ 1 - 1
dao/src/main/resources/mapper/DyoaRecordMapper.xml

@@ -53,7 +53,7 @@
                     mbs_type IN ( 'MAJOR_ORDER','PERSONAL_ORDER','ASSETS_ORDER' )) m
                 LEFT JOIN order_fund f ON (
                 f.business_id = m.mbs_id
-                    AND f.business_type = m.mbs_type) where f.id is not null
+                    AND f.business_type = m.mbs_type) where f.id is not null GROUP BY m.dyoa_id
     </select>
 
 

+ 4 - 1
dao/src/main/resources/mapper/FinanceRealFundMapper.xml

@@ -46,6 +46,9 @@
                 LEFT JOIN ( SELECT real_fund_id, sum(ifnull(claim_amount,0)) ca FROM finance_claim WHERE deleted = 0 GROUP BY real_fund_id ) t ON t.real_fund_id = frf.id
         WHERE
             frf.deleted = 0
+        <if test="vo!=null and vo.notFinished">
+            and  ifnull(t.ca,0) &lt; frf.amount
+        </if>
         <if test="keyword!=null and keyword!='' ">
             and (
             frf.payer like concat ('%',#{keyword},'%')
@@ -69,7 +72,7 @@
             and frf.created &lt;= #{vo.xEndDate}
         </if>
         ORDER BY
-            frf.created DESC
+        ifnull(t.ca,0) ASC ,frf.created DESC
     </select>
 
     <select id="getNotClaimAmount" parameterType="java.lang.Long" resultType="java.math.BigDecimal">

+ 2 - 1
dao/src/main/resources/mapper/MajorProductionMapper.xml

@@ -75,7 +75,8 @@
         mp.if_save_file,
         mp.file_path,
         m.`name` AS majorName,
-        mp.checked_file_path
+        mp.checked_file_path,
+        mp.validate_code
         FROM
             major_production mp
                 LEFT JOIN major m ON m.id = mp.major_id

+ 30 - 0
dao/src/main/resources/mapper/WorkFlowNodeInstanceMapper.xml

@@ -205,4 +205,34 @@
             AND wfi.business_min_id like concat ('%',#{productionNo},'%')
         </if>
     </select>
+
+    <select id="getInOutInstanceNode" parameterType="java.lang.String" resultType="map">
+        SELECT
+            wtr.id,
+            wfni.*
+        FROM
+            work_task_record wtr
+                LEFT JOIN work_node_task wnt ON wnt.id = wtr.task_id
+                inner JOIN (
+                SELECT
+                    wn.code,
+                    wfni.id as instanceId,
+                    wfni.business_id as businessId,
+                    wfni.business_sub_id as businessSubId,
+                    wfni.business_min_id as businessMinId,
+                    wfni.business_type as businessType
+                FROM
+                    work_flow_node_instance wfni
+                        LEFT JOIN work_node wn ON wn.id = wfni.node_id
+                WHERE
+                    wfni.state = 'PENDING'
+                  AND wfni.deleted = 0
+                  AND wn.deleted = 0
+            ) wfni ON wtr.instance_id = wfni.instanceId
+
+        WHERE
+            wnt.deleted = 0
+          AND wtr.deleted = 0 and wfni.code in ('STATEMENT_IN','STATEMENT_OUT','REPORT_IN','REPORT_OUT','LETTER_IN','LETTER_OUT')
+        and (wfni.businessSubId = #{productionNo} or wfni.businessMinId = #{productionNo})
+    </select>
 </mapper>

+ 4 - 1
domain/src/main/java/com/dayou/dto/WareHouseDTO.java

@@ -1,7 +1,9 @@
 package com.dayou.dto;
 
+import lombok.Builder;
 import lombok.Data;
 
+
 /**
  * 类说明:
  *
@@ -9,8 +11,9 @@ import lombok.Data;
  * @since: 2023/12/7
  * created with IntelliJ IDEA.
  */
+@Builder
 @Data
-public class WareHouseDTO {
+public class WareHouseDTO  {
 
     private String reportNo;
 

+ 1 - 0
domain/src/main/java/com/dayou/dto/WorkNodeCommit.java

@@ -4,6 +4,7 @@ import com.dayou.enums.ProductionEnum;
 import com.dayou.enums.workflow.NodeLogEnum;
 import com.github.liangbaika.validate.annations.AbcValidate;
 import com.github.liangbaika.validate.enums.Check;
+import lombok.Builder;
 import lombok.Data;
 
 import java.util.List;

+ 2 - 0
domain/src/main/java/com/dayou/entity/FinanceRealFund.java

@@ -94,5 +94,7 @@ public class FinanceRealFund extends BaseEntity {
     private String xStartDate;
     @TableField(exist = false)
     private String xEndDate;
+    @TableField(exist = false)
+    private Boolean notFinished;
 
 }

+ 5 - 0
domain/src/main/java/com/dayou/entity/PersonalTarget.java

@@ -116,6 +116,11 @@ public class PersonalTarget extends BaseEntity {
      */
     private String validateCode;
 
+    /**
+     * 出入库二维码路经
+     */
+    private String qrCode;
+
     @TableField(exist = false)
     private String bailorA;
     @TableField(exist = false)

+ 3 - 1
service/src/main/java/com/dayou/dyoa/DyoaHistoryServiceImpl.java

@@ -470,7 +470,9 @@ public class DyoaHistoryServiceImpl implements IDyoaHistoryService{
         orderFundService.updateBatchById(orderTotalAmount);
 
         //分配认领金额到产品收款表
-        List<OrderFund> majorOrderFund = orderTotalAmount.stream().filter(x -> x.getBusinessType().equals(MAJOR_BUSINESS.name())).collect(Collectors.toList());
+        List<OrderFund> majorOrderFund = orderTotalAmount.stream().filter(x ->
+                (x.getBusinessType().equals(MAJOR_BUSINESS.name())|| x.getBusinessType().equals(ASSET_BUSINESS.name())))
+                .collect(Collectors.toList());
         majorOrderFund.stream().forEach(x->{
             List<ProductionFund> prods = productionFundService.list(new LambdaQueryWrapper<ProductionFund>()
                     .eq(ProductionFund::getOrderFundId, x.getId()).select(ProductionFund::getProductionType));

+ 20 - 20
service/src/main/java/com/dayou/dyoa/task/FetchDyoaDataSchedule.java

@@ -14,24 +14,24 @@ public class FetchDyoaDataSchedule {
     private IDyoaHistoryService dyoaHistoryService;
 
 
-    //每天凌晨01:30触发
-    @Scheduled(cron = "0 30 1 * * ?")
-    public void syncRealAmountDate(){
-        dyoaHistoryService.fetchRealAmount();
-        log.info("同步实收款数据完成");
-    }
-
-    //每天凌晨02:00触发
-    @Scheduled(cron = "0 0 2 * * ?")
-    public void syncDyoaMajorDate(){
-        dyoaHistoryService.fetchDyoaMajorOrderProduction();
-        log.info("同步大中型数据完成");
-    }
-
-    //每天凌晨02:30触发
-    @Scheduled(cron = "0 30 2 * * ?")
-    public void syncDyoaPersonalDate(){
-        dyoaHistoryService.fetchDyoaPersonalOrder();
-        log.info("同步个贷数据完成");
-    }
+//    //每天凌晨01:30触发
+//    @Scheduled(cron = "0 30 1 * * ?")
+//    public void syncRealAmountDate(){
+//        dyoaHistoryService.fetchRealAmount();
+//        log.info("同步实收款数据完成");
+//    }
+//
+//    //每天凌晨02:00触发
+//    @Scheduled(cron = "0 0 2 * * ?")
+//    public void syncDyoaMajorDate(){
+//        dyoaHistoryService.fetchDyoaMajorOrderProduction();
+//        log.info("同步大中型数据完成");
+//    }
+//
+//    //每天凌晨02:30触发
+//    @Scheduled(cron = "0 30 2 * * ?")
+//    public void syncDyoaPersonalDate(){
+//        dyoaHistoryService.fetchDyoaPersonalOrder();
+//        log.info("同步个贷数据完成");
+//    }
 }

+ 2 - 0
service/src/main/java/com/dayou/service/IBusinessProductionService.java

@@ -19,4 +19,6 @@ public interface IBusinessProductionService{
     String doCreateValidateCode(MainBusinessEnum businessEnum,Long businessId,String reportNo);
 
     String doCreateNormalCode(String production,String reportNo);
+
+    Boolean inOutWareHouse(String productionNo);
 }

+ 158 - 4
service/src/main/java/com/dayou/service/impl/BusinessProductionServiceImpl.java

@@ -1,12 +1,27 @@
 package com.dayou.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.dayou.common.BaseEntity;
 import com.dayou.configuration.DfsConfig;
+import com.dayou.dto.AssetsProWareHouseDTO;
+import com.dayou.dto.TaskRecordDTO;
+import com.dayou.dto.WareHouseDTO;
+import com.dayou.dto.WorkNodeCommit;
+import com.dayou.entity.*;
 import com.dayou.enums.MainBusinessEnum;
+import com.dayou.enums.ProductionEnum;
+import com.dayou.enums.workflow.WorkflowNodeEnum;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.MajorProductionMapper;
 import com.dayou.mapper.PersonalTargetMapper;
-import com.dayou.service.IBusinessProductionService;
-import com.dayou.service.IPersonalTargetService;
+import com.dayou.mapper.WorkFlowNodeInstanceMapper;
+import com.dayou.service.*;
+import com.dayou.service.workflow.IWorkFlowNodeInstanceService;
+import com.dayou.service.workflow.IWorkFlowService;
+import com.dayou.service.workflow.IWorkTaskRecordService;
 import com.dayou.utils.FileUploadUtils;
 import com.dayou.utils.PersonalUtils;
 import com.dayou.utils.QRCodeUtil;
@@ -18,12 +33,18 @@ import org.springframework.context.ResourceLoaderAware;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.*;
+import java.time.LocalDateTime;
+import java.util.Map;
 
 import static com.dayou.common.Constants.PNG;
 import static com.dayou.common.Constants.PROD_VALIDATE_URI;
 import static com.dayou.enums.MainBusinessEnum.PERSONAL_BUSINESS;
+import static com.dayou.enums.ProductionEnum.*;
+import static com.dayou.enums.workflow.NodeLogEnum.PASS;
+import static com.dayou.enums.workflow.WorkflowNodeEnum.*;
 
 /**
  * 类说明:
@@ -46,6 +67,23 @@ public class BusinessProductionServiceImpl implements IBusinessProductionService
 
     @Autowired
     private DfsConfig dfsConfig;
+    @Autowired
+    private IMajorProductionService majorProductionService;
+
+    @Autowired
+    private WorkFlowNodeInstanceMapper workFlowNodeInstanceMapper;
+
+    @Autowired
+    private IPersonalProductionService personalProductionService;
+
+    @Autowired
+    private IAssetsProductionService assetsProductionService;
+
+    @Autowired
+    private IWorkFlowService workFlowService;
+
+    @Autowired
+    private IWorkTaskRecordService workTaskRecordService;
 
     @Override
     public void setResourceLoader(ResourceLoader resourceLoader) {
@@ -107,8 +145,7 @@ public class BusinessProductionServiceImpl implements IBusinessProductionService
             String baseDir = dfsConfig.getPath()+dfsConfig.getCode();
             String dateIndexFileName = FileUploadUtils.createDateIndexFileName(reportNo + PNG);
             File absoluteFile = FileUploadUtils.getAbsoluteFile(baseDir, dateIndexFileName);
-            String flog = production.substring(0, 1);
-            QRCodeUtil.write(reportNo+flog,200,absoluteFile);
+            QRCodeUtil.write(reportNo,200,absoluteFile);
             return dfsConfig.getDomain() + dfsConfig.getCode() + dateIndexFileName;
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -116,4 +153,121 @@ public class BusinessProductionServiceImpl implements IBusinessProductionService
             throw new RuntimeException(e);
         }
     }
+
+    @Transactional
+    @Override
+    public Boolean inOutWareHouse(String productionNo) {
+        if (StrUtil.isNotBlank(productionNo)){
+
+            Map<String,Object> nodeMap = workFlowNodeInstanceMapper.getInOutInstanceNode(productionNo);
+            if (CollectionUtil.isEmpty(nodeMap)){
+                ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该产品目前还不能进行出入库操作。");
+            }
+            MainBusinessEnum businessType = MainBusinessEnum.valueOf((String) nodeMap.get("businessType"));
+            Long businessId = (Long) nodeMap.get("businessId");
+            Long recodeId = (Long) nodeMap.get("id");
+            String code = (String) nodeMap.get("code");
+
+            //完成出库业务操作
+            Boolean doRet = doInOutWareHouse(businessType, businessId, recodeId, productionNo,code);
+
+            if (doRet){
+                //提交工作流节点
+                WorkNodeCommit workNodeCommit = new WorkNodeCommit();
+                workNodeCommit.setState(PASS);
+                workNodeCommit.setIfCheckTask(true);
+                workNodeCommit.setComments(code.contains("IN")?"入库":"出库");
+                workNodeCommit.setInstanceNodeId((Long) nodeMap.get("instanceId"));
+                workNodeCommit.setBusinessSubId((String) nodeMap.get("businessSubId"));
+                workNodeCommit.setBusinessMinId((String) nodeMap.get("businessMinId"));
+                return workFlowService.commit(workNodeCommit);
+            }
+
+        }
+        return Boolean.FALSE;
+    }
+
+    private Boolean doInOutWareHouse(MainBusinessEnum businessEnum,Long businessId,Long recordId,String productionNo,String code) {
+
+        Boolean doWareHouseRet = Boolean.FALSE;
+        switch (businessEnum){
+            case PERSONAL_BUSINESS:
+                TaskRecordDTO<PersonalProduction> taskRecord = new TaskRecordDTO<>();
+                taskRecord.setRecordId(recordId);
+                PersonalTarget personalTarget = personalTargetMapper.selectOne(new LambdaQueryWrapper<PersonalTarget>()
+                        .eq(PersonalTarget::getPersonalId, businessId)
+                        .select(BaseEntity::getId));
+                Long targetId = personalTarget.getId();
+                PersonalProduction production = new PersonalProduction();
+                production.setTargetId(targetId);
+                if (STATEMENT_IN.name().equals(code)){
+                    production.setProduction(STATEMENT.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryIn(taskRecord);
+                }else if (STATEMENT_OUT.name().equals(code)){
+                    production.setProduction(STATEMENT.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryOut(taskRecord);
+                }else if (REPORT_IN.name().equals(code)){
+                    production.setProduction(REPORT.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryIn(taskRecord);
+                }else if (REPORT_OUT.name().equals(code)){
+                    production.setProduction(REPORT.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryOut(taskRecord);
+                }else if (LETTER_IN.name().equals(code)){
+                    production.setProduction(LETTER.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryIn(taskRecord);
+                }else if (LETTER_OUT.name().equals(code)){
+                    production.setProduction(LETTER.name());
+                    taskRecord.setTaskData(production);
+                    doWareHouseRet = personalProductionService.repertoryOut(taskRecord);
+                }
+                break;
+            case MAJOR_BUSINESS:
+                TaskRecordDTO<WareHouseDTO> taskRecordDTO = new TaskRecordDTO<>();
+                taskRecordDTO.setRecordId(recordId);
+                MajorProduction mp = majorProductionService.getOne(new LambdaQueryWrapper<MajorProduction>()
+                        .select(BaseEntity::getId,MajorProduction::getProduction,MajorProduction::getRepertoryState)
+                        .eq(MajorProduction::getMajorId, businessId)
+                        .eq(MajorProduction::getReportNo, productionNo));
+                Long productionId = mp.getId();
+                String productionType = mp.getProduction();
+                Boolean state = mp.getRepertoryState()==null?Boolean.FALSE:Boolean.TRUE;
+                WareHouseDTO wareHouseDTO = WareHouseDTO.builder()
+                        .productionId(productionId)
+                        .productionType(productionType)
+                        .repertoryState(Boolean.FALSE)
+                        .repertoryState(state)
+                        .reportNo(productionNo).build();
+                taskRecordDTO.setTaskData(wareHouseDTO);
+                doWareHouseRet = majorProductionService.warehouse(taskRecordDTO);
+                break;
+            case ASSET_BUSINESS:
+                AssetsProduction ap = assetsProductionService.getOne(new LambdaQueryWrapper<AssetsProduction>()
+                        .select(BaseEntity::getId, AssetsProduction::getProductionType, AssetsProduction::getRepertoryState)
+                        .eq(AssetsProduction::getBusinessId, businessId)
+                        .eq(AssetsProduction::getProductionNo, productionNo));
+                Long id = ap.getId();
+                String pt = ap.getProductionType();
+                Boolean status = ap.getRepertoryState()==null?Boolean.FALSE:Boolean.TRUE;
+                AssetsProWareHouseDTO assetsProWareHouseDTO = new AssetsProWareHouseDTO();
+                assetsProWareHouseDTO.setBusinessId(businessId);
+                assetsProWareHouseDTO.setProductionId(id);
+                assetsProWareHouseDTO.setProductionType(pt);
+                assetsProWareHouseDTO.setRepertoryState(status);
+                assetsProWareHouseDTO.setProductionNo(productionNo);
+                doWareHouseRet = assetsProductionService.assetsProRepertory(assetsProWareHouseDTO);
+                break;
+        }
+        if (doWareHouseRet){
+            //完成任务
+            return workTaskRecordService.update(new LambdaUpdateWrapper<WorkTaskRecord>().set(WorkTaskRecord::getFinished, Boolean.TRUE)
+                    .set(WorkTaskRecord::getFinishTime, LocalDateTime.now()).eq(BaseEntity::getId, recordId));
+        }
+        return doWareHouseRet;
+
+    }
 }

+ 1 - 1
service/src/main/java/com/dayou/service/impl/MajorProductionServiceImpl.java

@@ -153,7 +153,7 @@ public class MajorProductionServiceImpl extends ServiceImpl<MajorProductionMappe
 
         }
 
-        //创建普通二维码
+        //创建出入库二维码
         taskData.setQrCode(businessProductionService.doCreateNormalCode(taskData.getProduction(),reportNo));
         taskData.setStandardAmount(productionFundService.calculateStandardAmount(taskData.getEvaluateAmount()));
         this.save(taskData);

+ 2 - 0
service/src/main/java/com/dayou/service/impl/PersonalServiceImpl.java

@@ -135,6 +135,8 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
         PersonalTarget pt = new PersonalTarget();
         pt.setPersonalId(personal.getId());
         pt.setLocation(personal.getLocation());
+        //生成出入库二维码
+        pt.setQrCode(businessProductionService.doCreateNormalCode(null,personal.getOrderId()));
         //生成验证二维码
         pt.setValidateCode(businessProductionService.doCreateValidateCode(PERSONAL_BUSINESS, personal.getId(), personal.getOrderId()));
         personalTargetService.save(pt);

+ 6 - 0
sql/update_sql.sql

@@ -622,7 +622,13 @@ ALTER TABLE assets MODIFY COLUMN dispense_benefit bit(1) NULL COMMENT '是否分
 ALTER TABLE assets MODIFY COLUMN terminal_clientele_type varchar(32) NULL COMMENT '终端客户类型(企业,个人)';
 
 
+/**
+    日期:2024-08-07
+    修改人:吴长林
+    未更新到test-env
+ */
 
+ALTER TABLE `personal_target` ADD qr_code varchar(255) NULL COMMENT '出入库二维码';