Browse Source

存量用地修改 租房类型的关联合同

huZhiHao 5 năm trước cách đây
mục cha
commit
d195316250

+ 2 - 2
sql/20200326.sql

@@ -1,3 +1,3 @@
 ALTER TABLE industrial_land_supply ADD countersign_comment text COLLATE utf8_bin COMMENT '会签说明'
-ALTER TABLE industrial_land_supply ADD  content_text text COLLATE utf8_bin COMMENT '介绍 纯文本格式' AFTER content
-ALTER TABLE industrial_land_supply ADD  consultation_summary_text text COLLATE utf8_bin COMMENT '介绍 纯文本格式' AFTER consultation_summary
+ALTER TABLE industrial_land_supply ADD content_text text COLLATE utf8_bin COMMENT '介绍 纯文本格式' AFTER content
+ALTER TABLE industrial_land_supply ADD consultation_summary_text text COLLATE utf8_bin COMMENT '介绍 纯文本格式' AFTER consultation_summary

+ 2 - 0
sql/20200402.sql

@@ -34,3 +34,5 @@ SET FOREIGN_KEY_CHECKS = 1;
 
 INSERT INTO `service_platform`.`sys_menu`(`id`, `parent_id`, `name`, `user_type`, `url`, `permission`, `sort`, `levels`, `create_by`, `create_name`, `create_time`, `update_by`, `update_name`, `update_time`, `del_flag`, `is_mobile`) VALUES (370, 363, '产业供地配置', 0, '\"\"', 'G_LAND_SUPPLY_CONFIG', 0, NULL, -1, '系统', '2020-03-05', NULL, NULL, NULL, 0, 0);
 
+
+ALTER TABLE c_stock_land_apply ADD contract_id int(20)  COLLATE utf8_bin COMMENT '合同id'

+ 4 - 4
src/main/java/platform/modules/carrier/entity/Contract.java

@@ -20,11 +20,11 @@ public class Contract extends BaseEntity {
 
     private String company_name;                //公司名称
 
-    private String organization_code;                     //组织机构代码
+    private String organization_code;           //组织机构代码
 
-    private String uscc;                       //同意社会信用代码
+    private String uscc;                       //统一社会信用代码
 
-    private Integer company_id;                     //企业id
+    private Integer company_id;                //企业id
 
     private String contract_no;                 //合同编号
 
@@ -55,7 +55,7 @@ public class Contract extends BaseEntity {
     @Transient
     private Double floor_area;                  //楼层面积
     @Transient
-        private String state_code;                  //合同状态
+    private String state_code;                  //合同状态
     @Transient
     private String file_down_url;
 

+ 35 - 2
src/main/java/platform/modules/carrier/service/IcContractService.java

@@ -82,7 +82,7 @@ public class IcContractService extends BaseService<Contract> {
             contract.setStatus(1);//合同未生效
         }
 
-        Integer i = this.insertAndGetId(contract);
+        Integer id = this.insertAndGetId(contract);
         if (!CollectionUtils.isEmpty(floorList)) {
             for (ContractFloor contractFloor : floorList) {
                 BuildFloor floor = floorService.findById(contractFloor.getFloor_id());
@@ -99,6 +99,7 @@ public class IcContractService extends BaseService<Contract> {
                     }
                 }
                 floorService.updateSelective(floor);
+                contractFloor.setContract_id(id);
                 contractFloor.setPark_id(contract.getPark_id());
                 contractFloor.setCompany_id(contract.getCompany_id());
                 contractFloor.setCompany_name(contract.getCompany_name());
@@ -110,7 +111,7 @@ public class IcContractService extends BaseService<Contract> {
                 contractFloorService.save(contractFloor);
             }
         }
-        return i;
+        return id;
     }
 
     /**
@@ -304,6 +305,38 @@ public class IcContractService extends BaseService<Contract> {
         return contract;
     }
 
+    public Contract getDeatailById(Integer id) {
+
+        Contract contract = this.findById(id);
+
+        ContractFloor contractFloor = new ContractFloor();
+        contractFloor.setContract_id(contract.getId());
+        List<ContractFloor> floors = contractFloorService.findListByWhere(contractFloor);
+        contract.setFloors(floors);
+        Park park = parkService.findById(contract.getPark_id());
+        if (park != null) {
+            contract.setPark_name(park.getName());
+        }
+        return contract;
+    }
+
+    public Contract getDeatailByCompanyId(Integer id) {
+
+        Contract contract = new Contract();
+        contract.setDel_flag(false);
+        contract.setCompany_id(id);
+        contract  = this.findOne(contract);
+        ContractFloor contractFloor = new ContractFloor();
+        contractFloor.setContract_id(contract.getId());
+        List<ContractFloor> floors = contractFloorService.findListByWhere(contractFloor);
+        contract.setFloors(floors);
+        Park park = parkService.findById(contract.getPark_id());
+        if (park != null) {
+            contract.setPark_name(park.getName());
+        }
+        return contract;
+    }
+
     /**
      * 获取规定时间内到期合同
      *

+ 13 - 12
src/main/java/platform/modules/company/dto/StockLandApprovalDto.java

@@ -5,25 +5,26 @@ import java.util.List;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import platform.modules.carrier.entity.Contract;
 import platform.modules.government.entity.FileDown;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
 public class StockLandApprovalDto {
-	
-	 private Integer apply_id;
-	 private String status;	// 1退回,2通过,3不通过
-	 private String approval_comment;
-	 
-	 private String approval_department;//审核部门
-	 
-	 private List<FileDown> fileDowns;
 
-	/**
-	 * 审核状态
-	 */
-	 private String statu;
+    private Integer apply_id;
+    private String status;    // 1退回,2通过,3不通过
+    private String approval_comment;
 
+    private String approval_department;//审核部门
 
+    private List<FileDown> fileDowns;
+
+    /**
+     * 审核状态
+     */
+    private String statu;
+
+    private Contract contract;
 }

+ 2 - 0
src/main/java/platform/modules/company/entity/StockLand.java

@@ -38,6 +38,8 @@ public class StockLand extends BaseEntity{
 
 	private Integer building_street_id;	//厂房所在属地id
 
+	private Integer contract_id;	//厂房所在属地id
+
 	@Transient
 	private String building_street_name;//厂房所在属地名称
 	

+ 60 - 3
src/main/java/platform/modules/company/service/StockLandApproveService.java

@@ -22,10 +22,18 @@ import platform.common.exception.BaseException;
 import platform.common.util.AlibabaSMSUtil;
 import platform.common.util.DateUtil;
 import platform.common.util.ShiroUtils;
+import platform.modules.build.entity.BuildFloor;
 import platform.modules.build.entity.Company;
 import platform.modules.build.entity.CompanyContact;
 import platform.modules.build.service.CompanyContactService;
 import platform.modules.build.service.CompanyService;
+import platform.modules.build.service.ContractService;
+import platform.modules.build.service.FloorService;
+import platform.modules.carrier.entity.Building;
+import platform.modules.carrier.entity.Contract;
+import platform.modules.carrier.entity.ContractFloor;
+import platform.modules.carrier.service.BuildingService;
+import platform.modules.carrier.service.IcContractService;
 import platform.modules.company.dao.StockLandDao;
 import platform.modules.company.dto.StockLandApprovalDto;
 import platform.modules.company.dto.TypeAndStreetDto;
@@ -49,6 +57,7 @@ import platform.modules.sys.service.MessageService;
 import platform.modules.sys.service.UserGroupService;
 import platform.modules.sys.service.WaitToDoService;
 
+import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -73,13 +82,13 @@ public class StockLandApproveService extends BaseService<StockLand> {
     @Autowired
     private ApprovalService approvalService;
 
-    @Autowired
+    @Resource
     private UserGroupDao userGroupDao;
 
-    @Autowired
+    @Resource
     private StockLandDao stockLandDao;
 
-    @Autowired
+    @Resource
     private AttachmentDao attachmentDao;
 
     @Autowired
@@ -109,6 +118,18 @@ public class StockLandApproveService extends BaseService<StockLand> {
     @Autowired
     private WaitToDoService waitToDoService;
 
+    @Autowired
+    private IcContractService contractService;
+
+    @Autowired
+    private CompanyService companyService;
+
+    @Autowired
+    private BuildingService buildingService;
+
+    @Autowired
+    private FloorService floorService;
+
     /**
      * 审核列表数据
      *
@@ -218,6 +239,7 @@ public class StockLandApproveService extends BaseService<StockLand> {
         if (null != apply) {
             if (apply.getApply_type().equals(Constant.LandApplyType.RENT)) {
                 //房屋出租
+                this.saveContract(approval);
                 return rentAuditLocal(apply, approval);
             } else {
                 return auditLocal(apply, approval);
@@ -227,6 +249,41 @@ public class StockLandApproveService extends BaseService<StockLand> {
         return false;
     }
 
+    private int saveContract(StockLandApprovalDto approval) {
+
+        StockLand stockland = stockLandService.findLandApplyById(approval.getApply_id());
+        Company company = companyService.findCompanyInfo(stockland.getCompany_id());
+
+        Contract contract = approval.getContract();
+        List<ContractFloor> floors = contract.getFloors();
+        Iterator<ContractFloor> it = floors.iterator();
+        Double area = 0d;
+        while (it.hasNext()) {
+            ContractFloor floor = it.next();
+            if (floor.getFloor_id() == null) {
+                it.remove();
+            } else {
+                BuildFloor buildFloor = floorService.findById(floor.getFloor_id());
+                Building building = buildingService.findBuildingById(buildFloor.getBuilding_id());
+                floor.setFloor(buildFloor.getFloor());
+                floor.setBuilding_id(building.getId());
+                floor.setBuilding_name(building.getBuild_name());
+                area += floor.getArea();
+            }
+        }
+        contract.setFloors(floors);
+        contract.setCompany_id(company.getId());
+        contract.setCompany_name(company.getCompany_name());
+        contract.setArea(area);
+        contract.setOrganization_code(company.getOrganization_code());
+        contract.setUscc(company.getUscc());
+        int contractId = contractService.saveContract(contract);
+
+        stockland.setContract_id(contractId);
+        stockLandService.updateSelective(stockland);
+        return contractId;
+    }
+
     //房屋出租审核街道属地初审
     private Boolean rentAuditLocal(StockLand apply, StockLandApprovalDto approval) {
         Boolean flag = true;

+ 46 - 26
src/main/java/platform/modules/company/web/StockLandApproveController.java

@@ -3,6 +3,7 @@ package platform.modules.company.web;
 import java.util.List;
 import java.util.Objects;
 
+import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +30,10 @@ import platform.common.exception.BaseException;
 import platform.common.util.ShiroUtils;
 import platform.modules.build.entity.Company;
 import platform.modules.build.service.CompanyService;
+import platform.modules.carrier.entity.Contract;
+import platform.modules.carrier.entity.Park;
+import platform.modules.carrier.service.IcContractService;
+import platform.modules.carrier.service.ParkService;
 import platform.modules.company.dto.ProcessNodeDto;
 import platform.modules.company.dto.StockLandApprovalDto;
 import platform.modules.company.dto.TypeAndStreetDto;
@@ -85,6 +90,12 @@ public class StockLandApproveController extends BaseController {
     @Autowired
     private ProjectApplicationCompanyInfoService projectApplicationCompanyInfoService;
 
+    @Autowired
+    private ParkService parkService;
+
+    @Autowired
+    private IcContractService icContractService;
+
     /**
      * 存量用地审核列表
      *
@@ -94,7 +105,7 @@ public class StockLandApproveController extends BaseController {
      * @return
      * @throws Exception
      */
-    @OperationLog(value="查看存量用地审核列表")
+    @OperationLog(value = "查看存量用地审核列表")
     @GetMapping(value = "/approveList/{isPendingAudit}")
     public String list(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@@ -122,7 +133,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="查看存量用地审核详情")
+    @OperationLog(value = "查看存量用地审核详情")
     @GetMapping(value = "/checkApprove/{id}")
     public String checkApprove(ModelMap modelMap, @PathVariable("id") Integer id) {
         log.info("跳转到用地审核详情页面!");
@@ -141,11 +152,11 @@ public class StockLandApproveController extends BaseController {
             //modelMap.put("companyInfo", companyService.getCompanyInfo(companyId));//企业信息
             //企业信息
             ProjectApplicationCompanyInfo companyInfo = projectApplicationCompanyInfoService.findByApplyIdAndType(id, Constant.DictionaryType.STOCKLAND);
-            
-            if(null == companyInfo) {
-            	companyInfo = projectApplicationCompanyInfoService.getCompanyInfoByCompany(companyService.getCompanyInfo(landApply.getCompany_id()));
+
+            if (null == companyInfo) {
+                companyInfo = projectApplicationCompanyInfoService.getCompanyInfoByCompany(companyService.getCompanyInfo(landApply.getCompany_id()));
             }
-            
+
             //
             if (Objects.equals(companyInfo.getIndustry_code(), "Empty")) {
                 companyInfo.setIndustry_code(companyInfo.getIndustry_name());
@@ -155,6 +166,13 @@ public class StockLandApproveController extends BaseController {
 
             modelMap.put("companyInfo", companyInfo);
 
+            Contract contract = icContractService.getDeatailById(landApply.getContract_id());
+            if(contract == null){
+                modelMap.put("contract", new Contract());
+            }else{
+                modelMap.put("contract", contract);
+            }
+
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -202,6 +220,8 @@ public class StockLandApproveController extends BaseController {
             //如果是房屋出租,通过,不通过,退回直接弹出确认通知框
             if (landApply.getApply_type().equals(Constant.LandApplyType.RENT)) {
                 modelMap.put("isRent", true);
+                //如果是租住管理 获取本街道的所有园区
+                modelMap.put("parkList", parkService.findParkListByStreetId(companyInfo.getStreet_id()));
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -216,17 +236,17 @@ public class StockLandApproveController extends BaseController {
      * @param approval
      * @return
      */
-    @OperationLog(value="审核存量用地申请")
+    @OperationLog(value = "审核存量用地申请")
     @ResponseBody
     @PostMapping(value = "/approve")
     public ResponseMessage approve(ModelMap modelMap, StockLandApprovalDto approval) {
-    	if(IsTooFrequently()) {
-	        return ResponseMessage.success("操作过于频繁,请稍后再试!");
-    	}
+        if (IsTooFrequently()) {
+            return ResponseMessage.success("操作过于频繁,请稍后再试!");
+        }
         log.info("存量用地审核");
         try {
             //判断当前是否是审核人
-            if (!stockLandApproveService.isCurrChecker(approval.getApply_id() , approval)) {
+            if (!stockLandApproveService.isCurrChecker(approval.getApply_id(), approval)) {
                 return ResponseMessage.error("用户不是单据当前审核人!单据已被审核或撤回!");
             }
             Boolean flag = stockLandApproveService.approve(approval);
@@ -272,7 +292,7 @@ public class StockLandApproveController extends BaseController {
      * @param modelMap
      * @return
      */
-    @OperationLog(value="确认存量用地审核状态并通知企业")
+    @OperationLog(value = "确认存量用地审核状态并通知企业")
     @ResponseBody
     @PostMapping(value = "/confirm")
     public ResponseMessage confirm(ModelMap modelMap, Message message) {
@@ -282,7 +302,7 @@ public class StockLandApproveController extends BaseController {
             Boolean msgFlag = stockLandApproveService.sendMsg(message);
             if (flag && msgFlag) {
                 return ResponseMessage.success("操作成功!");
-            }else if (flag && !msgFlag) {
+            } else if (flag && !msgFlag) {
                 return ResponseMessage.success("通知成功!由于企业没有联系人,短信发送失败!");
             } else {
                 logger.error("其他错误");
@@ -324,7 +344,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="查看存量用地进程反馈")
+    @OperationLog(value = "查看存量用地进程反馈")
     @GetMapping(value = "/feedbackPage/{id}")
     public String feedbackPage(ModelMap modelMap, @PathVariable("id") Integer id) {
         log.info("跳转到用地审核进程反馈页面!");
@@ -347,7 +367,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="添加存量用地进程反馈")
+    @OperationLog(value = "添加存量用地进程反馈")
     @ResponseBody
     @PostMapping(value = "/processFeedback")
     public ResponseMessage processFeedback(ModelMap modelMap, ProcessFeedback feedback) {
@@ -370,7 +390,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="查看存量用地进程反馈")
+    @OperationLog(value = "查看存量用地进程反馈")
     @GetMapping(value = "/checkFeedback/{id}")
     public String checkFeedback(ModelMap modelMap, @PathVariable("id") Integer id) {
         log.info("跳转到用地线下操作进程反馈查看页面!");
@@ -393,7 +413,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="编辑存量用地进程反馈")
+    @OperationLog(value = "编辑存量用地进程反馈")
     @GetMapping(value = "/editFeedback/{id}")
     public String editFeedback(ModelMap modelMap, @PathVariable("id") Integer id) {
         log.info("跳转到用地线下操作进程反馈查看页面!");
@@ -420,7 +440,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return
      */
-    @OperationLog(value="删除存量用地进程反馈")
+    @OperationLog(value = "删除存量用地进程反馈")
     @ResponseBody
     @DeleteMapping(value = "/deleteFeedback/{id}")
     public ResponseMessage deleteFeedback(ModelMap modelMap, @PathVariable("id") Integer id) {
@@ -444,7 +464,7 @@ public class StockLandApproveController extends BaseController {
      * @return String
      * @throws Exception
      */
-    @OperationLog(value="查看存量用地审核通过列表")
+    @OperationLog(value = "查看存量用地审核通过列表")
     @GetMapping(value = "/passPage")
     public String passPage(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, ModelMap modelMap) throws Exception {
@@ -480,7 +500,7 @@ public class StockLandApproveController extends BaseController {
      * @return String
      * @throws Exception
      */
-    @OperationLog(value="查看存量用地列表")
+    @OperationLog(value = "查看存量用地列表")
     @GetMapping(value = "/selectPage")
     public String selectPage(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, ModelMap modelMap) throws Exception {
@@ -505,7 +525,7 @@ public class StockLandApproveController extends BaseController {
      * @return String
      * @throws Exception
      */
-    @OperationLog(value="查看街道存量用地列表")
+    @OperationLog(value = "查看街道存量用地列表")
     @GetMapping(value = "/passList")
     public String passList(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, String keyword,
@@ -539,7 +559,7 @@ public class StockLandApproveController extends BaseController {
      * @param id
      * @return String
      */
-    @OperationLog(value="查看存量用地审核通过详情")
+    @OperationLog(value = "查看存量用地审核通过详情")
     @GetMapping(value = "/passApproveCheck/{id}")
     public String passApproveCheck(ModelMap modelMap, @PathVariable("id") Integer id) {
         log.info("跳转到审核通过详情页面!");
@@ -572,7 +592,7 @@ public class StockLandApproveController extends BaseController {
      * @return String
      * @throws Exception
      */
-    @OperationLog(value="查看存量用地审核列表")
+    @OperationLog(value = "查看存量用地审核列表")
     @GetMapping(value = "/selectList")
     public String selectList(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@@ -600,8 +620,8 @@ public class StockLandApproveController extends BaseController {
         modelMap.put("approveItemList", approveItemList);
         return BASE_COMPANY_PATH + "stock_land/approve_select_list";
     }
-    
-    @OperationLog(value="查看街道存量用地审核列表")
+
+    @OperationLog(value = "查看街道存量用地审核列表")
     @GetMapping(value = "/passPageOnStreet")
     public String passListOnStreet(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@@ -623,7 +643,7 @@ public class StockLandApproveController extends BaseController {
      *
      * @return
      */
-    @OperationLog(value="撤回存量用地审核")
+    @OperationLog(value = "撤回存量用地审核")
     @PostMapping(value = "/withdraw/{id}")
     @ResponseBody
     public ResponseMessage withdrawApply(ModelMap modelMap, @PathVariable("id") Integer id) {

+ 38 - 0
src/main/java/platform/modules/company/web/StockLandController.java

@@ -25,10 +25,15 @@ import platform.common.base.service.DictionaryItemService;
 import platform.common.exception.BaseException;
 import platform.common.util.ShiroUtils;
 import platform.modules.build.DTO.CompanyDto;
+import platform.modules.build.entity.BuildFloor;
 import platform.modules.build.entity.Company;
 import platform.modules.build.entity.CompanyContact;
 import platform.modules.build.service.CompanyContactService;
 import platform.modules.build.service.CompanyService;
+import platform.modules.build.service.FloorService;
+import platform.modules.carrier.entity.Building;
+import platform.modules.carrier.service.BuildingService;
+import platform.modules.carrier.service.ParkService;
 import platform.modules.company.dto.ProcessNodeDto;
 import platform.modules.company.entity.ProjectApplicationCompanyInfo;
 import platform.modules.company.entity.StockLand;
@@ -72,6 +77,12 @@ public class StockLandController extends BaseController {
     @Autowired
     private CompanyContactService companyContactService;
 
+    @Autowired
+    private BuildingService buildingService;
+
+    @Autowired
+    private FloorService floorService;
+
     /**
      * 存量用地申请列表
      *
@@ -378,4 +389,31 @@ public class StockLandController extends BaseController {
         return ResponseMessage.error("公司不存在!");
     }
 
+    @GetMapping(value = "/contract_building_data")
+    @ResponseBody
+    public Object contractBuildingData(@RequestParam(value = "parkId", required = false) Integer parkId) {
+
+        log.info("获取合同级联菜单!");
+
+        ModelMap modelMap = new ModelMap();
+
+        List<Building> buildingList = buildingService.findByParkId(parkId);
+        modelMap.put("buildingList",buildingList);
+
+        return ResponseMessage.success("success", modelMap);
+    }
+
+    @GetMapping(value = "/contract_floor_data")
+    @ResponseBody
+    public Object contractFloorData(@RequestParam(value = "buildingId", required = false) Integer buildingId) {
+
+        log.info("获取合同级联菜单!");
+
+        ModelMap modelMap = new ModelMap();
+
+        List<BuildFloor> floorList = floorService.findByBuildId(buildingId);
+        modelMap.put("floorList",floorList);
+
+        return ResponseMessage.success("success", modelMap);
+    }
 }

+ 220 - 178
src/main/resources/templates/admin/company/stock_land/approve_check.html

@@ -81,10 +81,10 @@
                 [[${landApply.apply_type_str}]]
             </div>
         </div>
-        <div class="row cl" >
-        	<label class="form-label col-xs-4 col-sm-2">厂房所在属地:</label>
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2">厂房所在属地:</label>
             <div class="formControls col-xs-8 col-sm-9">
-            	[[${landApply.building_street_name}]]
+                [[${landApply.building_street_name}]]
             </div>
         </div>
         <div class="row cl">
@@ -101,111 +101,152 @@
         </div>
         <div class="line">基准材料</div>
         <div class="row cl">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-		        <table class="table table-border table-bordered table-bg table-hover">
-		            <thead>
-		            <tr class="text-c">
-		                <th>编号</th>
-		                <th>内容</th>
-		                <th>下载材料</th>
-		            </tr>
-		            </thead>
-		            <tbody>
-		            <tr class="text-c" th:each="model,iterStat:${applyMaterials}" th:object="${model}">
-		                <td th:text="${iterStat.index+1}"></td>
-		                <td th:text="*{content}"></td>
-		                <td class="td_material" >
-		                	<div th:if="*{fileDown}">
-		                		<!-- th:href="{fileDown.download_uri} + *{fileDown.file_url}" -->
-		                		<a download th:href="${fileUrl} + *{fileDown.file_url}"  target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                	</div>
-		                </td>
-		            </tr>
-		            </tbody>
-		        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>内容</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="text-c" th:each="model,iterStat:${applyMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td th:text="*{content}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <!-- th:href="{fileDown.download_uri} + *{fileDown.file_url}" -->
+                                <a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"
+                                   style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <div th:if="${landApply.summary_procedure}" class="line">简易程序材料</div>
         <div th:if="${landApply.summary_procedure}" class="row cl" id="summaryMaterials">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-			        <table class="table table-border table-bordered table-bg table-hover ">
-			            <thead>
-			            <tr class="text-c">
-			            	<th>编号</th>
-			                <th>下载材料</th>
-			            </tr>
-			            </thead>
-			            <tbody class="add_file_line">
-			            <tr class="text-c" th:each="model,iterStat:${summaryMaterials}" th:object="${model}" >
-			            	<td th:text="${iterStat.index+1}"></td>
-			                <td class="td_material">
-			                	 <div th:if="*{fileDown}">
-		                			<!-- <a th:href="{fileDown.download_uri} + *{fileDown.file_url}" target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a> -->
-		                			<a th:href="${fileUrl} + *{fileDown.file_url}"  target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                		</div>
-			                </td>
-			            </tr>
-			            </tbody>
-			        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover ">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody class="add_file_line">
+                    <tr class="text-c" th:each="model,iterStat:${summaryMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <!-- <a th:href="{fileDown.download_uri} + *{fileDown.file_url}" target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a> -->
+                                <a th:href="${fileUrl} + *{fileDown.file_url}" target="_blank" style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <div class="line">其他材料</div>
         <div class="row cl" id="otherMaterials">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-			        <table class="table table-border table-bordered table-bg table-hover ">
-			            <thead>
-			            <tr class="text-c">
-			            	<th>编号</th>
-			                <th>下载材料</th>
-			            </tr>
-			            </thead>
-			            <tbody class="add_file_line">
-			            <tr class="text-c" th:each="model,iterStat:${otherMaterials}" th:object="${model}" >
-			            	<td th:text="${iterStat.index+1}"></td>
-			                <td class="td_material">
-			                	 <div th:if="*{fileDown}">
-		                			<a th:href="${fileUrl} + *{fileDown.file_url}"  target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                		</div>
-			                </td>
-			            </tr>
-			            </tbody>
-			        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover ">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody class="add_file_line">
+                    <tr class="text-c" th:each="model,iterStat:${otherMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <a th:href="${fileUrl} + *{fileDown.file_url}" target="_blank" style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
+
+        <th:block th:if="${landApply.apply_type == '4'}">
+
+            <div class="line">合同基本信息</div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2">租住生效日期:</label>
+                <div class="formControls col-xs-8 col-sm-4">
+                    [[${contract.contract_start}]]
+                </div>
+                <label class="form-label col-xs-4 col-sm-2">租住到期日期:</label>
+                <div class="formControls col-xs-8 col-sm-4">
+                    [[${contract.contract_end}]]
+                </div>
+            </div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2">关联载体:</label>
+                <div class="col-xs-8 col-sm-8">
+                    <table class="table table-border table-bordered table-bg table-hover ">
+                        <thead>
+                        <tr class="text-c">
+                            <th>所属园区</th>
+                            <th>楼栋</th>
+                            <th>楼层</th>
+                            <td>面积</td>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr class="text-c" th:each="item : ${contract.floors}">
+                            <td th:text="${contract.park_name}"></td>
+                            <td th:text="${item.building_name}"></td>
+                            <td th:text="${item.floor}"></td>
+                            <td th:text="${item.area}"></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </th:block>
+
         <div class="line">流程信息</div>
         <div class="row cl">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-		        <table class="table table-border table-bordered table-bg table-hover processTb">
-		            <thead>
-		            <tr class="text-c">
-		                <th style="width:15%;">时间</th>
-		                <th style="width:15%;">审核状态</th>
-		                <th style="width:10%;">部门</th>
-		                <th style="width:10%;">操作人</th>
-		                <th style="width:10%;">操作</th>
-		                <th style="width:15%;">材料</th>
-		                <th style="width:25%;">审核意见</th>
-		            </tr>
-		            </thead>
-		            <tbody>
-		            <tr class="text-c" th:each="model,iterStat:${approvalList}" th:object="${model}">
-		                <td th:text="*{create_time}"></td>
-		                <td th:text="*{before_approvalstatus_str}"></td>
-		                <td th:text="*{department}"></td>
-		                <td th:text="*{create_name}"></td>
-		                <td th:text="*{oper_type}"></td>
-		                <td class="td_material" >
-		                	<div th:if="*{fileDowns}" >
-		                		<a th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}" th:href="${fileUrl} + *{file_url}" target="_blank"  style="color: #5b98dd;">[[*{file_name}]]<br/></a>
-		                	</div>
-		                </td>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover processTb">
+                    <thead>
+                    <tr class="text-c">
+                        <th style="width:15%;">时间</th>
+                        <th style="width:15%;">审核状态</th>
+                        <th style="width:10%;">部门</th>
+                        <th style="width:10%;">操作人</th>
+                        <th style="width:10%;">操作</th>
+                        <th style="width:15%;">材料</th>
+                        <th style="width:25%;">审核意见</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="text-c" th:each="model,iterStat:${approvalList}" th:object="${model}">
+                        <td th:text="*{create_time}"></td>
+                        <td th:text="*{before_approvalstatus_str}"></td>
+                        <td th:text="*{department}"></td>
+                        <td th:text="*{create_name}"></td>
+                        <td th:text="*{oper_type}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDowns}">
+                                <a th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}"
+                                   th:href="${fileUrl} + *{file_url}" target="_blank" style="color: #5b98dd;">[[*{file_name}]]<br/></a>
+                            </div>
+                        </td>
                         <td class="viewComment" th:data="*{approval_comment}" th:text="*{approval_comment}"></td>
-		            </tr>
-		            </tbody>
-		        </table>
-	        </div>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
-		<!--  <div class="line">流程节点</div>
+        <!--  <div class="line">流程节点</div>
          <div class="row cl">
              <ul class="steps" id="phaseGraph">
                  <li data-step="1" class="active">
@@ -214,93 +255,94 @@
                  </li>
              </ul>
          </div>-->
-         <div th:if="${feedbackList}" class="line">进程反馈</div>
-         <div th:if="${feedbackList}" class="row cl">
-             <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-                 <table class="table table-border table-bordered table-bg table-hover">
-                     <thead>
-                     <tr class="text-c">
-                         <th>日期</th>
-                         <th>线下办理状态</th>
-                         <th>文件</th>
-                         <th>操作</th>
-                     </tr>
-                     </thead>
-                     <tbody>
-                     <tr class="text-c" th:each="model,iterStat:${feedbackList}" th:object="${model}">
-                         <td th:text="*{create_time}"></td>
-                         <td th:text="*{process_status_str}"></td>
-                         <td class="td_material" >
-                             <div th:if="*{fileDowns}" >
-                                 <a th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}" th:href="${fileUrl} + *{file_url}" target="_blank"  style="color: #5b98dd;">[[*{file_name}]]<br/></a>
-                             </div>
-                         </td>
-                         <td class="td-manage">
-                             <a title="详情"
-                                th:onclick="'javascript:open_dialog(\'详情\',\'/stockLand/checkFeedback/'+*{id}+'\',\'800\',\'400\');'"
-                                class="ml-5" style="text-decoration:none">详情</a>
-                             <a title="编辑"
-                                th:onclick="'javascript:open_dialog(\'编辑\',\'/stockLand/editFeedback/'+*{id}+'\');'"
-                                class="ml-5" style="text-decoration:none">编辑</a>
-                         </td>
-                     </tr>
-                     </tbody>
-                 </table>
-             </div>
-         </div>
-         <div class="row cl">
-             <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
-                 <button onClick="removeIframe();" class="btn btn-default radius" type="button">&nbsp;&nbsp;返回&nbsp;&nbsp;</button>
-             </div>
-         </div>
-     </form>
+        <div th:if="${feedbackList}" class="line">进程反馈</div>
+        <div th:if="${feedbackList}" class="row cl">
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover">
+                    <thead>
+                    <tr class="text-c">
+                        <th>日期</th>
+                        <th>线下办理状态</th>
+                        <th>文件</th>
+                        <th>操作</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="text-c" th:each="model,iterStat:${feedbackList}" th:object="${model}">
+                        <td th:text="*{create_time}"></td>
+                        <td th:text="*{process_status_str}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDowns}">
+                                <a th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}"
+                                   th:href="${fileUrl} + *{file_url}" target="_blank" style="color: #5b98dd;">[[*{file_name}]]<br/></a>
+                            </div>
+                        </td>
+                        <td class="td-manage">
+                            <a title="详情"
+                               th:onclick="'javascript:open_dialog(\'详情\',\'/stockLand/checkFeedback/'+*{id}+'\',\'800\',\'400\');'"
+                               class="ml-5" style="text-decoration:none">详情</a>
+                            <a title="编辑"
+                               th:onclick="'javascript:open_dialog(\'编辑\',\'/stockLand/editFeedback/'+*{id}+'\');'"
+                               class="ml-5" style="text-decoration:none">编辑</a>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <div class="row cl">
+            <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
+                <button onClick="removeIframe();" class="btn btn-default radius" type="button">&nbsp;&nbsp;返回&nbsp;&nbsp;</button>
+            </div>
+        </div>
+    </form>
 
 
- </article>
- <script th:inline="javascript">
+</article>
+<script th:inline="javascript">
 
-     $(function () {
-         //initPhaseProgressGraph();
-         //查看完整意见
-         $(".viewComment").on("click", function () {
-             layer.alert(
-                 $(this).attr('data'),
-                 {area: ['800px', '500px']}
-             )
-         });
-     });
+    $(function () {
+        //initPhaseProgressGraph();
+        //查看完整意见
+        $(".viewComment").on("click", function () {
+            layer.alert(
+                $(this).attr('data'),
+                {area: ['800px', '500px']}
+            )
+        });
+    });
 
-     function initPhaseProgressGraph(){
-         var list = [[${processNodesList}]]
+    function initPhaseProgressGraph() {
+        var list = [[${processNodesList}]]
 
-         var is_reject = false;
-         var html = '';
-         var index = 0;
-         for (var i = 0; i < list.length; i++) {
-             index += 1;
-             html +='<li data-step="1" class="'+(list[i].is_reject?'red':'')+'"><span class="step">'+index+'</span><span class="title">'+list[i].node_item.name+'</span></li>';
+        var is_reject = false;
+        var html = '';
+        var index = 0;
+        for (var i = 0; i < list.length; i++) {
+            index += 1;
+            html += '<li data-step="1" class="' + (list[i].is_reject ? 'red' : '') + '"><span class="step">' + index + '</span><span class="title">' + list[i].node_item.name + '</span></li>';
 
-         }
-         $("#phaseGraph").html(html);
-         if($(".steps li").length==1){
-             $(".steps li").addClass("one");
-         }else{
-             $(".steps li").eq($(".steps li").length-1).addClass("end");
-         }
-     }
+        }
+        $("#phaseGraph").html(html);
+        if ($(".steps li").length == 1) {
+            $(".steps li").addClass("one");
+        } else {
+            $(".steps li").eq($(".steps li").length - 1).addClass("end");
+        }
+    }
 
 
-     function open_dialog(title,url,w,h){
-         layer_show(title,pagePath+url,w,h);
-     }
+    function open_dialog(title, url, w, h) {
+        layer_show(title, pagePath + url, w, h);
+    }
 
-     /**
-      * 取消
-      */
-     function removeIframe(){
-         var index = parent.layer.getFrameIndex(window.name);
-         parent.layer.close(index);
-     }
- </script>
- </body>
- </html>
+    /**
+     * 取消
+     */
+    function removeIframe() {
+        var index = parent.layer.getFrameIndex(window.name);
+        parent.layer.close(index);
+    }
+</script>
+</body>
+</html>

+ 533 - 201
src/main/resources/templates/admin/company/stock_land/approve_page.html

@@ -78,10 +78,10 @@
                 [[${landApply.apply_type_str}]]
             </div>
         </div>
-        <div class="row cl" >
-        	<label class="form-label col-xs-4 col-sm-2">厂房所在属地:</label>
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-2">厂房所在属地:</label>
             <div class="formControls col-xs-8 col-sm-9">
-            	[[${landApply.building_street_name}]]
+                [[${landApply.building_street_name}]]
             </div>
         </div>
         <div class="row cl">
@@ -98,137 +98,232 @@
         </div>
         <div class="line">基准材料</div>
         <div class="row cl">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-		        <table class="table table-border table-bordered table-bg table-hover">
-		            <thead>
-		            <tr class="text-c">
-		                <th>编号</th>
-		                <th>内容</th>
-		                <th>下载材料</th>
-		            </tr>
-		            </thead>
-		            <tbody>
-		            <tr class="text-c" th:each="model,iterStat:${applyMaterials}" th:object="${model}">
-		                <td th:text="${iterStat.index+1}"></td>
-		                <td th:text="*{content}"></td>
-		                <td class="td_material" >
-		                	<div th:if="*{fileDown}">
-		                		<a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                	</div>
-		                </td>
-		            </tr>
-		            </tbody>
-		        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>内容</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="text-c" th:each="model,iterStat:${applyMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td th:text="*{content}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"
+                                   style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <div th:if="${landApply.summary_procedure}" class="line">简易程序材料</div>
         <div th:if="${landApply.summary_procedure}" class="row cl" id="summaryMaterials">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-			        <table class="table table-border table-bordered table-bg table-hover ">
-			            <thead>
-			            <tr class="text-c">
-			            	<th>编号</th>
-			                <th>下载材料</th>
-			            </tr>
-			            </thead>
-			            <tbody class="add_file_line">
-			            <tr class="text-c" th:each="model,iterStat:${summaryMaterials}" th:object="${model}" >
-			            	<td th:text="${iterStat.index+1}"></td>
-			                <td class="td_material">
-			                	 <div th:if="*{fileDown}">
-		                			<a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                		</div>
-			                </td>
-			            </tr>
-			            </tbody>
-			        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover ">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody class="add_file_line">
+                    <tr class="text-c" th:each="model,iterStat:${summaryMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"
+                                   style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <div class="line">其他材料</div>
         <div class="row cl" id="otherMaterials">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-			        <table class="table table-border table-bordered table-bg table-hover ">
-			            <thead>
-			            <tr class="text-c">
-			            	<th>编号</th>
-			                <th>下载材料</th>
-			            </tr>
-			            </thead>
-			            <tbody class="add_file_line">
-			            <tr class="text-c" th:each="model,iterStat:${otherMaterials}" th:object="${model}" >
-			            	<td th:text="${iterStat.index+1}"></td>
-			                <td class="td_material">
-			                	 <div th:if="*{fileDown}">
-		                			<a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"  style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
-		                		</div>
-			                </td>
-			            </tr>
-			            </tbody>
-			        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover ">
+                    <thead>
+                    <tr class="text-c">
+                        <th>编号</th>
+                        <th>下载材料</th>
+                    </tr>
+                    </thead>
+                    <tbody class="add_file_line">
+                    <tr class="text-c" th:each="model,iterStat:${otherMaterials}" th:object="${model}">
+                        <td th:text="${iterStat.index+1}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDown}">
+                                <a download th:href="${fileUrl} + *{fileDown.file_url}" target="_blank"
+                                   style="color: #5b98dd;">[[*{fileDown.file_name}]]</a>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
+
+        <th:block th:if="${isRent}">
+
+            <div class="line">合同基本信息</div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>所属园区:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+					<span class="select-box">
+						<select class="select" th:id="park">
+                            <option value='0'>请选择</option>
+							<option th:each="item : ${parkList}" th:value="${item.id}" th:text="${item.name}">
+							</option>
+						</select>
+					</span>
+                </div>
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>楼栋:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+					<span class="select-box">
+						<select class="select" th:id="building">
+                            <option value='0'>请选择</option>
+							<option th:each="item : ${buildingList}" th:value="${item.id}" th:text="${item.name}">
+							</option>
+						</select>
+					</span>
+                </div>
+            </div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>楼层:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+					<span class="select-box">
+						<select class="select" th:id="floor">
+                            <option value='0'>请选择</option>
+							<option th:each="item : ${floorList}" th:value="${item.id}" th:text="${item.name}">
+							</option>
+						</select>
+					</span>
+                </div>
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>租赁面积:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+                    <input type="text" class="input-text" th:id="area" th:value="${contract_area}"
+                           th:name="contract_area"/>
+                </div>
+                <a class="btn btn-primary radius" onclick="addFloor()">&nbsp;&nbsp;新增&nbsp;&nbsp;</a>
+            </div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>租住生效日期:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+                    <!--                    <input type="text" class="input-text" id="contract_starttime" name="contract_starttime"-->
+                    <!--                           th:id="contract_starttime" th:name="contract_starttime" style="float:left; width: 150px;"/>-->
+                    <input class="Wdate input-text" type="text" th:id="contract_start"
+                           th:name="contract.contract_start"
+                           onclick="WdatePicker({dateFmt:'yyyy-MM-dd',maxDate:'#F{$dp.$D(\'contract_end\')}',isShowClear:true,readOnly:true})"/>
+                </div>
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>租住到期日期:</label>
+                <div class="formControls col-xs-4 col-sm-2">
+                    <!--                    <input type="text" class="input-text pull-left" id="contract_endtime" name="contract_endtime"-->
+                    <!--                           th:id="contract_endtime" th:name="contract_endtime" style="float:left; width: 150px;"/>-->
+                    <input class="Wdate input-text" type="text" th:id="contract_end"
+                           th:name="contract.contract_end"
+                           onclick="WdatePicker({dateFmt:'yyyy-MM-dd',minDate:'#F{$dp.$D(\'contract_start\')}',isShowClear:true,readOnly:true})"/>
+                </div>
+            </div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red"></span>备注:</label>
+                <div class="formControls col-xs-8 col-sm-8">
+                    <textarea class="textarea" id="contract_remark" th:name="contract.remark"
+                              placeholder=""></textarea>
+                </div>
+            </div>
+            <div class="row cl">
+                <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>关联载体:</label>
+                <div class="col-xs-8 col-sm-8">
+                    <table class="table table-border table-bordered table-bg table-hover ">
+                        <thead>
+                        <tr class="text-c">
+                            <th>所属园区</th>
+                            <th>楼栋</th>
+                            <th>楼层</th>
+                            <td>面积</td>
+                            <th>操作</th>
+                        </tr>
+                        </thead>
+                        <tbody class="add-floor" th:id="'floor-table'">
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+
+        </th:block>
+
         <div class="line">流程信息</div>
         <div class="row cl">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-		        <table class="table table-border table-bordered table-bg table-hover processTb">
-		            <thead>
-		            <tr class="text-c">
-		                <th style="width:15%;">时间</th>
-		                <th style="width:15%;">审核状态</th>
-		                <th style="width:10%;">部门</th>
-		                <th style="width:10%;">操作人</th>
-		                <th style="width:10%;">操作</th>
-		                <th style="width:15%;">材料</th>
-		                <th style="width:25%;">审核意见</th>
-		            </tr>
-		            </thead>
-		            <tbody>
-		            <tr class="text-c" th:each="model,iterStat:${approvalList}" th:object="${model}">
-		                <td th:text="*{create_time}"></td>
-		                <td th:text="*{before_approvalstatus_str}"></td>
-		                <td th:text="*{department}"></td>
-		                <td th:text="*{create_name}"></td>
-		                <td th:text="*{oper_type}"></td>
-		                <td class="td_material" >
-		                	<div th:if="*{fileDowns}" >
-		                		<a download th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}" th:href="${fileUrl} + *{file_url}" target="_blank"  style="color: #5b98dd;">[[*{file_name}]]<br/></a>
-		                	</div>
-		                </td>
-						<td class="viewComment" th:data="*{approval_comment}" th:text="*{approval_comment}"></td>
-		            </tr>
-		            </tbody>
-		        </table>
-	        </div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <table class="table table-border table-bordered table-bg table-hover processTb">
+                    <thead>
+                    <tr class="text-c">
+                        <th style="width:15%;">时间</th>
+                        <th style="width:15%;">审核状态</th>
+                        <th style="width:10%;">部门</th>
+                        <th style="width:10%;">操作人</th>
+                        <th style="width:10%;">操作</th>
+                        <th style="width:15%;">材料</th>
+                        <th style="width:25%;">审核意见</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="text-c" th:each="model,iterStat:${approvalList}" th:object="${model}">
+                        <td th:text="*{create_time}"></td>
+                        <td th:text="*{before_approvalstatus_str}"></td>
+                        <td th:text="*{department}"></td>
+                        <td th:text="*{create_name}"></td>
+                        <td th:text="*{oper_type}"></td>
+                        <td class="td_material">
+                            <div th:if="*{fileDowns}">
+                                <a download th:each="filedown,iterStat:*{fileDowns}" th:object="${filedown}"
+                                   th:href="${fileUrl} + *{file_url}" target="_blank" style="color: #5b98dd;">[[*{file_name}]]<br/></a>
+                            </div>
+                        </td>
+                        <td class="viewComment" th:data="*{approval_comment}" th:text="*{approval_comment}"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
         </div>
         <div class="line">审核意见</div>
         <div class="row cl">
-        	<div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
-        		<textarea class="textarea" id="approval_comment" th:name="approval_comment" placeholder="请输入审核意见"></textarea>
-        	</div>
+            <div class="col-xs-8 col-sm-9 col-xs-offset-2 col-sm-offset-1">
+                <textarea class="textarea" id="approval_comment" th:name="approval_comment"
+                          placeholder="请输入审核意见"></textarea>
+            </div>
         </div>
         <div class="line">审核材料上传</div>
         <div class="row cl">
-        	<label class="form-label col-xs-4 col-sm-2">上传材料:</label>
+            <label class="form-label col-xs-4 col-sm-2">上传材料:</label>
             <div class="formControls col-xs-8 col-sm-9">
-               <div class="uploader-thum-container">
-		                    	<div id="fileListPre" class="uploader-list">
-		                    	</div>
-		                    	<div id="filePicker">选择文件</div>
-		                	</div>
+                <div class="uploader-thum-container">
+                    <div id="fileListPre" class="uploader-list">
+                    </div>
+                    <div id="filePicker">选择文件</div>
+                </div>
             </div>
         </div>
         <div class="row cl">
             <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
-            	<input id="status" type="hidden" name="status"/>
-            	<input id="isRent" type="hidden" th:value="${isRent}"/>
-            	<input id="isLeader" type="hidden" th:value="${isLeader}"/>
-            	<a th:unless="${isLeader}" class="btn btn-primary radius" onclick="audit(4)">&nbsp;&nbsp;提交审核意见&nbsp;&nbsp;</a>
-            	<!-- <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(2)">&nbsp;&nbsp;通过&nbsp;&nbsp;</a>
+                <input id="status" type="hidden" name="status"/>
+                <input id="isRent" type="hidden" th:value="${isRent}"/>
+                <input id="isLeader" type="hidden" th:value="${isLeader}"/>
+                <a th:unless="${isLeader}" class="btn btn-primary radius" onclick="audit(4)">&nbsp;&nbsp;提交审核意见&nbsp;&nbsp;</a>
+                <!-- <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(2)">&nbsp;&nbsp;通过&nbsp;&nbsp;</a>
                 <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(3)" >&nbsp;&nbsp;不通过&nbsp;&nbsp;</a>
                 <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(1)">&nbsp;&nbsp;退回&nbsp;&nbsp;</a>
                  -->
                 <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(2)">&nbsp;&nbsp;通过&nbsp;&nbsp;</a>
-                <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(3)" >&nbsp;&nbsp;不通过&nbsp;&nbsp;</a>
+                <a th:if="${isLeader}" class="btn btn-primary radius" onclick="audit(3)">&nbsp;&nbsp;不通过&nbsp;&nbsp;</a>
                 <a class="btn btn-primary radius" onclick="audit(1)">&nbsp;&nbsp;退回&nbsp;&nbsp;</a>
                 <button onClick="removeIframe();" class="btn btn-default radius" type="button">&nbsp;&nbsp;取消&nbsp;&nbsp;</button>
             </div>
@@ -238,97 +333,105 @@
 
 </article>
 <script th:inline="javascript">
-	
-	//status 1退回,2通过,3不通过,4提交审核意见
-	function audit(status){
-		$("#status").val(status);
-		//所有审核意见必填-2018-06-04
-		//if(status==1 || status==3){
-			//退回、不通过审核意见必填
-			if($.trim($("#approval_comment").val())==""){
-				errorMessage('请填写审核意见!');
-				return false;
-			}
-		//}
-		$("#form-land-approve").submit();
-	}
-	
-$(function () {
-	$("#form-land-approve").validate({
-        rules: {
-        	
-        },
-        messages: {
-        	
-        },
-        onkeyup: false,
-        focusCleanup: true,
-        success: "valid",
-        submitHandler: function (form) {
-            // $(form).find(":submit").attr("disabled", true);
-            setDocNames();
-            $(form).ajaxSubmit({
-                type: 'post',
-                url: pagePath + "/stockLand/approve",
-                dataType: "json",
-                success: function (data) {
-                    if (data.success) {
-                        succeedMessage(data.message);
-                        //setTimeClose();
-                        //退回 或者 房屋出租街道通过或者不通过 
-                        if($("#status").val()=="1" || $("#status").val()=="3" || 
-                        		( $("#isRent").val()=="true" && $("#status").val()=="2" )){
-                        	layer.confirm(
-                        		'审核成功,确认现在就通知企业吗?',
-                        		function(index){
-                        			var url = "/stockLand/confirmPage/"+$("#apply_id").val();
-                            		open_dialog("通知企业",url,800,500);
-                        		},
-                        		function(){
-                        			setTimeClose();
-                        		}
-                        	);
-                        }else{
-                            setTimeClose();
+
+    //status 1退回,2通过,3不通过,4提交审核意见
+    function audit(status) {
+        $("#status").val(status);
+        //所有审核意见必填-2018-06-04
+        //if(status==1 || status==3){
+        //退回、不通过审核意见必填
+        if ($.trim($("#approval_comment").val()) == "") {
+            errorMessage('请填写审核意见!');
+            return false;
+        }
+        //}
+        $("#form-land-approve").submit();
+    }
+
+    $(function () {
+        $("#form-land-approve").validate({
+            rules: {},
+            messages: {},
+            onkeyup: false,
+            focusCleanup: true,
+            success: "valid",
+            submitHandler: function (form) {
+                // $(form).find(":submit").attr("disabled", true);
+                setDocNames();
+                if ($("#contract_start").val() == "") {
+                    errorMessage("请选择租住生效日期!")
+                    return
+                }
+                if ($("#contract_end").val() == "") {
+                    errorMessage("请选择租住到期日期!")
+                    return
+                }
+                if (floorList.length <= 0) {
+                    errorMessage("请选择关联载体!")
+                    return
+                }
+                $(form).ajaxSubmit({
+                    type: 'post',
+                    url: pagePath + "/stockLand/approve",
+                    dataType: "json",
+                    success: function (data) {
+                        if (data.success) {
+                            succeedMessage(data.message);
+                            //setTimeClose();
+                            //退回 或者 房屋出租街道通过或者不通过
+                            if ($("#status").val() == "1" || $("#status").val() == "3" ||
+                                ($("#isRent").val() == "true" && $("#status").val() == "2")) {
+                                layer.confirm(
+                                    '审核成功,确认现在就通知企业吗?',
+                                    function (index) {
+                                        var url = "/stockLand/confirmPage/" + $("#apply_id").val();
+                                        open_dialog("通知企业", url, 800, 500);
+                                    },
+                                    function () {
+                                        setTimeClose();
+                                    }
+                                );
+                            } else {
+                                setTimeClose();
+                            }
+                        } else {
+                            // $(form).find(":submit").attr("disabled", false);
+                            errorMessage(data.message);
                         }
-                    } else {
-                        // $(form).find(":submit").attr("disabled", false);
-                        errorMessage(data.message);
+                    },
+                    error: function () {
+                        errorMessage('系统错误!');
                     }
-                },
-                error: function () {
-                    errorMessage('系统错误!');
-                }
-            });
-            return false; // 非常重要,如果是false,则表明是不跳转,在本页上处理,也就是ajax,如果是非false,则传统的form跳转。
-        }
-    });
-	
-    //查看完整意见
-    $(".viewComment").on("click", function () {
-        layer.alert(
-            $(this).attr('data'),
-            {area: ['800px', '500px']}
-        )
+                });
+                return false; // 非常重要,如果是false,则表明是不跳转,在本页上处理,也就是ajax,如果是非false,则传统的form跳转。
+            }
+        });
+
+        //查看完整意见
+        $(".viewComment").on("click", function () {
+            layer.alert(
+                $(this).attr('data'),
+                {area: ['800px', '500px']}
+            )
+        });
     });
-});
-
-//修改上传文件的name域,改成数组形式
-function setDocNames(){
-	$("#fileListPre").find("input[id$='DocUrl']").each(function(i,item){
-		$(this).attr("name","fileDowns["+i+"].file_id");
-	});
-}
-
-/*管理员-详情*/
-function open_dialog(title,url,w,h){
-	layer_show(title,pagePath+url,w,h);
-}	
-	
-/**
-* 初始化上传控件
-*/
-var options = {
+
+    //修改上传文件的name域,改成数组形式
+    function setDocNames() {
+        $("#fileListPre").find("input[id$='DocUrl']").each(function (i, item) {
+            $(this).attr("name", "fileDowns[" + i + "].file_id");
+        });
+    }
+
+    /*管理员-详情*/
+    function open_dialog(title, url, w, h) {
+        layer_show(title, pagePath + url, w, h);
+    }
+
+    /**
+     * 初始化上传控件
+     */
+    var options = {
         uploadBtnId: '#filePicker',
         picturePreId: 'fileListPre',
         hiddenPictureUrl: 'img',
@@ -343,19 +446,248 @@ var options = {
         fileSizeLimit: 100 * 1024 * 1024,
         fileSingleSizeLimit: 100 * 1024 * 1024,
 //		fileNumLimit: 1,
-		append : true
+        append: true
     };
 
     var webUploadDoc = new $WebUploadDoc(options);
     webUploadDoc.init();
-    
+
+    $("#park").change(function () {
+        var parkId = $("#park").val();
+        var buildingId = $("#building").val();
+        if (parkId == '') {
+            return;
+        }
+        var url = pagePath + "/stockLand/contract_building_data";
+        $.ajax({
+            cache: true,
+            type: 'get',
+            url: url,
+            dataType: "json",
+            data: {
+                'parkId': parkId
+            },
+            success: function (result) {
+                if (result.success) {
+
+                    var buildingList = result.obj.buildingList;
+                    var building = $("#building").empty();
+                    building.append("<option value='0'>请选择</option>");
+                    var floor = $("#floor").empty();
+                    floor.append("<option value='0'>请选择</option>");
+                    $("#area").val("");
+
+                    if (buildingList.length > 0) {
+                        for (var i = 0; i < buildingList.length; i++) {
+                            building.append("<option value='" + buildingList[i].id + "'>" + buildingList[i].build_name + "</option>")
+                        }
+                    }
+                } else {
+                    errorMessage(result.message);
+                }
+            },
+            error: function () {
+                errorMessage('系统错误!');
+            }
+        })
+    })
+
+    $("#building").change(function () {
+        var parkId = $("#park").val();
+        var buildingId = $("#building").val();
+        if (buildingId == '') {
+            return;
+        }
+        var url = pagePath + "/stockLand/contract_floor_data";
+        $.ajax({
+            cache: true,
+            type: 'get',
+            url: url,
+            dataType: "json",
+            data: {
+                'buildingId': buildingId
+            },
+            success: function (result) {
+                if (result.success) {
+
+                    var floorList = result.obj.floorList;
+                    var floor = $("#floor").empty();
+                    floor.append("<option value='0'>请选择</option>");
+                    $("#area").val("");
+
+                    if (floorList.length > 0) {
+                        for (var i = 0; i < floorList.length; i++) {
+                            floor.append("<option value='" + floorList[i].id + "'>" + floorList[i].floor + "</option>")
+                        }
+                    }
+                } else {
+                    errorMessage(result.message);
+                }
+            },
+            error: function () {
+                errorMessage('系统错误!');
+            }
+        })
+    })
+
+    $("#floor").change(function () {
+        $("#area").val("");
+    })
+
+    var floorList = new Array();
+
+    function addFloor() {
+
+        var parkId = $("#park").val();
+        var buildingId = $("#building").val();
+        var floorId = $("#floor").val();
+        var area = $("#area").val();
+
+        var parkName = $("#park option:selected").text();
+        var buildingName = $("#building option:selected").text();
+        var floorName = $("#floor option:selected").text();
+
+        if (parkId == "" || parkId == undefined || parkId == null) {
+            errorMessage("请填选择园区!");
+            return
+        }
+        if (buildingId == "" || buildingId == undefined || buildingId == null) {
+            errorMessage("请填选择楼栋!");
+            return
+        }
+        if (floorId == "" || floorId == undefined || floorId == null) {
+            errorMessage("请填选择楼层!");
+            return
+        }
+        if (area == "" || area == undefined || area == null) {
+            errorMessage("请填写租赁面积!");
+            return
+        }
+
+        if (floorList.length > 0) {
+            for (var i = 0; i < floorList.length; i++) {
+                if (parkId != floorList[i].parkId) {
+                    errorMessage("请选择同一园区!");
+                    return;
+                }
+                if (floorId == floorList[i].floorId) {
+                    errorMessage("楼层重复!");
+                    return;
+                }
+            }
+        }
+
+        floorList.push({
+            parkId: parkId,
+            buildingId: buildingId,
+            floorId: floorId,
+            parkName: parkName,
+            buildingName: buildingName,
+            floorName: floorName,
+            area: area
+        })
+        renderFloorTable(floorList);
+    }
+
+    function renderFloorTable(floorList) {
+
+        var str = "";
+        if (floorList.length > 0) {
+            for (var i = 0; i < floorList.length; i++) {
+
+                str += "<tr class='text-c'>"
+                str += "<td>" + floorList[i].parkName + "</td>"
+                str += "<td>" + floorList[i].buildingName + "</td>"
+                str += "<td>" + floorList[i].floorName + "</td>"
+                str += "<td>" + floorList[i].area + "</td>"
+                str += "<td class='icon_font'><i class='Hui-iconfont' onclick='removeLine(this)'>&#xe6a1; 删除</i>"
+                str += "<input hidden name='contract.floors[" + i + "].floor_id' value='" + floorList[i].floorId + "'/>"
+                str += "<input hidden name='contract.floors[" + i + "].area' value='" + floorList[i].area + "'/>"
+                str += "<input hidden name='contract.park_id' value='" + floorList[i].parkId + "'/>"
+                str += "</td>"
+                str += "</tr>"
+            }
+        }
+
+        $("#floor-table").html(str);
+    }
+
+    function removeLine(obj) {
+        $(obj).parent().parent().remove();
+    }
+
     /**
      * 取消
      */
-    function removeIframe(){
+    function removeIframe() {
         var index = parent.layer.getFrameIndex(window.name);
         parent.layer.close(index);
     }
+
+    // $(function () {
+    //
+    // 	var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
+    // 	var isOpera = userAgent.indexOf("Opera") > -1;
+    // 	//判断是否IE浏览器
+    // 	if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
+    // 		$("#contract_starttime").remove();
+    // 		$("#contract_endtime").remove();
+    // 	} else {
+    // 		$("#contract_starttimeIE").remove();
+    // 		$("#contract_endtimeIE").remove();
+    // 		var startDate = laydate.render({
+    // 			elem: '#contract_starttime',
+    // 			type: 'datetime',
+    // 			format: 'yyyy-MM-dd',
+    // 			done: function (value, date) {
+    // 				setTimeout(function () {
+    // 					$("#form-land-approve").validate().element($("#contract_starttime"));
+    // 				}, 100)
+    // 				if (value !== '') {
+    // 					endDate.config.min.year = date.year;
+    // 					endDate.config.min.month = date.month - 1;
+    // 					endDate.config.min.date = date.date;
+    // 					// endDate.config.min.hours = date.hours;
+    // 					// endDate.config.min.minutes = date.minutes;
+    // 					// endDate.config.min.seconds = date.seconds;
+    // 				} else {
+    // 					endDate.config.min.year = '1900';
+    // 					endDate.config.min.month = '0';
+    // 					endDate.config.min.date = '1';
+    // 					// endDate.config.min.hours = '0';
+    // 					// endDate.config.min.minutes = '0';
+    // 					// endDate.config.min.seconds = '0';
+    // 				}
+    // 			}
+    // 		});
+    //
+    // 		var endDate = laydate.render({
+    // 			elem: '#contract_endtime',
+    // 			type: 'datetime',
+    // 			format: 'yyyy-MM-dd',
+    // 			done: function (value, date) {
+    // 				setTimeout(function () {
+    // 					$("#form-land-approve").validate().element($("#contract_endtime"));
+    // 				}, 100)
+    // 				if (value !== '') {
+    // 					startDate.config.max.year = date.year;
+    // 					startDate.config.max.month = date.month - 1;
+    // 					startDate.config.max.date = date.date;
+    // 					// startDate.config.max.hours = date.hours;
+    // 					// startDate.config.max.minutes = date.minutes;
+    // 					// startDate.config.max.seconds = date.seconds;
+    // 				} else {
+    // 					startDate.config.max.year = '2100';
+    // 					startDate.config.max.month = '0';
+    // 					startDate.config.max.date = '1';
+    // 					// startDate.config.max.hours = '0';
+    // 					// startDate.config.max.minutes = '0';
+    // 					// startDate.config.max.seconds = '0';
+    // 				}
+    // 			}
+    // 		});
+    // 	}
+    // });
 </script>
 </body>
 </html>

+ 396 - 0
src/test/java/com/WordExport.java

@@ -0,0 +1,396 @@
+package com;
+
+import java.io.FileOutputStream;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
+import org.apache.poi.xwpf.usermodel.Borders;
+import org.apache.poi.xwpf.usermodel.BreakClear;
+import org.apache.poi.xwpf.usermodel.BreakType;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TextAlignment;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFldChar;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STFldCharType;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
+
+/**
+ * @Author :huZhiHao
+ * @Date :Created in 2020/4/7 16:46
+ * @Description: TODO
+ * @Modified By:
+ * @Version: v0.0.1
+ */
+public class WordExport {
+
+    public static void main(String[] args) throws Exception {
+        WordExport t = new WordExport();
+        System.out.println("------------------------简单文字页脚-----------------");
+//        t.simpleFooter("E:/upload/sys_" + System.currentTimeMillis() + ".docx");
+        System.out.println("------------------------简单文字页眉页脚-----------------");
+        XWPFDocument document = new XWPFDocument();
+        t.simpleDateHeader(document);
+//        t.createSimpleTable(document);
+        t.addNewPage(document, BreakType.PAGE);
+        String str = "测试测试测试测试测试文本测试测试测试测试测试文本测试\r\n测试测试测试测试文本测试测试测试测试测试文本测试";
+        t.addSimpleParagraph(document, str, "宋体", 11, "FF0000", true, false);
+        t.addNewPage(document, BreakType.COLUMN);
+        t.addSimpleParagraph(document, str, "微软雅黑", 12, "00FF00", false, true);
+        t.addNewPage(document, BreakType.TEXT_WRAPPING);
+        t.addSimpleParagraph(document, str, "楷体", 13, "0000FF", true, true);
+        t.addBreakClear(document, BreakClear.ALL);
+        t.addSimpleParagraph(document, str, "黑体", 14, "000000", false, false);
+        t.simpleNumberFooter(document);
+        t.saveDocument(document, "E:/upload/sys_" + System.currentTimeMillis() + ".docx");
+    }
+
+    /**
+     * @Description: 文字页脚
+     * @see: http://www.coderanch.com/t/525626/java/java/Adding-Header-Footer-Word-Document
+     */
+    public void simpleFooter(String savePath) throws Exception {
+        XWPFDocument document = new XWPFDocument();
+        CTP ctp = CTP.Factory.newInstance();
+        CTR ctr = ctp.addNewR();
+        CTText textt = ctr.addNewT();
+        textt.setStringValue("测试");
+        XWPFParagraph codePara = new XWPFParagraph(ctp, document);
+        codePara.setAlignment(ParagraphAlignment.CENTER);
+        codePara.setVerticalAlignment(TextAlignment.CENTER);
+        XWPFParagraph[] newparagraphs = new XWPFParagraph[1];
+        newparagraphs[0] = codePara;
+        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
+        headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, newparagraphs);
+        headerFooterPolicy.createHeader(STHdrFtr.DEFAULT, newparagraphs);
+        FileOutputStream fos = new FileOutputStream(savePath);
+        document.write(fos);
+        fos.close();
+    }
+
+    //页脚:显示页码信息
+    public void simpleNumberFooter(XWPFDocument document) throws Exception {
+        CTP ctp = CTP.Factory.newInstance();
+        XWPFParagraph codePara = new XWPFParagraph(ctp, document);
+        XWPFRun r1 = codePara.createRun();
+        r1.setText("第");
+        r1.setFontSize(11);
+        CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("宋体");
+        fonts.setEastAsia("宋体");
+        fonts.setHAnsi("宋体");
+
+        r1 = codePara.createRun();
+        CTFldChar fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        r1 = codePara.createRun();
+        CTText ctText = r1.getCTR().addNewInstrText();
+        ctText.setStringValue("PAGE  \\* MERGEFORMAT");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("宋体");
+        fonts.setEastAsia("宋体");
+        fonts.setHAnsi("宋体");
+
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        r1 = codePara.createRun();
+        r1.setText("页 总共");
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("宋体");
+        fonts.setEastAsia("宋体");
+        fonts.setHAnsi("宋体");
+
+        r1 = codePara.createRun();
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        r1 = codePara.createRun();
+        ctText = r1.getCTR().addNewInstrText();
+        ctText.setStringValue("NUMPAGES  \\* MERGEFORMAT ");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("宋体");
+        fonts.setEastAsia("宋体");
+        fonts.setHAnsi("宋体");
+
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        r1 = codePara.createRun();
+        r1.setText("页");
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("宋体");
+        fonts.setEastAsia("宋体");
+        fonts.setHAnsi("宋体");
+
+        codePara.setAlignment(ParagraphAlignment.CENTER);
+        codePara.setVerticalAlignment(TextAlignment.CENTER);
+        codePara.setBorderTop(Borders.THICK);
+        XWPFParagraph[] newparagraphs = new XWPFParagraph[1];
+        newparagraphs[0] = codePara;
+        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
+        headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, newparagraphs);
+    }
+
+
+    public void simpleDateHeader(XWPFDocument document) throws Exception {
+        CTP ctp = CTP.Factory.newInstance();
+        XWPFParagraph codePara = new XWPFParagraph(ctp, document);
+
+        XWPFRun r1 = codePara.createRun();
+        CTFldChar fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        r1 = codePara.createRun();
+        CTText ctText = r1.getCTR().addNewInstrText();
+        ctText.setStringValue("TIME \\@ \"EEEE\"");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        r1.setFontSize(11);
+        CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        r1 = codePara.createRun();
+        r1.setText("年");
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        r1 = codePara.createRun();
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        r1 = codePara.createRun();
+        ctText = r1.getCTR().addNewInstrText();
+        ctText.setStringValue("TIME \\@ \"O\"");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        r1 = codePara.createRun();
+        r1.setText("月");
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        r1 = codePara.createRun();
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        r1 = codePara.createRun();
+        ctText = r1.getCTR().addNewInstrText();
+        ctText.setStringValue("TIME \\@ \"A\"");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        fldChar = r1.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        r1 = codePara.createRun();
+        r1.setText("日");
+        r1.setFontSize(11);
+        rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii("微软雅黑");
+        fonts.setEastAsia("微软雅黑");
+        fonts.setHAnsi("微软雅黑");
+
+        codePara.setAlignment(ParagraphAlignment.CENTER);
+        codePara.setVerticalAlignment(TextAlignment.CENTER);
+        codePara.setBorderBottom(Borders.THICK);
+        XWPFParagraph[] newparagraphs = new XWPFParagraph[1];
+        newparagraphs[0] = codePara;
+        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
+        headerFooterPolicy.createHeader(STHdrFtr.DEFAULT, newparagraphs);
+    }
+
+    public void addNewPage(XWPFDocument document, BreakType breakType) {
+        XWPFParagraph xp = document.createParagraph();
+        xp.createRun().addBreak(breakType);
+    }
+
+    public void addBreakClear(XWPFDocument document, BreakClear breakClear) {
+        XWPFParagraph xp = document.createParagraph();
+        xp.createRun().addBreak(breakClear);
+    }
+
+    //TODO 写的时候遇到过一次数组越界,测试几次都没法重现
+    public void addSimpleParagraph(XWPFDocument document, String text, String fontName, int fontSize, String color, boolean isBold, boolean isItalic) {
+        XWPFParagraph xp = document.createParagraph();
+        XWPFRun r1 = xp.createRun();
+        r1.setText(text);
+        r1.setFontSize(fontSize);
+        r1.setBold(isBold);
+        r1.setItalic(isItalic);
+        r1.setColor(color);
+        CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii(fontName);
+        fonts.setEastAsia(fontName);
+        fonts.setHAnsi(fontName);
+        xp.setAlignment(ParagraphAlignment.CENTER);
+        xp.setVerticalAlignment(TextAlignment.CENTER);
+    }
+
+
+    //注意: 代码采用的是先写数据再写表头
+    public void createSimpleTable(XWPFDocument doc) throws Exception {
+        List<String> columnList = new ArrayList<String>();
+        columnList.add("序号");
+        columnList.add("姓名信息|姓甚|名谁");
+        columnList.add("名刺信息|籍贯|营生");
+        XWPFTable table = doc.createTable(2, 5);
+        CTTbl ttbl = table.getCTTbl();
+        CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
+        CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
+        CTJc cTJc = tblPr.addNewJc();
+        cTJc.setVal(STJc.Enum.forString("center"));
+        tblWidth.setW(new BigInteger("8000"));
+        tblWidth.setType(STTblWidth.DXA);
+
+        XWPFTableRow firstRow = null;
+        XWPFTableRow secondRow = null;
+        XWPFTableCell firstCell = null;
+        XWPFTableCell secondCell = null;
+
+        for (int i = 0; i < 2; i++) {
+            firstRow = table.getRow(i);
+            firstRow.setHeight(380);
+            for (int j = 0; j < 5; j++) {
+                firstCell = firstRow.getCell(j);
+                setCellText(firstCell, "测试", null, 1600);
+            }
+        }
+
+        firstRow = table.insertNewTableRow(0);
+        secondRow = table.insertNewTableRow(1);
+        firstRow.setHeight(380);
+        secondRow.setHeight(380);
+        for (String str : columnList) {
+            if (str.indexOf("|") == -1) {
+                firstCell = firstRow.addNewTableCell();
+                secondCell = secondRow.addNewTableCell();
+                createVSpanCell(firstCell, str, "CCCCCC", 1600, STMerge.RESTART);
+                createVSpanCell(secondCell, "", "CCCCCC", 1600, null);
+            } else {
+                String[] strArr = str.split("\\|");
+                firstCell = firstRow.addNewTableCell();
+                createHSpanCell(firstCell, strArr[0], "CCCCCC", 1600, STMerge.RESTART);
+                for (int i = 1; i < strArr.length - 1; i++) {
+                    firstCell = firstRow.addNewTableCell();
+                    createHSpanCell(firstCell, "", "CCCCCC", 1600, null);
+                }
+                for (int i = 1; i < strArr.length; i++) {
+                    secondCell = secondRow.addNewTableCell();
+                    setCellText(secondCell, strArr[i], "CCCCCC", 1600);
+                }
+            }
+        }
+
+    }
+
+    public void setCellText(XWPFTableCell cell, String text, String bgcolor, int width) {
+        CTTc cttc = cell.getCTTc();
+        CTTcPr cellPr = cttc.addNewTcPr();
+        cellPr.addNewTcW().setW(BigInteger.valueOf(width));
+        cell.setColor(bgcolor);
+        cell.setVerticalAlignment(XWPFVertAlign.CENTER);
+        CTTcPr ctPr = cttc.addNewTcPr();
+        ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
+        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
+        cell.setText(text);
+    }
+
+    public void createHSpanCell(XWPFTableCell cell, String value, String bgcolor, int width, STMerge.Enum stMerge) {
+        CTTc cttc = cell.getCTTc();
+        CTTcPr cellPr = cttc.addNewTcPr();
+        cellPr.addNewTcW().setW(BigInteger.valueOf(width));
+        cell.setColor(bgcolor);
+        cellPr.addNewHMerge().setVal(stMerge);
+        cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
+        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
+        cttc.getPList().get(0).addNewR().addNewT().setStringValue(value);
+    }
+
+    public void createVSpanCell(XWPFTableCell cell, String value, String bgcolor, int width, STMerge.Enum stMerge) {
+        CTTc cttc = cell.getCTTc();
+        CTTcPr cellPr = cttc.addNewTcPr();
+        cellPr.addNewTcW().setW(BigInteger.valueOf(width));
+        cell.setColor(bgcolor);
+        cellPr.addNewVMerge().setVal(stMerge);
+        cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
+        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
+        cttc.getPList().get(0).addNewR().addNewT().setStringValue(value);
+    }
+
+
+    public void saveDocument(XWPFDocument document, String savePath) throws Exception {
+        FileOutputStream fos = new FileOutputStream(savePath);
+        document.write(fos);
+        fos.close();
+    }
+
+
+}

+ 39 - 0
src/test/java/com/WordExport2.java

@@ -0,0 +1,39 @@
+package com;
+
+import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
+import org.apache.poi.xwpf.usermodel.*;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign;
+import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+
+import java.io.*;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author :huZhiHao
+ * @Date :Created in 2020/4/7 16:46
+ * @Description: TODO
+ * @Modified By:
+ * @Version: v0.0.1
+ */
+public class WordExport2 {
+
+    //    POI方案为word添加页眉
+    public static void main(String[] args) throws IOException {
+        File is = new File("E:/upload/苏州国家高新区产业用地预审办文单.docx");//文件路径
+        FileInputStream fis = new FileInputStream(is);
+        XWPFDocument docx = new XWPFDocument(fis);//文档对象
+        CTP ctp = CTP.Factory.newInstance();
+        XWPFParagraph paragraph = new XWPFParagraph(ctp, docx);//段落对象
+        ctp.addNewR().addNewT().setStringValue("华丽的测试页眉2019051488888888");//设置页眉参数
+        ctp.addNewR().addNewT().setSpace(SpaceAttribute.Space.PRESERVE);
+        CTSectPr sectPr = docx.getDocument().getBody().isSetSectPr() ? docx.getDocument().getBody().getSectPr() : docx.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);
+        XWPFHeader header = policy.createHeader(STHdrFtr.DEFAULT, new XWPFParagraph[] { paragraph });
+        header.setXWPFDocument(docx);
+        OutputStream os = new FileOutputStream("E:/upload/Test__.docx");
+        docx.write(os);//输出到本地
+    }
+}

+ 34 - 0
src/test/java/com/WordExport3.java

@@ -0,0 +1,34 @@
+package com;
+
+import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFHeader;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
+
+import java.io.*;
+import java.util.List;
+
+/**
+ * @Author :huZhiHao
+ * @Date :Created in 2020/4/7 16:46
+ * @Description: TODO
+ * @Modified By:
+ * @Version: v0.0.1
+ */
+public class WordExport3 {
+
+    //    POI 方案获取word页眉
+    public static void main(String[] args) throws IOException {
+        File is = new File("E:/upload/苏州国家高新区产业用地预审办文单.docx");//文件路径
+        FileInputStream fis = new FileInputStream(is);
+        XWPFDocument docx = new XWPFDocument(fis);
+        List<XWPFHeader> headerList = docx.getHeaderList();
+        for (XWPFHeader xwpfHeader: headerList){
+            System.out.println(xwpfHeader.getText());//页眉
+        }
+    }
+}

+ 168 - 0
src/test/java/com/WordExport4.java

@@ -0,0 +1,168 @@
+package com;
+
+import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
+import org.apache.poi.xwpf.usermodel.*;
+import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+
+import java.io.*;
+import java.math.BigInteger;
+
+/**
+ * @Author :huZhiHao
+ * @Date :Created in 2020/4/7 16:46
+ * @Description: TODO
+ * @Modified By:
+ * @Version: v0.0.1
+ */
+public class WordExport4 {
+
+    //    POI方案为word添加页眉
+    public static void main(String[] args) throws IOException {
+        File is = new File("E:/upload/苏州国家高新区产业用地预审办文单.docx");//文件路径
+        FileInputStream fis = new FileInputStream(is);
+        XWPFDocument docx = new XWPFDocument(fis);//文档对象
+        createHeader(docx, null, null);
+        OutputStream os = new FileOutputStream("E:/upload/Test__.docx");
+        docx.write(os);//输出到本地
+    }
+
+    public static void createHeader(XWPFDocument doc, String orgFullName, String logoFilePath) {
+        /*
+         * 对页眉段落作处理,使公司logo图片在页眉左边,公司全称在页眉右边
+         * */
+        CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);
+        XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
+
+        XWPFParagraph paragraph = header.getParagraphArray(0);
+        paragraph.setAlignment(ParagraphAlignment.LEFT);
+        paragraph.setBorderBottom(Borders.THICK);
+
+        CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
+        tabStop.setVal(STTabJc.RIGHT);
+        int twipsPerInch = 1440;
+        tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
+
+        XWPFRun run = paragraph.createRun();
+        setXWPFRunStyle(run, "新宋体", 10);
+
+        /*
+         * 根据公司logo在ftp上的路径获取到公司到图片字节流
+         * 添加公司logo到页眉,logo在左边
+         * */
+        /*if (StringUtils.isNotEmptyOrNull(logoFilePath)) {
+            String imgFile = FileUploadUtil.getLogoFilePath(logoFilePath);
+            byte[] bs = FtpUtil.downloadFileToIo(imgFile);
+            InputStream is = new ByteArrayInputStream(bs);
+
+            XWPFPicture picture = run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU(80), Units.toEMU(45));
+
+            String blipID = "";
+            for(XWPFPictureData picturedata : header.getAllPackagePictures()) { //这段必须有,不然打开的logo图片不显示
+                blipID = header.getRelationId(picturedata);
+            }
+            picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID);
+            run.addTab();
+            is.close();
+        }*/
+
+        /*
+         * 添加字体页眉,公司全称
+         * 公司全称在右边
+         * */
+        /*if (StringUtils.isNotEmptyOrNull(orgFullName)) {
+            run = paragraph.createRun();
+            run.setText(orgFullName);
+            setXWPFRunStyle(run,"新宋体",10);
+        }*/
+        run = paragraph.createRun();
+        run.setText("orgFullName");
+        setXWPFRunStyle(run, "新宋体", 10);
+    }
+
+    public static void createFooter(XWPFDocument document, String telephone, String orgAddress) throws Exception {
+        /*
+         * 生成页脚段落
+         * 给段落设置宽度为占满一行
+         * 为公司地址和公司电话左对齐,页码右对齐创造条件
+         * */
+        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
+        XWPFFooter footer = headerFooterPolicy.createFooter(STHdrFtr.DEFAULT);
+        XWPFParagraph paragraph = footer.getParagraphArray(0);
+        paragraph.setAlignment(ParagraphAlignment.LEFT);
+        paragraph.setVerticalAlignment(TextAlignment.CENTER);
+        paragraph.setBorderTop(Borders.THICK);
+        CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
+        tabStop.setVal(STTabJc.RIGHT);
+        int twipsPerInch = 1440;
+        tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
+
+        /*
+         * 给段落创建元素
+         * 设置元素字面为公司地址+公司电话
+         * */
+        XWPFRun run = paragraph.createRun();
+//        run.setText((StringUtils.isNotEmptyOrNull(orgAddress) ? orgAddress : "") + (StringUtils.isNotEmptyOrNull(telephone) ? "  " + telephone: ""));
+        setXWPFRunStyle(run, "仿宋", 10);
+        run.addTab();
+
+        /*
+         * 生成页码
+         * 页码右对齐
+         * */
+        run = paragraph.createRun();
+        run.setText("第");
+        setXWPFRunStyle(run, "仿宋", 10);
+
+        run = paragraph.createRun();
+        CTFldChar fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        run = paragraph.createRun();
+        CTText ctText = run.getCTR().addNewInstrText();
+        ctText.setStringValue("PAGE  \\* MERGEFORMAT");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        setXWPFRunStyle(run, "仿宋", 10);
+
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        run = paragraph.createRun();
+        run.setText("页 总共");
+        setXWPFRunStyle(run, "仿宋", 10);
+
+        run = paragraph.createRun();
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+
+        run = paragraph.createRun();
+        ctText = run.getCTR().addNewInstrText();
+        ctText.setStringValue("NUMPAGES  \\* MERGEFORMAT ");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        setXWPFRunStyle(run, "仿宋", 10);
+
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+
+        run = paragraph.createRun();
+        run.setText("页");
+        setXWPFRunStyle(run, "仿宋", 10);
+
+    }
+
+    /**
+     * 设置页脚的字体样式
+     *
+     * @param r1 段落元素
+     */
+    private static void setXWPFRunStyle(XWPFRun r1, String font, int fontSize) {
+        r1.setFontSize(fontSize);
+        CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
+        CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
+        fonts.setAscii(font);
+        fonts.setEastAsia(font);
+        fonts.setHAnsi(font);
+    }
+}