Quellcode durchsuchen

闲置厂房功能

yin_yu820 vor 3 Tagen
Ursprung
Commit
8247d6552d
22 geänderte Dateien mit 3230 neuen und 7 gelöschten Zeilen
  1. 240 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/controller/IdleFactoryBuildingsController.java
  2. 99 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/domain/IdleFactoryBuildings.java
  3. 30 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/mapper/IdleFactoryBuildingsMapper.java
  4. 64 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/mapper/xml/IdleFactoryBuildingsMapper.xml
  5. 43 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/IdleFactoryBuildingsService.java
  6. 157 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/dto/IdleFactoryBuildingsDTO.java
  7. 24 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/mapstruct/IdleFactoryBuildingsWrapper.java
  8. 4 0
      jp-console/jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/config/WebSecurityConfig.java
  9. 3 3
      jp-console/jeeplus-web/src/main/resources/application-development.yml
  10. 39 0
      jp-mobile/api/auth/loginService.js
  11. 1 1
      jp-mobile/common/config.js
  12. 22 0
      jp-mobile/pages.json
  13. 390 0
      jp-mobile/pages/factoryBuildings/factoryBuildingsAdd.vue
  14. 527 0
      jp-mobile/pages/factoryBuildings/factoryBuildingsInfo.vue
  15. 774 0
      jp-mobile/pages/factoryBuildings/factoryBuildingsList.vue
  16. 197 0
      jp-mobile/pages/login/factorylogin.vue
  17. 1 2
      jp-mobile/pages/policy/policyList.vue
  18. BIN
      jp-mobile/static/img/logo2.png
  19. 1 1
      jp-ui/.env.development
  20. 60 0
      jp-ui/src/api/idlefactorybuildings/idleFactoryBuildingsService.js
  21. 203 0
      jp-ui/src/views/modules/idlefactorybuildings/IdleFactoryBuildingsForm.vue
  22. 351 0
      jp-ui/src/views/modules/idlefactorybuildings/IdleFactoryBuildingsList.vue

+ 240 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/controller/IdleFactoryBuildingsController.java

@@ -0,0 +1,240 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.controller;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import com.google.common.collect.Lists;
+import com.jeeplus.core.excel.EasyExcelUtils;
+import com.jeeplus.core.excel.ExcelOptions;
+import com.jeeplus.core.excel.annotation.ExportMode;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.idlefactorybuildings.domain.IdleFactoryBuildings;
+import com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO;
+import com.jeeplus.idlefactorybuildings.service.mapstruct.IdleFactoryBuildingsWrapper;
+import com.jeeplus.idlefactorybuildings.service.IdleFactoryBuildingsService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 闲置厂房Controller
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+
+@Api(tags ="闲置厂房")
+@RestController
+@RequestMapping(value = "/idlefactorybuildings/idleFactoryBuildings")
+public class IdleFactoryBuildingsController {
+
+	@Autowired
+	private IdleFactoryBuildingsService idleFactoryBuildingsService;
+
+	@Autowired
+	private IdleFactoryBuildingsWrapper idleFactoryBuildingsWrapper;
+
+	/**
+	 * 闲置厂房列表数据
+	 */
+	@ApiLog("查询闲置厂房列表数据")
+	@ApiOperation(value = "查询闲置厂房列表数据")
+	@PreAuthorize("hasAuthority('idlefactorybuildings:idleFactoryBuildings:list')")
+	@GetMapping("list")
+	public ResponseEntity<IPage<IdleFactoryBuildings>> list(IdleFactoryBuildingsDTO idleFactoryBuildingsDTO, Page<IdleFactoryBuildings> page) throws Exception {
+
+		UserDTO userDTO = UserUtils.getCurrentUserDTO();
+		if(userDTO.getRoleIds().contains("1996038972899717121")){
+			String offid=userDTO.getOfficeDTO().getId();
+			if(offid.equals("taiChuangYuan")){
+				idleFactoryBuildingsDTO.setPark(1);
+			}else if(offid.equals("daGangZheng")){
+				idleFactoryBuildingsDTO.setPark(2);
+			}else if(offid.equals("daZhongHuoZheng")){
+				idleFactoryBuildingsDTO.setPark(3);
+			}else if(offid.equals("xueFuZheng")){
+				idleFactoryBuildingsDTO.setPark(4);
+			}else if(offid.equals("shangZhuangZheng")){
+				idleFactoryBuildingsDTO.setPark(5);
+			}else if(offid.equals("zhangZhuangJieDao")){
+				idleFactoryBuildingsDTO.setPark(6);
+			}else if(offid.equals("louWangZheng")){
+				idleFactoryBuildingsDTO.setPark(7);
+			}else if(offid.equals("panHuangJieDao")){
+				idleFactoryBuildingsDTO.setPark(8);
+			}else if(offid.equals("yanDuJieDao")){
+				idleFactoryBuildingsDTO.setPark(9);
+			}else if(offid.equals("qinNanZheng")){
+				idleFactoryBuildingsDTO.setPark(10);
+			}else if(offid.equals("guoMengZheng")){
+				idleFactoryBuildingsDTO.setPark(11);
+			}else if(offid.equals("yanDuGaoXinQu")){
+				idleFactoryBuildingsDTO.setPark(12);
+			}else if(offid.equals("longGangZheng")){
+				idleFactoryBuildingsDTO.setPark(13);
+			}
+		}
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (idleFactoryBuildingsDTO, IdleFactoryBuildingsDTO.class);
+		IPage<IdleFactoryBuildings> result = idleFactoryBuildingsService.page (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}
+
+	/**
+	 * 闲置厂房列表数据
+	 */
+	@ApiLog("查询闲置厂房列表数据")
+	@ApiOperation(value = "查询闲置厂房列表数据")
+	@GetMapping("list2")
+	public ResponseEntity<IPage<IdleFactoryBuildingsDTO>> list2(IdleFactoryBuildingsDTO idleFactoryBuildingsDTO, Page<IdleFactoryBuildingsDTO> page) throws Exception {
+		String area=idleFactoryBuildingsDTO.getIdleArea();
+		if(area!=null&&area.equals("")){
+			idleFactoryBuildingsDTO.setIdleArea("");
+		}
+		idleFactoryBuildingsDTO.setState(1);
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (idleFactoryBuildingsDTO, IdleFactoryBuildingsDTO.class);
+		if(area!=null&&!area.equals("")) {
+			if (area.equals("1")) {
+				queryWrapper.between("idle_area",0,500);
+			}else if(area.equals("2")){
+				queryWrapper.between("idle_area",500,1000);
+			}else if(area.equals("3")){
+				queryWrapper.between("idle_area",1000,3000);
+			}else if(area.equals("4")){
+				queryWrapper.between("idle_area",3000,5000);
+			}else if(area.equals("5")){
+				queryWrapper.gt("idle_area",5000);
+			}
+		}
+
+		IPage<IdleFactoryBuildingsDTO> result = idleFactoryBuildingsService.findPage (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}
+
+	/**
+	 * 取字典值
+	 */
+	@ApiLog("取字典值")
+	@ApiOperation(value = "取字典值")
+	@GetMapping("getDictList")
+	public ResponseEntity<List<HashMap<String, Object>>> getDictList(String type) throws Exception {
+		List<HashMap<String, Object>> map=idleFactoryBuildingsService.getDictList(type);
+		return ResponseEntity.ok (map);
+	}
+
+
+	/**
+	 * 根据Id获取闲置厂房数据
+	 */
+	@ApiLog("根据Id获取闲置厂房数据")
+	@ApiOperation(value = "根据Id获取闲置厂房数据")
+	@PreAuthorize("hasAnyAuthority('idlefactorybuildings:idleFactoryBuildings:view','idlefactorybuildings:idleFactoryBuildings:add','idlefactorybuildings:idleFactoryBuildings:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<IdleFactoryBuildingsDTO> queryById(String id) {
+		return ResponseEntity.ok ( idleFactoryBuildingsWrapper.toDTO ( idleFactoryBuildingsService.getById ( id ) ) );
+	}
+
+	/**
+	 * 根据Id获取闲置厂房数据
+	 */
+	@ApiLog("根据Id获取闲置厂房数据")
+	@ApiOperation(value = "根据Id获取闲置厂房数据")
+	@GetMapping("queryById2")
+	public ResponseEntity<IdleFactoryBuildingsDTO> queryById2(String id) {
+		return ResponseEntity.ok (  idleFactoryBuildingsService.findById ( id )  );
+	}
+
+	/**
+	 * 保存闲置厂房
+	 */
+	@ApiLog("保存闲置厂房")
+	@ApiOperation(value = "保存闲置厂房")
+	@PreAuthorize("hasAnyAuthority('idlefactorybuildings:idleFactoryBuildings:add','idlefactorybuildings:idleFactoryBuildings:edit')")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody IdleFactoryBuildingsDTO idleFactoryBuildingsDTO) {
+		//新增或编辑表单保存
+		idleFactoryBuildingsService.saveOrUpdate (idleFactoryBuildingsWrapper.toEntity (idleFactoryBuildingsDTO));
+        return ResponseEntity.ok ( "保存闲置厂房成功" );
+	}
+
+
+	/**
+	 * 删除闲置厂房
+	 */
+	@ApiLog("删除闲置厂房")
+	@ApiOperation(value = "删除闲置厂房")
+	@PreAuthorize("hasAuthority('idlefactorybuildings:idleFactoryBuildings:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        idleFactoryBuildingsService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除闲置厂房成功" );
+	}
+
+	/**
+     * 导出闲置厂房数据
+     *
+     * @param idleFactoryBuildingsDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出闲置厂房数据")
+    @PreAuthorize("hasAnyAuthority('idlefactorybuildings:idleFactoryBuildings:export')")
+    @GetMapping("export")
+    public void exportFile(IdleFactoryBuildingsDTO idleFactoryBuildingsDTO, Page <IdleFactoryBuildings> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (idleFactoryBuildingsDTO, IdleFactoryBuildingsDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List < IdleFactoryBuildings> result = idleFactoryBuildingsService.page ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( idleFactoryBuildingsService, idleFactoryBuildingsWrapper ).exportExcel ( result,  options.getSheetName ( ), IdleFactoryBuildingsDTO.class, fileName,options.getExportFields (), response );
+    }
+
+    /**
+     * 导入闲置厂房数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('idlefactorybuildings:idleFactoryBuildings:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( idleFactoryBuildingsService, idleFactoryBuildingsWrapper ).importExcel ( file, IdleFactoryBuildingsDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入闲置厂房数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('idlefactorybuildings:idleFactoryBuildings:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "闲置厂房数据导入模板.xlsx";
+        List<IdleFactoryBuildingsDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( idleFactoryBuildingsService, idleFactoryBuildingsWrapper ).exportExcel ( list,  "闲置厂房数据", IdleFactoryBuildingsDTO.class, fileName, null, response );
+    }
+
+}

+ 99 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/domain/IdleFactoryBuildings.java

@@ -0,0 +1,99 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 闲置厂房Entity
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ly_idle_factory_buildings")
+public class IdleFactoryBuildings extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+     * 厂房名称
+     */
+	private String name;
+	/**
+     * 板块
+     */
+	private Integer park;
+	/**
+     * 位置
+     */
+	private String address;
+	/**
+     * 厂房权属
+     */
+	private Integer ownership;
+	/**
+     * 厂房占地面积(亩)
+     */
+	private String area;
+	/**
+     * 单层或多层
+     */
+	private Integer singleLayer;
+	/**
+     * 层数
+     */
+	private String numberLayers;
+	/**
+     * 层高(米)
+     */
+	private String floorHeight;
+	/**
+     * 闲置厂房面积(㎡)
+     */
+	private String idleArea;
+	/**
+     * 备注
+     */
+	private String remark;
+	/**
+     * 厂房状态
+     */
+	private Integer state;
+	/**
+     * 预留
+     */
+	private String des1;
+	/**
+     * 预留
+     */
+	private String des2;
+	/**
+     * 预留
+     */
+	private String des3;
+	/**
+     * 预留
+     */
+	private String des4;
+	/**
+     * 预留
+     */
+	private String des5;
+	/**
+     * 预留
+     */
+	private String des6;
+	/**
+     * 预留
+     */
+	private String des7;
+	/**
+     * 预留
+     */
+	private String des8;
+
+}

+ 30 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/mapper/IdleFactoryBuildingsMapper.java

@@ -0,0 +1,30 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.idlefactorybuildings.domain.IdleFactoryBuildings;
+import com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO;
+import com.jeeplus.question.service.dto.DzfQuestionDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 闲置厂房MAPPER接口
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+public interface IdleFactoryBuildingsMapper extends BaseMapper<IdleFactoryBuildings> {
+
+    IPage<IdleFactoryBuildingsDTO> findList(Page<IdleFactoryBuildingsDTO> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+    IdleFactoryBuildingsDTO findById(String id);
+    List<HashMap<String, Object>> getDictList(String type);
+
+}

+ 64 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/mapper/xml/IdleFactoryBuildingsMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.idlefactorybuildings.mapper.IdleFactoryBuildingsMapper">
+
+    <sql id="idleFactoryBuildingsColumns">
+        a.id AS "id",
+		a.name AS "name",
+		a.park AS "park",
+		a.address AS "address",
+		a.ownership AS "ownership",
+		a.area AS "area",
+		a.single_layer AS "singleLayer",
+		a.number_layers AS "numberLayers",
+		a.floor_height AS "floorHeight",
+		a.idle_area AS "idleArea",
+		a.remark AS "remark",
+        a.state AS "state",
+		b.label AS "des1",
+		a.des2 AS "des2",
+		a.des3 AS "des3",
+		a.des4 AS "des4",
+		a.des5 AS "des5",
+		a.des6 AS "des6",
+		a.des7 AS "des7",
+		a.des8 AS "des8",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.del_flag AS "delFlag"
+
+    </sql>
+
+    <sql id="idleFactoryBuildingsJoins">
+
+        LEFT JOIN sys_dict_value b on b.value=a.park and dict_type_id='1995785139824984065'
+
+    </sql>
+
+    <select id="findList" resultType="com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO" >
+        SELECT
+        <include refid="idleFactoryBuildingsColumns"/>
+        FROM ly_idle_factory_buildings a
+        <include refid="idleFactoryBuildingsJoins"/>
+        ${ew.customSqlSegment}
+
+    </select>
+
+    <select id="findById" resultType="com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO">
+        SELECT
+        <include refid="idleFactoryBuildingsColumns"/>
+        FROM ly_idle_factory_buildings a
+        <include refid="idleFactoryBuildingsJoins"/>
+        WHERE a.id = #{id} and a.del_flag = 0
+    </select>
+
+	<select id="getDictList" resultType="map">
+		SELECT a.label as label,a.value as value from sys_dict_value a
+			left join sys_dict_type b on a.dict_type_id=b.id
+
+		where b.type=#{type} ORDER BY a.sort asc
+	</select>
+
+</mapper>

+ 43 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/IdleFactoryBuildingsService.java

@@ -0,0 +1,43 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO;
+import com.jeeplus.question.service.dto.DzfQuestionDTO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.idlefactorybuildings.domain.IdleFactoryBuildings;
+import com.jeeplus.idlefactorybuildings.mapper.IdleFactoryBuildingsMapper;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 闲置厂房Service
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+@Service
+@Transactional
+public class IdleFactoryBuildingsService extends ServiceImpl<IdleFactoryBuildingsMapper, IdleFactoryBuildings> {
+
+    public IPage<IdleFactoryBuildingsDTO> findPage(Page<IdleFactoryBuildingsDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+        return  baseMapper.findList (page, queryWrapper);
+    }
+
+    public IdleFactoryBuildingsDTO findById(String id) {
+        IdleFactoryBuildingsDTO IdleFactoryBuildingsDTO = baseMapper.findById ( id );
+        return IdleFactoryBuildingsDTO;
+    }
+
+    public List<HashMap<String, Object>> getDictList(String type) {
+        return baseMapper.getDictList (type);
+    }
+
+}

+ 157 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/dto/IdleFactoryBuildingsDTO.java

@@ -0,0 +1,157 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.service.dto;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.NotNull;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.excel.converter.ExcelDictDTOConverter;
+import com.jeeplus.core.excel.annotation.ExcelDictProperty;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 闲置厂房DTO
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class IdleFactoryBuildingsDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 厂房名称
+     */
+	@NotNull(message="厂房名称不能为空")
+    @Query(type = QueryType.LIKE)
+	@ExcelProperty("厂房名称") 
+	private String name;
+	        
+	/**
+     * 板块
+     */
+	@NotNull(message="板块不能为空")
+    @Query(type = QueryType.EQ)
+	@ExcelProperty(value = "板块", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("sys_park")
+	private Integer park;
+	        
+	/**
+     * 位置
+     */
+	@NotNull(message="位置不能为空")
+	@ExcelProperty("位置") 
+	private String address;
+	        
+	/**
+     * 厂房权属
+     */
+	@ExcelProperty(value = "厂房权属", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("sys_ownership")
+	private Integer ownership;
+	        
+	/**
+     * 厂房占地面积(亩)
+     */
+	@NotNull(message="厂房占地面积(亩)不能为空")
+	@ExcelProperty("厂房占地面积(亩)") 
+	private String area;
+	        
+	/**
+     * 单层或多层
+     */
+	@ExcelProperty(value = "单层或多层", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("sys_single_layer")
+	private Integer singleLayer;
+	        
+	/**
+     * 层数
+     */
+	@ExcelProperty("层数") 
+	private String numberLayers;
+	        
+	/**
+     * 层高(米)
+     */
+	@ExcelProperty("层高(米)") 
+	private String floorHeight;
+	        
+	/**
+     * 闲置厂房面积(㎡)
+     */
+	@NotNull(message="闲置厂房面积(㎡)不能为空")
+    @Query(type = QueryType.BETWEEN)
+	@ExcelProperty("闲置厂房面积(㎡)") 
+	private String idleArea;
+	        
+	/**
+     * 备注
+     */
+	@ExcelProperty("备注") 
+	private String remark;
+	        
+	/**
+     * 厂房状态
+     */
+	@NotNull(message="厂房状态不能为空")
+    @Query(type = QueryType.EQ)
+	@ExcelProperty(value = "厂房状态", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("sys_factory_state")
+	private Integer state;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des1;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des2;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des3;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des4;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des5;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des6;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des7;
+	        
+	/**
+     * 预留
+     */
+	@ExcelProperty("预留") 
+	private String des8;
+
+}

+ 24 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/idlefactorybuildings/service/mapstruct/IdleFactoryBuildingsWrapper.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.idlefactorybuildings.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.idlefactorybuildings.service.dto.IdleFactoryBuildingsDTO;
+import com.jeeplus.idlefactorybuildings.domain.IdleFactoryBuildings;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  IdleFactoryBuildingsWrapper
+ * @author 尹宇
+ * @version 2025-12-03
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface IdleFactoryBuildingsWrapper extends EntityWrapper<IdleFactoryBuildingsDTO, IdleFactoryBuildings> {
+
+    IdleFactoryBuildingsWrapper INSTANCE = Mappers.getMapper(IdleFactoryBuildingsWrapper.class);
+}
+

+ 4 - 0
jp-console/jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/config/WebSecurityConfig.java

@@ -87,6 +87,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                         "/enterpriseinfo/enterpriseInfo/getIndustryChainList",
                         "/enterpriseinfo/enterpriseInfo/loginid",
 
+                        "/idlefactorybuildings/idleFactoryBuildings/list2",
+                        "/idlefactorybuildings/idleFactoryBuildings/queryById2",
+                        "/idlefactorybuildings/idleFactoryBuildings/getDictList",
+
                         "/dp/dp/getDzfCount",
                         "/dp/dp/getZcs",
 

+ 3 - 3
jp-console/jeeplus-web/src/main/resources/application-development.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8071
+  port: 8072
   servlet:
     context-path:
   tomcat:
@@ -47,8 +47,8 @@ spring:
       datasource:
         master:
           username: root
-          password: root
-          url: jdbc:mysql://localhost:3306/yd_qycpfb_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
+          password: dmjxcc@20210730
+          url: jdbc:mysql://39.105.5.238:3306/yd_qycpfb_ce?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
           driver-class-name: com.mysql.cj.jdbc.Driver
 
           #oracle database settings

+ 39 - 0
jp-mobile/api/auth/loginService.js

@@ -22,6 +22,45 @@ export default {
 		})
 	},
 	
+	factoryBuildingsList: function (params) {
+	    return request({
+	        url: '/idlefactorybuildings/idleFactoryBuildings/list2',
+	        method: 'get',
+	        params: params
+	    })
+	},
+	
+	factoryqueryById: function(id) {
+		return request({
+			url: '/idlefactorybuildings/idleFactoryBuildings/queryById2',
+			method: 'get',
+			params: {
+				id: id
+			}
+		})
+	},
+	
+	savefactoryBuildings: function(params) {
+		return request({
+			url: '/idlefactorybuildings/idleFactoryBuildings/save',
+			method: 'post',
+			params: params
+		})
+	},
+	
+	//获取字典数据
+	getDictListBytype: function(type) {
+		return request({
+			url: '/idlefactorybuildings/idleFactoryBuildings/getDictList',
+			method: 'get',
+			params: {
+				type: type
+			}
+		})
+	},
+	
+	
+	
 	policyList: function (params) {
 	    return request({
 	        url: '/enterpriseelectricity/enterpriseElectricity/list',

+ 1 - 1
jp-mobile/common/config.js

@@ -3,7 +3,7 @@ let APP_SERVER_URL = ""
 if(process.env.NODE_ENV === 'development'){
     // 开发环境    http://47.97.69.114:8088/#/login 
     //APP_SERVER_URL = 'http://47.97.69.114:8088/panhuangly/'
-	APP_SERVER_URL = 'http://192.168.139.31:8071'
+	APP_SERVER_URL = 'http://192.168.139.31:8072'
 	//APP_SERVER_URL = 'https://ydwqfw.com.cn/yd_qycpfbWeb/yd_qycpfb'
 }else{
     // 生产环境

+ 22 - 0
jp-mobile/pages.json

@@ -44,6 +44,21 @@
 			"style": {}
 		},
 		
+		{
+			"path": "pages/factoryBuildings/factoryBuildingsList",
+			"style": {}
+		},
+		
+		{
+			"path": "pages/factoryBuildings/factoryBuildingsAdd",
+			"style": {}
+		},
+		
+		{
+			"path": "pages/factoryBuildings/factoryBuildingsInfo",
+			"style": {}
+		},
+		
 		{
 			"path": "pages/policy/policyList",
 			"style": {}
@@ -225,6 +240,13 @@
 				"navigationBarTitleText": "登录"
 			}
 		},
+		{
+			"path": "pages/login/factorylogin",
+			"style": {
+				"navigationBarTitleText": "登录"
+			}
+		},
+		
 		{
 			"path": "pages/user/person/person",
 			"style": {

+ 390 - 0
jp-mobile/pages/factoryBuildings/factoryBuildingsAdd.vue

@@ -0,0 +1,390 @@
+<template>
+	<view>
+		<!-- <cu-custom bgColor="bg-blue" :isBack="true" v-if="title == '发布产品供需'">
+			<block slot="backText">返回</block>
+			<block slot="content">发布产品供需</block>
+		</cu-custom>
+		<cu-custom bgColor="bg-blue" :isBack="true" v-if="title == '修改产品供需'">
+			<block slot="backText">返回</block>
+			<block slot="content">修改产品供需</block>
+		</cu-custom>
+		<cu-custom bgColor="bg-blue" :isBack="true" v-if="title == '查看产品供需'">
+			<block slot="backText">返回</block>
+			<block slot="content">查看产品供需</block>
+		</cu-custom> -->
+		
+		<view :class="['custom-header', { 'is-back': isBack }, bgColor]">
+			<view class="back-container" @click="handleBack">
+			  <view class="back-text">返回</view>
+			</view>
+			<view class="content-container">
+			  <view class="content-text">{{title}}</view>
+			</view>
+		  </view>
+		
+		
+		<form @submit="formSubmit" class="cu-list menu">
+			<view class="input1">
+				<view class="title">
+					供需类别
+				</view>
+						
+
+				<picker class="title2" @change="bindPickerChange" :value="index" :range="parkList">
+					<view class="input2">{{parkList[index]}}</view>
+				</picker>
+
+				
+			</view>
+										
+			
+			<view class="cu-form-group margin-top">
+				<view class="title">
+					{{t1}}
+				</view>
+				<input v-model="inputForm.des2" :placeholder="t1s" :disabled="ischeck"></input>
+			</view>
+
+			<view class="cu-form-group margin-top">
+				<view class="title">
+					{{t2}}
+				</view>
+				<input v-model="inputForm.des3" :placeholder="t2s" :disabled="ischeck"></input>
+			</view>
+			
+					
+			<view class="cu-form-group margin-top">
+				<view class="title">
+					{{t3}}
+				</view>
+				<textarea v-model="inputForm.des4" :placeholder="t3s" :disabled="ischeck"></textarea>
+			</view>
+
+			
+
+			<view class="cu-form-group margin-top">
+				<uni-file-picker style="margin-bottom: 10px;" limit="3" ref="picFile" v-model="picLists"
+					fileMediatype="image" mode="grid" title="图片上传" :auto-upload="autoUpload" @select="select"
+					@progress="progress" @success="success" @fail="fail" @delete="deleteFile"
+					:imageStyles="imageStyles" :disabled="ischeck">
+				</uni-file-picker>
+			</view>
+
+			
+			<view style="height: 40rpx;"></view>
+			<view class="padding-xl" v-if="!ischeck">
+				<button form-type="submit" class="cu-btn block bg-blue margin-tb-sm lg">提交</button>
+			</view>
+		</form>
+	</view>
+</template>
+
+<script>
+	var graceChecker = require("@/common/graceChecker.js");
+	import revenueListService from '@/api/revenue/revenueListService'
+	import loginService from '@/api/auth/loginService.js'
+	export default {
+		onShow() {
+			this.$auth.checkLogin()
+		},
+		data() {
+			return {
+				title: '发布产品供需',
+				bgColor: 'bg-blue', // 背景颜色
+				inputForm: {
+					qyId:'0',
+					id: '',
+					des1: '1',
+					des2: '',
+					des3: '',
+					des4: '',
+					des6: '',			
+				},
+				t1: '可供产品',
+				t1s: '请填写可供产品',
+				t2: '可供数量',
+				t2s: '请填写可供数量',
+				t3: '详细描述',
+				t3s: '请填写详细描述',
+								
+				autoUpload: false,
+				picLists: [],
+				picUrl: [],
+				imageStyles: {
+					width: 90,
+					height: 90
+				},
+				parkList: [ "供", "需"],
+				index:0,
+				ischeck: false,
+			}
+		},
+		created() {
+			//this.getParkList()
+		},
+		mounted() {
+			
+		},
+		async onLoad(query) {
+			
+			if (query && query.ischeck) {
+				this.ischeck = true
+				this.title = "查看楼宇信息";
+			}
+			if (query && query.id && !query.ischeck) {
+				this.title = "修改楼宇信息";
+			}
+			if (query && query.id) {
+				let {
+					data
+				} = await loginService.queryByIdBuild(query.id)
+				console.log(data)
+				if (data.pic != null) {
+					data.pic = data.pic.split(",")
+					var list = data.pic
+					list.forEach(item => {
+						this.picUrl.push({
+							'url': item,
+							'uuid': item
+						})
+						this.picLists.push({
+							'url': item,
+							'uuid': item
+						})
+					})
+				} else {
+					data.pic = []
+				}
+				this.inputForm = this.recover(this.inputForm, data)
+			}
+		},
+		methods: {
+			getParkList() {
+				loginService.parkList({
+					current: 1,
+					size: 1000000,
+				}).then(({
+					data
+				}) => {
+					this.parkList = data.records.map((item) => {
+						return {
+							label: item.parkName,
+							value: item.id
+						}
+					})
+					console.log(this.parkList, '=============>')
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			bindPickerChange: function(e) {
+				if(e.detail.value==0){
+					this.t1='可供产品';
+					this.t1s= '请填写可供产品';
+					this.t2= '可供数量';
+					this.t2s= '请填写可供数量';
+				}else{
+					this.t1='需求名称';
+					this.t1s= '请填写需求名称';
+					this.t2= '需求数量';
+					this.t2s= '请填写需求数量';
+				}
+								
+				console.log('picker发送选择改变,携带值为', e.detail.value)
+				this.index = e.detail.value;
+				this.inputForm.des1=e.detail.value+1;
+			},
+			
+			// 获取上传进度
+			progress(e) {
+				console.log('上传进度:', e)
+			},
+			// 上传成功
+			success(e) {
+				console.log('上传成功')
+			},
+			// 上传失败
+			fail(e) {
+				console.log('上传失败:', e)
+			},
+			deleteFile(e) {
+				this.picUrl.splice(e.index, 1)
+			},
+			// 获取上传状态
+			select(e) {
+				console.log('选择文件:', e)
+				var _this = this
+				var i = 0
+				upload()
+
+				function upload() {
+					if (i >= e.tempFiles.length) {
+						return;
+					}
+					var item = e.tempFiles[i]
+					uni.showLoading({
+						title: "上传中",
+						mask: true
+					});
+					uni.uploadFile({
+						url: '/yd_qycpfb/file/upload?uploadPath=userdir', // 仅为示例,非真实的接口地址
+						filePath: item.url,
+						name: 'file',
+						formData: {
+							'fileName': item.name
+						},
+						header: {
+							'token': _this.$auth.getUserToken()
+						},
+						success: (res) => {
+							var data = res.data
+							if (typeof data['error'] != "undefined") {
+								uni.showToast({
+									icon: 'none',
+									title: '上传失败,请联系开发!'
+								});
+								_this.$refs.picFile.clearFiles(_this.picLists.length)
+							} else {
+								_this.picUrl.push({
+									url: data,
+									uuid: item.uuid
+								})
+								i++;
+								upload()
+							}
+						},
+						fail: () => {
+							uni.hideLoading();
+							uni.showToast({
+								icon: 'none',
+								title: '上传失败,请联系开发!'
+							});
+							_this.$refs.picFile.clearFiles(_this.picLists.length)
+						},
+						complete: function() {
+							uni.hideLoading();
+						}
+					});
+				}
+			},
+			formSubmit: function(e) {
+				//定义表单规则
+				var rule = [{
+						name: "des2",
+						checkType: "notnull",
+						checkRule: "",
+						errorMsg: "名称不能为空"
+					},
+				];
+				//进行表单检查
+				var formData = this.inputForm;
+				var checkRes = graceChecker.check(formData, rule);
+				console.log(checkRes, '===================>checkRes')
+				if (checkRes) {
+					uni.showLoading()
+					this.inputForm.des6 = [];
+					this.picUrl.forEach(item => {
+						this.inputForm.des6.push(item.url)
+					})
+					this.inputForm.des6 = this.inputForm.des6.toString();
+					
+					loginService.productSave(this.inputForm).then(({
+						data
+					}) => {
+						uni.showToast({
+							title: "产品供需发布成功!",
+							icon: "success"
+						});
+						uni.navigateTo({
+							url: '/pages/product/productList?w=1'
+						})
+					}).catch((e) => {
+
+					})
+
+				} else {
+					uni.showToast({
+						title: graceChecker.error,
+						icon: "none"
+					});
+				}
+			}
+		}
+	}
+</script>
+<style>
+	/* .file-title) {
+	    font-size: 17px !important;
+	} */
+	input,textarea{
+		color: #8799a3;
+	}
+	.input1{
+		background-color: #ffffff;
+		padding: 1upx 40upx;
+		display: flex;
+		align-items: center;
+		padding-top: 20upx;
+		border-bottom: 1px solid #eee;
+	}
+	.input1 .title {
+		text-align: justify;
+		padding-right: 30upx;
+		font-size: 30upx;
+		position: relative;
+		height: 60upx;
+		line-height: 60upx;
+		border: ;
+	}
+	.title2{
+		width: 75%;
+		text-align: left;
+	}
+	.input2 {
+		flex: 1;
+		font-size: 30upx;
+		color: #555;
+		padding-right: 20upx;
+	}
+	.uni-input{
+		
+	}
+	
+	.custom-header {
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  padding: 10px;
+	  width: 100%;
+	}
+	
+	.is-back {
+	  position: relative;
+	}
+	
+	.back-container {
+	  position: absolute;
+	  left: 10px;
+	  cursor: pointer;
+	}
+	
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+</style>

+ 527 - 0
jp-mobile/pages/factoryBuildings/factoryBuildingsInfo.vue

@@ -0,0 +1,527 @@
+<template>
+	<view>
+		<view class="overlay" v-if="showfx" @click="showwx">
+			<image style="height: 100%;width: 100%;" src="/static/img/zz.png"></image>
+		</view>
+				
+		<view :class="['custom-header', { 'is-back': isBack }, bgColor]">
+			<view class="back-container" @click="handleBack">
+			  <view class="back-text">返回</view>
+			</view>
+			<view class="content-container">
+			  <view class="content-text">{{title}}</view>
+			</view>
+		</view>
+					
+		<form class="cu-list menu">
+			
+			<view class="titlebg2">
+				<view class="titlet1" ></view>
+				<view class="titlet2" >厂房信息</view>								
+			</view>
+			
+			<view class="show1">
+				
+				<view class="textbg">
+					<view class="text1">
+						 厂房名称
+					</view>	
+					<input class="text44" v-model="inputForm.name" placeholder="输入厂房名称" :disabled="ischeck"></input>
+				</view>
+				
+				<view class="textbg">
+					<view class="text1">
+						 所属园区
+					</view>
+					<view v-if="ischeck" class="text2" :class="inputForm.des1 === '需' ? 'text33' : 'text44'" >
+						 {{inputForm.des1}}
+					</view>	
+								
+					<picker v-else class="title2" @change="bindPickerChange" rangeKey="label" rangeValue="value" :range="parkList">
+						<view class="text44" :class="{ placeholder: selectedPark === '请选择' }">{{ selectedPark }}</view>
+					</picker>	
+																				
+				</view>
+				
+				<view class="textbg">
+					<view class="text1">
+						 详细位置
+					</view>
+					<input class="text44" v-model="inputForm.address" placeholder="输入详细位置" :disabled="ischeck"></input>			
+				</view>
+			</view>
+
+			<view class="titlebg2">
+				<view class="titlet1" ></view>
+				<view class="titlet2" >闲置基本信息</view>								
+			</view>
+			
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t1}}
+				</view>
+				<view v-if="ischeck" class="text44" >
+					 {{ inputForm.ownership===1 ? '国有' :
+					        inputForm.ownership===2 ? '集体' : '民营' }}
+				</view>	
+					
+				<picker v-else class="title2" @change="bindPickerChange2" rangeKey="label" rangeValue="value" :range="parkList2">
+					<view class="text44" :class="{ placeholder: selectedownership === '请选择' }">{{ selectedownership }}</view>
+				</picker>
+				
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t2}}(亩)
+				</view>
+				<view class="text22">
+					 <input class="text44" v-model="inputForm.area" placeholder="输入占地面积" :disabled="ischeck"></input>
+				</view>				
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t3}}
+				</view>
+				<view v-if="ischeck" class="text44">
+					 {{inputForm.singleLayer===1 ? '单层' : '多层'}}
+				</view>	
+				<picker v-else class="title2" @change="bindPickerChange3" rangeKey="label" rangeValue="value" :range="parkList3">
+					<view class="text44" :class="{ placeholder: selectedsingleLayer === '请选择' }">{{ selectedsingleLayer }}</view>
+				</picker>			
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t4}}(㎡)
+				</view>
+				<view class="text221">
+					 <input class="text44" v-model="inputForm.idleArea" placeholder="输入占地面积" :disabled="ischeck"></input>
+				</view>		
+						
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t5}}
+				</view>
+				<view class="text221">
+					 <input class="text44" v-model="inputForm.numberLayers" placeholder="输入层数" :disabled="ischeck"></input>
+				</view>	
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 {{t6}}
+				</view>	
+				<view class="text221">
+					 <input class="text44" v-model="inputForm.floorHeight" placeholder="输入层高" :disabled="ischeck"></input>
+				</view>			
+			</view>
+			
+			<view class="textbg">
+				<view class="text12">
+					 备注
+				</view>	
+				<view class="text221">
+					 <input class="text44" v-model="inputForm.remark" placeholder="输入备注" :disabled="ischeck"></input>
+				</view>			
+			</view>
+			
+			<view style="height: 30rpx;background-color: white;"></view>
+			
+			<view class="titlebg2" v-if="swiperList.length>0" >
+				<view class="titlet1" ></view>
+				<view class="titlet2" >图文详情</view>								
+			</view>
+			
+			<view v-for="(item, index) in swiperList" :key="index" style="width: 100%;">
+				<image :src="item.url"  mode="widthFix" style="width: 100%;" >					
+				</image>
+			</view>				
+			
+			<view style="height: 40rpx;"></view>
+
+			<view class="padding-xl" v-if="!ischeck">
+				<button @click="save" class="cu-btn block bg-blue margin-tb-sm lg">提交</button>
+			</view>
+
+		</form>
+	</view>
+</template>
+
+<script>
+	import loginService from '@/api/auth/loginService.js'
+	import { wxShare } from "@/common/wxutils.js";
+	export default {
+		
+		data() {
+			return {
+				title: '闲置厂房详情',
+				isBack: true, // 是否显示返回按钮
+			    backText: '返回', // 返回按钮的文本
+			    bgColor: 'bg-blue', // 背景颜色
+				ischeck: true,
+				isAdd: true,
+				autoUpload: false,
+				swiperList: [],
+				inputForm: {
+					id: '',
+					name: '',
+					park: '',
+					address: '',
+					ownership: '',
+					area: '',
+					singleLayer: '',
+					numberLayers: '',
+					floorHeight: '',
+					idleArea: '',
+					remark: '',
+					state: '',
+					des1: '',
+					des2: '',
+					des3: '',
+					des4: '',
+					des5: '',					
+					des6: '',
+					des7: '',
+					des8: '',
+					des9: '',		
+
+				},
+				t1: '厂房权属',
+				t2: '占地面积',
+				t3: '单层/多层',
+				t4: '闲置面积',
+				t5: '层数',
+				t6: '层高',
+				text1:'',
+				text2:'',
+				parkList: [],
+				parkList2: [],
+				parkList3: [],
+				selectedPark:'请选择',
+				selectedownership:'请选择',
+				selectedsingleLayer:'请选择',
+				
+				index:0,
+				isLogin:"",
+				username:"",
+				isadmin:false,
+				lyIndex: '',
+				showLYList: [],
+				showfx:false,
+				rules: {
+				  name: { label: '厂房名称', required: true },
+				  park: { label: '所属园区', required: true },
+				  address: { label: '详细位置', required: true },
+				  ownership: { label: '厂房权属', required: true },
+				  area: { label: '占地面积', required: true, pattern: /^\d+(\.\d{1,2})?$/ },
+				  singleLayer: { label: '单层/多层', required: true },
+				  idleArea: { label: '闲置面积', required: true, pattern: /^\d+(\.\d{1,2})?$/ },
+				  numberLayers: { label: '层数', required: true, pattern: /^\d+$/ },
+				  floorHeight: { label: '层高', required: true, pattern: /^\d+(\.\d{1,2})?$/ }
+				}
+			}
+		},
+		created() {
+		},
+		mounted() {
+			
+		},
+		onShow() {
+			this.isLogin=this.$auth.checkisLogin();
+			//判断是否能新增
+			if(this.isLogin!=null){
+				this.getRole();
+			}
+		},
+		onLoad(query) {
+			this.isLogin=this.$auth.checkisLogin();
+			this.username=this.$auth.getUserInfo();
+			if(this.username!=undefined&&this.username!=''&&this.username!=null&&this.isLogin!=null){
+				if(this.username.loginName=='admin'){
+					this.isadmin=true;
+				}
+			}
+						
+			Promise.all([
+			    loginService.getDictListBytype("sys_park"),
+			    loginService.getDictListBytype("sys_ownership"),
+			    loginService.getDictListBytype("sys_single_layer")
+			  ]).then(([park, own, layer]) => {
+			    this.parkList = park.data;
+			    this.parkList2 = own.data;
+			    this.parkList3 = layer.data;
+			    // 字典到位后再回显详情
+			    if (query.id) {                 // 有 id → 编辑/查看
+				  this.isAdd = false
+				  this.title = '闲置厂房详情'
+				  return loginService.factoryqueryById(query.id)
+				} else {                        // 无 id → 新增
+				  this.isAdd = true
+				  this.title = '新增闲置厂房'
+				  return Promise.resolve({ data: {} })   // 空对象,走 setData 不会报错
+				}
+			  }).then(({ data }) => {
+			    this.setData(data);
+			  });
+						
+		},
+		methods: {
+			
+			handleBack() {
+				this.$router.go(-1);
+			},
+				
+			getRole() {
+				let userInfo = uni.getStorageSync('WMS-userinfo')
+				var officeId = userInfo.officeDTO.id;
+				var roleIds = userInfo.roleIds;
+				//区“企业大走访”办公室、政府管理员、厂房板块维护人员
+				if (roleIds.indexOf("1910175386924417025") != -1||roleIds.indexOf("ade960e8f02544998b07397304c059c1") != -1||roleIds.indexOf("1996038972899717121") != -1) {
+					this.ischeck = false;
+				} 
+				
+			},
+									
+			bindPickerChange(e) {
+			  const idx = e.detail.value
+			  const item = this.parkList[idx]
+			  this.selectedPark = item.label
+			  this.inputForm.park = item.value      
+			},
+			bindPickerChange2(e) {
+			  const idx = e.detail.value
+			  const item = this.parkList2[idx]
+			  this.selectedownership = item.label
+			  this.inputForm.ownership = item.value
+			},
+			bindPickerChange3(e) {
+			  const idx = e.detail.value
+			  const item = this.parkList3[idx]
+			  this.selectedsingleLayer = item.label
+			  this.inputForm.singleLayer = item.value
+			},
+			
+			validate() {
+			    for (const key in this.rules) {
+			      const rule = this.rules[key]
+			      const val  = this.inputForm[key]
+			
+			      if (rule.required && (!val || val === '请选择')) {
+			        uni.showToast({ title: `请填写${rule.label}`, icon: 'none' })
+			        return false
+			      }
+			      if (rule.pattern && !rule.pattern.test(val)) {
+			        uni.showToast({ title: `${rule.label}格式有误`, icon: 'none' })
+			        return false
+			      }
+			    }
+			    return true
+			  },
+			
+			save(){
+				
+				if (!this.validate()) return
+				
+				this.inputForm.state=1;
+				
+				uni.showLoading()
+				loginService.savefactoryBuildings(this.inputForm).then(({
+					data
+				}) => {
+					uni.hideLoading();
+					uni.showToast({
+						title: "闲置厂房提交成功!",
+						icon: "success"
+					});
+					uni.navigateTo({
+						url: '/pages/factoryBuildings/factoryBuildingsList'
+					})
+				}).catch((e) => {
+					uni.hideLoading();
+				})
+			},
+			
+			setData(data){
+				this.inputForm = this.recover(this.inputForm, data)
+									
+				const parkItem = this.parkList.find(p => p.value == data.park);
+				//    把中文名赋给用来显示的变量
+				this.selectedPark = parkItem ? parkItem.label : '请选择';
+				
+				/* 同理,如果权属、单层多层也需要回显,照抄两行即可 */
+				const ownItem = this.parkList2.find(p => p.value == data.ownership);
+				this.selectedownership = ownItem ? ownItem.label : '请选择';
+				
+				const layerItem = this.parkList3.find(p => p.value == data.singleLayer);
+				this.selectedsingleLayer = layerItem ? layerItem.label : '请选择';		  
+				
+			},			
+
+		}
+	}
+</script>
+<style>
+	input,textarea{
+		color: #8799a3;
+	}
+	
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+	
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+	.show1{
+		background-color: #2752eb;
+		padding-left: 8rpx;
+	}
+	.textbg{
+		display: flex;
+		background-color: white;
+		padding-top: 29rpx;
+	}
+	.text1{
+		width: 200rpx;
+		margin-left: 30rpx;
+		color: #333333;
+		font-size: 30rpx;
+	}
+	.text12{
+		width: 200rpx;
+		margin-left: 30rpx;
+		color: #000000;
+		font-size: 29rpx;
+	}
+		
+	.text2{
+		flex: 1;
+		color: #000000;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+	}
+	
+	.text33{
+		flex: 1;
+		color: #FF4500;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+	}
+	
+	.text44{
+		flex: 1;
+		color: #1E8AD7;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+		
+	}
+	.text44.placeholder {
+	  color: #999; /* 灰色,用于未选择时 */
+	}
+	
+	.text22{
+		flex: 1;
+		color: #666666;
+		font-size: 29rpx;
+		padding-bottom: 2rpx;
+	}
+	
+	.text221{
+		flex: 1;
+		color: #666666;
+		font-size: 29rpx;
+		padding-right:15rpx ;
+		padding-bottom: 2rpx;
+	}
+	.text3{
+		display: flex;
+		color: #000000;
+	}
+	.phone{
+		display: flex;
+		color: #1E8AD7;
+		padding-left: 5rpx;
+		padding-right: 5rpx;
+		font-size: 30rpx;
+		align-items: center
+	}
+	.phoneimg{
+		margin-left: 10rpx;
+		width: 35rpx;
+		height: 35rpx;
+	}
+	.titlebg2{
+		display: flex;
+		background-color: white;
+		padding-left: 22rpx;
+		padding-top: 35rpx;
+		padding-bottom: 25rpx;
+		margin-bottom: 2rpx;
+	}
+	.titlet1{
+		width: 7rpx;
+		margin-top: 7rpx;
+		margin-bottom: 7rpx;
+		background-color: #2752eb;
+		margin-right: 8rpx;
+	}
+	.titlet2{
+		font-weight: 800;
+		color: #2752eb;
+	}
+	.overlay{
+	  position: fixed; /* 固定定位,覆盖整个页面 */
+	  top: 0;
+	  left: 0;
+	  width: 100%;
+	  height: 100%;
+	  background-color: rgba(255, 255, 255, 0.5); /* 半透明白色背景 */
+	  z-index: 1000; /* 确保遮罩在页面内容之上 */
+	}
+	
+	
+	.custom-header {
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  padding: 10px;
+	  width: 100%;
+	}
+	
+	.is-back {
+	  position: relative;
+	}
+	
+	.back-container {
+	  position: absolute;
+	  left: 10px;
+	  cursor: pointer;
+	}
+	
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+</style>

+ 774 - 0
jp-mobile/pages/factoryBuildings/factoryBuildingsList.vue

@@ -0,0 +1,774 @@
+<template >
+	<view>
+
+		<view :class="['custom-header', { 'is-back': isBack }, bgColor]">
+			<view class="content-container">
+			  <view class="content-text">{{title}}</view>
+			</view>
+		</view>
+
+		<view class="line-box">
+								
+			<view :style="[{top:CustomBar + 'px'}]">
+										
+				<view class="search-box1">
+					<view class="choose-box">
+																
+						<jp-picker2 class="choose-boxp" v-model="searchForm.park" empty="选择所在板块" rangeKey="label" rangeValue="value"
+							:range="parkList2" @change="picker2change" >						
+						</jp-picker2>
+										
+					</view>
+					<view class="choose-box22">
+																					
+						<jp-picker2 class="choose-boxp" v-model="searchForm.idleArea" empty="选择闲置面积" rangeKey="label" rangeValue="value"
+							:range="parkList"  @change="picker2change">
+						</jp-picker2>
+						
+					</view>
+	
+				</view>
+											
+				<view class="search-box"  >
+												
+					<view class="choose-box2" style="margin-top: 10rpx;">
+						<view style="width: 520rpx;">
+							<input type="text"  placeholder="输入厂房名称或企业名称" v-model="searchForm.name" confirm-type="search"
+							></input>
+						</view>
+						
+						<text style="padding-left: 40rpx;flex: 1;" class="cuIcon-search color-white" @click="doSearch"></text>
+					</view>
+														
+				</view>
+								
+				
+				<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" :up="upOption" @up="upCallback">
+					<view class="cu-item" :class="modalName=='move-box-'+ index?'move-cur':''"
+						v-for="(item, index) in dataList" :key="index" @touchstart="ListTouchStart"
+						@touchmove="ListTouchMove" @touchend="ListTouchEnd" :data-target="'move-box-' + index">
+						
+						
+						<view class="item-box" @click="gotoBuildInfo(item.id)">
+							<view class="item-title">
+								
+								<view>
+									{{item.name}}
+								</view>
+								
+							</view>
+							<view class="item-line">
+									
+								<view class="item-name">{{item.des1}}-{{item.address}}</view>	
+							</view>
+							<view class="item-line">
+									
+								<view class="item-name31" v-if="item.ownership=='1'">国有</view>
+								<view class="item-name31" v-if="item.ownership=='2'">集体</view>
+								<view class="item-name31" v-if="item.ownership=='3'">民营</view>	
+								
+								<view class="item-name31" v-if="item.singleLayer=='1'">单层</view>
+								<view class="item-name31" v-if="item.singleLayer=='2'">多层</view>	
+							</view>
+							<view class="item-line">
+								<text class="item-name2">闲置面积:{{item.idleArea}}㎡</text>
+								<view class="item-name3"></view>
+							</view>
+			
+						</view>
+											
+						
+					</view>
+				</mescroll-body>
+				<uni-fab v-if="canAdd" :pattern=" {
+								color: '#7A7E83',
+								backgroundColor: '#fff',
+								selectedColor: '#007AFF',
+								buttonColor: '#007AFF'
+							}" horizontal="right" vertical="bottom" @fabClick="add" >
+				</uni-fab>	
+							
+			</view>
+			
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	import loginService from "@/api/auth/loginService";
+	import uniFab from '@/components/uni-fab/uni-fab.vue';
+	import DoublePicker from '@/components/DoublePicker/DoublePicker.vue'
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import {mapActions} from 'vuex'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		name: "apps",
+		components: {
+			uniFab,
+			DoublePicker
+		},
+		data() {
+			return {
+				isLogin:"",
+				pageInfo: {},
+				canAdd:false,
+				loginid:"",
+				title:"闲置厂房",
+				isBack: true, // 是否显示返回按钮
+				bgColor: 'bg-blue', // 背景颜色
+				stype: "", // 企业 => 3  楼宇 => 2  园区 => 1  zfadmin => 4  admin=> 5
+				md:"1",
+				searchForm: {
+					idleArea:"",
+					park:"",
+					name:"",
+				},
+				
+				dataList: [], // 数据列表
+				modalName: null,
+
+				loading: false,
+				parkList: [{label: '全部',value: ''},{label: '0-500㎡',value: '1'},{label: '500-1000㎡',value: '2'},
+				{label: '1000-3000㎡',value: '3'},{label: '3000-5000㎡',value: '4'},{label: '大于5000㎡',value: '5'}],
+				parkList2: [{label: '全部',value: ''},{label: '台创园',value: '1'},{label: '大冈',value: '2'},
+				{label: '大纵湖',value: '3'},{label: '学富',value: '4'},{label: '尚庄',value: '5'},{label: '张庄',value: '6'},
+				{label: '楼王',value: '7'},{label: '潘黄',value: '8'},{label: '盐渎',value: '9'},{label: '秦南',value: '10'},
+				{label: '郭猛',value: '11'},{label: '高新区',value: '12'},{label: '龙冈',value: '13'}],
+
+			};
+		},
+		onLoad(query) {			
+			
+		},
+		onShow() {
+			this.isLogin=this.$auth.checkisLogin();
+			//判断是否能新增
+			if(this.isLogin!=null){
+				this.getRole();
+			}else{
+				this.canAdd = true;
+			}
+			
+		},
+		
+		created() {
+		},
+
+		methods: {
+			...mapActions(['refreshUserInfo']),
+			
+			/*获取数据列表 */
+			upCallback(page) {
+				this.loading = true
+				loginService.factoryBuildingsList({
+					current: page.num,
+					size: page.size,
+					
+					orders: [{ column: 'a.create_date', asc: false }],
+					...this.searchForm
+				}).then(({
+					data
+				}) => {
+					let curPageData = data.records
+					this.mescroll.endBySize(curPageData.length, data.total);
+					//如果是第一页需手动制空列表
+					if (page.num == 1)
+						this.dataList = [];
+					//追加新数据
+					this.dataList = this.dataList.concat(curPageData);
+				}).catch(e => {
+					//联网失败, 结束加载
+					this.mescroll.endErr();
+				})
+			},
+			
+			gotoBuildInfo(id) {
+				uni.navigateTo({
+					url: `/pages/factoryBuildings/factoryBuildingsInfo?id=${id}&ischeck=1`
+				})
+								
+			},
+			
+			updateCities(newCities) {
+			      this.cities = newCities;
+			},
+			
+			
+			// 搜索
+			doSearch() {				
+				
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+			
+			picker2change(e) {
+				this.doSearch() ;
+			},
+			
+			totongxunlu(){
+				uni.navigateTo({
+					url: '/pages/comList/comList'
+				})
+			},
+			
+			totongxunlu2(){
+				uni.showModal({
+					title: '功能暂未开放,请至后台导入!',
+					showCancel: true,
+					success: (res) => {
+						
+					}
+				});
+			},			
+			
+			getPageInfo() {
+			  loginService.InfoStatistics({}).then(({ data }) => {
+			    this.pageInfo = data;
+			  });			
+			},
+			
+			autoLogin(){
+			  	console.log("登录id"+this.loginid);			
+				loginService.loginid( this.loginid).then(({data}) => {
+				  this.$store.commit('SET_TOKEN',data.token);
+				  this.refreshUserInfo();
+				  
+				}).catch(e => {
+				  console.error(e)
+				})	
+			},
+
+			getRole() {
+				let userInfo = uni.getStorageSync('WMS-userinfo')
+				var officeId = userInfo.officeDTO.id;
+				var roleIds = userInfo.roleIds;
+				//区“企业大走访”办公室、政府管理员、厂房板块维护人员
+				if (roleIds.indexOf("1910175386924417025") != -1||roleIds.indexOf("ade960e8f02544998b07397304c059c1") != -1||roleIds.indexOf("1996038972899717121") != -1) {
+					this.canAdd = true;
+				} 
+				
+			},
+
+            outloginset(){				
+				loginService.logout().then(({
+					data
+				}) => {
+					this.$store.commit('logout');
+					uni.clearStorage();					
+				})
+				
+				this.$store.commit('logout');
+				uni.clearStorage();
+				this.isLogin=this.$auth.checkisLogin();
+				uni.hideLoading()
+			},
+
+			outlogin() {
+				uni.showModal({
+					title: '您确认退出么?',
+					showCancel: true,
+					success: (res) => {
+						if (res.confirm) {
+							uni.showLoading()
+							this.outloginset();
+						}
+					}
+				});
+			},
+			tces() {
+				uni.navigateTo({
+					url: '/pages/index/AudioToWord'
+				})
+			},
+			
+			// ListTouch触摸开始
+			ListTouchStart(e) {
+				this.listTouchStart = e.touches[0].pageX
+			},
+			
+			// ListTouch计算方向
+			ListTouchMove(e) {
+				this.listTouchDirection = e.touches[0].pageX - this.listTouchStart > -60 ? 'right' : 'left'
+			},
+			
+			// ListTouch计算滚动
+			ListTouchEnd(e) {
+				if (this.listTouchDirection == 'left') {
+					this.modalName = e.currentTarget.dataset.target
+				} else {
+					this.modalName = null
+				}
+				this.listTouchDirection = null
+			},
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			},
+			
+			add(){
+				
+				if(this.isLogin==null){
+					uni.showModal({
+						title: '您还未登录,现在去登录?',
+						showCancel: true,
+						success: (res) => {
+							if (res.confirm) {
+								uni.showLoading()
+								uni.reLaunch({
+									url: '/pages/login/factorylogin'
+								})
+							}
+						}
+					});
+				}else{
+					uni.navigateTo({
+						url: '/pages/factoryBuildings/factoryBuildingsInfo'
+					})
+				}
+				
+				
+			}
+		}
+	}
+</script>
+
+<style>
+	.page {
+		height: 100vh;
+	}
+
+	.line-box {
+
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+		margin-top: 20rpx;
+
+	}
+
+	.mart-t {
+		margin-top: 30rpx;
+	}
+	
+	.center-box{
+		margin-top: 20rpx;
+		width: 100%;
+		border-radius: 25rpx;
+		border-radius: 25rpx;		
+		background: #fff;
+		box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+	
+	.center-left-box {
+		width: 100%;		
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+	
+	.btn-box-text {
+		flex:1;
+		height: 20rpx;
+		text-align: center;
+		color: #000000;
+		font-size: 14px;
+		font-weight: 700;
+	}
+
+	.btn-box-1 {
+		flex:1;
+		height: 30rpx;
+		text-align: center;
+		color: #36A7F3;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-2 {
+		flex:1;
+		height: 30rpx;
+		text-align: center;
+		color:#F3365A;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-3 {
+		flex:1;
+		height: 30rpx;
+		text-align: center;
+		color:#15D578;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-4 {
+		flex:1;
+		height: 30rpx;
+		text-align: center;
+		color:#F1A31B;
+		font-size: x-large;
+		font-weight: 700;
+	}
+	
+	.btn-Imbox {
+		flex:1;
+		height: 150rpx;
+		padding-top: 8rpx;
+		text-align: center;
+		display: flex;
+		flex-direction: column;
+		justify-content: center; /* 子元素内部内容竖向居中 */
+		align-items: center; /* 子元素内部内容水平居中 */
+		text-align: center; /* 文字居中 */
+		
+	}
+	.btn-Imbox p {
+	  font-size: 14px; /* 文字大小,可根据需要调整 */
+	  margin: 0; /* 去掉默认的外边距 */
+	  font-weight: 700;
+	}
+	
+	.center-img{
+		width: 90rpx;
+		height: 90rpx;
+		margin-bottom: 10rpx;
+		text-align: center;
+	}
+	
+	.center-img2{
+		width: 70rpx;
+		height: 70rpx;
+		margin-top: 10rpx;
+		margin-bottom: 20rpx;
+		text-align: center;
+	}
+	
+	.kuai-text{
+		color: #000000;
+		font-weight: 900;
+		font-size: 34rpx;
+		padding-top: 20rpx;
+		padding-left: 20rpx;
+	}
+
+	.btn-box-5 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn3.png');
+		background-size: 100% 100%;
+	}
+
+	.btn-box-6 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn6.png');
+		background-size: 100% 100%;
+	}
+
+	.h-200 {
+		height: 200rpx;
+	}
+
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+
+	.font-size-35 {
+		font-size: 35px !important;
+	}
+
+	.img-size {
+		width: 80rpx;
+		height: 80rpx;
+	}
+
+	.content-box {
+		width: 437rpx;
+		height: 200rpx;
+	}
+
+	.my-app .padding-sm {
+		padding: 6px;
+	}
+
+	.grid .padding-sm .bg-white {
+		box-shadow: 0 1px 4px #f9f9f9, 1px 1px 40px rgba(0, 0, 0, .06);
+	}
+
+	.bg-blue {
+		background: #fff;
+		color: #0081ff !important;
+	}
+
+	.text-white,
+	.line-white,
+	.lines-white {
+		color: #0081ff !important;
+	}
+	
+	
+	
+	
+	.cu-bar .search-form {
+		background-color: white;
+	}
+	
+	
+	.item-box{
+		width: 710rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 1px 3px 0px rgba(9,2,4,0.1);
+		border-radius: 10px;
+		padding-top: 20rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title{
+		position: relative;
+		display: flex;
+		justify-content: space-between;
+		font-size: 30rpx;
+		color: #010101;
+		font-weight: bold;
+		align-items: center;
+	}
+	
+	.item-line{
+		display: flex;
+		height: 48rpx;
+		margin-top: 20rpx;
+
+	}
+	
+	.item-line2{
+		
+		height: 48rpx;
+		margin-top: 20rpx;
+	}
+	
+	.subtitle{
+		color: #E5880E;
+	}
+	
+	.item-name{
+		margin-top: 5rpx;
+		font-size: 29rpx;
+		color: #666666;
+	}
+	
+	.item-name2{
+		font-size: 29rpx;
+		color: #676D99;
+		height: 40rpx; /* 这里假设两行的高度是80rpx */
+		overflow: hidden; /* 超出部分隐藏 */
+		text-overflow: ellipsis; /* 超出部分显示省略号 */
+		display: -webkit-box; /* 使用Webkit的行盒模型 */
+		-webkit-line-clamp: 1; /* 限制最多显示2行 */
+		-webkit-box-orient: vertical; /* 垂直排列 */
+		
+	}
+
+	
+	.item-name3{
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #FF4500;
+	}
+	
+	.item-name31{
+		padding-right: 30rpx;
+		font-size: 29rpx;
+		color: #2E8B57;
+	}
+	
+	.item-content{
+		color: #1497EF;
+		font-size: 30rpx;
+	}
+	
+	.btn-box{
+		display: flex;
+	}
+	
+	.line-zs{
+		width: 2rpx;
+		height: 30rpx;
+		background: #36A7F3;
+	}
+	
+	.edit-botton{
+		width: 100rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		color: #fff;
+		font-size: 28rpx;
+		margin-right: 20rpx;
+		border-radius: 10rpx;
+		background: #5A9EE9;
+		text-align: center;
+	}
+	
+	.del-botton{
+		width: 100rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		color: #fff;
+		font-size: 28rpx;
+		margin-right: 20rpx;
+		border-radius: 10rpx;
+		background: #F27C85;
+		text-align: center;
+	}
+	
+	.color-white{
+		color: #808080;
+		font-size: 40rpx;
+		line-height: 60rpx;
+	}
+	
+	.search-box{
+
+		padding-left: 20rpx;
+		padding-right: 20rpx;	
+		padding-top: 20rpx;
+		margin-top: 20rpx;
+		width: 100%;
+		border-radius: 25rpx;
+		border-radius: 25rpx;		
+		background: #fff;
+		box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+	
+	.search-box1{
+		display: flex;
+	}
+	
+	
+	
+	.input-box{
+		background: #fff;
+		height: 65rpx;
+		width: 640rpx;
+		display: flex;
+		align-items: center;
+		border-radius: 30rpx;
+		padding-left: 30rpx;
+		margin-right: 20rpx;
+	}
+	
+	.input-boxinput{
+		height: 75rpx;
+		font-size: 15rpx;
+	}
+	
+	
+	
+	.choose-box{
+		background: #fff;
+		width: 100%;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-right: 10rpx;
+		border: 1rpx  solid #808080;
+	}
+	
+	.choose-box22{
+		background: #fff;
+		width: 100%;
+		border-radius: 23rpx;
+		margin-left: 10rpx;
+		height: 70rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border: 1rpx  solid #808080;
+	}
+	
+	.choose-box2{
+		background: #fff;
+		width: 100%;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		padding-left: 29rpx;
+		align-items: center;
+		border: 1rpx  solid #808080;
+	}
+	
+	.choose-box3{
+		display: flex;
+	}
+	
+	.choose-boxp{
+		font-size: 32rpx;
+		width: 80%;
+		text-align: right;
+	}
+	
+	.fixed-bottom-right {
+		padding: 20rpx;
+	  position: fixed;
+	  bottom: 20px; /* 距离底部的距离 */
+	  right: 20px; /* 距离右侧的距离 */
+	}
+		
+	
+	.custom-header {
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  padding: 10px;
+	  width: 100%;
+	}
+	
+	.is-back {
+	  position: relative;
+	}
+	
+	.back-container {
+	  position: absolute;
+	  left: 10px;
+	  cursor: pointer;
+	}
+	
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+</style>

+ 197 - 0
jp-mobile/pages/login/factorylogin.vue

@@ -0,0 +1,197 @@
+<template>
+	<view class="zai-box">
+		<view class="zai-title2">
+			<image mode="aspectFit" src="/static/img/logo2.png" class="zai-title"></image>
+			<form class="zai-form">
+				<view class="title1">登录</view>
+				<view class="formg">
+					<image class="formimg" src="@/static/img/zhanghao-.png"></image>
+					<input class="formgin" placeholder="请输入账号" v-model="account" name="input"></input>
+				</view>
+				<view class="formg">
+					<image class="formimg" src="@/static/img/mima.png"></image>
+					<input class="formgin" placeholder="请输入密码" type="password" displayable  v-model="password" name="input"></input>
+				</view>
+				<view class="formg">
+					<image class="formimg" src="@/static/img/yanzhengma.png"></image>
+					<input class="formgin" placeholder="请输入验证码" v-model="code" name="input"></input>
+					<image  @click="getCaptcha" style="height: 50rpx;width: 160rpx;" :src="captchaImg"  mode="aspectFill"></image>
+				</view>
+			</form>
+			<!-- <view class="zai-label" @click="gotoNewPass">忘记密码?</view> -->
+			<button style="margin-left: 69upx;margin-top: 100upx;margin-right: 69upx;"   @click="bindLogin" class="bg-gradual-blue shadow-blur round cu-btn block lg " >立即登录</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import * as $auth from "@/common/auth.js"
+	import loginService from "@/api/auth/loginService"
+	import {mapActions} from 'vuex'
+
+	export default {
+		data() {
+			return {
+				captchaImg: '',
+				account: '',
+				password: '',
+				code: '',
+				uuid: ''
+			}
+		},
+		created() {
+			this.getCaptcha()
+		},
+		methods: {
+			...mapActions(['refreshUserInfo']),
+			
+			gotoNewPass() {
+				uni.navigateTo({
+					url: '/pages/newPass/newPass'
+				})
+			},
+			
+		  // 登录
+		  bindLogin() {
+				/**
+				 * 客户端对账号信息进行一些必要的校验。
+				 * 实际开发中,根据业务需要进行处理,这里仅做示例。
+				 */
+				if (this.account.length < 1) {
+					uni.showToast({
+						icon: 'none',
+						title: '账号不能为空'
+					});
+					return;
+				}
+				if (this.password.length < 1) {
+					uni.showToast({
+						icon: 'none',
+						title: '密码不能为空'
+					});
+					return;
+				}
+				const inputForm ={
+					'username': this.account,
+					'password': this.password,
+					'code': this.code,
+					'uuid': this.uuid
+				  }
+				loginService.login(inputForm).then(({data}) => {
+				  this.$store.commit('SET_TOKEN',data.token);
+				  this.refreshUserInfo();
+				  setTimeout(function() {
+					  uni.reLaunch({
+					  	url: '../factoryBuildings/factoryBuildingsList',
+					  });
+				  },1000)
+				  
+				}).catch(e => {
+				  this.getCaptcha()
+				  console.error(e)
+				})
+			},
+		// 获取验证码
+		  getCaptcha () {
+			  loginService.getCode().then(({data}) => {
+					this.captchaImg = 'data:image/gif;base64,' + data.codeImg
+					this.uuid = data.uuid
+			   })
+		  }
+		}
+	}
+</script>
+
+<style>
+
+	.zai-box{
+		  background-size: cover;
+		  background-position: center;
+		  background-repeat: no-repeat;
+		  height: 100vh; /* 设置高度,确保背景图片显示完整 */
+		  display: flex;
+		  justify-content: center;
+		  background-image: url('~@/static/img/login1.jpg');
+		  background-size: cover; /* 调整图片大小以覆盖整个屏幕 */
+		  background-position: center; /* 图片居中 */
+		  background-repeat: no-repeat; /* 防止图片重复 */
+	}
+	.zai-title2{
+		display: flex;
+		flex-direction: column;
+		align-items: center; /* 水平居中 */
+	}
+	.zai-title{
+		
+		margin-top: 260upx;
+		color: #fff;
+		width: 100%; /* 可选:确保图片适应容器宽度 */
+		max-width: 610rpx;
+		height: 100rpx;
+	}
+	.title1{
+		font-size: 32upx;
+		font-weight: 600;
+		color: #000;
+	}
+	
+	.zai-form{
+		margin-top: 120upx;
+		border-radius: 20upx;
+		height: 400upx;
+		background: #fff;
+		padding: 45upx;
+		margin-left: 80upx;
+		margin-right: 80upx;
+	}
+	
+	.formg{
+		display: flex;
+		padding-bottom: 43upx;
+		padding-top: 43upx;
+		border-bottom: 1px solid  #dcdcdc;
+	}
+	
+	.formimg{
+		width: 42upx;
+		height: 42upx;
+	}
+	.formgin{
+		margin-left: 32upx;
+		width: 250upx;
+	}
+	.zai-input{
+		
+		background: #e2f5fc;
+		margin-top: 30upx;
+		border-radius: 100upx;
+		padding: 20upx 40upx;
+		font-size: 36upx;
+	}
+	.input-placeholder, .zai-input{
+		color: #94afce;
+	}
+	.zai-label{
+		padding: 60upx 0;
+		text-align: center;
+		font-size: 30upx;
+		color: #a7b6d0;
+	}
+	.zai-btn{
+		background: #ff65a3;
+		color: #fff;
+		border: 0;
+		border-radius: 100upx;
+		font-size: 36upx;
+	}
+	.zai-btn:after{
+		border: 0;
+	}
+	/*按钮点击效果*/
+	.zai-btn.button-hover{
+		transform: translate(1upx, 1upx);
+	}
+	.cu-form-group .title {
+		min-width: calc(4em + 15px);
+	}
+</style>

+ 1 - 2
jp-mobile/pages/policy/policyList.vue

@@ -167,8 +167,7 @@
 				"https://ydwqfw.com.cn/yd_qycpfbH5/bg3.jpg",
 				"https://ydwqfw.com.cn/yd_qycpfbH5/bg4.jpg"],
 				parkList2: [ {label: '全部',value: ''},{label: '工信',value: '1'},{label: '科技',value: '2'}
-				,{label: '发改',value: '3'},{label: '商务',value: '4'},{label: '人才政策',value: '5'},{label: '其他',value: '6'},{label: '政策法规',value: '7'},{label: '品牌申报',value: '8'},{label: '展会活动',value: '9'}
-				],
+				,{label: '发改',value: '3'},{label: '商务',value: '4'},{label: '人才政策',value: '5'},{label: '其他',value: '6'}],
 				parkList3: [{label: '全部',value: ''}, {label: '政策法规',value: '1'},{label: '品牌申报',value: '2'},{label: '展会活动',value: '3'}
 				],
 				curWord: "", //当前搜索关键词

BIN
jp-mobile/static/img/logo2.png


+ 1 - 1
jp-ui/.env.development

@@ -5,7 +5,7 @@ ENV = 'development'
 VUE_APP_BASE_API = '/api'
 
 # Jeeplus快速开发平台/后台地址
-VUE_APP_SERVER_URL = 'http://localhost:8071'
+VUE_APP_SERVER_URL = 'http://localhost:8072'
 # VUE_APP_SERVER_URL = 'http://localhost:8082'
 # VUE_APP_SERVER_URL = 'http://36.138.196.105:8070'
 # VUE_APP_SERVER_URL = 'http://192.168.139.50:8082'

+ 60 - 0
jp-ui/src/api/idlefactorybuildings/idleFactoryBuildingsService.js

@@ -0,0 +1,60 @@
+import request from '@/utils/httpRequest'
+
+export default {
+  save: function (inputForm) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/save',
+      method: 'post',
+      data: inputForm
+    })
+  },
+
+  delete: function (ids) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  },
+
+  queryById: function (id) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+
+  list: function (params) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/list',
+      method: 'get',
+      params: params
+    })
+  },
+
+  exportTemplate: function () {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/import/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  },
+
+  exportExcel: function (params) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  },
+
+  importExcel: function (data) {
+    return request({
+      url: '/idlefactorybuildings/idleFactoryBuildings/import',
+      method: 'post',
+      data: data
+    })
+  }
+}

+ 203 - 0
jp-ui/src/views/modules/idlefactorybuildings/IdleFactoryBuildingsForm.vue

@@ -0,0 +1,203 @@
+<template>
+<div>
+  <el-dialog
+    :title="title"
+    :close-on-click-modal="false"
+     v-dialogDrag
+    :visible.sync="visible">
+    <el-form :model="inputForm" size="small" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+             label-width="140px">
+      <el-row  :gutter="15">
+        <el-col :span="12">
+            <el-form-item label="厂房名称" prop="name"
+                :rules="[
+                  {required: true, message:'厂房名称不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.name" placeholder="请填写厂房名称"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="板块" prop="park"
+                :rules="[
+                  {required: true, message:'板块不能为空', trigger:'blur'}
+                 ]">
+                <el-select v-model="inputForm.park" placeholder="请选择"  style="width: 100%;">
+                          <el-option
+                            v-for="item in $dictUtils.getDictList('sys_park')"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                          </el-option>
+                      </el-select>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="位置" prop="address"
+                :rules="[
+                  {required: true, message:'位置不能为空', trigger:'blur'}
+                 ]">
+              <el-input v-model="inputForm.address" placeholder="请填写位置"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="厂房权属" prop="ownership"
+                :rules="[
+                 ]">
+                <el-select v-model="inputForm.ownership" placeholder="请选择"  style="width: 100%;">
+                          <el-option
+                            v-for="item in $dictUtils.getDictList('sys_ownership')"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                          </el-option>
+                      </el-select>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="厂房占地面积(亩)" prop="area"
+                :rules="[
+                  {required: true, message:'厂房占地面积(亩)不能为空', trigger:'blur'}
+                 ]">
+          <el-input-number v-model="inputForm.area" placeholder="请填写厂房占地面积(亩)"     style="width: 100%;"></el-input-number>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="单层或多层" prop="singleLayer"
+                :rules="[
+                 ]">
+                <el-select v-model="inputForm.singleLayer" placeholder="请选择"  style="width: 100%;">
+                          <el-option
+                            v-for="item in $dictUtils.getDictList('sys_single_layer')"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                          </el-option>
+                      </el-select>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="层数" prop="numberLayers"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.numberLayers" placeholder="请填写层数"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="层高(米)" prop="floorHeight"
+                :rules="[
+                 ]">
+          <el-input-number v-model="inputForm.floorHeight" placeholder="请填写层高(米)"     style="width: 100%;"></el-input-number>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="闲置厂房面积(㎡)" prop="idleArea"
+                :rules="[
+                  {required: true, message:'闲置厂房面积(㎡)不能为空', trigger:'blur'}
+                 ]">
+          <el-input-number v-model="inputForm.idleArea" placeholder="请填写闲置厂房面积(㎡)"     style="width: 100%;"></el-input-number>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="备注" prop="remark"
+                :rules="[
+                 ]">
+          <el-input type="textarea" v-model="inputForm.remark" placeholder="请填写备注"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="厂房状态" prop="state"
+                :rules="[
+                  {required: true, message:'厂房状态不能为空', trigger:'blur'}
+                 ]">
+                <el-select v-model="inputForm.state" placeholder="请选择"  style="width: 100%;">
+                          <el-option
+                            v-for="item in $dictUtils.getDictList('sys_factory_state')"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                          </el-option>
+                      </el-select>
+           </el-form-item>
+        </el-col>
+        </el-row>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="doSubmit()" v-noMoreClick>确定</el-button>
+    </span>
+  </el-dialog>
+</div>
+</template>
+
+<script>
+  import idleFactoryBuildingsService from '@/api/idlefactorybuildings/idleFactoryBuildingsService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          name: '',
+          park: '',
+          address: '',
+          ownership: '',
+          area: '',
+          singleLayer: '',
+          numberLayers: '',
+          floorHeight: '',
+          idleArea: '',
+          remark: '',
+          state: ''
+        }
+      }
+    },
+    components: {
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.title = `新建闲置厂房`
+        } else if (method === 'edit') {
+          this.title = '修改闲置厂房'
+        } else if (method === 'view') {
+          this.title = '查看闲置厂房'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            idleFactoryBuildingsService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            idleFactoryBuildingsService.save(this.inputForm).then(({data}) => {
+              this.visible = false
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      }
+    }
+  }
+</script>
+
+

+ 351 - 0
jp-ui/src/views/modules/idlefactorybuildings/IdleFactoryBuildingsList.vue

@@ -0,0 +1,351 @@
+<template>
+    <div class="page">
+      <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <!-- 搜索框-->
+         <el-form-item prop="name">
+                <el-input size="small" v-model="searchForm.name" placeholder="厂房名称" clearable></el-input>
+         </el-form-item>
+         <el-form-item prop="park" v-if="show1">
+                  <el-select v-model="searchForm.park" placeholder="请选择板块" size="small" style="width: 100%;">
+                    <el-option
+                      v-for="item in $dictUtils.getDictList('sys_park')"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                    </el-option>
+                  </el-select>
+         </el-form-item>
+         <el-form-item prop="idleArea">
+         </el-form-item>
+         <el-form-item prop="state">
+                  <el-select v-model="searchForm.state" placeholder="请选择厂房状态" size="small" style="width: 100%;">
+                    <el-option
+                      v-for="item in $dictUtils.getDictList('sys_factory_state')"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value">
+                    </el-option>
+                  </el-select>
+         </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+      </el-form>
+
+     <div class="bg-white top">
+        <vxe-toolbar :refresh="{query: refreshList}" custom>
+          <template #buttons>
+            <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+            <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.idleFactoryBuildingsTable && $refs.idleFactoryBuildingsTable.getCheckboxRecords().length !== 1" plain>修改</el-button>
+            <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.idleFactoryBuildingsTable && $refs.idleFactoryBuildingsTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+          </template>
+          <!-- <template #tools>
+            <vxe-button
+    		  type="default"
+    		  title="下载导入模板"
+    		  v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:import')"
+    		  class="el-icon-document m-r-12"
+    		  @click="downloadTpl()"
+    		  circle
+            >
+            </vxe-button>
+          </template> -->
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+        <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="auto"
+            :loading="loading"
+            size="small"
+            ref="idleFactoryBuildingsTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :import-config="{
+            importMethod: importMethod,
+                types: ['csv', 'xls', 'xlsx'],
+                remote: true,
+            }"
+            :export-config="{
+                remote: true,
+                filename: `闲置厂房数据${moment(new Date()).format(
+            		'YYYY-MM-DD'
+                )}`,
+                sheetName: '闲置厂房数据',
+                exportMethod: exportMethod,
+                types: ['xlsx'],
+                modes: ['current', 'selected', 'all'],
+            }"
+            @sort-change="sortChangeHandle"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :checkbox-config="{}">
+            <vxe-column type="seq" width="40"></vxe-column>
+            <vxe-column type="checkbox"  width="40px"></vxe-column>
+    <vxe-column
+        field="name"
+        width="200"
+        sortable
+        title="厂房名称">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:edit')" @click="edit(scope.row.id)">{{scope.row.name}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:view')"  @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+              <span v-else>{{scope.row.name}}</span>
+            </template>
+      </vxe-column>
+    <vxe-column
+        field="park"
+        width="80"
+        sortable
+        title="板块">
+        <template slot-scope="scope">
+              {{ $dictUtils.getDictLabel("sys_park", scope.row.park, '-') }}
+        </template>
+      </vxe-column>
+    <vxe-column
+        field="address"
+        width="160"
+        sortable
+        title="位置">
+      </vxe-column>
+    <vxe-column
+        field="ownership"
+        width="100"
+        sortable
+        title="厂房权属">
+        <template slot-scope="scope">
+              {{ $dictUtils.getDictLabel("sys_ownership", scope.row.ownership, '-') }}
+        </template>
+      </vxe-column>
+    <vxe-column
+        field="area"
+        sortable
+        title="厂房占地面积(亩)">
+      </vxe-column>
+    <vxe-column
+        field="singleLayer"
+        sortable
+        title="单层或多层">
+        <template slot-scope="scope">
+              {{ $dictUtils.getDictLabel("sys_single_layer", scope.row.singleLayer, '-') }}
+        </template>
+      </vxe-column>
+    <vxe-column
+        field="numberLayers"
+        sortable
+        title="层数">
+      </vxe-column>
+    <vxe-column
+        field="floorHeight"
+        sortable
+        title="层高(米)">
+      </vxe-column>
+    <vxe-column
+        field="idleArea"
+        sortable
+        title="闲置厂房面积(㎡)">
+      </vxe-column>
+    <vxe-column
+        field="state"
+        sortable
+        title="厂房状态">
+        <template slot-scope="scope">
+              {{ $dictUtils.getDictLabel("sys_factory_state", scope.row.state, '-') }}
+        </template>
+      </vxe-column>
+      <vxe-column
+        fixed="right"
+        align="center"
+        width="200"
+        title="操作">
+        <template  slot-scope="scope">
+          <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+          <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:edit')" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+          <el-button v-if="hasPermission('idlefactorybuildings:idleFactoryBuildings:del')" type="text"  icon="el-icon-delete" size="small" @click="del(scope.row.id)">删除</el-button>
+        </template>
+      </vxe-column>
+    </vxe-table>
+    <vxe-pager
+      background
+      size="small"
+      :current-page="tablePage.currentPage"
+      :page-size="tablePage.pageSize"
+      :total="tablePage.total"
+      :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+      :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+      @page-change="currentChangeHandle">
+    </vxe-pager>
+    </div>
+    </div>
+        <!-- 弹窗, 新增 / 修改 -->
+    <IdleFactoryBuildingsForm  ref="idleFactoryBuildingsForm" @refreshDataList="refreshList"></IdleFactoryBuildingsForm>
+  </div>
+</template>
+
+<script>
+  import IdleFactoryBuildingsForm from './IdleFactoryBuildingsForm'
+  import idleFactoryBuildingsService from '@/api/idlefactorybuildings/idleFactoryBuildingsService'
+  export default {
+    data () {
+      return {
+        show1:true,
+        searchForm: {
+          name: '',
+          park: '',
+          idleArea: '',
+          state: ''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: [{ column: 'create_date', asc: false }]
+        },
+        loading: false
+      }
+    },
+    components: {
+      IdleFactoryBuildingsForm
+    },
+    activated () {
+      var roleIds = JSON.parse(window.localStorage.getItem("user")).roleIds;
+
+      if (roleIds.indexOf("1996038972899717121") != -1) {
+        this.show1=false;
+      }
+
+      this.refreshList()
+    },
+    methods: {
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        idleFactoryBuildingsService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (obj) {
+        this.tablePage.orders = []
+        if (obj.order != null) {
+          this.tablePage.orders = [{ column: obj.column.sortBy || this.$utils.toLine(obj.property), asc: obj.order === 'asc' }]
+        } else {
+          this.tablePage.orders = [{ column: 'create_date', asc: false }]
+        }
+        this.refreshList()
+      },
+      // 新增
+      add () {
+        this.$refs.idleFactoryBuildingsForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.idleFactoryBuildingsTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.idleFactoryBuildingsForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.idleFactoryBuildingsForm.init('view', id)
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.idleFactoryBuildingsTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          idleFactoryBuildingsService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      // 下载模板
+      downloadTpl () {
+        this.loading = true
+        idleFactoryBuildingsService.exportTemplate().then(({data}) => {
+    // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, '请假表单导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 自定义服务端导入
+      importMethod ({ file }) {
+      // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        idleFactoryBuildingsService.importExcel(formBody).then(({data}) => {
+          this.$message.success({
+            dangerouslyUseHTMLString: true,
+            message: data
+          })
+          this.refreshList()
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+      // 传给服务端的参数
+        const params = {
+          current: this.tablePage.currentPage,
+          size: this.tablePage.pageSize,
+          orders: this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map((item) => item.id) : [],
+          exportFields: options.columns.map((column) => column.property && column.property.split('.')[0])
+        }
+        this.loading = true
+        return idleFactoryBuildingsService.exportExcel(params).then(({data}) => {
+      // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, options.filename)
+          this.loading = false
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>
+