1
0

2 Commits 36699ebaf4 ... 16f507ab68

Autor SHA1 Mensagem Data
  Wayne 16f507ab68 Merge branch 'master' of http://8.137.121.180:10880/longping/subject_gxj há 3 meses atrás
  Wayne 15fe68500c 项目四库-项目总库新增导入 há 3 meses atrás

+ 3 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.java

@@ -107,4 +107,7 @@ public interface SubInfoMapper {
     void update(@Param("sub") SubInfo subInfo);
 
     List<SmzkDetailVo> exportSmzkDetailExcel(@Param("subName") String subName,@Param("subjectId") String subjectId,@Param("indusKinds") List<String> indusKinds,@Param("startAmt") String startAmt,@Param("endAmt") String endAmt, @Param("sbdw") String sbdw, @Param("subjectIds") List<String> subjectIds);
+
+    
+    void batchUpdate(@Param("list") List<SmzkDetailVo> list);
 }

+ 23 - 4
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.xml

@@ -8,16 +8,35 @@
             (#{item.id}, #{item.subId}, #{item.year}, #{item.cat}, #{item.createTime}, #{item.createUserId})
         </foreach>
     </insert>
+    <update id="batchUpdate" parameterType="java.util.List">
+        <foreach collection="list" item="item" separator=";">
+            UPDATE sub_info
+            SET
+            sub_name = #{item.subName},
+            subject_id = #{item.subjectId},
+            content = #{item.content},
+            amt_total = #{item.amtTotal},
+            indus_kind = #{item.indusKind},
+            cb_status = #{item.cbStatus},
+            begin_date = #{item.beginDate},
+            end_date = #{item.endDate},
+            progress = #{item.progress},
+            remark = #{item.remark}
+            WHERE id = #{item.id}
+        </foreach>
+    </update>
     <select id="exportSmzkDetailExcel" resultType="com.rtrh.projects.modules.projects.vo.export.SmzkDetailVo">
         SELECT sub_info.id as id,
-        sub_info.status as status,
-        sub_info.sub_code as subCode,
         sub_info.sub_name as subName,
+        sub_info.subject_id as subjectId,
+        sub_info.content as content,
         sub_info.amt_total as amtTotal,
+        sub_info.indus_kind as indusKind,
+        sub_info.cb_status as cbStatus,
         sub_info.begin_date as beginDate,
         sub_info.end_date as endDate,
-        sub_info.indus_kind as indusKind,
-        sub_info.cb_status as cbStatus
+        sub_info.progress as progress,
+        sub_info.remark as remark
         FROM sub_info
         WHERE sub_info.logic_delete_flag = 0
         <if test="subName != null and subName != ''">

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubInfoService.java

@@ -451,4 +451,6 @@ public interface SubInfoService {
 	Long queryExceedOutside();
 
 	List<SmzkDetailVo> exportSmzkDetailExcel(SubInfoQueryTzVO vo, List<String> subjectIds);
+
+    void importXmzkDetailExcel(List<List<Object>> readAll);
 }

+ 162 - 13
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java

@@ -5408,24 +5408,21 @@ public class SubInfoServiceImpl implements SubInfoService {
             }
         }
 
+        //获取项目所在地
+        List<TSystable> sbddList = Optional.ofNullable(
+                tSysTableService.getByKind(SysTableKind.JSDD)
+        ).orElse(Collections.emptyList());
+
 
         // 查询所有的重点项目信息,若结果为空则初始化为一个空列表
         List<SmzkDetailVo> dataList = Optional.ofNullable(
                 subInfoMapper.exportSmzkDetailExcel(vo.getSubName(),vo.getSubjectId(),indusKinds,vo.getStartAmt(),vo.getEndAmt(),vo.getSbdw(),subjectIds)
         ).orElse(Collections.emptyList());
 
-        Map<String, String> statusMap = new HashMap<>();
-        statusMap.put("1", "储备");
-        statusMap.put("2", "新建");
-        statusMap.put("3", "在建");
-        statusMap.put("9", "投产");
-
 
         // 遍历重点项目信息,找到对应的前期手续信息,然后拼接手续完成情况为字符串,拼接到对应的重点项目信息中
         dataList.forEach(e->{
 
-            e.setStatus(statusMap.get(e.getStatus()));
-
             e.setCbStatus(SubInfoCbStatusEnum.getMessage(e.getCbStatus()));
 
             //设置行业
@@ -5434,12 +5431,7 @@ public class SubInfoServiceImpl implements SubInfoService {
                 //这是新的行业列表subInduList,subInduList中有children里面装的子行业,我需要将induskind替换为subInduList中的一级行业title
                 Optional<SubIndu> first = subInduList.stream().filter(item -> item.getCode().equals(induskind)).findFirst();
                 if (first.isPresent()) {
-                    //判断上级名称是否存在,如果存在将induskind替换为上级名称,否则将induskind替换为名称
-                    if (StringUtil.isNotEmpty(first.get().getParentTitle())) {
-                        e.setIndusKind(first.get().getParentTitle());
-                    } else {
                         e.setIndusKind(first.get().getTitle());
-                    }
                 }else {
                     e.setIndusKind("");
                 }
@@ -5447,6 +5439,19 @@ public class SubInfoServiceImpl implements SubInfoService {
                 e.setIndusKind("");
             }
 
+            //设置项目所在地
+            if (StringUtil.isNotEmpty(e.getSubjectId())) {
+                String sbdw = e.getSubjectId();
+                Optional<TSystable> first = sbddList.stream().filter(item -> item.getCode().equals(sbdw)).findFirst();
+                if (first.isPresent()) {
+                    e.setSubjectId(first.get().getTitle());
+                }else {
+                    e.setSubjectId("");
+                }
+            }else {
+                e.setSubjectId("");
+            }
+
             //将万元转换为亿元
             e.setAmtTotal(e.getAmtTotal().divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP));
         });
@@ -5455,6 +5460,150 @@ public class SubInfoServiceImpl implements SubInfoService {
 
     }
 
+    @Override
+    @TargetDataSource("primary")
+    public void importXmzkDetailExcel(List<List<Object>> readAll) {
+
+        // 前两行是标题,跳过
+        if (readAll != null && readAll.size() >2) {
+            List<SmzkDetailVo> list = new ArrayList<>();
+            // 对数据进行处理
+            for (int i = 2; i < readAll.size(); i++) {
+                SmzkDetailVo xmzhtjDetailVo = new SmzkDetailVo();
+                for (int j = 0; j < readAll.get(i).size(); j++) {
+                    if (j == 0){
+                        xmzhtjDetailVo.setNumber(Integer.parseInt(readAll.get(i).get(j).toString()));
+                    }
+                    if (j == 1){
+                        xmzhtjDetailVo.setId(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 2){
+                        xmzhtjDetailVo.setSubName(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 3){
+                        xmzhtjDetailVo.setSubjectId(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 4){
+                        xmzhtjDetailVo.setContent(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 5){
+                        xmzhtjDetailVo.setAmtTotal(BigDecimal.valueOf((Double) readAll.get(i).get(j)));
+                    }
+                    if (j == 6){
+                        xmzhtjDetailVo.setIndusKind(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 7){
+                        xmzhtjDetailVo.setCbStatus(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 8){
+                        // 如果不为null才进行解析
+                        if (readAll.get(i).get(j) != null) {
+                            xmzhtjDetailVo.setBeginDate(DateUtil.parseDate(readAll.get(i).get(j).toString()));
+                        }else {
+                            xmzhtjDetailVo.setBeginDate(null);
+                        }
+                    }
+                    if (j == 9){
+                        if (readAll.get(i).get(j) != null) {
+                            xmzhtjDetailVo.setEndDate(DateUtil.parseDate(readAll.get(i).get(j).toString()));
+                        }else {
+                            xmzhtjDetailVo.setEndDate(null);
+                        }
+                    }
+                    if (j == 10){
+                        xmzhtjDetailVo.setProgress(readAll.get(i).get(j).toString());
+                    }
+                    if (j == 11){
+                        xmzhtjDetailVo.setRemark(readAll.get(i).get(j).toString());
+                    }
+                }
+                list.add(xmzhtjDetailVo);
+            }
+
+            // 获取项目地点
+            List<TSystable> sbddList = Optional.ofNullable(
+                    tSysTableService.getByKind(SysTableKind.JSDD)
+            ).orElse(Collections.emptyList());
+
+            // 获取行业
+            List<SubIndu> subInduList = Optional.ofNullable(
+                    subInduService.selectAllSubIndu()
+            ).orElse(Collections.emptyList());
+
+
+            for (int i = 0; i < list.size(); i++) {
+
+                SmzkDetailVo smzkDetailVo = list.get(i);
+
+                if (smzkDetailVo.getId() == null){
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,项目编号不能为空");
+                }
+
+                // 项目所在地,不能为空,必须在【伊州区,巴里坤县,伊吾县,高新区】里选择,其他的所有区县都是要提示出来,包括【市本级】,也不能有
+                if (StringUtil.isNotEmpty(smzkDetailVo.getSubjectId())){
+                    String sbdw = smzkDetailVo.getSubjectId();
+                    Optional<TSystable> first = sbddList.stream().filter(item -> item.getTitle().equals(sbdw)).findFirst();
+                    if (first.isPresent()) {
+                        smzkDetailVo.setSubjectId(first.get().getCode());
+                    }else {
+                        throw new RuntimeException("导入失败,第" + (i+3) + "行,项目所在地为" + sbdw + ",请检查");
+                    }
+                }else {
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,项目所在地不能为空");
+                }
+
+                // 项目金额不能为空,需要将单位亿元转为万元
+                if (smzkDetailVo.getAmtTotal() == null){
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,项目金额不能为空");
+                }else if (smzkDetailVo.getAmtTotal().compareTo(new BigDecimal("0")) == 0){
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,项目金额不能为0");
+                }else {
+                    smzkDetailVo.setAmtTotal(smzkDetailVo.getAmtTotal().multiply(new BigDecimal("1000")));
+                }
+
+                // 行业分类不能为空,判断行业必须存在,存在后取id保存
+                if (StringUtil.isNotEmpty(smzkDetailVo.getIndusKind())){
+                    Optional<SubIndu> first = subInduList.stream().filter(item -> item.getTitle().equals(smzkDetailVo.getIndusKind())).findFirst();
+                    if (first.isPresent()) {
+                        smzkDetailVo.setIndusKind(first.get().getCode());
+                    }else {
+                        throw new RuntimeException("导入失败,第" + (i+3) + "行,行业分类为" + smzkDetailVo.getIndusKind() + ",请检查");
+                    }
+                }else {
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,行业分类不能为空");
+                }
+
+                // 状态,可以为空,如果非空时,必须为【正在谋划,正在洽谈,已签约,已备案/已核准】这4种里的一个,其他的所有都提示出来;
+                if (StringUtil.isNotEmpty(smzkDetailVo.getCbStatus())){
+                    // 校验状态字段是否符合预期
+                    List<String> validStatuses = Arrays.asList("正在谋划", "正在洽谈", "已签约", "已备案/已核准");
+                    if (!validStatuses.contains(smzkDetailVo.getCbStatus())) {
+                        throw new RuntimeException("导入失败,第" + (i + 3) + "行,状态为" + smzkDetailVo.getCbStatus() + ",请检查");
+                    }
+                    if (smzkDetailVo.getCbStatus().equals("正在谋划")){
+                        smzkDetailVo.setCbStatus("1");
+                    }else if (smzkDetailVo.getCbStatus().equals("正在洽谈")){
+                        smzkDetailVo.setCbStatus("2");
+                    }else if (smzkDetailVo.getCbStatus().equals("已签约")){
+                        smzkDetailVo.setCbStatus("3");
+                    }else if (smzkDetailVo.getCbStatus().equals("已备案/已核准")){
+                        smzkDetailVo.setCbStatus("4");
+                    }
+                }
+
+                // 项目名称和建设内容都不能为空
+                if (StringUtil.isEmpty(smzkDetailVo.getSubName())){
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,项目名称不能为空");
+                }
+                if (StringUtil.isEmpty(smzkDetailVo.getContent())){
+                    throw new RuntimeException("导入失败,第" + (i+3) + "行,建设内容不能为空");
+                }
+            }
+
+            subInfoMapper.batchUpdate(list);
+        }
+    }
+
     private Map<String, Object> getStringObjectMap(List<WorkBenchVO> list) {
         Map<String, Object> resultMap = new HashMap<>();
         if (CollectionUtil.isNotEmpty(list)){

+ 14 - 10
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SmzkDetailVo.java

@@ -8,24 +8,28 @@ import java.util.Date;
 @Data
 public class SmzkDetailVo {
 
-    private Integer number;
+    private Integer number;     //序号
 
-    private String id;
+    private String id;      //项目id
 
-    private String status;
+    private String subName; //项目名称
 
-    private String subCode;
+    private String subjectId;   //项目所在地
 
-    private String subName;
+    private String content; //项目内容
 
-    private BigDecimal amtTotal;
+    private BigDecimal amtTotal;    //总金额(亿元)
 
-    private Date beginDate;
+    private String indusKind;   //行业名称
 
-    private Date endDate;
+    private String cbStatus;  //项目库
 
-    private String indusKind;
+    private Date beginDate; //计划开始日期
 
-    private String cbStatus;
+    private Date endDate;   //计划投产日期
+
+    private String progress;    //进展情况
+
+    private String remark;  //备注
 
 }

+ 0 - 1
projects-service/src/main/java/com/rtrh/projects/modules/system/service/impl/TSysTableServiceImpl.java

@@ -35,7 +35,6 @@ public class TSysTableServiceImpl implements TSysTableService {
 	private MeunInfoDao meunInfoDao;
 
 	@Override
-	@TargetDataSource("secondary")
 	public List<TSystable> getByKind(SysTableKind kind) {
 		return tSystableMapper.getSysDataByKind(kind.getCode());
 		// return tSystableDao.getSysDataByKind(kind);

+ 14 - 11
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -19,6 +19,7 @@ import cn.afterturn.easypoi.handler.inter.IExcelExportServer;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.IoUtil;
+import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcelFactory;
@@ -31,12 +32,14 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy
 import com.google.common.collect.Lists;
 import com.rtrh.common.util.StringUtil;
 import com.rtrh.core.vo.ListMessage;
+import com.rtrh.core.vo.Message;
 import com.rtrh.projects.modules.projects.dao.SubSourceDao;
 import com.rtrh.projects.modules.projects.enums.ProjectStatusEnum;
 import com.rtrh.projects.modules.projects.enums.SubInfoStatusEnum;
 import com.rtrh.projects.modules.projects.po.SubIndu;
 import com.rtrh.projects.modules.projects.po.SubInfoGxj;
 import com.rtrh.projects.modules.projects.vo.SubInfoTotalExcel;
+import com.rtrh.projects.modules.projects.vo.XmzhtjDetailVo;
 import com.rtrh.projects.modules.projects.vo.export.*;
 import com.rtrh.projects.modules.system.service.ISubInduService;
 import com.rtrh.projects.modules.utils.CustomCellWriteWidthStrategy;
@@ -61,10 +64,8 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
-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.*;
+import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.rtrh.common.util.CollectionUtil;
@@ -1003,27 +1004,29 @@ public class SubInfoExportController extends BaseController {
 
             // 写入标题行
             writer.writeHeadRow(CollUtil.newArrayList("“四个一批”工业项目表(项目总库)"));
-            writer.merge(0, 0, 0, 9, "“四个一批”工业项目表(项目总库)", true);
+            writer.merge(0, 0, 0, 11, "“四个一批”工业项目表(项目总库)", true);
 
             // 写入子标题行
 //            writer.writeHeadRow(CollUtil.newArrayList("序号", "项目id", "项目库", "项目代码", "项目名称", "总金额(亿元)", "计划开始日期", "计划投产日期", "行业名称", "状态"));
 
             writer.addHeaderAlias("number", "序号");
             writer.addHeaderAlias("id", "项目id");
-            writer.addHeaderAlias("status", "项目库");
-            writer.addHeaderAlias("subCode", "项目代码");
             writer.addHeaderAlias("subName", "项目名称");
-            writer.addHeaderAlias("amtTotal", "总金额(亿元)");
+            writer.addHeaderAlias("subjectId", "项目所在地");
+            writer.addHeaderAlias("content", "项目建设内容");
+            writer.addHeaderAlias("amtTotal", "计划总投资(亿元)");
+            writer.addHeaderAlias("indusKind", "行业分类");
+            writer.addHeaderAlias("cbStatus", "状态[正在谋划,正在洽谈,已签约,已备案/已核准]");
             writer.addHeaderAlias("beginDate", "计划开始日期");
             writer.addHeaderAlias("endDate", "计划投产日期");
-            writer.addHeaderAlias("indusKind", "行业名称");
-            writer.addHeaderAlias("cbStatus", "状态");
+            writer.addHeaderAlias("progress", "项目进展情况");
+            writer.addHeaderAlias("remark", "备注");
 
 
             // 设置每列的默认宽度
             SXSSFSheet sheet = ((SXSSFWorkbook) writer.getWorkbook()).getSheetAt(0);
             int defaultColumnWidth = 40; // 默认宽度为20个字符
-            for (int i = 0; i < 9; i++) {
+            for (int i = 0; i < 11; i++) {
                 sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
             }
 

+ 31 - 0
projects/src/main/java/com/rtrh/projects/web/controller/subject/api/SubInfoApiController.java

@@ -1,5 +1,6 @@
 package com.rtrh.projects.web.controller.subject.api;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -7,6 +8,8 @@ import java.util.stream.Collectors;
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
 import com.rtrh.common.util.Identities;
 import com.rtrh.projects.modules.projects.dao.*;
 import com.rtrh.projects.modules.projects.enums.StatusEnum;
@@ -181,6 +184,34 @@ public class SubInfoApiController extends BaseController {
         return message;
     }
 
+    /**
+     * 导入重点项目储备明细表
+     *
+     * @param vo
+     */
+    @PostMapping("/importXmzkDetailExcel")
+    public Message importXmzkDetailExcel(@RequestParam("file") MultipartFile file) throws IOException {
+        Message message = new Message();
+        if (file.isEmpty()) {
+            message.addError("文件不能为空");
+            return message;
+        }
+        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
+        List<List<Object>> readAll = reader.read();
+        try {
+            subInfoService.importXmzkDetailExcel(readAll);
+        } catch (RuntimeException e) {
+            message.addError(e.getMessage());
+            return message;
+        } catch (Exception e) {
+            message.addError("数据解析异常!");
+            return message;
+        }
+        message.add("导入成功");
+        return message;
+
+    }
+
 
 
 

+ 26 - 0
projects/src/main/webapp/vmodules/subject/subInfo/tz/xmzk.jsp

@@ -225,6 +225,13 @@
                         <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
                     </div>
                 </div>
+                <div style="position: relative; display: inline-block">
+                    <div class="export" id="uploadBtn">
+                        <img src="${WebSite.asset}/css/images/left/export.svg"/>
+                        <span>导入</span>
+                    </div>
+                </div>
+                请先导出文件,再点击导入上传修改后的数据!
                 <table id="table1" lay-filter="test"></table>
                 <div class="pagination-box" id="pagination"></div>
             </div>
@@ -585,6 +592,25 @@
                     self.moveDbParam.status = data.value;
                 });
 
+                // 文件上传
+                layui.upload.render({
+                    elem: '#uploadBtn',
+                    url: App.getUrl("/api/subject/subInfo/importXmzkDetailExcel"),
+                    accept: 'file', // 普通文件
+                    exts: 'xls|xlsx', // 限制文件类型
+                    done: function (res) {
+                        if (res.success === true) {
+                            self.getData();
+                            layui.layer.msg('导入成功!');
+                        } else {
+                            layui.layer.msg('导入失败:' + res.message, {icon: 5});
+                        }
+                    },
+                    error: function (res) {
+                        layui.layer.msg('上传失败,请稍后再试' + res.message, {icon: 5});
+                    }
+                });
+
                 App.postJson("/api/dict/query/index", {}, function (res) {
                     self.JSDD = res.data.JSDD;
                 })