Browse Source

物流库,项目信息

[user3] 3 năm trước cách đây
mục cha
commit
fbd06dbe26
16 tập tin đã thay đổi với 2809 bổ sung48 xóa
  1. 80 1
      src/main/java/com/jeeplus/modules/supply/materialLibrary/entity/MaterialLibrary.java
  2. 12 3
      src/main/java/com/jeeplus/modules/supply/materialLibrary/mapper/MaterialLibraryMapper.java
  3. 54 5
      src/main/java/com/jeeplus/modules/supply/materialLibrary/mapper/xml/MaterialLIbraryMapper.xml
  4. 230 25
      src/main/java/com/jeeplus/modules/supply/materialLibrary/service/MaterialLibraryService.java
  5. 107 6
      src/main/java/com/jeeplus/modules/supply/materialLibrary/web/MaterialLibraryController.java
  6. 511 6
      src/main/java/com/jeeplus/modules/supply/projectInformation/entity/ProjectInformation.java
  7. 78 0
      src/main/java/com/jeeplus/modules/supply/projectInformation/entity/RealProjectInformation.java
  8. 13 0
      src/main/java/com/jeeplus/modules/supply/projectInformation/mapper/ProjectInformationMapper.java
  9. 264 0
      src/main/java/com/jeeplus/modules/supply/projectInformation/mapper/xml/ProjectInformationMapper.xml
  10. 363 0
      src/main/java/com/jeeplus/modules/supply/projectInformation/service/ProjectInformationService.java
  11. 139 1
      src/main/java/com/jeeplus/modules/supply/projectInformation/web/ProjectInformationController.java
  12. 1 1
      src/main/java/com/jeeplus/modules/supply/stockOut/web/SupplyStockOutController.java
  13. 272 0
      src/main/webapp/webpage/modules/supply/materialLibrary/supplyMaterialLibraryList.js
  14. 106 0
      src/main/webapp/webpage/modules/supply/materialLibrary/supplyMaterialLibraryList.jsp
  15. 476 0
      src/main/webapp/webpage/modules/supply/projectInformation/supplyProjectInformationList.js
  16. 103 0
      src/main/webapp/webpage/modules/supply/projectInformation/supplyProjectInformationList.jsp

+ 80 - 1
src/main/java/com/jeeplus/modules/supply/materialLibrary/entity/MaterialLibrary.java

@@ -1,12 +1,27 @@
 package com.jeeplus.modules.supply.materialLibrary.entity;
 
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
 import com.jeeplus.core.persistence.DataEntity;
 
 public class MaterialLibrary extends DataEntity<MaterialLibrary> {
     private String materialCode;            //物料编码
     private String materialDescription;     //物料描述
+
+    //以下字段是为了能取到计量单位而随意设置的,无实意
+    private String wlcms;
+    private String dlbm;
+    private String dlmc;
+    private String zlbm;
+    private String zlmc;
+    private String xlbm;
+    private String xlmc;
+    private String cgbzmb;
+    //到此结束
+
     private String unitOfMeasurement;       //计量单位
 
+
+    @ExcelField(title="物料编码", align=2, sort=1)
     public String getMaterialCode() {
         return materialCode;
     }
@@ -14,7 +29,7 @@ public class MaterialLibrary extends DataEntity<MaterialLibrary> {
     public void setMaterialCode(String materialCode) {
         this.materialCode = materialCode;
     }
-
+    @ExcelField(title="物料描述", align=2, sort=2)
     public String getMaterialDescription() {
         return materialDescription;
     }
@@ -22,7 +37,71 @@ public class MaterialLibrary extends DataEntity<MaterialLibrary> {
     public void setMaterialDescription(String materialDescription) {
         this.materialDescription = materialDescription;
     }
+    @ExcelField(title="物料长描述", align=2, sort=3)
+    public String getWlcms() {
+        return wlcms;
+    }
+
+    public void setWlcms(String wlcms) {
+        this.wlcms = wlcms;
+    }
+    @ExcelField(title="大类编码", align=2, sort=4)
+    public String getDlbm() {
+        return dlbm;
+    }
+
+    public void setDlbm(String dlbm) {
+        this.dlbm = dlbm;
+    }
+    @ExcelField(title="大类名称", align=2, sort=5)
+    public String getDlmc() {
+        return dlmc;
+    }
+
+    public void setDlmc(String dlmc) {
+        this.dlmc = dlmc;
+    }
+    @ExcelField(title="中类编码", align=2, sort=6)
+    public String getZlbm() {
+        return zlbm;
+    }
 
+    public void setZlbm(String zlbm) {
+        this.zlbm = zlbm;
+    }
+    @ExcelField(title="中类名称", align=2, sort=7)
+    public String getZlmc() {
+        return zlmc;
+    }
+
+    public void setZlmc(String zlmc) {
+        this.zlmc = zlmc;
+    }
+    @ExcelField(title="小类编码", align=2, sort=8)
+    public String getXlbm() {
+        return xlbm;
+    }
+
+    public void setXlbm(String xlbm) {
+        this.xlbm = xlbm;
+    }
+    @ExcelField(title="小类名称", align=2, sort=9)
+    public String getXlmc() {
+        return xlmc;
+    }
+
+    public void setXlmc(String xlmc) {
+        this.xlmc = xlmc;
+    }
+    @ExcelField(title="采购标准模板", align=2, sort=10)
+    public String getCgbzmb() {
+        return cgbzmb;
+    }
+
+    public void setCgbzmb(String cgbzmb) {
+        this.cgbzmb = cgbzmb;
+    }
+    @ExcelField(title="计量单位", align=2, sort=11)
     public String getUnitOfMeasurement() {
         return unitOfMeasurement;
     }

+ 12 - 3
src/main/java/com/jeeplus/modules/supply/materialLibrary/mapper/MaterialLibraryMapper.java

@@ -3,16 +3,25 @@ package com.jeeplus.modules.supply.materialLibrary.mapper;
 import com.jeeplus.core.persistence.BaseMapper;
 import com.jeeplus.core.persistence.annotation.MyBatisMapper;
 import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
+import com.jeeplus.modules.supply.stockOut.entity.SupplyStockOut;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 @MyBatisMapper
 public interface MaterialLibraryMapper extends BaseMapper<MaterialLibrary> {
-    Integer queryCount(MaterialLibrary materialLibrary);
-    //按物流编码list来查询总条数
-    Integer getCountByMaterialCodeList(@Param("materialCodeList") List<String> materialCodeList);
+    Integer queryCount(MaterialLibrary materialLibrary);//x
+    //按物流编码list来查询
+    List<String> getMaterialCodeByMaterialCodeList(@Param("materialCodeList") List<String> materialCodeList);
 
     //覆盖操作 根据物流编码物理删除旧数据
     void deleteMaterialLibraryByMaterialCodeList(@Param("materialCodeList") List<String> materialCodeList);
+
+
+    Integer insertList(@Param("list") List<MaterialLibrary> list);
+
+    Integer deleteList(@Param("materialCodeList") List<String> materialCodeList);
+
+    //按物流编码list来查询
+    Integer getCountByMaterialCodeList(@Param("materialCodeList") List<String> materialCodeList);
 }

+ 54 - 5
src/main/java/com/jeeplus/modules/supply/materialLibrary/mapper/xml/MaterialLIbraryMapper.xml

@@ -3,14 +3,22 @@
 <mapper namespace="com.jeeplus.modules.supply.materialLibrary.mapper.MaterialLibraryMapper">
 
     <sql id="MaterialLibraryColumnss">
+        ml.id as "id",
         ml.material_code as "materialCode",
         ml.material_description as "materialDescription",
         ml.unit_of_measurement as "unitOfMeasurement"
     </sql>
 
+    <select id="get" resultType="com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary">
+        SELECT
+        <include refid="MaterialLibraryColumnss"/>
+        FROM material_library ml
+        WHERE ml.id = #{id}
+    </select>
+
     <select id="queryCount" resultType="integer" >
         SELECT count(DISTINCT ml.material_code)
-        FROM Material_library ml
+        FROM material_library ml
         <where>
             <if test="materialCode != null and materialCode != ''">
                 AND ml.material_code like concat('%',#{materialCode},'%')
@@ -27,7 +35,7 @@
     <select id="findList" resultType="MaterialLibrary" >
         SELECT
         <include refid="MaterialLibraryColumnss"/>
-        from Material_library ml
+        from material_library ml
         <where>
             <if test="materialCode != null and materialCode != ''">
                 AND ml.material_code like concat('%',#{materialCode},'%')
@@ -50,11 +58,11 @@
         </choose>
     </select>
 
-    <select id="getCountByMaterialCodeList" resultType="integer">
-        select count(distinct ml.material_code) from Material_library ml
+    <select id="getMaterialCodeByMaterialCodeList" resultType="java.lang.String">
+        select material_code from material_library
         <where>
             <if test="materialCodeList!=null and materialCodeList.size!=0">
-                ml.material_code in
+                material_code in
                 <foreach collection="materialCodeList" item="materialCode" separator="," open="(" close=")">
                     #{materialCode}
                 </foreach>
@@ -74,6 +82,47 @@
         </where>
     </select>
 
+    <select id="getCountByMaterialCodeList" resultType="integer">
+        select count(distinct ml.material_code) from Material_library ml
+        <where>
+            <if test="materialCodeList!=null and materialCodeList.size!=0">
+                ml.material_code in
+                <foreach collection="materialCodeList" item="materialCode" separator="," open="(" close=")">
+                    #{materialCode}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+<!--    <update id="delete">-->
+<!--        delete from material_library-->
+<!--        where material_code = #{material_code}-->
+<!--    </update>-->
+
     <!--批量新增-->
+    <insert id="insertList">
+        insert into material_library (
+        material_code,
+        material_description,
+        unit_of_measurement
+        )
+        values
+        <foreach collection="list" item="item" index="index" separator="," >
+            (
+            #{item.materialCode},
+            #{item.materialDescription},
+            #{item.unitOfMeasurement}
+            )
+        </foreach>
+    </insert>
 
+    <delete id="deleteList">
+        delete from material_library
+        <where>
+            material_code in
+            <foreach collection="materialCodeList" item="materialCode" separator="," open="(" close=")">
+                #{materialCode}
+            </foreach>
+        </where>
+    </delete>
 </mapper>

+ 230 - 25
src/main/java/com/jeeplus/modules/supply/materialLibrary/service/MaterialLibraryService.java

@@ -1,70 +1,275 @@
 package com.jeeplus.modules.supply.materialLibrary.service;
 
+import com.alibaba.fastjson.JSON;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.utils.StringUtils;
 import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.service.CrudService;
 import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
 import com.jeeplus.modules.supply.materialLibrary.mapper.MaterialLibraryMapper;
+import com.jeeplus.modules.supply.stockOut.entity.SupplyStockOut;
+import net.oschina.j2cache.CacheChannel;
+import net.oschina.j2cache.J2Cache;
+import net.oschina.j2cache.redis.RedisCacheProvider;
+import net.oschina.j2cache.redis.RedisClient;
+import net.oschina.j2cache.redis.RedisUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+import redis.clients.jedis.BinaryJedisCommands;
+import redis.clients.jedis.Jedis;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Service
 @Transactional(readOnly = true)
 public class MaterialLibraryService extends CrudService<MaterialLibraryMapper, MaterialLibrary> {
+
+    /** 主机 */
+    private final static String host = Global.getConfig("remoteServer.host");
+    private static Logger logger = LoggerFactory.getLogger(MaterialLibraryService.class);
+
     @Autowired
     private MaterialLibraryMapper materialLibraryMapper;
 
     //页面显示
+    @Override
     public Page<MaterialLibrary> findPage(Page<MaterialLibrary> page,MaterialLibrary materialLibrary){
-//        int count = materialLibraryMapper.queryCount(materialLibrary);
-//        page.setCount(count);
-////        page.setCountFlag(false);
-//        materialLibrary.setPage(page);
-//        List<MaterialLibrary> materialLibraryList = super.findList(materialLibrary);
-//        page.setList(materialLibraryList);
-//        return page;
         return super.findPage(page,materialLibrary);
     }
 
-    //物流库信息导入处理
+
+
+
+    /**
+     * 物流库信息导入处理
+     * @param list
+     * @return
+     */
     @Transactional(readOnly = false)
-    public String disposeImportMaterialLibrary(List<MaterialLibrary> list){
+    public LinkedHashMap disposeImportMaterialLibrary(List<MaterialLibrary> list,MultipartFile file,String repeat) throws Exception{
+        LinkedHashMap returnMap = new LinkedHashMap();
         Set<String> materialCodeSet = new HashSet<>();
         for (MaterialLibrary importInfo : list){
             //将物料编码放入set中
             materialCodeSet.add(importInfo.getMaterialCode());
         }
-        //将set转换为list
+        //将去重后的set转换为list  方便比较
         List<String> materialCodeList = new ArrayList<>(materialCodeSet);
 
         //判断物流编码list长度和导入数据的list长度是否一样,不一样则说明导入数据中项目名存在重复数据
         if(materialCodeList.size() != list.size()){
-            return "数据中存在重复物流编码";
+            returnMap.put("msg","数据中存在重复物流编码");
         }
 
-        //批量按物流编码查询,如果不为null则返回提醒字符串   //已存在物料数据,是否覆盖?   覆盖:物理删除旧数据,保存新数据   +++判断传参是否不为yes
-        if(!materialLibraryMapper.getCountByMaterialCodeList(materialCodeList).equals("0")){
-            return "已存在物料数据,是否覆盖?";
+        //方便快捷删除  找到对应重复数据,以便最后批量操作使用
+        List<String> codeList = materialLibraryMapper.getMaterialCodeByMaterialCodeList(materialCodeList);  //即为重复数据的编码集合
+        Iterator<MaterialLibrary> it = list.iterator();
+        if(codeList.size()!=0 && repeat.equals("0") && codeList != null) {  //有重复值并且为第一次交互  就保存文件
+            File copyFile = transformMultipartFile(file);
+            //将文件存到服务器
+            String filePath = saveFile(copyFile);
+            returnMap.put("filePath",filePath);
+            returnMap.put("msg","已存在物料数据,是否覆盖?");
+            return returnMap;
         }
 
-        //找到对应重复数据,以便最后批量擦做使用
+        if(repeat.equals("2")) {  //不覆盖 则删除list中的重复数据
+            while (it.hasNext()) {
+                MaterialLibrary materialLibrary = it.next();
+                if (codeList.contains(materialLibrary.getMaterialCode())) {
+                    it.remove();
+                }
+            }
+        }else if(repeat.equals("1")){  //覆盖 则删除数据库中的重复数据
+            //批量删除重复数据  覆盖操作
+            modifyHandmadeVindicateListTwo(codeList);
+        }
 
 
+        //批量新增  分批次新增
+        if(list.size()!=0) {
+            modifyHandmadeVindicateList(list);
+        }
+        returnMap.put("msg","已成功导入 "+list.size()+" 条项目表单记录");
+        return returnMap;
+    }
 
 
 
-        //是否覆盖  前端传个参数   是覆盖
-        //if(传参为空||yes)则覆盖 else 不覆盖
-        //if
-        materialLibraryMapper.deleteMaterialLibraryByMaterialCodeList(materialCodeList);
-        //批量新增  分批次新增
+    /**
+     * 批量修改手工上传数据信息
+     * @param projectBasicsList
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public String modifyHandmadeVindicateList(List<MaterialLibrary> projectBasicsList){
+        //分批处理
+        if(null!=projectBasicsList && projectBasicsList.size()>0){
+            int pointsDataLimit = 1000;//限制条数
+            Integer size = projectBasicsList.size();
+            //判断是否有必要分批
+            if(pointsDataLimit<size){
+                int part = size/pointsDataLimit;//分批数
+                //
+                for (int i = 0; i < part; i++) {
+                    //100条
+                    List<MaterialLibrary> listPage = projectBasicsList.subList(0, pointsDataLimit);
+                    materialLibraryMapper.insertList(listPage);
+                    //剔除
+                    projectBasicsList.subList(0, pointsDataLimit).clear();
+                }
+                if(!projectBasicsList.isEmpty()){
+                    materialLibraryMapper.insertList(projectBasicsList);
+                }
+            }else{
+                materialLibraryMapper.insertList(projectBasicsList);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 批量修改手工上传数据信息
+     * @param projectBasicsList
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public String modifyHandmadeVindicateListTwo(List<String> projectBasicsList){
+        //分批处理
+        if(null!=projectBasicsList && projectBasicsList.size()>0){
+            int pointsDataLimit = 1000;//限制条数
+            Integer size = projectBasicsList.size();
+            //判断是否有必要分批
+            if(pointsDataLimit<size){
+                int part = size/pointsDataLimit;//分批数
+                //
+                for (int i = 0; i < part; i++) {
+                    //100条
+                    List<String> listPage = projectBasicsList.subList(0, pointsDataLimit);
+                    materialLibraryMapper.deleteList(listPage);
+                    //剔除
+                    projectBasicsList.subList(0, pointsDataLimit).clear();
+                }
+                if(!projectBasicsList.isEmpty()){
+                    materialLibraryMapper.deleteList(projectBasicsList);
+                }
+            }else{
+                materialLibraryMapper.deleteList(projectBasicsList);
+            }
+        }
+        return null;
+    }
+
+    //文件的操作
+    public String saveFile(File file){
+        String filePath = "";
+        try {
+            if(StringUtils.isNotBlank(host) && ("127.0.0.1".equals(host) || "localhost".equals(host))){
+                String path = null;
+                if(System.getProperty("os.name").toLowerCase().contains("win")){
+                    path = Global.getConfig("remoteServer.winDirectory");
+                }else{
+                    path = Global.getConfig("remoteServer.directory");
+                }
+                Calendar date = Calendar.getInstance();
+                date.add(Calendar.DAY_OF_MONTH,0);
+                String nowTime = new SimpleDateFormat("yyyy_MM_dd").format(date.getTime());
+                String uploadPath = "/"+nowTime+System.currentTimeMillis();
+                //检查该路径对应的目录是否存在. 如果不存在则创建目录
+                File dir=new File(path);
+                if (!dir.exists()) {
+                    dir.mkdirs();
+                }
+                filePath = path  + uploadPath + file.getName();  //存到服务武器的路径名
+                //File转MultipartFile文件
+                MultipartFile multipartFile = transformFile(file);
+                //保存文件
+                File dest = new File(filePath);
+                if (!(dest.exists())) {
+                    multipartFile.transferTo(dest);
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("Exception e:"+e);
+        }
+        return filePath;
+    }
 
+    //文件的删除操作
+    public void deleteFileContent(File file) throws IOException{
+        String filePath = file.getAbsolutePath();
+        File deleteFile = new File(filePath);
+        if(deleteFile.exists()){
+            deleteFile.delete();
+        }
+    }
 
-        return "";
+    /**
+     * MultipartFile转File
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public File transformMultipartFile( MultipartFile file) throws IOException {
+        File srcFile = null;
+        //MultipartFile转File
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            srcFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, srcFile);
+            ins.close();
+        }
+        return srcFile;
+    }
+
+    /**
+     * 获取流文件
+     * @param ins
+     * @param file
+     */
+    public void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * File转MultipartFile
+     * @param file
+     * @return
+     */
+    public MultipartFile transformFile(File file){
+        InputStream inputStream = null;
+        MultipartFile multipartFile = null;
+        try {
+            inputStream = new FileInputStream(file);
+            multipartFile = new MockMultipartFile(file.getName(), inputStream);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return multipartFile;
     }
 }

+ 107 - 6
src/main/java/com/jeeplus/modules/supply/materialLibrary/web/MaterialLibraryController.java

@@ -1,20 +1,31 @@
 package com.jeeplus.modules.supply.materialLibrary.web;
 
+import com.jeeplus.common.json.AjaxJson;
 import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.web.BaseController;
 import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
 import com.jeeplus.modules.supply.materialLibrary.service.MaterialLibraryService;
+import com.jeeplus.modules.supply.stockOut.entity.SupplyStockOut;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 @Controller
 @RequestMapping(value = "${adminPath}/supply/materialLibrary")
@@ -38,17 +49,107 @@ public class MaterialLibraryController extends BaseController {
     /**
      * 项目列表页面
      */
-//    @RequiresPermissions("superOwed:materialLibrary:list")
+//    @RequiresPermissions("supply:materialLibrary:list")
     @RequestMapping(value = {"list", ""})
-    public String list(MaterialLibrary materialLibrary, HttpServletRequest request, HttpServletResponse response, Model model) {
-
+    public String list(MaterialLibrary materialLibrary,Model model) {
+        model.addAttribute("materialLibrary",materialLibrary);
+        return "modules/supply/materialLibrary/supplyMaterialLibraryList";
+    }
 
-        //获取项目信息
+    /**
+     * 列表数据
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:stockOut:list")
+    @RequestMapping(value = "data")
+    public Map<String, Object> data(MaterialLibrary materialLibrary, HttpServletRequest request, HttpServletResponse response, Model model) {
         Page<MaterialLibrary> page = materialLibraryService.findPage(new Page<MaterialLibrary>(request, response), materialLibrary);
+        return getBootstrapData(page);
+    }
 
+    /**
+     * 删除项目
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:stockOut:del")
+    @RequestMapping(value = "delete")
+    public AjaxJson delete(MaterialLibrary materialLibrary) {
+        AjaxJson j = new AjaxJson();
+        materialLibraryService.delete(materialLibrary);   //要自己写吗? 前端传的是id,
+        j.setMsg("删除项目成功");
+        return j;
+    }
 
-        model.addAttribute("page", page);
-        return "modules/ruralprojectrecords/ruralProjectRecordsList";
+    /**
+     * 批量删除
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:stockOut:del")
+    @RequestMapping(value = "deleteAll")
+    public AjaxJson deleteAll(String ids) {
+        AjaxJson j = new AjaxJson();
+        String[] idArray = ids.split(",");
+        for (String id : idArray) {
+            materialLibraryService.delete(materialLibraryService.get(id));
+        }
+        j.setMsg("删除成功");
+        return j;
     }
 
+    /**
+     * 导入Excel数据-
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:stockOut:import")
+    @RequestMapping(value = "import")
+    public AjaxJson importFile(@RequestParam("file") MultipartFile file) {
+        AjaxJson j = new AjaxJson();
+        try {
+            String repeat = "0";  //repeat:0:第一次交互,1:覆盖,2:不覆盖
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<MaterialLibrary> list = ei.getDataList(MaterialLibrary.class);   //直接用就好了吗,格式啥的用设置吗?
+            LinkedHashMap returnMap = materialLibraryService.disposeImportMaterialLibrary(list,file,repeat);
+            //放要放的值
+            returnMap.put("repeat","0");
+            j.setBody(returnMap);
+            j.setMsg(returnMap.get("msg").toString());
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导入项目表单失败!失败信息:" + e.getMessage());
+        }
+        return j;
+    }
+
+    /**
+     * 导入Excel数据-覆盖
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:stockOut:import")
+    @RequestMapping(value = "importTwo")
+    public AjaxJson importFileTwo(String filePath,String repeat) {
+        AjaxJson j = new AjaxJson();
+        try {
+            File file = new File(filePath);
+            MultipartFile file1 = materialLibraryService.transformFile(file);
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<MaterialLibrary> list = ei.getDataList(MaterialLibrary.class);   //直接用就好了吗,格式啥的用设置吗?
+            LinkedHashMap returnMap = materialLibraryService.disposeImportMaterialLibrary(list,file1,repeat);
+            //如果文件已经使用完毕,则删除
+            materialLibraryService.deleteFileContent(file);
+            //放要放的值
+            j.setBody(returnMap);
+            j.setMsg(returnMap.get("msg").toString());
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导入项目表单失败!失败信息:" + e.getMessage());
+        }
+        return j;
+    }
+
+
+
+
+
+
+
 }

+ 511 - 6
src/main/java/com/jeeplus/modules/supply/projectInformation/entity/ProjectInformation.java

@@ -1,8 +1,13 @@
 package com.jeeplus.modules.supply.projectInformation.entity;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
 import com.jeeplus.core.persistence.DataEntity;
 
+import java.util.Date;
+
 public class ProjectInformation extends DataEntity<ProjectInformation> {
+    private String num;                                 //序号
     private String projectDefinitionNumber;             //项目定义号
     private String projectName;                         //项目名称
     private String projectType;                         //项目类型
@@ -11,6 +16,82 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     private String projectBudgetYear;                   //项目预算年度
     private String totalProjectInvestment;              //项目总投资
 
+
+    private String approvalReplyNo;                 //可研批复文号
+    private String singleProjectWbsNo;              //单体工程WBS编号
+    private String engineeringNo;                   //工程编号
+    private String engineeringName;                 //工程名称
+    private String contacts;                        //联系人
+    private String contactNumber;                   //联系电话
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date actualCommencementDate;            //实际开工日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date actualCompletionDate;              //实际竣工日期
+    private String constructionUnit;                //施工单位
+    private String contractNo;                      //合同编号
+    private String contractAmount;                  //合同金额
+    private String settlementDiscountRate;          //结算折扣率
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date plannedCommencementDate;           //计划开工日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date plannedCompletionDate;             //计划竣工日期
+    private String civilEngineeringAmountSubmittedForApproval;          //土建送审金额
+    private String installAmountSubmittedForApproval;                   //安装送审金额
+    private String subtotalOfConstructionCostSubmittedForApproval;      //送审施工费小计
+    private String amountOfMaterialsProvidedByPartyAForApproval;        //甲供材送审金额
+    private String commentsOnSubmissionForApproval;                     //送审备注
+    private String approvedAmountOfCivilEngineering;                    //土建审定金额
+    private String installationApprovalAmount;                          //安装审定金额
+    private String subtotalOfApprovedConstructionCost;                  //审定施工费小计
+    private String approvedAmountOfMaterialsSuppliedByPartyA;           //甲供材审定金额
+    private String deductionAmountOfConstructionCost;                   //施工费核减金额
+    private String reductionRateOfConstructionCost;                     //施工费核减率
+    private String creditDeductionOfTheConstructionUnit;                //施工单位诚信扣款
+    private String proposedSettlement;              //建议结算款
+    private String longitude;                       //经度
+    private String latitude;                        //纬度
+    private String auditFee;                        //审计费
+    private String auditOpinionNo;                  //审计意见文号
+    private String auditReportNo;                   //审计报告号
+    private String auditRemarks;                    //审计备注
+    private String firmName;                        //事务所名称
+    private String auditorOfTheFirm;                //事务所审计人员
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date submissionDate;                    //提交送审日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date auditTaskReleaseDate;              //审计任务下达日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endDateOfAudit;                    //审计应结束日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date resultUploadDate;                  //结果上传日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date approvalDate;                      //审定日期
+    private String timeout;                         //是否超时
+    private String auditManagementLevel;            //审计管理级别
+    private String auditMethod;                     //审计方式
+    private String fullTimeAuditor;                 //审计专职
+    private String submitter;                       //送审人
+    private String submissionDepartment;            //送审部门
+    private String secondaryUnit;                   //二级单位
+    private String primaryUnit;                     //一级单位
+    private String submissionStatus;                //送审状态
+    private String submissionFormId;                //送审单id
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date tableBuildingTime;                 //创建时间(写入数据库的时间)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date beginDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endDate;
+
+    @ExcelField(title="序号", align=2, sort=1)
+    public String getNum() {
+        return num;
+    }
+
+    public void setNum(String num) {
+        this.num = num;
+    }
+    @ExcelField(title="项目定义号", align=2, sort=2)
     public String getProjectDefinitionNumber() {
         return projectDefinitionNumber;
     }
@@ -18,7 +99,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setProjectDefinitionNumber(String projectDefinitionNumber) {
         this.projectDefinitionNumber = projectDefinitionNumber;
     }
-
+    @ExcelField(title="项目名称", align=2, sort=3)
     public String getProjectName() {
         return projectName;
     }
@@ -26,7 +107,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setProjectName(String projectName) {
         this.projectName = projectName;
     }
-
+    @ExcelField(title="项目类型", align=2, sort=4)
     public String getProjectType() {
         return projectType;
     }
@@ -34,7 +115,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setProjectType(String projectType) {
         this.projectType = projectType;
     }
-
+    @ExcelField(title="电压等级", align=2, sort=5)
     public String getVoltageLeve() {
         return voltageLeve;
     }
@@ -42,7 +123,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setVoltageLeve(String voltageLeve) {
         this.voltageLeve = voltageLeve;
     }
-
+    @ExcelField(title="项目下达年度", align=2, sort=6)
     public String getProjectReleaseYear() {
         return projectReleaseYear;
     }
@@ -50,7 +131,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setProjectReleaseYear(String projectReleaseYear) {
         this.projectReleaseYear = projectReleaseYear;
     }
-
+    @ExcelField(title="项目预算年度", align=2, sort=7)
     public String getProjectBudgetYear() {
         return projectBudgetYear;
     }
@@ -58,7 +139,7 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setProjectBudgetYear(String projectBudgetYear) {
         this.projectBudgetYear = projectBudgetYear;
     }
-
+    @ExcelField(title="项目总投资", align=2, sort=8)
     public String getTotalProjectInvestment() {
         return totalProjectInvestment;
     }
@@ -66,4 +147,428 @@ public class ProjectInformation extends DataEntity<ProjectInformation> {
     public void setTotalProjectInvestment(String totalProjectInvestment) {
         this.totalProjectInvestment = totalProjectInvestment;
     }
+    @ExcelField(title="可研批复文号", align=2, sort=9)
+    public String getApprovalReplyNo() {
+        return approvalReplyNo;
+    }
+
+    public void setApprovalReplyNo(String approvalReplyNo) {
+        this.approvalReplyNo = approvalReplyNo;
+    }
+    @ExcelField(title="单体工程WBS编号", align=2, sort=10)
+    public String getSingleProjectWbsNo() {
+        return singleProjectWbsNo;
+    }
+
+    public void setSingleProjectWbsNo(String singleProjectWbsNo) {
+        this.singleProjectWbsNo = singleProjectWbsNo;
+    }
+    @ExcelField(title="工程编号", align=2, sort=11)
+    public String getEngineeringNo() {
+        return engineeringNo;
+    }
+
+    public void setEngineeringNo(String engineeringNo) {
+        this.engineeringNo = engineeringNo;
+    }
+    @ExcelField(title="工程名称", align=2, sort=12)
+    public String getEngineeringName() {
+        return engineeringName;
+    }
+
+    public void setEngineeringName(String engineeringName) {
+        this.engineeringName = engineeringName;
+    }
+    @ExcelField(title="联系人", align=2, sort=13)
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+    @ExcelField(title="联系电话", align=2, sort=14)
+    public String getContactNumber() {
+        return contactNumber;
+    }
+
+    public void setContactNumber(String contactNumber) {
+        this.contactNumber = contactNumber;
+    }
+    @ExcelField(title="实际开工日期", align=2, sort=15)
+    public Date getActualCommencementDate() {
+        return actualCommencementDate;
+    }
+
+    public void setActualCommencementDate(Date actualCommencementDate) {
+        this.actualCommencementDate = actualCommencementDate;
+    }
+    @ExcelField(title="实际竣工日期", align=2, sort=16)
+    public Date getActualCompletionDate() {
+        return actualCompletionDate;
+    }
+
+    public void setActualCompletionDate(Date actualCompletionDate) {
+        this.actualCompletionDate = actualCompletionDate;
+    }
+    @ExcelField(title="施工单位", align=2, sort=17)
+    public String getConstructionUnit() {
+        return constructionUnit;
+    }
+
+    public void setConstructionUnit(String constructionUnit) {
+        this.constructionUnit = constructionUnit;
+    }
+    @ExcelField(title="合同编号", align=2, sort=18)
+    public String getContractNo() {
+        return contractNo;
+    }
+
+    public void setContractNo(String contractNo) {
+        this.contractNo = contractNo;
+    }
+    @ExcelField(title="合同金额", align=2, sort=19)
+    public String getContractAmount() {
+        return contractAmount;
+    }
+
+    public void setContractAmount(String contractAmount) {
+        this.contractAmount = contractAmount;
+    }
+    @ExcelField(title="结算折扣率", align=2, sort=20)
+    public String getSettlementDiscountRate() {
+        return settlementDiscountRate;
+    }
+
+    public void setSettlementDiscountRate(String settlementDiscountRate) {
+        this.settlementDiscountRate = settlementDiscountRate;
+    }
+    @ExcelField(title="计划开工日期", align=2, sort=21)
+    public Date getPlannedCommencementDate() {
+        return plannedCommencementDate;
+    }
+
+    public void setPlannedCommencementDate(Date plannedCommencementDate) {
+        this.plannedCommencementDate = plannedCommencementDate;
+    }
+    @ExcelField(title="计划竣工日期", align=2, sort=22)
+    public Date getPlannedCompletionDate() {
+        return plannedCompletionDate;
+    }
+
+    public void setPlannedCompletionDate(Date plannedCompletionDate) {
+        this.plannedCompletionDate = plannedCompletionDate;
+    }
+    @ExcelField(title="土建送审金额", align=2, sort=23)
+    public String getCivilEngineeringAmountSubmittedForApproval() {
+        return civilEngineeringAmountSubmittedForApproval;
+    }
+
+    public void setCivilEngineeringAmountSubmittedForApproval(String civilEngineeringAmountSubmittedForApproval) {
+        this.civilEngineeringAmountSubmittedForApproval = civilEngineeringAmountSubmittedForApproval;
+    }
+    @ExcelField(title="安装送审金额", align=2, sort=24)
+    public String getInstallAmountSubmittedForApproval() {
+        return installAmountSubmittedForApproval;
+    }
+
+    public void setInstallAmountSubmittedForApproval(String installAmountSubmittedForApproval) {
+        this.installAmountSubmittedForApproval = installAmountSubmittedForApproval;
+    }
+    @ExcelField(title="送审施工费小计", align=2, sort=25)
+    public String getSubtotalOfConstructionCostSubmittedForApproval() {
+        return subtotalOfConstructionCostSubmittedForApproval;
+    }
+
+    public void setSubtotalOfConstructionCostSubmittedForApproval(String subtotalOfConstructionCostSubmittedForApproval) {
+        this.subtotalOfConstructionCostSubmittedForApproval = subtotalOfConstructionCostSubmittedForApproval;
+    }
+    @ExcelField(title="甲供材送审金额", align=2, sort=26)
+    public String getAmountOfMaterialsProvidedByPartyAForApproval() {
+        return amountOfMaterialsProvidedByPartyAForApproval;
+    }
+
+    public void setAmountOfMaterialsProvidedByPartyAForApproval(String amountOfMaterialsProvidedByPartyAForApproval) {
+        this.amountOfMaterialsProvidedByPartyAForApproval = amountOfMaterialsProvidedByPartyAForApproval;
+    }
+    @ExcelField(title="送审备注", align=2, sort=27)
+    public String getCommentsOnSubmissionForApproval() {
+        return commentsOnSubmissionForApproval;
+    }
+
+    public void setCommentsOnSubmissionForApproval(String commentsOnSubmissionForApproval) {
+        this.commentsOnSubmissionForApproval = commentsOnSubmissionForApproval;
+    }
+    @ExcelField(title="土建审定金额", align=2, sort=28)
+    public String getApprovedAmountOfCivilEngineering() {
+        return approvedAmountOfCivilEngineering;
+    }
+
+    public void setApprovedAmountOfCivilEngineering(String approvedAmountOfCivilEngineering) {
+        this.approvedAmountOfCivilEngineering = approvedAmountOfCivilEngineering;
+    }
+    @ExcelField(title="安装审定金额", align=2, sort=29)
+    public String getInstallationApprovalAmount() {
+        return installationApprovalAmount;
+    }
+
+    public void setInstallationApprovalAmount(String installationApprovalAmount) {
+        this.installationApprovalAmount = installationApprovalAmount;
+    }
+    @ExcelField(title="审定施工费小计", align=2, sort=30)
+    public String getSubtotalOfApprovedConstructionCost() {
+        return subtotalOfApprovedConstructionCost;
+    }
+
+    public void setSubtotalOfApprovedConstructionCost(String subtotalOfApprovedConstructionCost) {
+        this.subtotalOfApprovedConstructionCost = subtotalOfApprovedConstructionCost;
+    }
+    @ExcelField(title="甲供材审定金额", align=2, sort=31)
+    public String getApprovedAmountOfMaterialsSuppliedByPartyA() {
+        return approvedAmountOfMaterialsSuppliedByPartyA;
+    }
+
+    public void setApprovedAmountOfMaterialsSuppliedByPartyA(String approvedAmountOfMaterialsSuppliedByPartyA) {
+        this.approvedAmountOfMaterialsSuppliedByPartyA = approvedAmountOfMaterialsSuppliedByPartyA;
+    }
+    @ExcelField(title="施工费核减金额", align=2, sort=32)
+    public String getDeductionAmountOfConstructionCost() {
+        return deductionAmountOfConstructionCost;
+    }
+
+    public void setDeductionAmountOfConstructionCost(String deductionAmountOfConstructionCost) {
+        this.deductionAmountOfConstructionCost = deductionAmountOfConstructionCost;
+    }
+    @ExcelField(title="施工费核减率", align=2, sort=33)
+    public String getReductionRateOfConstructionCost() {
+        return reductionRateOfConstructionCost;
+    }
+
+    public void setReductionRateOfConstructionCost(String reductionRateOfConstructionCost) {
+        this.reductionRateOfConstructionCost = reductionRateOfConstructionCost;
+    }
+    @ExcelField(title="施工单位诚信扣款", align=2, sort=34)
+    public String getCreditDeductionOfTheConstructionUnit() {
+        return creditDeductionOfTheConstructionUnit;
+    }
+
+    public void setCreditDeductionOfTheConstructionUnit(String creditDeductionOfTheConstructionUnit) {
+        this.creditDeductionOfTheConstructionUnit = creditDeductionOfTheConstructionUnit;
+    }
+    @ExcelField(title="建议结算款", align=2, sort=35)
+    public String getProposedSettlement() {
+        return proposedSettlement;
+    }
+
+    public void setProposedSettlement(String proposedSettlement) {
+        this.proposedSettlement = proposedSettlement;
+    }
+    @ExcelField(title="经度", align=2, sort=36)
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+    @ExcelField(title="纬度", align=2, sort=37)
+    public String getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(String latitude) {
+        this.latitude = latitude;
+    }
+    @ExcelField(title="审计费", align=2, sort=38)
+    public String getAuditFee() {
+        return auditFee;
+    }
+
+    public void setAuditFee(String auditFee) {
+        this.auditFee = auditFee;
+    }
+    @ExcelField(title="审计意见文号", align=2, sort=39)
+    public String getAuditOpinionNo() {
+        return auditOpinionNo;
+    }
+
+    public void setAuditOpinionNo(String auditOpinionNo) {
+        this.auditOpinionNo = auditOpinionNo;
+    }
+    @ExcelField(title="审计报告号", align=2, sort=40)
+    public String getAuditReportNo() {
+        return auditReportNo;
+    }
+
+    public void setAuditReportNo(String auditReportNo) {
+        this.auditReportNo = auditReportNo;
+    }
+    @ExcelField(title="审计备注", align=2, sort=41)
+    public String getAuditRemarks() {
+        return auditRemarks;
+    }
+
+    public void setAuditRemarks(String auditRemarks) {
+        this.auditRemarks = auditRemarks;
+    }
+    @ExcelField(title="事务所名称", align=2, sort=42)
+    public String getFirmName() {
+        return firmName;
+    }
+
+    public void setFirmName(String firmName) {
+        this.firmName = firmName;
+    }
+    @ExcelField(title="事务所审计人员", align=2, sort=43)
+    public String getAuditorOfTheFirm() {
+        return auditorOfTheFirm;
+    }
+
+    public void setAuditorOfTheFirm(String auditorOfTheFirm) {
+        this.auditorOfTheFirm = auditorOfTheFirm;
+    }
+    @ExcelField(title="提交送审日期", align=2, sort=44)
+    public Date getSubmissionDate() {
+        return submissionDate;
+    }
+
+    public void setSubmissionDate(Date submissionDate) {
+        this.submissionDate = submissionDate;
+    }
+    @ExcelField(title="审计任务下达日期", align=2, sort=45)
+    public Date getAuditTaskReleaseDate() {
+        return auditTaskReleaseDate;
+    }
+
+    public void setAuditTaskReleaseDate(Date auditTaskReleaseDate) {
+        this.auditTaskReleaseDate = auditTaskReleaseDate;
+    }
+    @ExcelField(title="审计应结束日期", align=2, sort=46)
+    public Date getEndDateOfAudit() {
+        return endDateOfAudit;
+    }
+
+    public void setEndDateOfAudit(Date endDateOfAudit) {
+        this.endDateOfAudit = endDateOfAudit;
+    }
+    @ExcelField(title="结果上传日期", align=2, sort=47)
+    public Date getResultUploadDate() {
+        return resultUploadDate;
+    }
+
+    public void setResultUploadDate(Date resultUploadDate) {
+        this.resultUploadDate = resultUploadDate;
+    }
+    @ExcelField(title="审定日期", align=2, sort=48)
+    public Date getApprovalDate() {
+        return approvalDate;
+    }
+
+    public void setApprovalDate(Date approvalDate) {
+        this.approvalDate = approvalDate;
+    }
+    @ExcelField(title="是否超时", align=2, sort=49)
+    public String getTimeout() {
+        return timeout;
+    }
+
+    public void setTimeout(String timeout) {
+        this.timeout = timeout;
+    }
+    @ExcelField(title="审计管理级别", align=2, sort=50)
+    public String getAuditManagementLevel() {
+        return auditManagementLevel;
+    }
+
+    public void setAuditManagementLevel(String auditManagementLevel) {
+        this.auditManagementLevel = auditManagementLevel;
+    }
+    @ExcelField(title="审计方式", align=2, sort=51)
+    public String getAuditMethod() {
+        return auditMethod;
+    }
+
+    public void setAuditMethod(String auditMethod) {
+        this.auditMethod = auditMethod;
+    }
+    @ExcelField(title="审计专职", align=2, sort=52)
+    public String getFullTimeAuditor() {
+        return fullTimeAuditor;
+    }
+
+    public void setFullTimeAuditor(String fullTimeAuditor) {
+        this.fullTimeAuditor = fullTimeAuditor;
+    }
+    @ExcelField(title="送审人", align=2, sort=53)
+    public String getSubmitter() {
+        return submitter;
+    }
+
+    public void setSubmitter(String submitter) {
+        this.submitter = submitter;
+    }
+    @ExcelField(title="送审部门", align=2, sort=54)
+    public String getSubmissionDepartment() {
+        return submissionDepartment;
+    }
+
+    public void setSubmissionDepartment(String submissionDepartment) {
+        this.submissionDepartment = submissionDepartment;
+    }
+    @ExcelField(title="二级单位", align=2, sort=55)
+    public String getSecondaryUnit() {
+        return secondaryUnit;
+    }
+
+    public void setSecondaryUnit(String secondaryUnit) {
+        this.secondaryUnit = secondaryUnit;
+    }
+    @ExcelField(title="一级单位", align=2, sort=56)
+    public String getPrimaryUnit() {
+        return primaryUnit;
+    }
+
+    public void setPrimaryUnit(String primaryUnit) {
+        this.primaryUnit = primaryUnit;
+    }
+    @ExcelField(title="送审状态", align=2, sort=57)
+    public String getSubmissionStatus() {
+        return submissionStatus;
+    }
+
+    public void setSubmissionStatus(String submissionStatus) {
+        this.submissionStatus = submissionStatus;
+    }
+    @ExcelField(title="送审单id", align=2, sort=58)
+    public String getSubmissionFormId() {
+        return submissionFormId;
+    }
+
+    public void setSubmissionFormId(String submissionFormId) {
+        this.submissionFormId = submissionFormId;
+    }
+
+    public Date getTableBuildingTime() {
+        return tableBuildingTime;
+    }
+
+    public void setTableBuildingTime(Date tableBuildingTime) {
+        this.tableBuildingTime = tableBuildingTime;
+    }
+
+    public Date getBeginDate() {
+        return beginDate;
+    }
+
+    public void setBeginDate(Date beginDate) {
+        this.beginDate = beginDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
 }

+ 78 - 0
src/main/java/com/jeeplus/modules/supply/projectInformation/entity/RealProjectInformation.java

@@ -0,0 +1,78 @@
+package com.jeeplus.modules.supply.projectInformation.entity;
+
+import com.jeeplus.core.persistence.DataEntity;
+
+public class RealProjectInformation extends DataEntity<RealProjectInformation> {
+    private String num;                                 //序号
+    private String projectDefinitionNumber;             //项目定义号
+    private String projectName;                         //项目名称
+    private String projectType;                         //项目类型
+    private String voltageLeve;                         //电压等级
+    private String projectReleaseYear;                  //项目下达年度
+    private String projectBudgetYear;                   //项目预算年度
+    private String totalProjectInvestment;              //项目总投资
+
+    public String getNum() {
+        return num;
+    }
+
+    public void setNum(String num) {
+        this.num = num;
+    }
+
+    public String getProjectDefinitionNumber() {
+        return projectDefinitionNumber;
+    }
+
+    public void setProjectDefinitionNumber(String projectDefinitionNumber) {
+        this.projectDefinitionNumber = projectDefinitionNumber;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getProjectType() {
+        return projectType;
+    }
+
+    public void setProjectType(String projectType) {
+        this.projectType = projectType;
+    }
+
+    public String getVoltageLeve() {
+        return voltageLeve;
+    }
+
+    public void setVoltageLeve(String voltageLeve) {
+        this.voltageLeve = voltageLeve;
+    }
+
+    public String getProjectReleaseYear() {
+        return projectReleaseYear;
+    }
+
+    public void setProjectReleaseYear(String projectReleaseYear) {
+        this.projectReleaseYear = projectReleaseYear;
+    }
+
+    public String getProjectBudgetYear() {
+        return projectBudgetYear;
+    }
+
+    public void setProjectBudgetYear(String projectBudgetYear) {
+        this.projectBudgetYear = projectBudgetYear;
+    }
+
+    public String getTotalProjectInvestment() {
+        return totalProjectInvestment;
+    }
+
+    public void setTotalProjectInvestment(String totalProjectInvestment) {
+        this.totalProjectInvestment = totalProjectInvestment;
+    }
+}

+ 13 - 0
src/main/java/com/jeeplus/modules/supply/projectInformation/mapper/ProjectInformationMapper.java

@@ -2,9 +2,22 @@ package com.jeeplus.modules.supply.projectInformation.mapper;
 
 import com.jeeplus.core.persistence.BaseMapper;
 import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
 import com.jeeplus.modules.supply.projectInformation.entity.ProjectInformation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @MyBatisMapper
 public interface ProjectInformationMapper extends BaseMapper<ProjectInformation> {
 
+    Integer insertSubmissionFormList(@Param("list") List<ProjectInformation> list);
+
+    Integer insertProjectInformationList(@Param("list") List<ProjectInformation> list);
+
+    //按审定单idlist来查询
+    List<String> getSubmissionFormIdListBysubmissionFormIdList(@Param("submissionFormIdList") List<String> submissionFormIdList);
+
+    Integer deleteAll(@Param("codeList") List<String> codeList);
+    void deletex(String id);
 }

+ 264 - 0
src/main/java/com/jeeplus/modules/supply/projectInformation/mapper/xml/ProjectInformationMapper.xml

@@ -2,6 +2,270 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jeeplus.modules.supply.projectInformation.mapper.ProjectInformationMapper">
 
+    <sql id="ProjectInformation">
+        sf.submission_form_id as "submissionFormId",
+        sf.project_definition_number as "projectDefinitionNumber",
+        sf.approval_reply_no as "approvalReplyNo",
+        sf.single_project_wbs_no as "singleProjectWbsNo",
+        sf.engineering_no as "engineeringNo",
+        sf.engineering_name as "engineeringName",
+        sf.contacts as "contacts",
+        sf.contact_number as "contactNumber",
+        sf.actual_commencement_date as "actualCommencementDate",
+        sf.actual_completion_date as "actualCompletionDate",
+        sf.construction_unit as "constructionUnit",
+        sf.contract_no as "contractNo",
+        sf.contract_amount as "contractAmount",
+        sf.settlement_discount_rate as "settlementDiscountRate",
+        sf.planned_commencement_date as "plannedCommencementDate",
+        sf.planned_completion_date as "plannedCompletionDate",
+        sf.civil_engineering_amount_submitted_for_approval as "civilEngineeringAmountSubmittedForApproval",
+        sf.install_amount_submitted_for_approval as "installAmountSubmittedForApproval",
+        sf.subtotal_of_construction_cost_submitted_for_approval as "subtotalOfConstructionCostSubmittedForApproval",
+        sf.amount_of_materials_provided_by_party_a_for_approval as "amountOfMaterialsProvidedByPartyAForApproval",
+        sf.comments_on_submission_for_approval as "commentsOnSubmissionForApproval",
+        sf.approved_amount_of_civil_engineering as "approvedAmountOfCivilEngineering",
+        sf.installation_approval_amount as "installationApprovalAmount",
+        sf.subtotal_of_approved_construction_cost as "subtotalOfApprovedConstructionCost",
+        sf.approved_amount_of_materials_supplied_by_party_a as "approvedAmountOfMaterialsSuppliedByPartyA",
+        sf.deduction_amount_of_construction_cost as "deductionAmountOfConstructionCost",
+        sf.reduction_rate_of_construction_cost as "reductionRateOfConstructionCost",
+        sf.credit_deduction_of_the_construction_unit as "creditDeductionOfTheConstructionUnit",
+        sf.proposed_settlement as "proposedSettlement",
+        sf.longitude as "longitude",
+        sf.latitude as "latitude",
+        sf.audit_fee as "auditFee",
+        sf.audit_opinion_no as "auditOpinionNo",
+        sf.audit_report_no as "auditReportNo",
+        sf.audit_remarks as "auditRemarks",
+        sf.firm_name as "firmName",
+        sf.auditor_of_the_firm as "auditorOfTheFirm",
+        sf.submission_date as "submissionDate",
+        sf.audit_task_release_date as "auditTaskReleaseDate",
+        sf.end_date_of_audit as "endDateOfAudit",
+        sf.result_upload_date as "resultUploadDate",
+        sf.approval_date as "approvalDate",
+        sf.timeout as "timeout",
+        sf.audit_management_level as "auditManagementLevel",
+        sf.audit_method as "auditMethod",
+        sf.full_time_auditor as "fullTimeAuditor",
+        sf.submitter as "submitter",
+        sf.submission_department as "submissionDepartment",
+        sf.secondary_unit as "secondaryUnit",
+        sf.primary_unit as "primaryUnit",
+        sf.submission_status as "submissionStatus",
+        pi.project_name as "projectName",
+        pi.project_type as "projectType",
+        pi.voltage_leve as "voltageLeve",
+        pi.project_release_year as "projectReleaseYear",
+        pi.project_budget_year as "projectBudgetYear",
+        pi.total_project_investment as "totalProjectInvestment",
+        sf.table_building_time as "tableBuildingTime"
+    </sql>
 
+    <select id="findList" resultType="ProjectInformation" >
+        SELECT
+        <include refid="ProjectInformation"/>
+        ,id
+        from submission_form sf
+        left join project_information pi on pi.project_definition_number = sf.project_definition_number
+        <where>
+            <if test="projectDefinitionNumber != null and projectDefinitionNumber != ''">
+                AND sf.project_definition_number like concat('%',#{projectDefinitionNumber},'%')
+            </if>
+            <if test="submissionFormId != null and submissionFormId != ''">
+                AND sf.submission_form_id like concat('%',#{submissionFormId},'%')
+            </if>
+            <if test="beginDate != null ">
+                AND sf.table_building_time >= #{beginDate}
+            </if>
+            <if test="endDate != null ">
+                AND sf.table_building_time &lt;= #{endDate}
+            </if>
+        </where>
+        GROUP BY sf.submission_form_id
+        <choose>
+            <when test="page !=null and page.orderBy != null and page.orderBy != ''">
+                ORDER BY ${page.orderBy}
+            </when>
+                        <otherwise>
+                            ORDER BY sf.table_building_time DESC
+                        </otherwise>
+        </choose>
+    </select>
+
+
+
+
+
+
+    <!--批量新增 审定单表-->
+    <insert id="insertSubmissionFormList">
+        insert into submission_form (
+        submission_form_id,
+        project_definition_number,
+        approval_reply_no,
+        single_project_wbs_no,
+        engineering_no,
+        engineering_name,
+        contacts,
+        contact_number,
+        actual_commencement_date,
+        actual_completion_date,
+        construction_unit,
+        contract_no,
+        contract_amount,
+        settlement_discount_rate,
+        planned_commencement_date,
+        planned_completion_date,
+        civil_engineering_amount_submitted_for_approval,
+        install_amount_submitted_for_approval,
+        subtotal_of_construction_cost_submitted_for_approval,
+        amount_of_materials_provided_by_party_a_for_approval,
+        comments_on_submission_for_approval,
+        approved_amount_of_civil_engineering,
+        installation_approval_amount,
+        subtotal_of_approved_construction_cost,
+        approved_amount_of_materials_supplied_by_party_a,
+        deduction_amount_of_construction_cost,
+        reduction_rate_of_construction_cost,
+        credit_deduction_of_the_construction_unit,
+        proposed_settlement,
+        longitude,
+        latitude,
+        audit_fee,
+        audit_opinion_no,
+        audit_report_no,
+        audit_remarks,
+        firm_name,
+        auditor_of_the_firm,
+        submission_date,
+        audit_task_release_date,
+        end_date_of_audit,
+        result_upload_date,
+        approval_date,
+        timeout,
+        audit_management_level,
+        audit_method,
+        full_time_auditor,
+        submitter,
+        submission_department,
+        secondary_unit,
+        primary_unit,
+        submission_status,
+        table_building_time
+        )
+        values
+        <foreach collection="list" item="item" index="index" separator="," >
+            (
+            #{item.submissionFormId},
+            #{item.projectDefinitionNumber},
+            #{item.approvalReplyNo},
+            #{item.singleProjectWbsNo},
+            #{item.engineeringNo},
+            #{item.engineeringName},
+            #{item.contacts},
+            #{item.contactNumber},
+            #{item.actualCommencementDate},
+            #{item.actualCompletionDate},
+            #{item.constructionUnit},
+            #{item.contractNo},
+            #{item.contractAmount},
+            #{item.settlementDiscountRate},
+            #{item.plannedCommencementDate},
+            #{item.plannedCompletionDate},
+            #{item.civilEngineeringAmountSubmittedForApproval},
+            #{item.installAmountSubmittedForApproval},
+            #{item.subtotalOfConstructionCostSubmittedForApproval},
+            #{item.amountOfMaterialsProvidedByPartyAForApproval},
+            #{item.commentsOnSubmissionForApproval},
+            #{item.approvedAmountOfCivilEngineering},
+            #{item.installationApprovalAmount},
+            #{item.subtotalOfApprovedConstructionCost},
+            #{item.approvedAmountOfMaterialsSuppliedByPartyA},
+            #{item.deductionAmountOfConstructionCost},
+            #{item.reductionRateOfConstructionCost},
+            #{item.creditDeductionOfTheConstructionUnit},
+            #{item.proposedSettlement},
+            #{item.longitude},
+            #{item.latitude},
+            #{item.auditFee},
+            #{item.auditOpinionNo},
+            #{item.auditReportNo},
+            #{item.auditRemarks},
+            #{item.firmName},
+            #{item.auditorOfTheFirm},
+            #{item.submissionDate},
+            #{item.auditTaskReleaseDate},
+            #{item.endDateOfAudit},
+            #{item.resultUploadDate},
+            #{item.approvalDate},
+            #{item.timeout},
+            #{item.auditManagementLevel},
+            #{item.auditMethod},
+            #{item.fullTimeAuditor},
+            #{item.submitter},
+            #{item.submissionDepartment},
+            #{item.secondaryUnit},
+            #{item.primaryUnit},
+            #{item.submissionStatus},
+            now()
+            )
+        </foreach>
+    </insert>
+
+    <!--批量新增 项目信息表-->
+    <insert id="insertProjectInformationList">
+        insert into project_information (
+        project_definition_number,
+        project_name,
+        project_type,
+        voltage_leve,
+        project_release_year,
+        project_budget_year,
+        total_project_investment
+        )
+        values
+        <foreach collection="list" item="item" index="index" separator="," >
+            (
+            #{item.projectDefinitionNumber},
+            #{item.projectName},
+            #{item.projectType},
+            #{item.voltageLeve},
+            #{item.projectReleaseYear},
+            #{item.projectBudgetYear},
+            #{item.totalProjectInvestment}
+            )
+        </foreach>
+    </insert>
+
+    <select id="getSubmissionFormIdListBysubmissionFormIdList" resultType="string">
+        select submission_form_id from submission_form
+        <where>
+            <if test="submissionFormIdList != null and submissionFormIdList.size !=0">
+                submission_form_id in
+                <foreach collection="submissionFormIdList" item="submissionFormId"  separator="," open="(" close=")">
+                    #{submissionFormId}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <delete id="deleteAll">
+        delete sf,pi from submission_form sf left join project_information pi on pi.project_definition_number = sf.project_definition_number
+        <where>
+            sf.submission_form_id in
+            <foreach collection="codeList" item="code" separator="," open="(" close=")">
+                #{code}
+            </foreach>
+        </where>
+    </delete>
+
+    <delete id="deletex">
+        delete sf,pi from submission_form sf left join project_information pi on pi.project_definition_number = sf.project_definition_number
+        <where>
+            sf.id  = #{id}
+        </where>
+    </delete>
 
 </mapper>

+ 363 - 0
src/main/java/com/jeeplus/modules/supply/projectInformation/service/ProjectInformationService.java

@@ -1,8 +1,371 @@
 package com.jeeplus.modules.supply.projectInformation.service;
 
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
+import com.jeeplus.modules.supply.materialLibrary.service.MaterialLibraryService;
 import com.jeeplus.modules.supply.projectInformation.entity.ProjectInformation;
+import com.jeeplus.modules.supply.projectInformation.entity.RealProjectInformation;
 import com.jeeplus.modules.supply.projectInformation.mapper.ProjectInformationMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional(readOnly = true)
 public class ProjectInformationService extends CrudService<ProjectInformationMapper, ProjectInformation> {
+
+    /** 主机 */
+    private final static String host = Global.getConfig("remoteServer.host");
+    private static Logger logger = LoggerFactory.getLogger(MaterialLibraryService.class);
+
+    @Autowired
+    private ProjectInformationMapper projectInformationMapper;
+
+
+    //页面显示
+    @Override
+    public Page<ProjectInformation> findPage(Page<ProjectInformation> page, ProjectInformation projectInformation){
+        return super.findPage(page,projectInformation);
+    }
+
+    /**
+     * 物流库信息导入处理
+     * @param list
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public LinkedHashMap disposeImportProjectInformation(List<ProjectInformation> list, MultipartFile file, String repeat) throws Exception{
+        LinkedHashMap returnMap = new LinkedHashMap();
+        Set<String> submissionFormIdSet = new HashSet<>();
+        for (ProjectInformation importInfo : list){
+            //将审定单id放入set中
+            submissionFormIdSet.add(importInfo.getSubmissionFormId());
+        }
+        //将去重后的set转换为list  方便比较
+        List<String> submissionFormIdList = new ArrayList<>(submissionFormIdSet);
+
+        //判断物流编码list长度和导入数据的list长度是否一样,不一样则说明导入数据中项目名存在重复数据
+        if(submissionFormIdList.size() != list.size()){
+            returnMap.keySet().removeIf(key -> key == "msg");
+            returnMap.put("msg","数据中存在重复审定单id");
+        }
+
+
+        //将项目信息的内容去重  遍历
+        List<ProjectInformation> projectInformationList = new ArrayList();
+        Set<String> projectDefinitionNumberSet = new HashSet<>();//去重后的项目定义号
+        for(int i=0;i<list.size();i++){ //遍历取出项目定义号   这里需要优化吗?
+            projectDefinitionNumberSet.add(list.get(i).getProjectDefinitionNumber());
+        }
+        Iterator<String> projectDefinitionNumberIt = projectDefinitionNumberSet.iterator();//将项目定义号加入迭代器
+        while(projectDefinitionNumberIt.hasNext()){//遍历迭代器,遍历list数据,当存在两个项目定义号相等时,存入新的list结合,为项目信息表的导入做准备
+            String projectDefinitionNumber = projectDefinitionNumberIt.next();
+            for(ProjectInformation info:list){
+                if(info.getProjectDefinitionNumber().equals(projectDefinitionNumber)){
+                    projectInformationList.add(info);
+                    break;
+                }
+            }
+        }
+
+
+
+        //方便快捷删除  找到对应重复数据,以便最后批量操作使用  审定单id
+        List<String> codeList = projectInformationMapper.getSubmissionFormIdListBysubmissionFormIdList(submissionFormIdList);  //即为重复数据的审定单id集合
+        Iterator<ProjectInformation> it = list.iterator();
+        if(codeList.size()!=0 && repeat.equals("0") && codeList != null) {  //有重复值并且为第一次交互  就保存文件
+            File copyFile = transformMultipartFile(file);
+            //将文件存到服务器
+            String filePath = saveFile(copyFile);
+            returnMap.put("filePath",filePath);
+            returnMap.keySet().removeIf(key -> key == "msg");
+            returnMap.put("msg","已存在物料数据,是否覆盖?");
+            return returnMap;
+        }
+
+        if(repeat.equals("2")) {  //不覆盖 则删除list中的重复数据
+            while (it.hasNext()) {
+                ProjectInformation projectInformation = it.next();
+                if (codeList.contains(projectInformation.getSubmissionFormId())) {
+                    it.remove();
+                }
+            }
+            Iterator<ProjectInformation> projectIt = projectInformationList.iterator();
+            while(projectIt.hasNext()){
+                ProjectInformation projectInformation = projectIt.next();
+                if(codeList.contains(projectInformation.getSubmissionFormId())){
+                    projectIt.remove();
+                }
+            }
+        }else if(repeat.equals("1")){  //覆盖 则删除数据库中的重复数据
+            //批量删除重复数据  覆盖操作
+            modifyHandmadeVindicateListTwo(codeList);
+        }
+
+
+        //批量新增  分批次新增
+        if(list.size()!=0) {
+            modifyHandmadeVindicateList(list);
+            modifyHandmadeVindicateList2(projectInformationList);
+        }
+
+        returnMap.keySet().removeIf(key -> key == "msg");
+        returnMap.put("msg","已成功导入 "+list.size()+" 条项目表单记录");
+        return returnMap;
+    }
+
+    /**
+     * 批量修改手工上传数据信息
+     * @param projectBasicsList
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public String modifyHandmadeVindicateList(List<ProjectInformation> projectBasicsList){
+        //分批处理
+        if(null!=projectBasicsList && projectBasicsList.size()>0){
+            int pointsDataLimit = 1000;//限制条数
+            Integer size = projectBasicsList.size();
+            //判断是否有必要分批
+            if(pointsDataLimit<size){
+                int part = size/pointsDataLimit;//分批数
+                //
+                for (int i = 0; i < part; i++) {
+                    //100条
+                    List<ProjectInformation> listPage = projectBasicsList.subList(0, pointsDataLimit);
+                    projectInformationMapper.insertSubmissionFormList(listPage);
+                    //剔除
+                    projectBasicsList.subList(0, pointsDataLimit).clear();
+                }
+                if(!projectBasicsList.isEmpty()){
+                    projectInformationMapper.insertSubmissionFormList(projectBasicsList);
+                }
+            }else{
+                projectInformationMapper.insertSubmissionFormList(projectBasicsList);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 批量修改手工上传数据信息
+     * @param projectBasicsList
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public String modifyHandmadeVindicateList2(List<ProjectInformation> projectBasicsList){
+        //分批处理
+        if(null!=projectBasicsList && projectBasicsList.size()>0){
+            int pointsDataLimit = 1000;//限制条数
+            Integer size = projectBasicsList.size();
+            //判断是否有必要分批
+            if(pointsDataLimit<size){
+                int part = size/pointsDataLimit;//分批数
+                //
+                for (int i = 0; i < part; i++) {
+                    //100条
+                    List<ProjectInformation> listPage = projectBasicsList.subList(0, pointsDataLimit);
+                    projectInformationMapper.insertProjectInformationList(listPage);
+                    //剔除
+                    projectBasicsList.subList(0, pointsDataLimit).clear();
+                }
+                if(!projectBasicsList.isEmpty()){
+                    projectInformationMapper.insertProjectInformationList(projectBasicsList);
+                }
+            }else{
+                projectInformationMapper.insertProjectInformationList(projectBasicsList);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 批量修改手工上传数据信息
+     * @param projectBasicsList
+     * @return
+     */
+    @Transactional(readOnly = false)
+    public String modifyHandmadeVindicateListTwo(List<String> projectBasicsList){
+        //分批处理
+        if(null!=projectBasicsList && projectBasicsList.size()>0){
+            int pointsDataLimit = 1000;//限制条数
+            Integer size = projectBasicsList.size();
+            //判断是否有必要分批
+            if(pointsDataLimit<size){
+                int part = size/pointsDataLimit;//分批数
+                //
+                for (int i = 0; i < part; i++) {
+                    //100条
+                    List<String> listPage = projectBasicsList.subList(0, pointsDataLimit);
+                    projectInformationMapper.deleteAll(listPage);
+                    //剔除
+                    projectBasicsList.subList(0, pointsDataLimit).clear();
+                }
+                if(!projectBasicsList.isEmpty()){
+                    projectInformationMapper.deleteAll(projectBasicsList);
+                }
+            }else{
+                projectInformationMapper.deleteAll(projectBasicsList);
+            }
+        }
+        return null;
+    }
+
+    //文件的操作
+    public String saveFile(File file){
+        String filePath = "";
+        try {
+            if(StringUtils.isNotBlank(host) && ("127.0.0.1".equals(host) || "localhost".equals(host))){
+                String path = null;
+                if(System.getProperty("os.name").toLowerCase().contains("win")){
+                    path = Global.getConfig("remoteServer.winDirectory");
+                }else{
+                    path = Global.getConfig("remoteServer.directory");
+                }
+                Calendar date = Calendar.getInstance();
+                date.add(Calendar.DAY_OF_MONTH,0);
+                String nowTime = new SimpleDateFormat("yyyy_MM_dd").format(date.getTime());
+                String uploadPath = "/"+nowTime+System.currentTimeMillis();
+                //检查该路径对应的目录是否存在. 如果不存在则创建目录
+                File dir=new File(path);
+                if (!dir.exists()) {
+                    dir.mkdirs();
+                }
+                filePath = path  + uploadPath + file.getName();  //存到服务武器的路径名
+                //File转MultipartFile文件
+                MultipartFile multipartFile = transformFile(file);
+                //保存文件
+                File dest = new File(filePath);
+                if (!(dest.exists())) {
+                    multipartFile.transferTo(dest);
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("Exception e:"+e);
+        }
+        return filePath;
+    }
+
+    //文件的删除操作
+    public void deleteFileContent(File file) throws IOException {
+        String filePath = file.getAbsolutePath();
+        File deleteFile = new File(filePath);
+        if(deleteFile.exists()){
+            deleteFile.delete();
+        }
+    }
+
+    /**
+     * MultipartFile转File
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public File transformMultipartFile( MultipartFile file) throws IOException {
+        File srcFile = null;
+        //MultipartFile转File
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            srcFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, srcFile);
+            ins.close();
+        }
+        return srcFile;
+    }
+
+    /**
+     * 获取流文件
+     * @param ins
+     * @param file
+     */
+    public void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * File转MultipartFile
+     * @param file
+     * @return
+     */
+    public MultipartFile transformFile(File file){
+        InputStream inputStream = null;
+        MultipartFile multipartFile = null;
+        try {
+            inputStream = new FileInputStream(file);
+            multipartFile = new MockMultipartFile(file.getName(), inputStream);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return multipartFile;
+    }
+
+    //定时任务删除前两天数据
+    @Scheduled(cron = "0 */2 * * * ?")
+    public void deleteFileByCron(){
+        try{
+            if(StringUtils.isNotBlank(host) && ("127.0.0.1".equals(host) || "localhost".equals(host))){
+                String path = null;
+                if(System.getProperty("os.name").toLowerCase().contains("win")){
+                    path = Global.getConfig("remoteServer.winDirectory");
+                }else{
+                    path = Global.getConfig("remoteServer.directory");
+                }
+                //删除  路径名
+                File file = new File(path);
+                File[] files = file.listFiles();
+                //获取要删除的时间
+                Calendar date = Calendar.getInstance();
+                date.add(Calendar.DAY_OF_MONTH,-1);
+                String oldOneTime = new SimpleDateFormat("yyyy_MM_dd").format(date.getTime());
+                date.add(Calendar.DAY_OF_MONTH,-1);
+                String oldTwoTime = new SimpleDateFormat("yyyy_MM_dd").format(date.getTime());
+                //遍历获取全部文件名
+                for(File fi:files){
+                    if(fi.isFile()){  //如果是文件  取到名称集合
+                        String fileName = fi.getName();
+                        if(fileName.contains(oldOneTime) || fileName.contains(oldTwoTime)){  //删除前两天的文件
+                            fi.delete();
+                        }
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    public void delete(String id){
+        projectInformationMapper.deletex(id);
+    }
+
 }

+ 139 - 1
src/main/java/com/jeeplus/modules/supply/projectInformation/web/ProjectInformationController.java

@@ -1,11 +1,149 @@
 package com.jeeplus.modules.supply.projectInformation.web;
 
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.supply.materialLibrary.entity.MaterialLibrary;
+import com.jeeplus.modules.supply.materialLibrary.service.MaterialLibraryService;
+import com.jeeplus.modules.supply.projectInformation.entity.ProjectInformation;
+import com.jeeplus.modules.supply.projectInformation.service.ProjectInformationService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.method.P;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 @Controller
-@RequestMapping(value = "${adminPath}/superOwed/projectInformation")
+@RequestMapping(value = "${adminPath}/supply/projectInformation")
 public class ProjectInformationController extends BaseController {
 
+    @Autowired
+    private ProjectInformationService projectInformationService;
+
+    @ModelAttribute
+    public ProjectInformation get(@RequestParam(required = false) String id) {
+        ProjectInformation entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = projectInformationService.get(id);
+        }
+        if (entity == null) {
+            entity = new ProjectInformation();
+        }
+        return entity;
+    }
+
+    /**
+     * 项目列表页面
+     */
+//    @RequiresPermissions("supply:projectInformation:list")
+    @RequestMapping(value = {"list", ""})
+    public String list(ProjectInformation projectInformation, Model model) {
+        model.addAttribute("projectInformation",projectInformation);
+        return "modules/supply/projectInformation/supplyProjectInformationList";
+    }
+
+    /**
+     * 列表数据
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:projectInformation:list")
+    @RequestMapping(value = "data")
+    public Map<String, Object> data(ProjectInformation projectInformation, HttpServletRequest request, HttpServletResponse response, Model model) {
+        Page<ProjectInformation> page = projectInformationService.findPage(new Page<ProjectInformation>(request, response), projectInformation);
+        return getBootstrapData(page);
+    }
+
+    /**
+     * 删除项目
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:projectInformation:del")
+    @RequestMapping(value = "delete")
+    public AjaxJson delete(ProjectInformation projectInformation) {
+        AjaxJson j = new AjaxJson();
+        projectInformationService.delete(projectInformation);   //要自己写吗? 前端传的是id,
+        j.setMsg("删除项目成功");
+        return j;
+    }
+
+    /**
+     * 批量删除
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:projectInformation:del")
+    @RequestMapping(value = "deleteAll")
+    public AjaxJson deleteAll(String ids) {
+        AjaxJson j = new AjaxJson();
+        String[] idArray = ids.split(",");
+        for (String id : idArray) {
+            projectInformationService.delete(id);
+        }
+        j.setMsg("删除成功");
+        return j;
+    }
+
+    /**
+     * 导入年度物资上报Excel数据-根据条件自动发送流程
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:projectInformation:import")
+    @RequestMapping(value = "import")
+    public AjaxJson importFile(@RequestParam("file") MultipartFile file) {
+        AjaxJson j = new AjaxJson();
+        try {
+            projectInformationService.deleteFileByCron();
+            String repeat = "0";  //repeat:0:第一次交互,1:覆盖,2:不覆盖
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<ProjectInformation> list = ei.getDataList(ProjectInformation.class);   //直接用就好了吗,格式啥的用设置吗?
+            LinkedHashMap returnMap = projectInformationService.disposeImportProjectInformation(list,file,repeat);
+            //放要放的值
+            returnMap.put("repeat","0");
+            j.setBody(returnMap);
+            j.setMsg(returnMap.get("msg").toString());
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导入项目表单失败!失败信息:" + e.getMessage());
+        }
+        return j;
+    }
+
+    /**
+     * 导入年度物资上报Excel数据-根据条件自动发送流程
+     */
+    @ResponseBody
+//    @RequiresPermissions("supply:projectInformation:import")
+    @RequestMapping(value = "importTwo")
+    public AjaxJson importFileTwo(String filePath,String repeat) {
+        AjaxJson j = new AjaxJson();
+        try {
+            File file = new File(filePath);
+            MultipartFile file1 = projectInformationService.transformFile(file);
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<ProjectInformation> list = ei.getDataList(ProjectInformation.class);   //直接用就好了吗,格式啥的用设置吗?
+            LinkedHashMap returnMap = projectInformationService.disposeImportProjectInformation(list,file1,repeat);
+            //如果文件已经使用完毕,则删除
+            projectInformationService.deleteFileContent(file);
+            //放要放的值
+            j.setBody(returnMap);
+            j.setMsg(returnMap.get("msg").toString());
+        } catch (Exception e) {
+            j.setSuccess(false);
+            j.setMsg("导入项目表单失败!失败信息:" + e.getMessage());
+        }
+        return j;
+    }
 }

+ 1 - 1
src/main/java/com/jeeplus/modules/supply/stockOut/web/SupplyStockOutController.java

@@ -48,7 +48,7 @@ public class SupplyStockOutController extends BaseController {
     /**
      * 项目列表页面
      */
-    @RequiresPermissions("supply:stockOut:list")
+//    @RequiresPermissions("supply:stockOut:list")
     @RequestMapping(value = {"list", ""})
     public String list(SupplyStockOut supplyStockOut, Model model) {
         model.addAttribute("supplyStockOut", supplyStockOut);

+ 272 - 0
src/main/webapp/webpage/modules/supply/materialLibrary/supplyMaterialLibraryList.js

@@ -0,0 +1,272 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script>
+    $(document).ready(function() {
+        $('#dataTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber:1,
+            //每页的记录行数(*)
+            pageSize: 10,
+            //可供选择的每页的行数(*)
+            pageList: [10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/supply/materialLibrary/data",
+            //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+            //queryParamsType:'',
+            ////查询参数,每次调用是会带上这个参数,可自定义
+            queryParams : function(params) {
+                var searchParam = $("#searchForm").serializeJSON();
+                searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+                searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+                searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                return searchParam;
+            },
+            //分页方式:client客户端分页,server服务端分页(*)
+            sidePagination: "server",
+            contextMenuTrigger:"right",//pc端 按右键弹出菜单
+            contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+            contextMenu: '#context-menu',
+            onContextMenuItem: function(row, $el){
+                if($el.data("item") == "edit"){
+                    edit(row.id);
+                }else if($el.data("item") == "view"){
+                    view(row.id);
+                } else if($el.data("item") == "delete"){
+                    jp.confirm('确认要删除该数据记录吗?', function(){
+                        jp.loading();
+                        jp.get("${ctx}/supply/materialLibrary/delete?id="+row.id, function(data){
+                            if(data.success){
+                                $('#dataTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            }else{
+                                jp.error(data.msg);
+                            }
+                        })
+
+                    });
+
+                }
+            },
+
+            onClickRow: function(row, $el){
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns: [{
+		        checkbox: true
+
+		    }
+			,{
+                field: 'materialCode',
+                title: '物料编码',
+                    width:120,
+                sortName: 'materialCode'
+            },{
+                    field: 'materialDescription',
+                    title: '物料描述',
+                    width:210,
+                    sortName: 'materialDescription'
+                }
+                ,{
+                    field: 'unitOfMeasurement',
+                    title: '计量单位',
+                    width:150,
+                    sortName: 'unitOfMeasurement'
+                }
+
+
+
+            ]
+
+        });
+
+        if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+
+            $('#dataTable').bootstrapTable("toggleView");
+        }
+
+        $('#dataTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#dataTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#dataTable').bootstrapTable('getSelections').length!=1);
+        });
+        $("#btnImport").click(function(){
+            jp.open({
+                type: 2,
+                area: [500, 200],
+                auto: true,
+                title:"导入数据",
+                content: "${ctx}/tag/importExcel" ,
+                btn: [/*'导出模板',*/'确定', '关闭'],
+                /*btn1: function () {
+                    jp.downloadFile('${ctx}/supply/materialLibrary/templates')  //模板放在哪?
+                },*/
+                btn1: function(index, layero){
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/supply/materialLibrary/import', function (data) {
+                        if(data.success){
+                            var body = data.body;
+                            var repeat = body.repeat;
+                            var filePath = body.filePath;
+                            if(repeat == 0) {
+                                jp.confirm('已存在物料数据,是否覆盖?', function () {
+                                    jp.loading();
+                                    jp.get("${ctx}/supply/materialLibrary/importTwo?repeat=1&filePath="+filePath+"", function (data) {
+                                        if (data.success) {
+                                            $('#reportTable').bootstrapTable('refresh');
+                                            jp.success(data.msg);
+                                            location.reload();
+                                        } else {
+                                            jp.error(data.msg);
+                                            location.reload();
+                                        }
+
+                                    })
+
+                                },function () {
+                                    jp.loading();
+                                    jp.get("${ctx}/supply/materialLibrary/importTwo?repeat=2&filePath="+filePath+"", function (data) {
+                                        if (data.success) {
+                                            $('#reportTable').bootstrapTable('refresh');
+                                            jp.success(data.msg);
+                                            location.reload();
+                                        } else {
+                                            jp.error(data.msg);
+                                            location.reload();
+                                        }
+
+                                    })
+                                })
+                            }else {
+                                jp.success(data.msg);
+                                refresh();
+                            }
+                        }else{
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function(index){
+                    //  jp.close(index);
+                }
+            });
+        });
+
+
+        //暂时未做
+        $("#export").click(function(){//导出Excel文件物料
+            var reserveProjectName = $("#reserveProjectName").val();//储备项目暂定名称:
+            var projectName = $("#projectName").val();//项目名称
+            var reserveCode = $("#reserveCode").val();//储备编码
+            var projectCode = $("#projectCode").val();//项目编码
+            var projectAttribute = $("#projectAttribute").val();//项目属性
+            var projectDefine = $("#projectDefine").val();//项目定义
+            var bat = $("#bat").val();//项目批次
+            jp.downloadFile('${ctx}/supply/materialLibrary/export?reserveProjectName='+reserveProjectName+'&projectName='+projectName+'&reserveCode='+reserveCode+'&projectCode='+projectCode+'&projectAttribute='+projectAttribute+'&projectBatch='+bat+'&projectDefine='+projectDefine);
+        });
+        $("#exportpro").click(function(){//导出Excel文件
+            jp.downloadFile('${ctx}/supply/materialLibrary/exportpro');
+        });
+
+
+        $("#search").click("click", function() {// 绑定查询按扭
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function() {// 绑定重置按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("");
+            $("#searchForm  .select-item").html("");
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        var picker1 = $('#beginDate').datetimepicker({
+            format: 'YYYY-MM-DD',
+            locale: moment.locale('zh-cn'),
+        });
+        var picker2 = $('#endDate').datetimepicker({
+            format: 'YYYY-MM-DD',
+            locale: moment.locale('zh-cn')
+        });
+
+    });
+
+function getIdSelections() {
+    return $.map($("#dataTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+
+function deleteAll(){
+    jp.confirm('确认要删除该记录信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/supply/materialLibrary/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#dataTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+
+//刷新列表
+function refresh(){
+    $('#dataTable').bootstrapTable('refresh');
+}
+
+function add(){
+    jp.openSaveDialog('新增', "${ctx}/supply/materialLibrary/form",'800px', '500px');
+}
+
+
+
+function edit(id){//没有权限时,不显示确定按钮
+    if(id == undefined){
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑', "${ctx}/supply/materialLibrary/form?id=" + id, '800px', '500px');
+}
+
+function view(id){//没有权限时,不显示确定按钮
+    if(id == undefined){
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看', "${ctx}/supply/materialLibrary/form?id=" + id, '800px', '500px');
+}
+
+
+
+</script>

+ 106 - 0
src/main/webapp/webpage/modules/supply/materialLibrary/supplyMaterialLibraryList.jsp

@@ -0,0 +1,106 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>物料库列表</title>
+	<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+	<meta name="decorator" content="ani"/>
+	<%@ include file="/webpage/include/bootstraptable.jsp"%>
+	<%@include file="/webpage/include/treeview.jsp" %>
+	<%@include file="supplyMaterialLibraryList.js" %>
+</head>
+<body>
+	<div class="wrapper wrapper-content">
+	<div class="panel panel-primary">
+	<div class="panel-heading">
+		<h3 class="panel-title">物料库列表</h3>
+	</div>
+	<div class="panel-body">
+
+	<!-- 搜索 -->
+	<div id="search-collapse" class="collapse">
+		<div class="accordion-inner">
+			<form:form id="searchForm" modelAttribute="materialLibrary" class="form form-horizontal well clearfix">
+			    <div class="col-xs-12 col-sm-4 col-md-4">
+				   <label class="label-item single-overflow pull-left" title="物料编码:">物料编码:</label>
+				   <form:input path="materialCode" htmlEscape="false" maxlength="64"  class=" form-control"/>
+			    </div>
+				<div class="col-xs-12 col-sm-4 col-md-4">
+					<label class="label-item single-overflow pull-left" title="物料描述:">物料描述:</label>
+					<form:input path="materialDescription" htmlEscape="false" maxlength="64"  class=" form-control"/>
+				</div>
+				<div class="col-xs-12 col-sm-4 col-md-4">
+					<label class="label-item single-overflow pull-left" title="计算单位:">计算单位:</label>
+					<form:input path="unitOfMeasurement" htmlEscape="false" maxlength="64"  class=" form-control"/>
+				</div>
+
+<%--				<div class="row">--%>
+<%--					<div class='col-sm-3'>--%>
+<%--						<div class="form-group">--%>
+<%--							<label>选择开始时间:</label>--%>
+<%--							<div class='input-group date' id='beginDate'>--%>
+<%--								<input type='text' name="beginDate" class="form-control" />--%>
+<%--								<span class="input-group-addon">--%>
+<%--									<span class="glyphicon glyphicon-calendar"/>--%>
+<%--								</span>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--					</div>--%>
+<%--					<div class='col-sm-3'>--%>
+<%--						<div class="form-group">--%>
+<%--							<label>选择结束时间:</label>--%>
+<%--							<div class='input-group date' id='endDate'>--%>
+<%--								<input type='text'  name="endDate" class="form-control" />--%>
+<%--								<span class="input-group-addon">--%>
+<%--									<span class="glyphicon glyphicon-calendar"/>--%>
+<%--								</span>--%>
+<%--							</div>--%>
+<%--						</div>--%>
+<%--					</div>--%>
+<%--				</div>--%>
+
+				 <div class="col-xs-12 col-sm-6 col-md-4">
+					<div style="margin-top:26px">
+					  <a  id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i class="fa fa-search"></i> 查询</a>
+					  <a  id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm" ><i class="fa fa-refresh"></i> 重置</a>
+					 </div>
+				</div>
+			</form:form>
+		</div>
+	</div>
+
+		<!-- 工具栏 -->
+			<div id="toolbar">
+<%--				<shiro:hasPermission name="supply:stockOut:del">--%>
+					<button id="remove" class="btn btn-danger" disabled onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+<%--				</shiro:hasPermission>--%>
+<%--				<shiro:hasPermission name="supply:stockOut:import">--%>
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入
+					</button>
+<%--				</shiro:hasPermission>--%>
+			</div>
+
+	<!-- 表格 -->
+	<table id="dataTable"  style="table-layout:fixed"   data-toolbar="#toolbar"></table>
+
+    <!-- context menu -->
+    <%--<ul id="context-menu" class="dropdown-menu">
+    	<shiro:hasPermission name="supply:stockOut:view">
+        <li data-item="view"><a>查看</a></li>
+        </shiro:hasPermission>
+    	<shiro:hasPermission name="supply:stockOut:edit">
+        <li data-item="edit"><a>编辑</a></li>
+        </shiro:hasPermission>
+        <shiro:hasPermission name="supply:stockOut:del">
+        <li data-item="delete"><a>删除</a></li>
+        </shiro:hasPermission>
+        <li data-item="action1"><a>取消</a></li>
+    </ul>--%>
+	</div>
+	</div>
+	</div>
+</body>
+</html>

+ 476 - 0
src/main/webapp/webpage/modules/supply/projectInformation/supplyProjectInformationList.js

@@ -0,0 +1,476 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+    <script>
+    $(document).ready(function() {
+        $('#dataTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber:1,
+            //每页的记录行数(*)
+            pageSize: 10,
+            //可供选择的每页的行数(*)
+            pageList: [10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/supply/projectInformation/data",
+            //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+            //queryParamsType:'',
+            ////查询参数,每次调用是会带上这个参数,可自定义
+            queryParams : function(params) {
+                var searchParam = $("#searchForm").serializeJSON();
+                searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+                searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+                searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                return searchParam;
+            },
+            //分页方式:client客户端分页,server服务端分页(*)
+            sidePagination: "server",
+            contextMenuTrigger:"right",//pc端 按右键弹出菜单
+            contextMenuTriggerMobile:"press",//手机端 弹出菜单,click:单击, press:长按。
+            contextMenu: '#context-menu',
+            onContextMenuItem: function(row, $el){
+                if($el.data("item") == "edit"){
+                    edit(row.id);
+                }else if($el.data("item") == "view"){
+                    view(row.id);
+                } else if($el.data("item") == "delete"){
+                    jp.confirm('确认要删除该数据记录吗?', function(){
+                        jp.loading();
+                        jp.get("${ctx}/supply/projectInformation/delete?id="+row.id, function(data){
+                            if(data.success){
+                                $('#dataTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            }else{
+                                jp.error(data.msg);
+                            }
+                        })
+
+                    });
+
+                }
+            },
+
+            onClickRow: function(row, $el){
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns: [{
+		        checkbox: true
+
+		    }
+			,{
+                field: 'projectDefinitionNumber',
+                title: '项目定义号',
+                    width:120,
+                sortName: 'projectDefinitionNumber'
+            },{
+                    field: 'projectName',
+                    title: '项目名称',
+                    width:210,
+                    sortName: 'projectName'
+                }
+                ,{
+                    field: 'projectType',
+                    title: '项目类型',
+                    width:150,
+                    sortName: 'projectType'
+                }
+                ,{
+                    field: 'voltageLeve',
+                    title: '电压等级',
+                    width:150,
+                    sortName: 'voltageLeve'
+                }
+                ,{
+                    field: 'projectReleaseYear',
+                    title: '项目下达年度',
+                    width:150,
+                    sortName: 'projectReleaseYear'
+                }
+                ,{
+                    field: 'projectBudgetYear',
+                    title: '项目预算年度',
+                    width:150,
+                    sortName: 'projectBudgetYear'
+                }
+                ,{
+                    field: 'totalProjectInvestment',
+                    title: '项目总投资',
+                    width:150,
+                    sortName: 'totalProjectInvestment'
+                }
+                ,{
+                    field: 'approvalReplyNo',
+                    title: '可研批复文号',
+                    width:150,
+                    sortName: 'approvalReplyNo'
+                }
+                ,{
+                    field: 'singleProjectWbsNo',
+                    title: '单体工程WBS编号',
+                    width:150,
+                    sortName: 'singleProjectWbsNo'
+                }
+                ,{
+                    field: 'engineeringNo',
+                    title: '工程编号',
+                    width:150,
+                    sortName: 'engineeringNo'
+                }
+                ,{
+                    field: 'engineeringName',
+                    title: '工程名称',
+                    width:150,
+                    sortName: 'engineeringName'
+                }
+                ,{
+                    field: 'contacts',
+                    title: '联系人',
+                    width:150,
+                    sortName: 'contacts'
+                }
+                ,{
+                    field: 'contactNumber',
+                    title: '联系电话',
+                    width:150,
+                    sortName: 'contactNumber'
+                }
+                ,{
+                    field: 'actualCommencementDate',
+                    title: '实际开工日期',
+                    width:150,
+                    sortName: 'actualCommencementDate'
+                }
+                ,{
+                    field: 'actualCompletionDate',
+                    title: '实际竣工日期',
+                    width:150,
+                    sortName: 'actualCompletionDate'
+                }
+                ,{
+                    field: 'constructionUnit',
+                    title: '施工单位',
+                    width:150,
+                    sortName: 'constructionUnit'
+                }
+                ,{
+                    field: 'contractNo',
+                    title: '合同编号',
+                    width:150,
+                    sortName: 'contractNo'
+                }
+                ,{
+                    field: 'contractAmount',
+                    title: '合同金额',
+                    width:150,
+                    sortName: 'contractAmount'
+                }
+                ,{
+                    field: 'settlementDiscountRate',
+                    title: '结算折扣率',
+                    width:150,
+                    sortName: 'settlementDiscountRate'
+                }
+                ,{
+                    field: 'plannedCommencementDate',
+                    title: '计划开工日期',
+                    width:150,
+                    sortName: 'plannedCommencementDate'
+                }
+                ,{
+                    field: 'plannedCompletionDate',
+                    title: '计划竣工日期',
+                    width:150,
+                    sortName: 'plannedCompletionDate'
+                }
+                ,{
+                    field: 'civilEngineeringAmountSubmittedForApproval',
+                    title: '土建送审金额',
+                    width:150,
+                    sortName: 'civilEngineeringAmountSubmittedForApproval'
+                }
+                ,{
+                    field: 'installAmountSubmittedForApproval',
+                    title: '安装送审金额',
+                    width:150,
+                    sortName: 'installAmountSubmittedForApproval'
+                }
+                ,{
+                    field: 'subtotalOfConstructionCostSubmittedForApproval',
+                    title: '送审施工费小计',
+                    width:150,
+                    sortName: 'subtotalOfConstructionCostSubmittedForApproval'
+                }
+                ,{
+                    field: 'amountOfMaterialsProvidedByPartyAForApproval',
+                    title: '甲供材送审金额',
+                    width:150,
+                    sortName: 'amountOfMaterialsProvidedByPartyAForApproval'
+                }
+                ,{
+                    field: 'commentsOnSubmissionForApproval',
+                    title: '送审备注',
+                    width:150,
+                    sortName: 'commentsOnSubmissionForApproval'
+                }
+                ,{
+                    field: 'firmName',
+                    title: '事务所名称',
+                    width:150,
+                    sortName: 'firmName'
+                }
+                ,{
+                    field: 'auditManagementLevel',
+                    title: '审计管理级别',
+                    width:150,
+                    sortName: 'auditManagementLevel'
+                }
+                ,{
+                    field: 'auditMethod',
+                    title: '审计方式',
+                    width:150,
+                    sortName: 'auditMethod'
+                }
+                ,{
+                    field: 'fullTimeAuditor',
+                    title: '审计专职',
+                    width:150,
+                    sortName: 'fullTimeAuditor'
+                }
+                ,{
+                    field: 'submitter',
+                    title: '送审人',
+                    width:150,
+                    sortName: 'submitter'
+                }
+                ,{
+                    field: 'submissionDepartment',
+                    title: '送审部门',
+                    width:150,
+                    sortName: 'submissionDepartment'
+                }
+                ,{
+                    field: 'secondaryUnit',
+                    title: '二级单位',
+                    width:150,
+                    sortName: 'secondaryUnit'
+                }
+                ,{
+                    field: 'primaryUnit',
+                    title: '一级单位',
+                    width:150,
+                    sortName: 'primaryUnit'
+                }
+                ,{
+                    field: 'submissionStatus',
+                    title: '送审状态',
+                    width:150,
+                    sortName: 'submissionStatus'
+                }
+                ,{
+                    field: 'submissionFormId',
+                    title: '送审单id',
+                    width:150,
+                    sortName: 'submissionFormId'
+                }
+                ,{
+                    field: 'tableBuildingTime',
+                    title: '建表时间',
+                    width:150,
+                    sortName: 'tableBuildingTime'
+                }
+
+
+
+            ]
+
+        });
+
+        if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){//如果是移动端
+
+
+            $('#dataTable').bootstrapTable("toggleView");
+        }
+
+        $('#dataTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', ! $('#dataTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#dataTable').bootstrapTable('getSelections').length!=1);
+        });
+        $("#btnImport").click(function(){
+            jp.open({
+                type: 2,
+                area: [500, 200],
+                auto: true,
+                title:"导入数据",
+                content: "${ctx}/tag/importExcel" ,
+                btn: [/*'导出模板',*/'确定', '关闭'],
+                /*btn1: function () {
+                    jp.downloadFile('${ctx}/supply/materialLibrary/templates')  //模板放在哪?
+                },*/
+                btn1: function(index, layero){
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/supply/projectInformation/import', function (data) {
+                        if(data.success){
+                            var body = data.body;
+                            var repeat = body.repeat;
+                            var filePath = body.filePath;
+                            if(repeat == 0) {
+                                jp.confirm('已存在物料数据,是否覆盖?', function () {
+                                    jp.loading();
+                                    jp.get("${ctx}/supply/projectInformation/importTwo?repeat=1&filePath="+filePath+"", function (data) {
+                                        if (data.success) {
+                                            $('#reportTable').bootstrapTable('refresh');
+                                            jp.success(data.msg);
+                                            location.reload();
+                                        } else {
+                                            jp.error(data.msg);
+                                            location.reload();
+                                        }
+
+                                    })
+
+                                },function () {
+                                    jp.loading();
+                                    jp.get("${ctx}/supply/projectInformation/importTwo?repeat=2&filePath="+filePath+"", function (data) {
+                                        if (data.success) {
+                                            $('#reportTable').bootstrapTable('refresh');
+                                            jp.success(data.msg);
+                                            location.reload();
+                                        } else {
+                                            jp.error(data.msg);
+                                            location.reload();
+                                        }
+
+                                    })
+                                })
+                            }else {
+                                jp.success(data.msg);
+                                refresh();
+                            }
+                        }else{
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn2: function(index){
+                    //  jp.close(index);
+                }
+            });
+        });
+
+
+        //暂时未做
+        $("#export").click(function(){//导出Excel文件物料
+            var reserveProjectName = $("#reserveProjectName").val();//储备项目暂定名称:
+            var projectName = $("#projectName").val();//项目名称
+            var reserveCode = $("#reserveCode").val();//储备编码
+            var projectCode = $("#projectCode").val();//项目编码
+            var projectAttribute = $("#projectAttribute").val();//项目属性
+            var projectDefine = $("#projectDefine").val();//项目定义
+            var bat = $("#bat").val();//项目批次
+            jp.downloadFile('${ctx}/supply/projectInformation/export?reserveProjectName='+reserveProjectName+'&projectName='+projectName+'&reserveCode='+reserveCode+'&projectCode='+projectCode+'&projectAttribute='+projectAttribute+'&projectBatch='+bat+'&projectDefine='+projectDefine);
+        });
+        $("#exportpro").click(function(){//导出Excel文件
+            jp.downloadFile('${ctx}/supply/projectInformation/exportpro');
+        });
+
+
+        $("#search").click("click", function() {// 绑定查询按扭
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function() {// 绑定重置按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("");
+            $("#searchForm  .select-item").html("");
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        var picker1 = $('#beginDate').datetimepicker({
+            format: 'YYYY-MM-DD',
+            locale: moment.locale('zh-cn'),
+        });
+        var picker2 = $('#endDate').datetimepicker({
+            format: 'YYYY-MM-DD',
+            locale: moment.locale('zh-cn')
+        });
+
+    });
+
+function getIdSelections() {
+    return $.map($("#dataTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+
+function deleteAll(){
+    jp.confirm('确认要删除该记录信息吗?', function(){
+        jp.loading();
+        jp.get("${ctx}/supply/projectInformation/deleteAll?ids=" + getIdSelections(), function(data){
+            if(data.success){
+                $('#dataTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            }else{
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+
+//刷新列表
+function refresh(){
+    $('#dataTable').bootstrapTable('refresh');
+}
+
+function add(){
+    jp.openSaveDialog('新增', "${ctx}/supply/projectInformation/form",'800px', '500px');
+}
+
+
+
+function edit(id){//没有权限时,不显示确定按钮
+    if(id == undefined){
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑', "${ctx}/supply/projectInformation/form?id=" + id, '800px', '500px');
+}
+
+function view(id){//没有权限时,不显示确定按钮
+    if(id == undefined){
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看', "${ctx}/supply/projectInformation/form?id=" + id, '800px', '500px');
+}
+
+
+
+</script>

+ 103 - 0
src/main/webapp/webpage/modules/supply/projectInformation/supplyProjectInformationList.jsp

@@ -0,0 +1,103 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>项目信息列表</title>
+	<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+	<meta name="decorator" content="ani"/>
+	<%@ include file="/webpage/include/bootstraptable.jsp"%>
+	<%@include file="/webpage/include/treeview.jsp" %>
+	<%@include file="supplyProjectInformationList.js" %>
+</head>
+<body>
+	<div class="wrapper wrapper-content">
+	<div class="panel panel-primary">
+	<div class="panel-heading">
+		<h3 class="panel-title">项目信息列表</h3>
+	</div>
+	<div class="panel-body">
+
+	<!-- 搜索 -->
+	<div id="search-collapse" class="collapse">
+		<div class="accordion-inner">
+			<form:form id="searchForm" modelAttribute="projectInformation" class="form form-horizontal well clearfix">
+			    <div class="col-xs-12 col-sm-4 col-md-4">
+				   <label class="label-item single-overflow pull-left" title="项目定义号:">项目定义号:</label>
+				   <form:input path="projectDefinitionNumber" htmlEscape="false" maxlength="64"  class=" form-control"/>
+			    </div>
+				<div class="col-xs-12 col-sm-4 col-md-4">
+					<label class="label-item single-overflow pull-left" title="送审单id:">送审单id:</label>
+					<form:input path="submissionFormId" htmlEscape="false" maxlength="64"  class=" form-control"/>
+				</div>
+
+
+				<div class="row">
+					<div class='col-sm-3'>
+						<div class="form-group">
+							<label>选择开始时间:</label>
+							<div class='input-group date' id='beginDate'>
+								<input type='text' name="beginDate" class="form-control" />
+								<span class="input-group-addon">
+									<span class="glyphicon glyphicon-calendar"/>
+								</span>
+							</div>
+						</div>
+					</div>
+					<div class='col-sm-3'>
+						<div class="form-group">
+							<label>选择结束时间:</label>
+							<div class='input-group date' id='endDate'>
+								<input type='text'  name="endDate" class="form-control" />
+								<span class="input-group-addon">
+									<span class="glyphicon glyphicon-calendar"/>
+								</span>
+							</div>
+						</div>
+					</div>
+				</div>
+
+				 <div class="col-xs-12 col-sm-6 col-md-4">
+					<div style="margin-top:26px">
+					  <a  id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i class="fa fa-search"></i> 查询</a>
+					  <a  id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm" ><i class="fa fa-refresh"></i> 重置</a>
+					 </div>
+				</div>
+			</form:form>
+		</div>
+	</div>
+
+		<!-- 工具栏 -->
+			<div id="toolbar">
+<%--				<shiro:hasPermission name="supply:stockOut:del">--%>
+					<button id="remove" class="btn btn-danger" disabled onclick="deleteAll()">
+						<i class="glyphicon glyphicon-remove"></i> 删除
+					</button>
+<%--				</shiro:hasPermission>--%>
+<%--				<shiro:hasPermission name="supply:stockOut:import">--%>
+					<button id="btnImport" class="btn btn-info">
+						<i class="fa fa-folder-open-o"></i> 导入
+					</button>
+<%--				</shiro:hasPermission>--%>
+			</div>
+
+	<!-- 表格 -->
+	<table id="dataTable"  style="table-layout:fixed"   data-toolbar="#toolbar"></table>
+
+    <!-- context menu -->
+    <%--<ul id="context-menu" class="dropdown-menu">
+    	<shiro:hasPermission name="supply:stockOut:view">
+        <li data-item="view"><a>查看</a></li>
+        </shiro:hasPermission>
+    	<shiro:hasPermission name="supply:stockOut:edit">
+        <li data-item="edit"><a>编辑</a></li>
+        </shiro:hasPermission>
+        <shiro:hasPermission name="supply:stockOut:del">
+        <li data-item="delete"><a>删除</a></li>
+        </shiro:hasPermission>
+        <li data-item="action1"><a>取消</a></li>
+    </ul>--%>
+	</div>
+	</div>
+	</div>
+</body>
+</html>