Browse Source

服务对接

LuChongMei 1 month ago
parent
commit
e654d52e28
27 changed files with 2451 additions and 10 deletions
  1. 10 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/controller/EnterpriseInfoController.java
  2. 1 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/mapper/EnterpriseInfoMapper.java
  3. 6 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/mapper/xml/EnterpriseInfoMapper.xml
  4. 4 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/service/EnterpriseInfoService.java
  5. 161 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/controller/LyServiceController.java
  6. 35 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/domain/LyService.java
  7. 37 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/LyServiceMapper.java
  8. 49 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/xml/LyServiceMapper.xml
  9. 45 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/LyServiceService.java
  10. 45 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/dto/LyServiceDTO.java
  11. 38 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/mapstruct/LyServiceWrapper.java
  12. 9 0
      jp-mobile/api/auth/loginService.js
  13. 60 0
      jp-mobile/api/service/lyServiceService.js
  14. 22 0
      jp-mobile/pages.json
  15. 7 1
      jp-mobile/pages/index/Dzfindex.vue
  16. 745 0
      jp-mobile/pages/service/LyService.vue
  17. 301 0
      jp-mobile/pages/service/addService.vue
  18. 17 0
      jp-mobile/uni_modules/uni-combox/changelog.md
  19. 284 0
      jp-mobile/uni_modules/uni-combox/components/uni-combox/uni-combox.vue
  20. 88 0
      jp-mobile/uni_modules/uni-combox/package.json
  21. 11 0
      jp-mobile/uni_modules/uni-combox/readme.md
  22. 6 0
      jp-mobile/uni_modules/uni-load-more/changelog.md
  23. 5 0
      jp-mobile/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
  24. 7 9
      jp-mobile/uni_modules/uni-load-more/package.json
  25. 60 0
      jp-ui/src/api/service/lyServiceService.js
  26. 134 0
      jp-ui/src/views/modules/service/LyServiceForm.vue
  27. 264 0
      jp-ui/src/views/modules/service/LyServiceList.vue

+ 10 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/controller/EnterpriseInfoController.java

@@ -494,6 +494,16 @@ public class EnterpriseInfoController {
 
 		return ResponseEntity.ok (enterpriseInfoService.findByUserid ( userDTO.getLoginName() ));
 	}
+	/**
+	 * 取当前登录人挂钩企业基本信息数据
+	 */
+	@ApiOperation(value = "挂钩企业基本信息数据")
+	@GetMapping("queryByUserNameList")
+	public ResponseEntity<List<EnterpriseInfoDTO>> queryByUserNameList() {
+		UserDTO userDTO = UserUtils.getCurrentUserDTO();
+
+		return ResponseEntity.ok (enterpriseInfoService.queryByUserNameList ( userDTO.getLoginName() ));
+	}
 
 	@ApiLog("获取不展示字段")
 	@ApiOperation(value = "获取不展示字段")

+ 1 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/mapper/EnterpriseInfoMapper.java

@@ -76,4 +76,5 @@ public interface EnterpriseInfoMapper extends BaseMapper<EnterpriseInfo> {
     List<HashMap<String, Object>> getSaleStatisticsForBuilding();
     List<HashMap<String, Object>> getSaleStatisticsForOneBuilding(String buildingid);
 
+    List<EnterpriseInfoDTO> queryByUserNameList(String loginName);
 }

+ 6 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/mapper/xml/EnterpriseInfoMapper.xml

@@ -471,4 +471,10 @@
         </if>
     </select>
 
+    <select id="queryByUserNameList" resultType="com.jeeplus.enterpriseinfo.service.dto.EnterpriseInfoDTO">
+        SELECT id,name,lxr,phone,bz5,bz6,des1
+        FROM ly_enterprise_info
+        where del_flag = 0 and bz6 = #{loginName};
+    </select>
+
 </mapper>

+ 4 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/enterpriseinfo/service/EnterpriseInfoService.java

@@ -360,4 +360,8 @@ public class EnterpriseInfoService extends ServiceImpl<EnterpriseInfoMapper, Ent
 
         return "ok";
     }
+
+    public List<EnterpriseInfoDTO> queryByUserNameList(String loginName) {
+        return  baseMapper.queryByUserNameList (loginName);
+    }
 }

+ 161 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/controller/LyServiceController.java

@@ -0,0 +1,161 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.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.lyservice.service.LyServiceService;
+import com.jeeplus.lyservice.service.mapstruct.LyServiceWrapper;
+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.lyservice.service.dto.LyServiceDTO;
+import com.jeeplus.lyservice.service.mapstruct.LyServiceWrapper;
+import com.jeeplus.lyservice.service.LyServiceService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * LyServiceController
+ * @author lcm
+ * @version 2025-04-15
+ */
+
+@Api(tags ="LyService")
+@RestController
+@RequestMapping(value = "/lyservice/lyService")
+public class LyServiceController {
+
+	@Autowired
+	private LyServiceService lyServiceService;
+
+	@Autowired
+	private LyServiceWrapper lyServiceWrapper;
+
+	/**
+	 * 服务对接列表数据
+	 */
+	@ApiLog("查询服务对接列表数据")
+	@ApiOperation(value = "查询服务对接列表数据")
+	@PreAuthorize("hasAuthority('service:lyService:list')")
+	@GetMapping("list")
+	public ResponseEntity<IPage<LyServiceDTO>> list(LyServiceDTO lyServiceDTO, Page<LyServiceDTO> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (lyServiceDTO, LyServiceDTO.class);
+		UserDTO userDTO = UserUtils.getCurrentUserDTO();
+		//		//挂钩干部(能看到对应企业)
+		if(userDTO.getRoleIds().equals("1910141956174053377")){
+			queryWrapper.eq ("qy.bz6", userDTO.getLoginName() ); // 排除已经删除
+		}
+		IPage<LyServiceDTO> result = lyServiceService.findPage (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}
+
+
+	/**
+	 * 根据Id获取服务对接数据
+	 */
+	@ApiLog("根据Id获取服务对接数据")
+	@ApiOperation(value = "根据Id获取服务对接数据")
+	@PreAuthorize("hasAnyAuthority('service:lyService:view','service:lyService:add','service:lyService:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<LyServiceDTO> queryById(String id) {
+		return ResponseEntity.ok ( lyServiceService.findById ( id ) );
+	}
+
+	/**
+	 * 保存服务对接
+	 */
+	@ApiLog("保存服务对接")
+	@ApiOperation(value = "保存服务对接")
+	@PreAuthorize("hasAnyAuthority('service:lyService:add','service:lyService:edit')")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody LyServiceDTO lyServiceDTO) {
+		//新增或编辑表单保存
+		lyServiceService.saveOrUpdate (lyServiceWrapper.toEntity (lyServiceDTO));
+        return ResponseEntity.ok ( "保存服务对接成功" );
+	}
+
+
+	/**
+	 * 删除服务对接
+	 */
+	@ApiLog("删除服务对接")
+	@ApiOperation(value = "删除服务对接")
+	@PreAuthorize("hasAuthority('service:lyService:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        lyServiceService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除服务对接成功" );
+	}
+	
+	/**
+     * 导出服务对接数据
+     *
+     * @param lyServiceDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出服务对接数据")
+    @PreAuthorize("hasAnyAuthority('service:lyService:export')")
+    @GetMapping("export")
+    public void exportFile(LyServiceDTO lyServiceDTO, Page <LyServiceDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (lyServiceDTO, LyServiceDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+            
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "a.id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List<LyServiceDTO> result = lyServiceService.findPage ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( lyServiceService, lyServiceWrapper ).exportExcel ( result,  options.getSheetName ( ), LyServiceDTO.class, fileName,options.getExportFields (), response );
+    }
+
+    /**
+     * 导入服务对接数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('service:lyService:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( lyServiceService, lyServiceWrapper ).importExcel ( file, LyServiceDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入服务对接数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('service:lyService:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "服务对接数据导入模板.xlsx";
+        List<LyServiceDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( lyServiceService, lyServiceWrapper ).exportExcel ( list,  "服务对接数据", LyServiceDTO.class, fileName, null, response );
+    }
+
+}

+ 35 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/domain/LyService.java

@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * LyServiceEntity
+ * @author lcm
+ * @version 2025-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ly_service")
+public class LyService extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+     * 企业
+     */
+	private String qyId;
+	/**
+     * 方式
+     */
+	private String method;
+	/**
+     * 联系时间
+     */
+	private String contactDate;
+
+}

+ 37 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/LyServiceMapper.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.lyservice.service.dto.LyServiceDTO;
+import com.jeeplus.lyservice.domain.LyService;
+
+/**
+ * LyServiceMAPPER接口
+ * @author lcm
+ * @version 2025-04-15
+ */
+public interface LyServiceMapper extends BaseMapper<LyService> {
+
+    /**
+     * 根据id获取LyService
+     * @param id
+     * @return
+     */
+    LyServiceDTO findById(String id);
+
+    /**
+     * 获取LyService列表
+     *
+     * @param queryWrapper
+     * @return
+     */
+    IPage <LyServiceDTO> findList(Page <LyServiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+}

+ 49 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/xml/LyServiceMapper.xml

@@ -0,0 +1,49 @@
+<?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.lyservice.mapper.LyServiceMapper">
+
+	<sql id="lyServiceColumns">
+		a.id AS "id",
+		a.qy_id AS "qy.id",
+		a.method AS "method",
+		a.contact_date AS "contactDate",
+		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",
+
+		qy.id AS "qy.id",
+		qy.name AS "qy.name",
+		qy.lxr AS "qy.lxr",
+		qy.phone AS "qy.phone",
+		qy.des1 AS "qy.des1",
+		qy.bz5 AS "qy.bz5",
+		qy.bz6 AS "qy.bz6"
+
+	</sql>
+
+	<sql id="lyServiceJoins">
+
+		LEFT JOIN ly_enterprise_info qy ON qy.id = a.qy_id
+	</sql>
+
+
+
+	<select id="findById" resultType="com.jeeplus.lyservice.service.dto.LyServiceDTO">
+		SELECT
+			<include refid="lyServiceColumns"/>
+		FROM ly_service a
+		<include refid="lyServiceJoins"/>
+		WHERE a.id = #{id} and a.del_flag = 0
+	</select>
+
+	<select id="findList" resultType="com.jeeplus.lyservice.service.dto.LyServiceDTO">
+		SELECT
+			<include refid="lyServiceColumns"/>
+		FROM ly_service a
+		<include refid="lyServiceJoins"/>
+	    ${ew.customSqlSegment}
+	</select>
+
+</mapper>

+ 45 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/LyServiceService.java

@@ -0,0 +1,45 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.lyservice.service.dto.LyServiceDTO;
+import com.jeeplus.lyservice.domain.LyService;
+import com.jeeplus.lyservice.mapper.LyServiceMapper;
+
+/**
+ * LyServiceService
+ * @author lcm
+ * @version 2025-04-15
+ */
+@Service
+@Transactional
+public class LyServiceService extends ServiceImpl<LyServiceMapper, LyService> {
+
+	/**
+	 * 根据id查询
+	 * @param id
+	 * @return
+	 */
+	public LyServiceDTO findById(String id) {
+		return baseMapper.findById ( id );
+	}
+
+	/**
+	 * 自定义分页检索
+	 * @param page
+	 * @param queryWrapper
+	 * @return
+	 */
+	public IPage <LyServiceDTO> findPage(Page <LyServiceDTO> page, QueryWrapper queryWrapper) {
+		queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+		return  baseMapper.findList (page, queryWrapper);
+	}
+
+}

+ 45 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/dto/LyServiceDTO.java

@@ -0,0 +1,45 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.service.dto;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.excel.ExcelFieldDTOConverter;
+import com.jeeplus.core.excel.annotation.ExcelFieldProperty;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.enterpriseinfo.service.dto.EnterpriseInfoDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * LyServiceDTO
+ * @author lcm
+ * @version 2025-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class LyServiceDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 企业
+     */
+	@ExcelProperty(value = "企业", converter = ExcelFieldDTOConverter.class)
+	@ExcelFieldProperty(value = "qy.name", service =  "com.jeeplus.service.service.EnterpriseInfoService", wrapper= "com.jeeplus.service.service.mapstruct.EnterpriseInfoWrapper")
+	private EnterpriseInfoDTO qy;
+	        
+	/**
+     * 方式
+     */
+	@ExcelProperty("方式") 
+	private String method;
+	        
+	/**
+     * 联系时间
+     */
+	@ExcelProperty("联系时间") 
+	private String contactDate;
+
+}

+ 38 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/mapstruct/LyServiceWrapper.java

@@ -0,0 +1,38 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.lyservice.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.lyservice.service.dto.LyServiceDTO;
+import com.jeeplus.lyservice.domain.LyService;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  LyServiceWrapper
+ * @author lcm
+ * @version 2025-04-15
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface LyServiceWrapper extends EntityWrapper<LyServiceDTO, LyService> {
+
+    LyServiceWrapper INSTANCE = Mappers.getMapper(LyServiceWrapper.class);
+     @Mappings({
+            @Mapping(source = "qy.id", target = "qyId"),
+            @Mapping(source = "createBy.id", target = "createBy"),
+            @Mapping (source = "updateBy.id", target = "updateBy")})
+    LyService toEntity(LyServiceDTO dto);
+
+
+    @Mappings({
+            @Mapping(source = "qyId", target = "qy.id"),
+            @Mapping (source = "createBy", target = "createBy.id"),
+            @Mapping (source = "updateBy", target = "updateBy.id")})
+    LyServiceDTO toDTO(LyService entity);
+}
+

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

@@ -327,6 +327,15 @@ export default {
 		})
 	},
 	
+	queryByUserNameList: function() {
+		return request({
+			url: '/enterpriseinfo/enterpriseInfo/queryByUserNameList',
+			method: 'get',
+			params: {
+			}
+		})
+	},
+	
 	getdzfQuestionList: function(params) {
 		return request({
 			url: '/question/dzfQuestion/list',

+ 60 - 0
jp-mobile/api/service/lyServiceService.js

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

+ 22 - 0
jp-mobile/pages.json

@@ -48,6 +48,14 @@
 			"path": "pages/progress/ProgressQuestionList",
 			"style": {}
 		},
+		{
+			"path": "pages/service/LyService",
+			"style": {}
+		},
+		{
+			"path": "pages/service/addService",
+			"style": {}
+		},
 		{
 			"path": "pages/login/login",
 			"style": {
@@ -468,6 +476,20 @@
 			{
 				"navigationBarTitleText" : ""
 			}
+		},
+		{
+			"path" : "pages/service/LyService",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/service/addService",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
 		}
     ],
 	"globalStyle": {

+ 7 - 1
jp-mobile/pages/index/Dzfindex.vue

@@ -57,7 +57,7 @@
 					</view>
 										
 					<!-- 挂钩干部 -->
-					<view class="btn-Imbox" @click="totongxunlu5" v-if="roleIds=='1910141956174053377'">
+					<view class="btn-Imbox" @click="totongxunlu25" v-if="roleIds=='1910141956174053377'">
 						<image  class="center-img" src="/static/img/cd5.png"></image>
 						<p>服务对接</p>
 					</view>
@@ -359,6 +359,12 @@
 					url: '/pages/progress/progressStatistics'
 				})
 			},
+			totongxunlu25(){
+											
+				uni.navigateTo({
+					url: '/pages/service/LyService'
+				})
+			},
 			
 			totongxunlu22(){
 				uni.navigateTo({

+ 745 - 0
jp-mobile/pages/service/LyService.vue

@@ -0,0 +1,745 @@
+<template>
+	<view class="page">
+		<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>
+
+		
+		<view class="line-box">
+			<view :style="[{top:CustomBar + 'px'}]">
+				<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">
+							<view class="item-title">
+								企业名称:{{item.qy.name}}
+							</view>
+							<view class="item-title">
+								对接方式:{{item.method}}
+							</view>
+							<view class="item-title">
+								{{item.method}}记录时间:{{item.contactDate.substring(0, 10)}}
+							</view>
+							<view class="item-title">
+								挂钩干部:{{item.qy.bz5}}
+							</view>
+
+						</view>
+					</view>
+				</mescroll-body>
+			</view>
+			<button class="btn_add" type="primary" @click="add">新增服务</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import * as $auth from "@/common/auth.js"
+	import loginService from "@/api/auth/loginService";
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import lyServiceService from '@/api/service/lyServiceService.js'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		data() {
+			return {
+				canAdd: false,
+				userid: "",
+				isLogin: "",
+				pageInfo: {},
+				loginid: "",
+				title: "服务记录",
+				isBack: true, // 是否显示返回按钮
+				bgColor: 'bg-blue', // 背景颜色
+				finish:true,
+				curWord: "", //当前搜索关键词
+				range: [
+				          { value: 999, text: "全部" },
+				          { value: 1, text: "反馈大走访" },
+				          { value: 2, text: "正在办理" },
+						  { value: 3, text: "难以化解" },
+						  { value: 4, text: "持续跟踪" },
+						  { value: 5, text: "提请会办" },
+				        ],
+				dataList: [], // 数据列表
+				modalName: null,
+				tablePage: {
+					total: 0,
+					currentPage: 1,
+					pageSize: 10,
+					orders: []
+				},
+				loading: false,
+				parkId: '',
+				parkList: [],
+				parkList2: [],
+				parkList3: [],
+				parkList4: [],
+				ddd1: "",
+			};
+		},
+		onShow() {
+			this.isLogin = this.$auth.checkisLogin();
+		},
+
+		created() {
+
+			this.userid = $auth.getUserInfo().loginName;
+
+		},
+		methods: {
+			/*获取数据列表 */
+			upCallback(page) {
+				this.loading = true
+				lyServiceService.list({
+					current: page.num,
+					size: page.size,
+					orders: [{
+						column: 'a.create_date',
+						asc: false
+					}],
+				}).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();
+				})
+			},
+			change(val){
+				this.dataList = []
+				if(this.curWord == ''){this.curWord = 999}
+				this.upCallback(this.tablePage)
+			},
+
+			updateCities(newCities) {
+				this.cities = newCities;
+			},
+
+			// 搜索
+			doSearch() {
+
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+
+			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("17bac1f980264e3e8193bc965538e2c6") != -1) {
+					//// 管理员
+					this.stype = 5
+					uni.setStorageSync('stype', this.stype);
+				} else if (roleIds.indexOf("ade960e8f02544998b07397304c059c1") != -1) {
+					// 政府管理员
+					this.stype = 4
+					uni.setStorageSync('stype', this.stype);
+				} else {
+					console.log('==================>这里走了么', '================>存一个stape')
+					loginService
+						.getOtherIdByOffceid({
+							officeid: officeId,
+						})
+						.then(({
+							data
+						}) => {
+							console.log(data, "====================>getOtherIdByOffceid");
+							this.stype = data.stype;
+							uni.setStorageSync('stype', this.stype);
+						});
+				}
+
+			},
+
+			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();
+							// uni.reLaunch({
+							// 	url: '/pages/login/login'
+							// })
+						}
+					}
+				});
+			},
+			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/login'
+								})
+							}
+						}
+					});
+				} else {
+					uni.navigateTo({
+						url: '/pages/service/addService'
+					})
+				}
+
+
+			},
+			switchTab(index) {
+				this.activeTab = index;
+				if (this.activeTab == 0) {
+					this.searchForm.des1 = "";
+				} else {
+					this.searchForm.des1 = this.activeTab;
+				}
+
+				this.doSearch();
+
+			}
+		}
+	}
+</script>
+
+<style>
+	.page {
+		height: 100vh;
+	}
+
+	.line-box {
+
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+		margin-top: 20rpx;
+		height: 75vh;
+	}
+
+	.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;
+	}
+
+
+	.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: 12rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		padding-bottom: 15rpx;
+		margin-top: 20rpx;
+	}
+
+	.item-title {
+
+
+
+		font-size: 30rpx;
+		margin-top: 12rpx;
+		color: #010101;
+	}
+
+	.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 {
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		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: 325rpx;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-right: 20rpx;
+		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: 80rpx;
+	}
+
+	.fixed-bottom-right {
+		padding: 20rpx;
+		position: fixed;
+		bottom: 20px;
+		/* 距离底部的距离 */
+		right: 20px;
+		/* 距离右侧的距离 */
+	}
+
+	.tabs {
+		display: flex;
+		justify-content: space-around;
+		margin-bottom: 10px;
+	}
+
+	.tab-item {
+		padding: 10px 10px;
+		cursor: pointer;
+		transition: all 0.3s;
+	}
+
+	.tab-item.active {
+		color: #66b1ff;
+		border-bottom: 2px solid #66b1ff;
+	}
+
+	.tab-content {
+		padding: 20px;
+	}
+
+	.tab-item-content {
+		display: none;
+	}
+
+	.tab-item-content.v-if {
+		display: block;
+	}
+
+
+	.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>

+ 301 - 0
jp-mobile/pages/service/addService.vue

@@ -0,0 +1,301 @@
+<template>
+	<view>
+		<cu-custom bgColor="bg-blue" :isBack="true" v-if="title == '问题诉求情况'">
+			<block slot="backText">返回</block>
+			<!-- <block slot="content">问题诉求情况</block> -->
+		</cu-custom>
+
+		<form @submit="formSubmit" class="cu-list menu">
+
+			<view class="titlebg2">
+				<view class="titlet2">企业信息</view>
+			</view>
+
+
+			<view class="textbg">
+				<view class="text12">
+					企业名称:
+				</view>
+				<view class="text22">
+					<uni-combox :candidates="companys" placeholder="请选择所在城市" v-model="companyName"
+						@input="getCompany"></uni-combox>
+				</view>
+			</view>
+
+			<view class="textbg">
+				<view class="text12">
+					属地:
+				</view>
+				<view class="text22">
+					{{company.des1}}
+				</view>
+			</view>
+
+			<view class="textbg">
+				<view class="text12">
+					企业负责人:
+				</view>
+				<view class="text22">
+					{{company.lxr}}
+				</view>
+			</view>
+
+			<view class="textbg">
+				<view class="text12">
+					负责人号码:
+				</view>
+				<view class="text22">
+					{{company.phone}}
+				</view>
+			</view>
+
+			<view style="height: 30rpx;background-color: white;"></view>
+
+			<view class="titlebg2" style="margin-top:10rpx ;">
+				<view class="titlet2">挂钩干部</view>
+			</view>
+
+			<view class="textbg">
+				<view class="text12">
+					姓名:
+				</view>
+				<view class="text22">
+					{{inputForm.qy.bz5}}
+				</view>
+			</view>
+
+			<view style="height: 30rpx;background-color: white;"></view>
+
+			<view class="titlebg2" style="margin-top:10rpx ;">
+				<view class="titlet2">对接方式</view>
+			</view>
+			<view class="titlebg2">
+				<radio-group @change="radioChange">
+					<label class="radio">
+						<radio value="上门沟通" checked="true" />上门沟通
+					</label>
+					<label class="radio">
+						<radio value="电话联系" />电话联系
+					</label>
+					<label class="radio">
+						<radio value="平台沟通" />平台沟通
+					</label>
+				</radio-group>
+			</view>
+			<view class="titlebg2" style="margin-top:10rpx ;">
+				<view class="titlet2" style="width: 20%;">{{inputForm.method}}记录时间</view>
+				<uni-datetime-picker type="date" :v-model="inputForm.contactDate" placeholder="请选择近期与企业沟通时间"
+					@change="changeLog" />
+			</view>
+			<view style="height: 40rpx;"></view>
+			<view class="flexC" v-if="canedit">
+				<button form-type="submit" class="bt1 cu-btn block bg-blue margin-tb-sm lg">提交</button>
+			</view>
+			<view style="height: 40rpx;"></view>
+		</form>
+	</view>
+</template>
+
+<script>
+	import loginService from '@/api/auth/loginService.js'
+	import lyServiceService from '@/api/service/lyServiceService.js'
+	export default {
+		onShow() {
+			this.$auth.checkLogin()
+		},
+		data() {
+			return {
+				title: '问题诉求情况',
+				inputForm: {
+					id: '',
+					qy: {
+						id: '',
+						name: '',
+						lxr: '',
+						phone: '',
+						bz5: '',
+						des1: '',
+						bz6: ''
+					},
+					method: '上门沟通',
+					contactDate: ''
+				},
+				picLists: [],
+				canedit: true,
+				companys: [],
+				companyList: [],
+				companyName: '',
+				company: {
+					id: '',
+					name: '',
+					lxr: '',
+					phone: '',
+					bz5: '',
+					des1: '',
+					bz6: ''
+				},
+			}
+		},
+		async onLoad(query) {
+			//新增
+			let data2 = await loginService.queryByUserNameList()
+			for (var i = 0; i < data2.data.length; i++) {
+				this.companys.push(data2.data[i].name);
+				this.companyList.push(data2.data[i]);
+			}
+			this.inputForm.qy = this.recover(this.inputForm.qy, data2.data[0])
+			this.inputForm.id = "";
+			this.company = data2.data[0]
+			this.companyName = data2.data[0].name
+		},
+		methods: {
+			radioChange(e) {
+				this.inputForm.method = e.detail.value
+			},
+
+			getCompany(e) {
+				let company = this.companyList.filter((item) => {
+					return item.name.indexOf(e) > -1
+				})
+				if (company.length == 1) {
+					this.company = company[0]
+				}
+
+			},
+
+			changeLog(e) {
+				this.inputForm.contactDate = e
+			},
+
+			formSubmit: function(e) {
+				this.inputForm.qy = this.company;
+				lyServiceService.save(this.inputForm).then(res => {
+					console.log("res", res);
+					if (res.statusCode == 200) {
+						uni.navigateTo({
+							url: '/pages/service/LyService'
+						})
+					}
+				})
+			},
+
+
+		}
+	}
+</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;
+		width: 500rpx;
+	}
+
+	.uni-input {}
+
+	.textbg {
+		display: flex;
+		background-color: white;
+		padding-top: 29rpx;
+	}
+
+	.text12 {
+		width: 200rpx;
+		margin-left: 30rpx;
+		color: #000000;
+		font-size: 29rpx;
+	}
+
+	.text2 {
+		flex: 1;
+		color: #000000;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+	}
+
+	.text22 {
+		flex: 1;
+		color: #666666;
+		font-size: 29rpx;
+		padding-bottom: 2rpx;
+		align-self: flex-end;
+	}
+
+	.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: #000;
+	}
+
+	.titlebb {
+		color: #000000;
+		font-weight: 800;
+		padding-left: 40rpx;
+		background-color: #ffffff;
+		padding-top: 20rpx;
+
+	}
+
+	.flexC {
+		display: flex;
+	}
+
+	.bt1 {
+		flex: 1;
+		margin: 30rpx;
+	}
+
+	.bt2 {
+		flex: 1;
+		margin: 30rpx;
+	}
+</style>

+ 17 - 0
jp-mobile/uni_modules/uni-combox/changelog.md

@@ -0,0 +1,17 @@
+## 1.0.2(2024-09-21)
+- 新增 clearAble属性
+## 1.0.1(2021-11-23)
+- 优化 label、label-width 属性
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox)
+## 0.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.0.6(2021-05-12)
+- 新增 组件示例地址
+## 0.0.5(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 0.0.4(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 0.0.3(2021-02-04)
+- 调整为uni_modules目录规范

+ 284 - 0
jp-mobile/uni_modules/uni-combox/components/uni-combox/uni-combox.vue

@@ -0,0 +1,284 @@
+<template>
+	<view class="uni-combox" :class="border ? '' : 'uni-combox__no-border'">
+		<view v-if="label" class="uni-combox__label" :style="labelStyle">
+			<text>{{label}}</text>
+		</view>
+		<view class="uni-combox__input-box">
+			<input class="uni-combox__input" type="text" :placeholder="placeholder" placeholder-class="uni-combox__input-plac"
+				v-model="inputVal" @input="onInput" @focus="onFocus" @blur="onBlur" />
+			<uni-icons v-if="!inputVal || !clearAble" :type="showSelector? 'top' : 'bottom'" size="14" color="#999" @click="toggleSelector">
+			</uni-icons>
+			<uni-icons v-if="inputVal && clearAble" type="clear" size="24" color="#999" @click="clean">
+			</uni-icons>
+		</view>
+		<view class="uni-combox__selector" v-if="showSelector">
+			<view class="uni-popper__arrow"></view>
+			<scroll-view scroll-y="true" class="uni-combox__selector-scroll">
+				<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
+					<text>{{emptyTips}}</text>
+				</view>
+				<view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index"
+					@click="onSelectorClick(index)">
+					<text>{{item}}</text>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Combox 组合输入框
+	 * @description 组合输入框一般用于既可以输入也可以选择的场景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
+	 * @property {String} label 左侧文字
+	 * @property {String} labelWidth 左侧内容宽度
+	 * @property {String} placeholder 输入框占位符
+	 * @property {Array} candidates 候选项列表
+	 * @property {String} emptyTips 筛选结果为空时显示的文字
+	 * @property {String} value 组合框的值
+	 */
+	export default {
+		name: 'uniCombox',
+		emits: ['input', 'update:modelValue'],
+		props: {
+			clearAble: {
+				type: Boolean,
+				default: false
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			labelWidth: {
+				type: String,
+				default: 'auto'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			candidates: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			emptyTips: {
+				type: String,
+				default: '无匹配项'
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+		},
+		data() {
+			return {
+				showSelector: false,
+				inputVal: ''
+			}
+		},
+		computed: {
+			labelStyle() {
+				if (this.labelWidth === 'auto') {
+					return ""
+				}
+				return `width: ${this.labelWidth}`
+			},
+			filterCandidates() {
+				return this.candidates.filter((item) => {
+					return item.toString().indexOf(this.inputVal) > -1
+				})
+			},
+			filterCandidatesLength() {
+				return this.filterCandidates.length
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+		},
+		methods: {
+			toggleSelector() {
+				this.showSelector = !this.showSelector
+			},
+			onFocus() {
+				this.showSelector = true
+			},
+			onBlur() {
+				setTimeout(() => {
+					this.showSelector = false
+				}, 153)
+			},
+			onSelectorClick(index) {
+				this.inputVal = this.filterCandidates[index]
+				this.showSelector = false
+				this.$emit('input', this.inputVal)
+				this.$emit('update:modelValue', this.inputVal)
+			},
+			onInput() {
+				setTimeout(() => {
+					this.$emit('input', this.inputVal)
+					this.$emit('update:modelValue', this.inputVal)
+				})
+			},
+			clean() {
+				this.inputVal = ''
+				this.onInput()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-combox {
+		font-size: 14px;
+		border: 1px solid #DCDFE6;
+		border-radius: 4px;
+		padding: 6px 10px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		// height: 40px;
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px #DDDDDD;
+	}
+
+	.uni-combox__label {
+		font-size: 16px;
+		line-height: 22px;
+		padding-right: 10px;
+		color: #999999;
+	}
+
+	.uni-combox__input-box {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-combox__input {
+		flex: 1;
+		font-size: 14px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-combox__input-plac {
+		font-size: 14px;
+		color: #999;
+	}
+
+	.uni-combox__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		top: calc(100% + 12px);
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 2;
+		padding: 4px 0;
+	}
+
+	.uni-combox__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-combox__selector-empty,
+	.uni-combox__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 36px;
+		font-size: 14px;
+		text-align: center;
+		// border-bottom: solid 1px #DDDDDD;
+		padding: 0px 10px;
+	}
+
+	.uni-combox__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-combox__selector-empty:last-child,
+	.uni-combox__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	// picker 弹出层通用的指示小三角
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border-color: transparent;
+		border-style: solid;
+		border-width: 6px;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-combox__no-border {
+		border: none;
+	}
+</style>

+ 88 - 0
jp-mobile/uni_modules/uni-combox/package.json

@@ -0,0 +1,88 @@
+{
+  "id": "uni-combox",
+  "displayName": "uni-combox 组合框",
+  "version": "1.0.2",
+  "description": "可以选择也可以输入的表单项 ",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "combox",
+    "组合框",
+    "select"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
jp-mobile/uni_modules/uni-combox/readme.md

@@ -0,0 +1,11 @@
+
+
+## Combox 组合框
+> **组件名:uni-combox**
+> 代码块: `uCombox`
+
+
+组合框组件。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 6 - 0
jp-mobile/uni_modules/uni-load-more/changelog.md

@@ -1,3 +1,9 @@
+## 1.3.6(2024-10-15)
+- 修复 微信小程序中的getSystemInfo警告
+## 1.3.5(2024-10-12)
+- 修复 微信小程序中的getSystemInfo警告
+## 1.3.4(2024-10-12)
+- 修复 微信小程序中的getSystemInfo警告
 ## 1.3.3(2022-01-20)
 - 新增 showText属性 ,是否显示文本
 ## 1.3.2(2022-01-19)

+ 5 - 0
jp-mobile/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue

@@ -37,7 +37,12 @@
 <script>
 	let platform
 	setTimeout(() => {
+		// #ifdef MP-WEIXIN
+		platform = uni.getDeviceInfo().platform
+		// #endif
+		// #ifndef MP-WEIXIN
 		platform = uni.getSystemInfoSync().platform
+		// #endif
 	}, 16)
 
 	import {

+ 7 - 9
jp-mobile/uni_modules/uni-load-more/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-load-more",
   "displayName": "uni-load-more 加载更多",
-  "version": "1.3.3",
+  "version": "1.3.6",
   "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。",
   "keywords": [
     "uni-ui",
@@ -16,11 +16,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -37,7 +33,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-scss"],
@@ -45,7 +42,8 @@
     "platforms": {
       "cloud": {
         "tcb": "y",
-        "aliyun": "y"
+        "aliyun": "y",
+        "alipay": "n"
       },
       "client": {
         "App": {
@@ -83,4 +81,4 @@
       }
     }
   }
-}
+}

+ 60 - 0
jp-ui/src/api/service/lyServiceService.js

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

+ 134 - 0
jp-ui/src/views/modules/service/LyServiceForm.vue

@@ -0,0 +1,134 @@
+<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="120px">
+      <el-row  :gutter="15">
+        <el-col :span="12">
+            <el-form-item label="企业" prop="qy.id"
+                :rules="[
+                 ]">
+          <GridSelect
+            title="选择企业"
+            labelName = 'name'
+            labelValue = 'id'
+            :value = "inputForm.qy.id"
+            :limit="1"
+            @getValue='(value) => {inputForm.qy.id=value}'
+            :columns="[
+            {
+              prop: 'id',
+              label: '主键'
+            },
+            {
+              prop: 'name',
+              label: '企业名称'
+            }
+            ]"
+            :searchs="[
+            {
+              prop: 'id',
+              label: '主键'
+            }
+            ]"
+            dataListUrl="/EnterpriseInfo/enterpriseInfo/list"
+            queryEntityUrl="/EnterpriseInfo/enterpriseInfo/queryById">
+          </GridSelect>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="方式" prop="method"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.method" placeholder="请填写方式"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="联系时间" prop="contactDate"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.contactDate" placeholder="请填写联系时间"     ></el-input>
+           </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 GridSelect from '@/components/gridSelect'
+  import lyServiceService from '@/api/service/lyServiceService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          qy: {
+            id: ''
+          },
+          method: '',
+          contactDate: ''
+        }
+      }
+    },
+    components: {
+      GridSelect
+    },
+    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
+            lyServiceService.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
+            lyServiceService.save(this.inputForm).then(({data}) => {
+              this.visible = false
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      }
+    }
+  }
+</script>
+
+  

+ 264 - 0
jp-ui/src/views/modules/service/LyServiceList.vue

@@ -0,0 +1,264 @@
+<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>
+            <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}" import export print custom>
+          <template #buttons>
+            <el-button v-if="hasPermission('service:lyService:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+            <el-button v-if="hasPermission('service:lyService:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.lyServiceTable && $refs.lyServiceTable.getCheckboxRecords().length !== 1" plain>修改</el-button>
+            <el-button v-if="hasPermission('service:lyService:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.lyServiceTable && $refs.lyServiceTable.getCheckboxRecords().length === 0" plain>删除</el-button>
+          </template>
+          <template #tools>
+            <vxe-button
+    		  type="default"
+    		  title="下载导入模板"
+    		  v-if="hasPermission('service:lyService: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="lyServiceTable"
+            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="qy.name"
+        sortable
+        title="企业">
+            <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('service:lyService:edit')" @click="edit(scope.row.id)">{{scope.row.qy && scope.row.qy.name}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('service:lyService:view')"  @click="view(scope.row.id)">{{scope.row.qy &&  scope.row.qy.name}}</el-link>
+              <span v-else>{{scope.row.qy && scope.row.qy.name}}</span>
+            </template>
+      </vxe-column>
+    <vxe-column
+        field="method"
+        sortable
+        title="方式">
+      </vxe-column>
+    <vxe-column
+        field="contactDate"
+        sortable
+        title="联系时间">
+      </vxe-column>
+      <vxe-column
+        fixed="right"
+        align="center"
+        width="200"
+        title="操作">
+        <template  slot-scope="scope">
+          <el-button v-if="hasPermission('service:lyService:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+          <el-button v-if="hasPermission('service:lyService:edit')" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+          <el-button v-if="hasPermission('service:lyService: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>
+        <!-- 弹窗, 新增 / 修改 -->
+    <LyServiceForm  ref="lyServiceForm" @refreshDataList="refreshList"></LyServiceForm>
+  </div>
+</template>
+
+<script>
+  import LyServiceForm from './LyServiceForm'
+  import lyServiceService from '@/api/service/lyServiceService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: [{ column: 'a.create_date', asc: false }]
+        },
+        loading: false
+      }
+    },
+    components: {
+      LyServiceForm
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        lyServiceService.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: 'a.create_date', asc: false }]
+        }
+        this.refreshList()
+      },
+      // 新增
+      add () {
+        this.$refs.lyServiceForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.lyServiceTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.lyServiceForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.lyServiceForm.init('view', id)
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.lyServiceTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          lyServiceService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      // 下载模板
+      downloadTpl () {
+        this.loading = true
+        lyServiceService.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
+        lyServiceService.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 lyServiceService.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>
+