Lin Qilong 3 дней назад
Родитель
Сommit
375c012689

+ 2 - 2
gw-admin/src/main/java/com/goldenwater/GoldenwaterApplication.java

@@ -9,11 +9,11 @@ import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration;
  *
  * @author goldenwater
  */
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 public class GoldenwaterApplication {
     public static void main(String[] args) {
         // System.setProperty("spring.devtools.restart.enabled", "false");
         SpringApplication.run(GoldenwaterApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  北京金水启动成功   ლ(´ڡ`ლ)゙");
+        System.out.println(" 北京金水启动成功 ");
     }
 }

+ 2 - 1
gw-slaj/src/main/java/com/goldenwater/slaj/eme/controller/BusiConplanBasicController.java

@@ -37,7 +37,8 @@ public class BusiConplanBasicController extends BaseController {
 
     @PostMapping
     public AjaxResult add(@RequestBody BusiConplanBasic busiConplanBasic) {
-        return toAjax(busiConplanBasicService.insertBusiConplanBasic(busiConplanBasic));
+        BusiConplanBasic saved = busiConplanBasicService.insertBusiConplanBasic(busiConplanBasic);
+        return AjaxResult.success(saved);
     }
 
     @PutMapping

+ 22 - 11
gw-slaj/src/main/java/com/goldenwater/slaj/eme/controller/MediaController.java

@@ -1,10 +1,5 @@
 package com.goldenwater.slaj.eme.controller;
 
-import java.text.SimpleDateFormat;
-import java.util.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 import com.goldenwater.common.config.RuoYiConfig;
 import com.goldenwater.common.core.controller.BaseController;
 import com.goldenwater.common.core.domain.AjaxResult;
@@ -12,17 +7,27 @@ import com.goldenwater.common.core.page.TableDataInfo;
 import com.goldenwater.common.utils.file.FileUploadUtils;
 import com.goldenwater.slaj.hidd.domain.AttMedBase;
 import com.goldenwater.slaj.hidd.domain.RelBisMed;
-import com.goldenwater.slaj.hidd.service.IAttMedBaseService;
 import com.goldenwater.slaj.hidd.mapper.RelBisMedMapper;
+import com.goldenwater.slaj.hidd.service.IAttMedBaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.UUID;
 
 @RestController
 @RequestMapping("/eme/media")
 public class MediaController extends BaseController {
 
-    @Autowired private IAttMedBaseService attMedBaseService;
-    @Autowired private RelBisMedMapper relBisMedMapper;
+    @Autowired
+    private IAttMedBaseService attMedBaseService;
+    @Autowired
+    private RelBisMedMapper relBisMedMapper;
 
-    /** 上传文件 + 保存多媒体 + 关联业务 */
+    /**
+     * 上传文件 + 保存多媒体 + 关联业务
+     */
     @PostMapping("/upload")
     public AjaxResult upload(
             @RequestParam("file") MultipartFile file,
@@ -50,6 +55,7 @@ public class MediaController extends BaseController {
         attMedBaseService.insertAttMedBase(med);
 
         // 3. 关联
+//        if (StringUtils.isBlank(bisGuid)) {
         RelBisMed rel = new RelBisMed();
         rel.setGuid(UUID.randomUUID().toString().replace("-", ""));
         rel.setBisTablename(bisTablename);
@@ -57,6 +63,7 @@ public class MediaController extends BaseController {
         rel.setMedGuid(med.getGuid());
         rel.setFromDate(new Date());
         relBisMedMapper.insertRelBisMed(rel);
+//        }
 
         AjaxResult r = AjaxResult.success();
         r.put("medGuid", med.getGuid());
@@ -65,13 +72,17 @@ public class MediaController extends BaseController {
         return r;
     }
 
-    /** 查询业务关联多媒体 */
+    /**
+     * 查询业务关联多媒体
+     */
     @GetMapping("/list")
     public TableDataInfo list(@RequestParam String bisTablename, @RequestParam String bisGuid) {
         return getDataTable(attMedBaseService.selectAttMedBaseByBisInfo(bisTablename, bisGuid));
     }
 
-    /** 删除关联 + 媒体 */
+    /**
+     * 删除关联 + 媒体
+     */
     @DeleteMapping("/{medGuid}")
     public AjaxResult remove(@PathVariable String medGuid, @RequestParam String bisTablename, @RequestParam String bisGuid) {
         relBisMedMapper.deleteRelBisMedByBisInfo(bisTablename, bisGuid);

+ 53 - 17
gw-slaj/src/main/java/com/goldenwater/slaj/eme/domain/BusiConplanBasic.java

@@ -1,7 +1,8 @@
 package com.goldenwater.slaj.eme.domain;
 
-import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.goldenwater.common.annotation.Excel;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -10,42 +11,77 @@ import java.util.Date;
  */
 @Data
 public class BusiConplanBasic {
-    /** 主键 */
+    /**
+     * 主键
+     */
     private String guid;
-    /** 预案名称 */
+    /**
+     * 预案名称
+     */
     @Excel(name = "预案名称")
     private String planName;
-    /** 所属机构 */
+    /**
+     * 所属机构
+     */
     private String orgGuid;
-    /** 录入时间 */
+    /**
+     * 录入时间
+     */
     @Excel(name = "录入时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date entryTime;
-    /** 评估周期 */
+    /**
+     * 评估周期
+     */
     private String evaCycle;
-    /** 是否修订 */
+    /**
+     * 是否修订
+     */
     private String revised;
-    /** 预案类型 */
+    /**
+     * 预案类型
+     */
     @Excel(name = "预案类型")
     private String planType;
-    /** 创建人 */
+    /**
+     * 创建人
+     */
     private String creperGuid;
-    /** 创建时间 */
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
-    /** 更新人 */
+    /**
+     * 更新人
+     */
     private String updperGuid;
-    /** 更新时间 */
+    /**
+     * 更新时间
+     */
     private Date updateTime;
-    /** 预案状态 */
+    /**
+     * 预案状态
+     */
     @Excel(name = "预案状态")
     private String planStatus;
-    /** 父预案ID */
+    /**
+     * 父预案ID
+     */
     private String parentId;
-    /** 修订信息 */
+    /**
+     * 修订信息
+     */
     @Excel(name = "修订信息")
     private String revisionInfo;
-    /** 父预案名称 */
+    /**
+     * 父预案名称
+     */
     @Excel(name = "父预案名称")
     private String parentName;
-    /** 修订时间 */
+    /**
+     * 修订时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date reviseTime;
 }

+ 2 - 2
gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/IBusiConplanBasicService.java

@@ -25,9 +25,9 @@ public interface IBusiConplanBasicService {
     /**
      * 新增应急预案基本信息
      * @param busiConplanBasic 应急预案基本信息
-     * @return 影响行数
+     * @return 包含生成的guid的应急预案基本信息
      */
-    int insertBusiConplanBasic(BusiConplanBasic busiConplanBasic);
+    BusiConplanBasic insertBusiConplanBasic(BusiConplanBasic busiConplanBasic);
 
     /**
      * 修改应急预案基本信息

+ 22 - 3
gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiConplanBasicServiceImpl.java

@@ -5,6 +5,9 @@ import java.util.List;
 
 import com.goldenwater.common.utils.SecurityUtils;
 import com.goldenwater.common.utils.uuid.IdUtils;
+import com.goldenwater.slaj.hidd.mapper.RelBisMedMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.goldenwater.slaj.eme.mapper.BusiConplanBasicMapper;
@@ -17,9 +20,14 @@ import com.goldenwater.slaj.eme.service.IBusiConplanBasicService;
 @Service
 public class BusiConplanBasicServiceImpl implements IBusiConplanBasicService {
 
+    private static final Logger log = LoggerFactory.getLogger(BusiConplanBasicServiceImpl.class);
+
     @Autowired
     private BusiConplanBasicMapper busiConplanBasicMapper;
 
+    @Autowired
+    private RelBisMedMapper relBisMedMapper;
+
     @Override
     public BusiConplanBasic selectBusiConplanBasicByGuid(String guid) {
         return busiConplanBasicMapper.selectBusiConplanBasicByGuid(guid);
@@ -31,11 +39,22 @@ public class BusiConplanBasicServiceImpl implements IBusiConplanBasicService {
     }
 
     @Override
-    public int insertBusiConplanBasic(BusiConplanBasic busiConplanBasic) {
-        busiConplanBasic.setGuid(IdUtils.fastSimpleUUID());
+    public BusiConplanBasic insertBusiConplanBasic(BusiConplanBasic busiConplanBasic) {
+        // 保存前端传入的临时GUID,用于后续更新REL_BIS_MED关联
+        String tempGuid = busiConplanBasic.getGuid();
+        String newGuid = IdUtils.fastSimpleUUID();
+        busiConplanBasic.setGuid(newGuid);
         busiConplanBasic.setCreateTime(new Date());
         busiConplanBasic.setCreperGuid(SecurityUtils.getUserId());
-        return busiConplanBasicMapper.insertBusiConplanBasic(busiConplanBasic);
+        busiConplanBasicMapper.insertBusiConplanBasic(busiConplanBasic);
+
+        // 更新REL_BIS_MED:将临时BIS_GUID替换为正式预案GUID
+        if (tempGuid != null && !tempGuid.isEmpty() && tempGuid.startsWith("TEMP_")) {
+            int updated = relBisMedMapper.updateBisGuid(tempGuid, newGuid, "t_busi_conplan_basic");
+            log.info("REL_BIS_MED BIS_GUID替换: TEMP={} → 正式={}, 更新行数={}", tempGuid, newGuid, updated);
+        }
+
+        return busiConplanBasic;
     }
 
     @Override

+ 10 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/RelBisMedMapper.java

@@ -2,6 +2,7 @@ package com.goldenwater.slaj.hidd.mapper;
 
 import java.util.List;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import com.goldenwater.slaj.hidd.domain.RelBisMed;
 
 /**
@@ -67,4 +68,13 @@ public interface RelBisMedMapper {
      * @return 影响行数
      */
     int deleteRelBisMedByBisInfo(String bisTablename, String bisGuid);
+
+    /**
+     * 将临时BIS_GUID替换为正式GUID
+     * @param oldBisGuid 临时BIS_GUID
+     * @param newBisGuid 正式BIS_GUID
+     * @param bisTablename 业务表名
+     * @return 影响行数
+     */
+    int updateBisGuid(@Param("oldBisGuid") String oldBisGuid, @Param("newBisGuid") String newBisGuid, @Param("bisTablename") String bisTablename);
 }

+ 5 - 0
gw-slaj/src/main/resources/mapper/slaj/hidd/RelBisMedMapper.xml

@@ -58,4 +58,9 @@
     <delete id="deleteRelBisMedByBisInfo">
         delete from rel_bis_med where bis_tablename = #{bisTablename} and bis_guid = #{bisGuid}
     </delete>
+
+    <update id="updateBisGuid">
+        update rel_bis_med set bis_guid = #{newBisGuid}
+        where bis_guid = #{oldBisGuid} and bis_tablename = #{bisTablename}
+    </update>
 </mapper>

+ 11 - 24
gw-ui/src/components/FileUpload/index.vue

@@ -1,33 +1,20 @@
 <template>
   <div class="file-upload-container">
-    <el-upload
-        ref="uploadRef"
-        :action="uploadUrl"
-        :headers="headers"
-        :data="uploadData"
-        :file-list="fileList"
-        :before-upload="beforeUpload"
-        :on-success="handleSuccess"
-        :on-error="handleError"
-        :on-remove="handleRemove"
-        :on-preview="handlePreview"
-        :limit="limit"
-        :accept="accept"
-        :multiple="multiple"
-        :disabled="disabled"
-    >
+    <el-upload ref="uploadRef" :action="uploadUrl" :headers="headers" :data="uploadData" :file-list="fileList"
+      :before-upload="beforeUpload" :on-success="handleSuccess" :on-error="handleError" :on-remove="handleRemove"
+      :on-preview="handlePreview" :limit="limit" :accept="accept" :multiple="multiple" :disabled="disabled">
       <el-button type="primary" plain icon="Upload" :disabled="disabled">上传附件</el-button>
-      <template #tip>
+      <!-- <template #tip>
         <div class="el-upload__tip" slot="describe">
           支持{{ acceptText }}上传,单个文件不超过{{ maxSize }}MB,最多上传{{ limit }}个文件
         </div>
-      </template>
+      </template> -->
     </el-upload>
 
     <!-- 文件预览对话框 -->
     <el-dialog v-model="previewVisible" :title="previewTitle" width="800px" append-to-body>
       <div class="preview-container">
-        <img v-if="isImage" :src="previewUrl" class="preview-image"/>
+        <img v-if="isImage" :src="previewUrl" class="preview-image" />
         <iframe v-else :src="previewUrl" class="preview-iframe"></iframe>
       </div>
     </el-dialog>
@@ -35,8 +22,8 @@
 </template>
 
 <script setup name="FileUpload">
-import {computed, ref, watch} from 'vue'
-import {getToken} from '@/utils/auth'
+import { computed, ref, watch } from 'vue'
+import { getToken } from '@/utils/auth'
 
 const props = defineProps({
   modelValue: {
@@ -95,7 +82,7 @@ const props = defineProps({
 
 const emit = defineEmits(['update:modelValue', 'change', 'upload-success', 'remove-success'])
 
-const {proxy} = getCurrentInstance()
+const { proxy } = getCurrentInstance()
 
 const uploadRef = ref(null)
 const fileList = ref([])
@@ -114,7 +101,7 @@ const uploadUrl = computed(() => {
 /** 动态计算上传附加数据:bizMedia 模式自动携带 bisTablename 和 bisGuid */
 const uploadData = computed(() => {
   if (props.bizMedia) {
-    return {bisTablename: props.bisTablename, bisGuid: props.bisGuid}
+    return { bisTablename: props.bisTablename, bisGuid: props.bisGuid }
   }
   return props.data
 })
@@ -135,7 +122,7 @@ const isImage = computed(() => {
 
 watch(() => props.modelValue, (val) => {
   fileList.value = val || []
-}, {immediate: true})
+}, { immediate: true })
 
 /** 上传前校验 */
 function beforeUpload(file) {

+ 13 - 30
gw-ui/src/components/OrgSelect/index.vue

@@ -1,34 +1,17 @@
 <template>
-  <el-form-item
-    :label="label"
-    :prop="prop"
-    :rules="required ? [{ required: true, message: label + '不能为空', trigger: 'change' }] : undefined"
-  >
-    <div style="display:flex;gap:8px">
-      <el-select v-model="currentScope" placeholder="范围" style="width:110px;flex-shrink:0" size="default" v-if="showScope">
-        <el-option label="全部" value="all"/>
-        <el-option label="水利机构" value="water"/>
-        <el-option label="非水利机构" value="uwat"/>
+  <el-form-item :label="label" :prop="prop"
+    :rules="required ? [{ required: true, message: label + '不能为空', trigger: 'change' }] : undefined">
+    <div style="width: 100%;display:flex;gap:8px">
+      <el-select v-model="currentScope" placeholder="范围" style="width:110px;flex-shrink:0" size="default"
+        v-if="showScope">
+        <el-option label="全部" value="all" />
+        <el-option label="水利机构" value="water" />
+        <el-option label="非水利机构" value="uwat" />
       </el-select>
-      <el-select
-        :model-value="modelValue"
-        filterable
-        remote
-        clearable
-        reserve-keyword
-        :remote-method="remoteSearch"
-        :loading="loading"
-        :disabled="disabled"
-        :placeholder="placeholder"
-        style="width: 100%"
-        @update:model-value="handleChange"
-      >
-        <el-option
-          v-for="item in options"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value"
-        />
+      <el-select :model-value="modelValue" filterable remote clearable reserve-keyword :remote-method="remoteSearch"
+        :loading="loading" :disabled="disabled" :placeholder="placeholder" style="width: 100%"
+        @update:model-value="handleChange">
+        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
       </el-select>
     </div>
   </el-form-item>
@@ -97,7 +80,7 @@ watch(() => props.modelValue, (val) => {
       if (d && d.guid && (!props.excludeGuid || d.guid !== props.excludeGuid)) {
         options.value = [{ value: d.guid, label: d.orgName }, ...options.value]
       }
-    }).catch(() => {})
+    }).catch(() => { })
   }
 }, { immediate: true })
 </script>

+ 111 - 0
gw-ui/src/components/SubOrgSelect/index.vue

@@ -0,0 +1,111 @@
+<template>
+  <el-form-item
+    :label="label"
+    :prop="prop"
+    :rules="required ? [{ required: true, message: label + '不能为空', trigger: 'change' }] : undefined"
+  >
+    <el-tree-select
+      v-model="currentValue"
+      :data="treeData"
+      :props="treeProps"
+      :filter-node-method="filterNode"
+      :multiple="multiple"
+      :show-checkbox="multiple"
+      check-strictly
+      :render-after-expand="false"
+      lazy
+      :load="loadNode"
+      filterable
+      clearable
+      :placeholder="placeholder"
+      :disabled="disabled"
+      style="width: 100%"
+    />
+  </el-form-item>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue'
+import { listDeptChildren } from '@/api/system/dept'
+
+const props = defineProps({
+  /** v-model: 单选为 String,多选为 Array */
+  modelValue: { type: [String, Array], default: undefined },
+  /** 是否多选 */
+  multiple: { type: Boolean, default: false },
+  /** 表单标签 */
+  label: { type: String, default: '下级机构' },
+  /** 表单校验字段名 */
+  prop: { type: String, default: undefined },
+  /** 占位提示 */
+  placeholder: { type: String, default: '请选择机构' },
+  /** 是否必填 */
+  required: { type: Boolean, default: false },
+  /** 是否禁用 */
+  disabled: { type: Boolean, default: false },
+  /** 根部门ID,默认 '' 加载全部顶级部门 */
+  rootDeptId: { type: String, default: '' }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+const treeData = ref([])
+
+const treeProps = {
+  label: 'label',
+  children: 'children',
+  isLeaf: 'leaf',
+  value: 'value'
+}
+
+const currentValue = computed({
+  get: () => props.modelValue,
+  set: (val) => emit('update:modelValue', val)
+})
+
+/** 搜索过滤 */
+function filterNode(value, data) {
+  if (!value) return true
+  return (data.label || '').toLowerCase().includes(value.toLowerCase())
+}
+
+/** 将接口返回的行转为树节点 */
+function toNode(row) {
+  return {
+    value: row.deptId,
+    label: row.deptName,
+    leaf: row.hasChildren === false,
+    ...row
+  }
+}
+
+/** 懒加载子节点 */
+async function loadNode(node, resolve) {
+  try {
+    if (node.level === 0) {
+      // 根节点:加载顶级部门
+      const res = await listDeptChildren(rootParams())
+      const rows = extractRows(res)
+      resolve(rows.map(toNode))
+    } else {
+      const res = await listDeptChildren({ parentId: node.data.value })
+      const children = extractRows(res)
+      resolve(children.map(toNode))
+    }
+  } catch {
+    resolve([])
+  }
+}
+
+/** 根节点的请求参数 */
+function rootParams() {
+  return props.rootDeptId ? { parentId: props.rootDeptId } : {}
+}
+
+/** 兼容两种响应格式 */
+function extractRows(res) {
+  if (res.data && Array.isArray(res.data.rows)) return res.data.rows
+  if (Array.isArray(res.data)) return res.data
+  return []
+}
+</script>

Разница между файлами не показана из-за своего большого размера
+ 861 - 303
gw-ui/src/views/slaj/eme/conplanbasic/index.vue


Некоторые файлы не были показаны из-за большого количества измененных файлов