Explorar el Código

个贷口估接口&土地开票bug修复&大中型结算项目去重

wucl hace 3 meses
padre
commit
6adea733bc
Se han modificado 29 ficheros con 810 adiciones y 13 borrados
  1. 7 0
      biz-base/src/main/java/com/dayou/controller/DyoaController.java
  2. 4 3
      biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java
  3. 45 0
      biz-base/src/main/java/com/dayou/controller/PersonalFacePriceController.java
  4. 170 0
      common/src/main/java/com/dayou/utils/AddressUtil.java
  5. 5 4
      dao/src/main/java/com/dayou/mapper/DyoaHistoryMapper.java
  6. 2 0
      dao/src/main/java/com/dayou/mapper/DyoaRecordMapper.java
  7. 4 0
      dao/src/main/java/com/dayou/mapper/ExternalDyDataBaseMapper.java
  8. 13 0
      dao/src/main/java/com/dayou/mapper/PersonalFacePriceMapper.java
  9. 7 0
      dao/src/main/resources/mapper/DyoaHistoryMapper.xml
  10. 5 0
      dao/src/main/resources/mapper/DyoaRecordMapper.xml
  11. 6 0
      dao/src/main/resources/mapper/ExternalDyDataBaseMapper.xml
  12. 4 4
      dao/src/main/resources/mapper/FinanceRealFundMapper.xml
  13. 57 2
      dao/src/main/resources/mapper/PaymentCollectionMapper.xml
  14. 33 0
      dao/src/main/resources/mapper/PersonalFacePriceMapper.xml
  15. 55 0
      domain/src/main/java/com/dayou/dto/AddressDTO.java
  16. 5 0
      domain/src/main/java/com/dayou/dto/ItemAddFinanceInvoiceDTO.java
  17. 24 0
      domain/src/main/java/com/dayou/dto/PersonalFacePriceQueryDTO.java
  18. 21 0
      domain/src/main/java/com/dayou/dto/history/HisPersonalEntity.java
  19. 9 0
      domain/src/main/java/com/dayou/dto/history/PersonalValue.java
  20. 98 0
      domain/src/main/java/com/dayou/vo/DayouPersonalPriceVO.java
  21. 56 0
      service/src/main/java/com/dayou/dyoa/DyoaHistoryServiceImpl.java
  22. 2 0
      service/src/main/java/com/dayou/dyoa/IDyoaHistoryService.java
  23. 2 0
      service/src/main/java/com/dayou/service/IDyoaRecordService.java
  24. 16 0
      service/src/main/java/com/dayou/service/IExternalDyDataBaseService.java
  25. 23 0
      service/src/main/java/com/dayou/service/IPersonalFacePriceService.java
  26. 5 0
      service/src/main/java/com/dayou/service/impl/DyoaRecordServiceImpl.java
  27. 26 0
      service/src/main/java/com/dayou/service/impl/ExternalDyDataBaseServiceImpl.java
  28. 2 0
      service/src/main/java/com/dayou/service/impl/PersonalExampleServiceImpl.java
  29. 104 0
      service/src/main/java/com/dayou/service/impl/PersonalFacePriceServiceImpl.java

+ 7 - 0
biz-base/src/main/java/com/dayou/controller/DyoaController.java

@@ -159,4 +159,11 @@ public class DyoaController {
         Boolean ret = dyoaHistoryService.orderFundClientManagerId();
         return RestResponse.data(ret);
     }
+
+    @IgnoreAuth
+    @GetMapping("/update/personalEntityInfo")
+    public RestResponse<Boolean> personalEntityInfo(){
+        Boolean ret = dyoaHistoryService.personalEntityInfo();
+        return RestResponse.data(ret);
+    }
 }

+ 4 - 3
biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java

@@ -33,6 +33,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import javax.xml.crypto.dsig.keyinfo.RetrievalMethod;
 
+import static com.dayou.common.Constants.FINANCE_DEPARTMENT;
 import static com.dayou.common.Constants.MANAGER_OFFICE;
 
 /**
@@ -51,7 +52,7 @@ public class PaymentCollectionController extends BaseController {
     /**
     * 回款记录列表
     */
-    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE,FINANCE_DEPARTMENT})
     @GetMapping("")
     public RestResponse<Page<PaymentCollectionVO>> page(PaymentCollectionVO paymentCollection, Page page){
         Page<PaymentCollectionVO> pages=paymentCollectionService.selectPage(page,paymentCollection);
@@ -123,7 +124,7 @@ public class PaymentCollectionController extends BaseController {
      * 项目回款列表
      * @return
      */
-    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE,FINANCE_DEPARTMENT})
     @GetMapping("/item")
     public RestResponse<IPage<ItemPaymentVO>> getItemPayment(PaymentCollectionVO paymentCollectionVO,Page page){
         IPage<ItemPaymentVO> result = paymentCollectionService.getItemPayment(page,paymentCollectionVO);
@@ -133,7 +134,7 @@ public class PaymentCollectionController extends BaseController {
     /**
      * 项目回款导出
      */
-    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE})
+    @DataPermission(teamData = true,postChild = false,ignoreDepartment = {MANAGER_OFFICE,FINANCE_DEPARTMENT})
     @GetMapping("/item/export")
     public void exportData(PaymentCollectionVO paymentCollectionVO, HttpServletResponse response ) throws IOException {
         List<PaymentExportDTO> list = paymentCollectionService.getList(paymentCollectionVO);

+ 45 - 0
biz-base/src/main/java/com/dayou/controller/PersonalFacePriceController.java

@@ -0,0 +1,45 @@
+package com.dayou.controller;
+
+import com.dayou.common.RestResponse;
+import com.dayou.dto.PersonalFacePriceQueryDTO;
+import com.dayou.service.IPersonalFacePriceService;
+import com.dayou.vo.DayouPersonalPriceVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 个贷口估
+ */
+@RestController
+@RequestMapping("personalFacePrice")
+@Slf4j
+public class PersonalFacePriceController extends BaseController {
+
+    @Autowired
+    private IPersonalFacePriceService personalFacePriceService;
+
+    /**
+     * 查询大友个贷历史评估价格
+     * @param facePriceQuery
+     * @return
+     */
+    @PostMapping("/dy/price")
+    public RestResponse<List<DayouPersonalPriceVO>> dayouPersonalPrice(@RequestBody PersonalFacePriceQueryDTO facePriceQuery) {
+        List<DayouPersonalPriceVO> ret = personalFacePriceService.dayouPersonalPrice(facePriceQuery);
+        return RestResponse.success(ret);
+    }
+
+    /**
+     * 查询外部数据价格
+     * @param facePriceQuery
+     * @return
+     */
+    @PostMapping("/external/price")
+    public RestResponse<List<DayouPersonalPriceVO>> externalPersonalPrice(@RequestBody PersonalFacePriceQueryDTO facePriceQuery) {
+        List<DayouPersonalPriceVO> ret = personalFacePriceService.externalPersonalPrice(facePriceQuery);
+        return RestResponse.success(ret);
+    }
+}

+ 170 - 0
common/src/main/java/com/dayou/utils/AddressUtil.java

@@ -0,0 +1,170 @@
+package com.dayou.utils;
+
+import cn.hutool.core.util.StrUtil;
+import com.dayou.dto.AddressDTO;
+import com.dayou.exception.ErrorCode;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AddressUtil {
+
+    private static final Pattern PROVINCE_PATTERN = Pattern.compile("(?<province>.+省|.+自治区)");
+    private static final Pattern CITY_PATTERN = Pattern.compile("(?<city>.+市|.+自治州|.+盟)");
+    private static final Pattern DISTRICT_PATTERN = Pattern.compile("(?<district>.+区|.+县|.+旗)");
+    private static final Pattern TOWN_PATTERN = Pattern.compile("(?<town>.+街道|.+镇|.+乡)");
+    private static final Pattern COMMUNITY_PATTERN = Pattern.compile("(?<community>.+社区|.+园区|.+村)");
+    private static final Pattern ROAD_PATTERN = Pattern.compile("(?<road>.+路.+?段|.+路|.+巷|.+?街.+?段|.+?街|.+?道.+?段)");
+    private static final Pattern ROAD_NUMBER_PATTERN = Pattern.compile("(?<roadNumber>\\d+号附\\d+号|\\d+号)");
+    private static final Pattern BUILDING_PATTERN = Pattern.compile("(?<building>\\d+楼|\\d+栋|\\d+幢)");
+    private static final Pattern UNIT_PATTERN = Pattern.compile("(?<unit>\\d+单元)");
+    private static final Pattern FLOOR_PATTERN = Pattern.compile("(?<floor>-?\\d+层|-?\\d+楼)");
+    private static final Pattern ROOM_PATTERN = Pattern.compile("(?<room>\\d+室\\d+号|\\d+室|\\d+号)");
+
+    private static final String SQ = "社区";
+
+    private static final String YQ = "园区";
+    /**
+     *
+     * @param address 地址字符串
+     * @return 标准地址对象
+     */
+    public static AddressDTO parseAddress(String address) {
+        AddressDTO result = new AddressDTO();
+        address = address.replaceAll(SQ,"").replaceAll(YQ,"");
+        // 依次匹配每个级别的地址部分,并从剩余字符串中继续解析
+        String remaining = address;
+        result.setProvince(extractAndRemove(PROVINCE_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getProvince());
+
+        result.setCity(extractAndRemove(CITY_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getCity());
+
+        result.setDistrict(extractAndRemove(DISTRICT_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getDistrict());
+
+        result.setTown(extractAndRemove(TOWN_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getTown());
+
+//        result.setCommunity(extractAndRemove(COMMUNITY_PATTERN, remaining));
+//        remaining = removePrefix(remaining, result.getCommunity());
+
+        result.setRoad(extractAndRemove(ROAD_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoad());
+
+        result.setRoadNumber(extractAndRemove(ROAD_NUMBER_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoadNumber());
+
+        result.setBuilding(extractAndRemove(BUILDING_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getBuilding());
+
+        result.setUnit(extractAndRemove(UNIT_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getUnit());
+
+        result.setFloor(extractAndRemove(FLOOR_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getFloor());
+
+        result.setRoom(extractAndRemove(ROOM_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoom());
+
+        return result;
+    }
+
+    private static String extractAndRemove(Pattern pattern, String input) {
+        Matcher matcher = pattern.matcher(input);
+        if (matcher.find()) {
+            return matcher.group().trim();
+        }
+        return "";
+    }
+
+    private static String removePrefix(String input, String prefix) {
+        if (prefix == null || input == null) {
+            return input;
+        }
+        return input.replaceFirst(Pattern.quote(prefix), "").trim();
+    }
+
+    /**
+     * 获取到路号的全地址
+     * @param address
+     * @return
+     */
+    public static String getRoadNumberAddress(String address) {
+        if (StrUtil.isNotBlank(address)) {
+            AddressDTO addressDTO = parseAddress(address);
+            return new StringBuffer().append(addressDTO.getProvince()!=null?addressDTO.getProvince():"")
+                    .append(addressDTO.getCity()!=null?addressDTO.getCity():"")
+                    .append(addressDTO.getDistrict()!=null?addressDTO.getDistrict():"")
+                    .append(addressDTO.getTown()!=null?addressDTO.getTown():"")
+                    .append(addressDTO.getCommunity()!=null?addressDTO.getCommunity():"")
+                    .append(addressDTO.getRoad()!=null?addressDTO.getRoad():"")
+                    .append(addressDTO.getRoadNumber()!=null?addressDTO.getRoadNumber():"").toString();
+        }else {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"地址为空");
+            return null;
+        }
+
+    }
+
+    /**
+     * 获取道路名字和路号
+     * @param address
+     * @return
+     */
+    public static String getRoadAndRoadNumber(String address) {
+        if (StrUtil.isNotBlank(address)) {
+            AddressDTO addressDTO = parseAddress(address);
+            String road = addressDTO.getRoad();
+            if (StrUtil.isNotBlank(road)) {
+                if (StrUtil.isNotBlank(addressDTO.getRoadNumber())) {
+                    return new StringBuilder(road).append(addressDTO.getRoadNumber()).toString();
+                }
+                return road;
+            }else {
+                return "";
+            }
+        }else {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"地址为空");
+            return null;
+        }
+    }
+
+    /**
+     * 尝试从地址中解析出小区名字
+     * @param address
+     * @return
+     */
+    public static String getCommunityNameFromAddress(String address) {
+        try {
+            String roadAndRoadNumber = getRoadAndRoadNumber(address);
+            if (StrUtil.isNotBlank(roadAndRoadNumber)) {
+                AddressDTO addressDTO = parseAddress(address);
+                String building = addressDTO.getBuilding();
+                if (StrUtil.isNotBlank(building)) {
+                    String communityName = address.split(roadAndRoadNumber)[1].split(building)[0];
+                    if (StrUtil.isNotBlank(communityName)) {
+                        return communityName;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"小区名称解析失败");
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        String location = "成都市天府新区万安镇麓山大道二段20号附9号麓山国际社区3栋2单元2层3号住宅";
+        //String location = "成都市天府新区万安镇麓山大道二段20号附9号麓山国际3栋2单元2层3号住宅";
+        AddressDTO addressDTO = AddressUtil.parseAddress(location);
+        String roadAndRoadNumber = AddressUtil.getRoadAndRoadNumber(location);
+        System.out.println(roadAndRoadNumber);
+        System.out.println(addressDTO);
+        String communityNameFromAddress = getCommunityNameFromAddress(location);
+        System.out.println(communityNameFromAddress);
+    }
+}

+ 5 - 4
dao/src/main/java/com/dayou/mapper/DyoaHistoryMapper.java

@@ -1,10 +1,7 @@
 package com.dayou.mapper;
 
 import cn.hutool.core.date.DateTime;
-import com.dayou.dto.history.CommissionRate;
-import com.dayou.dto.history.HisAssetsProduction;
-import com.dayou.dto.history.HisCommissionDeclare;
-import com.dayou.dto.history.HisMajorProduction;
+import com.dayou.dto.history.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -61,4 +58,8 @@ public interface DyoaHistoryMapper {
 
 
     Map<String, Object> getMembersAndSigner(@Param("id") String id);
+
+    HisPersonalEntity getEntityInfo(@Param("dyoaId") String dyoaId);
+
+    String getDecoration(@Param("dyoaId") String dyoaId);
 }

+ 2 - 0
dao/src/main/java/com/dayou/mapper/DyoaRecordMapper.java

@@ -50,4 +50,6 @@ public interface DyoaRecordMapper extends CustomBaseMapper<DyoaRecord> {
     Long getMbsRealAmountId(@Param("incomeId")String incomeId, @Param("name")String name);
 
     String getMembersAndSignerInDyoa(@Param("id") Long id);
+
+    String getDyoaIdByMbsPersonalId(@Param("personalId") Long personalId);
 }

+ 4 - 0
dao/src/main/java/com/dayou/mapper/ExternalDyDataBaseMapper.java

@@ -0,0 +1,4 @@
+package com.dayou.mapper;
+
+public interface ExternalDyDataBaseMapper {
+}

+ 13 - 0
dao/src/main/java/com/dayou/mapper/PersonalFacePriceMapper.java

@@ -0,0 +1,13 @@
+package com.dayou.mapper;
+
+import com.dayou.vo.DayouPersonalPriceVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface PersonalFacePriceMapper {
+
+    List<DayouPersonalPriceVO> queryByFuzzyAddress(@Param("address") String roadNumberAddress, @Param("valueTiming") Date startDate);
+
+}

+ 7 - 0
dao/src/main/resources/mapper/DyoaHistoryMapper.xml

@@ -491,4 +491,11 @@
         select members,signEmpName1,signEmpName2 from dy_assets where id = #{id}
     </select>
 
+    <select id="getEntityInfo" parameterType="java.lang.String" resultType="com.dayou.dto.history.HisPersonalEntity">
+        select name,householdType,houseType,floor,totalFloor,loanOrderId as dyoaId from dy_order_loan_swzk where id = (select swzkId from dy_order_loan where id = #{dyoaId})
+    </select>
+
+    <select id="getDecoration" parameterType="java.lang.String" resultType="java.lang.String">
+        select decoration from dy_order_loan_kbsl where id = (select kbslId from dy_order_loan where id = #{dyoaId})
+    </select>
 </mapper>

+ 5 - 0
dao/src/main/resources/mapper/DyoaRecordMapper.xml

@@ -113,4 +113,9 @@
         select dyoa_id from dyoa_record where mbs_type = 'ASSETS_ORDER' and mbs_id = #{id} and deleted = 0
     </select>
 
+    <select id="getDyoaIdByMbsPersonalId" parameterType="java.lang.Long" resultType="java.lang.String">
+        select dyoa_id from dyoa_record where deleted = 0 and mbs_type = 'PERSONAL_ORDER' and mbs_id = #{personalId}
+    </select>
+
+
 </mapper>

+ 6 - 0
dao/src/main/resources/mapper/ExternalDyDataBaseMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.ExternalDyDataBaseMapper">
+
+
+</mapper>

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

@@ -427,7 +427,7 @@
             AND pay_datetime &lt;= #{settleVO.payEndDate}
         </if>
         ) frf ON frf.id = fc.real_fund_id
-        INNER JOIN ( SELECT id, order_fund_id, business_id, production_no FROM production_fund WHERE business_type = 'MAJOR_BUSINESS' AND deleted = 0 ) pf ON ( pf.id = fc.production_fund_id AND pf.order_fund_id = fc.order_fund_id )
+        INNER JOIN ( SELECT id, order_fund_id, business_id, production_no ,production_type FROM production_fund WHERE business_type = 'MAJOR_BUSINESS' AND deleted = 0 ) pf ON ( pf.id = fc.production_fund_id AND pf.order_fund_id = fc.order_fund_id )
         INNER JOIN (
         SELECT
         id,
@@ -444,7 +444,7 @@
         WHERE
         fund.real_amount IS NOT NULL
         AND mpr.save_file_date IS NOT NULL
-        ) mp ON (mp.report_no = pf.production_no and mp.major_id = pf.business_id )
+        ) mp ON (mp.report_no = pf.production_no and mp.major_id = pf.business_id and mp.production = pf.production_type)
         LEFT JOIN major m ON m.id = mp.major_id
         LEFT JOIN user u ON u.id = m.principal_id
         LEFT JOIN user u1 ON u1.id = m.client_manager_id
@@ -537,7 +537,7 @@
             AND pay_datetime &lt;= #{settleVO.payEndDate}
         </if>
         ) frf ON frf.id = fc.real_fund_id
-        INNER JOIN ( SELECT id, order_fund_id, business_id, production_no FROM production_fund WHERE business_type = 'MAJOR_BUSINESS' AND deleted = 0 ) pf ON ( pf.id = fc.production_fund_id AND pf.order_fund_id = fc.order_fund_id )
+        INNER JOIN ( SELECT id, order_fund_id, business_id, production_no ,production_type FROM production_fund WHERE business_type = 'MAJOR_BUSINESS' AND deleted = 0 ) pf ON ( pf.id = fc.production_fund_id AND pf.order_fund_id = fc.order_fund_id )
         INNER JOIN (
         SELECT
         id,
@@ -554,7 +554,7 @@
         WHERE
         fund.real_amount IS NOT NULL
         AND mpr.delivery_date IS NOT NULL
-        ) mp ON (mp.report_no = pf.production_no and mp.major_id = pf.business_id )
+        ) mp ON (mp.report_no = pf.production_no and mp.major_id = pf.business_id and mp.production = pf.production_type )
         LEFT JOIN major m ON m.id = mp.major_id
         LEFT JOIN user u ON u.id = m.principal_id
         LEFT JOIN user u1 ON u1.id = m.client_manager_id

+ 57 - 2
dao/src/main/resources/mapper/PaymentCollectionMapper.xml

@@ -33,7 +33,7 @@
         i.client_name,
         i.client_manager,
         i.skiller,
-        pc.id,
+        fc.id as id,
         pc.deleted,
         pc.created,
         pc.modified,
@@ -89,7 +89,62 @@
         <if test="dto!=null and dto.startDate!=null and dto.endDate!=null">
             AND fc.claim_datetime BETWEEN #{dto.startDate} AND #{dto.endDate}
         </if>
-        order by fc.claim_datetime DESC
+        union
+        select
+        m.name  as itemName,
+        m.order_id as business_no,
+        m.business_object_type as cateName,
+        (select name from customer_company where terminal = 0 and level = 1 and id = m.clientele_sub_id) as businessSource,
+        m.bailor as client_unit,
+        (select name from customer_company where terminal = 0 and level = 0 and id = m.clientele_id) as client_name,
+        u.name as client_manager,
+        u1.name as skiller,
+        fc.id as id,
+        fc.deleted,
+        fc.created,
+        fc.modified,
+        m.id as item_id,
+        m.NAME as name,
+        fc.claim_datetime as payment_date,
+        fc.claim_amount,
+        fc.claim_datetime ,
+        frf.payer,
+        frf.pay_datetime,
+        u2.name as claimUser
+        from (select id,client_manager_id, principal_id,name,order_id,business_object_type,clientele_sub_id,clientele_id,created,bailor,deleted from major where financial is null and deleted = 0) m
+        left join (select id,business_id,real_amount from order_fund where business_type='MAJOR_BUSINESS' AND deleted = 0) off on off.business_id = m.id
+        left join user u on u.id = m.client_manager_id
+        left join user u1 on u1.id = m.principal_id
+        left join finance_claim fc on fc.order_fund_id = off.id
+        left join finance_real_fund frf on frf.id = fc.real_fund_id
+        left join user u2 on u2.id = fc.claim_user_id
+        where m.deleted = 0
+        <if test="dto!=null and dto.isCurYear!=null and dto.isCurYear==true">
+            AND fc.claim_datetime &gt;= concat( YEAR ( now())- 1, '-12-23' )
+            AND fc.claim_datetime &lt;= concat( YEAR ( now()), '-12-22' )
+        </if>
+        <if test="dto!=null and dto.isCurMonth!=null and dto.isCurMonth==true">
+            AND fc.claim_datetime &gt;= #{dto.lastMonth23}
+            AND fc.claim_datetime &lt;= concat( date_format( LAST_DAY( now()), '%Y-%m-' ), '22' )
+        </if>
+        <if test="dto!=null and dto.year!=null">
+            and DATE_FORMAT(fc.claim_datetime,'%Y') = #{dto.year}
+        </if>
+        <if test="dto!=null and dto.month!=null">
+            and DATE_FORMAT(fc.claim_datetime,'%c') = #{dto.month}
+        </if>
+        <if test="dto!=null and dto.startDate!=null and dto.endDate!=null">
+            AND fc.claim_datetime BETWEEN #{dto.startDate} AND #{dto.endDate}
+        </if>
+        <if test="dto!=null and dto.userIds!=null and dto.userIds.size!=0">
+            and m.client_manager_id in
+            <foreach collection="dto.userIds" open="(" close=")" separator="," item="userId">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="dto!=null and dto.itemName!=null and dto.itemName!=''">
+            and m.name like concat ('%',#{dto.itemName},'%')
+        </if>
     </sql>
 
     <select id="page" parameterType="com.dayou.vo.PaymentCollectionVO" resultType="com.dayou.vo.PaymentCollectionVO">

+ 33 - 0
dao/src/main/resources/mapper/PersonalFacePriceMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.PersonalFacePriceMapper">
+
+    <select id="queryByFuzzyAddress" resultType="com.dayou.vo.DayouPersonalPriceVO">
+        select * from (SELECT
+                           id as targetId,
+                           personal_id,
+                           location,
+                           acreage,
+                           amount,
+                           price ,
+                           JSON_UNQUOTE(JSON_EXTRACT(entity_info,'$.atFloor')) as atFloor,
+                           JSON_UNQUOTE(JSON_EXTRACT(entity_info,'$.allFloor')) as allFloor,
+                           JSON_UNQUOTE(JSON_EXTRACT(entity_info,'$.buildingType')) as buildingType,
+                           JSON_UNQUOTE(JSON_EXTRACT(entity_info,'$.houseType')) as houseType
+                       FROM
+                           personal_target
+                       WHERE
+                           amount is not null and
+                           location LIKE CONCAT('%',#{address},'%') and deleted = 0 ) pt left join
+                      (select JSON_UNQUOTE(JSON_EXTRACT(location,'$.valueA')) as communityName,
+                              JSON_UNQUOTE(JSON_EXTRACT(decoration,'$.valueA')) as decoration,
+                              target_id as tid
+                       from personal_example where is_example =0 and deleted =0) pe on pe.tid = pt.targetId
+            left join (select id,DATE_FORMAT(created,'%Y-%m-%d') as valueTiming ,created from personal ) p on p.id = pt.personal_id
+        where p.created &gt;= #{valueTiming}
+        order by p.created DESC
+        limit 0,10
+    </select>
+
+
+</mapper>

+ 55 - 0
domain/src/main/java/com/dayou/dto/AddressDTO.java

@@ -0,0 +1,55 @@
+package com.dayou.dto;
+
+import lombok.Data;
+
+/**
+ * 标准地址对象
+ */
+@Data
+public class AddressDTO {
+
+    /**
+     * 省、自治区、省级市
+     */
+    private String province;
+    /**
+     * 地级市、自治州
+     */
+    private String city;
+    /**
+     * 区、县、旗
+     */
+    private String district;
+    /**
+     * 街道、乡、镇
+     */
+    private String town;
+    /**
+     * 社区、村
+     */
+    private String community;
+    /**
+     * 路、街、段、巷
+     */
+    private String road;
+    /**
+     * 路号
+     */
+    private String roadNumber;
+    /**
+     * 栋、幢、楼
+     */
+    private String building;
+    /**
+     * 单元
+     */
+    private String unit;
+    /**
+     * 层
+     */
+    private String floor;
+    /**
+     * 室、号
+     */
+    private String room;
+}

+ 5 - 0
domain/src/main/java/com/dayou/dto/ItemAddFinanceInvoiceDTO.java

@@ -136,4 +136,9 @@ public class ItemAddFinanceInvoiceDTO {
      */
     private Long itemId;
 
+    /**
+     * 备注
+     */
+    private String remark;
+
 }

+ 24 - 0
domain/src/main/java/com/dayou/dto/PersonalFacePriceQueryDTO.java

@@ -0,0 +1,24 @@
+package com.dayou.dto;
+
+import com.github.liangbaika.validate.annations.AbcValidate;
+import com.github.liangbaika.validate.enums.Check;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class PersonalFacePriceQueryDTO {
+
+    /**
+     * 口估地址
+     */
+    @AbcValidate(required = true,message = "房屋坐落不能为空" , fun = Check.NotEmpty)
+    private String location;
+
+    /**
+     * 面积
+     */
+    private BigDecimal acreage;
+
+}

+ 21 - 0
domain/src/main/java/com/dayou/dto/history/HisPersonalEntity.java

@@ -0,0 +1,21 @@
+package com.dayou.dto.history;
+
+import lombok.Data;
+
+@Data
+public class HisPersonalEntity {
+
+    private String dyoaId;
+
+    private String houseType;
+
+    private String totalFloor;
+
+    private String floor;
+
+    private String houseHoldType;
+
+    private String name;
+
+    private String decoration;
+}

+ 9 - 0
domain/src/main/java/com/dayou/dto/history/PersonalValue.java

@@ -0,0 +1,9 @@
+package com.dayou.dto.history;
+
+import lombok.Data;
+
+@Data
+public class PersonalValue {
+
+    private String valueA;
+}

+ 98 - 0
domain/src/main/java/com/dayou/vo/DayouPersonalPriceVO.java

@@ -0,0 +1,98 @@
+package com.dayou.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 大友个贷评估数据VO
+ */
+@Data
+public class DayouPersonalPriceVO implements Comparable<DayouPersonalPriceVO> {
+
+    /**
+     * 估价对象id
+     */
+    private Long targetId;
+
+    /**
+     * 订单号
+     */
+    private String orderId;
+
+    /**
+     * 坐落
+     */
+    private String location;
+
+    /**
+     * 小区名称
+     */
+    private String communityName;
+
+    /**
+     * 价值时点
+     */
+    private Date valueTiming;
+
+    /**
+     * 评估单价
+     */
+    private BigDecimal price;
+
+    /**
+     * 评估面积
+     */
+    private BigDecimal acreage;
+
+    /**
+     * 评估总价
+     */
+    private BigDecimal amount;
+
+    /**
+     * 所在楼层
+     */
+    private String atFloor;
+
+    /**
+     * 房屋类型
+     */
+    private String buildingType;
+
+    /**
+     * 户型
+     */
+    private String houseType;
+
+    /**
+     * 装修情况
+     */
+    private String decoration;
+
+    /**
+     * 匹配类型
+     */
+    private String matching;
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DayouPersonalPriceVO that = (DayouPersonalPriceVO) o;
+        return Objects.equals(targetId, that.targetId) ;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(targetId, orderId, location, communityName, valueTiming, price, acreage, amount, atFloor, buildingType, houseType, decoration);
+    }
+
+
+    @Override
+    public int compareTo(DayouPersonalPriceVO o) {
+        return o.getValueTiming().compareTo(this.getValueTiming());
+    }
+}

+ 56 - 0
service/src/main/java/com/dayou/dyoa/DyoaHistoryServiceImpl.java

@@ -31,6 +31,7 @@ import com.dayou.service.impl.PersonalProductionServiceImpl;
 import com.dayou.service.workflow.IWorkFlowNodeInstanceService;
 import com.dayou.utils.DateUtils;
 import com.dayou.utils.HttpKit;
+import com.dayou.vo.PersonalEntityInfoVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
@@ -166,6 +167,10 @@ public class DyoaHistoryServiceImpl implements IDyoaHistoryService{
     @Autowired
     private ICommissionDeclareService commissionDeclareService;
 
+    @Autowired
+    private IPersonalExampleService personalExampleService;
+
+
     static {
 //        MAJOR_ORDER_COLUM.put("id","id");
         MAJOR_ORDER_COLUM.put("name","name");
@@ -2129,6 +2134,57 @@ public class DyoaHistoryServiceImpl implements IDyoaHistoryService{
         return true;
     }
 
+    @Override
+    public Boolean personalEntityInfo() {
+        List<PersonalTarget> list = personalTargetService.list(new LambdaQueryWrapper<PersonalTarget>()
+                .isNull(PersonalTarget::getEntityInfo).le(BaseEntity::getCreated, "2025-01-01 00:00:00")
+                .select(PersonalTarget::getPersonalId,BaseEntity::getId).eq(BaseEntity::getDeleted, Boolean.FALSE).orderByDesc(BaseEntity::getCreated));
+        for (PersonalTarget personalTarget : list){
+            Long personalId = personalTarget.getPersonalId();
+            String dyoaId = dyoaRecordService.getDyoaIdByMbsPersonalId(personalId);
+            if (StrUtil.isNotBlank(dyoaId)){
+                HisPersonalEntity hisPersonalEntity = dyoaHistoryMapper.getEntityInfo(dyoaId);
+                if (hisPersonalEntity!=null){
+                    String decoration = dyoaHistoryMapper.getDecoration(dyoaId);
+                    hisPersonalEntity.setDecoration(decoration);
+
+                    PersonalEntityInfoVO personalEntityInfoVO = new PersonalEntityInfoVO();
+
+                    personalEntityInfoVO.setAllFloor(hisPersonalEntity.getTotalFloor());
+                    personalEntityInfoVO.setAtFloor(hisPersonalEntity.getFloor());
+                    personalEntityInfoVO.setBuildingType(hisPersonalEntity.getHouseType());
+                    personalEntityInfoVO.setHouseType(hisPersonalEntity.getHouseHoldType());
+                    personalEntityInfoVO.setId(personalTarget.getId());
+
+                    personalTargetService.update(new LambdaUpdateWrapper<PersonalTarget>()
+                            .set(PersonalTarget::getEntityInfo,JSON.toJSONString(personalEntityInfoVO))
+                            .eq(BaseEntity::getId,personalTarget.getId()));
+
+                    PersonalExample personalExample = new PersonalExample();
+                    personalExample.setTargetId(personalTarget.getId());
+                    personalExample.setIsExample(Boolean.FALSE);
+                    PersonalValue locaton = new PersonalValue();
+                    locaton.setValueA(hisPersonalEntity.getName());
+                    personalExample.setLocation(JSON.toJSONString(locaton));
+                    PersonalValue decorationx = new PersonalValue();
+                    decorationx.setValueA(hisPersonalEntity.getDecoration());
+                    personalExample.setDecoration(JSON.toJSONString(decorationx));
+                    personalExample.setMarketInfo(JSON.toJSONString(new PersonalValue()));
+                    personalExample.setAcreage(JSON.toJSONString(new PersonalValue()));
+                    personalExample.setAtFloor(JSON.toJSONString(new PersonalValue()));
+                    personalExample.setHouseType(JSON.toJSONString(new PersonalValue()));
+
+
+                    personalExampleService.save(personalExample);
+                }
+
+            }
+
+        }
+        return true;
+    }
+
+
 
     @Override
     public Boolean updateProductionFund() {

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

@@ -61,4 +61,6 @@ public interface IDyoaHistoryService {
     Boolean assetsMarketDepartment();
 
     Boolean orderFundClientManagerId();
+
+    Boolean personalEntityInfo();
 }

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

@@ -53,5 +53,7 @@ public interface IDyoaRecordService extends IService<DyoaRecord> {
     Long getMbsRealAmountId(String incomeId, String name);
 
     String getMembersAndSignerInDyoa(Long id);
+
+    String getDyoaIdByMbsPersonalId(Long personalId);
 }
 

+ 16 - 0
service/src/main/java/com/dayou/service/IExternalDyDataBaseService.java

@@ -0,0 +1,16 @@
+package com.dayou.service;
+
+import com.dayou.dto.PersonalFacePriceQueryDTO;
+import com.dayou.vo.DayouPersonalPriceVO;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 个贷外部数据源 服务接口
+ */
+public interface IExternalDyDataBaseService {
+
+    List<DayouPersonalPriceVO> externalPrice(PersonalFacePriceQueryDTO facePriceQuery,Date startDate);
+
+}

+ 23 - 0
service/src/main/java/com/dayou/service/IPersonalFacePriceService.java

@@ -0,0 +1,23 @@
+package com.dayou.service;
+
+import com.dayou.dto.PersonalFacePriceQueryDTO;
+import com.dayou.vo.DayouPersonalPriceVO;
+
+import java.util.List;
+
+public interface IPersonalFacePriceService {
+
+    /**
+     * 大友个贷评估价
+     * @param facePriceQuery
+     * @return
+     */
+    List<DayouPersonalPriceVO> dayouPersonalPrice(PersonalFacePriceQueryDTO facePriceQuery);
+
+    /**
+     * 外部数据价格
+     * @param facePriceQuery
+     * @return
+     */
+    List<DayouPersonalPriceVO> externalPersonalPrice(PersonalFacePriceQueryDTO facePriceQuery);
+}

+ 5 - 0
service/src/main/java/com/dayou/service/impl/DyoaRecordServiceImpl.java

@@ -124,5 +124,10 @@ public class DyoaRecordServiceImpl extends ServiceImpl<DyoaRecordMapper, DyoaRec
         return dyoaRecordMapper.getMembersAndSignerInDyoa(id);
     }
 
+    @Override
+    public String getDyoaIdByMbsPersonalId(Long personalId) {
+        return dyoaRecordMapper.getDyoaIdByMbsPersonalId(personalId);
+    }
+
 
 }

+ 26 - 0
service/src/main/java/com/dayou/service/impl/ExternalDyDataBaseServiceImpl.java

@@ -0,0 +1,26 @@
+package com.dayou.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.dayou.dto.PersonalFacePriceQueryDTO;
+import com.dayou.mapper.ExternalDyDataBaseMapper;
+import com.dayou.service.IExternalDyDataBaseService;
+import com.dayou.vo.DayouPersonalPriceVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+@DS("dydb")
+@Service
+public class ExternalDyDataBaseServiceImpl implements IExternalDyDataBaseService {
+
+    @Autowired
+    private ExternalDyDataBaseMapper externalDyDataBaseMapper;
+
+    @Override
+    public List<DayouPersonalPriceVO> externalPrice(PersonalFacePriceQueryDTO facePriceQuery, Date startDate) {
+        return Collections.emptyList();
+    }
+}

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

@@ -1,5 +1,6 @@
 package com.dayou.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import com.dayou.entity.PersonalExample;
 import com.dayou.mapper.PersonalExampleMapper;
 import com.dayou.service.IPersonalExampleService;
@@ -32,6 +33,7 @@ import com.dayou.enums.BatchTaskTypeEnum;
  * @author wucl
  * @since 2024-03-01
  */
+@DS("mbs")
 @Service
 public class PersonalExampleServiceImpl extends ServiceImpl<PersonalExampleMapper, PersonalExample> implements IPersonalExampleService {
 

+ 104 - 0
service/src/main/java/com/dayou/service/impl/PersonalFacePriceServiceImpl.java

@@ -0,0 +1,104 @@
+package com.dayou.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.dayou.dto.AddressDTO;
+import com.dayou.dto.PersonalFacePriceQueryDTO;
+import com.dayou.mapper.PersonalFacePriceMapper;
+import com.dayou.service.IExternalDyDataBaseService;
+import com.dayou.service.IPersonalFacePriceService;
+import com.dayou.utils.AddressUtil;
+import com.dayou.utils.DateUtils;
+import com.dayou.vo.DayouPersonalPriceVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class PersonalFacePriceServiceImpl implements IPersonalFacePriceService {
+
+    @Autowired
+    private PersonalFacePriceMapper personalFacePriceMapper;
+
+    @Autowired
+    private IExternalDyDataBaseService externalDyDataBaseService;
+
+    @Override
+    public List<DayouPersonalPriceVO> dayouPersonalPrice(PersonalFacePriceQueryDTO facePriceQuery) {
+        //获取配置的价值点范围
+        Date startDate = DateUtils.addYears(new Date(),-1);
+        //查询策略1:全地址查询
+        String location = facePriceQuery.getLocation();
+        AddressDTO targetAddress = AddressUtil.parseAddress(location);
+        String roadNumberAddress = AddressUtil.getRoadNumberAddress(location);
+        List<DayouPersonalPriceVO> byRoadNumberResult = personalFacePriceMapper.queryByFuzzyAddress(roadNumberAddress,startDate);
+        byRoadNumberResult.stream().forEach(x->x.setMatching("全地址匹配"));
+
+        //查询策略2:路名路号查询
+        List<DayouPersonalPriceVO> byRoadNameNumberResult = new ArrayList<>();
+        String roadAndRoadNumber = AddressUtil.getRoadAndRoadNumber(location);
+        if (StrUtil.isNotBlank(roadAndRoadNumber)){
+            byRoadNameNumberResult = personalFacePriceMapper.queryByFuzzyAddress(roadAndRoadNumber,startDate);
+            filterByCityAndDistrict(byRoadNameNumberResult,targetAddress);
+        }
+        byRoadNameNumberResult.stream().forEach(x->x.setMatching("路名路号匹配"));
+
+
+        //查询策略3:尝试用小区名字查询
+        List<DayouPersonalPriceVO> byCommunityNameResult = new ArrayList<>();
+        String communityNameFromAddress = AddressUtil.getCommunityNameFromAddress(location);
+        if (StrUtil.isNotBlank(communityNameFromAddress)){
+            byCommunityNameResult = personalFacePriceMapper.queryByFuzzyAddress(communityNameFromAddress,startDate);
+            filterByCityAndDistrict(byCommunityNameResult,targetAddress);
+        }
+        byCommunityNameResult.stream().forEach(x->x.setMatching("小区名字匹配"));
+
+
+        //合并查询结果集
+        byRoadNumberResult.addAll(byRoadNameNumberResult);
+        byRoadNumberResult.addAll(byCommunityNameResult);
+
+        //去重
+        byRoadNumberResult = byRoadNumberResult.stream().distinct().collect(Collectors.toList());
+
+        //排序
+        Collections.sort(byRoadNumberResult);
+        return byRoadNumberResult;
+    }
+
+    @Override
+    public List<DayouPersonalPriceVO> externalPersonalPrice(PersonalFacePriceQueryDTO facePriceQuery) {
+        //获取配置的价值点范围
+        Date startDate = DateUtils.addYears(new Date(),-1);
+        return externalDyDataBaseService.externalPrice(facePriceQuery,startDate);
+    }
+
+
+    /**
+     * 移除路名相同,但行政区域不同的元素
+     * @param priceList
+     */
+    private void filterByCityAndDistrict(List<DayouPersonalPriceVO> priceList, AddressDTO targetAddress){
+        Iterator<DayouPersonalPriceVO> iterator = priceList.iterator();
+        while (iterator.hasNext()) {
+            DayouPersonalPriceVO personalPriceVO = iterator.next();
+            AddressDTO item = AddressUtil.parseAddress(personalPriceVO.getLocation());
+            if (StrUtil.isNotBlank(targetAddress.getCity())){
+                String city = item.getCity();
+                if (StrUtil.isNotBlank(city) && !targetAddress.getCity().contains(city)){
+                    iterator.remove();
+                }
+            }
+            if (StrUtil.isNotBlank(targetAddress.getDistrict())){
+                String district = item.getDistrict();
+                if (StrUtil.isNotBlank(district) && !targetAddress.getDistrict().contains(district)){
+                    iterator.remove();
+                }
+            }
+
+        }
+    }
+
+}