Explorar o código

Merge branch 'dev_law' into dev

# Conflicts:
#	src/main/java/com/sooka/sponest/lawenforcement/record/mapper/LawenforcementRecordMapper.java
#	src/main/resources/mapper/lawenforcement/LawenforcementRecordMapper.xml
lyq hai 6 meses
pai
achega
c29b7010e5

+ 16 - 0
lawenforcement-ui/src/api/lawenforcement/record.js

@@ -138,3 +138,19 @@ export function setRecordStatus(data){
     data: data
   })
 }
+
+export function addMemorandum(data){
+  return request({
+    url: '/sooka-sponest-lawenforcement/record/addMemorandum',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getMemorandum(query){
+  return request({
+    url: '/sooka-sponest-lawenforcement/record/getMemorandum',
+    method: 'get',
+    params: query
+  })
+}

+ 5 - 0
lawenforcement-ui/src/store/modules/user.js

@@ -5,6 +5,7 @@ const user = {
   state: {
     token: getToken(),
     name: '',
+    nickName: '',
     dept: {},
     avatar: '',
     roles: [],
@@ -21,6 +22,9 @@ const user = {
     SET_NAME: (state, name) => {
       state.name = name
     },
+    SET_NICKNAME: (state, name) => {
+      state.nickName = name
+    },
     SET_DEPT: (state, dept) => {
       state.dept = dept
     },
@@ -73,6 +77,7 @@ const user = {
             commit('SET_ROLES', ['ROLE_DEFAULT'])
           }
           commit('SET_NAME', user.userName)
+          commit('SET_NICKNAME', user.nickName)
           commit('SET_DEPT', user.depts[0])
           commit('SET_AVATAR', avatar)
           resolve(res)

+ 120 - 21
lawenforcement-ui/src/views/lawenforcement/record/DetailsVue.vue

@@ -85,19 +85,6 @@
         </el-descriptions-item>
       </el-descriptions>
       <el-divider></el-divider>
-      <template>
-        <div>
-          <el-descriptions :title="title" :column="1" border>
-            <el-descriptions-item label="附件" prop="attachPath">
-              <fileUpload v-model="attachPath" disabled class="fjList"></fileUpload>
-            </el-descriptions-item>
-            <el-descriptions-item label="说明">
-              <el-input v-model="describe" disabled/>
-            </el-descriptions-item>
-          </el-descriptions>
-        </div>
-      </template>
-      <el-divider></el-divider>
       <el-tabs v-model="activeTab" type="card">
         <el-tab-pane label="执法人员" name="persons">
           <el-table :data="workOrderDetails.persons" style="width: 100%">
@@ -193,13 +180,46 @@
           </el-table>
         </el-tab-pane>
       </el-tabs>
-
+      <el-divider></el-divider>
+      <template v-if="title!=='-1'">
+        <div>
+          <el-descriptions :title="title" :column="1" border>
+            <el-descriptions-item label="附件" prop="attachPath">
+              <fileUpload v-model="attachPath" disabled class="fjList"></fileUpload>
+            </el-descriptions-item>
+            <el-descriptions-item label="说明">
+              <el-input v-model="describe" disabled/>
+            </el-descriptions-item>
+          </el-descriptions>
+        </div>
+      </template>
       <!--大华预览回放窗口-->
       <el-dialog :title="dssPreviewTitle" :visible.sync="dssPreviewVisible" v-if="dssPreviewVisible"
                  customClass="videoCustomWidth"
                  @close="destroy" append-to-body
       >
-        <div id="dssPreview" style="width:1020px;height:625px;"></div>
+        <div id="dssPreview" style="width:1500px;height:625px;"></div>
+        <!--备忘录-->
+        <div class="chat-container" v-if="showChatContainer">
+          <!-- 聊天记录区域 -->
+          <div class="chat-history">
+            <div v-for="(message, index) in messageList" :key="index" class="message-item" :class="{'self-message': message.isSelf}">
+              <span class="message-time">{{message.createName}}{{message.createTime}}</span>
+              <br>
+              <span class="message-content">{{message.content}}</span>
+            </div>
+          </div>
+          <!-- 输入框和发送按钮区域 -->
+          <div class="input-area">
+            <el-input
+              v-model="inputMessage"
+              placeholder="请输入消息"
+              clearable
+              maxlength="50"
+            ></el-input>
+            <el-button type="primary" @click="sendMessage">发送</el-button>
+          </div>
+        </div>
       </el-dialog>
       <!--海康预览回放窗口-->
       <!--预览-->
@@ -232,7 +252,7 @@
 </template>
 
 <script>
-import {getCamera, getDetails, getFillForm,selectchannelCodeByCameraId,getDahuaVideoServer} from "@/api/lawenforcement/record";
+import {getCamera, getDetails, getFillForm,selectchannelCodeByCameraId,getDahuaVideoServer,addMemorandum,getMemorandum} from "@/api/lawenforcement/record";
 import fileUpload from '@/views/components/FileUpload/index.vue';
 import {selectConfigKey} from '@/api/system/config'
 /** ----------------------------------摄像头预览开始------------------------------------- */
@@ -261,7 +281,14 @@ export default {
   },
   data() {
     return {
-      title:"填报",
+      showChatContainer: false, // 初始不显示聊天容器
+      recordLogId:null,
+      messageList: [], // 存储聊天消息的数组
+      inputMessage: '', // 输入框中的消息内容
+      createName:'',//创建人
+      createTime: new Date().toISOString().split('.')[0].replace('T', ' '), // 当前时间
+
+      title:'',
       cameraTitlePlayBack: '',
       workOrderDetails: {},
       cameraVisiblePlayBack: false,
@@ -299,6 +326,19 @@ export default {
     }
   },
   methods: {
+    sendMessage() {
+      if (this.inputMessage.trim() !== '') {
+        const form = {recordLogId:this.recordLogId,content: this.inputMessage,createTime: this.createTime}
+        addMemorandum(form);
+        const newMessage = {
+          content: this.inputMessage,
+          createTime: this.createTime,
+          createName: this.$store.state.user.nickName,
+        };
+        this.messageList.push(newMessage);
+        this.inputMessage = '';
+      }
+    },
     getData(recordId) {
       getDetails(recordId).then(res => {
         this.workOrderDetails = res.data;
@@ -312,6 +352,8 @@ export default {
             this.attachPath = res.data.attachPath;
           }
           this.describe = res.data.describe;
+        }else {
+          this.title = '-1'
         }
       });
     },
@@ -335,9 +377,12 @@ export default {
 
     /** ----------------------------------摄像头回放开始------------------------------------- */
     playBack(row) {
+      this.recordLogId = row.id
+      getMemorandum({recordLogId:row.id}).then(response => {
+        this.messageList = response.data
+      })
       getCamera(row.deviceId).then(response => {
         this.camera = response.data
-        console.log(this.camera)
       })
       selectConfigKey('DssVersion').then(res => {
         if (this.ws.getLocalDssVersion() != res.data) {
@@ -381,7 +426,9 @@ export default {
             this.$refs.haikangTVWalls.showTVWall(cameraIndexCode, 1)
           }
         })
-
+        setTimeout(() => {
+          this.showChatContainer = true;
+        }, 4000);
       })
     },
     /** ----------------------------------摄像头回放结束------------------------------------- */
@@ -616,13 +663,65 @@ export default {
 <style rel="stylesheet/scss" lang="scss">
   //视频摄像头预览弹层样式
   .videoCustomWidth {
-    width: 1070px !important;
+    width: 1400px !important;
     /*height: 760px !important;*/
   }
 
   //视频摄像头预览弹层样式
   .videoCustomWidthPlayBack {
-    width: 1080px !important;
+    width: 1400px !important;
     height: 780px !important;
   }
+
+   .chat-container {
+     position: absolute;
+     right: 0px;
+     bottom: 0px;
+     width: 333px;
+     border: 1px solid #ccc;
+     border-radius: 5px;
+     overflow: hidden;
+   }
+
+  .chat-history {
+    height: 638px;
+    overflow-y: auto;
+    padding: 10px;
+  }
+
+  .message-item {
+    margin-bottom: 10px;
+    padding: 8px;
+    border-radius: 10px;
+    max-width: 70%;
+  }
+
+  .self-message {
+    background-color: #0084ff;
+    color: white;
+    float: right;
+  }
+
+  .message-content {
+    display: inline-block;
+    vertical-align: middle;
+  }
+
+  .message-time {
+    font-size: 15px;
+    margin-left: -10px;
+    color: #999;
+  }
+
+  .input-area {
+    display: flex;
+    align-items: center;
+    padding: 10px;
+    border-top: 1px solid #ccc;
+  }
+
+  .el-input {
+    flex: 1;
+    margin-right: 10px;
+  }
 </style>

+ 23 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/controller/LawenforcementRecordController.java

@@ -13,6 +13,7 @@ import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.sooka.sponest.lawenforcement.feign.domain.VisuForestCloudCameraBO;
 import com.sooka.sponest.lawenforcement.feign.service.RemoteEnforcementDeviceService;
+import com.sooka.sponest.lawenforcement.record.domain.LawenforcementMemorandum;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecord;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementBindDeviceBO;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementFillFormBO;
@@ -189,4 +190,26 @@ public class LawenforcementRecordController extends BaseController {
     public AjaxResult setRecordState(@RequestBody LawenforcementBindDeviceBO bindDeviceBO){
         return toAjax(lawenforcementRecordService.setRecordState(bindDeviceBO));
     }
+
+    /*
+    * 新增备忘录
+    *
+    * @author 韩福成
+    * @date 2024/11/9 上午10:17
+    */
+    @PostMapping("/addMemorandum")
+    public AjaxResult addMemorandum(@RequestBody LawenforcementMemorandum memorandum){
+        return toAjax(lawenforcementRecordService.addMemorandum(memorandum));
+    }
+
+    /*
+    * 按执法记录id查询备忘录
+    *
+    * @author 韩福成
+    * @date 2024/11/9 上午11:21
+    */
+    @GetMapping("/getMemorandum")
+    public AjaxResult getMemorandum(LawenforcementMemorandum memorandum){
+        return AjaxResult.success(lawenforcementRecordService.getMemorandum(memorandum));
+    }
 }

+ 32 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/domain/LawenforcementMemorandum.java

@@ -0,0 +1,32 @@
+package com.sooka.sponest.lawenforcement.record.domain;
+
+import com.ruoyi.common.datascope.base.domain.BaseBusinessEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+* 备忘录
+*
+* @author 韩福成
+* @date 2024/11/9 上午10:21
+*/
+@Setter
+@Getter
+public class LawenforcementMemorandum extends BaseBusinessEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务ID
+     */
+    private String id;
+
+    /**
+     * 记录id
+     */
+    private String recordLogId;
+
+    /**
+     * 内容
+     */
+    private String content;
+}

+ 5 - 2
src/main/java/com/sooka/sponest/lawenforcement/record/mapper/LawenforcementRecordMapper.java

@@ -1,6 +1,6 @@
 package com.sooka.sponest.lawenforcement.record.mapper;
 
-import com.sooka.sponest.lawenforcement.device.domain.DeviceBO;
+import com.sooka.sponest.lawenforcement.record.domain.LawenforcementMemorandum;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecord;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecordLog;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementBindDeviceBO;
@@ -11,7 +11,6 @@ import com.sooka.sponest.lawenforcement.record.domain.vo.LawenforcementStandardD
 import com.sooka.sponest.lawenforcement.record.domain.vo.LawenforcementSubitemDetailVO;
 import org.apache.ibatis.annotations.Param;
 
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -160,5 +159,9 @@ public interface LawenforcementRecordMapper {
 
     void stopRecord(LawenforcementBindDeviceBO bindDeviceBO);
 
+    int addMemorandum(LawenforcementMemorandum memorandum);
+
+    List<LawenforcementMemorandum> getMemorandum(LawenforcementMemorandum memorandum);
+
     void removeRecordInfoByIds(List<String> ids);
 }

+ 5 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/service/ILawenforcementRecordService.java

@@ -1,6 +1,7 @@
 package com.sooka.sponest.lawenforcement.record.service;
 
 import com.alibaba.fastjson.JSONArray;
+import com.sooka.sponest.lawenforcement.record.domain.LawenforcementMemorandum;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecord;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementBindDeviceBO;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementFillFormBO;
@@ -122,4 +123,8 @@ public interface ILawenforcementRecordService {
     List<Map<String, Object>> getJsonDataMessageByPage(int pageNum, int pageSize);
 
     int setRecordState(LawenforcementBindDeviceBO bindDeviceBO);
+
+    int addMemorandum(LawenforcementMemorandum memorandum);
+
+    List<LawenforcementMemorandum> getMemorandum(LawenforcementMemorandum memorandum);
 }

+ 14 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/service/impl/LawenforcementRecordServiceImpl.java

@@ -11,6 +11,7 @@ import com.sooka.sponest.lawenforcement.device.service.IDeviceService;
 import com.sooka.sponest.lawenforcement.feign.service.RemoteEnforcementConfigService;
 import com.sooka.sponest.lawenforcement.person.domain.LawenforcementPerson;
 import com.sooka.sponest.lawenforcement.person.mapper.LawenforcementPersonMapper;
+import com.sooka.sponest.lawenforcement.record.domain.LawenforcementMemorandum;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecord;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecordLog;
 import com.sooka.sponest.lawenforcement.record.domain.bo.LawenforcementBindDeviceBO;
@@ -494,4 +495,17 @@ public class LawenforcementRecordServiceImpl extends BaseServiceImpl implements
         //设置工单状态为存在隐患整改
         return recordMapper.setRecordState(bindDeviceBO);
     }
+
+    @Override
+    public int addMemorandum(LawenforcementMemorandum memorandum) {
+        memorandum.setId(IdUtils.fastSimpleUUID());
+        memorandum.setCreateBy(SecurityUtils.getUserId().toString());
+        memorandum.setCreateName(SecurityUtils.getLoginUser().getSysUser().getNickName());
+        return recordMapper.addMemorandum(memorandum);
+    }
+
+    @Override
+    public List<LawenforcementMemorandum> getMemorandum(LawenforcementMemorandum memorandum) {
+        return recordMapper.getMemorandum(memorandum);
+    }
 }

+ 31 - 0
src/main/resources/mapper/lawenforcement/LawenforcementRecordMapper.xml

@@ -800,6 +800,37 @@
         where id = #{recordId}
     </update>
 
+    <insert id="addMemorandum" parameterType="LawenforcementMemorandum">
+        insert into lawenforcement_memorandum
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="recordLogId != null">recordlog_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createName != null">create_name,</if>
+            <if test="content != null">content,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="recordLogId != null">#{recordLogId},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createName != null">#{createName},</if>
+            <if test="content != null">#{content},</if>
+        </trim>
+    </insert>
+
+    <select id="getMemorandum" parameterType="LawenforcementMemorandum" resultType="LawenforcementMemorandum">
+        SELECT
+            id,
+            recordlog_id recordLogId,
+            create_time createTime,
+            create_name createName,
+            content
+        FROM lawenforcement_memorandum
+        WHERE recordlog_id = #{recordLogId} order by create_time
+    </select>
+
     <delete id="removeRecordInfoByIds" parameterType="list">
         delete from lawenforcement_record where id in
         <foreach collection="list" item="item" open="(" separator="," close=")">