Procházet zdrojové kódy

大中型现场查勘节点上传现场照片&& 分配人员计件数

wucl před 1 měsícem
rodič
revize
f95053077b

+ 47 - 0
biz-base/src/main/java/com/dayou/controller/MajorAppraiserUnitController.java

@@ -0,0 +1,47 @@
+package com.dayou.controller;
+
+import com.dayou.common.RestResponse;
+import com.dayou.dto.MajorAppraiserUnitDTO;
+import com.dayou.service.IMajorAppraiserUnitService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 大中型估价人员计件数(人力资源部统计)
+ *
+ * @author wucl
+ * @since 2025-06-26
+ */
+@RestController
+@RequestMapping("majorAppraiserUnit")
+@Slf4j
+public class MajorAppraiserUnitController {
+
+    @Autowired
+    private IMajorAppraiserUnitService majorAppraiserUnitService;
+
+    /**
+     * 分配计件数
+     * @param majorAppraiserUnitDTO
+     * @return
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody @Valid MajorAppraiserUnitDTO majorAppraiserUnitDTO) {
+        Boolean ret = majorAppraiserUnitService.saveUnit(majorAppraiserUnitDTO);
+        return RestResponse.success(ret);
+    }
+
+    /**
+     * 查询计件数
+     * @param id
+     * @return
+     */
+    @GetMapping("/{id}")
+    public RestResponse<MajorAppraiserUnitDTO> select(@PathVariable("id") Long id){
+        MajorAppraiserUnitDTO ret = majorAppraiserUnitService.select(id);
+        return RestResponse.success(ret);
+    }
+}

+ 147 - 0
common/src/main/java/com/dayou/utils/MajorEvaluateUnitUtil.java

@@ -0,0 +1,147 @@
+package com.dayou.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.dayou.entity.MajorTarget;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 大中型评估计件工具类
+ */
+public class MajorEvaluateUnitUtil {
+
+    //计件 特殊的市级单位
+    private static List<Long> expeCitys = new ArrayList<>();
+
+    private static List<Long> cdCountys = new ArrayList<>();
+
+    private static List<Long> cqCountys = new ArrayList<>();
+
+    private static List<Long> expePros = new ArrayList<>();
+
+
+
+    static {
+        expePros.add(11L);
+        expePros.add(12L);
+        expePros.add(31L);
+        expeCitys.add(5101L);
+        expeCitys.add(5002L);
+        cdCountys.add(510121L);
+        cdCountys.add(510129L);
+        cdCountys.add(510131L);
+        cdCountys.add(510132L);
+        cdCountys.add(510181L);
+        cdCountys.add(510182L);
+        cdCountys.add(510183L);
+        cdCountys.add(510184L);
+        cdCountys.add(510185L);
+        cqCountys.add(500229L);
+        cqCountys.add(500230L);
+        cqCountys.add(500231L);
+        cqCountys.add(500233L);
+        cqCountys.add(500235L);
+        cqCountys.add(500236L);
+        cqCountys.add(500237L);
+        cqCountys.add(500238L);
+        cqCountys.add(500240L);
+        cqCountys.add(500241L);
+        cqCountys.add(500242L);
+        cqCountys.add(500243L);
+
+
+    }
+
+    /**
+     * 计件逻辑:
+     * 如果一个订单中包含多个地区的评估对象,则应根据所涉及的地区数量来认定接件数。地区数量具体划分如下:
+     * (1)成都市/直辖市:市内各区视为1个地区;县级行政区内按县进行划分,每个县单独计算为一个地区;
+     * (2)其他地区:按市级行政区划分别核算地区数量。
+     * 认定接件数的原则如下:
+     * 第一个地区认定为1件;
+     * 第二个地区认定为0.5件;
+     * 第三个地区认定为0.8件;
+     * 从第四个地区开始,每新增一个地区,新增认定1件。
+     * @param targets
+     */
+    public static BigDecimal calculateEvaluateUnit(List<MajorTarget> targets){
+
+        int unit = 0;
+        List<String> collect = targets.stream().map(MajorTarget::getCityArray).collect(Collectors.toList());
+
+        if (collect.size()!=1){
+
+            List<Long> provinces = new ArrayList<>();
+            List<Long> cities = new ArrayList<>();
+            List<Long> counties = new ArrayList<>();
+
+            //多个估价对象
+            List<List<Long>> citys = collect.stream().map(x -> {return JSON.parseArray(x, Long.class);}).collect(Collectors.toList());
+            boolean flag = true;
+            for (List<Long> city : citys) {
+                if (city.get(1).equals(5101L)){
+                    if (cdCountys.contains(city.get(2)) && !counties.contains(city.get(2))){
+                        unit ++;
+                        counties.add(city.get(2));
+                        continue;
+                    }
+                    if (!cdCountys.contains(city.get(2)) && flag){
+                        unit ++;
+                        flag = false;
+                        continue;
+                    }
+                    if (counties.contains(city.get(2)) || !flag){
+                        continue;
+                    }
+                }
+                if (city.get(1).equals(5002L) && !counties.contains(city.get(2))){
+                    unit ++;
+                    counties.add(city.get(2));
+                    continue;
+                }
+                if (counties.contains(city.get(2))){
+                    continue;
+                }
+                if (expePros.contains(city.get(0)) && !provinces.contains(city.get(0))){
+                    unit ++;
+                    provinces.add(city.get(0));
+                    continue;
+                }
+                if (expePros.contains(city.get(0)) && provinces.contains(city.get(0))){
+                    continue;
+                }
+                if (!expePros.contains(city.get(0)) && !cities.contains(city.get(1))){
+                    unit ++;
+                    cities.add(city.get(1));
+                    continue;
+                }
+                if (!expePros.contains(city.get(0)) && cities.contains(city.get(1))){
+                    continue;
+                }
+                unit ++;
+            }
+        }else {
+            unit = 1;
+        }
+
+        BigDecimal result = BigDecimal.ZERO;
+        for (int i = 1; i<=unit ; i++){
+            if (i==2){
+                result = result.add(new BigDecimal("0.5"));
+            }else if (i==3){
+                result = result.add(new BigDecimal("0.8"));
+            }else {
+                result = result.add(new BigDecimal("1"));
+            }
+
+        }
+        return result;
+
+    }
+
+}

+ 7 - 0
dao/src/main/java/com/dayou/mapper/MajorAppraiserUnitMapper.java

@@ -0,0 +1,7 @@
+package com.dayou.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.entity.MajorAppraiserUnit;
+
+public interface MajorAppraiserUnitMapper extends BaseMapper<MajorAppraiserUnit> {
+}

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

@@ -42,4 +42,6 @@ public interface MajorTargetMapper extends CustomBaseMapper<MajorTarget> {
     List<MajorTarget> getList(@Param("vo") MajorTarget majorTarget);
 
     BigDecimal getEvaluateAmountByTargetId(@Param("targetIds") List<Long> targetIds);
+
+    Boolean deleteTarget(@Param("id") Long id);
 }

+ 6 - 0
dao/src/main/resources/mapper/MajorAppraiserUnitMapper.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.MajorAppraiserUnitMapper">
+
+
+</mapper>

+ 1 - 0
dao/src/main/resources/mapper/MajorMapper.xml

@@ -346,6 +346,7 @@
             m.remark,
             m.members,
             m.feedback_info,
+            m.evaluate_unit,
             u.NAME AS clientManager ,
             cc1.name as cClienteleName,
             cc2.name as cClienteleSubName,

+ 4 - 0
dao/src/main/resources/mapper/MajorTargetMapper.xml

@@ -99,4 +99,8 @@
             </foreach>
             )
     </select>
+
+    <delete id="deleteTarget" parameterType="java.lang.Long">
+        delete from major_target where id = #{id}
+    </delete>
 </mapper>

+ 18 - 0
domain/src/main/java/com/dayou/dto/MajorAppraiserUnitDTO.java

@@ -0,0 +1,18 @@
+package com.dayou.dto;
+
+import com.dayou.entity.MajorAppraiserUnit;
+import com.github.liangbaika.validate.annations.AbcValidate;
+import com.github.liangbaika.validate.enums.Check;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MajorAppraiserUnitDTO {
+
+    @AbcValidate(required = true,message = "id错误", fun = Check.NotNull)
+    private Long majorId;
+
+    @AbcValidate(required = true,message = "数据错误", fun = Check.NotNull)
+    private List<MajorAppraiserUnit> userUnit;
+}

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

@@ -290,4 +290,9 @@ public class Major extends BaseEntity {
      */
     private Long marketDepartmentId;
 
+    /**
+     * 评估部计件数
+     */
+    private BigDecimal evaluateUnit;
+
 }

+ 37 - 0
domain/src/main/java/com/dayou/entity/MajorAppraiserUnit.java

@@ -0,0 +1,37 @@
+package com.dayou.entity;
+
+import com.dayou.common.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 大中型估价人员计件数
+ *  @author wucl
+ *  @since 2025-06-26
+ */
+@Data
+public class MajorAppraiserUnit extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     *订单id
+     */
+    private Long majorId;
+
+    /**
+     *估价人员id
+     */
+    private Long userId;
+
+    /**
+     *分配件数
+     */
+    private BigDecimal unitRate;
+
+    /**
+     *负责人
+     */
+    private Boolean isPrincipal;
+}

+ 14 - 0
domain/src/main/java/com/dayou/entity/MajorTarget.java

@@ -238,5 +238,19 @@ public class MajorTarget extends BaseEntity {
      */
     private String definedEvaluationMethod;
 
+    /**
+     * 现场照片
+     */
+    private String sceneImage;
+
+    /**
+     * 省市县
+     */
+    private String cityArray;
+
+
+    @TableField(exist = false)
+    private List<Long> citys;
+
 
 }

+ 12 - 0
service/src/main/java/com/dayou/service/IMajorAppraiserUnitService.java

@@ -0,0 +1,12 @@
+package com.dayou.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dayou.dto.MajorAppraiserUnitDTO;
+import com.dayou.entity.MajorAppraiserUnit;
+
+public interface IMajorAppraiserUnitService extends IService<MajorAppraiserUnit> {
+
+    Boolean saveUnit(MajorAppraiserUnitDTO majorAppraiserUnitDTO);
+
+    MajorAppraiserUnitDTO select(Long id);
+}

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

@@ -58,4 +58,6 @@ public interface IMajorService extends IService<Major> {
     Integer getDepartmentOrderOverStock();
 
     void checkOrderOverStock(Long departmentId);
+
+    Boolean updateEvaluateUnit(Long majorId);
 }

+ 65 - 0
service/src/main/java/com/dayou/service/impl/MajorAppraiserUnitServiceImpl.java

@@ -0,0 +1,65 @@
+package com.dayou.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.MajorAppraiserUnitDTO;
+import com.dayou.entity.Major;
+import com.dayou.entity.MajorAppraiserUnit;
+import com.dayou.exception.ErrorCode;
+import com.dayou.mapper.MajorAppraiserUnitMapper;
+import com.dayou.service.IMajorAppraiserUnitService;
+import com.dayou.service.IMajorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class MajorAppraiserUnitServiceImpl extends ServiceImpl<MajorAppraiserUnitMapper, MajorAppraiserUnit> implements IMajorAppraiserUnitService {
+
+    @Autowired
+    private IMajorService majorService;
+
+    @Override
+    public Boolean saveUnit(MajorAppraiserUnitDTO majorAppraiserUnitDTO) {
+
+        Long majorId = majorAppraiserUnitDTO.getMajorId();
+
+        Major major = majorService.getOne(new LambdaQueryWrapper<Major>().select(Major::getEvaluateUnit, BaseEntity::getId).eq(BaseEntity::getId, majorId).eq(BaseEntity::getDeleted, false));
+
+        if (major.getEvaluateUnit() == null || major.getEvaluateUnit().compareTo(BigDecimal.ZERO)==0) {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"请先添加估价对象后再分配计件数。");
+        }
+
+
+        this.remove(new LambdaQueryWrapper<MajorAppraiserUnit>().eq(MajorAppraiserUnit::getMajorId,majorId));
+
+        List<MajorAppraiserUnit> userUnit = majorAppraiserUnitDTO.getUserUnit();
+
+
+        BigDecimal sum = BigDecimal.ZERO;
+        if (CollectionUtil.isNotEmpty(userUnit)){
+            for (MajorAppraiserUnit unit : userUnit){
+                unit.setMajorId(majorId);
+                sum = sum.add(unit.getUnitRate());
+            }
+        }
+
+        if (major.getEvaluateUnit().compareTo(sum)!=0){
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"分配之和必须等于总计件数值。");
+        }
+        return this.saveBatch(userUnit);
+    }
+
+    @Override
+    public MajorAppraiserUnitDTO select(Long id) {
+        List<MajorAppraiserUnit> list = this.list(new LambdaQueryWrapper<MajorAppraiserUnit>().eq(MajorAppraiserUnit::getMajorId, id));
+        MajorAppraiserUnitDTO majorAppraiserUnitDTO = new MajorAppraiserUnitDTO();
+        majorAppraiserUnitDTO.setMajorId(id);
+        majorAppraiserUnitDTO.setUserUnit(list);
+        return majorAppraiserUnitDTO;
+    }
+}

+ 27 - 0
service/src/main/java/com/dayou/service/impl/MajorServiceImpl.java

@@ -22,6 +22,7 @@ import com.dayou.service.workflow.IWorkFlowService;
 import com.dayou.service.workflow.IWorkNodeService;
 import com.dayou.service.workflow.IWorkTaskRecordService;
 import com.dayou.utils.LoginContext;
+import com.dayou.utils.MajorEvaluateUnitUtil;
 import com.dayou.vo.MajorVO;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +31,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -51,6 +53,8 @@ import static com.dayou.enums.GlobalConfigEnum.DepartmentTurns.MAJOR_BUSINESS;
 @Service
 public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements IMajorService {
 
+
+
     @Autowired
     private IWorkFlowService workFlowService;
 
@@ -76,6 +80,12 @@ public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements
     @Autowired
     private IDepartmentService departmentService;
 
+    @Autowired
+    private IMajorTargetService majorTargetService;
+
+    @Autowired
+    private IMajorAppraiserUnitService majorAppraiserUnitService;
+
     @Override
     @SuppressWarnings("unchecked")
     public Page<MajorVO> selectPage(Page page, MajorVO major,String keyword){
@@ -313,6 +323,23 @@ public class MajorServiceImpl extends ServiceImpl<MajorMapper, Major> implements
 
     }
 
+
+    @Transactional
+    @Override
+    public Boolean updateEvaluateUnit(Long majorId) {
+        //如果已分配计件数,则清空
+        majorAppraiserUnitService.remove(new LambdaQueryWrapper<MajorAppraiserUnit>().eq(MajorAppraiserUnit::getMajorId,majorId));
+
+        //重新计算计件总数
+        List<MajorTarget> targets = majorTargetService.list(new LambdaQueryWrapper<MajorTarget>().eq(MajorTarget::getMajorId, majorId)
+                .select(MajorTarget::getCityArray).eq(BaseEntity::getDeleted, false).isNotNull(MajorTarget::getSceneImage)
+                .isNotNull(MajorTarget::getCityArray).ne(MajorTarget::getCityArray,""));
+        BigDecimal unit = MajorEvaluateUnitUtil.calculateEvaluateUnit(targets);
+        return this.update(new LambdaUpdateWrapper<Major>().set(Major::getEvaluateUnit,unit)
+                .eq(BaseEntity::getId,majorId));
+    }
+
+
 //    /**
 //     * 大中型业务下单
 //     * @param businessId

+ 16 - 9
service/src/main/java/com/dayou/service/impl/MajorTargetServiceImpl.java

@@ -18,6 +18,7 @@ import com.dayou.mapper.MajorTargetMapper;
 import com.dayou.service.IBusinessNumberService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.service.IMajorProductionService;
+import com.dayou.service.IMajorService;
 import com.dayou.service.IMajorTargetService;
 import com.dayou.vo.IdNameVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,14 +59,11 @@ public class MajorTargetServiceImpl extends ServiceImpl<MajorTargetMapper, Major
     @Autowired
     private IMajorProductionService majorProductionService;
 
+    @Autowired
+    private IMajorService majorService;
+
     @Override
     public List<MajorTarget> getList(MajorTarget majorTarget){
-//        return this.list(new LambdaQueryWrapper<MajorTarget>().eq(MajorTarget::getMajorId,majorTarget.getMajorId())
-//                        .eq(StrUtil.isNotEmpty(majorTarget.getStatementNo()), MajorTarget::getStatementNo,majorTarget.getStatementNo())
-//                        .eq(StrUtil.isNotEmpty(majorTarget.getReportNo()), MajorTarget::getReportNo,majorTarget.getReportNo())
-//                        .eq(StrUtil.isNotEmpty(majorTarget.getLetterNo()), MajorTarget::getLetterNo,majorTarget.getLetterNo())
-//                        .eq(BaseEntity::getDeleted,Boolean.FALSE)
-//                .orderByAsc(BaseEntity::getCreated));
         List<MajorTarget> list = majorTargetMapper.getList(majorTarget);
         return list;
     }
@@ -76,18 +74,24 @@ public class MajorTargetServiceImpl extends ServiceImpl<MajorTargetMapper, Major
         return this.getById(id);
     }
 
+    @Transactional
     @Override
     public Boolean add(TaskRecordDTO<MajorTarget> majorTarget){
         MajorTarget taskData = majorTarget.getTaskData();
         taskData.setSiteIds(JSON.toJSONString(taskData.getSites()));
-        return  this.save(taskData);
+        taskData.setCityArray(JSON.toJSONString(taskData.getCitys()));
+        this.save(taskData);
+        return  majorService.updateEvaluateUnit(taskData.getMajorId());
     }
 
+    @Transactional
     @Override
     public Boolean update(TaskRecordDTO<MajorTarget> majorTarget){
         MajorTarget taskData = majorTarget.getTaskData();
         taskData.setSiteIds(JSON.toJSONString(taskData.getSites()));
-        return  this.updateById(taskData);
+        taskData.setCityArray(JSON.toJSONString(taskData.getCitys()));
+        this.updateById(taskData);
+        return  majorService.updateEvaluateUnit(taskData.getMajorId());
     }
 
     @Override
@@ -95,11 +99,14 @@ public class MajorTargetServiceImpl extends ServiceImpl<MajorTargetMapper, Major
         return  this.updateById(majorTarget);
     }
 
+    @Transactional
     @Override
     public Boolean delete(TaskRecordDTO<Long> majorTarget){
         Long id = majorTarget.getTaskData();
+        MajorTarget mt = this.getOne(new LambdaQueryWrapper<MajorTarget>().eq(MajorTarget::getId, id).select(MajorTarget::getMajorId,BaseEntity::getId));
         //逻辑删除
-        return this.removeById(id);
+        majorTargetMapper.deleteTarget(id);
+        return majorService.updateEvaluateUnit(mt.getMajorId());
     }
 
 

+ 22 - 1
sql/update_sql.sql

@@ -935,4 +935,25 @@ CREATE TABLE `business_production_bonus_points`
   修改人:苟耕铨
   未更新到test-env
  */
-ALTER TABLE `personal_scene` MODIFY `user_id` BIGINT ( 20 ) NULL COMMENT '实勘人id';
+ALTER TABLE `personal_scene` MODIFY `user_id` BIGINT ( 20 ) NULL COMMENT '实勘人id';
+
+/**
+  日期:2025-06-27
+  修改人:wucl
+  更新到test-env
+ */
+CREATE TABLE `major_appraiser_unit`  (
+                                                  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
+                                                  `major_id` bigint NOT NULL COMMENT '订单id',
+                                                  `user_id` bigint NOT NULL COMMENT '估价人员id',
+                                                  `unit_rate` decimal(8, 3) NOT NULL DEFAULT 0.000 COMMENT '分配件数',
+                                                  `is_principal` bit(1) NOT NULL DEFAULT b'0' COMMENT '负责人',
+                                                  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除标识:1:删除 0:未删除',
+                                                  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+                                                  `modified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
+                                                  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4  COMMENT = '大中型估价人员计件数' ROW_FORMAT = Dynamic;
+
+ALTER TABLE major ADD COLUMN evaluate_unit decimal ( 8,1 ) COMMENT '评估部计件数';
+ALTER TABLE major_target ADD COLUMN scene_image varchar (255) COMMENT '现场照片';
+ALTER TABLE major_target ADD COLUMN city_array varchar (255) COMMENT '省市县';