Ver código fonte

通过部门id,甲方单位id获取分管领导

lamphua 11 meses atrás
pai
commit
5b7615c678

+ 42
- 0
oa-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/CmcManageDeptController.java Ver arquivo

@@ -2,6 +2,10 @@ package com.ruoyi.web.controller.oa;
2 2
 
3 3
 import java.util.List;
4 4
 import javax.servlet.http.HttpServletResponse;
5
+
6
+import com.ruoyi.oa.domain.CmcProject;
7
+import com.ruoyi.oa.service.ICmcPartyAService;
8
+import com.ruoyi.system.service.ISysDeptService;
5 9
 import org.springframework.beans.factory.annotation.Autowired;
6 10
 import org.springframework.web.bind.annotation.GetMapping;
7 11
 import org.springframework.web.bind.annotation.PostMapping;
@@ -33,6 +37,12 @@ public class CmcManageDeptController extends BaseController
33 37
     @Autowired
34 38
     private ICmcManageDeptService cmcManageDeptService;
35 39
 
40
+    @Autowired
41
+    private ISysDeptService deptService;
42
+
43
+    @Autowired
44
+    private ICmcPartyAService partyAService;
45
+
36 46
     /**
37 47
      * 查询cmc领导分管列表
38 48
      */
@@ -41,6 +51,22 @@ public class CmcManageDeptController extends BaseController
41 51
     {
42 52
         startPage();
43 53
         List<CmcManageDept> list = cmcManageDeptService.selectCmcManageDeptList(cmcManageDept);
54
+        for (CmcManageDept manageDept : list) {
55
+            String deptId = manageDept.getDeptId();
56
+            StringBuilder deptName = new StringBuilder();
57
+            if (deptId != null && !deptId.equals("") && deptId.split(",").length > 0) {
58
+                for (String dept : deptId.split(","))
59
+                    deptName.append(deptService.selectDeptById(Long.parseLong(dept)).getDeptName()).append(",");
60
+                manageDept.setDeptName(deptName.substring(0, deptName.length() - 1));
61
+            }
62
+            String partyAId = manageDept.getPartyAId();
63
+            StringBuilder partyAName = new StringBuilder();
64
+            if (partyAId != null && !partyAId.equals("") && partyAId.split(",").length > 0) {
65
+                for (String partyA : partyAId.split(","))
66
+                    partyAName.append(partyAService.selectCmcPartyAByPartyAId(partyA).getPartyAName()).append(",");
67
+                manageDept.setPartyAName(partyAName.substring(0, partyAName.length() - 1));
68
+            }
69
+        }
44 70
         return getDataTable(list);
45 71
     }
46 72
 
@@ -52,6 +78,22 @@ public class CmcManageDeptController extends BaseController
52 78
     public void export(HttpServletResponse response, CmcManageDept cmcManageDept)
53 79
     {
54 80
         List<CmcManageDept> list = cmcManageDeptService.selectCmcManageDeptList(cmcManageDept);
81
+        for (CmcManageDept manageDept : list) {
82
+            String deptId = manageDept.getDeptId();
83
+            StringBuilder deptName = new StringBuilder();
84
+            if (deptId != null && !deptId.equals("") && deptId.split(",").length > 0) {
85
+                for (String dept : deptId.split(","))
86
+                    deptName.append(deptService.selectDeptById(Long.parseLong(dept)).getDeptName()).append(",");
87
+                manageDept.setDeptName(deptName.substring(0, deptName.length() - 1));
88
+            }
89
+            String partyAId = manageDept.getPartyAId();
90
+            StringBuilder partyAName = new StringBuilder();
91
+            if (partyAId != null && !partyAId.equals("") && partyAId.split(",").length > 0) {
92
+                for (String partyA : partyAId.split(","))
93
+                    partyAName.append(partyAService.selectCmcPartyAByPartyAId(partyA).getPartyAName()).append(",");
94
+                manageDept.setPartyAName(partyAName.substring(0, partyAName.length() - 1));
95
+            }
96
+        }
55 97
         ExcelUtil<CmcManageDept> util = new ExcelUtil<CmcManageDept>(CmcManageDept.class);
56 98
         util.exportExcel(response, list, "cmc领导分管数据");
57 99
     }

+ 16
- 23
oa-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java Ver arquivo

@@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
9 9
 import com.alibaba.fastjson2.JSONObject;
10 10
 import com.ruoyi.common.core.domain.entity.SysDept;
11 11
 import com.ruoyi.common.core.domain.entity.SysUser;
12
+import com.ruoyi.oa.domain.CmcManageDept;
13
+import com.ruoyi.oa.service.ICmcManageDeptService;
12 14
 import com.ruoyi.system.service.ISysDeptService;
13 15
 import com.ruoyi.system.service.ISysUserService;
14 16
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,6 +48,9 @@ public class SysPostController extends BaseController
46 48
     @Autowired
47 49
     private ISysUserService userService;
48 50
 
51
+    @Autowired
52
+    private ICmcManageDeptService cmcManageDeptService;
53
+
49 54
     /**
50 55
      * 获取岗位列表
51 56
      */
@@ -145,7 +150,7 @@ public class SysPostController extends BaseController
145 150
     @GetMapping("/manageLeader")
146 151
     public AjaxResult getManageLeader(String userId)
147 152
     {
148
-        return success(getManageId(userService.selectUserById(Long.parseLong(userId)).getDeptId()));
153
+        return success(getManageId(userService.selectUserById(Long.parseLong(userId)).getDeptId().toString(), ""));
149 154
     }
150 155
 
151 156
     /**
@@ -161,9 +166,9 @@ public class SysPostController extends BaseController
161 166
      * 通过deptId获取分管领导
162 167
      */
163 168
     @GetMapping("/manageLeaderByDept")
164
-    public AjaxResult getManageLeaderByDeptId(String deptId)
169
+    public AjaxResult getManageLeaderByDeptId(String deptId, String partyAId)
165 170
     {
166
-        return success(getManageId(Long.parseLong(deptId)));
171
+        return success(getManageId(deptId, partyAId));
167 172
     }
168 173
 
169 174
     @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
@@ -247,26 +252,14 @@ public class SysPostController extends BaseController
247 252
         return success(posts);
248 253
     }
249 254
 
250
-    private SysUser getManageId(Long id) {
251
-        JSONObject jsonObject = new JSONObject();
252
-        jsonObject.put("2", Arrays.asList(104,106,114));
253
-        jsonObject.put("7", Arrays.asList(105, 113, 117));
254
-        jsonObject.put("9", Arrays.asList(109, 110));
255
-        jsonObject.put("10", Arrays.asList(111, 112));
256
-        jsonObject.put("11", Arrays.asList(107, 108));
257
-        jsonObject.put("12", Arrays.asList(118));
258
-        jsonObject.put("13", Arrays.asList(115, 116));
259
-        Iterator<String> iterator = jsonObject.keySet().iterator();
260
-        String manageId = "";
261
-        while(iterator.hasNext()){
262
-            String key = (String) iterator.next();
263
-            List<Long> value = jsonObject.getList(key, Long.class);
264
-            if (value.contains(id))
265
-                manageId = key;
255
+    private List<SysUser> getManageId(String deptId, String partyAId) {
256
+        List<SysUser> userList = new ArrayList<>();
257
+        CmcManageDept cmcManageDept = new CmcManageDept();
258
+        cmcManageDept.setDeptId(deptId);
259
+        cmcManageDept.setPartyAId(partyAId);
260
+        for (CmcManageDept manageDept : cmcManageDeptService.selectCmcManageDeptList(cmcManageDept)) {
261
+            userList.add(userService.selectUserById(manageDept.getUserId()));
266 262
         }
267
-        SysUser user = new SysUser();
268
-        if (!manageId.equals(""))
269
-            user = userService.selectUserById(Long.parseLong(manageId));
270
-        return user;
263
+        return userList;
271 264
     }
272 265
 }

+ 39
- 3
oa-back/ruoyi-system/src/main/java/com/ruoyi/oa/domain/CmcManageDept.java Ver arquivo

@@ -1,5 +1,6 @@
1 1
 package com.ruoyi.oa.domain;
2 2
 
3
+import com.ruoyi.common.core.domain.entity.SysUser;
3 4
 import org.apache.commons.lang3.builder.ToStringBuilder;
4 5
 import org.apache.commons.lang3.builder.ToStringStyle;
5 6
 import com.ruoyi.common.annotation.Excel;
@@ -17,12 +18,19 @@ public class CmcManageDept extends BaseEntity
17 18
 
18 19
     /** 分管领导id */
19 20
     private Long userId;
21
+    @Excel(name = "分管领导")
22
+    private String userName;
23
+    private SysUser user;
20 24
 
21 25
     /** 分管部门id */
22
-    private Long deptId;
26
+    private String deptId;
27
+    @Excel(name = "分管部门")
28
+    private String deptName;
23 29
 
24 30
     /** 院内对接单位 */
25 31
     private String partyAId;
32
+    @Excel(name = "院内对接单位")
33
+    private String partyAName;
26 34
 
27 35
     public void setUserId(Long userId) 
28 36
     {
@@ -33,15 +41,34 @@ public class CmcManageDept extends BaseEntity
33 41
     {
34 42
         return userId;
35 43
     }
36
-    public void setDeptId(Long deptId) 
44
+    public void setUser(SysUser user)
45
+    {
46
+        this.user = user;
47
+        this.userName = user == null ? "" : user.getNickName();
48
+    }
49
+
50
+    public SysUser getUser()
51
+    {
52
+        return user;
53
+    }
54
+    public void setDeptId(String deptId)
37 55
     {
38 56
         this.deptId = deptId;
39 57
     }
40 58
 
41
-    public Long getDeptId() 
59
+    public String getDeptId()
42 60
     {
43 61
         return deptId;
44 62
     }
63
+    public void setDeptName(String deptName)
64
+    {
65
+        this.deptName = deptName;
66
+    }
67
+
68
+    public String getDeptName()
69
+    {
70
+        return deptName;
71
+    }
45 72
     public void setPartyAId(String partyAId) 
46 73
     {
47 74
         this.partyAId = partyAId;
@@ -51,6 +78,15 @@ public class CmcManageDept extends BaseEntity
51 78
     {
52 79
         return partyAId;
53 80
     }
81
+    public void setPartyAName(String partyAName)
82
+    {
83
+        this.partyAName = partyAName;
84
+    }
85
+
86
+    public String getPartyAName()
87
+    {
88
+        return partyAName;
89
+    }
54 90
 
55 91
     @Override
56 92
     public String toString() {

+ 2
- 2
oa-back/ruoyi-system/src/main/resources/mapper/oa/CmcCarApprovalMapper.xml Ver arquivo

@@ -105,8 +105,8 @@
105 105
         <where>
106 106
             <if test="applier != null "> and ca.applier = #{applier}</if>
107 107
             <if test="useDept != null "> and ca.use_dept = #{useDept}</if>
108
-            <if test="cars != null  and cars != ''"> and find_in_set(ca.cars, #{cars})</if>
109
-            <if test="drivers != null  and drivers != ''"> and find_in_set(ca.drivers, #{drivers})</if>
108
+            <if test="cars != null  and cars != ''"> and find_in_set(#{cars}, ca.cars)</if>
109
+            <if test="drivers != null  and drivers != ''"> and find_in_set(#{drivers}, ca.drivers})</if>
110 110
             <if test="projectId != null  and projectId != ''"> and ca.project_id = #{projectId}</if>
111 111
             <if test="applyReason != null  and applyReason != ''"> and ca.apply_reason = #{applyReason}</if>
112 112
             <if test="passengers != null "> and ca.passengers = #{passengers}</if>

+ 3
- 3
oa-back/ruoyi-system/src/main/resources/mapper/oa/CmcDeviceApprovalMapper.xml Ver arquivo

@@ -75,9 +75,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
75 75
         <where>  
76 76
             <if test="applier != null "> and da.applier = #{applier}</if>
77 77
             <if test="useDept != null "> and da.use_dept = #{useDept}</if>
78
-            <if test="devices != null  and devices != ''"> and find_in_set(da.devices, #{devices})</if>
79
-            <if test="modifyDevices != null  and modifyDevices != ''"> and find_in_set(da.modify_devices, #{modifyDevices})</if>
80
-            <if test="repairDevices != null  and repairDevices != ''"> and find_in_set(da.repair_devices, #{repairDevices})</if>
78
+            <if test="devices != null  and devices != ''"> and find_in_set(#{devices}, da.devices)</if>
79
+            <if test="modifyDevices != null  and modifyDevices != ''"> and find_in_set(#{modifyDevices}, da.modify_devices)</if>
80
+            <if test="repairDevices != null  and repairDevices != ''"> and find_in_set(#{repairDevices}, da.repair_devices)</if>
81 81
             <if test="projectId != null  and projectId != ''"> and da.project_id = #{projectId}</if>
82 82
             <if test="applyReason != null  and applyReason != ''"> and da.apply_reason = #{applyReason}</if>
83 83
             <if test="applyDate != null "> and da.apply_date = #{applyDate}</if>

+ 14
- 5
oa-back/ruoyi-system/src/main/resources/mapper/oa/CmcManageDeptMapper.xml Ver arquivo

@@ -8,21 +8,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
8 8
         <result property="userId"    column="user_id"    />
9 9
         <result property="deptId"    column="dept_id"    />
10 10
         <result property="partyAId"    column="party_a_id"    />
11
+        <association property="user"    javaType="SysUser"         resultMap="SysUserResult" />
12
+    </resultMap>
13
+
14
+    <resultMap type="SysUser" id="SysUserResult">
15
+        <result property="userId"    column="user_id"    />
16
+        <result property="nickName"    column="nick_name"    />
11 17
     </resultMap>
12 18
 
13 19
     <sql id="selectCmcManageDeptVo">
14
-        select user_id, dept_id, party_a_id from cmc_manage_dept
20
+        select md.user_id, u.nick_name as nick_name, md.dept_id, md.party_a_id from cmc_manage_dept as md
21
+        left join sys_user as u on u.user_id = md.user_id
15 22
     </sql>
16 23
 
17 24
     <select id="selectCmcManageDeptList" parameterType="CmcManageDept" resultMap="CmcManageDeptResult">
18 25
         <include refid="selectCmcManageDeptVo"/>
19
-        <where>  
26
+        <where>
27
+            <if test="deptId != null  and deptId != ''"> and find_in_set(#{deptId}, md.dept_id)</if>
28
+            <if test="partyAId != null  and partyAId != ''"> and find_in_set(#{partyAId}, md.party_a_id)</if>
20 29
         </where>
21 30
     </select>
22 31
     
23 32
     <select id="selectCmcManageDeptByUserId" parameterType="Long" resultMap="CmcManageDeptResult">
24 33
         <include refid="selectCmcManageDeptVo"/>
25
-        where user_id = #{userId}
34
+        where md.user_id = #{userId}
26 35
     </select>
27 36
         
28 37
     <insert id="insertCmcManageDept" parameterType="CmcManageDept">
@@ -42,8 +51,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
42 51
     <update id="updateCmcManageDept" parameterType="CmcManageDept">
43 52
         update cmc_manage_dept
44 53
         <trim prefix="SET" suffixOverrides=",">
45
-            <if test="deptId != null">dept_id = #{deptId},</if>
46
-            <if test="partyAId != null">party_a_id = #{partyAId},</if>
54
+            <if test="deptId != null and deptId != ''">dept_id = #{deptId},</if>
55
+            party_a_id = #{partyAId}
47 56
         </trim>
48 57
         where user_id = #{userId}
49 58
     </update>

+ 1
- 1
oa-back/ruoyi-system/src/main/resources/mapper/oa/CmcSafeReportMapper.xml Ver arquivo

@@ -38,7 +38,7 @@
38 38
         <where>
39 39
             <if test="projectId != null  and projectId != ''"> and sr.project_id = #{projectId}</if>
40 40
             <if test="reportDate != null "> and sr.report_date = #{reportDate}</if>
41
-            <if test="member != null  and member != ''"> and (find_in_set(sr.member, #{member}) or sr.reporter = #{member})</if>
41
+            <if test="member != null  and member != ''"> and (find_in_set(#{member}, sr.member) or sr.reporter = #{member})</if>
42 42
             <if test="employee != null  and employee != ''"> and sr.employee like concat('%', #{employee}, '%')</if>
43 43
             <if test="content != null  and content != ''"> and sr.content = #{content}</if>
44 44
             <if test="reporter != null "> and sr.reporter = #{reporter}</if>

+ 3
- 3
oa-back/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml Ver arquivo

@@ -118,13 +118,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
118 118
 			AND u.degree = #{degree}
119 119
 		</if>
120 120
 		<if test="titles != null and titles != ''">
121
-			AND find_in_set(u.titles, #{titles})
121
+			AND find_in_set(#{titles}, u.titles)
122 122
 		</if>
123 123
 		<if test="certificates != null and certificates != ''">
124
-			AND find_in_set(u.certificates, #{certificates})
124
+			AND find_in_set(#{certificates}, u.certificates})
125 125
 		</if>
126 126
 		<if test="politicalAffiliation != null and politicalAffiliation != ''">
127
-			AND find_in_set(u.political_affiliation, #{political_affiliation})
127
+			AND find_in_set(#{politicalAffiliation}, u.political_affiliation})
128 128
 		</if>
129 129
 		<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
130 130
 			AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')

+ 16
- 39
oa-back/sql/sql.sql Ver arquivo

@@ -99,7 +99,7 @@ create table sys_user (
99 99
 -- ----------------------------
100 100
 -- 初始化-用户信息表数据
101 101
 -- ----------------------------
102
-INSERT INTO `sys_user` VALUES (1, 104, 'admin', 'admin', '0', NULL, '15888888888', '1', NULL, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2024-07-02 14:56:55', NULL, '2024-05-14 10:41:32', NULL, '2024-07-02 14:56:54', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
102
+INSERT INTO `sys_user` VALUES (1, 108, 'admin', '管理员', '0', NULL, '15888888888', '1', NULL, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2024-07-02 14:56:55', NULL, '2024-05-14 10:41:32', NULL, '2024-07-02 14:56:54', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
103 103
 INSERT INTO `sys_user` VALUES (2, 101, '13982275233', '刘光庆', '0', NULL, '13982275233', '0', NULL, '$2a$10$uO4FSr6sf1mOe0jO6tKNROwwaw4cApBZwxQE22Vyy5PjuFxpzbdwu', '0', '0', NULL, NULL, NULL, '2024-05-14 10:41:32', NULL, NULL, NULL, NULL, '1', NULL, NULL, '7', '5', NULL, '1991-07-15', NULL, NULL, NULL, '420111197010024095', '重庆市彭水县', '10', '汉族', '武汉大学', '测绘工程', '2', '2016-01-01', NULL, '成都市青羊区光华街道清江中路65号香格里拉花园');
104 104
 INSERT INTO `sys_user` VALUES (3, 101, '13808211356', '向发廷', '0', NULL, '13808211356', '0', NULL, '$2a$10$BueA2DCg.vdjxXPTrEl4A.sUwY1m3AqNbIext6Ow9hGdy4JRTzrC.', '0', '0', NULL, NULL, NULL, '2024-05-14 10:41:32', NULL, NULL, NULL, NULL, '0', NULL, NULL, NULL, NULL, NULL, '1984-02-13', NULL, NULL, NULL, '519003196309166135', '四川省南部县', '2,9', '汉族', '武汉测绘科技大学', '工程测量', '2', '2016-01-01', NULL, '成都市青羊区清江东路186号');
105 105
 INSERT INTO `sys_user` VALUES (4, 101, '13608089391', '王渊', '0', NULL, '13608089391', '0', NULL, '$2a$10$5Urhp6ssSwmN/F3dt3p3XOC9EqY.8JKWDzSEJjjyT.dIqLbqzqNUu', '0', '0', NULL, NULL, NULL, '2024-05-14 10:41:32', NULL, NULL, NULL, NULL, '0', NULL, NULL, '6', '6', NULL, '1985-12-25', NULL, NULL, NULL, '510103196508013470', '四川省三台县', '0,10', '汉族', '武汉测绘科技大学', '摄影测量与遥感', '2', '2016-01-01', NULL, '成都市青羊区清江东路186号');
@@ -1740,8 +1740,8 @@ create table sys_notice (
1740 1740
 -- ----------------------------
1741 1741
 -- 初始化-公告信息表数据
1742 1742
 -- ----------------------------
1743
-insert into sys_notice values('1', '温馨提醒:2024-06-24 综合办公系统公开测试版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员');
1744
-insert into sys_notice values('2', '维护通知:2024-06-24 综合办公系统在试用期间将不定期维护更新', '1', '维护内容',   '0', 'admin', sysdate(), '', null, '管理员');
1743
+insert into sys_notice values('1', '温馨提醒:2024-06-24 综合办公系统公开测试版本发布啦', '2', '新版本内容', '0', '管理员', sysdate(), '', null, '管理员');
1744
+insert into sys_notice values('2', '维护通知:2024-06-24 综合办公系统在试用期间将不定期维护更新', '1', '维护内容',   '0', '管理员', sysdate(), '', null, '管理员');
1745 1745
 
1746 1746
 
1747 1747
 -- ----------------------------
@@ -8439,7 +8439,7 @@ INSERT INTO `cmc_technical` VALUES ('1648881410631270444', '1648881410631270444'
8439 8439
 INSERT INTO `cmc_technical` VALUES ('1648881410631270449', '1648881410631270449', NULL, 49, NULL, NULL, NULL, NULL, '2024-06-06', NULL);
8440 8440
 INSERT INTO `cmc_technical` VALUES ('1648881410631270452', '1648881410631270452', NULL, 49, NULL, NULL, '按技术交底执行', NULL, '2024-01-15', NULL);
8441 8441
 INSERT INTO `cmc_technical` VALUES ('1648881410631270463', '1648881410631270463', 72, 46, '1)本项目主要执行的规程规范或其他技术文件\n(1)《水电工程测量规范》NB/T 35029-2023; \n(2)《测绘成果质量检查与验收》GB/T 24356-2023。\n2)主要技术指标及成果要求\n(1)平面坐标系统:2000国家大地坐标系;高程系统:1985国家高程基准。\n(2)断面基点测量按照五等平面精度。\n(3)断面测量按《水电工程测量规范》执行。\n(4)流量测验满足用户需求。\n3)使用的仪器设备及专业应用软件\n使用仪器为全站仪、GNSS接收机、无人测量船、流速仪;内业处理软件为浩辰CAD、南方CASS等。所用仪器在投入工程前均检定合格,并在检定有效期内。 \n4)作业方法\n(1)断面位置按用户设计图施测,断面基点平面五等,做单基点。采集CORS信号,高程通过测绘局转换;建立测区高程转换模型。\n(2)岸上断面现场实测,水下断面点采用无人船测量。\n(3)流量测验以用户要求为准。\n5)上交成果资料\n(1)断面成果、基点成果。\n(2)流量测验成果。\n(3)技术设计书及测量报告等(电子版及纸质资料)。\n(4)其它资料见技术设计书。', NULL, '按技术交底要求作业。', '同意', '2024-05-12', '2024-05-12');
8442
-INSERT INTO `cmc_technical` VALUES ('1648881410631270465', '1648881410631270465', 71, 59, NULL, NULL, '', '按技术要求进行作业', '2024-06-20', '2024-06-20');
8442
+INSERT INTO `cmc_technical` VALUES ('1648881410631270465', '1648881410631270465', 71, 49, NULL, NULL, '', '按技术要求进行作业', '2024-06-20', '2024-06-20');
8443 8443
 INSERT INTO `cmc_technical` VALUES ('1648881410694184962', '1648881410694184962', 32, 46, '1) 本项目执行的规程规范或其他技术文件\n(1)《水电工程测量规范》NB/T 35029-2014;\n(2)《水电工程三维激光扫描测量规程》NB/T 35109-2018;《机载激光雷达数据获取技术规范》CH/T 8024-2011;《机载激光雷达数据处理技术规范》CH/T 8023-2011;\n(3)《国家基本比例尺地图图式第1部分:1:500 1:1000 1:2000地形图图式》GB/T 20257.1-2017;《国家基本比例尺地图图式第2部分:1:5000 1:10000地形图图式》GB/T 20257.2-2017;\n(4)《测绘成果质量检查与验收》GB/T 24356-2009;《数字测绘成果质量检查与验收》GB/T 18316-2008。\n2) 主要技术指标及成果要求\n平面坐标系统:2000国家大地坐标系;\n高程系统:1985国家高程基准。\n(1)五等控制点点位中误差大不于5cm,边长相对中误差小于1/20000,高程分别以相邻控制点内部联测,闭合差小于20 mm。\n(2)1:2000地形图采用2.0m等高距,地形类别为山地。地物点平面位置中误差(图上)≤±0.8mm;图幅等高线高程中误差≤±2h/3、高程注记点中误差≤±h/3,h为等高距。\n(3)1:5000地形图采用5.0m等高距,地形类别为山地。地物点平面位置中误差(图上)≤±0.75mm;图幅等高线高程中误差≤±2h/3、高程注记点中误差≤±h/3,h为等高距。\n(4)三维激光扫描采集的激光点云应分布均匀,统一按1:2000精度采集,激光点云地面点密度应大于1点/m2;航空影像分辨率优于0.2m。\n3) 使用的仪器设备及专业应用软件\n使用仪器为飞马DV-LiDAR22激光雷达系统一套,飞行平台采用飞马D20旋翼无人机;拓普康全站仪1台;中海达GNSS接收机2台;内业处理软件为CoPre和TerraSolid 9.0、浩辰CAD、南方CASS等。所用仪器在投入工程前均由测绘管理部门检定合格,并在检定有效期内。\n4) 作业方法\n(1)地形图外业采用无人机搭载激光雷达地面扫描和航空摄影采集地面数据。\n(2)内业通过点云处理,生成DEM构等高线。生产DOM采集地物,最后将地物与等高线套合编辑,出地形图成果。\n(3)外业采用电子调绘系统进行现场调绘工作。\n(4)外业采用常规全站仪、GNSS-RTK进行打点检查;地形图检查点应覆盖不同的航摄分区及结合处,不同的高程面,包括重要工程部位。\n(5)内业将外业调绘、修补测等成果进行编辑,形成正式地形图。\n注:1、点云解算前应通过外业测点检查成果质量;\n2、首件产品应及时提交技术质量部检查。\n5) 上交成果资料\n(1)1:2000地形图、1:5000地形图。\n(2)航测采集成果、数据处理成果资料。\n(3)测绘作业计划及测量报告等。\n(4)其它资料见测绘作业计划。', NULL, '按技术交底要求作业。', '按技术交底要求进行作业。', '2023-03-22', '2023-03-22');
8444 8444
 INSERT INTO `cmc_technical` VALUES ('1648881410878734337', '1648881410878734337', 61, 55, NULL, NULL, '按照要求执行,如现场实施方案有变,及时反馈。 ', '已接受技术交底,现场按要求开展作业。', '2023-03-01', '2023-08-07');
8445 8445
 INSERT INTO `cmc_technical` VALUES ('1648881411067478017', '1648881411067478017', 61, 46, '1)本项目执行的规程规范、技术文件\n(1)《水电工程测量规范》NB/T 35029-2014;\n(3)《水文测量规范》SLS8-2014;\n(4)《水库水文泥沙观测规范》(SL 339-2006);\n(5)《测绘成果质量检查与验收》GB/T 24356-2009;\n(6)《数字测绘成果质量检查与验收》GB/T 18316-2008。\n2)主要技术指标及成果要求\n(1)平面坐标系统:雅砻江坐标系;高程系统:1985国家高程基准。\n(2)控制点平面采用二等、三等GNSS测量,高程采用三等三角高程测量;\n二等GNSS相邻点平均边长大不于13km,相应等级控制网的固定和比例误差为10mm及2mm/km,最弱相邻点边长相对中误差小于1/150000。\n三等GNSS平均边长4km~8km,相应等级控制网的固定和比例误差10mm及5mm/km,最弱边相对中误差小于1/80000。\n三等电磁波测距三角高程测量每条边对向观测高差之较差不超过±35√D,附(闭)合路线闭合差不大于±12√D,单程双测高差较差不大于±8√D,单位mm。其中D为水平距离,单位km。\n(3)断面基点高程为四等高程、平面为五等。\n(4)断面点密度(测点间距)按1:1000地形测量规范要求进行测定,断面点间距5~10m,最大点间距不大于15m,水下测点应不少于5点。对水深变化大的区域适当加密测点,尽可能测量到地形变化的特征点。\n3)使用的仪器设备及专业应用软件\n全站仪、GNSS接收机、全数字双变频测深仪、无人测量船S-11、南方CASS10.1、航天远景。所用仪器在投入工程前均由测绘管理部门检定合格,并在检定有效期内。\n4)作业方法\n(1)控制点平面采用二等、三等GNSS测量,高程采用三等三角高程测量;平面起算搜集测区附近国家点进行联测,高程控制联测两河口施工控制网成果,同时联测测区附近国家高程点校核;\n(2)断面基点高程采用四等三角高程测量、平面采用采用GNSS-RTK进行定位,也可采用五等导线测量、GNSS静态控制测量方法获取平面位置;\n(3)断面测量分为岸上部分和水下部分,岸上部分采用GNSS-RTK、全站仪等方式完成,高程测至水库正常蓄水位2865m以上,水下部分采用机动船搭载全数字双变频测深仪完成库区平水段水深测量,库尾自然河段采用无人测量船完成测量,横断面线需要垂直河道。点间距5~15m。\n4)上交成果资料\n(1)控制点成果表、断面基点成果表、断面累距成果表、横断面布置图等。\n(3)测绘作业计划及测量报告等。\n(4)其它资料见测绘作业计划。', NULL, '按技术交底要求作业。', '技术交底已完成,按要求开展作业。', '2023-02-28', '2023-02-28');
@@ -12525,46 +12525,23 @@ create table `cmc_safe_report`  (
12525 12525
 -- ----------------------------
12526 12526
 drop table if exists `cmc_manage_dept`;
12527 12527
 create table `cmc_manage_dept`  (
12528
-  `user_id` 	bigint not null comment '分管领导id',
12529
-  `dept_id` 	bigint not null comment '分管部门id',
12530
-  `party_a_id` char(4) not null comment '院内对接单位',
12531
-  primary key (`user_id`, `dept_id`, `party_a_id`)
12528
+  `user_id` 	bigint 		not null comment '分管领导id',
12529
+  `dept_id` 	varchar(20) default null comment '分管部门id',
12530
+  `party_a_id`	varchar(25) default null comment '院内对接单位',
12531
+  primary key (`user_id`)
12532 12532
 ) engine = innodb comment = 'cmc领导分管表';
12533 12533
 
12534 12534
 -- ----------------------------
12535 12535
 -- 初始化-领导分管表数据
12536 12536
 -- ----------------------------
12537
-INSERT INTO `cmc_manage_dept` VALUES (2, 104, '0000');
12538
-INSERT INTO `cmc_manage_dept` VALUES (2, 106, '0000');
12539
-INSERT INTO `cmc_manage_dept` VALUES (2, 113, '0000');
12540
-INSERT INTO `cmc_manage_dept` VALUES (7, 104, '0000');
12541
-INSERT INTO `cmc_manage_dept` VALUES (7, 109, '0000');
12542
-INSERT INTO `cmc_manage_dept` VALUES (9, 108, '0000');
12543
-INSERT INTO `cmc_manage_dept` VALUES (9, 109, '0000');
12544
-INSERT INTO `cmc_manage_dept` VALUES (10, 0, '0230');
12545
-INSERT INTO `cmc_manage_dept` VALUES (10, 0, '0231');
12546
-INSERT INTO `cmc_manage_dept` VALUES (10, 0, '0232');
12547
-INSERT INTO `cmc_manage_dept` VALUES (10, 0, '0233');
12548
-INSERT INTO `cmc_manage_dept` VALUES (10, 111, '0000');
12549
-INSERT INTO `cmc_manage_dept` VALUES (10, 115, '0000');
12550
-INSERT INTO `cmc_manage_dept` VALUES (11, 0, '0227');
12551
-INSERT INTO `cmc_manage_dept` VALUES (11, 0, '0235');
12552
-INSERT INTO `cmc_manage_dept` VALUES (11, 107, '0000');
12553
-INSERT INTO `cmc_manage_dept` VALUES (11, 110, '0000');
12554
-INSERT INTO `cmc_manage_dept` VALUES (12, 116, '0000');
12555
-INSERT INTO `cmc_manage_dept` VALUES (13, 0, '0226');
12556
-INSERT INTO `cmc_manage_dept` VALUES (13, 0, '0230');
12557
-INSERT INTO `cmc_manage_dept` VALUES (13, 0, '0231');
12558
-INSERT INTO `cmc_manage_dept` VALUES (13, 0, '0232');
12559
-INSERT INTO `cmc_manage_dept` VALUES (13, 0, '0236');
12560
-INSERT INTO `cmc_manage_dept` VALUES (13, 105, '0000');
12561
-INSERT INTO `cmc_manage_dept` VALUES (13, 112, '0000');
12562
-INSERT INTO `cmc_manage_dept` VALUES (13, 113, '0000');
12563
-INSERT INTO `cmc_manage_dept` VALUES (13, 114, '0000');
12564
-INSERT INTO `cmc_manage_dept` VALUES (14, 106, '0000');
12565
-INSERT INTO `cmc_manage_dept` VALUES (15, 105, '0000');
12566
-INSERT INTO `cmc_manage_dept` VALUES (15, 117, '0000');
12567
-INSERT INTO `cmc_manage_dept` VALUES (15, 118, '0000');
12537
+INSERT INTO `cmc_manage_dept` VALUES (2, '104,106,113', null);
12538
+INSERT INTO `cmc_manage_dept` VALUES (7, '104,109', null);
12539
+INSERT INTO `cmc_manage_dept` VALUES (9, '108,109', null);
12540
+INSERT INTO `cmc_manage_dept` VALUES (10, '111,115', '0230,0231,0232,0233');
12541
+INSERT INTO `cmc_manage_dept` VALUES (11, '107,110,116', '0227,0235');
12542
+INSERT INTO `cmc_manage_dept` VALUES (13, '105,112,113,114', '0226,0230,0231,0232,0236');
12543
+INSERT INTO `cmc_manage_dept` VALUES (14, '106', null);
12544
+INSERT INTO `cmc_manage_dept` VALUES (15, '105,117,118', null);
12568 12545
 
12569 12546
 SET NAMES utf8mb4;
12570 12547
 SET FOREIGN_KEY_CHECKS = 0;

+ 108
- 66
oa-ui/src/views/oa/manage/index.vue Ver arquivo

@@ -9,86 +9,66 @@
9 9
 
10 10
     <el-row :gutter="10" class="mb8">
11 11
       <el-col :span="1.5">
12
-        <el-button
13
-          type="primary"
14
-          plain
15
-          icon="el-icon-plus"
16
-          size="mini"
17
-          @click="handleAdd"
18
-          v-hasPermi="['oa:manageDept:add']"
19
-        >新增</el-button>
12
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
13
+          v-hasPermi="['oa:manage:add']">新增</el-button>
20 14
       </el-col>
21 15
       <el-col :span="1.5">
22
-        <el-button
23
-          type="success"
24
-          plain
25
-          icon="el-icon-edit"
26
-          size="mini"
27
-          :disabled="single"
28
-          @click="handleUpdate"
29
-          v-hasPermi="['oa:manageDept:edit']"
30
-        >修改</el-button>
16
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
17
+          v-hasPermi="['oa:manage:edit']">修改</el-button>
31 18
       </el-col>
32 19
       <el-col :span="1.5">
33
-        <el-button
34
-          type="danger"
35
-          plain
36
-          icon="el-icon-delete"
37
-          size="mini"
38
-          :disabled="multiple"
39
-          @click="handleDelete"
40
-          v-hasPermi="['oa:manageDept:remove']"
41
-        >删除</el-button>
20
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
21
+          v-hasPermi="['oa:manage:remove']">删除</el-button>
42 22
       </el-col>
43 23
       <el-col :span="1.5">
44
-        <el-button
45
-          type="warning"
46
-          plain
47
-          icon="el-icon-download"
48
-          size="mini"
49
-          @click="handleExport"
50
-          v-hasPermi="['oa:manageDept:export']"
51
-        >导出</el-button>
24
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
25
+          v-hasPermi="['oa:manage:export']">导出</el-button>
52 26
       </el-col>
53 27
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
54 28
     </el-row>
55 29
 
56 30
     <el-table v-loading="loading" :data="manageDeptList" @selection-change="handleSelectionChange">
57
-      <el-table-column type="selection" width="55" align="center" />
58
-      <el-table-column label="分管领导id" align="center" prop="userId" />
59
-      <el-table-column label="分管部门id" align="center" prop="deptId" />
60
-      <el-table-column label="院内对接单位" align="center" prop="partyAId" />
31
+      <el-table-column type="index" width="50" />
32
+      <el-table-column label="分管领导" align="center" prop="user.nickName" />
33
+      <el-table-column label="分管部门" align="center" prop="deptName" />
34
+      <el-table-column label="院内对接单位" align="center" prop="partyAName" width="600px" />
61 35
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
62 36
         <template slot-scope="scope">
63
-          <el-button
64
-            size="mini"
65
-            type="text"
66
-            icon="el-icon-edit"
67
-            @click="handleUpdate(scope.row)"
68
-            v-hasPermi="['oa:manageDept:edit']"
69
-          >修改</el-button>
70
-          <el-button
71
-            size="mini"
72
-            type="text"
73
-            icon="el-icon-delete"
74
-            @click="handleDelete(scope.row)"
75
-            v-hasPermi="['oa:manageDept:remove']"
76
-          >删除</el-button>
37
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
38
+            v-hasPermi="['oa:manage:edit']">修改</el-button>
39
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
40
+            v-hasPermi="['oa:manage:remove']">删除</el-button>
77 41
         </template>
78 42
       </el-table-column>
79 43
     </el-table>
80
-    
81
-    <pagination
82
-      v-show="total>0"
83
-      :total="total"
84
-      :page.sync="queryParams.pageNum"
85
-      :limit.sync="queryParams.pageSize"
86
-      @pagination="getList"
87
-    />
44
+
45
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
46
+      @pagination="getList" />
88 47
 
89 48
     <!-- 添加或修改cmc领导分管对话框 -->
90 49
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
91 50
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
51
+        <el-form-item label="分管领导" prop="userId">
52
+          <el-select v-model="form.userId" filterable clearable style="width:220px" :disabled="isSelect">
53
+            <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"
54
+              v-if="item.userId > 0">
55
+            </el-option>
56
+          </el-select>
57
+        </el-form-item>
58
+        <el-form-item label="分管部门" prop="deptId">
59
+          <el-select v-model="form.deptId" filterable multiple clearable style="width:100%;">
60
+            <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId"
61
+              v-if="item.deptId > 103 && item.deptId < 200">
62
+            </el-option>
63
+          </el-select>
64
+        </el-form-item>
65
+        <el-form-item label="院内对接单位" prop="partyAId">
66
+          <el-select v-model="form.partyAId" filterable multiple clearable style="width:100%;">
67
+            <el-option v-for="item in partyAList" :key="item.partyAId" :label="item.partyAName" :value="item.partyAId"
68
+              v-if="item.partyAName.startsWith('中国电建集团成都')">
69
+            </el-option>
70
+          </el-select>
71
+        </el-form-item>
92 72
       </el-form>
93 73
       <div slot="footer" class="dialog-footer">
94 74
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -100,6 +80,7 @@
100 80
 
101 81
 <script>
102 82
 import { listManageDept, getManageDept, delManageDept, addManageDept, updateManageDept } from "@/api/oa/manage/manageDept";
83
+import { listPartyA } from "@/api/oa/partyA/partyA";
103 84
 
104 85
 export default {
105 86
   name: "ManageDept",
@@ -119,10 +100,15 @@ export default {
119 100
       total: 0,
120 101
       // cmc领导分管表格数据
121 102
       manageDeptList: [],
103
+      userList: [],
104
+      deptList: [],
105
+      partyAList: [],
122 106
       // 弹出层标题
123 107
       title: "",
124 108
       // 是否显示弹出层
125 109
       open: false,
110
+      isSelect: false,
111
+      isAdd: false,
126 112
       // 查询参数
127 113
       queryParams: {
128 114
         pageNum: 1,
@@ -132,11 +118,17 @@ export default {
132 118
       form: {},
133 119
       // 表单校验
134 120
       rules: {
121
+        deptId: [
122
+          { required: true, message: "分管部门不能为空", trigger: "change" }
123
+        ],
135 124
       }
136 125
     };
137 126
   },
138 127
   created() {
139 128
     this.getList();
129
+    this.getUserList();
130
+    this.getDeptList();
131
+    this.getPartyAList();
140 132
   },
141 133
   methods: {
142 134
     /** 查询cmc领导分管列表 */
@@ -148,9 +140,25 @@ export default {
148 140
         this.loading = false;
149 141
       });
150 142
     },
143
+    // 查询用户列表
144
+    getUserList() {
145
+      this.userList = this.$store.state.user.userList;
146
+    },
147
+    // 查询部门列表
148
+    getDeptList() {
149
+      this.deptList = this.$store.state.user.deptList;
150
+    },
151
+    // 查询甲方单位列表
152
+    getPartyAList() {
153
+      listPartyA({ pageSize: 9999, pageNum: 1 }).then(res => {
154
+        this.partyAList = res.rows
155
+      })
156
+    },
151 157
     // 取消按钮
152 158
     cancel() {
153 159
       this.open = false;
160
+      this.isSelect = false;
161
+      this.isAdd = false;
154 162
       this.reset();
155 163
     },
156 164
     // 表单重置
@@ -175,14 +183,16 @@ export default {
175 183
     // 多选框选中数据
176 184
     handleSelectionChange(selection) {
177 185
       this.ids = selection.map(item => item.userId)
178
-      this.single = selection.length!==1
186
+      this.single = selection.length !== 1
179 187
       this.multiple = !selection.length
180 188
     },
181 189
     /** 新增按钮操作 */
182 190
     handleAdd() {
183 191
       this.reset();
192
+      this.isAdd = true;
193
+      this.isSelect = false;
184 194
       this.open = true;
185
-      this.title = "添加cmc领导分管";
195
+      this.title = "添加领导分管";
186 196
     },
187 197
     /** 修改按钮操作 */
188 198
     handleUpdate(row) {
@@ -190,39 +200,71 @@ export default {
190 200
       const userId = row.userId || this.ids
191 201
       getManageDept(userId).then(response => {
192 202
         this.form = response.data;
203
+        if (this.form.deptId) {
204
+          let deptId = [];
205
+          for (let dept of this.form.deptId.split(',')) {
206
+            deptId.push(Number(dept));
207
+          }
208
+          this.form.deptId = deptId;
209
+        }
210
+        if (this.form.partyAId) {
211
+          let partyAId = [];
212
+          for (let partyA of this.form.partyAId.split(',')) {
213
+            partyAId.push(partyA);
214
+          }
215
+          this.form.partyAId = partyAId;
216
+        }
217
+        this.isSelect = true;
218
+        this.isAdd = false;
193 219
         this.open = true;
194
-        this.title = "修改cmc领导分管";
220
+        this.title = "修改领导分管";
195 221
       });
196 222
     },
197 223
     /** 提交按钮 */
198 224
     submitForm() {
225
+      console.log(this.form);
199 226
       this.$refs["form"].validate(valid => {
200 227
         if (valid) {
201
-          if (this.form.userId != null) {
228
+          if (!this.isAdd) {
229
+            this.form.deptId = this.formatArrayToString(this.form.deptId, ',') == '' ? undefined : this.formatArrayToString(this.form.deptId, ',');
230
+            this.form.partyAId = this.formatArrayToString(this.form.partyAId, ',') == '' ? undefined : this.formatArrayToString(this.form.partyAId, ',');
202 231
             updateManageDept(this.form).then(response => {
203 232
               this.$modal.msgSuccess("修改成功");
204 233
               this.open = false;
234
+              this.isAdd = false;
235
+              this.isSelect = false;
205 236
               this.getList();
206 237
             });
207 238
           } else {
239
+            this.form.deptId = this.formatArrayToString(this.form.deptId, ',') == '' ? undefined : this.formatArrayToString(this.form.deptId, ',');
240
+            this.form.partyAId = this.formatArrayToString(this.form.partyAId, ',') == '' ? undefined : this.formatArrayToString(this.form.partyAId, ',');
208 241
             addManageDept(this.form).then(response => {
209 242
               this.$modal.msgSuccess("新增成功");
210 243
               this.open = false;
244
+              this.isAdd = false;
245
+              this.isSelect = false;
211 246
               this.getList();
212 247
             });
213 248
           }
214 249
         }
215 250
       });
216 251
     },
252
+    formatArrayToString(str, splitStr) {
253
+      let newStr = "";
254
+      if (str) {
255
+        newStr = str.join(splitStr)
256
+      }
257
+      return newStr
258
+    },
217 259
     /** 删除按钮操作 */
218 260
     handleDelete(row) {
219 261
       const userIds = row.userId || this.ids;
220
-      this.$modal.confirm('是否确认删除cmc领导分管编号为"' + userIds + '"的数据项?').then(function() {
262
+      this.$modal.confirm('是否确认删除cmc分管领导为"' + this.getUserName(userIds) + '"的数据项?').then(function () {
221 263
         return delManageDept(userIds);
222 264
       }).then(() => {
223 265
         this.getList();
224 266
         this.$modal.msgSuccess("删除成功");
225
-      }).catch(() => {});
267
+      }).catch(() => { });
226 268
     },
227 269
     /** 导出按钮操作 */
228 270
     handleExport() {

+ 2
- 2
oa-ui/src/views/oa/staff/index.vue Ver arquivo

@@ -652,8 +652,8 @@ export default {
652 652
               this.getList();
653 653
             });
654 654
           } else {
655
-            this.form.certificates = this.form.certificates.length == 0 ? '' : this.form.certificates;
656
-            this.form.politicalAffiliation = this.form.politicalAffiliation.length == 0 ? '' : this.form.politicalAffiliation;
655
+            this.form.certificates = this.formatArrayToString(this.form.certificates, ',') == '' ? undefined : this.formatArrayToString(this.form.certificates, ',');
656
+            this.form.politicalAffiliation = this.formatArrayToString(this.form.politicalAffiliation, ',') ? undefined : this.formatArrayToString(this.form.politicalAffiliation, ',');
657 657
             addUser(this.form).then(response => {
658 658
               this.$modal.msgSuccess("新增成功");
659 659
               this.open = false;

Carregando…
Cancelar
Salvar