From 346288bc38bdab442721d7609caed86d03b9d2d4 Mon Sep 17 00:00:00 2001
From: cjl <276999030@qq.com>
Date: Tue, 26 Sep 2023 19:25:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wb' into qa

---
 screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionPageVo.java        |   96 
 screen-api/src/main/java/com/moral/api/entity/AllocationExtension.java                                   |   56 
 screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionPageCond.java   |   49 
 screen-api/src/main/java/com/moral/api/pojo/bean/BaseCreateEntity.java                                   |   53 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java                            |   37 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionListExt.java      |   22 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionListVo.java        |   83 
 screen-api/src/main/java/com/moral/api/pojo/enums/AllocationApproveEnum.java                             |   10 
 screen-api/src/main/java/com/moral/api/entity/FileTable.java                                             |   92 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionExt.java          |   69 
 screen-api/src/main/java/com/moral/api/controller/FileTableController.java                               |   64 
 screen-api/src/main/java/com/moral/api/pojo/vo/DictionaryVo.java                                         |   15 
 screen-api/src/main/java/com/moral/api/Swagger2.java                                                     |   15 
 screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java                              |    8 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java                              |  144 +
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationCheckCond.java                    |   53 
 screen-api/src/main/java/com/moral/api/pojo/vo/user/QxUser.java                                          |   34 
 screen-manage/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java                           |   74 
 screen-api/src/main/java/com/moral/api/pojo/enums/FileTableEnum.java                                     |   68 
 screen-api/src/main/java/com/moral/api/pojo/bean/BaseUpdateEntity.java                                   |   53 
 screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableAddCond.java                  |   70 
 screen-api/src/main/java/com/moral/api/pojo/enums/FileType.java                                          |   69 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionVo.java            |  122 +
 screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java                             |   18 
 screen-common/src/main/java/com/moral/constant/PageInfo.java                                             |   27 
 screen-api/src/main/java/com/moral/api/mapper/AllocationMapper.java                                      |   33 
 screen-api/src/main/java/com/moral/api/service/AllocationExtensionService.java                           |   44 
 screen-api/src/main/java/com/moral/api/controller/DictController.java                                    |    8 
 screen-api/src/main/java/com/moral/api/pojo/query/OrderByItem.java                                       |   41 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionPageExt.java      |   40 
 screen-api/src/main/java/com/moral/api/controller/AllocationExtensionController.java                     |   64 
 screen-api/src/main/java/com/moral/api/entity/Allocation.java                                            |  140 +
 screen-api/src/main/java/com/moral/api/entity/User.java                                                  |    7 
 screen-api/src/main/java/com/moral/api/pojo/vo/approvetable/ApproveTableListVo.java                      |   47 
 screen-common/src/main/java/com/moral/constant/Constants.java                                            |    7 
 screen-api/src/main/java/com/moral/api/entity/ResponsibilityUnit.java                                    |   55 
 screen-common/src/main/java/com/moral/constant/RedisConstants.java                                       |    3 
 screen-api/src/main/resources/application-local.yml                                                      |   12 
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationAddCond.java                      |   77 
 screen-api/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java                   |   53 
 screen-api/src/main/java/com/moral/api/config/mybatis/PlusConfig.java                                    |  125 +
 screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableListCond.java                 |   28 
 screen-api/src/main/java/com/moral/api/service/ApproveTableService.java                                  |   29 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java                        |   24 
 screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java                |  196 +
 screen-manage/src/main/java/com/moral/api/entity/ResponsibilityUnit.java                                 |   70 
 screen-api/src/main/java/com/moral/api/mapper/ApproveTableMapper.java                                    |    8 
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationUpdateCond.java                   |   85 
 screen-manage/src/main/java/com/moral/api/service/ResponsibilityUnitService.java                         |   21 
 screen-api/src/main/java/com/moral/api/pojo/query/OrderType.java                                         |   55 
 screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionAddCond.java    |   51 
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationPageCond.java                     |   54 
 screen-api/src/main/resources/application-qa.yml                                                         |    5 
 screen-manage/src/main/java/com/moral/api/service/SysAreaService.java                                    |   11 
 screen-api/src/main/java/com/moral/api/pojo/enums/AllocationEscalationTypeEnum.java                      |   59 
 screen-api/src/main/java/com/moral/api/pojo/query/PageCond.java                                          |   44 
 screen-api/src/main/java/com/moral/api/mapper/FileTableMapper.java                                       |   16 
 screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitDto.java                        |  153 +
 screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java                                 |   11 
 screen-api/pom.xml                                                                                       |   15 
 screen-api/src/main/resources/application-dev.yml                                                        |    6 
 screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableUpdateCond.java               |   70 
 screen-api/src/main/java/com/moral/api/utils/StringUtils.java                                            | 1175 ++++++++++
 screen-api/src/main/java/com/moral/api/controller/AllocationController.java                              |  239 ++
 screen-api/src/main/resources/mapper/AllocationMapper.xml                                                |   96 
 screen-api/src/main/java/com/moral/api/mapper/AllocationExtensionMapper.java                             |   37 
 screen-api/src/main/java/com/moral/api/pojo/enums/AllocationExtensionApproveEnum.java                    |   68 
 screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationListExt.java                        |   22 
 screen-api/src/main/java/com/moral/api/service/AllocationService.java                                    |   63 
 screen-api/src/main/java/com/moral/api/utils/FileTypeUtils.java                                          |  126 +
 screen-api/src/main/java/com/moral/api/service/impl/AllocationExtensionServiceImpl.java                  |   93 
 screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java                            |  238 ++
 screen-api/src/main/resources/mapper/AllocationExtensionMapper.xml                                       |   69 
 screen-api/src/main/resources/mapper/FileTableMapper.xml                                                 |   20 
 screen-api/src/main/java/com/moral/api/config/Interceptor/UserHelper.java                                |   49 
 screen-api/src/main/java/com/moral/api/service/FileTableService.java                                     |   33 
 screen-api/src/main/java/com/moral/api/entity/ApproveTable.java                                          |   52 
 screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java                           |  579 +++++
 screen-manage/src/main/java/com/moral/api/controller/SystemController.java                               |   12 
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationListCond.java                     |   37 
 screen-common/src/main/java/com/moral/constant/PageResult.java                                           |   34 
 screen-api/src/main/java/com/moral/api/pojo/bean/BaseEntity.java                                         |   13 
 screen-api/src/main/java/com/moral/api/pojo/bean/BaseDelEntity.java                                      |   33 
 screen-api/src/main/java/com/moral/api/pojo/enums/StateEnum.java                                         |    4 
 screen-manage/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java                           |    8 
 screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionUpdateCond.java |   76 
 screen-api/src/main/java/com/moral/api/service/ResponsibilityUnitService.java                            |   27 
 screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java                             |    2 
 screen-manage/src/main/java/com/moral/api/controller/ResponsibilityUnitController.java                   |  118 +
 screen-api/src/main/java/com/moral/api/pojo/vo/file/FileVo.java                                          |   29 
 screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTablePageCond.java                 |   31 
 screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionListCond.java   |   28 
 screen-api/src/main/java/com/moral/api/pojo/bean/BaseInvalidEntity.java                                  |   31 
 screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitViewDto.java                    |   46 
 screen-api/src/main/java/com/moral/api/pojo/enums/YesOrNo.java                                           |    2 
 screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java                          |  122 +
 screen-api/src/main/java/com/moral/api/service/impl/ApproveTableServiceImpl.java                         |   50 
 screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationChangeCond.java                   |   58 
 98 files changed, 6,867 insertions(+), 21 deletions(-)

diff --git a/screen-api/pom.xml b/screen-api/pom.xml
index 4c48cc5..aab3ba2 100644
--- a/screen-api/pom.xml
+++ b/screen-api/pom.xml
@@ -72,8 +72,23 @@
             <artifactId>poi-tl</artifactId>
             <version>1.5.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
 
         <dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
+        <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <version>5.3.0</version>
diff --git a/screen-api/src/main/java/com/moral/api/Swagger2.java b/screen-api/src/main/java/com/moral/api/Swagger2.java
index d555f16..5e12931 100644
--- a/screen-api/src/main/java/com/moral/api/Swagger2.java
+++ b/screen-api/src/main/java/com/moral/api/Swagger2.java
@@ -5,10 +5,15 @@
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.*;
 import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 
 @Configuration
@@ -17,6 +22,13 @@
     @Bean
     public Docket petApi() {
         return new Docket(DocumentationType.SWAGGER_2)
+                .securityContexts(Arrays.asList(SecurityContext.builder()
+                        .securityReferences(Arrays.asList(SecurityReference.builder()
+                                .reference("token")
+                                .scopes(new AuthorizationScope[]{new AuthorizationScope("global", "accessEverything")})
+                                .build()))
+                        .build()))
+                .securitySchemes(Arrays.asList(new ApiKey("token", "token", "header")))
                 .apiInfo(apiInfo())
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("com.moral.api"))
@@ -31,4 +43,5 @@
                 .build();
     }
 
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/config/Interceptor/UserHelper.java b/screen-api/src/main/java/com/moral/api/config/Interceptor/UserHelper.java
new file mode 100644
index 0000000..4c6a53d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/config/Interceptor/UserHelper.java
@@ -0,0 +1,49 @@
+package com.moral.api.config.Interceptor;
+
+import com.alibaba.fastjson.JSON;
+import com.moral.api.pojo.vo.user.QxUser;
+import com.moral.api.utils.BeanConverts;
+import com.moral.api.utils.StringUtils;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.exception.TokenException;
+import com.moral.util.TokenUtils;
+import net.sf.cglib.beans.BeanMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @ClassName UserHelper
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-21 15:47
+ * @Version 1.0
+ */
+
+public class UserHelper {
+    public static QxUser getCurrentUser(){
+        Map<String, Object> userInfo = new HashMap<>();
+        try {
+             userInfo = (Map<String, Object>) TokenUtils.getUserInfo();
+        }catch (Exception e){
+        }
+        if (Objects.isNull(userInfo)||Objects.isNull(userInfo.get("userId"))) {
+            return null;
+        }
+        try {
+            String s = JSON.toJSONString(userInfo);
+            return JSON.parseObject(s, QxUser.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java b/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java
index e57509c..804a61f 100644
--- a/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java
+++ b/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java
@@ -22,7 +22,7 @@
 import java.util.*;
 
 
-@Configuration
+/*@Configuration*/
 public class MybatisPlusConfig {
 
     public static ThreadLocal<String> tableName = new ThreadLocal<>();
diff --git a/screen-api/src/main/java/com/moral/api/config/mybatis/PlusConfig.java b/screen-api/src/main/java/com/moral/api/config/mybatis/PlusConfig.java
new file mode 100644
index 0000000..55cf12d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/config/mybatis/PlusConfig.java
@@ -0,0 +1,125 @@
+package com.moral.api.config.mybatis;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.moral.api.config.Interceptor.UserHelper;
+import com.moral.api.pojo.enums.YesOrNo;
+import com.moral.api.pojo.vo.user.QxUser;
+import org.apache.ibatis.reflection.MetaObject;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName PlusConfig
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 10:28
+ * @Version 1.0
+ */
+@Configuration
+@MapperScan(basePackages = {"com.moral.*.mapper"})
+public class PlusConfig {
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+
+    @Bean
+    public DefaultSqlInjector logicSqlInjector() {
+        return new DefaultSqlInjector() {
+            @Override
+            public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
+                List<AbstractMethod> methodList = super.getMethodList(mapperClass);
+                methodList.add(new LogicDeleteByIdWithFill());
+                return methodList;
+            }
+        };
+    }
+
+    @Bean
+    public MetaObjectHandler metaObjectHandler() {
+        return new MetaObjectHandler() {
+
+            private final static String IS_DEL = "isDel";
+            private final static String IS_INVALID = "isInvalid";
+            private final static String CREATOR_ID = "createId";
+            private final static String CREATOR_NAME = "createName";
+            private final static String CREATE_TIME = "createTime";
+            private final static String LAST_MODIFY_ID = "updateId";
+            private final static String LAST_MODIFY_NAME = "updateName";
+            private final static String LAST_MODIFY_TIME = "updateTime";
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+                if (metaObject.hasSetter(IS_DEL)) {
+                    this.setFieldValByName(IS_DEL, 0, metaObject);
+                }
+                if (metaObject.hasSetter(IS_INVALID)) {
+                    this.setFieldValByName(IS_INVALID, 0, metaObject);
+                }
+                creatorHandler(metaObject);
+                lastModifyHandler(metaObject);
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+                lastModifyHandler(metaObject);
+            }
+
+            private void creatorHandler(MetaObject metaObject) {
+                QxUser currentUser = UserHelper.getCurrentUser();
+                Integer userId = currentUser == null ? 0 : currentUser.getUserId()==null?null:currentUser.getUserId().intValue();
+                String userName = currentUser == null ? "admin" : currentUser.getUserName();
+                if (metaObject.hasSetter(IS_INVALID)) {
+                    this.strictInsertFill(metaObject, IS_INVALID, Integer.class, YesOrNo.NO.getValue());
+                }
+                if (metaObject.hasSetter(IS_DEL)) {
+                    this.strictInsertFill(metaObject, IS_DEL, Integer.class, YesOrNo.NO.getValue());
+                }
+
+                if (metaObject.hasSetter(CREATOR_ID)) {
+                    this.strictInsertFill(metaObject, CREATOR_ID, Integer.class, userId);
+                }
+                if (metaObject.hasSetter(CREATOR_NAME)) {
+                    this.strictInsertFill(metaObject, CREATOR_NAME, String.class, userName);
+                }
+                if (metaObject.hasSetter(CREATE_TIME)) {
+                    this.strictInsertFill(metaObject, CREATE_TIME, Date.class, new Date());
+                }
+            }
+
+            private void lastModifyHandler(MetaObject metaObject) {
+                QxUser currentUser = UserHelper.getCurrentUser();
+                Integer userId = currentUser == null ? 0 : currentUser.getUserId()==null?null:currentUser.getUserId().intValue();
+                String userName = currentUser == null ? "admin" : currentUser.getUserName();
+                if (metaObject.hasSetter(LAST_MODIFY_ID)) {
+                    this.strictUpdateFill(metaObject, LAST_MODIFY_ID, Integer.class, userId);
+                }
+                if (metaObject.hasSetter(LAST_MODIFY_NAME)) {
+                    this.strictUpdateFill(metaObject, LAST_MODIFY_NAME, String.class, userName);
+                }
+                if (metaObject.hasSetter(LAST_MODIFY_TIME)) {
+                    this.strictUpdateFill(metaObject, LAST_MODIFY_TIME, Date.class, new Date());
+                }
+            }
+
+
+        };
+    }
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/controller/AllocationController.java b/screen-api/src/main/java/com/moral/api/controller/AllocationController.java
new file mode 100644
index 0000000..67e7547
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/controller/AllocationController.java
@@ -0,0 +1,239 @@
+package com.moral.api.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.aspectj.apache.bcel.generic.RET;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.ext.allocation.AllocationPageExt;
+import com.moral.api.pojo.query.allocation.*;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+import com.moral.api.pojo.vo.allocation.AllocationPageVo;
+import com.moral.api.pojo.vo.allocation.AllocationVo;
+import com.moral.constant.PageResult;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.pojo.dto.allocation.AllocationUnitViewDto;
+import com.moral.api.service.AllocationService;
+import com.moral.api.utils.EasyExcelUtils;
+import com.moral.api.utils.NoModelWriteData;
+import com.moral.constant.Constants;
+import com.moral.constant.ResultMessage;
+import com.moral.util.WebUtils;
+
+import javax.validation.Valid;
+
+
+@Api(tags = {"������������"})
+@RestController
+@RequestMapping("allocation")
+public class AllocationController {
+
+    @Autowired
+    private AllocationService allocationService;
+
+
+    @ApiOperation(value = "������������", notes = "������������")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
+    })
+    @RequestMapping(value = "contaminate", method = RequestMethod.GET)
+    public ResultMessage contaminate() {
+        List<Map<String, Object>> professions = allocationService.sysDictData(Constants.WU_RAN_LEI_XING);
+        return ResultMessage.ok(professions);
+    }
+
+
+    @ApiOperation(value = "������������", notes = "������������")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
+    })
+    @RequestMapping(value = "unit", method = RequestMethod.GET)
+    public ResultMessage unit() {
+        List<ResponsibilityUnit> responsibilityUnits = allocationService.seleteUnit();
+        return ResultMessage.ok(responsibilityUnits);
+    }
+
+    /**
+     * ���������������
+     * @return
+     */
+    @PostMapping("insert")
+    @ApiOperation("������")
+    public  ResultMessage insert(@Valid @RequestBody AllocationAddCond allocation){
+        allocationService.insertAllocation(allocation);
+        return ResultMessage.ok();
+    }
+
+
+    /**
+     * ���������������
+     * @return
+     */
+   /* @GetMapping("check")
+    public ResultMessage check(Integer id){
+        allocationService.check(id);
+        return ResultMessage.ok();
+    }*/
+
+    /**
+     * ������������
+     * @param allocationUpdateCond
+     * @return
+     *
+     *
+     */
+    @PostMapping("update")
+    @ApiOperation("������")
+    public ResultMessage update(@Valid @RequestBody AllocationUpdateCond allocationUpdateCond){
+        allocationService.updateAll(allocationUpdateCond);
+        return ResultMessage.ok();
+    }
+
+    @PostMapping("change")
+    @ApiOperation("������")
+    public ResultMessage changeAllocation(@Valid @RequestBody AllocationChangeCond changeCond){
+        allocationService.changeAllocation(changeCond);
+        return ResultMessage.ok();
+    }
+
+    @PostMapping("check")
+    @ApiOperation("������")
+    public ResultMessage checkAllocation(@Valid @RequestBody AllocationCheckCond checkCond){
+        allocationService.checkAllocation(checkCond);
+        return ResultMessage.ok();
+    }
+    /**
+     * ������������������
+     * @return
+     */
+    @GetMapping("selectAll")
+    public ResultMessage selectAll(Map<String,Object> map){
+        allocationService.selectAll(map);
+        return ResultMessage.ok();
+    }
+
+    @PostMapping("/page")
+    @ApiOperation("������")
+    public ResultMessage<PageResult<AllocationPageVo>> page(@Valid @RequestBody AllocationPageCond allocationPageCond) {
+        Page<AllocationPageExt> page = allocationService.extPage(allocationPageCond);
+        PageResult<AllocationPageVo> result = new PageResult<>(page);
+        result.setList(AllocationPageVo.convert(page.getRecords()));
+        return ResultMessage.ok(result);
+    }
+    @GetMapping("/detail")
+    @ApiOperation("������")
+    public ResultMessage<AllocationVo> get(Integer id) {
+        AllocationExt allocationext = allocationService.extOne(id);
+        AllocationVo allocationVo = AllocationVo.convert(allocationext);
+        allocationVo.setFileBaseList(allocationext.getFileBaseList());
+        allocationVo.setFileChangeList(allocationext.getFileChangeList());
+        allocationVo.setFileApproveList(allocationext.getFileApproveList());
+        allocationVo.setApproveList(allocationext.getApproveList());
+        return ResultMessage.ok(allocationVo);
+    }
+    @GetMapping("remove")
+    @ApiOperation("������")
+    public ResultMessage removeById(Integer id){
+        allocationService.removeById(id);
+        return ResultMessage.ok();
+    }
+    @GetMapping("invalid")
+    @ApiOperation("������")
+    public ResultMessage invalidResult(@RequestParam @ApiParam(value = "id",name = "������id") Integer id,
+                                       @RequestParam @ApiParam(value = "invalidReason",name = "������������") String invalidReason){
+        allocationService.invalidResult(id,invalidReason);
+        return ResultMessage.ok();
+    }
+
+    @PostMapping("/applyfor")
+    @ApiOperation("������������")
+    public ResultMessage applyFor(@Valid @RequestBody AllocationExtensionAddCond allocationExtensionAddCond) {
+        return allocationService.applyFor(allocationExtensionAddCond) ? ResultMessage.ok() : ResultMessage.fail();
+    }
+
+
+    /**
+     * ������������������
+     * @return
+     */
+    @GetMapping("selectUnitView")
+    public ResultMessage selectUnitView(HttpServletRequest request){
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        Map<String, Object> map1 = allocationService.selectUnitView(params);
+        return ResultMessage.ok(map1);
+    }
+
+
+    @GetMapping("unitExel")
+    public void unitExel(HttpServletResponse response,HttpServletRequest request){
+        Map<String, Object> params = WebUtils.getParametersStartingWith(request, null);
+        //������������
+        Map<String, Object> map1 = allocationService.selectUnitView(params);
+        List<AllocationUnitViewDto> unitView = (List<AllocationUnitViewDto>) map1.get("unitView");
+
+
+        ArrayList<Map<String, Object>> mapArrayList = new ArrayList<>();
+        for (AllocationUnitViewDto allocationUnitViewDto : unitView) {
+            Map<String, Object> map = entityToMap(allocationUnitViewDto);
+            mapArrayList.add(map);
+        }
+        if (CollectionUtils.isEmpty(mapArrayList)) {
+            return;
+        }
+        Map<String, Object> map = mapArrayList.get(0);
+        List<String> list = new ArrayList<>();
+        for (String key : map.keySet()) {
+            list.add(key);
+        }
+        String[] s2 = new String[list.size()];
+        list.toArray(s2);
+        NoModelWriteData d = new NoModelWriteData();
+        d.setFileName("������������");
+        d.setHeadMap(s2);
+        d.setDataStrMap(s2);
+        d.setDataList(mapArrayList);
+        try {
+            EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
+            easyExcelUtils.noModleWrite(d, response);
+        } catch (Exception e) {
+            int i = 0;
+        }
+    }
+
+    /**
+     ������������Map
+     */
+    public static Map<String, Object> entityToMap(Object object) {
+        Map<String, Object> map = new HashMap<>();
+        for (Field field : object.getClass().getDeclaredFields()) {
+            try {
+                boolean flag = field.isAccessible();
+                field.setAccessible(true);
+                Object o = field.get(object);
+                map.put(field.getName(), o);
+                field.setAccessible(flag);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/controller/AllocationExtensionController.java b/screen-api/src/main/java/com/moral/api/controller/AllocationExtensionController.java
new file mode 100644
index 0000000..d5ded3c
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/controller/AllocationExtensionController.java
@@ -0,0 +1,64 @@
+package com.moral.api.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionPageCond;
+import com.moral.api.pojo.vo.allocationextension.AllocationExtensionPageVo;
+import com.moral.api.pojo.vo.allocationextension.AllocationExtensionVo;
+import com.moral.api.service.AllocationExtensionService;
+import com.moral.constant.PageResult;
+import com.moral.constant.ResultMessage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * <p>
+ * ��������������� ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@RestController
+@RequestMapping("/allocationExtension")
+@Api(tags = {"������������"})
+public class AllocationExtensionController {
+
+    private final AllocationExtensionService allocationExtensionService;
+
+    public AllocationExtensionController(AllocationExtensionService allocationExtensionService) {
+        this.allocationExtensionService = allocationExtensionService;
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation("������")
+    public ResultMessage<AllocationExtensionVo> get(Integer id) {
+        AllocationExtensionExt allocationExtensionext = allocationExtensionService.extOne(id);
+        return ResultMessage.ok(allocationExtensionext == null ? null : AllocationExtensionVo.convert(allocationExtensionext));
+    }
+
+
+    @PostMapping("/page")
+    @ApiOperation("������")
+    public ResultMessage<PageResult<AllocationExtensionPageVo>> page(@Valid @RequestBody AllocationExtensionPageCond allocationExtensionPageCond) {
+        Page<AllocationExtensionPageExt> page = allocationExtensionService.extPage(allocationExtensionPageCond);
+        PageResult<AllocationExtensionPageVo> result = new PageResult<>(page);
+        result.setList(AllocationExtensionPageVo.convert(page.getRecords()));
+        return ResultMessage.ok(result);
+    }
+
+    @GetMapping("check")
+    @ApiOperation("������")
+    public ResultMessage check(@RequestParam @ApiParam(value = "id",name = "������id") Integer id,
+                                       @RequestParam @ApiParam(value = "state",name = "������") Integer state){
+        allocationExtensionService.check(id,state);
+        return ResultMessage.ok();
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/controller/DictController.java b/screen-api/src/main/java/com/moral/api/controller/DictController.java
index 11051dd..0c7cc2a 100644
--- a/screen-api/src/main/java/com/moral/api/controller/DictController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/DictController.java
@@ -1,10 +1,7 @@
 package com.moral.api.controller;
 
 import com.moral.api.entity.CityConfigAqi;
-import com.moral.api.pojo.enums.ChangeEnum;
-import com.moral.api.pojo.enums.InvestigationEnum;
-import com.moral.api.pojo.enums.StateEnum;
-import com.moral.api.pojo.enums.YesOrNo;
+import com.moral.api.pojo.enums.*;
 import com.moral.api.pojo.vo.DictionaryVo;
 import com.moral.constant.ResultMessage;
 import io.swagger.annotations.Api;
@@ -32,6 +29,9 @@
                 .setChangeEnum(ChangeEnum.values())
                 .setInvestigationEnum(InvestigationEnum.values())
                 .setYesOrNo(YesOrNo.values())
+                .setFileTableEnum(FileTableEnum.values())
+                .setAllocationApproveEnum(AllocationApproveEnum.values())
+                .setAllocationExtensionApproveEnum(AllocationExtensionApproveEnum.values())
                 ;
         return ResultMessage.ok(dictionaryVo);
     }
diff --git a/screen-api/src/main/java/com/moral/api/controller/FileTableController.java b/screen-api/src/main/java/com/moral/api/controller/FileTableController.java
new file mode 100644
index 0000000..f828235
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/controller/FileTableController.java
@@ -0,0 +1,64 @@
+package com.moral.api.controller;
+
+
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.service.FileTableService;
+import com.moral.constant.ResultMessage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * ��������� ���������������
+ * </p>
+ *
+ * @author moral
+ * @since 2023-09-21
+ */
+@RestController
+@RequestMapping("/file")
+@Api(tags = {"������"})
+public class FileTableController {
+
+    private final FileTableService fileTableService;
+
+    public FileTableController(FileTableService fileTableService) {
+        this.fileTableService = fileTableService;
+    }
+
+
+    @PostMapping("/upload")
+    @ApiOperation("������������")
+    public ResultMessage<FileVo> upload(@RequestParam("file") @ApiParam(name = "file", value = "������������") MultipartFile file,
+                                        @RequestParam("sysCode") @ApiParam(name = "sysCode", value = "������������") Integer sysCode){
+        return ResultMessage.ok(fileTableService.upload(file,sysCode));
+    }
+
+    @PostMapping("/multipleUpload")
+    @ApiOperation("���������������������")
+    public ResultMessage<List<FileVo>> upload(@RequestParam("file") @ApiParam(name = "file", value = "������������") List<MultipartFile> file,
+                                              @RequestParam("sysCode") @ApiParam(name = "sysCode", value = "������������") Integer sysCode){
+        return ResultMessage.ok(fileTableService.upload(file,sysCode));
+    }
+
+    @GetMapping("/preview/{id}")
+    @ApiOperation("������������")
+    public void preview(@PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response) {
+        fileTableService.preview(id, request, response);
+    }
+
+    @GetMapping("/preview/cover/{id}")
+    @ApiOperation("������������������")
+    public void coverPreview(@PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response) {
+        fileTableService.coverPreview(id, request, response);
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/Allocation.java b/screen-api/src/main/java/com/moral/api/entity/Allocation.java
new file mode 100644
index 0000000..4124f6e
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/Allocation.java
@@ -0,0 +1,140 @@
+package com.moral.api.entity;
+
+
+import com.moral.api.pojo.bean.BaseInvalidEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class Allocation extends BaseInvalidEntity<Allocation> {
+
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������id
+     */
+    @TableId(value = "allocation_id", type = IdType.AUTO)
+    private Integer allocationId;
+
+    /**
+     *������������
+     */
+    private String allocationNum;
+
+    /**
+     * ������or������
+     */
+    private Integer escalationType;
+
+    /**
+     * ������������
+     */
+    private Date escalationTime;
+
+    /**
+     * ������������
+     */
+    private String pollutePosition;
+
+    /**
+     * ������������id
+     */
+    private Integer unitId;
+
+    /**
+     * ������������id
+     */
+    private Integer polluteType;
+
+    /**
+     * ������������id
+     */
+    private Integer changeType;
+
+
+
+    /**
+     * ������������
+     */
+    private Integer changeDay;
+
+    /**
+     * ������������id
+     */
+    private Integer escalationUnitId;
+
+    /**
+     * ���������
+     */
+    private String escalationName;
+
+    /**
+     * ������������id
+     */
+    private Integer investigationType;
+
+    /**
+     * ������������
+     */
+    private String problemDescribe;
+
+    /**
+     * ������������
+     */
+    private Integer isChange;
+
+    /**
+     * ������������
+     */
+    private String changeDescribe;
+    /**
+     * ���������������
+     */
+    private String changeName;
+
+    /**
+     * ������������
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date changeTime;
+
+    /**
+     * ������������
+     */
+    private Integer checkScore;
+    /**
+     * ������������
+     */
+    private String checkDescribe;
+    /**
+     * ���������
+     */
+    private String checkName;
+
+
+
+    /**
+     * ������������
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date checkTime;
+    /**
+     * ������ 0 ������  1 ������ 2������ 3 ������ 4 ������
+     */
+    private Integer state;
+    /**
+     * ������������
+     */
+    private String invalidReason;
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/AllocationExtension.java b/screen-api/src/main/java/com/moral/api/entity/AllocationExtension.java
new file mode 100644
index 0000000..b02f7d6
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/AllocationExtension.java
@@ -0,0 +1,56 @@
+package com.moral.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.moral.api.pojo.bean.BaseInvalidEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExtension extends BaseInvalidEntity<AllocationExtension> {
+
+
+    /**
+     * ������id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * ���������id
+     */
+    private Integer allocationId;
+
+    /**
+     * ������������
+     */
+    private Integer extensionNum;
+
+    /**
+     * ������������
+     */
+    private String remake;
+
+    /**
+     * ������
+     */
+    private Integer state;
+
+
+    /**
+     * ������������
+     */
+    private String invalidReason;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/ApproveTable.java b/screen-api/src/main/java/com/moral/api/entity/ApproveTable.java
new file mode 100644
index 0000000..b628f9c
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/ApproveTable.java
@@ -0,0 +1,52 @@
+package com.moral.api.entity;
+
+
+import com.moral.api.pojo.bean.BaseDelEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ApproveTable extends BaseDelEntity<ApproveTable> {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * ������id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * ������������
+     */
+    private Integer approveModule;
+
+    /**
+     * ������id
+     */
+    private Integer relationId;
+
+    /**
+     * ������
+     */
+    private  Integer state;
+
+
+    /**
+     * ������������
+     */
+    private String stateName;
+
+
+
+
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/FileTable.java b/screen-api/src/main/java/com/moral/api/entity/FileTable.java
new file mode 100644
index 0000000..8d27836
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/FileTable.java
@@ -0,0 +1,92 @@
+package com.moral.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2023-09-21
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class FileTable extends Model<FileTable> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������id
+     */
+    @TableId(value = "file_id", type = IdType.AUTO)
+    private Integer fileId;
+
+    /**
+     * ������
+     */
+    private Integer fileModule;
+
+    /**
+     * ������������id
+     */
+    private Integer relationId;
+
+    /**
+     * ������������
+     */
+    private String fileName;
+
+    /**
+     * ������������1������2������
+     */
+    private Integer fileType;
+
+    /**
+     * ������������������
+     */
+    private String fileAddress;
+
+    /**
+     * ������������
+     */
+    private Integer fileSize;
+
+    /**
+     * ������������
+     */
+    private Integer isDel;
+
+    /**
+     * ���������id
+     */
+    private Integer createId;
+
+    /**
+     * ���������������
+     */
+    private String createName;
+
+    /**
+     * ������������
+     */
+    private Date createTime;
+
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.fileId;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/ResponsibilityUnit.java b/screen-api/src/main/java/com/moral/api/entity/ResponsibilityUnit.java
new file mode 100644
index 0000000..561bb84
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/ResponsibilityUnit.java
@@ -0,0 +1,55 @@
+package com.moral.api.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ResponsibilityUnit extends Model<ResponsibilityUnit> {
+
+    //������������id
+    @TableId(value = "unit_id", type = IdType.AUTO)
+    private Integer unitId;
+
+    private String unitName;
+
+    private Integer areaCode;
+
+    private  Integer parentCode;
+    //0��������� 1���������
+    private  Integer state;
+    //0��������� 1���������
+    private  String isDel;
+    //0������������ 1������������
+    private  Integer isInvalid;
+
+    private String invalidReason;
+
+    private  Integer createId;
+
+    private  String createName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private  Date createTime;
+
+    private Integer updateId;
+
+    private String updateName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private String areaName;
+
+    @TableField(exist = false)
+    private String parentName;
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/User.java b/screen-api/src/main/java/com/moral/api/entity/User.java
index 1ee5ef9..0ae2a49 100644
--- a/screen-api/src/main/java/com/moral/api/entity/User.java
+++ b/screen-api/src/main/java/com/moral/api/entity/User.java
@@ -1,6 +1,7 @@
 package com.moral.api.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -76,6 +77,9 @@
      */
     private String wechat;
 
+
+    private Integer unitId;
+
     /**
      * ������������
      */
@@ -100,5 +104,8 @@
      */
     private String isDelete;
 
+    @TableField(exist = false)
+    private Integer unitCode;
+
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java b/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java
index 4cd4759..f2136d1 100644
--- a/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java
+++ b/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java
@@ -1,15 +1,24 @@
 package com.moral.api.exception;
 
+import com.alibaba.druid.wall.violation.ErrorCode;
+import com.moral.api.utils.StringUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.constant.ResultMessage;
 import com.moral.exception.TokenException;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 @ControllerAdvice
@@ -33,7 +42,14 @@
     @ResponseBody
     @ResponseStatus(HttpStatus.OK)
     public ResultMessage handleUserNotExistException(BusinessException ex) {
-        return ResultMessage.fail(ResponseCodeEnum.FAIL.getCode(), "������������������������");
+        return ResultMessage.fail(ResponseCodeEnum.FAIL.getCode(), ex.getMsg());
+    }
+
+    @ExceptionHandler
+    public ResultMessage exceptionHandler(MethodArgumentNotValidException e){
+        List<String> collect = e.getBindingResult().getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage)
+                .collect(Collectors.toList());
+        return ResultMessage.fail(ResponseCodeEnum.FAIL.getCode(), StringUtils.join(collect, ","));
     }
 
     /**
diff --git a/screen-api/src/main/java/com/moral/api/mapper/AllocationExtensionMapper.java b/screen-api/src/main/java/com/moral/api/mapper/AllocationExtensionMapper.java
new file mode 100644
index 0000000..1e7abbc
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/AllocationExtensionMapper.java
@@ -0,0 +1,37 @@
+package com.moral.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionPageCond;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * ��������������� Mapper ������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+public interface AllocationExtensionMapper extends BaseMapper<AllocationExtension> {
+
+
+    /**
+     * ������������������
+     * @param id
+     * @return AllocationExtensionExt
+     */
+    AllocationExtensionExt extOne(@Param("id") Integer id);
+
+    /**
+     * ������������������
+     * @param page
+     * @param allocation
+     * @return AllocationExtensionPageExt
+     */
+    Page<AllocationExtensionPageExt> extPage(Page page, @Param("allocation") AllocationExtensionPageCond allocation);
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/mapper/AllocationMapper.java b/screen-api/src/main/java/com/moral/api/mapper/AllocationMapper.java
new file mode 100644
index 0000000..87fb92b
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/AllocationMapper.java
@@ -0,0 +1,33 @@
+package com.moral.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.ext.allocation.AllocationListExt;
+import com.moral.api.pojo.ext.allocation.AllocationPageExt;
+import com.moral.api.pojo.query.allocation.AllocationListCond;
+import com.moral.api.pojo.query.allocation.AllocationPageCond;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface AllocationMapper extends BaseMapper<Allocation> {
+
+    /**
+     * ������������������
+     * @param id
+     * @return AllocationExt
+     */
+    AllocationExt extOne(@Param("id") Integer id);
+
+    Page<AllocationPageExt> extPage(Page page, @Param("allocation") AllocationPageCond allocationPageCond);
+
+    /**
+     * ������������������
+     * @param allocationListCond
+     * @return AllocationListExt
+     */
+    List<AllocationListExt> extList(@Param("allocation") AllocationListCond allocationListCond);
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/mapper/ApproveTableMapper.java b/screen-api/src/main/java/com/moral/api/mapper/ApproveTableMapper.java
new file mode 100644
index 0000000..cfd2ce2
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/ApproveTableMapper.java
@@ -0,0 +1,8 @@
+package com.moral.api.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.ApproveTable;
+
+public interface ApproveTableMapper extends BaseMapper<ApproveTable> {
+}
diff --git a/screen-api/src/main/java/com/moral/api/mapper/FileTableMapper.java b/screen-api/src/main/java/com/moral/api/mapper/FileTableMapper.java
new file mode 100644
index 0000000..6486afb
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/FileTableMapper.java
@@ -0,0 +1,16 @@
+package com.moral.api.mapper;
+
+import com.moral.api.entity.FileTable;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * ��������� Mapper ������
+ * </p>
+ *
+ * @author moral
+ * @since 2023-09-21
+ */
+public interface FileTableMapper extends BaseMapper<FileTable> {
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java b/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
new file mode 100644
index 0000000..424b762
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
@@ -0,0 +1,8 @@
+package com.moral.api.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.ResponsibilityUnit;
+
+public interface ResponsibilityUnitMapper extends BaseMapper<ResponsibilityUnit> {
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/bean/BaseCreateEntity.java b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseCreateEntity.java
new file mode 100644
index 0000000..b35d9b4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseCreateEntity.java
@@ -0,0 +1,53 @@
+package com.moral.api.pojo.bean;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName BaseCreateEntity
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 10:54
+ * @Version 1.0
+ */
+@Getter
+@SuppressWarnings("unchecked")
+public abstract  class BaseCreateEntity <T extends Serializable> implements BaseEntity<T>{
+    /**
+     * ���������ID
+     */
+    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_NULL)
+    private Integer createId;
+
+    /**
+     * ���������������
+     */
+    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_NULL)
+    private String createName;
+
+    /**
+     * ������������
+     */
+    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_NULL)
+    private Date createTime;
+
+    public T setCreateUserId(Integer createId) {
+        this.createId = createId;
+        return (T) this;
+    }
+
+    public T setCreateUserName(String createName) {
+        this.createName = createName;
+        return (T) this;
+    }
+
+    public T setCreateTime(Date createTime) {
+        this.createTime = createTime;
+        return (T) this;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/bean/BaseDelEntity.java b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseDelEntity.java
new file mode 100644
index 0000000..5c37fe4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseDelEntity.java
@@ -0,0 +1,33 @@
+package com.moral.api.pojo.bean;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName BaseDelEntity
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 11:01
+ * @Version 1.0
+ */
+public abstract class BaseDelEntity <T extends Serializable> extends BaseUpdateEntity<T>{
+    /**
+     * ������������
+     */
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT_UPDATE, updateStrategy = FieldStrategy.NOT_NULL)
+    private Integer isDel;
+
+    public T setIsDel(Integer isDel) {
+        this.isDel = isDel;
+        return (T) this;
+    }
+
+    public Integer getIsDel() {
+        return isDel;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/bean/BaseEntity.java b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseEntity.java
new file mode 100644
index 0000000..cb9c68e
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseEntity.java
@@ -0,0 +1,13 @@
+package com.moral.api.pojo.bean;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName BaseEntity
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 10:56
+ * @Version 1.0
+ */
+public interface BaseEntity <T extends Serializable> extends Serializable{
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/bean/BaseInvalidEntity.java b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseInvalidEntity.java
new file mode 100644
index 0000000..4d50b4d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseInvalidEntity.java
@@ -0,0 +1,31 @@
+package com.moral.api.pojo.bean;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName BaseInvalidEntity
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 11:00
+ * @Version 1.0
+ */
+public abstract  class BaseInvalidEntity <T extends Serializable> extends BaseDelEntity<T>{
+    /**
+     * ������������
+     */
+    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NOT_NULL)
+    private Integer isInvalid;
+
+    public T setIsInvalid(Integer isInvalid) {
+        this.isInvalid = isInvalid;
+        return (T) this;
+    }
+
+    public Integer getIsInvalid() {
+        return isInvalid;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/bean/BaseUpdateEntity.java b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseUpdateEntity.java
new file mode 100644
index 0000000..5868a70
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/bean/BaseUpdateEntity.java
@@ -0,0 +1,53 @@
+package com.moral.api.pojo.bean;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName BaseUpdateEntity
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 10:57
+ * @Version 1.0
+ */
+@Getter
+@SuppressWarnings("unchecked")
+public abstract class BaseUpdateEntity <T extends Serializable> extends BaseCreateEntity<T>{
+    /**
+     * ���������ID
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE, updateStrategy = FieldStrategy.NOT_NULL)
+    private Integer updateId;
+
+    /**
+     * ���������������
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE, updateStrategy = FieldStrategy.NOT_NULL)
+    private String updateName;
+
+    /**
+     * ������������
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE, updateStrategy = FieldStrategy.NOT_NULL)
+    private Date updateTime;
+
+    public T setUpdateId(Integer updateId) {
+        this.updateId = updateId;
+        return (T) this;
+    }
+
+    public T setUpdateName(String updateName) {
+        this.updateName = updateName;
+        return (T) this;
+    }
+
+    public T setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+        return (T) this;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitDto.java b/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitDto.java
new file mode 100644
index 0000000..ed7eb66
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitDto.java
@@ -0,0 +1,153 @@
+package com.moral.api.pojo.dto.allocation;
+
+
+import lombok.Data;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Data
+public class AllocationUnitDto {
+
+
+    /**
+     * ������id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer allocationId;
+
+    /**
+     *������������
+     */
+    private String allocationNum;
+
+    /**
+     * ������or������
+     */
+    private String escalationType;
+
+    /**
+     * ������������
+     */
+    private Date escalationTime;
+
+    /**
+     * ������������
+     */
+    private String pollutePosition;
+
+    /**
+     * ������������������
+     */
+    private String unitName;
+
+    /**
+     * ������������������
+     */
+    private String polluteTypeName;
+
+    /**
+     * ������������������
+     */
+    private String changeTypeName;
+
+
+
+    /**
+     * ������������
+     */
+    private Integer changeDay;
+
+    /**
+     * ������������������
+     */
+    private String escalationUnitName;
+
+    /**
+     * ���������
+     */
+    private String escalationName;
+
+    /**
+     * ������������id
+     */
+    private String investigationTypeName;
+
+    /**
+     * ������������
+     */
+    private String problemDescribe;
+
+    /**
+     * ������������
+     */
+    private Integer isChange;
+
+    /**
+     * ������������
+     */
+    private String changeDescribe;
+    /**
+     * ���������������
+     */
+    private String changeName;
+
+    /**
+     * ������������
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date changeTime;
+
+    /**
+     * ������������
+     */
+    private Integer checkScore;
+    /**
+     * ������������
+     */
+    private String checkDescribe;
+    /**
+     * ���������
+     */
+    private String checkName;
+
+
+
+    /**
+     * ������������
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date checkTime;
+    /**
+     * ������ 0 ������  1 ������ 2
+     */
+    private String state;
+    /**
+     * ������������
+     */
+    private String isDel;
+    /**
+     * ������������
+     */
+    private String isInvalid;
+    /**
+     * ������������
+     */
+    private String invalidReason;
+
+    private Integer createId;
+
+    private String createName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    private Integer updateId;
+
+    private String updateName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitViewDto.java b/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitViewDto.java
new file mode 100644
index 0000000..74b5cb1
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/dto/allocation/AllocationUnitViewDto.java
@@ -0,0 +1,46 @@
+package com.moral.api.pojo.dto.allocation;
+
+
+import lombok.Data;
+
+@Data
+public class AllocationUnitViewDto {
+
+
+
+    private  String unitName;
+
+    /**
+     * ������
+     */
+    private  Integer total;
+
+    /**
+     * ���������
+     */
+    private  Integer number;
+    /**
+     *������������
+     */
+    private  Integer unNumber;
+
+    /**
+     * ���������
+     */
+    private  String rate;
+
+
+    /**
+     * ������
+     */
+    private  Integer deduction;
+
+    /**
+     * ������
+     */
+    private  Integer marks;
+    /**
+     * ������
+     */
+    private  Integer totalPoints;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationApproveEnum.java b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationApproveEnum.java
index 24d3383..10946d3 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationApproveEnum.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationApproveEnum.java
@@ -20,13 +20,21 @@
 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum AllocationApproveEnum implements IntegerValueEnum{
     /**
+     *������
+     */
+    DRAFT(9, "������"),
+    /**
      *������
      */
     NEW_BUILT(10, "������"),
     /**
      *���������
      */
-    UNDER_RECTIFICATION(20, "���������"),
+   // CHANGE(19, "������"),
+    /**
+     *���������
+     */
+    UNDER_RECTIFICATION(20, "������"),
     /**
      *���������
      */
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationEscalationTypeEnum.java b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationEscalationTypeEnum.java
new file mode 100644
index 0000000..4d450e0
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationEscalationTypeEnum.java
@@ -0,0 +1,59 @@
+package com.moral.api.pojo.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.exception.BusinessException;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName StateEnum
+ * @Description TODO
+ * @Author @lizijie
+ * @Date 2023-09-20 11:11
+ * @Version 1.0
+ */
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum AllocationEscalationTypeEnum implements IntegerValueEnum {
+
+    /**
+     *������
+     */
+    SELF(1, "������"),
+    /**
+     *������
+     */
+    CHECK(2, "������"),
+   ;
+
+    @EnumValue
+    public  final Integer value;
+    public  final String name;
+
+    AllocationEscalationTypeEnum(Integer value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+
+    private static Map<Integer, AllocationEscalationTypeEnum> valueMap = new HashMap<>();
+    static {
+        for (AllocationEscalationTypeEnum v : AllocationEscalationTypeEnum.values()) {
+            valueMap.put(v.value, v);
+        }
+    }
+    @JsonCreator
+    public static AllocationEscalationTypeEnum getByValue(Integer value) {
+        if (value == null) {
+            return null;
+        }
+        AllocationEscalationTypeEnum result = valueMap.get(value);
+        if (result == null) {
+            throw new BusinessException("������������������" + value);
+        }
+        return result;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationExtensionApproveEnum.java b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationExtensionApproveEnum.java
new file mode 100644
index 0000000..18a3f15
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/AllocationExtensionApproveEnum.java
@@ -0,0 +1,68 @@
+package com.moral.api.pojo.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.exception.BusinessException;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName InvestigationEnum
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-20 14:47
+ * @Version 1.0
+ */
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum AllocationExtensionApproveEnum implements IntegerValueEnum{
+
+    /**
+     *���������
+     */
+    NOT_AAPPROVE(10, "���������"),
+    /**
+     *���������
+     */
+    APPLYING(30, "���������"),
+    /**
+     *������
+     */
+    PASS(40, "������"),
+    /**
+     *������
+     */
+    REFUSE(50, "������"),
+
+    ;
+
+    @EnumValue
+    public  final Integer value;
+    public  final String name;
+
+    AllocationExtensionApproveEnum(Integer value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+
+    private static Map<Integer, AllocationExtensionApproveEnum> valueMap = new HashMap<>();
+    static {
+        for (AllocationExtensionApproveEnum v : AllocationExtensionApproveEnum.values()) {
+            valueMap.put(v.value, v);
+        }
+    }
+    @JsonCreator
+    public static AllocationExtensionApproveEnum getByValue(Integer value) {
+        if (value == null) {
+            return null;
+        }
+        AllocationExtensionApproveEnum result = valueMap.get(value);
+        if (result == null) {
+            throw new BusinessException("������������������" + value);
+        }
+        return result;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/FileTableEnum.java b/screen-api/src/main/java/com/moral/api/pojo/enums/FileTableEnum.java
new file mode 100644
index 0000000..7907409
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/FileTableEnum.java
@@ -0,0 +1,68 @@
+package com.moral.api.pojo.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.exception.BusinessException;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName StateEnum
+ * @Description TODO
+ * @Author @lizijie
+ * @Date 2023-09-20 11:11
+ * @Version 1.0
+ */
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum FileTableEnum implements IntegerValueEnum {
+    /**
+     *���������������
+     */
+    ALLOCATION_FOUNDATION(1010201, "���������������"),
+    /**
+     *���������������
+     */
+    ALLOCATION_RECTIFICATION(1010202, "���������������"),
+    /**
+     *���������������
+     */
+    ALLOCATION_APPROVE(1010203, "���������������"),
+
+    /**
+     *������������
+     */
+    ALLOCATION_EXTENSION(1251701, "������������"),
+
+    ;
+
+    @EnumValue
+    public  final Integer value;
+    public  final String name;
+
+    FileTableEnum(Integer value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+
+    private static Map<Integer, FileTableEnum> valueMap = new HashMap<>();
+    static {
+        for (FileTableEnum v : FileTableEnum.values()) {
+            valueMap.put(v.value, v);
+        }
+    }
+    @JsonCreator
+    public static FileTableEnum getByValue(Integer value) {
+        if (value == null) {
+            return null;
+        }
+        FileTableEnum result = valueMap.get(value);
+        if (result == null) {
+            throw new BusinessException("������������������" + value);
+        }
+        return result;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/FileType.java b/screen-api/src/main/java/com/moral/api/pojo/enums/FileType.java
new file mode 100644
index 0000000..c90a951
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/FileType.java
@@ -0,0 +1,69 @@
+package com.moral.api.pojo.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName FileType
+ * @Description
+ * @Author fan
+ * @Date 2021/2/1 13:48
+ * @Version 1.0
+ **/
+@Getter
+public enum FileType {
+
+    /**
+     * ������
+     */
+    NON(-1),
+    /**
+     * ������
+     */
+    PICTURE(1),
+    /**
+     * word
+     */
+    WORD(2),
+    /**
+     * excel
+     */
+    EXCEL(3),
+    /**
+     * pdf
+     */
+    PDF(4),
+    /**
+     * ���������
+     */
+    ZIP(5),
+    ;
+
+    @EnumValue
+    private final Integer value;
+
+    FileType(Integer value) {
+        this.value = value;
+    }
+
+    private static final Map<Integer, FileType> VALUE_MAP = new HashMap<>();
+
+    static {
+        for (FileType var : values()) {
+            VALUE_MAP.put(var.getValue(), var);
+        }
+    }
+
+    @JsonCreator
+    public static FileType getEnumByCode(Integer value) {
+        FileType fileType = VALUE_MAP.get(value);
+        if (fileType == null) {
+            throw new RuntimeException("enum not find element, [" + value + "]");
+        }
+        return fileType;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/StateEnum.java b/screen-api/src/main/java/com/moral/api/pojo/enums/StateEnum.java
index 0c1f9e9..ed214a8 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/enums/StateEnum.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/StateEnum.java
@@ -22,11 +22,11 @@
     /**
      *���������
      */
-    NOT_EFFECTIVE(10, "���������"),
+    NOT_EFFECTIVE(0, "���������"),
     /**
      *���������
      */
-    TAKE_EFFECT(20, "���������");
+    TAKE_EFFECT(1, "���������");
 
     @EnumValue
     public  final Integer value;
diff --git a/screen-api/src/main/java/com/moral/api/pojo/enums/YesOrNo.java b/screen-api/src/main/java/com/moral/api/pojo/enums/YesOrNo.java
index 7035cd3..2e9d929 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/enums/YesOrNo.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/enums/YesOrNo.java
@@ -26,7 +26,7 @@
     /**
      *���������
      */
-    No(0, "���");
+    NO(0, "���");
 
     @EnumValue
     public  final Integer value;
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java
new file mode 100644
index 0000000..a0fca82
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationExt.java
@@ -0,0 +1,37 @@
+package com.moral.api.pojo.ext.allocation;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.file.FileVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExt extends Allocation {
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileChangeList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileApproveList;
+
+    @ApiModelProperty(value = "������������")
+    private List<ApproveTableListVo> approveList;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationListExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationListExt.java
new file mode 100644
index 0000000..f3f57fb
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationListExt.java
@@ -0,0 +1,22 @@
+package com.moral.api.pojo.ext.allocation;
+
+import com.moral.api.entity.Allocation;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationListExt extends Allocation {
+
+}
+
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java
new file mode 100644
index 0000000..4608560
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocation/AllocationPageExt.java
@@ -0,0 +1,24 @@
+package com.moral.api.pojo.ext.allocation;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.moral.api.entity.Allocation;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @ClassName AllocationPageExt
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-25 14:34
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationPageExt extends Allocation {
+
+
+    private Integer applyState;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionExt.java
new file mode 100644
index 0000000..c1c6561
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionExt.java
@@ -0,0 +1,69 @@
+package com.moral.api.pojo.ext.allocationextension;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.pojo.vo.file.FileVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExtensionExt extends AllocationExtension {
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+
+    @ApiModelProperty(value = "������������")
+    private Date escalationTime;
+
+
+    @ApiModelProperty(value = "������������")
+    private String pollutePosition;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileList;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionListExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionListExt.java
new file mode 100644
index 0000000..45a8322
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionListExt.java
@@ -0,0 +1,22 @@
+package com.moral.api.pojo.ext.allocationextension;
+
+import com.moral.api.entity.AllocationExtension;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExtensionListExt extends AllocationExtension {
+
+}
+
diff --git a/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionPageExt.java b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionPageExt.java
new file mode 100644
index 0000000..0ce0e29
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/ext/allocationextension/AllocationExtensionPageExt.java
@@ -0,0 +1,40 @@
+package com.moral.api.pojo.ext.allocationextension;
+
+import com.moral.api.entity.AllocationExtension;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AllocationExtensionPageExt extends AllocationExtension {
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+    @ApiModelProperty(value = "������������")
+    private Date escalationTime;
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/OrderByItem.java b/screen-api/src/main/java/com/moral/api/pojo/query/OrderByItem.java
new file mode 100644
index 0000000..2dcc3cf
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/OrderByItem.java
@@ -0,0 +1,41 @@
+package com.moral.api.pojo.query;
+
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description
+ *
+ * @Date 2020/10/27 10:59
+ * @Version 1.0
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "������������", description = "������������")
+public class OrderByItem {
+
+    @ApiModelProperty(value = "���������������")
+    private String name;
+
+    @ApiModelProperty(value = "������������")
+    private OrderType order;
+
+    public OrderItem convertOrderItem() {
+        OrderItem orderItem = new OrderItem();
+        switch (order) {
+            case ASC:
+                orderItem = OrderItem.asc(this.name);
+                break;
+            case DESC:
+                orderItem = OrderItem.desc(this.name);
+                break;
+            default:
+                break;
+        }
+        return orderItem;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/OrderType.java b/screen-api/src/main/java/com/moral/api/pojo/query/OrderType.java
new file mode 100644
index 0000000..08c5ab2
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/OrderType.java
@@ -0,0 +1,55 @@
+package com.moral.api.pojo.query;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description
+ *
+ * @Date 2020/10/27 11:00
+ * @Version 1.0
+ */
+@Getter
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum OrderType {
+
+    /**
+     * ASC
+     */
+    ASC("ascending"),
+    /**
+     * DESC
+     */
+    DESC("descending"),
+    ;
+
+    private static Map<String, OrderType> valueMap = new HashMap<>();
+
+    static {
+        for (OrderType orderType : OrderType.values()) {
+            valueMap.put(orderType.code, orderType);
+        }
+    }
+
+    @EnumValue
+    public final String code;
+
+    OrderType(String code) {
+        this.code = code;
+    }
+
+    @JsonCreator
+    public static OrderType getByValue(String code) {
+        OrderType result = valueMap.get(code);
+        if (result == null) {
+            throw new IllegalArgumentException("No element matches " + code);
+        }
+        return result;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/PageCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/PageCond.java
new file mode 100644
index 0000000..0fab677
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/PageCond.java
@@ -0,0 +1,44 @@
+package com.moral.api.pojo.query;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "������������", description = "������������")
+public class PageCond {
+
+    @ApiModelProperty(value = "������")
+    private List<OrderByItem> orders;
+
+    @ApiModelProperty(value = "������������")
+    private long pageSize;
+
+    @ApiModelProperty(value = "������������")
+    private long currentPage;
+
+    public List<OrderByItem> orders() {
+        return this.orders;
+    }
+
+    public Page convertPage() {
+        Page page = new Page();
+        page.setCurrent(this.currentPage);
+        page.setSize(this.pageSize);
+        if (CollectionUtils.isNotEmpty(orders)) {
+            page.setOrders(this.orders.stream().map(orderByItem -> orderByItem.convertOrderItem()).collect(Collectors.toList()));
+        }
+        return page;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationAddCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationAddCond.java
new file mode 100644
index 0000000..02375d9
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationAddCond.java
@@ -0,0 +1,77 @@
+package com.moral.api.pojo.query.allocation;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������", description="Allocation - ������������")
+public class AllocationAddCond implements Serializable {
+
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Date escalationTime;
+
+    @ApiModelProperty(value = "������������")
+    private String pollutePosition;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+    @ApiModelProperty(value = "������")
+    @NotNull(message = "���������������������")
+    private Integer state;
+
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+
+    public Allocation convert() {
+        Allocation allocation = BeanConverts.convert(this, Allocation.class);
+        return allocation;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationChangeCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationChangeCond.java
new file mode 100644
index 0000000..1982fe0
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationChangeCond.java
@@ -0,0 +1,58 @@
+package com.moral.api.pojo.query.allocation;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������������", description="Allocation - ������������������")
+public class AllocationChangeCond implements Serializable {
+
+    @ApiModelProperty(value = "������id")
+    @NotNull(message = "������id���������������")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Integer isChange;
+
+    @ApiModelProperty(value = "������������")
+    private String changeDescribe;
+
+    @ApiModelProperty(value = "���������������")
+    @NotEmpty(message = "������������������������������")
+    private String changeName;
+
+    @ApiModelProperty(value = "������")
+    @NotNull(message = "���������������������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileChangeList;
+
+    public Allocation convert() {
+        Allocation allocation = BeanConverts.convert(this, Allocation.class);
+        return allocation;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationCheckCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationCheckCond.java
new file mode 100644
index 0000000..675faa4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationCheckCond.java
@@ -0,0 +1,53 @@
+package com.moral.api.pojo.query.allocation;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������������", description="Allocation - ������������������")
+public class AllocationCheckCond implements Serializable {
+
+    @ApiModelProperty(value = "������id")
+    @NotNull(message = "������id���������������")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Integer checkScore;
+
+    @ApiModelProperty(value = "������������")
+    private String checkDescribe;
+
+    @ApiModelProperty(value = "������")
+    @NotNull(message = "���������������������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileApproveList;
+
+    public Allocation convert() {
+        Allocation allocation = BeanConverts.convert(this, Allocation.class);
+        return allocation;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationListCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationListCond.java
new file mode 100644
index 0000000..df6251d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationListCond.java
@@ -0,0 +1,37 @@
+package com.moral.api.pojo.query.allocation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������������", description="Allocation - ������������������")
+public class AllocationListCond implements Serializable {
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������")
+    private String startTime;
+
+    @ApiModelProperty(value = "������������")
+    private String endTime;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationPageCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationPageCond.java
new file mode 100644
index 0000000..a9f41f7
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationPageCond.java
@@ -0,0 +1,54 @@
+package com.moral.api.pojo.query.allocation;
+
+import com.moral.api.pojo.query.PageCond;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������������", description="Allocation - ������������������")
+public class AllocationPageCond implements Serializable{
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String startTime;
+
+    @ApiModelProperty(value = "������������")
+    private String endTime;
+
+    @ApiModelProperty(value = "������������")
+    private PageCond page;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationUpdateCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationUpdateCond.java
new file mode 100644
index 0000000..41c311b
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocation/AllocationUpdateCond.java
@@ -0,0 +1,85 @@
+package com.moral.api.pojo.query.allocation;
+
+import com.moral.api.entity.Allocation;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������������", description="Allocation - ������������")
+public class AllocationUpdateCond implements Serializable {
+
+    @ApiModelProperty(value = "������id")
+    @NotNull(message = "������id���������������")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Date escalationTime;
+
+    @ApiModelProperty(value = "������������")
+    @NotEmpty(message = "���������������������������")
+    private String pollutePosition;
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    @NotEmpty(message = "������������������������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    @NotNull(message = "���������������������������")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+    @ApiModelProperty(value = "������")
+    @NotNull(message = "���������������������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+    public Allocation convert() {
+        Allocation allocation = BeanConverts.convert(this, Allocation.class);
+        return allocation;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionAddCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionAddCond.java
new file mode 100644
index 0000000..5b01be4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionAddCond.java
@@ -0,0 +1,51 @@
+package com.moral.api.pojo.query.allocationextension;
+
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������������", description="AllocationExtension - ������������")
+public class AllocationExtensionAddCond implements Serializable {
+
+
+    @ApiModelProperty(value = "���������id")
+    @NotNull(message = "���������id���������������")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    @NotNull(message = "���������������������������")
+    private Integer extensionNum;
+
+    @ApiModelProperty(value = "������������")
+    @NotEmpty(message = "���������������������������")
+    private String remake;
+
+    @ApiModelProperty(value = "������")
+    private List<FileVo> fileList;
+    public AllocationExtension convert() {
+        AllocationExtension allocationExtension = BeanConverts.convert(this, AllocationExtension.class);
+        return allocationExtension;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionListCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionListCond.java
new file mode 100644
index 0000000..6a2b90d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionListCond.java
@@ -0,0 +1,28 @@
+package com.moral.api.pojo.query.allocationextension;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������������������", description="AllocationExtension - ������������������")
+public class AllocationExtensionListCond implements Serializable {
+
+    @ApiModelProperty(value = "ID")
+    private Integer id;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionPageCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionPageCond.java
new file mode 100644
index 0000000..63d70bf
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionPageCond.java
@@ -0,0 +1,49 @@
+package com.moral.api.pojo.query.allocationextension;
+
+import com.moral.api.pojo.query.PageCond;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������������������", description="AllocationExtension - ������������������")
+public class AllocationExtensionPageCond implements Serializable{
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private String startTime;
+
+    @ApiModelProperty(value = "������������")
+    private String endTime;
+
+    @ApiModelProperty(value = "������������")
+    private PageCond page;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionUpdateCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionUpdateCond.java
new file mode 100644
index 0000000..9cddc8f
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/allocationextension/AllocationExtensionUpdateCond.java
@@ -0,0 +1,76 @@
+package com.moral.api.pojo.query.allocationextension;
+
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������������", description="AllocationExtension - ������������")
+public class AllocationExtensionUpdateCond implements Serializable {
+
+    @ApiModelProperty(value = "������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    private Integer extensionNum;
+
+    @ApiModelProperty(value = "������������")
+    private String remake;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isDel;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String invalidReason;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    private Date updateTime;
+
+
+
+    public AllocationExtension convert() {
+        AllocationExtension allocationExtension = BeanConverts.convert(this, AllocationExtension.class);
+        return allocationExtension;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableAddCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableAddCond.java
new file mode 100644
index 0000000..0f1e6cf
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableAddCond.java
@@ -0,0 +1,70 @@
+package com.moral.api.pojo.query.approvetable;
+
+import com.moral.api.entity.ApproveTable;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ApproveTable - ������������", description="ApproveTable - ������������")
+public class ApproveTableAddCond implements Serializable {
+
+    @ApiModelProperty(value = "������������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "������")
+    private Integer approveModule;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer relationId;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private String stateName;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isDel;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    private Date updateTime;
+
+
+
+    public ApproveTable convert() {
+        ApproveTable approveTable = BeanConverts.convert(this, ApproveTable.class);
+        return approveTable;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableListCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableListCond.java
new file mode 100644
index 0000000..4d3ce16
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableListCond.java
@@ -0,0 +1,28 @@
+package com.moral.api.pojo.query.approvetable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ApproveTable - ������������������", description="ApproveTable - ������������������")
+public class ApproveTableListCond implements Serializable {
+
+    @ApiModelProperty(value = "ID")
+    private Integer id;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTablePageCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTablePageCond.java
new file mode 100644
index 0000000..443d856
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTablePageCond.java
@@ -0,0 +1,31 @@
+package com.moral.api.pojo.query.approvetable;
+
+import com.moral.api.pojo.query.PageCond;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ApproveTable - ������������������", description="ApproveTable - ������������������")
+public class ApproveTablePageCond implements Serializable{
+
+    @ApiModelProperty(value = "ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "������������")
+    private PageCond page;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableUpdateCond.java b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableUpdateCond.java
new file mode 100644
index 0000000..2e83c1b
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/query/approvetable/ApproveTableUpdateCond.java
@@ -0,0 +1,70 @@
+package com.moral.api.pojo.query.approvetable;
+
+import com.moral.api.entity.ApproveTable;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ApproveTable - ������������", description="ApproveTable - ������������")
+public class ApproveTableUpdateCond implements Serializable {
+
+    @ApiModelProperty(value = "������������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "������")
+    private Integer approveModule;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer relationId;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private String stateName;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isDel;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    private Date updateTime;
+
+
+
+    public ApproveTable convert() {
+        ApproveTable approveTable = BeanConverts.convert(this, ApproveTable.class);
+        return approveTable;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/DictionaryVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/DictionaryVo.java
index e1874dc..dacd8de 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/DictionaryVo.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/DictionaryVo.java
@@ -33,7 +33,10 @@
     private List<Map<String, Object>> ChangeEnum;
     private List<Map<String, Object>> YesOrNo;
 
+    private List<Map<String, Object>> AllocationApproveEnum;
+    private List<Map<String, Object>> FileTableEnum;
 
+    private List<Map<String, Object>> AllocationExtensionApproveEnum;
 
 
     public static List<Map<String, Object>> enumArray2Map(Enum[] enums) {
@@ -62,5 +65,17 @@
         return this;
     }
 
+    public DictionaryVo setFileTableEnum(com.moral.api.pojo.enums.FileTableEnum[] enumResult) {
+        this.FileTableEnum = enumArray2Map(enumResult);
+        return this;
+    }
+    public DictionaryVo setAllocationApproveEnum(com.moral.api.pojo.enums.AllocationApproveEnum[] enumResult) {
+        this.AllocationApproveEnum = enumArray2Map(enumResult);
+        return this;
+    }
+    public DictionaryVo setAllocationExtensionApproveEnum(com.moral.api.pojo.enums.AllocationExtensionApproveEnum[] enumResult) {
+        this.AllocationExtensionApproveEnum = enumArray2Map(enumResult);
+        return this;
+    }
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java
new file mode 100644
index 0000000..3264fd6
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationPageVo.java
@@ -0,0 +1,122 @@
+package com.moral.api.pojo.vo.allocation;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.pojo.enums.AllocationApproveEnum;
+import com.moral.api.pojo.ext.allocation.AllocationPageExt;
+import com.moral.api.utils.BeanConverts;
+import com.moral.util.DateUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������VO������", description="Allocation - ������VO������")
+public class AllocationPageVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������id")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date escalationTime;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������")
+    private Integer residueDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "������������������")
+    private Integer applyState;
+
+
+    public static AllocationPageVo convert(AllocationPageExt allocationPageExt) {
+        AllocationPageVo allocationPageVo = BeanConverts.convert(allocationPageExt, AllocationPageVo.class);
+        return allocationPageVo;
+    }
+
+    public static List<AllocationPageVo> convert(List<AllocationPageExt> allocationPageExtList) {
+        return allocationPageExtList.stream().map(AllocationPageVo::convert).collect(Collectors.toList());
+    }
+
+    public Integer getResidueDay() {
+        int day = this.changeDay;
+        if(AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(state)){
+            Date date = new Date();
+            int days = DateUtils.getDays(escalationTime, date);
+            return day-days;
+        }
+        return day;
+    }
+
+    public Integer getApplyState() {
+        return Objects.isNull(applyState)?0:applyState;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java
new file mode 100644
index 0000000..5dfca31
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocation/AllocationVo.java
@@ -0,0 +1,144 @@
+package com.moral.api.pojo.vo.allocation;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="Allocation - ������VO������", description="Allocation - ������VO������")
+public class AllocationVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������id")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date escalationTime;
+
+    @ApiModelProperty(value = "������������")
+    private String pollutePosition;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isChange;
+
+    @ApiModelProperty(value = "������������")
+    private String changeDescribe;
+
+    @ApiModelProperty(value = "���������������")
+    private String changeName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date changeTime;
+
+    @ApiModelProperty(value = "������������")
+    private Integer checkScore;
+
+    @ApiModelProperty(value = "������������")
+    private String checkDescribe;
+
+    @ApiModelProperty(value = "���������")
+    private String checkName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date checkTime;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String invalidReason;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileChangeList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileApproveList;
+
+    @ApiModelProperty(value = "������������")
+    private List<ApproveTableListVo> approveList;
+
+
+    public static AllocationVo convert(AllocationExt allocationExt) {
+        AllocationVo allocationVo = BeanConverts.convert(allocationExt, AllocationVo.class);
+        return allocationVo;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionListVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionListVo.java
new file mode 100644
index 0000000..754e362
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionListVo.java
@@ -0,0 +1,83 @@
+package com.moral.api.pojo.vo.allocationextension;
+
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionListExt;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������VO������", description="AllocationExtension - ������VO������")
+public class AllocationExtensionListVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer allocationId;
+
+    @ApiModelProperty(value = "������������")
+    private Integer extensionNum;
+
+    @ApiModelProperty(value = "������������")
+    private String remake;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isDel;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String invalidReason;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    private Date updateTime;
+
+
+
+    public static AllocationExtensionListVo convert(AllocationExtensionListExt allocationExtensionListExt) {
+        AllocationExtensionListVo allocationExtensionListVo = BeanConverts.convert(allocationExtensionListExt, AllocationExtensionListVo.class);
+        return allocationExtensionListVo;
+    }
+
+    public static List<AllocationExtensionListVo> convert(List<AllocationExtensionListExt> allocationExtensionListExtList) {
+        return allocationExtensionListExtList.stream().map(AllocationExtensionListVo::convert).collect(Collectors.toList());
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionPageVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionPageVo.java
new file mode 100644
index 0000000..f9915bc
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionPageVo.java
@@ -0,0 +1,96 @@
+package com.moral.api.pojo.vo.allocationextension;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������VO������", description="AllocationExtension - ������VO������")
+public class AllocationExtensionPageVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date escalationTime;
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+
+    @ApiModelProperty(value = "������������")
+    private Integer extensionNum;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updateTime;
+
+
+
+    public static AllocationExtensionPageVo convert(AllocationExtensionPageExt allocationExtensionPageExt) {
+        AllocationExtensionPageVo allocationExtensionPageVo = BeanConverts.convert(allocationExtensionPageExt, AllocationExtensionPageVo.class);
+        return allocationExtensionPageVo;
+    }
+
+    public static List<AllocationExtensionPageVo> convert(List<AllocationExtensionPageExt> allocationExtensionPageExtList) {
+        return allocationExtensionPageExtList.stream().map(AllocationExtensionPageVo::convert).collect(Collectors.toList());
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionVo.java
new file mode 100644
index 0000000..c93ad27
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/allocationextension/AllocationExtensionVo.java
@@ -0,0 +1,122 @@
+package com.moral.api.pojo.vo.allocationextension;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.utils.BeanConverts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="AllocationExtension - ������VO������", description="AllocationExtension - ������VO������")
+public class AllocationExtensionVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "������������")
+    private String allocationNum;
+
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date escalationTime;
+
+
+    @ApiModelProperty(value = "������������")
+    private String pollutePosition;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer unitId;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer polluteType;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "������������")
+    private Integer changeDay;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer escalationUnitId;
+
+    @ApiModelProperty(value = "���������")
+    private String escalationName;
+
+    @ApiModelProperty(value = "������������id")
+    private Integer investigationType;
+
+    @ApiModelProperty(value = "������������")
+    private String problemDescribe;
+
+
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileBaseList;
+
+    @ApiModelProperty(value = "������������")
+    private List<FileVo> fileList;
+
+
+    @ApiModelProperty(value = "������������")
+    private Integer extensionNum;
+
+    @ApiModelProperty(value = "������������")
+    private String remake;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private Integer isInvalid;
+
+    @ApiModelProperty(value = "������������")
+    private String invalidReason;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer updateId;
+
+    @ApiModelProperty(value = "���������������")
+    private String updateName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updateTime;
+
+
+
+    public static AllocationExtensionVo convert(AllocationExtensionExt allocationExtensionExt) {
+        AllocationExtensionVo allocationExtensionVo = BeanConverts.convert(allocationExtensionExt, AllocationExtensionVo.class);
+        return allocationExtensionVo;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/approvetable/ApproveTableListVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/approvetable/ApproveTableListVo.java
new file mode 100644
index 0000000..1317d7e
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/approvetable/ApproveTableListVo.java
@@ -0,0 +1,47 @@
+package com.moral.api.pojo.vo.approvetable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ApproveTable - ������VO������", description="ApproveTable - ������VO������")
+public class ApproveTableListVo implements Serializable {
+
+
+    @ApiModelProperty(value = "������������id")
+    private Integer id;
+
+    @ApiModelProperty(value = "������")
+    private Integer state;
+
+    @ApiModelProperty(value = "������������")
+    private String stateName;
+
+    @ApiModelProperty(value = "���������id")
+    private Integer createId;
+
+    @ApiModelProperty(value = "���������������")
+    private String createName;
+
+    @ApiModelProperty(value = "������������")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileVo.java
new file mode 100644
index 0000000..6a779e2
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/file/FileVo.java
@@ -0,0 +1,29 @@
+package com.moral.api.pojo.vo.file;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @ClassName FileVo
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-21 14:51
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(description="FileVo - ������VO������")
+public class FileVo {
+    @ApiModelProperty(value = "ID")
+    private Integer fileId;
+
+    @ApiModelProperty(value = "������������")
+    private String fileName;
+
+    @ApiModelProperty(value = "������1������")
+    private Integer fileType;
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/user/QxUser.java b/screen-api/src/main/java/com/moral/api/pojo/vo/user/QxUser.java
new file mode 100644
index 0000000..2f6c656
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/user/QxUser.java
@@ -0,0 +1,34 @@
+package com.moral.api.pojo.vo.user;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @ClassName QxUser
+ * @Description TODO
+ * @Author @cjl
+ * @Date 2023-09-21 15:59
+ * @Version 1.0
+ */
+@Data
+@Accessors(chain = true)
+public class QxUser {
+    /**
+     * ������id
+     */
+    private Integer userId;
+
+    /**
+     * ������������
+     */
+    private String userName;
+
+    /**
+     * ������
+     */
+    private String account;
+    /**
+     * ������������������������
+     */
+    private Integer unitId;
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/AllocationExtensionService.java b/screen-api/src/main/java/com/moral/api/service/AllocationExtensionService.java
new file mode 100644
index 0000000..fd0a982
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/AllocationExtensionService.java
@@ -0,0 +1,44 @@
+package com.moral.api.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionPageCond;
+
+/**
+ * <p>
+ * ��������������� ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+public interface AllocationExtensionService extends IService<AllocationExtension> {
+
+    /**
+     * ������id������������
+     * @param id
+     * @return AllocationExtensionExt
+     */
+    AllocationExtensionExt extOne(Integer id);
+
+    /**
+     * ������������������
+     * @param allocationExtensionPageCond
+     * @return AllocationExtensionPageExt
+     */
+    Page<AllocationExtensionPageExt> extPage(AllocationExtensionPageCond allocationExtensionPageCond);
+
+    /**
+    * ������
+    * @param allocationExtensionAddCond
+    * @return
+    */
+    boolean save(AllocationExtensionAddCond allocationExtensionAddCond);
+
+    boolean check(Integer id,Integer state);
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/AllocationService.java b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
new file mode 100644
index 0000000..8fb6916
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/AllocationService.java
@@ -0,0 +1,63 @@
+package com.moral.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.Allocation;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.ext.allocation.AllocationListExt;
+import com.moral.api.pojo.ext.allocation.AllocationPageExt;
+import com.moral.api.pojo.query.allocation.*;
+import com.moral.api.pojo.dto.allocation.AllocationUnitDto;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+
+public interface AllocationService extends IService<Allocation> {
+
+    List<Map<String, Object>> sysDictData(String code);
+
+    List<ResponsibilityUnit> seleteUnit();
+
+    Integer insertAllocation(AllocationAddCond allocation);
+
+    AllocationUnitDto check(Integer id);
+
+    void updateAll(AllocationUpdateCond allocationUpdateCond);
+
+    List<Allocation> selectAll(Map<String,Object> map);
+
+
+    Map<String, Object> selectUnitView(Map<String,Object> map);
+
+    List<Map<String,Object>> unitExel(Map<String,Object> map);
+
+    Page<AllocationPageExt> extPage(AllocationPageCond allocationPageCond);
+    /**
+     * ������id������������
+     * @param id
+     * @return AllocationExt
+     */
+    AllocationExt extOne(Integer id);
+
+     AllocationExt oneAllocation(Integer id);
+
+    void changeAllocation(AllocationChangeCond changeCond);
+
+    void checkAllocation(AllocationCheckCond checkCond);
+
+    boolean removeById(Integer id);
+
+    boolean invalidResult (Integer id,String invalidReason);
+
+    /**
+     * ������������������
+     * @param allocationListCond
+     * @return AllocationListExt
+     */
+    List<AllocationListExt> extList(AllocationListCond allocationListCond);
+
+    boolean applyFor (AllocationExtensionAddCond allocationExtensionAddCond);
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/ApproveTableService.java b/screen-api/src/main/java/com/moral/api/service/ApproveTableService.java
new file mode 100644
index 0000000..df2c464
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/ApproveTableService.java
@@ -0,0 +1,29 @@
+package com.moral.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.ApproveTable;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * ��������� ���������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+public interface ApproveTableService extends IService<ApproveTable> {
+
+
+    /**
+     * ������
+     * @param approveTable
+     * @return
+     */
+    boolean saveResult(ApproveTable approveTable);
+
+    List<ApproveTableListVo> listAll(int relationId,int fileModule);
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/FileTableService.java b/screen-api/src/main/java/com/moral/api/service/FileTableService.java
new file mode 100644
index 0000000..b63cec4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/FileTableService.java
@@ -0,0 +1,33 @@
+package com.moral.api.service;
+
+import com.moral.api.entity.FileTable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.pojo.vo.file.FileVo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * ��������� ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2023-09-21
+ */
+public interface FileTableService extends IService<FileTable> {
+
+    FileVo upload(MultipartFile file, Integer sysCode);
+
+    List<FileVo> upload(List<MultipartFile>files,Integer sysCode);
+
+    void preview(Integer id, HttpServletRequest request, HttpServletResponse response);
+
+    void coverPreview(Integer id, HttpServletRequest request, HttpServletResponse response);
+
+    void upDateResult(List<FileVo> list,int relationId,int fileModule);
+
+    List<FileVo> list(int relationId,int fileModule);
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/ResponsibilityUnitService.java b/screen-api/src/main/java/com/moral/api/service/ResponsibilityUnitService.java
new file mode 100644
index 0000000..9c525f4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/ResponsibilityUnitService.java
@@ -0,0 +1,27 @@
+package com.moral.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.ResponsibilityUnit;
+
+public interface ResponsibilityUnitService extends IService<ResponsibilityUnit> {
+
+    /**
+     * ������������������������������������
+     * @param code
+     * @return
+     */
+    List<ResponsibilityUnit>  selectUnit(Integer code);
+
+    /**
+     * ������������������������������������������
+     * @param code
+     * @return
+     */
+    ResponsibilityUnit selectAreaUnit(Integer code);
+
+
+
+}
\ No newline at end of file
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/AllocationExtensionServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/AllocationExtensionServiceImpl.java
new file mode 100644
index 0000000..a2259b6
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/AllocationExtensionServiceImpl.java
@@ -0,0 +1,93 @@
+package com.moral.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.Allocation;
+import com.moral.api.entity.AllocationExtension;
+import com.moral.api.exception.BusinessException;
+import com.moral.api.mapper.AllocationExtensionMapper;
+import com.moral.api.pojo.enums.AllocationExtensionApproveEnum;
+import com.moral.api.pojo.enums.FileTableEnum;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt;
+import com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionPageCond;
+import com.moral.api.service.AllocationExtensionService;
+import com.moral.api.service.AllocationService;
+import com.moral.api.service.FileTableService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * ��������������� ���������������
+ * </p>
+ * deyt template generate
+ * @author JI
+ * @since 2023-09-25
+ */
+@Service
+public class AllocationExtensionServiceImpl extends ServiceImpl<AllocationExtensionMapper, AllocationExtension> implements AllocationExtensionService {
+
+    private final AllocationService allocationService;
+    private final FileTableService fileTableService;
+
+    public AllocationExtensionServiceImpl(AllocationService allocationService, FileTableService fileTableService) {
+        this.allocationService = allocationService;
+        this.fileTableService = fileTableService;
+    }
+
+
+    @Override
+    public AllocationExtensionExt extOne(Integer id) {
+        AllocationExtensionExt extensionExt = this.baseMapper.extOne(id);
+        AllocationExt extOne = allocationService.oneAllocation(extensionExt.getAllocationId());
+        extensionExt.setAllocationNum(extOne.getAllocationNum())
+                    .setEscalationTime(extOne.getEscalationTime())
+                    .setPollutePosition(extOne.getPollutePosition())
+                    .setUnitId(extOne.getUnitId())
+                    .setPolluteType(extOne.getPolluteType())
+                    .setChangeType(extOne.getChangeType())
+                    .setChangeDay(extOne.getChangeDay())
+                    .setEscalationName(extOne.getEscalationName())
+                    .setInvestigationType(extOne.getInvestigationType())
+                    .setProblemDescribe(extOne.getProblemDescribe())
+                    .setEscalationUnitId(extOne.getEscalationUnitId());
+        extensionExt.setFileBaseList(fileTableService.list(extensionExt.getAllocationId(), FileTableEnum.ALLOCATION_FOUNDATION.value));
+        extensionExt.setFileList(fileTableService.list(id, FileTableEnum.ALLOCATION_EXTENSION.value));
+        return extensionExt;
+    }
+
+
+
+    @Override
+    public Page<AllocationExtensionPageExt> extPage(AllocationExtensionPageCond allocationExtensionPageCond) {
+        return this.baseMapper.extPage(allocationExtensionPageCond.getPage().convertPage(), allocationExtensionPageCond);
+    }
+
+    @Override
+    public boolean save(AllocationExtensionAddCond allocationExtensionAddCond) {
+        return this.save(allocationExtensionAddCond.convert());
+    }
+
+    @Override
+    @Transactional
+    public boolean check(Integer id, Integer state) {
+        AllocationExtensionExt extensionExt = this.baseMapper.extOne(id);
+        if(!AllocationExtensionApproveEnum.APPLYING.value.equals(extensionExt.getState())){
+            throw new BusinessException("������������������������������");
+        }
+        AllocationExtension allocationExtension = new AllocationExtension();
+        allocationExtension.setId(id);
+        allocationExtension.setState(state);
+        this.baseMapper.updateById(allocationExtension);
+        if(AllocationExtensionApproveEnum.PASS.value.equals(state)){
+            Allocation allocation = new Allocation();
+            allocation.setAllocationId(extensionExt.getAllocationId());
+            allocation.setChangeDay(extensionExt.getChangeDay()+extensionExt.getExtensionNum());
+            allocationService.updateById(allocation);
+        }
+        return true;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
new file mode 100644
index 0000000..35a76ce
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/AllocationServiceImpl.java
@@ -0,0 +1,579 @@
+package com.moral.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.moral.api.config.Interceptor.UserHelper;
+import com.moral.api.entity.*;
+import com.moral.api.exception.BusinessException;
+import com.moral.api.pojo.bean.BaseInvalidEntity;
+import com.moral.api.pojo.enums.*;
+import com.moral.api.pojo.ext.allocation.AllocationExt;
+import com.moral.api.pojo.ext.allocation.AllocationListExt;
+import com.moral.api.pojo.ext.allocation.AllocationPageExt;
+import com.moral.api.pojo.query.PageCond;
+import com.moral.api.pojo.query.allocation.*;
+import com.moral.api.pojo.query.allocationextension.AllocationExtensionAddCond;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.user.QxUser;
+import com.moral.api.service.AllocationExtensionService;
+import com.moral.api.service.ApproveTableService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.*;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.Allocation;
+import com.moral.api.entity.ApproveTable;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.entity.SysArea;
+import com.moral.api.entity.SysDictData;
+import com.moral.api.entity.SysDictType;
+import com.moral.api.mapper.AllocationMapper;
+import com.moral.api.mapper.ResponsibilityUnitMapper;
+import com.moral.api.mapper.SysDictDataMapper;
+import com.moral.api.mapper.SysDictTypeMapper;
+import com.moral.api.pojo.dto.allocation.AllocationUnitDto;
+import com.moral.api.pojo.dto.allocation.AllocationUnitViewDto;
+import com.moral.api.pojo.enums.AllocationApproveEnum;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.service.AllocationService;
+import com.moral.api.service.FileTableService;
+import com.moral.api.service.SysAreaService;
+import com.moral.api.service.SysDictDataService;
+import com.moral.constant.Constants;
+import com.moral.constant.RedisConstants;
+import com.moral.util.DateUtils;
+import com.moral.util.TokenUtils;
+
+
+@Service
+@Slf4j
+public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, Allocation> implements AllocationService {
+
+    @Autowired
+    private SysDictTypeMapper sysDictTypeMapper;
+    @Autowired
+    private SysDictDataMapper sysDictDataMapper;
+    @Autowired
+    private ResponsibilityUnitMapper responsibilityUnitMapper;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private AllocationMapper allocationMapper;
+    @Autowired
+    private  SysAreaService sysAreaService;
+    @Autowired
+    private ApproveTableService approveTableService;
+    @Autowired
+    private FileTableService fileTableService;
+    @Autowired
+    private AllocationExtensionService allocationExtensionService;
+
+    /**
+     * ������������������������������������
+     * @param dictType
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> sysDictData(String dictType) {
+        QueryWrapper<SysDictType> typeQueryWrapper = new QueryWrapper<>();
+        typeQueryWrapper.select("id").eq("name", dictType);
+        SysDictType sysDictType = sysDictTypeMapper.selectOne(typeQueryWrapper);
+        QueryWrapper<SysDictData> dataQueryWrapper = new QueryWrapper<>();
+        dataQueryWrapper.select("dataKey", "dataValue").eq("dict_type_id", sysDictType.getId()).eq("is_delete", Constants.NOT_DELETE);
+        return sysDictDataMapper.selectMaps(dataQueryWrapper);
+    }
+
+    /**
+     * ������������������
+     * @return
+     */
+    @Override
+    public List<ResponsibilityUnit> seleteUnit() {
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.select("unit_name","unit_id");
+        wrapper.eq("is_del",Constants.NOT_DELETE);
+        wrapper.eq("state",0);
+        wrapper.eq("is_invalid",0);
+        //������������������
+        Map<String, Object> userInfo = (Map<String, Object>) TokenUtils.getUserInfo();
+        Object code = userInfo.get("code");
+        if (!ObjectUtils.isEmpty(code)){
+            wrapper.eq("area_code",code);
+        }
+        List<ResponsibilityUnit> responsibilityUnits = responsibilityUnitMapper.selectList(wrapper);
+        return responsibilityUnits;
+    }
+
+
+    /**
+     * ���������������
+     * @param allocationCond
+     * @return
+     */
+    @Override
+    @Transactional
+    public Integer insertAllocation(AllocationAddCond allocationCond) {
+        Allocation allocation = allocationCond.convert();
+        allocation.setEscalationType(AllocationEscalationTypeEnum.SELF.getValue());
+        String dateString = DateUtils.dateToDateString(new Date(), DateUtils.yyyyMMdd_EN);
+        Object o = redisTemplate.opsForValue().get(RedisConstants.JBD_DATA);
+        int i;
+        if (ObjectUtils.isEmpty(o)){
+             i = 1;
+        }else {
+             i = Integer.parseInt(o.toString()) + 1;
+        }
+        //������
+        String allocationNum = "JBD-" + dateString + String.format("%04d", i);
+        allocation.setAllocationNum(allocationNum);
+        if(Objects.nonNull(allocationCond.getEscalationUnitId())&&allocationCond.getEscalationUnitId().toString().length()==6) {
+            allocation.setEscalationType(AllocationEscalationTypeEnum.CHECK.getValue());
+        }
+        if(AllocationApproveEnum.NEW_BUILT.value.equals(allocationCond.getState())) {
+            allocation.setState(AllocationApproveEnum.UNDER_RECTIFICATION.value);
+        }
+        //������������������
+        allocationMapper.insert(allocation);
+        redisTemplate.opsForValue().set(RedisConstants.JBD_DATA,i);
+        if(AllocationApproveEnum.NEW_BUILT.value.equals(allocationCond.getState())) {
+            //������������������
+            ApproveTable approveTable = new ApproveTable();
+            approveTable.setRelationId(allocation.getAllocationId());
+            approveTable.setState(AllocationApproveEnum.NEW_BUILT.value);
+            approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
+            approveTable.setStateName(AllocationApproveEnum.NEW_BUILT.name);
+            approveTableService.saveResult(approveTable);
+        }
+        fileTableService.upDateResult(allocationCond.getFileBaseList(),allocation.getAllocationId(), FileTableEnum.ALLOCATION_FOUNDATION.value);
+        return allocation.getAllocationId();
+    }
+
+    /**
+     * ������������
+     * @param id
+     * @return
+     */
+    @Override
+    public AllocationUnitDto check(Integer id) {
+        AllocationUnitDto allocationUnitDto = new AllocationUnitDto();
+        Allocation allocation = allocationMapper.selectById(id);
+        BeanUtils.copyProperties(allocation,allocationUnitDto);
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(allocation.getUnitId());
+        allocationUnitDto.setUnitName(responsibilityUnit.getUnitName());
+        allocationUnitDto.setEscalationUnitName(responsibilityUnit.getUnitName());
+        Map<String, List<SysDictData>> map = (Map<String, List<SysDictData>>) redisTemplate.opsForValue().get(RedisConstants.DICT_DATA_KEY);
+        List<SysDictData> contaminate = map.get("contaminate");
+        for (SysDictData sysDictData : contaminate) {
+            if (sysDictData.getDataKey().equals(allocation.getPolluteType().toString())){
+                allocationUnitDto.setPolluteTypeName(sysDictData.getDataValue());
+                break;
+            }
+        }
+        allocationUnitDto.setChangeTypeName(allocation.getChangeType()==0?"������������":"������������");
+        allocationUnitDto.setInvestigationTypeName(allocation.getChangeType()==0?"������":"���������");
+        //������������
+        return allocationUnitDto;
+    }
+
+    /**
+     * ���������������
+     * @param allocationUpdateCond
+     */
+    @Override
+    @Transactional
+    public void updateAll(AllocationUpdateCond allocationUpdateCond) {
+        AllocationExt allocationExt = oneAllocation(allocationUpdateCond.getAllocationId());
+        if(!AllocationApproveEnum.DRAFT.value.equals(allocationExt.getState())) {
+            throw new BusinessException("���������������������������������������");
+        }
+        //������������������
+        Allocation allocation = allocationUpdateCond.convert();
+        if(Objects.nonNull(allocationUpdateCond.getEscalationUnitId())&&allocationUpdateCond.getEscalationUnitId().toString().length()==6) {
+            allocation.setEscalationType(AllocationEscalationTypeEnum.CHECK.getValue());
+        }
+        if(AllocationApproveEnum.NEW_BUILT.value.equals(allocationUpdateCond.getState())) {
+            //������������������
+            ApproveTable approveTable = new ApproveTable();
+            approveTable.setRelationId(allocation.getAllocationId());
+            approveTable.setState(AllocationApproveEnum.NEW_BUILT.value);
+            approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
+            approveTable.setStateName(AllocationApproveEnum.NEW_BUILT.name);
+            approveTableService.saveResult(approveTable);
+        }
+        fileTableService.upDateResult(allocationUpdateCond.getFileBaseList(),allocation.getAllocationId(), FileTableEnum.ALLOCATION_FOUNDATION.value);
+        allocationMapper.updateById(allocation);
+    }
+
+
+    /**
+     * ������������������
+     * @param map
+     * @return
+     */
+    @Override
+    public List<Allocation> selectAll(Map<String, Object> map) {
+
+        Object unitId = map.get("unitId");
+        Object state = map.get("state");
+        Object polluteType = map.get("polluteType");
+        Object investigationType = map.get("investigationType");
+        Object changeType = map.get("changeType");
+        Object escalationTime = map.get("escalationTime");
+        Object isInvalid = map.get("isInvalid");
+//        int page = Integer.parseInt(map.get("page").toString());
+//        int size = Integer.parseInt(map.get("size").toString());
+        QueryWrapper<Allocation> wrapper = new QueryWrapper<>();
+
+        //������������
+        if (!ObjectUtils.isEmpty(unitId)){
+            wrapper.eq("unit_id",Integer.parseInt(unitId.toString()));
+        }
+        //������������
+        if (!ObjectUtils.isEmpty(state)){
+            wrapper.eq("state",Integer.parseInt(state.toString()));
+        }
+        //������������
+        if (!ObjectUtils.isEmpty(polluteType)){
+            wrapper.eq("pollute_type",Integer.parseInt(polluteType.toString()));
+        }
+        //������������
+        if (!ObjectUtils.isEmpty(investigationType)){
+            wrapper.eq("investigation_type",Integer.parseInt(investigationType.toString()));
+        }
+        //������������
+        if (!ObjectUtils.isEmpty(changeType)){
+            wrapper.eq("change_type",Integer.parseInt(changeType.toString()));
+        }
+        //������������
+        if (!ObjectUtils.isEmpty(isInvalid)){
+            wrapper.eq("is_invalid",Integer.parseInt(isInvalid.toString()));
+        }
+        if (!ObjectUtils.isEmpty(escalationTime)){
+//            wrapper.eq("is_invalid",Integer.parseInt(isInvalid.toString()));
+        }
+        List<Allocation> allocations = allocationMapper.selectList(wrapper);
+        ArrayList<AllocationUnitDto> rsList = new ArrayList<>();
+        for (Allocation allocation : allocations) {
+            AllocationUnitDto allocationUnitDto = new AllocationUnitDto();
+            BeanUtils.copyProperties(allocation,allocationUnitDto);
+            allocation.getEscalationTime();
+            Date dateOfDay = DateUtils.getDateOfDay(allocation.getEscalationTime(), allocation.getChangeDay());
+            Date date = new Date();
+            //���������������������������
+            int days = DateUtils.getDays(dateOfDay, date);
+            allocationUnitDto.setChangeDay(days);
+            rsList.add(allocationUnitDto);
+        }
+        return null;
+    }
+
+
+    /**
+     * ������������
+     * @param map
+     * @return
+     */
+    @Override
+    public Map<String, Object> selectUnitView(Map<String, Object> map) {
+        QueryWrapper<Allocation> wrapper = new QueryWrapper<>();
+        //������������������
+//        Map<String, Object> userInfo = (Map<String, Object>) TokenUtils.getUserInfo();
+//        Object unitId = userInfo.get("unitId");
+
+        Integer unitId= 17;
+        if (!ObjectUtils.isEmpty(unitId)){
+            ResponsibilityUnit responsibilityUnit1 = responsibilityUnitMapper.selectById(unitId);
+            Integer areaCode = responsibilityUnit1.getAreaCode();
+            if (areaCode<999999){
+                QueryWrapper<ResponsibilityUnit> wrapper1 = new QueryWrapper<>();
+                wrapper1.eq("parent_code",areaCode);
+                List<ResponsibilityUnit> responsibilityUnits = responsibilityUnitMapper.selectList(wrapper1);
+                if (ObjectUtils.isEmpty(responsibilityUnits)){
+                    return null;
+                }
+                Map<Integer, List<ResponsibilityUnit>> collect = responsibilityUnits.stream().collect(Collectors.groupingBy(o -> o.getUnitId()));
+                List<Integer> collect1 = collect.keySet().stream().collect(Collectors.toList());
+                wrapper.in("unit_id",collect1);
+            }else {
+                wrapper.eq("unit_id",unitId);
+            }
+        }
+
+        HashMap<String, Object> rsMap = new HashMap<>();
+        HashMap<String, Object> polluteMap = new HashMap<>();
+        ArrayList<AllocationUnitViewDto> allocationUnitViewDtos = new ArrayList<>();
+
+        Object number1 = map.get("number");
+        String startTime=null;
+        String endTime=null;
+        if (!ObjectUtils.isEmpty(map.get("startTime")) || !ObjectUtils.isEmpty(map.get("startTime"))){
+             startTime = map.get("startTime").toString();
+             endTime = map.get("endTime").toString();
+
+        }
+        if (!ObjectUtils.isEmpty(number1)){
+            String s = number1.toString();
+            //���������������
+            endTime = DateUtils.getCurDateTime();
+            if (s.equals("-1")){
+                //���������������
+                 startTime = DateUtils.getDateStringOfMon(Integer.parseInt(s), DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+            if (s.equals("-2")){
+                //���������������
+                startTime = DateUtils.getDateStringOfMon(Integer.parseInt(s), DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+            if (s.equals("-3")){
+                startTime = DateUtils.getDateStringOfMon(Integer.parseInt(s), DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+            if (s.equals("-6")){
+                startTime = DateUtils.getDateStringOfMon(Integer.parseInt(s), DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+            if (s.equals("-12")){
+                startTime = DateUtils.getDateStringOfMon(Integer.parseInt(s), DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
+            }
+
+        }
+
+        wrapper.between("escalation_time",startTime,endTime);
+        wrapper.eq("is_del",0);
+        wrapper.eq("is_invalid",0);
+        List<Allocation> allocations = allocationMapper.selectList(wrapper);
+        if (ObjectUtils.isEmpty(allocations)){
+            return null;
+        }
+         int complete=0;
+         int unComplete=0;
+        for (Allocation allocation : allocations) {
+            String state = allocation.getState()+"";
+            if (state.equals("40")||state.equals("50")){
+                 complete++;
+            }else if(state.equals("10")||state.equals("20") ||state.equals("30")) {
+                 unComplete++;
+            }
+        }
+        //������������������������
+        Map<Integer, List<Allocation>> polluteTypeMap = allocations.stream().collect(Collectors.groupingBy(o -> o.getPolluteType()));
+        Set<Integer> polluteTypes = polluteTypeMap.keySet();
+        for (Integer polluteType : polluteTypes) {
+
+            HashMap<String, Object> typeMap = new HashMap<>();
+            List<Allocation> allocations1 = polluteTypeMap.get(polluteType);
+            QueryWrapper<SysDictData> sysDictDataQueryWrapper = new QueryWrapper<>();
+            sysDictDataQueryWrapper.eq("dict_type_id",31);
+            sysDictDataQueryWrapper.eq("dataKey",polluteType);
+            SysDictData sysDictData = sysDictDataMapper.selectOne(sysDictDataQueryWrapper);
+            typeMap.put("name",sysDictData.getDataValue());
+            typeMap.put("value",allocations1.size());
+            polluteMap.put("polluteType",typeMap);
+        }
+        //������������������������
+        Map<Integer, List<Allocation>> unitMap = allocations.stream().collect(Collectors.groupingBy(o -> o.getUnitId()));
+        Set<Integer> unitList = unitMap.keySet();
+        //������������
+        int overdue=0;
+        for (Integer integer : unitList) {
+            //������������
+            ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(integer);
+
+            SysArea areaByCode = sysAreaService.getAreaByCode(responsibilityUnit.getAreaCode());
+
+            AllocationUnitViewDto allocationUnitViewDto = new AllocationUnitViewDto();
+            List<Allocation> allocations1 = unitMap.get(integer);
+            //������
+            int marks=0;
+            //������
+            int deduction=0;
+            int number=0;
+            for (Allocation allocation : allocations1) {
+
+                Date dateOfDay = DateUtils.getDateOfDay(allocation.getEscalationTime(), allocation.getChangeDay());
+                Date date = new Date();
+                String state = allocation.getState()+"";
+                boolean timeBefor = DateUtils.isTimeBefor(date, dateOfDay);
+                if (timeBefor && !state.equals("40") && !state.equals("50")){
+                    //������������
+                    overdue++;
+                }
+                if (state.equals("40")||state.equals("50")){
+                    if (allocation.getCheckScore()>0){
+                        marks = marks + allocation.getCheckScore();
+                    }else {
+                        deduction = deduction + allocation.getCheckScore();
+                    }
+                    number++;
+                }
+            }
+            int total = allocations1.size();
+            allocationUnitViewDto.setDeduction(deduction);
+            allocationUnitViewDto.setMarks(marks);
+            allocationUnitViewDto.setTotal(total);
+            allocationUnitViewDto.setTotalPoints(marks+deduction);
+            allocationUnitViewDto.setNumber(number);
+            String rate = (number * 100 /total)+"%";
+            allocationUnitViewDto.setRate(rate);
+            allocationUnitViewDto.setUnNumber(total-number);
+            allocationUnitViewDto.setUnitName(areaByCode.getAreaName());
+            allocationUnitViewDtos.add(allocationUnitViewDto);
+        }
+        rsMap.put("unitView",allocationUnitViewDtos);
+        rsMap.put("total",allocations.size());
+        rsMap.put("complete",complete);
+        rsMap.put("unComplete",unComplete);
+        rsMap.put("overdue",overdue);
+        rsMap.put("polluteType",polluteMap);
+        return rsMap;
+    }
+
+
+    /**
+     * ������
+     * @param map
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> unitExel(Map<String, Object> map) {
+        return null;
+    }
+
+    @Override
+    public Page<AllocationPageExt> extPage(AllocationPageCond allocationPageCond) {
+        return this.baseMapper.extPage(allocationPageCond.getPage().convertPage(), allocationPageCond);
+    }
+
+    @Override
+    public AllocationExt extOne(Integer id) {
+        AllocationExt allocationExt = oneAllocation(id);
+        allocationExt.setFileBaseList(fileTableService.list(id,FileTableEnum.ALLOCATION_FOUNDATION.value));
+        allocationExt.setFileChangeList(fileTableService.list(id,FileTableEnum.ALLOCATION_RECTIFICATION.value));
+        allocationExt.setFileApproveList(fileTableService.list(id,FileTableEnum.ALLOCATION_APPROVE.value));
+        allocationExt.setApproveList(approveTableService.listAll(id, FileTableEnum.ALLOCATION_FOUNDATION.value));
+        return allocationExt;
+    }
+
+    @Override
+    public AllocationExt oneAllocation(Integer id){
+        return this.baseMapper.extOne(id);
+    }
+
+    @Override
+    @Transactional
+    public void changeAllocation(AllocationChangeCond changeCond) {
+        AllocationExt allocationExt = oneAllocation(changeCond.getAllocationId());
+        if(!AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(allocationExt.getState())) {
+            throw new BusinessException("������������������������������������");
+        }
+        Allocation allocation = new Allocation();
+        allocation.setAllocationId(changeCond.getAllocationId());
+        allocation.setIsChange(changeCond.getIsChange());
+        allocation.setChangeName(changeCond.getChangeName());
+        allocation.setChangeDescribe(changeCond.getChangeDescribe());
+        allocation.setState(changeCond.getState());
+        allocation.setChangeTime(new Date());
+        this.updateById(allocation);
+        //������������������
+        ApproveTable approveTable = new ApproveTable();
+        approveTable.setRelationId(allocation.getAllocationId());
+        approveTable.setState(AllocationApproveEnum.UNDER_RECTIFICATION.value);
+        approveTable.setStateName(AllocationApproveEnum.UNDER_RECTIFICATION.name);
+        approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
+        approveTableService.saveResult(approveTable);
+        fileTableService.upDateResult(changeCond.getFileChangeList(),allocation.getAllocationId(), FileTableEnum.ALLOCATION_FOUNDATION.value);
+    }
+
+    @Override
+    @Transactional
+    public void checkAllocation(AllocationCheckCond checkCond) {
+        AllocationExt allocationExt = oneAllocation(checkCond.getAllocationId());
+        if(!AllocationApproveEnum.IN_APPROVAL.value.equals(allocationExt.getState())) {
+            throw new BusinessException("������������������������������������������");
+        }
+        QxUser qxUser = UserHelper.getCurrentUser();
+        Allocation allocation = new Allocation();
+        allocation.setCheckScore(checkCond.getCheckScore());
+        allocation.setCheckDescribe(checkCond.getCheckDescribe());
+        allocation.setCheckName(qxUser.getUserName());
+        allocation.setCheckTime(new Date());
+        allocation.setState(checkCond.getState());
+        this.updateById(allocation);
+        //������������������
+        ApproveTable approveTable = new ApproveTable();
+        approveTable.setRelationId(allocation.getAllocationId());
+        if(AllocationApproveEnum.PASS.value.equals(checkCond.getState())){
+            approveTable.setState(AllocationApproveEnum.PASS.value);
+            approveTable.setStateName(AllocationApproveEnum.PASS.name);
+        }else {
+            approveTable.setState(AllocationApproveEnum.REFUSE.value);
+            approveTable.setStateName(AllocationApproveEnum.REFUSE.name);
+        }
+        approveTable.setApproveModule(FileTableEnum.ALLOCATION_FOUNDATION.value);
+        approveTableService.saveResult(approveTable);
+        fileTableService.upDateResult(checkCond.getFileApproveList(),checkCond.getAllocationId(), FileTableEnum.ALLOCATION_FOUNDATION.value);
+    }
+
+    @Override
+    @Transactional
+    public boolean removeById(Integer id) {
+        AllocationExt allocationExt = oneAllocation(id);
+        if(!AllocationApproveEnum.DRAFT.value.equals(allocationExt.getState())) {
+            throw new BusinessException("������������������������������������");
+        }
+        this.baseMapper.deleteById(id);
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public boolean invalidResult(Integer id,String invalidReason) {
+        AllocationExt allocationExt = oneAllocation(id);
+        if( AllocationApproveEnum.IN_APPROVAL.value >= allocationExt.getState() ) {
+            throw new BusinessException("���������������������������");
+        }
+        LambdaUpdateChainWrapper<Allocation> wrapper =lambdaUpdate();
+        wrapper.eq(Allocation::getAllocationId,id).set(Allocation::getInvalidReason,invalidReason).set(BaseInvalidEntity::getIsInvalid, YesOrNo.YES.value);
+        return wrapper.update();
+    }
+
+    @Override
+    public List<AllocationListExt> extList(AllocationListCond allocationListCond) {
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public boolean applyFor(AllocationExtensionAddCond allocationExtensionAddCond) {
+        AllocationExt allocationExt = oneAllocation(allocationExtensionAddCond.getAllocationId());
+        boolean type = false;
+        if( !AllocationApproveEnum.UNDER_RECTIFICATION.value.equals(allocationExt.getState())) {
+            type = true;
+        }
+        if(!ChangeEnum.DEADLINE.value.equals(allocationExt.getChangeType())){
+            type = true;
+        }
+        if(type){
+            throw new BusinessException("���������������������������������������������������������������������������");
+        }
+        AllocationExtension allocationExtension = allocationExtensionAddCond.convert();
+        allocationExtension.setState(AllocationExtensionApproveEnum.APPLYING.value);
+        allocationExtensionService.save(allocationExtension);
+        fileTableService.upDateResult(allocationExtensionAddCond.getFileList(),allocationExtension.getId(), FileTableEnum.ALLOCATION_EXTENSION.value);
+        return true;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/ApproveTableServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/ApproveTableServiceImpl.java
new file mode 100644
index 0000000..a232bcf
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/ApproveTableServiceImpl.java
@@ -0,0 +1,50 @@
+package com.moral.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.ApproveTable;
+import com.moral.api.entity.FileTable;
+import com.moral.api.mapper.ApproveTableMapper;
+import com.moral.api.pojo.enums.YesOrNo;
+import com.moral.api.pojo.vo.approvetable.ApproveTableListVo;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.service.ApproveTableService;
+import com.moral.api.utils.BeanConverts;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * ��������� ���������������
+ * </p>
+ * deyt template generate
+ *
+ * @author JI
+ * @since 2023-09-25
+ */
+@Service
+public class ApproveTableServiceImpl extends ServiceImpl<ApproveTableMapper, ApproveTable> implements ApproveTableService {
+
+
+    @Override
+    @Transactional
+    public boolean saveResult(ApproveTable approveTable) {
+        return this.save(approveTable);
+    }
+
+    @Override
+    public List<ApproveTableListVo> listAll(int relationId,int fileModule) {
+        List<ApproveTableListVo> list = new ArrayList<>();
+        List<ApproveTable> existsList = this.lambdaQuery().eq(ApproveTable::getRelationId, relationId)
+                .eq(ApproveTable::getApproveModule, fileModule)
+                .eq(ApproveTable::getIsDel, YesOrNo.NO.value).orderByAsc(ApproveTable::getCreateTime).list();
+
+        existsList.forEach(it->{
+            ApproveTableListVo listVo = BeanConverts.convert(it,ApproveTableListVo.class);
+            list.add(listVo);
+        });
+        return list;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java
new file mode 100644
index 0000000..1fdde7a
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java
@@ -0,0 +1,238 @@
+package com.moral.api.service.impl;
+
+import com.moral.api.config.Interceptor.UserHelper;
+import com.moral.api.entity.FileTable;
+import com.moral.api.exception.BusinessException;
+import com.moral.api.mapper.FileTableMapper;
+import com.moral.api.pojo.enums.FileType;
+import com.moral.api.pojo.enums.YesOrNo;
+import com.moral.api.pojo.vo.file.FileVo;
+import com.moral.api.pojo.vo.user.QxUser;
+import com.moral.api.service.FileTableService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.utils.FileTypeUtils;
+import com.moral.api.utils.StringUtils;
+import com.moral.util.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * ��������� ���������������
+ * </p>
+ *
+ * @author moral
+ * @since 2023-09-21
+ */
+@Service
+@Slf4j
+public class FileTableServiceImpl extends ServiceImpl<FileTableMapper, FileTable> implements FileTableService {
+    @Value("${file.path}")
+    private String basePath;
+    @Override
+    public FileVo upload(MultipartFile file, Integer sysCode) {
+        String originalFilename = file.getOriginalFilename().replaceAll(StringUtils.SPACE, StringUtils.EMPTY).toLowerCase();
+        String suffix = originalFilename.substring(originalFilename.lastIndexOf(StringUtils.DOT));
+        FileType fileType = FileTypeUtils.getFileType(suffix.toLowerCase());
+        // ������������������������  ������������ + ������������ + ������
+        String filePath = getFilePath(sysCode.toString());
+        // ������������
+        String targetFolder = basePath.replaceAll(StringUtils.BACKSLASH.concat(StringUtils.BACKSLASH), StringUtils.SLASH).concat(StringUtils.SLASH).concat(filePath);
+        //������uuid ������������������������������������
+        String storageFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(StringUtils.DOT));
+        storageFile(file, storageFileName, targetFolder);
+
+        // ������������������
+        QxUser user = UserHelper.getCurrentUser();
+        FileTable sysFile = new FileTable();
+        sysFile.setFileName(originalFilename).setFileType(fileType.getValue()).setFileSize((int) file.getSize()).setFileAddress(filePath.concat(storageFileName))
+                .setFileModule(sysCode).setCreateTime(new Date());
+        if (Objects.nonNull(user)) {
+            sysFile.setCreateId(user.getUserId()).setCreateName(user.getUserName());
+        }
+        save(sysFile);
+        return new FileVo().setFileId(sysFile.getFileId()).setFileName(originalFilename).setFileType(fileType.getValue());
+    }
+
+    @Override
+    public List<FileVo> upload(List<MultipartFile> files, Integer sysCode) {
+        List<FileVo> fileList = new LinkedList<>();
+        for (MultipartFile file : files) {
+            fileList.add(upload(file, sysCode));
+        }
+        return fileList;
+    }
+
+    @Override
+    public void preview(Integer id, HttpServletRequest request, HttpServletResponse response) {
+        FileTable sysFile = getById(id);
+        File file = new File(handleFileRealPath(sysFile.getFileAddress()));
+        String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT));
+        if (FileTypeUtils.SUFFIX_MP4.equals(suffix)) {
+            videoPreview(file, request, response);
+        } else {
+            try (OutputStream out = response.getOutputStream(); InputStream in = new FileInputStream(file)) {
+                response.setContentType(FileTypeUtils.convertHeaderType(suffix));
+                response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(sysFile.getFileName(), "UTF-8"));
+                int len;
+                // ���������������������
+                byte[] buffer = new byte[1024];
+                while ((len = in.read(buffer)) > 0) {
+                    out.write(buffer, 0, len);
+                }
+            } catch (Exception e) {
+                log.error("������������������!!! e={}", e.getMessage());
+            }
+        }
+    }
+
+    private String getFilePath(String sysCode) {
+        return sysCode.concat(StringUtils.SLASH).concat(StringUtils.SLASH).concat(DateUtils.dateToDateString(new Date(),DateUtils.yyyyMMdd_EN)).concat(StringUtils.SLASH);
+    }
+
+    public void storageFile(MultipartFile file, String originalFilename, String targetFolder) {
+        File f = new File(targetFolder, originalFilename);
+        try {
+            // ������������
+            if (!f.getParentFile().exists()) {
+                if (!f.getParentFile().mkdirs()) {
+                    log.error("error:������������������! dir={}", f.getAbsolutePath());
+                }
+            }
+            file.transferTo(f);
+        } catch (IOException e) {
+            log.error("error:������������������!!!e={}", e.getMessage());
+            throw new BusinessException("������������������������������!");
+        }
+    }
+    private String handleFileRealPath(String path) {
+        return basePath.replaceAll(StringUtils.BACKSLASH.concat(StringUtils.BACKSLASH), StringUtils.SLASH).concat(StringUtils.SLASH).concat(path);
+    }
+    private void videoPreview(File file, HttpServletRequest request, HttpServletResponse response) {
+        String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT));
+        //������������
+        response.setContentType(FileTypeUtils.convertHeaderType(suffix));
+        response.setHeader("Accept-Ranges", "bytes");
+        response.setHeader("ETag", file.getName());
+        response.setHeader("Last-Modified", new Date().toString());
+        long contentLength = file.length();
+
+        //���������������������������������������������������������������
+        long length = Math.min(contentLength, 1024);
+        long start = 0, end = 0;
+        String range = request.getHeader("Range");
+        //������������������������content length���������������������������������������
+        if (range == null) {
+            response.setHeader("Content-length", contentLength + "");
+        } else {
+            //������������������������������������������������������������
+            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206
+
+            if (range.startsWith("bytes=")) {
+                String[] values = range.split("=")[1].split("-");
+                start = Integer.parseInt(values[0]);
+                if (values.length > 1) {
+                    end = Integer.parseInt(values[1]);
+                }
+            }
+            //���end,���������������������������
+            long maxSize = 1024 * 1024; //1MB
+            if (end > 0) {
+                length = end - start + 1;
+                response.setHeader("Content-length", "" + length);
+                response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + contentLength);
+            } else {
+                length = Math.min((contentLength - start), maxSize);
+                response.setHeader("Content-length", "" + length);
+                response.setHeader("Content-Range", "bytes " + start + "-" + (start + length - 1) + "/" + contentLength);
+            }
+        }
+        try {
+            FileInputStream fileInputStream = new FileInputStream(file);
+            OutputStream out = response.getOutputStream();
+            //������������������������byte[]���������
+            byte[] data = new byte[(int) length];
+            fileInputStream.skip(start);
+            fileInputStream.read(data);
+            //������������������������������������
+            out.write(data);
+            out.close();
+            fileInputStream.close();
+        } catch (Exception e) {
+            log.error("������������������!!! e={}", e.getMessage());
+        }
+    }
+    @Override
+    public void coverPreview(Integer id, HttpServletRequest request, HttpServletResponse response) {
+        FileTable sysFile = getById(id);
+
+        File file = new File(handleFileRealPath(sysFile.getFileAddress()));
+        String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT));
+
+        try (OutputStream out = response.getOutputStream()) {
+            response.setContentType(FileTypeUtils.convertHeaderType(suffix));
+            response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(sysFile.getFileName(), "UTF-8"));
+            Thumbnails.of(file).size(420, 200).toOutputStream(out);
+        } catch (Exception e) {
+            log.error("������������������!!! e={}", e.getMessage());
+        }
+    }
+
+    @Override
+    @Transactional
+    public void upDateResult(List<FileVo> list,int relationId,int fileModule) {
+        List<FileTable> existsList = this.lambdaQuery().eq(FileTable::getRelationId, relationId)
+                .eq(FileTable::getFileModule, fileModule)
+                .eq(FileTable::getIsDel, YesOrNo.NO.value).list();
+
+        // ������������
+        if (!CollectionUtils.isEmpty(list)) {
+            List<FileTable> addList = new ArrayList();
+            // 2.2.������������������������������
+            list.forEach(it -> {
+               existsList.removeIf(file -> file.getFileId().equals(it.getFileId()));
+               FileTable file = new FileTable();
+               BeanUtils.copyProperties(it,file);
+               file.setRelationId(relationId);
+               addList.add(file);
+            });
+            if (!CollectionUtils.isEmpty(addList)) {
+                // ������
+                this.updateBatchById(addList);
+            }
+        }
+        // ������������
+        if (!CollectionUtils.isEmpty(existsList)) {
+            removeByIds(existsList.stream().map(FileTable::getFileId).collect(Collectors.toList()));
+        }
+    }
+
+    @Override
+    public List<FileVo> list(int relationId, int fileModule) {
+        List<FileVo> list = new ArrayList<>();
+        List<FileTable> existsList = this.lambdaQuery().eq(FileTable::getRelationId, relationId)
+                .eq(FileTable::getFileModule, fileModule)
+                .eq(FileTable::getIsDel, YesOrNo.NO.value).orderByAsc(FileTable::getCreateTime).list();
+        existsList.forEach(it->{
+            FileVo fileVo = new FileVo();
+            fileVo.setFileId(it.getFileId());
+            fileVo.setFileName(it.getFileName());
+            fileVo.setFileType(it.getFileType());
+            list.add(fileVo);
+        });
+        return list;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
new file mode 100644
index 0000000..c631c98
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
@@ -0,0 +1,53 @@
+package com.moral.api.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.mapper.ResponsibilityUnitMapper;
+import com.moral.api.service.ResponsibilityUnitService;
+
+
+@Service
+public class ResponsibilityUnitServiceImpl extends ServiceImpl<ResponsibilityUnitMapper, ResponsibilityUnit> implements ResponsibilityUnitService {
+
+    @Autowired
+    private  ResponsibilityUnitMapper responsibilityUnitMapper;
+    /**
+     * ������������������������������������
+     *
+     * @param code
+     * @return
+     */
+    @Override
+    public List<ResponsibilityUnit> selectUnit(Integer code) {
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.eq("parent_code",code);
+        wrapper.eq("is_del",0);
+        wrapper.eq("state",0);
+        wrapper.eq("is_invalid",0);
+        List<ResponsibilityUnit> responsibilityUnits = responsibilityUnitMapper.selectList(wrapper);
+        return responsibilityUnits;
+    }
+
+    /**
+     * ������������������������������������������
+     *
+     * @param code
+     * @return
+     */
+    @Override
+    public ResponsibilityUnit selectAreaUnit(Integer code) {
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.eq("area_code",code);
+        wrapper.eq("is_del",0);
+        wrapper.eq("state",0);
+        wrapper.eq("is_invalid",0);
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectOne(wrapper);
+        return responsibilityUnit;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
index a47ccf5..569562c 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -30,14 +30,17 @@
 import com.moral.api.entity.Group;
 import com.moral.api.entity.Menu;
 import com.moral.api.entity.Organization;
+import com.moral.api.entity.ResponsibilityUnit;
 import com.moral.api.entity.User;
 import com.moral.api.entity.UserGroup;
 import com.moral.api.entity.UserLog;
 import com.moral.api.mapper.MenuMapper;
+import com.moral.api.mapper.ResponsibilityUnitMapper;
 import com.moral.api.mapper.UserGroupMapper;
 import com.moral.api.mapper.UserLogMapper;
 import com.moral.api.mapper.UserMapper;
 import com.moral.api.pojo.bo.UserBO;
+import com.moral.api.service.ResponsibilityUnitService;
 import com.moral.api.service.UserService;
 import com.moral.api.utils.OperationLogUtils;
 import com.moral.constant.Constants;
@@ -76,6 +79,9 @@
 
     @Autowired
     private OperationLogUtils operationLogUtils;
+
+    @Autowired
+    private ResponsibilityUnitService responsibilityUnitService;
 
     @Value("${AES.KEY}")
     private String AESKey;
@@ -125,6 +131,7 @@
         userInfo.put("userName", userBo.getUserName());
         userInfo.put("email", userBo.getEmail());
         userInfo.put("mobile", userBo.getMobile());
+        userInfo.put("unitId",userBo.getUnitId());
         userInfo.put("wechat", userBo.getWechat());
         userInfo.put("expireTime", DateUtils.dateToDateString(userBo.getExpireTime()));
         userInfo.put("isAdmin", userBo.getIsAdmin());
@@ -281,6 +288,8 @@
             result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg());
             return result;
         }
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitService.selectAreaUnit(user.getUnitCode());
+        user.setUnitId(responsibilityUnit.getUnitId());
         //������������
         user.setPassword(MD5Utils.saltMD5(password));
         Map<String, Object> orgInfo = (Map<String, Object>) currentUserInfo.get("organization");
@@ -400,6 +409,8 @@
             String deleteToken = TokenUtils.hget(userId).toString();
             TokenUtils.destoryToken(userId, deleteToken);
         }
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitService.selectAreaUnit(user.getUnitCode());
+        user.setUnitId(responsibilityUnit.getUnitId());
         userMapper.updateById(user);
 
         //������
diff --git a/screen-api/src/main/java/com/moral/api/utils/FileTypeUtils.java b/screen-api/src/main/java/com/moral/api/utils/FileTypeUtils.java
new file mode 100644
index 0000000..7096afb
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/FileTypeUtils.java
@@ -0,0 +1,126 @@
+package com.moral.api.utils;
+
+import com.moral.api.pojo.enums.FileType;
+
+/**
+ * @ClassName: FileTypeUtils
+ * @Description:
+ * @Author: fan
+ * @Date: 2021/2/1 13:41
+ * @Version: 1.0
+ **/
+public class FileTypeUtils {
+    /**
+     * ������������
+     */
+    private static final String SUFFIX_JPE = ".jpe";
+    private static final String SUFFIX_JPG = ".jpg";
+    private static final String SUFFIX_PNG = ".png";
+    private static final String SUFFIX_JPEG = ".jpeg";
+    private static final String SUFFIX_BMP = ".bmp";
+    private static final String SUFFIX_GIF = ".gif";
+
+    /**
+     * word
+     */
+    public static final String SUFFIX_DOC = ".doc";
+    public static final String SUFFIX_DOCX = ".docx";
+
+    /**
+     * excel
+     */
+    private static final String SUFFIX_XLSX = ".xlsx";
+    private static final String SUFFIX_XLS = ".xls";
+
+    /**
+     * pdf
+     */
+    public static final String SUFFIX_PDF = ".pdf";
+
+    /**
+     * ���������
+     */
+    private static final String SUFFIX_ZIP = ".zip";
+    private static final String SUFFIX_RAR = ".rar";
+    private static final String SUFFIX_JAR = ".jar";
+    private static final String SUFFIX_GZIP = ".gzip";
+
+    private static final String SUFFIX_TXT = ".txt";
+
+    /**
+     * ppt
+     */
+    public static final String SUFFIX_PPT = ".ppt";
+    public static final String SUFFIX_PPTX = ".pptx";
+
+
+    public static final String SUFFIX_MP4 = ".mp4";
+
+    /**
+     * @Description ������������������
+     * @author fanhq
+     * @date 2020/4/20 15:35
+     * @param suffix
+     * @return java.lang.Integer   1. ������  * 2. word  * 3. excel * 4. pdf  * 5. ���������
+     */
+    public static FileType getFileType(String suffix) {
+        switch (suffix) {
+            case SUFFIX_JPE:
+            case SUFFIX_JPG:
+            case SUFFIX_PNG:
+            case SUFFIX_JPEG:
+            case SUFFIX_BMP:
+                return FileType.PICTURE;
+            case SUFFIX_DOC:
+            case SUFFIX_DOCX:
+                return FileType.WORD;
+            case SUFFIX_XLSX:
+            case SUFFIX_XLS:
+                return FileType.EXCEL;
+            case SUFFIX_PDF:
+                return FileType.PDF;
+            case SUFFIX_ZIP:
+            case SUFFIX_RAR:
+            case SUFFIX_JAR:
+                return FileType.ZIP;
+            default:
+                return FileType.NON;
+        }
+    }
+
+    /**
+     * ���������������������������������������
+     * @param type
+     * @return
+     */
+    public static String convertHeaderType(String type) {
+        switch (type){
+            case SUFFIX_JPE:
+            case SUFFIX_JPG:
+            case SUFFIX_JPEG:
+                return "image/jpeg";
+            case SUFFIX_PNG:
+                return "image/png";
+            case SUFFIX_GIF:
+                return "image/gif";
+            case SUFFIX_ZIP:
+                return "application/zip";
+            case SUFFIX_GZIP:
+                return "application/gzip";
+            case SUFFIX_DOC:
+            case SUFFIX_DOCX:
+                return "application/msword";
+            case SUFFIX_XLSX:
+            case SUFFIX_XLS:
+                return "application/x-xls";
+            case SUFFIX_PDF:
+                return "application/pdf";
+            case SUFFIX_TXT:
+                return "text/plain";
+            case SUFFIX_MP4:
+                return "video/mp4";
+            default:
+                return "application/octet-stream";
+        }
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/utils/StringUtils.java b/screen-api/src/main/java/com/moral/api/utils/StringUtils.java
new file mode 100644
index 0000000..bd85023
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/StringUtils.java
@@ -0,0 +1,1175 @@
+package com.moral.api.utils;
+
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/***
+ * @Author JI
+ * @Date 2020/3/27 13:44
+ * @Param
+ * @return
+ **/
+public class StringUtils extends org.apache.commons.lang3.StringUtils {
+
+    public static final String SPACE = " ";
+    public static final String DOT = ".";
+    public static final String PERIOD = "���";
+    public static final String SLASH = "/";
+    public static final String BACKSLASH = "\\";
+    public static final String EMPTY = "";
+    public static final String CRLF = "\r\n";
+    public static final String NEWLINE = "\n";
+    public static final String UNDERLINE = "_";
+    public static final String COMMA = ",";
+    public static final String COMMA_CN = "���";
+    public static final String CONNECTION_LINE = "-";
+    public static final String SEMICOLON = ";";
+    public static final String SEMICOLON_CN = "���";
+
+    public static final String HTML_NBSP = "&nbsp;";
+    public static final String HTML_AMP = "&amp";
+    public static final String HTML_QUOTE = "&quot;";
+    public static final String HTML_LT = "&lt;";
+    public static final String HTML_GT = "&gt;";
+    public static final String PLACEHOLDER = "%s";
+    public static final String FILE_SEPARATOR = System.getProperties().getProperty("file.separator");
+    public static final String EMPTY_JSON = "{}";
+
+
+    /***
+     * @Author JI
+     * @Description //������������������������������������
+     * @Date 2020/3/27 13:55
+     * @Param [str]
+     * @return boolean
+     **/
+    public static boolean isEmpty(String str) {
+        return str == null || "".equals(str.trim()) || "null".equals(str.trim());
+    }
+
+    public static boolean isBlank(Map param, String str) {
+        return !param.containsKey(str) || param.get(str) == null || "".equals(param.get(str).toString().trim()) || "null".equals(param.get(str).toString().trim());
+    }
+
+    public static boolean isNotBlank(Map param, String str) {
+        return !isBlank(param, str);
+    }
+
+    /***
+     * @Author JI
+     * @Description //������������������������������������������
+     * @Date 2020/3/27 13:55
+     * @Param [str]
+     * @return boolean
+     **/
+    public static boolean isNotEmpty(String str) {
+        return !isEmpty(str);
+    }
+
+    /**
+     * <p>Checks if a CharSequence is empty (""), null or whitespace only.</p>
+     *
+     * <p>Whitespace is defined by {@link Character#isWhitespace(char)}.</p>
+     *
+     * <pre>
+     * StringUtils.isBlank(null)      = true
+     * StringUtils.isBlank("")        = true
+     * StringUtils.isBlank(" ")       = true
+     * StringUtils.isBlank("bob")     = false
+     * StringUtils.isBlank("  bob  ") = false
+     * </pre>
+     *
+     * @param cs the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence is null, empty or whitespace only
+     * @since 2.0
+     * @since 3.0 Changed signature from isBlank(String) to isBlank(CharSequence)
+     */
+    public static boolean isBlank(final CharSequence cs) {
+        int strLen;
+        if (cs == null || (strLen = cs.length()) == 0) {
+            return true;
+        }
+        for (int i = 0; i < strLen; i++) {
+            if (!Character.isWhitespace(cs.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * ������������������<code>null</code>������������������������������������������������������������������
+     * <p>
+     * <pre>
+     * nullToDefault(null, &quot;default&quot;)  = &quot;default&quot;
+     * nullToDefault(&quot;&quot;, &quot;default&quot;)    = &quot;&quot;
+     * nullToDefault(&quot;  &quot;, &quot;default&quot;)  = &quot;  &quot;
+     * nullToDefault(&quot;bat&quot;, &quot;default&quot;) = &quot;bat&quot;
+     * </pre>
+     *
+     * @param str        ���������������������
+     * @param defaultStr ���������������
+     * @return ������������������������������������������
+     */
+    public static String nullToDefault(String str, String defaultStr) {
+        return (str == null) ? defaultStr : str;
+    }
+
+    /**
+     * ������������������������������������������������<code>null</code>
+     *
+     * @param str ���������������������
+     * @return ���������������������
+     */
+    public static String emptyToNull(String str) {
+        return isEmpty(str) ? null : str;
+    }
+
+    /**
+     * ������������������������
+     *
+     * @param strs ���������������
+     * @return ������������������������
+     */
+    public static boolean hasEmpty(String... strs) {
+        for (String str : strs) {
+            if (isEmpty(str)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * ���������������������������
+     *
+     * @param strs ���������������
+     * @return ���������������������������
+     */
+    public static boolean isAllEmpty(String... strs) {
+
+        for (String str : strs) {
+            if (isNotEmpty(str)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * ������������������������������
+     *
+     * @param str          ������������������
+     * @param prefix       ���������������
+     * @param isIgnoreCase ���������������������
+     * @return ������������������������������
+     */
+    public static boolean startWith(String str, String prefix, boolean isIgnoreCase) {
+        if (isIgnoreCase) {
+            return str.toLowerCase().startsWith(prefix.toLowerCase());
+        } else {
+            return str.startsWith(prefix);
+        }
+    }
+
+    /**
+     * ������������������������������
+     *
+     * @param str          ������������������
+     * @param suffix       ���������������
+     * @param isIgnoreCase ���������������������
+     * @return ������������������������������
+     */
+    public static boolean endWith(String str, String suffix, boolean isIgnoreCase) {
+        if (isIgnoreCase) {
+            return str.toLowerCase().endsWith(suffix.toLowerCase());
+        } else {
+            return str.endsWith(suffix);
+        }
+    }
+
+    /**
+     * ���������������������������������������������������������������������������<code>null</code>���������true
+     *
+     * @param str     ������������������
+     * @param testStr ���������������������������������
+     * @return ������������
+     */
+    public static boolean containsIgnoreCase(String str, String testStr) {
+        if (null == str) {
+            //���������������������������
+            return null == testStr;
+        }
+        return str.toLowerCase().contains(testStr.toLowerCase());
+    }
+
+    /**
+     * ������set���������<br/>
+     * ���������name ������ setName
+     *
+     * @param fieldName ���������
+     * @return setXxx
+     */
+    public static String genSetter(String fieldName) {
+        return upperFirstAndAddPre(fieldName, "set");
+    }
+
+    /**
+     * ������get���������
+     *
+     * @param fieldName ���������
+     * @return getXxx
+     */
+    public static String genGetter(String fieldName) {
+        return upperFirstAndAddPre(fieldName, "get");
+    }
+
+    /**
+     * ������������������������������������������������������������������������<br/>
+     * ���������str=setName, preLength=3 -> return name
+     *
+     * @param str       ���������������������
+     * @param preLength ���������������
+     * @return ���������������������������������������������null
+     */
+    public static String cutPreAndLowerFirst(String str, int preLength) {
+        if (str == null) {
+            return null;
+        }
+        if (str.length() > preLength) {
+            char first = Character.toLowerCase(str.charAt(preLength));
+            if (str.length() > preLength + 1) {
+                return first + str.substring(preLength + 1);
+            }
+            return String.valueOf(first);
+        }
+        return null;
+    }
+
+    /**
+     * ��������������������������������������������������������������� ���������str=name, preString=get -> return getName
+     *
+     * @param str       ���������������������
+     * @param preString ���������������
+     * @return ���������������������
+     */
+    public static String upperFirstAndAddPre(String str, String preString) {
+        if (str == null || preString == null) {
+            return null;
+        }
+        return preString + capitalize(str);
+    }
+
+
+    /**
+     * ������������������
+     *
+     * @param str    ���������
+     * @param prefix ������
+     * @return ��������������������������������������� preffix��� ������������������
+     */
+    public static String removePrefix(String str, String prefix) {
+        if (isEmpty(str) || isEmpty(prefix)) {
+            return str;
+        }
+
+        if (str.startsWith(prefix)) {
+            return str.substring(prefix.length());
+        }
+        return str;
+    }
+
+    /**
+     * ���������������������������������
+     *
+     * @param str    ���������
+     * @param prefix ������
+     * @return ��������������������������������������� prefix��� ������������������
+     */
+    public static String removePrefixIgnoreCase(String str, String prefix) {
+        if (isEmpty(str) || isEmpty(prefix)) {
+            return str;
+        }
+
+        if (str.toLowerCase().startsWith(prefix.toLowerCase())) {
+            return str.substring(prefix.length());
+        }
+        return str;
+    }
+
+    /**
+     * ������������������
+     *
+     * @param str    ���������
+     * @param suffix ������
+     * @return ��������������������������������������� suffix��� ������������������
+     */
+    public static String removeSuffix(String str, String suffix) {
+        if (isEmpty(str) || isEmpty(suffix)) {
+            return str;
+        }
+
+        if (str.endsWith(suffix)) {
+            return str.substring(0, str.length() - suffix.length());
+        }
+        return str;
+    }
+
+    /**
+     * ���������������������byte������
+     *
+     * @param str     ���������
+     * @param charset ������������������<code>null</code>������������������������
+     * @return bytes
+     */
+    public static byte[] getBytes(String str, Charset charset) {
+        if (null == str) {
+            return null;
+        }
+        return null == charset ? str.getBytes() : str.getBytes(charset);
+    }
+
+    /**
+     * ���������������������������������
+     *
+     * @param str    ���������
+     * @param suffix ������
+     * @return ��������������������������������������� suffix��� ������������������
+     */
+    public static String removeSuffixIgnoreCase(String str, String suffix) {
+        if (isEmpty(str) || isEmpty(suffix)) {
+            return str;
+        }
+
+        if (str.toLowerCase().endsWith(suffix.toLowerCase())) {
+            return str.substring(0, str.length() - suffix.length());
+        }
+        return str;
+    }
+
+    /**
+     * ������������������������������prefix��������������������������� prefix
+     *
+     * @param str    ���������
+     * @param prefix ������
+     * @return ���������������������
+     */
+    public static String addPrefixIfNot(String str, String prefix) {
+        if (isEmpty(str) || isEmpty(prefix)) {
+            return str;
+        }
+        if (!str.startsWith(prefix)) {
+            str = prefix + str;
+        }
+        return str;
+    }
+
+    /**
+     * ������������������������������suffix��������������������������� suffix
+     *
+     * @param str    ���������
+     * @param suffix ������
+     * @return ���������������������
+     */
+    public static String addSuffixIfNot(String str, String suffix) {
+        if (isEmpty(str) || isEmpty(suffix)) {
+            return str;
+        }
+        if (!str.endsWith(suffix)) {
+            str += suffix;
+        }
+        return str;
+    }
+
+    /**
+     * ������������������
+     *
+     * @param str ���������������������
+     * @return ���������������������
+     */
+    public static String cleanBlank(String str) {
+        if (str == null) {
+            return null;
+        }
+
+        return str.replaceAll("\\s*", EMPTY);
+    }
+
+    /**
+     * ���������������<br>
+     * from jodd
+     *
+     * @param str       ���������������������
+     * @param delimiter ���������
+     * @return ���������
+     */
+    public static String[] split(String str, String delimiter) {
+        if (str == null) {
+            return null;
+        }
+        if (str.trim().length() == 0) {
+            return new String[]{str};
+        }
+        // del length
+        int dellen = delimiter.length();
+        // one more for the last
+        int maxparts = (str.length() / dellen) + 2;
+        int[] positions = new int[maxparts];
+
+        int i, j = 0;
+        int count = 0;
+        positions[0] = -dellen;
+        while ((i = str.indexOf(delimiter, j)) != -1) {
+            count++;
+            positions[count] = i;
+            j = i + dellen;
+        }
+        count++;
+        positions[count] = str.length();
+
+        String[] result = new String[count];
+
+        for (i = 0; i < count; i++) {
+            result[i] = str.substring(positions[i] + dellen, positions[i + 1]);
+        }
+        return result;
+    }
+
+    /**
+     * ������JDK subString<br>
+     * index���0������������������������������������-1<br>
+     * ������from���to��������������������� "" <br>
+     * ������from���to���������������������length������������������������������������������������������������������from������0���to������length<br>
+     * ���������������������index���from������to������������from���to
+     * example: <br>
+     * abcdefgh 2 3 -> c <br>
+     * abcdefgh 2 -3 -> cde <br>
+     *
+     * @param string    String
+     * @param fromIndex ���������index������������
+     * @param toIndex   ���������index���������������
+     * @return ������
+     */
+    public static String sub(String string, int fromIndex, int toIndex) {
+        int len = string.length();
+        if (fromIndex < 0) {
+            fromIndex = len + fromIndex;
+            if (fromIndex < 0) {
+                fromIndex = 0;
+            }
+        } else if (fromIndex >= len) {
+            fromIndex = len - 1;
+        }
+        if (toIndex < 0) {
+            toIndex = len + toIndex;
+            if (toIndex < 0) {
+                toIndex = len;
+            }
+        } else if (toIndex > len) {
+            toIndex = len;
+        }
+        if (toIndex < fromIndex) {
+            int tmp = fromIndex;
+            fromIndex = toIndex;
+            toIndex = tmp;
+        }
+        if (fromIndex == toIndex) {
+            return EMPTY;
+        }
+        char[] strArray = string.toCharArray();
+        char[] newStrArray = Arrays.copyOfRange(strArray, fromIndex, toIndex);
+        return new String(newStrArray);
+    }
+
+    /**
+     * ���������������
+     *
+     * @param string  ���������
+     * @param toIndex ���������������������������������
+     * @return ���������������������
+     */
+    public static String subPre(String string, int toIndex) {
+        return sub(string, 0, toIndex);
+    }
+
+    /**
+     * ���������������
+     *
+     * @param string    ���������
+     * @param fromIndex ���������������������������������
+     * @return ���������������������
+     */
+    public static String subSuf(String string, int fromIndex) {
+        if (isEmpty(string)) {
+            return null;
+        }
+        return sub(string, fromIndex, string.length());
+    }
+
+    /**
+     * ������������������������������������
+     *
+     * @param str    ���������
+     * @param prefix ������
+     * @param suffix ������
+     * @return ������������������������������
+     */
+    public static boolean isSurround(String str, String prefix, String suffix) {
+        if (StringUtils.isBlank(str)) {
+            return false;
+        }
+        if (str.length() < (prefix.length() + suffix.length())) {
+            return false;
+        }
+
+        return str.startsWith(prefix) && str.endsWith(suffix);
+    }
+
+//    /**
+//     * ������������������������������������
+//     *
+//     * @param str    ���������
+//     * @param prefix ������
+//     * @param suffix ������
+//     * @return ������������������������������
+//     */
+//    public static boolean isSurround(String str, char prefix, char suffix) {
+//        if (StringUtils.isBlank(str)) {
+//            return false;
+//        }
+//        if (str.length() < 2) {
+//            return false;
+//        }
+//
+//        return str.charAt(0) == prefix && str.charAt(str.length() - 1) == suffix;
+//    }
+
+    /**
+     * ������������������
+     *
+     * @param c     ������������������
+     * @param count ���������������
+     * @return ���������������������
+     */
+    public static String repeat(char c, int count) {
+        char[] result = new char[count];
+        for (int i = 0; i < count; i++) {
+            result[i] = c;
+        }
+        return new String(result);
+    }
+
+    /**
+     * ���������������������
+     *
+     * @param str   ������������������
+     * @param count ���������������
+     * @return ���������������������
+     */
+    public static String repeat(String str, int count) {
+
+        // ������
+        final int len = str.length();
+        final long longSize = (long) len * (long) count;
+        final int size = (int) longSize;
+        if (size != longSize) {
+            throw new ArrayIndexOutOfBoundsException("Required String length is too large: " + longSize);
+        }
+
+        final char[] array = new char[size];
+        str.getChars(0, len, array, 0);
+        int n;
+        // n <<= 1���������n *2
+        for (n = len; n < size - n; n <<= 1) {
+            System.arraycopy(array, 0, array, n, n);
+        }
+        System.arraycopy(array, 0, array, n, size - n);
+        return new String(array);
+    }
+
+    /**
+     * ���������������������������������������������
+     * <p>
+     * <pre>
+     * equals(null, null)   = true
+     * equals(null, &quot;abc&quot;)  = false
+     * equals(&quot;abc&quot;, null)  = false
+     * equals(&quot;abc&quot;, &quot;abc&quot;) = true
+     * equals(&quot;abc&quot;, &quot;ABC&quot;) = false
+     * </pre>
+     *
+     * @param str1 ���������������������1
+     * @param str2 ���������������������2
+     * @return ������������������������������������������<code>null</code>������������<code>true</code>
+     */
+    public static boolean equals(String str1, String str2) {
+        if (str1 == null) {
+            return str2 == null;
+        }
+
+        return str1.equals(str2);
+    }
+
+    /**
+     * ������������������������������������������������
+     * <p>
+     * <pre>
+     * equalsIgnoreCase(null, null)   = true
+     * equalsIgnoreCase(null, &quot;abc&quot;)  = false
+     * equalsIgnoreCase(&quot;abc&quot;, null)  = false
+     * equalsIgnoreCase(&quot;abc&quot;, &quot;abc&quot;) = true
+     * equalsIgnoreCase(&quot;abc&quot;, &quot;ABC&quot;) = true
+     * </pre>
+     *
+     * @param str1 ���������������������1
+     * @param str2 ���������������������2
+     * @return ������������������������������������������<code>null</code>������������<code>true</code>
+     */
+    public static boolean equalsIgnoreCase(String str1, String str2) {
+        if (str1 == null) {
+            return str2 == null;
+        }
+
+        return str1.equalsIgnoreCase(str2);
+    }
+
+    /**
+     * ���������������, {} ���������������<br>
+     * ���������format("aaa {} ccc", "bbb")   ---->    aaa bbb ccc
+     *
+     * @param template ������������������������������������ {} ������
+     * @param values   ���������
+     * @return ���������������������
+     */
+    public static String format(String template, Object... values) {
+        if (isBlank(template)) {
+            return template;
+        }
+
+        final StringBuilder sb = new StringBuilder();
+        final int length = template.length();
+
+        int valueIndex = 0;
+        char currentChar;
+        for (int i = 0; i < length; i++) {
+            if (valueIndex >= values.length) {
+                sb.append(sub(template, i, length));
+                break;
+            }
+
+            currentChar = template.charAt(i);
+            if (currentChar == '{') {
+                final char nextChar = template.charAt(++i);
+                if (nextChar == '}') {
+                    sb.append(values[valueIndex++]);
+                } else {
+                    sb.append('{').append(nextChar);
+                }
+            } else {
+                sb.append(currentChar);
+            }
+
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * ������������������������ {varName} ������<br>
+     * map = {a: "aValue", b: "bValue"}
+     * format("{a} and {b}", map)    ---->    aValue and bValue
+     *
+     * @param template ������������������������������������ {key} ������
+     * @param map      ������������
+     * @return ���������������������
+     */
+    public static String format(String template, Map<?, ?> map) {
+        if (null == map || map.isEmpty()) {
+            return template;
+        }
+
+        for (Map.Entry<?, ?> entry : map.entrySet()) {
+            template = template.replace("{" + entry.getKey() + "}", entry.getValue().toString());
+        }
+        return template;
+    }
+
+    /**
+     * ���������������
+     *
+     * @param str     ���������
+     * @param charset ���������������������������������������������������������������������
+     * @return ���������������������
+     */
+    public static byte[] bytes(String str, String charset) {
+        return bytes(str, isBlank(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * ���������������
+     *
+     * @param str     ���������
+     * @param charset ���������������������������������������������������������������������
+     * @return ���������������������
+     */
+    public static byte[] bytes(String str, Charset charset) {
+        if (str == null) {
+            return null;
+        }
+
+        if (null == charset) {
+            return str.getBytes();
+        }
+        return str.getBytes(charset);
+    }
+
+    /**
+     * ���byte���������������������
+     *
+     * @param bytes   byte������
+     * @param charset ���������
+     * @return ���������
+     */
+    public static String str(byte[] bytes, String charset) {
+        return str(bytes, isBlank(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * ���������������
+     *
+     * @param data    ���������
+     * @param charset ���������������������������������������������������������������������
+     * @return ���������������������
+     */
+    public static String str(byte[] data, Charset charset) {
+        if (data == null) {
+            return null;
+        }
+
+        if (null == charset) {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * ������������byteBuffer������������������������
+     *
+     * @param data    ������
+     * @param charset ���������������������������������������������������
+     * @return ���������
+     */
+    public static String str(ByteBuffer data, String charset) {
+        if (data == null) {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * ������������byteBuffer������������������������
+     *
+     * @param data    ������
+     * @param charset ���������������������������������������������������
+     * @return ���������
+     */
+    public static String str(ByteBuffer data, Charset charset) {
+        if (null == charset) {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    /**
+     * ������������������byteBuffer
+     *
+     * @param str     ���������
+     * @param charset ������
+     * @return byteBuffer
+     */
+    public static ByteBuffer byteBuffer(String str, String charset) {
+        return ByteBuffer.wrap(StringUtils.bytes(str, charset));
+    }
+
+    /**
+     * ��� conjunction ���������������������������������������������
+     *
+     * @param conjunction ���������
+     * @param objs        ������
+     * @return ���������������������
+     */
+    public static String join(String conjunction, Object... objs) {
+        StringBuilder sb = new StringBuilder();
+        boolean isFirst = true;
+        for (Object item : objs) {
+            if (isFirst) {
+                isFirst = false;
+            } else {
+                sb.append(conjunction);
+            }
+            sb.append(item);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * ���������������������������������������������������������������������������������������������������������������������������������������</br>
+     * ���������HelloWorld->hello_world
+     *
+     * @param camelCaseStr ���������������������������������������
+     * @return ������������������������������������������������
+     */
+    public static String camelCaseToPath(String camelCaseStr) {
+        if (camelCaseStr == null) {
+            return null;
+        }
+
+        final int length = camelCaseStr.length();
+        StringBuilder sb = new StringBuilder();
+        char c;
+        boolean isPreUpperCase = false;
+        for (int i = 0; i < length; i++) {
+            c = camelCaseStr.charAt(i);
+            boolean isNextUpperCase = true;
+            if (i < (length - 1)) {
+                isNextUpperCase = Character.isUpperCase(camelCaseStr.charAt(i + 1));
+            }
+            if (Character.isUpperCase(c)) {
+                if (!isPreUpperCase || !isNextUpperCase) {
+                    if (i > 0) {
+                        sb.append("/");
+                    }
+                }
+                isPreUpperCase = true;
+            } else {
+                isPreUpperCase = false;
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * ���������������������������������������������������������������������������������������������������������������������������������������</br>
+     * ���������HelloWorld->hello_world
+     *
+     * @param camelCaseStr ���������������������������������������
+     * @return ������������������������������������������������
+     */
+    public static String camelCaseToUnderline(String camelCaseStr) {
+        if (camelCaseStr == null) {
+            return null;
+        }
+
+        final int length = camelCaseStr.length();
+        StringBuilder sb = new StringBuilder();
+        char c;
+        boolean isPreUpperCase = false;
+        for (int i = 0; i < length; i++) {
+            c = camelCaseStr.charAt(i);
+            boolean isNextUpperCase = true;
+            if (i < (length - 1)) {
+                isNextUpperCase = Character.isUpperCase(camelCaseStr.charAt(i + 1));
+            }
+            if (Character.isUpperCase(c)) {
+                if (!isPreUpperCase || !isNextUpperCase) {
+                    if (i > 0) {
+                        sb.append(UNDERLINE);
+                    }
+                }
+                isPreUpperCase = true;
+            } else {
+                isPreUpperCase = false;
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * ���������������������������������������������������������������������������������������������������������������������������������������������������</br>
+     * ���������hello_world->HelloWorld
+     *
+     * @param name ���������������������������������������������������
+     * @return ���������������������������������������
+     */
+    public static String underlineToCamelCase(String name) {
+        if (name == null) {
+            return null;
+        }
+        if (name.contains(UNDERLINE)) {
+            name = name.toLowerCase();
+
+            StringBuilder sb = new StringBuilder(name.length());
+            boolean upperCase = false;
+            for (int i = 0; i < name.length(); i++) {
+                char c = name.charAt(i);
+
+                if (c == '_') {
+                    upperCase = true;
+                } else if (upperCase) {
+                    sb.append(Character.toUpperCase(c));
+                    upperCase = false;
+                } else {
+                    sb.append(c);
+                }
+            }
+            return sb.toString();
+        } else {
+            return name;
+        }
+    }
+
+    /**
+     * ���������������������
+     *
+     * @param str    ���������������������
+     * @param prefix ������
+     * @param suffix ������
+     * @return ���������������������
+     */
+    public static String wrap(String str, String prefix, String suffix) {
+        return format("{}{}{}", prefix, str, suffix);
+    }
+
+    /**
+     * ������������������������������
+     *
+     * @param str    ���������
+     * @param prefix ������
+     * @param suffix ������
+     * @return ���������������
+     */
+    public static boolean isWrap(String str, String prefix, String suffix) {
+        return str.startsWith(prefix) && str.endsWith(suffix);
+    }
+
+    /**
+     * ���������������������������������������������������������������������������
+     *
+     * @param str     ���������
+     * @param wrapper ���������������
+     * @return ���������������
+     */
+    public static boolean isWrap(String str, String wrapper) {
+        return isWrap(str, wrapper, wrapper);
+    }
+
+    /**
+     * ���������������������������������������������������������������������������
+     *
+     * @param str     ���������
+     * @param wrapper ������������
+     * @return ���������������
+     */
+    public static boolean isWrap(String str, char wrapper) {
+        return isWrap(str, wrapper, wrapper);
+    }
+
+    /**
+     * ������������������������������
+     *
+     * @param str        ���������
+     * @param prefixChar ������
+     * @param suffixChar ������
+     * @return ���������������
+     */
+    public static boolean isWrap(String str, char prefixChar, char suffixChar) {
+        return str.charAt(0) == prefixChar && str.charAt(str.length() - 1) == suffixChar;
+    }
+
+    /**
+     * ������StringBuilder������
+     *
+     * @return StringBuilder������
+     */
+    public static StringBuilder builder() {
+        return new StringBuilder();
+    }
+
+    /**
+     * ������StringBuilder������
+     *
+     * @return StringBuilder������
+     */
+    public static StringBuilder builder(int capacity) {
+        return new StringBuilder(capacity);
+    }
+
+    /**
+     * ������StringBuilder������
+     *
+     * @return StringBuilder������
+     */
+    public static StringBuilder builder(String... strs) {
+        final StringBuilder sb = new StringBuilder();
+        for (String str : strs) {
+            sb.append(str);
+        }
+        return sb;
+    }
+
+
+    public static String concatLikeStart(String value) {
+        return concatLike(value, 1);
+    }
+
+    public static String concatLikeEnd(String value) {
+        return concatLike(value, 2);
+    }
+
+    public static String concatLikeAll(String value) {
+        return concatLike(value, -1);
+    }
+
+    /**
+     * @param value
+     * @param type
+     * @return
+     */
+    public static String concatLike(String value, Integer type) {
+        if (isEmpty(value)) {
+            return null;
+        }
+        StringBuilder builder = new StringBuilder(value.length() + 3);
+        switch (type) {
+            case 1:
+                builder.append("%").append(value);
+                break;
+            case 2:
+                builder.append(value).append("%");
+                break;
+            case 3:
+                builder.append(value);
+                break;
+            default:
+                builder.append("%").append(value).append("%");
+        }
+        return builder.toString();
+    }
+
+    /**
+     * ������StringReader
+     *
+     * @param str ���������
+     * @return StringReader
+     */
+    public static StringReader getReader(String str) {
+        return new StringReader(str);
+    }
+
+    /**
+     * ������StringWriter
+     *
+     * @return StringWriter
+     */
+    public static StringWriter getWriter() {
+        return new StringWriter();
+    }
+
+    /**
+     * ���������������
+     *
+     * @param str     ���������
+     * @param charset ���������������������������������������������������������������������
+     * @return ���������������������
+     */
+    public static byte[] encode(String str, String charset) {
+        if (str == null) {
+            return null;
+        }
+
+        if (isBlank(charset)) {
+            return str.getBytes();
+        }
+        try {
+            return str.getBytes(charset);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(format("Charset [{}] unsupported!", charset));
+        }
+    }
+
+    /**
+     * ���������������
+     *
+     * @param data    ���������
+     * @param charset ���������������������������������������������������������������������
+     * @return ���������������������
+     */
+    public static String decode(byte[] data, String charset) {
+        if (data == null) {
+            return null;
+        }
+
+        if (isBlank(charset)) {
+            return new String(data);
+        }
+        try {
+            return new String(data, charset);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(format("Charset [{}] unsupported!", charset));
+        }
+    }
+
+//    /**
+//     * ������������������
+//     */
+//    public static String firstCharToUpperCase(String str) {
+//        char firstChar = str.charAt(0);
+//        if (firstChar >= 'a' && firstChar <= 'z') {
+//            char[] arr = str.toCharArray();
+//            arr[0] -= ('a' - 'A');
+//            return new String(arr);
+//        }
+//        return str;
+//    }
+
+
+    /**
+     * Description:������������������������������������������������������������������������0������������������������������������������������
+     * ���������23���������4��������������� => "0023"
+     *
+     * @param val ���������
+     * @param num ���������������
+     * @return java.lang.String
+     * @author fanhq
+     * @date 2020/4/17 9:44
+     */
+    public static String intToStringCode(Integer val, Integer num) {
+        int i = num - val.toString().length();
+        StringBuffer sbf = new StringBuffer();
+        for (int k = 0; k < i; k++) {
+            sbf.append("0");
+        }
+        return sbf.append(val.toString()).toString();
+    }
+
+    public static String match(String message, String regex) {
+        Pattern p = Pattern.compile(regex);
+        Matcher m = p.matcher(message);
+        while (m.find()) {
+            return m.group();
+        }
+        return null;
+    }
+
+    public static String lpad(Integer length, String data, char text) {
+        if (data.length() >= length) {
+            return data;
+        }
+        StringBuffer stringBuffer = new StringBuffer();
+        for (int i = data.length(); i < length; i++) {
+            stringBuffer.append(text);
+        }
+        return stringBuffer.append(data).toString();
+    }
+}
diff --git a/screen-api/src/main/resources/application-dev.yml b/screen-api/src/main/resources/application-dev.yml
index 0dc6f52..71d7a11 100644
--- a/screen-api/src/main/resources/application-dev.yml
+++ b/screen-api/src/main/resources/application-dev.yml
@@ -115,10 +115,12 @@
       - /webjars/**
       - /verificationCode/**
       - /static/**
-
+      - /file/preview/**
 AES:
   KEY:
     AD42F7787B035B7580000EF93BE20BAD
 TOKEN:
   KEY:
-    foh3wi2ooghiCh5
\ No newline at end of file
+    foh3wi2ooghiCh5
+file:
+  path: /data/upload/
\ No newline at end of file
diff --git a/screen-api/src/main/resources/application-local.yml b/screen-api/src/main/resources/application-local.yml
index 2091214..fb92f00 100644
--- a/screen-api/src/main/resources/application-local.yml
+++ b/screen-api/src/main/resources/application-local.yml
@@ -17,9 +17,9 @@
   application:
     name: screen-api
   redis:
-    host: r-bp1xdlb9wfc6zt0msppd.redis.rds.aliyuncs.com
+    host: r-bp1xdlb9wfc6zt0msppd13.redis.rds.aliyuncs.com
     port: 6379
-    password: moral_123456
+    password: QX_moral_2023
     timeout: 30000
     jedis:
       pool:
@@ -34,9 +34,9 @@
         max-wait: 30000
         min-idle: 32
   tokenRedis:
-    host: r-bp1xdlb9wfc6zt0msppd.redis.rds.aliyuncs.com
+    host: r-bp1xdlb9wfc6zt0msppd13.redis.rds.aliyuncs.com
     port: 6379
-    password: moral_123456
+    password: QX_moral_2023
     timeout: 30000
     database: 15
     pool:
@@ -53,9 +53,9 @@
     filters: stat
     type: com.alibaba.druid.pool.DruidDataSource
     max-wait: 60000
-    url: jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o2.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o13.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: moral_qx
-    password: moral_qx_12345
+    password: QX_moral_2023
     test-on-borrow: false
     sql-script-encoding: utf-8
     pool-prepared-statements: true
diff --git a/screen-api/src/main/resources/application-qa.yml b/screen-api/src/main/resources/application-qa.yml
index ab0f0ae..6777caa 100644
--- a/screen-api/src/main/resources/application-qa.yml
+++ b/screen-api/src/main/resources/application-qa.yml
@@ -128,7 +128,8 @@
       - /webjars/**
       - /verificationCode/**
       - /static/**
-      - /file/**
+      - /doc.html
+      - /file/preview/**
 
 
 AES:
@@ -138,3 +139,5 @@
   KEY:
     foh3wi2ooghiCh5
 
+file:
+  path: E:\upload
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/AllocationExtensionMapper.xml b/screen-api/src/main/resources/mapper/AllocationExtensionMapper.xml
new file mode 100644
index 0000000..ee948ea
--- /dev/null
+++ b/screen-api/src/main/resources/mapper/AllocationExtensionMapper.xml
@@ -0,0 +1,69 @@
+<?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.moral.api.mapper.AllocationExtensionMapper">
+
+    <!-- ������������������������ deyt template generate -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.AllocationExtension">
+        <id column="id" property="id" />
+        <result column="allocation_id" property="allocationId" />
+        <result column="extension_num" property="extensionNum" />
+        <result column="remake" property="remake" />
+        <result column="state" property="state" />
+        <result column="invalid_reason" property="invalidReason" />
+    </resultMap>
+
+    <!-- ��������������������� -->
+    <sql id="Base_Column_List">
+        id, allocation_id, extension_num, remake, state, is_del, is_invalid, invalid_reason, create_id, create_name, create_time, update_id, update_name, update_time
+    </sql>
+
+    <!-- ��������������������� -->
+    <sql id="AllocationExtension_Column_List">
+        allocationextension.id, allocationextension.allocation_id, allocationextension.extension_num, allocationextension.remake, allocationextension.state, allocationextension.is_del, allocationextension.is_invalid, allocationextension.invalid_reason, allocationextension.create_id, allocationextension.create_name, allocationextension.create_time, allocationextension.update_id, allocationextension.update_name, allocationextension.update_time
+    </sql>
+
+
+    <select id="extOne" resultType="com.moral.api.pojo.ext.allocationextension.AllocationExtensionExt">
+        SELECT
+        <include refid="AllocationExtension_Column_List"/>
+        FROM allocation_extension allocationextension
+        where allocationextension.id = #{id} and allocationextension.is_del = 0
+    </select>
+
+
+    <select id="extPage" resultType="com.moral.api.pojo.ext.allocationextension.AllocationExtensionPageExt">
+        SELECT
+        <include refid="AllocationExtension_Column_List"/>,
+        t1.allocation_num,t1.escalation_time,t1.unit_id,t1.pollute_type,t1.change_type,t1.change_day,t1.escalation_unit_id,t1.escalation_name
+        FROM allocation_extension allocationextension
+        left join allocation t1 on allocationextension.allocation_id = t1.allocation_id
+        <where>
+            1 = 1 and allocationextension.is_del = 0
+
+            <if test="allocation.unitId != null and allocation.unitId != 0">
+                and t1.unit_id = #{allocation.unitId}
+            </if>
+            <if test="allocation.polluteType != null and allocation.polluteType != 0">
+                and t1.pollute_type = #{allocation.polluteType}
+            </if>
+            <if test="allocation.state != null and allocation.state != 0">
+                and t1.state = #{allocation.state}
+            </if>
+            <if test="allocation.investigationType != null and allocation.investigationType != 0">
+                and t1.investigation_type = #{allocation.investigationType}
+            </if>
+            <if test="allocation.changeType != null and allocation.changeType != 0">
+                and t1.change_type = #{allocation.changeType}
+            </if>
+
+            <if test="allocation.startTime != null and allocation.startTime != '' ">
+                and date(t1.escalation_time) <![CDATA[>=]]> #{allocation.startTime}
+            </if>
+            <if test="allocation.endTime != null and allocation.endTime !='' ">
+                and date(t1.escalation_time) <![CDATA[<=]]>  #{allocation.endTime}
+            </if>
+
+        </where>
+        order by t1.escalation_time desc,t1.allocation_id desc
+    </select>
+</mapper>
diff --git a/screen-api/src/main/resources/mapper/AllocationMapper.xml b/screen-api/src/main/resources/mapper/AllocationMapper.xml
new file mode 100644
index 0000000..32c9a32
--- /dev/null
+++ b/screen-api/src/main/resources/mapper/AllocationMapper.xml
@@ -0,0 +1,96 @@
+<?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.moral.api.mapper.AllocationMapper">
+
+    <!-- ������������������������ deyt template generate -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.Allocation">
+        <id column="allocation_id" property="allocationId" />
+        <result column="allocation_num" property="allocationNum" />
+        <result column="escalation_type" property="escalationType" />
+        <result column="escalation_time" property="escalationTime" />
+        <result column="pollute_position" property="pollutePosition" />
+        <result column="unit_id" property="unitId" />
+        <result column="pollute_type" property="polluteType" />
+        <result column="change_type" property="changeType" />
+        <result column="change_day" property="changeDay" />
+        <result column="escalation_unit_id" property="escalationUnitId" />
+        <result column="escalation_name" property="escalationName" />
+        <result column="investigation_type" property="investigationType" />
+        <result column="problem_describe" property="problemDescribe" />
+        <result column="is_change" property="isChange" />
+        <result column="change_describe" property="changeDescribe" />
+        <result column="change_name" property="changeName" />
+        <result column="change_time" property="changeTime" />
+        <result column="check_score" property="checkScore" />
+        <result column="check_describe" property="checkDescribe" />
+        <result column="check_name" property="checkName" />
+        <result column="check_time" property="checkTime" />
+        <result column="state" property="state" />
+        <result column="invalid_reason" property="invalidReason" />
+    </resultMap>
+
+    <!-- ��������������������� -->
+    <sql id="Base_Column_List">
+        allocation_id, allocation_num, escalation_type, escalation_time, pollute_position, unit_id, pollute_type, change_type, change_day, escalation_unit_id, escalation_name, investigation_type, problem_describe, is_change, change_describe, change_name, change_time, check_score, check_describe, check_name, check_time, state, is_del, is_invalid, invalid_reason, create_id, create_name, create_time, update_id, update_name, update_time
+    </sql>
+
+    <!-- ��������������������� -->
+    <sql id="Allocation_Column_List">
+        allocation.allocation_id, allocation.allocation_num, allocation.escalation_type, allocation.escalation_time, allocation.pollute_position, allocation.unit_id, allocation.pollute_type, allocation.change_type, allocation.change_day, allocation.escalation_unit_id, allocation.escalation_name, allocation.investigation_type, allocation.problem_describe, allocation.is_change, allocation.change_describe, allocation.change_name, allocation.change_time, allocation.check_score, allocation.check_describe, allocation.check_name, allocation.check_time, allocation.state, allocation.is_del, allocation.is_invalid, allocation.invalid_reason, allocation.create_id, allocation.create_name, allocation.create_time, allocation.update_id, allocation.update_name, allocation.update_time
+    </sql>
+
+
+    <select id="extOne" resultType="com.moral.api.pojo.ext.allocation.AllocationExt">
+        SELECT
+        <include refid="Allocation_Column_List"/>
+        FROM allocation allocation
+        where  allocation.allocation_id = #{id} and allocation.is_del = 0
+    </select>
+
+    <select id="extList" resultType="com.moral.api.pojo.ext.allocation.AllocationListExt">
+        SELECT
+        <include refid="Allocation_Column_List"/>
+        FROM allocation allocation
+        <where>
+            1 = 1
+            <if test="allocation.id != null and allocation.id != 0">
+                and allocation.allocation_id = #{allocation.id} and allocation.is_del = 0
+            </if>
+        </where>
+    </select>
+
+    <select id="extPage" resultType="com.moral.api.pojo.ext.allocation.AllocationPageExt">
+        SELECT
+        <include refid="Allocation_Column_List"/>,t1.id as applyState
+        FROM allocation allocation
+        left join allocation_extension t1 on t1.allocation_id = allocation.allocation_id and t1.is_del =0 and t1.is_invalid = 0 and t1.state = 30
+        <where>
+            1 = 1 and allocation.is_del = 0
+            <if test="allocation.unitId != null and allocation.unitId != 0">
+                and allocation.unit_id = #{allocation.unitId}
+            </if>
+            <if test="allocation.polluteType != null and allocation.polluteType != 0">
+                and allocation.pollute_type = #{allocation.polluteType}
+            </if>
+            <if test="allocation.state != null and allocation.state != 0">
+                and allocation.state = #{allocation.state}
+            </if>
+            <if test="allocation.investigationType != null and allocation.investigationType != 0">
+                and allocation.investigation_type = #{allocation.investigationType}
+            </if>
+            <if test="allocation.changeType != null and allocation.changeType != 0">
+                and allocation.change_type = #{allocation.changeType}
+            </if>
+            <if test="allocation.isInvalid != null and allocation.isInvalid != 0">
+                and allocation.is_invalid = #{allocation.isInvalid}
+            </if>
+            <if test="allocation.startTime != null and allocation.startTime != '' ">
+                and date(allocation.escalation_time) <![CDATA[>=]]> #{allocation.startTime}
+            </if>
+            <if test="allocation.endTime != null and allocation.endTime !='' ">
+                and date(allocation.escalation_time) <![CDATA[<=]]>  #{allocation.endTime}
+            </if>
+        </where>
+        order by allocation.escalation_time desc,allocation.allocation_id desc
+    </select>
+</mapper>
diff --git a/screen-api/src/main/resources/mapper/FileTableMapper.xml b/screen-api/src/main/resources/mapper/FileTableMapper.xml
new file mode 100644
index 0000000..3f57c01
--- /dev/null
+++ b/screen-api/src/main/resources/mapper/FileTableMapper.xml
@@ -0,0 +1,20 @@
+<?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.moral.api.mapper.FileTableMapper">
+
+        <!-- ������������������������ -->
+        <resultMap id="BaseResultMap" type="com.moral.api.entity.FileTable">
+                    <id column="file_id" property="fileId" />
+                    <result column="file_module" property="fileModule" />
+                    <result column="relation_id" property="relationId" />
+                    <result column="file_name" property="fileName" />
+                    <result column="file_type" property="fileType" />
+                    <result column="file_address" property="fileAddress" />
+                    <result column="file_size" property="fileSize" />
+                    <result column="is_del" property="isDel" />
+                    <result column="create_id" property="createId" />
+                    <result column="create_name" property="createName" />
+                    <result column="create_time" property="createTime" />
+        </resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java
index 37f82fb..ad910db 100644
--- a/screen-common/src/main/java/com/moral/constant/Constants.java
+++ b/screen-common/src/main/java/com/moral/constant/Constants.java
@@ -114,6 +114,13 @@
      * */
     public static final String SYSTEM_DICT_TYPE_PURCHASER = "purchaser";
 
+    /**
+     * ������������������
+     */
+    public static final  String WU_RAN_LEI_XING = "contaminate";
+
+
+
     /*
      * ������������������������
      * */
diff --git a/screen-common/src/main/java/com/moral/constant/PageInfo.java b/screen-common/src/main/java/com/moral/constant/PageInfo.java
new file mode 100644
index 0000000..5f38829
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/constant/PageInfo.java
@@ -0,0 +1,27 @@
+package com.moral.constant;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "������������", description = "������������")
+public class PageInfo {
+
+    @ApiModelProperty(value = "������������")
+    private long pageSize;
+
+    @ApiModelProperty(value = "������������")
+    private long currentPage;
+
+    @ApiModelProperty(value = "���������")
+    private long totalPage;
+
+    @ApiModelProperty(value = "������������")
+    private long totalNum;
+}
diff --git a/screen-common/src/main/java/com/moral/constant/PageResult.java b/screen-common/src/main/java/com/moral/constant/PageResult.java
new file mode 100644
index 0000000..28d95f4
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/constant/PageResult.java
@@ -0,0 +1,34 @@
+package com.moral.constant;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ *
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "������������", description = "������������")
+public class PageResult<T> {
+
+    @ApiModelProperty(value = "������������")
+    private PageInfo page;
+
+    @ApiModelProperty(value = "������")
+    private List<T> list;
+
+    public PageResult() {
+    }
+
+    public PageResult(Page page) {
+        this.page = new PageInfo().setCurrentPage(page.getCurrent())
+                .setPageSize(page.getSize())
+                .setTotalPage(page.getPages())
+                .setTotalNum(page.getTotal());
+    }
+}
diff --git a/screen-common/src/main/java/com/moral/constant/RedisConstants.java b/screen-common/src/main/java/com/moral/constant/RedisConstants.java
index 7a08d47..d8a4884 100644
--- a/screen-common/src/main/java/com/moral/constant/RedisConstants.java
+++ b/screen-common/src/main/java/com/moral/constant/RedisConstants.java
@@ -108,4 +108,7 @@
 
 
     public static final String DATE_COORDINATE="data_coordinate";
+
+
+    public static final String JBD_DATA="allocation_num";
 }
diff --git a/screen-manage/src/main/java/com/moral/api/controller/ResponsibilityUnitController.java b/screen-manage/src/main/java/com/moral/api/controller/ResponsibilityUnitController.java
new file mode 100644
index 0000000..5fc0a4e
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/controller/ResponsibilityUnitController.java
@@ -0,0 +1,118 @@
+package com.moral.api.controller;
+
+
+import io.swagger.annotations.Api;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.service.ResponsibilityUnitService;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.constant.ResultMessage;
+import com.moral.util.WebUtils;
+
+@Api(tags = "������������")
+@RestController
+@RequestMapping("unit")
+public class ResponsibilityUnitController {
+
+
+    @Autowired
+    private ResponsibilityUnitService responsibilityUnitService;
+
+
+    /**
+     * ������������
+     * @param responsibilityUnit
+     * @return
+     */
+    @PostMapping("insert")
+    public ResultMessage insert(@RequestBody ResponsibilityUnit responsibilityUnit){
+
+        Integer insert = responsibilityUnitService.insert(responsibilityUnit);
+        if (insert<0){
+            return ResultMessage.fail(ResponseCodeEnum.ROLE_IS_EXIST.getCode(),ResponseCodeEnum.ROLE_IS_EXIST.getMsg());
+        }
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������
+     * @param request
+     * @return
+     */
+    @GetMapping("selectUint")
+    public ResultMessage selectUint(HttpServletRequest request){
+        Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null);
+
+        Map<String, Object> map = responsibilityUnitService.selectUnit(parameters);
+
+        return ResultMessage.ok(map);
+    }
+
+    /**
+     * ������������
+     * @param responsibilityUnit
+     * @return
+     */
+    @PostMapping("update")
+    public  ResultMessage updateUnit(@RequestBody ResponsibilityUnit responsibilityUnit){
+        Integer integer = responsibilityUnitService.updateUnit(responsibilityUnit);
+        if (integer<0){
+            return ResultMessage.fail(ResponseCodeEnum.ROLE_IS_EXIST.getCode(),ResponseCodeEnum.ROLE_IS_EXIST.getMsg());
+        }
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������
+     * @param unitId
+     * @return
+     */
+    @GetMapping("state")
+    public ResultMessage state(Integer unitId){
+        if (ObjectUtils.isEmpty(unitId)){
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        responsibilityUnitService.updateState(unitId);
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������
+     * @param unitId
+     * @param code
+     * @return
+     */
+    @GetMapping("invalid")
+    public ResultMessage invalid(Integer unitId,String code){
+        if (ObjectUtils.isEmpty(unitId)){
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        responsibilityUnitService.updateInvalid(unitId,code);
+        return ResultMessage.ok();
+    }
+
+    /**
+     * ������������
+     * @param unitId
+     * @return
+     */
+    @GetMapping("delete")
+    public ResultMessage delete(Integer unitId){
+        responsibilityUnitService.removeById(unitId);
+        return ResultMessage.ok();
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/controller/SystemController.java b/screen-manage/src/main/java/com/moral/api/controller/SystemController.java
index 78b959c..a25c8be 100644
--- a/screen-manage/src/main/java/com/moral/api/controller/SystemController.java
+++ b/screen-manage/src/main/java/com/moral/api/controller/SystemController.java
@@ -50,6 +50,18 @@
         return ResultMessage.ok(sysAreas);
     }
 
+    @GetMapping("area/queryCity")
+    public ResultMessage queryCity(){
+        List<SysArea> sysAreas = sysAreaService.queryCity();
+        return ResultMessage.ok(sysAreas);
+    }
+
+    @GetMapping("area/code")
+    public ResultMessage queryCode(Integer code){
+        List<SysArea> sysAreas = sysAreaService.selectCode(code);
+        return ResultMessage.ok(sysAreas);
+    }
+
     /**
      * @Description: ������������������
      * @Param: [form]
diff --git a/screen-manage/src/main/java/com/moral/api/entity/ResponsibilityUnit.java b/screen-manage/src/main/java/com/moral/api/entity/ResponsibilityUnit.java
new file mode 100644
index 0000000..b2d467c
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/entity/ResponsibilityUnit.java
@@ -0,0 +1,70 @@
+package com.moral.api.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ResponsibilityUnit extends Model<ResponsibilityUnit> {
+
+
+    private static final long serialVersionUID = 1L;
+
+    //������������id
+    @TableId(value = "unit_id", type = IdType.AUTO)
+    private Integer unitId;
+    /**
+     * ������������
+     */
+    private String unitName;
+    /**
+     * ������������
+     */
+    private Integer areaCode;
+    /**
+     * ������������
+     */
+    private  Integer parentCode;
+    //0��������� 1���������
+    private  String state;
+    //0��������� 1���������
+    private  String isDel;
+    //0������������ 1������������
+    private  Integer isInvalid;
+    //������������
+    private String invalidReason;
+
+    private String value;
+
+    private  Integer createId;
+
+    private  String createName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private  Date createTime;
+
+    private Integer updateId;
+
+    private String updateName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private String areaName;
+
+    @TableField(exist = false)
+    private String parentName;
+
+    @TableField(exist = false)
+    private List<Object> parentCodeList;
+}
diff --git a/screen-manage/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
new file mode 100644
index 0000000..424b762
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/mapper/ResponsibilityUnitMapper.java
@@ -0,0 +1,8 @@
+package com.moral.api.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.ResponsibilityUnit;
+
+public interface ResponsibilityUnitMapper extends BaseMapper<ResponsibilityUnit> {
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/ResponsibilityUnitService.java b/screen-manage/src/main/java/com/moral/api/service/ResponsibilityUnitService.java
new file mode 100644
index 0000000..d31a5d6
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/ResponsibilityUnitService.java
@@ -0,0 +1,21 @@
+package com.moral.api.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.moral.api.entity.ResponsibilityUnit;
+
+public interface ResponsibilityUnitService extends IService<ResponsibilityUnit> {
+
+
+    Integer insert(ResponsibilityUnit responsibilityUnit);
+
+    Map<String, Object> selectUnit(Map<String, Object> parameters);
+
+    Integer updateUnit(ResponsibilityUnit responsibilityUnit);
+
+    void  updateState(Integer  unitId);
+
+    void updateInvalid(Integer unitId,String code);
+}
\ No newline at end of file
diff --git a/screen-manage/src/main/java/com/moral/api/service/SysAreaService.java b/screen-manage/src/main/java/com/moral/api/service/SysAreaService.java
index b561acd..f166197 100644
--- a/screen-manage/src/main/java/com/moral/api/service/SysAreaService.java
+++ b/screen-manage/src/main/java/com/moral/api/service/SysAreaService.java
@@ -25,4 +25,15 @@
     List<SysArea> querySysArea();
 
 
+    SysArea select(Integer code);
+
+    /**
+     * ���������������������������������
+     * @return
+     */
+    List<SysArea> queryCity();
+
+
+    List<SysArea> selectCode(Integer code);
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
new file mode 100644
index 0000000..14fd4c3
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ResponsibilityUnitServiceImpl.java
@@ -0,0 +1,196 @@
+package com.moral.api.service.impl;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.entity.ResponsibilityUnit;
+import com.moral.api.entity.SysArea;
+import com.moral.api.mapper.ResponsibilityUnitMapper;
+import com.moral.api.pojo.redisBean.AccountInfoDTO;
+import com.moral.api.service.ResponsibilityUnitService;
+import com.moral.api.service.SysAreaService;
+import com.moral.constant.Constants;
+import com.moral.util.TokenUtils;
+
+@Service
+public class ResponsibilityUnitServiceImpl extends ServiceImpl<ResponsibilityUnitMapper, ResponsibilityUnit> implements ResponsibilityUnitService {
+
+
+    @Autowired
+    private ResponsibilityUnitMapper responsibilityUnitMapper;
+    @Autowired
+    private SysAreaService  sysAreaService;
+
+
+    /**
+     * ������������
+     * @param responsibilityUnit
+     * @return
+     */
+    @Override
+    public Integer insert(ResponsibilityUnit responsibilityUnit) {
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        String token = request.getHeader("token");
+        AccountInfoDTO accountInfoDTO = (AccountInfoDTO) TokenUtils.getUserInfoByToken(token);
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.eq("unit_name",responsibilityUnit.getUnitName());
+
+        List<ResponsibilityUnit> units = responsibilityUnitMapper.selectList(wrapper);
+        if (ObjectUtils.isEmpty(units)){
+            responsibilityUnit.setIsDel(Constants.NOT_DELETE);
+            responsibilityUnit.setCreateTime(new Date());
+            responsibilityUnit.setIsInvalid(0);
+            responsibilityUnit.setCreateId(accountInfoDTO.getAccount().getId());
+            responsibilityUnit.setCreateName(accountInfoDTO.getAccount().getUserName());
+            responsibilityUnit.setCreateTime(new Date());
+            responsibilityUnit.setUpdateId(accountInfoDTO.getAccount().getId());
+            responsibilityUnit.setUpdateName(accountInfoDTO.getAccount().getUserName());
+            responsibilityUnit.setUpdateTime(new Date());
+            responsibilityUnit.setValue(JSONArray.toJSONString(responsibilityUnit.getParentCodeList()));
+            responsibilityUnitMapper.insert(responsibilityUnit);
+            return 200;
+        }
+        return -1;
+    }
+
+    /**
+     * ������������
+     * @param parameters
+     * @return
+     */
+    @Override
+    public Map<String, Object> selectUnit(Map<String, Object> parameters) {
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.eq("is_del",Constants.NOT_DELETE);
+        int page = Integer.parseInt(parameters.get("page").toString());
+        int size = Integer.parseInt(parameters.get("size").toString());
+        Object parentName1 = parameters.get("parentCode");
+        Object areaName1 = parameters.get("areaCode");
+        //������������������
+        if (!ObjectUtils.isEmpty(parameters.get("name"))){
+            wrapper.like("unit_name",parameters.get("name").toString());
+        }
+        //������������������
+        if (!ObjectUtils.isEmpty(parentName1)){
+            wrapper.eq("parent_code",Integer.parseInt(parentName1.toString()));
+        }
+        //������������������
+        if (!ObjectUtils.isEmpty(areaName1)){
+            wrapper.eq("parent_code",Integer.parseInt(areaName1.toString()));
+        }
+        Page<ResponsibilityUnit> pageList = new Page<>(page, size);
+        Page<ResponsibilityUnit> responsibilityUnitPage = responsibilityUnitMapper.selectPage(pageList, wrapper);
+        for (ResponsibilityUnit record : responsibilityUnitPage.getRecords()) {
+            Integer areaCode = record.getAreaCode();
+            SysArea sysArea= sysAreaService.select(areaCode);
+            Integer parentCode = record.getParentCode();
+            SysArea parentArea = sysAreaService.select(parentCode);
+            if (ObjectUtils.isEmpty(sysArea) || ObjectUtils.isEmpty(parentArea)){
+                continue;
+            }
+            record.setAreaName(sysArea.getAreaName());
+            record.setParentName(parentArea.getAreaName());
+            record.setParentCodeList(JSONObject.parseObject(record.getValue(),List.class));
+        }
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("total", pageList.getTotal());
+        result.put("totalPage", pageList.getPages());
+        result.put("current", pageList.getCurrent());
+        result.put("pageSize", pageList.getSize());
+        result.put("item", responsibilityUnitPage.getRecords());
+//        responsibilityUnitPage.getOrders()
+        return result;
+    }
+
+
+    /**
+     * ������������
+     * @param responsibilityUnit
+     * @return
+     */
+    @Override
+    public Integer updateUnit(ResponsibilityUnit responsibilityUnit) {
+        QueryWrapper<ResponsibilityUnit> wrapper = new QueryWrapper<>();
+        wrapper.eq("unit_name",responsibilityUnit.getUnitName());
+        wrapper.eq("area_code",responsibilityUnit.getAreaCode());
+        ResponsibilityUnit responsibilityUnit2 = responsibilityUnitMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(responsibilityUnit2)){
+                AccountInfoDTO account = getAccount();
+                responsibilityUnit.setUpdateId(account.getAccount().getId());
+                responsibilityUnit.setUpdateName(account.getAccount().getUserName());
+                responsibilityUnit.setUpdateTime(new Date());
+                responsibilityUnit.setValue(JSONArray.toJSONString(responsibilityUnit.getParentCodeList()));
+//                responsibilityUnit.setParentCodeList(JSONObject.parseObject(responsibilityUnit.getValue(),List.class));
+                responsibilityUnitMapper.updateById(responsibilityUnit);
+                return 200;
+        }
+        return -1;
+    }
+
+
+    /**
+     * ������������
+     *
+     */
+    @Override
+    public void updateState(Integer unitId) {
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(unitId);
+        responsibilityUnit.setState(Constants.NOT_DELETE);
+        AccountInfoDTO account = getAccount();
+        responsibilityUnit.setUpdateId(account.getAccount().getId());
+        responsibilityUnit.setUpdateName(account.getAccount().getUserName());
+        responsibilityUnit.setUpdateTime(new Date());
+        responsibilityUnitMapper.updateById(responsibilityUnit);
+    }
+
+
+    /**
+     * ������������
+     * @param unitId
+     * @param code
+     */
+    @Override
+    public void updateInvalid(Integer unitId, String code) {
+        ResponsibilityUnit responsibilityUnit = responsibilityUnitMapper.selectById(unitId);
+
+        responsibilityUnit.setIsInvalid(1);
+        if (!ObjectUtils.isEmpty(code)){
+            responsibilityUnit.setInvalidReason(code);
+        }
+        AccountInfoDTO account = getAccount();
+        responsibilityUnit.setUpdateId(account.getAccount().getId());
+        responsibilityUnit.setUpdateName(account.getAccount().getUserName());
+        responsibilityUnit.setUpdateTime(new Date());
+        responsibilityUnitMapper.updateById(responsibilityUnit);
+
+    }
+
+
+    /**
+     * ������������������
+     * @return
+     */
+    private AccountInfoDTO getAccount(){
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        String token = request.getHeader("token");
+        AccountInfoDTO accountInfoDTO = (AccountInfoDTO) TokenUtils.getUserInfoByToken(token);
+        return accountInfoDTO;
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
index 9e2c03a..434226e 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SysAreaServiceImpl.java
@@ -2,10 +2,13 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.SysArea;
 import com.moral.api.mapper.SysAreaMapper;
 import com.moral.api.service.SysAreaService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
@@ -26,6 +29,7 @@
  * @since 2021-04-07
  */
 @Service
+@Slf4j
 public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> implements SysAreaService {
 
     @Autowired
@@ -43,6 +47,68 @@
         return sysAreas;
     }
 
+    @Override
+    public SysArea select(Integer code) {
+        QueryWrapper<SysArea> wrapper = new QueryWrapper<>();
+        wrapper.eq("area_code",code);
+        SysArea sysArea = sysAreaMapper.selectOne(wrapper);
+        return sysArea;
+    }
+
+    /**
+     * ���������������������������������
+     *
+     * @return
+     */
+    @Override
+    public List<SysArea> queryCity() {
+        //������������������
+        List<SysArea> sysAreas = sysAreaMapper.selectList(null);
+        //������Map key������������ value��������������� ���������������
+        Map<Integer, SysArea> areaMap = new HashMap<>();
+        for (SysArea sysArea : sysAreas) {
+            areaMap.put(sysArea.getAreaCode(), sysArea);
+            sysArea.setChildren(new ArrayList<>());//���������children������
+        }
+        //������������������������������������������������������������������������������������
+        int i=0;
+        for (SysArea sysArea : sysAreas) {
+            Integer parentCode = sysArea.getParentCode();
+            String s = sysArea.getAreaCode().toString();
+            if (!parentCode.equals(0)) {
+                if (s.length()>7){
+                    continue;
+                }
+                SysArea parentArea = areaMap.get(parentCode);
+                if (ObjectUtils.isEmpty(parentArea)){
+                    continue;
+                }
+                List<SysArea> children = parentArea.getChildren();
+                children.add(sysArea);
+//                parentArea.getChildren().add(sysArea);
+            }
+        }
+        //���������������������������������
+        sysAreas.removeIf(new Predicate<SysArea>() {
+            @Override
+            public boolean test(SysArea sysArea) {
+                if (sysArea.getParentCode().equals(0))
+                    return false;
+                return true;
+            }
+        });
+        return sysAreas;
+    }
+
+    @Override
+    public List<SysArea> selectCode(Integer code) {
+        QueryWrapper<SysArea> wrapper = new QueryWrapper<>();
+        wrapper.eq("parent_code",code);
+        List<SysArea> sysAreas = sysAreaMapper.selectList(wrapper);
+        return sysAreas;
+
+    }
+
 
     private List<SysArea> querySysAreaFromDB() {
         //������������������
@@ -58,7 +124,13 @@
             Integer parentCode = sysArea.getParentCode();
             if (!parentCode.equals(0)) {
                 SysArea parentArea = areaMap.get(parentCode);
-                parentArea.getChildren().add(sysArea);
+                if (ObjectUtils.isEmpty(parentArea)){
+                    continue;
+                }
+                List<SysArea> children = parentArea.getChildren();
+                children.add(sysArea);
+//                parentArea.getChildren().add(sysArea);
+
             }
         }
         //���������������������������������

--
Gitblit v1.8.0